Page MenuHomePhabricator

ERROR: Error: Undefined constant 'ast\AST_LIST'
Closed, ResolvedPublic

Description

Bumping mediawiki-phan-config to 0.10.2 in the composer.json for RemexHtml gives the following crash when running composer test:

$ composer phan
> phan -p --allow-polyfill-parser
ERROR: Error: Undefined constant 'ast\AST_LIST' in /home/cananian/Projects/Wikimedia/RemexHtml/vendor/mediawiki/phan-taint-check-plugin/src/TaintednessBaseVisitor.php:972
Stack trace:
#0 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/mediawiki/phan-taint-check-plugin/src/TaintednessVisitor.php(527): TaintednessVisitor->getPhanObjsForNode(Object(ast\Node))
#1 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/mediawiki/phan-taint-check-plugin/src/MWVisitor.php(834): TaintednessVisitor->visitAssign(Object(ast\Node))
#2 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/Plugin/ConfigPluginSet.php(1165): MWVisitor->visitAssign(Object(ast\Node))
#3 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/Plugin/ConfigPluginSet.php(1093): MWVisitor::Phan\Plugin\{closure}(Object(Phan\CodeBase), Object(Phan\Language\Context), Object(ast\Node), Array)
#4 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/Plugin/ConfigPluginSet.php(295): Phan\Plugin\ConfigPluginSet::Phan\Plugin\{closure}(Object(Phan\CodeBase), Object(Phan\Language\Context), Object(ast\Node), Array)
#5 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(2497): Phan\Plugin\ConfigPluginSet->postAnalyzeNode(Object(Phan\CodeBase), Object(Phan\Language\Context), Object(ast\Node), Array)
#6 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(544): Phan\BlockAnalysisVisitor->postOrderAnalyze(Object(Phan\Language\Context), Object(ast\Node))
#7 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitorImplementation.php(69): Phan\BlockAnalysisVisitor->visit(Object(ast\Node))
#8 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(572): Phan\AST\Visitor\KindVisitorImplementation->visitAssign(Object(ast\Node))
#9 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(233): Phan\BlockAnalysisVisitor->analyzeAndGetUpdatedContext(Object(Phan\Language\Context), Object(ast\Node), Object(ast\Node))
#10 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(572): Phan\BlockAnalysisVisitor->visitStmtList(Object(ast\Node))
#11 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(2378): Phan\BlockAnalysisVisitor->analyzeAndGetUpdatedContext(Object(Phan\Language\Context), Object(ast\Node), Object(ast\Node))
#12 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(572): Phan\BlockAnalysisVisitor->visitMethod(Object(ast\Node))
#13 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(233): Phan\BlockAnalysisVisitor->analyzeAndGetUpdatedContext(Object(Phan\Language\Context), Object(ast\Node), Object(ast\Node))
#14 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(572): Phan\BlockAnalysisVisitor->visitStmtList(Object(ast\Node))
#15 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(1337): Phan\BlockAnalysisVisitor->analyzeAndGetUpdatedContext(Object(Phan\Language\Context), Object(ast\Node), Object(ast\Node))
#16 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(2346): Phan\BlockAnalysisVisitor->visitClosedContext(Object(ast\Node))
#17 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(572): Phan\BlockAnalysisVisitor->visitClass(Object(ast\Node))
#18 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/BlockAnalysisVisitor.php(233): Phan\BlockAnalysisVisitor->analyzeAndGetUpdatedContext(Object(Phan\Language\Context), Object(ast\Node), Object(ast\Node))
#19 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/AST/Visitor/KindVisitorImplementation.php(35): Phan\BlockAnalysisVisitor->visitStmtList(Object(ast\Node))
#20 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/Analysis.php(560): Phan\AST\Visitor\KindVisitorImplementation->__invoke(Object(ast\Node))
#21 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/Phan.php(526): Phan\Analysis::analyzeFile(Object(Phan\CodeBase), 'RemexHtml/DOM/D...', NULL, NULL)
#22 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/Phan.php(583): Phan\Phan::Phan\{closure}(0, 'RemexHtml/DOM/D...', 92)
#23 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/Phan/Phan.php(376): Phan\Phan::finishAnalyzingRemainingStatements(Object(Phan\CodeBase), NULL, Array, Array)
#24 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/src/phan.php(36): Phan\Phan::analyzeFileList(Object(Phan\CodeBase), Object(Closure))
#25 /home/cananian/Projects/Wikimedia/RemexHtml/vendor/phan/phan/phan(9): require_once('/home/cananian/...')
#26 {main}
(Phan 2.6.1 crashed due to an uncaught Throwable when parsing/analyzing 'RemexHtml/DOM/DOMBuilder.php')
Script phan -p --allow-polyfill-parser handling the phan event returned with error code 1

Event Timeline

I cannot reproduce this locally with php-ast, nor with the polyfill parser. What version of php-ast are you using? And if using the polyfill parser, what happens if you switch to php-ast?

This might be an old constant, according to [1], now replaced by an AST_ARRAY node with the ARRAY_SYNTAX_LIST flag. The documentation for AST node kinds is very incomplete, though, so I wouldn't be sure... Also, it should still be supported, AFAICT from the php-ast source and phan stubs.

[1] - https://github.com/phan/phan/blob/469a4a9c7a7024efb22365a75749d39a65542af7/src/Phan/Language/Internal/ConstantDocumentationMap.php#L127

OK, now it's clear. I couldn't (and still can't) reproduce this because I had php_ast loaded; forcing the native parser with --force-polyfill-parser is not enough to trigger the issue. In the php-ast changelog, I found:

list() destructuring is now always represented as an AST_ARRAY with ARRAY_SYNTAX_LIST flag. In lower versions: On PHP 7.0 it will always be an AST_LIST. In PHP 7.1 it will be an AST_ARRAY if list() is used with keys. In PHP 7.1 destructuring using [] will always be represented using AST_ARRAY, independently of the version.

Since taint-check currently requires PHP >= 7.2, I'm going to just remove the reference to AST_LIST. FTR, what makes it a bit more complicated is the fact that phan still provides a stub where AST_LIST is defined.

Change 601693 had a related patch set uploaded (by Daimona Eaytoy; owner: Daimona Eaytoy):
[mediawiki/tools/phan/SecurityCheckPlugin@master] Remove reference to AST_LIST

https://gerrit.wikimedia.org/r/601693

Change 601693 merged by jenkins-bot:
[mediawiki/tools/phan/SecurityCheckPlugin@master] Remove reference to AST_LIST

https://gerrit.wikimedia.org/r/601693

Daimona removed a project: Patch-For-Review.

This seems to be crashing Parsoid CI now? @Arlolra has details.

This seems to be crashing Parsoid CI now? @Arlolra has details.

It was locally and sounds like a release is coming soon.

Change 602499 had a related patch set uploaded (by Jforrester; owner: Jforrester):
[mediawiki/tools/phan@master] Require taint-check 3.03, up from 3.0.2

https://gerrit.wikimedia.org/r/602499

Change 602499 merged by jenkins-bot:
[mediawiki/tools/phan@master] Require taint-check 3.0.3, up from 3.0.2

https://gerrit.wikimedia.org/r/602499

I am also seeing this locally. Is there going to be a new release of mediawiki/mediawiki-phan-config that fixes this?

I am also seeing this locally. Is there going to be a new release of mediawiki/mediawiki-phan-config that fixes this?

It's currently on hold, see https://gerrit.wikimedia.org/r/c/mediawiki/tools/phan/+/602673 and especially T254571. In the meanwhile, you can fix this by installing php-ast (as the bug only happens when the polyfill parser is used AND ext-ast is not loaded). See here for install instructions.

Change 629060 had a related patch set uploaded (by Hashar; owner: Hashar):
[mediawiki/tools/phan@master] Release 0.10.3

https://gerrit.wikimedia.org/r/629060