mirror of
https://github.com/danog/psalm.git
synced 2025-01-22 05:41:20 +01:00
Fix #2844 - resolve constant offset references
This commit is contained in:
parent
292a2359b3
commit
443558ca49
@ -2022,6 +2022,50 @@ class StatementsAnalyzer extends SourceAnalyzer implements StatementsSource
|
|||||||
return $type_to_invert;
|
return $type_to_invert;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($stmt instanceof PhpParser\Node\Expr\ArrayDimFetch) {
|
||||||
|
if ($stmt->var instanceof PhpParser\Node\Expr\ClassConstFetch) {
|
||||||
|
$array_type = self::getSimpleType(
|
||||||
|
$codebase,
|
||||||
|
$nodes,
|
||||||
|
$stmt->var,
|
||||||
|
$aliases,
|
||||||
|
$file_source,
|
||||||
|
$existing_class_constants,
|
||||||
|
$fq_classlike_name
|
||||||
|
);
|
||||||
|
|
||||||
|
$dim_type = self::getSimpleType(
|
||||||
|
$codebase,
|
||||||
|
$nodes,
|
||||||
|
$stmt->dim,
|
||||||
|
$aliases,
|
||||||
|
$file_source,
|
||||||
|
$existing_class_constants,
|
||||||
|
$fq_classlike_name
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($array_type !== null && $dim_type !== null) {
|
||||||
|
if ($dim_type->isSingleStringLiteral()) {
|
||||||
|
$dim_value = $dim_type->getSingleStringLiteral()->value;
|
||||||
|
} elseif ($dim_type->isSingleIntLiteral()) {
|
||||||
|
$dim_value = $dim_type->getSingleIntLiteral()->value;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($array_type->getAtomicTypes() as $array_atomic_type) {
|
||||||
|
if ($array_atomic_type instanceof Type\Atomic\ObjectLike) {
|
||||||
|
if (isset($array_atomic_type->properties[$dim_value])) {
|
||||||
|
return clone $array_atomic_type->properties[$dim_value];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -739,6 +739,17 @@ class ConstantTest extends TestCase
|
|||||||
}
|
}
|
||||||
}'
|
}'
|
||||||
],
|
],
|
||||||
|
'getClassConstantOffset' => [
|
||||||
|
'<?php
|
||||||
|
class C {
|
||||||
|
private const A = [ 0 => "string" ];
|
||||||
|
private const B = self::A[0];
|
||||||
|
|
||||||
|
public function foo(): string {
|
||||||
|
return self::B;
|
||||||
|
}
|
||||||
|
}'
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user