fix(generator): 解决常量值格式化和命名空间解析问题

- 添加 formatConstValue 函数统一处理常量值格式化
- 修复类常量引用时的字符串转义问题
- 优化 getClassConstValue 方法的命名空间解析逻辑
- 添加 getNamespaceOfClass 工具方法获取类的命名空间
- 更新默认参数处理中的常量值获取方式
- 添加新的测试用例验证默认数组属性功能
pull/1/head
韩天峰 3 months ago
parent 17fcb16aec
commit bf4c5a7852
  1. 11
      src/Php/Generator/Utils.php
  2. 6
      src/Php/Translator.php
  3. 26
      src/gen_stub.php
  4. 21
      tests/aot/object_property/005.phpt

@ -183,4 +183,15 @@ trait Utils
return $str;
}
protected function getNamespaceOfClass(string $class): string
{
$lastPos = strrpos($class, '\\');
if ($lastPos !== false) {
$namespace = substr($class, 0, $lastPos);
} else {
$namespace = '';
}
return $namespace;
}
}

@ -1195,11 +1195,11 @@ CODE;
* 仅用于 gen_stub 脚本
* @throws \Exception
*/
public function getClassConstValue(NodeAbstract $expr, string $_class, string $name, string $currentClass): mixed
public function getClassConstValue(NodeAbstract $expr, string $_class, string $name, string $currentClass = ''): mixed
{
$namespace = $this->namespace;
if (!$namespace) {
$namespace = (string)strstr($currentClass, '\\', true);
if (!$namespace and $currentClass and !str_contains($_class, '\\')) {
$namespace = $this->getNamespaceOfClass($currentClass);
}
$class = $this->getNamespacedClassName($_class, $namespace);
$nativeConst = $this->findNativeClassConst($expr, $class, $name);

@ -2307,14 +2307,14 @@ class EvaluatedValue
if ($class === 'self') {
$constName = ClassInfo::$currentClass . "::" . $expr->name->__toString();
if (isset($allConstInfos[$constName])) {
return $allConstInfos[$constName]->getValue($allConstInfos)->value;
return formatConstValue($allConstInfos[$constName]->getValue($allConstInfos)->value);
} else {
return getTranslator()->getClassConstValue($expr, ClassInfo::$currentClass, $expr->name->toString(), ClassInfo::$currentClass);
return formatConstValue(getTranslator()->getClassConstValue($expr, ClassInfo::$currentClass, $expr->name->toString()));
}
} elseif ($expr->name->__toString() === 'class') {
return $class;
} else {
return getTranslator()->getClassConstValue($expr, $class, $expr->name->__toString(), ClassInfo::$currentClass);
return formatConstValue(getTranslator()->getClassConstValue($expr, $class, $expr->name->__toString(), ClassInfo::$currentClass));
}
} else {
$constName = $expr->name->__toString();
@ -2352,11 +2352,7 @@ class EvaluatedValue
if (isset($definedConstants[$constName])) {
$constValue = $definedConstants[$constName];
if (is_scalar($constValue)) {
if (is_string($constValue)) {
return '"' . $constValue . '"';
} else {
return $constValue;
}
return formatConstValue($constValue);
}
}
@ -4869,7 +4865,7 @@ function parseFunctionLike(
}
if ($param->default instanceof Expr\ClassConstFetch && $param->default->class->toLowerString() === "self") {
$defaultValue = getTranslator()->getClassConstValue($func, $name->className->name, $param->default->name->name, ClassInfo::$currentClass);
$defaultValue = getTranslator()->getClassConstValue($func, $name->className->name, $param->default->name->name);
} else {
$defaultValue = $param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null;
}
@ -6186,6 +6182,18 @@ function initPhpParser() {
$isInitialized = true;
}
function formatConstValue(mixed $constValue)
{
if (is_string($constValue)) {
if (str_starts_with($constValue, '"') and str_ends_with($constValue, '"')) {
return $constValue;
}
return '"' . $constValue . '"';
} else {
return $constValue;
}
}
function getTranslator(): Translator
{
global $translator;

@ -0,0 +1,21 @@
--TEST--
default array property
--FILE--
<?php
class Test {
protected const VALUE = 'test';
protected string $x = self::VALUE;
public function bar() {
var_dump($this->x);
}
}
function main() {
require __DIR__ . '/../../../src/Assert.php';
$obj = new Test;
$obj->bar();
}
?>
--EXPECT--
string(4) "test"
Loading…
Cancel
Save