packages/deriver/tests/Unit/Deriver/Lowerer/Declaration/Traits/PropertyScopeTest.php

1<?php
2
3declare (strict_types=1);
4
5namespace Tests\Unit\Deriver\Lowerer\Declaration\Traits;
6
7use Deriver\Deriver\Evaluator\TargetProfile;
8use Deriver\Deriver\Lowerer\Declaration\CallableIdentity;
9use Deriver\Deriver\Lowerer\Declaration\CallableSource;
10use Deriver\Deriver\Lowerer\Declaration\ConstantSignatures;
11use Deriver\Deriver\Lowerer\Declaration\Index;
12use Deriver\Deriver\Lowerer\Declaration\Indexer;
13use Deriver\Deriver\Lowerer\Declaration\Metadata\ClassConstant;
14use Deriver\Deriver\Lowerer\Declaration\Metadata\ClassDeclaration;
15use Deriver\Deriver\Lowerer\Declaration\Metadata\PropertyDeclaration;
16use Deriver\Deriver\Lowerer\Declaration\Traits\Composition;
17use Deriver\Deriver\Lowerer\Declaration\Traits\Members;
18use Deriver\Deriver\Lowerer\Declaration\Traits\PropertyScope;
19use Deriver\Deriver\Lowerer\ExpressionLowering;
20use Deriver\Deriver\Lowerer\Graph\BasicBlock;
21use Deriver\Deriver\Lowerer\Graph\CallableGraph;
22use Deriver\Deriver\Lowerer\Graph\Instruction;
23use Deriver\Deriver\Lowerer\Graph\Literal;
24use Deriver\Deriver\Lowerer\Graph\Terminator;
25use Deriver\Deriver\Lowerer\InstructionEmitter;
26use Deriver\Deriver\Lowerer\Lowerer;
27use Deriver\Deriver\Lowerer\LoweringScope;
28use Deriver\Deriver\Parser\Node\File;
29use Deriver\Deriver\Parser\Parser;
30use Deriver\Deriver\Parser\ParserConfig;
31use Deriver\Deriver\Parser\TargetSyntax;
32use Deriver\Deriver\Resolver\AssignmentPatterns;
33use Deriver\Deriver\Resolver\ClassScope;
34use Deriver\Deriver\Resolver\ExpressionValidation;
35use Deriver\Deriver\Resolver\MagicContext;
36use Deriver\Deriver\Resolver\Resolver;
37use Deriver\Deriver\Sources\LineMap;
38use Deriver\Deriver\Sources\Path;
39use Deriver\Deriver\Sources\Source;
40use Deriver\Deriver\Sources\SourceRef;
41use Deriver\Deriver\Sources\Sources;
42use Deriver\Exception\ParserException;
43use Deriver\Exception\ResolutionException;
44use PHPUnit\Framework\Attributes\CoversClass;
45use PHPUnit\Framework\Attributes\Small;
46use PHPUnit\Framework\Attributes\UsesClass;
47use PHPUnit\Framework\TestCase;
48
49/**
50 * @covers \Deriver\Deriver\Lowerer\Declaration\Traits\PropertyScope
51 */
52#[UsesClass(Resolver::class)]
53#[UsesClass(ExpressionValidation::class)]
54#[UsesClass(ResolutionException::class)]
55#[UsesClass(ParserConfig::class)]
56#[UsesClass(ParserException::class)]
57#[CoversClass(PropertyScope::class)]
58#[UsesClass(BasicBlock::class)]
59#[UsesClass(CallableGraph::class)]
60#[UsesClass(CallableIdentity::class)]
61#[UsesClass(ClassConstant::class)]
62#[UsesClass(ClassDeclaration::class)]
63#[UsesClass(Instruction::class)]
64#[UsesClass(PropertyDeclaration::class)]
65#[UsesClass(Terminator::class)]
66#[UsesClass(Sources::class)]
67#[UsesClass(Path::class)]
68#[UsesClass(Source::class)]
69#[UsesClass(TargetProfile::class)]
70#[UsesClass(SourceRef::class)]
71#[UsesClass(Parser::class)]
72#[UsesClass(File::class)]
73#[UsesClass(Lowerer::class)]
74#[UsesClass(ExpressionLowering::class)]
75#[UsesClass(InstructionEmitter::class)]
76#[UsesClass(LoweringScope::class)]
77#[UsesClass(ConstantSignatures::class)]
78#[UsesClass(CallableSource::class)]
79#[UsesClass(Indexer::class)]
80#[UsesClass(Index::class)]
81#[UsesClass(Composition::class)]
82#[UsesClass(Members::class)]
83#[UsesClass(LineMap::class)]
84#[UsesClass(MagicContext::class)]
85#[UsesClass(AssignmentPatterns::class)]
86#[UsesClass(ClassScope::class)]
87#[UsesClass(TargetSyntax::class)]
88#[UsesClass(Literal::class)]
89#[Small]
90final class PropertyScopeTest extends TestCase
91{
92    public function testGraphKeepsProvenanceWhileBindingSelfToTheConsumer(): void
93    {
94        $source = '<?php trait T{public $x=self::C;}class B{use T;const C=4;}';
95        $snapshotId = 'test';
96        $input = new Sources([new Source('fixture.php', $source)]);
97        $profile = new TargetProfile();
98        $parser = new Parser(new ParserConfig($profile->version));
99        $trees = array_map(static fn (Source $source1): File => (new Resolver())->resolve($parser->parse(new Source(Path::normalize($source1->path), $source1->contents, $source1->declarationsOnly))), iterator_to_array($input, false));
100        $index = new Index($snapshotId, $trees);
101        $default = $index->classes()['b']->properties['x']->default;
102        self::assertNotNull($default);
103        self::assertSame('B', $default->className);
104        self::assertSame('fixture.php', $default->source->path);
105        self::assertStringContainsString('trait-property:', $default->symbol);
106    }
107}
108