We can parse code with syntax errors: it generates partial ASTs with the faulty part of the input as a RBParseErrorNode.
Only three methods are needed to allow generating executable methods from such an AST: the SyntaxErrorNotification
��is raised at runtime instead of compile time.
testEvalSimpleMethodWithError
�� �� | ast cm |
�� �� ast := OpalCompiler new
�� �� �� �� �� �� �� �� source: 'method 3+';
�� �� �� �� �� �� �� �� useFaultyForParsing: true;
�� �� �� �� �� �� �� �� parse.
�� �� self assert: ast isMethod.
�� �� self assert: ast isFaulty.
�� �� cm := ast compiledMethod.
�� �� self should: [cm valueWithReceiver: nil arguments: #()] raise: SyntaxErrorNotification
The syntax error instance is compiled in via a literal variable, in the end the only thing needed was:
visitParseErrorNode: anErrorNode
�� �� �� �� methodBuilder
�� �� �� �� �� �� �� �� pushLiteralVariable: #error -> anErrorNode asSyntaxErrorNotification;
�� �� �� �� �� �� �� �� send: #signal.
This is in #50044.
Future work: introduce a RuntimeSyntaxError that can be turned off per error and globally.
�� �� �� �� Marcus