fix(preprocessor): 解决重复函数和类声明检查问题

- 在函数声明前添加 prepare 步骤以确保预处理器初始化
- 添加重复函数名称检测逻辑,防止相同函数名重复声明
- 添加重复类名检测逻辑,避免类重复定义错误
- 使用小写函数名作为符号表键值进行冲突检查
- 在检测到重复声明时抛出致命错误
pull/1/head
韩天峰 5 months ago
parent 057e25712d
commit 1a7bfe1de5
  1. 1
      phpunit/src/DuplicateTest.php
  2. 11
      src/Php/Preprocessor.php

@ -13,6 +13,7 @@ class DuplicateTest extends TestCase
$compiler = CompilerTest::create(ROOT_PATH);
$testFile = __DIR__ . '/../code/' . $file;
$compiler->addFiles([$testFile]);
$compiler->prepare($testFile);
$compiler->convert($testFile);
} catch (TestError $exception) {
$this->assertStringContainsString($expected, $exception->getMessage());

@ -197,7 +197,11 @@ class Preprocessor extends CompilerBase
if ($this->stubFile) {
$this->addFunction($name, $this->parseFunctionDecl($v));
} else {
$this->symbolDeclInFile[strtolower($name)] = $this->file;
$functionNameLower = strtolower($name);
if (isset($this->symbolDeclInFile[$functionNameLower])) {
$this->fatalError($v, "Duplicate function `{$functionNameLower}`");
}
$this->symbolDeclInFile[$functionNameLower] = $this->file;
}
}
@ -227,6 +231,11 @@ class Preprocessor extends CompilerBase
$this->symbolCallInFile[$this->file][] = $parentClassLower;
}
}
if (isset($this->symbolDeclInFile[$fullClassNameLower])) {
$this->fatalError($class, "Duplicate class `{$fullClassName}`");
}
$this->symbolDeclInFile[$fullClassNameLower] = $this->file;
$code = '';

Loading…
Cancel
Save