Skip to content

Commit ee7942a

Browse files
committed
fix(codex): resolve static type to concrete class when class name is known
closes #746 Signed-off-by: azjezz <[email protected]>
1 parent 01074d8 commit ee7942a

File tree

8 files changed

+256
-2
lines changed

8 files changed

+256
-2
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
final class Alpha
6+
{
7+
final public static function new(): static
8+
{
9+
exit(0);
10+
}
11+
}
12+
13+
class Delta
14+
{
15+
public null|Alpha $baseAlpha = null;
16+
public null|Alpha $alpha = null;
17+
}
18+
19+
final class AlphaTest
20+
{
21+
/**
22+
* @template ExpectedType
23+
* @param ExpectedType $expected
24+
* @assert =ExpectedType $actual
25+
*/
26+
public static function assertSame(mixed $expected, mixed $actual): void
27+
{
28+
static::assertSame($actual, $expected);
29+
}
30+
31+
public function run(): void
32+
{
33+
$delta = new Delta();
34+
$alpha = Alpha::new();
35+
36+
self::assertSame($alpha, $delta->alpha);
37+
self::assertSame($alpha, $delta->baseAlpha);
38+
}
39+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
final class Alpha
6+
{
7+
public static function new(): static
8+
{
9+
exit(0);
10+
}
11+
}
12+
13+
class Delta
14+
{
15+
public null|Alpha $baseAlpha = null;
16+
public null|Alpha $alpha = null;
17+
}
18+
19+
final class AlphaTest
20+
{
21+
/**
22+
* @template ExpectedType
23+
* @param ExpectedType $expected
24+
* @assert =ExpectedType $actual
25+
*/
26+
public static function assertSame(mixed $expected, mixed $actual): void
27+
{
28+
static::assertSame($actual, $expected);
29+
}
30+
31+
public function run(): void
32+
{
33+
$delta = new Delta();
34+
$alpha = Alpha::new();
35+
36+
self::assertSame($alpha, $delta->alpha);
37+
self::assertSame($alpha, $delta->baseAlpha);
38+
}
39+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
abstract class AbstractRoot
6+
{
7+
public static function new(): static
8+
{
9+
exit(0);
10+
}
11+
}
12+
13+
final class Alpha extends AbstractRoot
14+
{
15+
}
16+
17+
class Delta
18+
{
19+
public null|Alpha $baseAlpha = null;
20+
public null|Alpha $alpha = null;
21+
}
22+
23+
final class AlphaTest
24+
{
25+
/**
26+
* @template ExpectedType
27+
* @param ExpectedType $expected
28+
* @assert =ExpectedType $actual
29+
*/
30+
public static function assertSame(mixed $expected, mixed $actual): void
31+
{
32+
static::assertSame($actual, $expected);
33+
}
34+
35+
public function run(): void
36+
{
37+
$delta = new Delta();
38+
$alpha = Alpha::new();
39+
40+
self::assertSame($alpha, $delta->alpha);
41+
self::assertSame($alpha, $delta->baseAlpha);
42+
}
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
abstract class AbstractRoot
6+
{
7+
final public static function new(): static
8+
{
9+
exit(0);
10+
}
11+
}
12+
13+
final class Alpha extends AbstractRoot
14+
{
15+
}
16+
17+
class Delta
18+
{
19+
public null|Alpha $baseAlpha = null;
20+
public null|Alpha $alpha = null;
21+
}
22+
23+
final class AlphaTest
24+
{
25+
/**
26+
* @template ExpectedType
27+
* @param ExpectedType $expected
28+
* @assert =ExpectedType $actual
29+
*/
30+
public static function assertSame(mixed $expected, mixed $actual): void
31+
{
32+
static::assertSame($actual, $expected);
33+
}
34+
35+
public function run(): void
36+
{
37+
$delta = new Delta();
38+
$alpha = Alpha::new();
39+
40+
self::assertSame($alpha, $delta->alpha);
41+
self::assertSame($alpha, $delta->baseAlpha);
42+
}
43+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
abstract class AbstractRoot
6+
{
7+
public static function new(): static
8+
{
9+
exit(0);
10+
}
11+
}
12+
13+
class Alpha extends AbstractRoot
14+
{
15+
}
16+
17+
class Delta
18+
{
19+
public null|Alpha $baseAlpha = null;
20+
public null|Alpha $alpha = null;
21+
}
22+
23+
final class AlphaTest
24+
{
25+
/**
26+
* @template ExpectedType
27+
* @param ExpectedType $expected
28+
* @assert =ExpectedType $actual
29+
*/
30+
public static function assertSame(mixed $expected, mixed $actual): void
31+
{
32+
static::assertSame($actual, $expected);
33+
}
34+
35+
public function run(): void
36+
{
37+
$delta = new Delta();
38+
$alpha = Alpha::new();
39+
40+
self::assertSame($alpha, $delta->alpha);
41+
self::assertSame($alpha, $delta->baseAlpha);
42+
}
43+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
class Alpha
6+
{
7+
public static function new(): static
8+
{
9+
exit(0);
10+
}
11+
}
12+
13+
class Delta
14+
{
15+
public null|Alpha $baseAlpha = null;
16+
public null|Alpha $alpha = null;
17+
}
18+
19+
final class AlphaTest
20+
{
21+
/**
22+
* @template ExpectedType
23+
* @param ExpectedType $expected
24+
* @assert =ExpectedType $actual
25+
*/
26+
public static function assertSame(mixed $expected, mixed $actual): void
27+
{
28+
static::assertSame($actual, $expected);
29+
}
30+
31+
public function run(): void
32+
{
33+
$delta = new Delta();
34+
$alpha = Alpha::new();
35+
36+
self::assertSame($alpha, $delta->alpha);
37+
self::assertSame($alpha, $delta->baseAlpha);
38+
}
39+
}

crates/analyzer/tests/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,12 @@ test_case!(issue_737);
450450
test_case!(issue_739);
451451
test_case!(issue_742);
452452
test_case!(issue_743);
453+
test_case!(issue_746_part_1);
454+
test_case!(issue_746_part_2);
455+
test_case!(issue_746_part_3);
456+
test_case!(issue_746_part_4);
457+
test_case!(issue_746_part_5);
458+
test_case!(issue_746_part_6);
453459

454460
#[test]
455461
fn test_all_test_cases_are_ran() {

crates/codex/src/ttype/expander.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,10 +369,12 @@ fn expand_object(named_object: &mut TObject, codebase: &CodebaseMetadata, option
369369
named_object.is_this = true;
370370
}
371371
}
372-
StaticClassType::Name(static_class_name) => {
372+
StaticClassType::Name(static_class_name)
373+
if !is_this || codebase.is_instance_of(static_class_name, &name) =>
374+
{
373375
if let TObject::Named(named_object) = named_object {
374376
named_object.name = *static_class_name;
375-
named_object.is_this = options.function_is_final;
377+
named_object.is_this = false;
376378
}
377379
}
378380
_ => {}

0 commit comments

Comments
 (0)