fix(parser): 修复抽象类实例化和空语句处理问题

- 添加抽象类无法实例化的测试用例
- 修复doc注释解析器返回空数组的问题
- 添加对Stmt_Nop语句类型的处理支持
- 确保预处理器正确处理空语句类型
pull/1/head
韩天峰 7 months ago
parent 43b9797df8
commit 3dc79d2074
  1. 1
      bin/gen_stub.php
  2. 1
      src/Php/Preprocessor.php
  3. 2
      src/Php/Translator.php
  4. 32
      tests/core/classes/class_abstract.phpt

@ -4581,6 +4581,7 @@ class DocCommentTag {
/** @return DocCommentTag[] */
public static function parseDocComments(array $comments): array {
return [];
$tags = [];
foreach ($comments as $comment) {
if (!($comment instanceof DocComment)) {

@ -112,6 +112,7 @@ class Preprocessor extends CompilerBase
case 'Stmt_Use':
case 'Stmt_Const':
case 'Stmt_Interface':
case 'Stmt_Nop':
break;
default:
$this->fatalError($v, 'Unsupported statement: ' . $type);

@ -232,6 +232,8 @@ class Translator extends Preprocessor
case 'Stmt_Interface':
$this->parseInterface($v) . PHP_EOL;
break;
case 'Stmt_Nop':
break;
default:
abort($v);
}

@ -0,0 +1,32 @@
--TEST--
ZE2 An abstract class cannot be instantiated
--FILE--
<?php
abstract class base {
function show() {
echo "base\n";
}
}
class derived extends base {
}
function main() {
$t = new derived();
$t->show();
$t = new base();
$t->show();
echo "Done\n"; // shouldn't be displayed
}
?>
--EXPECTF--
base
Fatal error: Uncaught Error: Cannot instantiate abstract class base in %s:%d
Stack trace:
#0 Unknown(0) : %s
#1 {main}
thrown in %s on line %d
Loading…
Cancel
Save