refactor(php): 优化编译器基础类的类型声明和参数命名

- 为writeLog方法添加void返回类型声明
- 将多个解析方法的参数类型从Node改为NodeAbstract以提高灵活性
- 修正parseAssignPropertyFetch方法中的代码缩进格式
- 在赋值操作处理逻辑中直接返回解析结果而非赋值给变量
- 将所有二元操作符解析方法的参数类型从mixed改为具体的节点类型
- 重命名findNativeFunction方法中的参数名以提高可读性
- 为各种赋值操作符解析方法添加具体的节点类型声明
pull/1/head
韩天峰 6 months ago
parent 55caa1fcef
commit 45e3933b3c
  1. 66
      src/Php/CompilerBase.php

@ -856,7 +856,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return $code; return $code;
} }
protected function writeLog($msg) protected function writeLog($msg): void
{ {
if ($this->verbose) { if ($this->verbose) {
echo $msg . PHP_EOL; echo $msg . PHP_EOL;
@ -1134,7 +1134,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return $code; return $code;
} }
protected function parseAssignArrayDim(Node $left, Node $right): string protected function parseAssignArrayDim(NodeAbstract $left, NodeAbstract $right): string
{ {
if ($this->isPropertyFetch($left)) { if ($this->isPropertyFetch($left)) {
return $this->parseAssignPropertyArrayDim($left, $right); return $this->parseAssignPropertyArrayDim($left, $right);
@ -1158,7 +1158,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return $code . "{$array}.offsetSet({$dim}, {$value})"; return $code . "{$array}.offsetSet({$dim}, {$value})";
} }
protected function parseAssignPropertyFetch(Node $left, Node $right): string protected function parseAssignPropertyFetch(NodeAbstract $left, NodeAbstract $right): string
{ {
$array = $this->parseIdentifier($left->var); $array = $this->parseIdentifier($left->var);
$propName = $this->identifierToStr($left->name); $propName = $this->identifierToStr($left->name);
@ -1247,7 +1247,7 @@ class CompilerBase extends \PhpAot\Core\Translator
$oriInAssignExpr = $this->context->inAssignExpr; $oriInAssignExpr = $this->context->inAssignExpr;
$this->context->inAssignExpr = true; $this->context->inAssignExpr = true;
$var = $this->parseIdentifier($left); $var = $this->parseIdentifier($left);
$this->context->inAssignExpr = $oriInAssignExpr; $this->context->inAssignExpr = $oriInAssignExpr;
if ($var === 'this_') { if ($var === 'this_') {
$this->fatalError($left, 'Cannot re-assign $this'); $this->fatalError($left, 'Cannot re-assign $this');
@ -1301,7 +1301,7 @@ class CompilerBase extends \PhpAot\Core\Translator
$this->addLocalVar($var, $type); $this->addLocalVar($var, $type);
} }
} elseif ($this->isPropertyFetch($left)) { } elseif ($this->isPropertyFetch($left)) {
$var = $this->parsePropertyFetch($left, true); return $this->parseAssignPropertyFetch($left, $right);
} elseif ($this->isArrayDimFetch($left)) { } elseif ($this->isArrayDimFetch($left)) {
$tmp = $this->parseIdentifier($left->var); $tmp = $this->parseIdentifier($left->var);
if ($this->isVarExpr($left->var) and $this->getVarType($tmp) === self::TYPE_STR) { if ($this->isVarExpr($left->var) and $this->getVarType($tmp) === self::TYPE_STR) {
@ -1463,7 +1463,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return $code; return $code;
} }
protected function parseBinaryOpMul(mixed $expr): string protected function parseBinaryOpMul(Node\Expr\BinaryOp\Mul $expr): string
{ {
return $this->parseBinaryOp($expr->left, $expr->right, '*'); return $this->parseBinaryOp($expr->left, $expr->right, '*');
} }
@ -1866,7 +1866,7 @@ class CompilerBase extends \PhpAot\Core\Translator
} }
} }
protected function parseBinaryOpConcat(mixed $expr): string protected function parseBinaryOpConcat(Node\Expr\BinaryOp\Concat $expr): string
{ {
$left = $this->parseIdentifier($expr->left); $left = $this->parseIdentifier($expr->left);
$right = $this->parseIdentifier($expr->right); $right = $this->parseIdentifier($expr->right);
@ -1874,7 +1874,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return 'php::concat(' . $left . ', ' . $right . ')'; return 'php::concat(' . $left . ', ' . $right . ')';
} }
protected function parseFor(mixed $v): string protected function parseFor(Node\Stmt\For_ $v): string
{ {
$init = $v->init; $init = $v->init;
$cond = $v->cond; $cond = $v->cond;
@ -1930,7 +1930,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return str_replace('=', '', $op); return str_replace('=', '', $op);
} }
protected function parseAssignOp(mixed $node, string $op): string protected function parseAssignOp(Node\Expr\AssignOp $node, string $op): string
{ {
$var = $this->parseIdentifier($node->var); $var = $this->parseIdentifier($node->var);
$expr = $this->parseIdentifier($node->expr); $expr = $this->parseIdentifier($node->expr);
@ -1989,42 +1989,42 @@ class CompilerBase extends \PhpAot\Core\Translator
return $var . ' ' . $op . ' (' . $expr . ')'; return $var . ' ' . $op . ' (' . $expr . ')';
} }
protected function parseAssignOpConcat(mixed $expr): string protected function parseAssignOpConcat(Node\Expr\AssignOp\Concat $expr): string
{ {
return $this->parseAssignOp($expr, '.='); return $this->parseAssignOp($expr, '.=');
} }
protected function parseAssignOpPlus(mixed $expr): string protected function parseAssignOpPlus(Node\Expr\AssignOp\Plus $expr): string
{ {
return $this->parseAssignOp($expr, '+='); return $this->parseAssignOp($expr, '+=');
} }
protected function parseAssignOpMinus(mixed $expr): string protected function parseAssignOpMinus(Node\Expr\AssignOp\Minus $expr): string
{ {
return $this->parseAssignOp($expr, '-='); return $this->parseAssignOp($expr, '-=');
} }
protected function parseAssignOpMod(mixed $expr): string protected function parseAssignOpMod(Node\Expr\AssignOp\Mod $expr): string
{ {
return $this->parseAssignOp($expr, '%='); return $this->parseAssignOp($expr, '%=');
} }
protected function parseAssignOpMul(mixed $expr): string protected function parseAssignOpMul(Node\Expr\AssignOp\Mul $expr): string
{ {
return $this->parseAssignOp($expr, '*='); return $this->parseAssignOp($expr, '*=');
} }
protected function parseAssignOpDiv(mixed $expr): string protected function parseAssignOpDiv(Node\Expr\AssignOp\Div $expr): string
{ {
return $this->parseAssignOp($expr, '/='); return $this->parseAssignOp($expr, '/=');
} }
protected function parseAssignOpBitwiseAnd(mixed $expr): string protected function parseAssignOpBitwiseAnd(Node\Expr\AssignOp\BitwiseAnd $expr): string
{ {
return $this->parseAssignOp($expr, '&='); return $this->parseAssignOp($expr, '&=');
} }
protected function parseAssignOpPow(mixed $expr): string protected function parseAssignOpPow(Node\Expr\AssignOp\Pow $expr): string
{ {
return $this->parseAssignOp($expr, '**='); return $this->parseAssignOp($expr, '**=');
} }
@ -2125,28 +2125,28 @@ class CompilerBase extends \PhpAot\Core\Translator
/** /**
* 查找原生函数. * 查找原生函数.
*/ */
protected function findNativeFunction(string $fname): string|false protected function findNativeFunction(string $funcName): string|false
{ {
// 绝对命名空间的函数 // 绝对命名空间的函数
if ($fname[0] == '\\') { if ($funcName[0] == '\\') {
$fname = ltrim($fname, '\\'); $funcName = ltrim($funcName, '\\');
$possibleFunctionNames = [$this->escapeName($fname)]; $possibleFunctionNames = [$this->escapeName($funcName)];
} else { } else {
$possibleFunctionNames = [$this->escapeName($fname)]; $possibleFunctionNames = [$this->escapeName($funcName)];
if (isset($this->useAliases[$fname])) { if (isset($this->useAliases[$funcName])) {
$possibleFunctionNames[] = $this->escapeName($this->escapeNamespace($this->useAliases[$fname])); $possibleFunctionNames[] = $this->escapeName($this->escapeNamespace($this->useAliases[$funcName]));
} }
if ($this->namespace) { if ($this->namespace) {
$possibleFunctionNames[] = $this->escapeNamespace($this->namespace) . self::NAMESPACE_SEPARATOR . $fname; $possibleFunctionNames[] = $this->escapeNamespace($this->namespace) . self::NAMESPACE_SEPARATOR . $funcName;
} }
if (isset($this->useFunctions[$fname])) { if (isset($this->useFunctions[$funcName])) {
$possibleFunctionNames[] = $this->escapeNamespace($this->useFunctions[$fname]) . self::NAMESPACE_SEPARATOR . $fname; $possibleFunctionNames[] = $this->escapeNamespace($this->useFunctions[$funcName]) . self::NAMESPACE_SEPARATOR . $funcName;
} }
// 复杂命名空间规则,组合命名空间 // 复杂命名空间规则,组合命名空间
// 例子:use foo\bar; bar\fn(); // 例子:use foo\bar; bar\fn();
foreach ($this->useNamespaces as $use) { foreach ($this->useNamespaces as $use) {
$ns1 = explode('\\', $use); $ns1 = explode('\\', $use);
$ns2 = explode('\\', $fname); $ns2 = explode('\\', $funcName);
if ($ns1[array_key_last($ns1)] === $ns2[array_key_first($ns2)]) { if ($ns1[array_key_last($ns1)] === $ns2[array_key_first($ns2)]) {
$ns = array_merge($ns1, $ns2); $ns = array_merge($ns1, $ns2);
array_splice($ns, array_key_last($ns1) + 1); array_splice($ns, array_key_last($ns1) + 1);
@ -2493,12 +2493,12 @@ class CompilerBase extends \PhpAot\Core\Translator
return $code; return $code;
} }
protected function parseBinaryOpGreater(mixed $expr): string protected function parseBinaryOpGreater(Node\Expr\BinaryOp\Greater $expr): string
{ {
return $this->convertBoolExpr($this->parseBinaryOp($expr->left, $expr->right, '>')); return $this->convertBoolExpr($this->parseBinaryOp($expr->left, $expr->right, '>'));
} }
protected function parseBinaryOpPow(mixed $expr): string protected function parseBinaryOpPow(Node\Expr\BinaryOp\Pow $expr): string
{ {
$left = $this->parseIdentifier($expr->left); $left = $this->parseIdentifier($expr->left);
$right = $this->parseIdentifier($expr->right); $right = $this->parseIdentifier($expr->right);
@ -3016,12 +3016,12 @@ class CompilerBase extends \PhpAot\Core\Translator
return $this->parseIdentifier($object) . '.attr(' . $id . ', ' . $this->escapeBool($update) . ')'; return $this->parseIdentifier($object) . '.attr(' . $id . ', ' . $this->escapeBool($update) . ')';
} }
protected function parseAssignOpShiftRight(Node $node): string protected function parseAssignOpShiftRight(Node\Expr\AssignOp\ShiftRight $node): string
{ {
return $this->parseAssignOp($node, '>>='); return $this->parseAssignOp($node, '>>=');
} }
protected function parseAssignOpBitwiseXor(Node $node): string protected function parseAssignOpBitwiseXor(Node\Expr\AssignOp\BitwiseXor $node): string
{ {
return $this->parseAssignOp($node, '^='); return $this->parseAssignOp($node, '^=');
} }
@ -4129,7 +4129,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return self::PREFIX . $nativeFunc . '(' . $object . ', ' . $this->parseNativeCallArgs($args, $nativeFunc) . ')'; return self::PREFIX . $nativeFunc . '(' . $object . ', ' . $this->parseNativeCallArgs($args, $nativeFunc) . ')';
} }
protected function parseAssignPropertyArrayDim(Node $left, Node $right): string protected function parseAssignPropertyArrayDim(NodeAbstract $left, NodeAbstract $right): string
{ {
$obj = $this->parseIdentifier($left->var->var); $obj = $this->parseIdentifier($left->var->var);
$propName = $this->identifierToStr($left->var->name); $propName = $this->identifierToStr($left->var->name);

Loading…
Cancel
Save