From f84d20e346421bf8af1c60f9c23c91ddeb1c77fc Mon Sep 17 00:00:00 2001 From: yavon007 Date: Tue, 22 Sep 2026 14:36:55 +0800 Subject: [PATCH] fix(compiler): discover native globals with case-insensitive keywords (#124) --skip-tests --- .../mixed-case.php | 7 ++++ .../reader.php | 13 +++++++ .../uppercase.php | 7 ++++ .../NativeClass/NativeClassValidationTest.php | 35 +++++++++++++++++++ src/Preprocessor.php | 5 ++- 5 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 phpunit/code/native-class-global-keyword-case/mixed-case.php create mode 100644 phpunit/code/native-class-global-keyword-case/reader.php create mode 100644 phpunit/code/native-class-global-keyword-case/uppercase.php diff --git a/phpunit/code/native-class-global-keyword-case/mixed-case.php b/phpunit/code/native-class-global-keyword-case/mixed-case.php new file mode 100644 index 00000000..70356bd4 --- /dev/null +++ b/phpunit/code/native-class-global-keyword-case/mixed-case.php @@ -0,0 +1,7 @@ +value; +} diff --git a/phpunit/code/native-class-global-keyword-case/uppercase.php b/phpunit/code/native-class-global-keyword-case/uppercase.php new file mode 100644 index 00000000..d3a5f329 --- /dev/null +++ b/phpunit/code/native-class-global-keyword-case/uppercase.php @@ -0,0 +1,7 @@ +discoverNativeClassDeclarations($files); + foreach ($files as $file) { + $compiler->prepareFile($file); + } + $compiler->discoverNativeGlobalObjects($files); + $reader = $compiler->convertFile($files[0]); + $compiler->convertFile($files[1]); + + $code = file_get_contents($reader); + self::assertIsString($code); + self::assertStringContainsString( + 'php::nativeRequireObject(caseSlot, "NativeCaseValue")->value', + $code, + ); + } + + public static function nativeGlobalKeywordCaseProvider(): array + { + return [ + 'uppercase' => ['uppercase.php'], + 'mixed case' => ['mixed-case.php'], + ]; + } + public function testRejectsNativeAttributeOnInterface(): void { $this->expectException(\TypePhp\Exception\SyntaxError::class); diff --git a/src/Preprocessor.php b/src/Preprocessor.php index f34b5fb0..5241d60d 100644 --- a/src/Preprocessor.php +++ b/src/Preprocessor.php @@ -223,9 +223,8 @@ class Preprocessor extends CompilerBase continue; } $source = file_get_contents($file); - if (is_string($source) - && (str_contains($source, 'global') || str_contains($source, '$GLOBALS')) - ) { + // PHP keywords are case-insensitive; this also includes $GLOBALS accesses. + if (is_string($source) && stripos($source, 'global') !== false) { $candidateSources[$file] = $source; } }