// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
// for details. All rights reserved. Use of this source code is governed by a | |
// BSD-style license that can be found in the LICENSE file. | |
library dart2js.semantics_visitor_test; | |
import 'dart:async'; | |
import 'dart:mirrors'; | |
import 'package:async_helper/async_helper.dart'; | |
import 'package:expect/expect.dart'; | |
import 'package:compiler/src/constants/expressions.dart'; | |
import 'package:compiler/src/dart_types.dart'; | |
import 'package:compiler/src/dart2jslib.dart'; | |
import 'package:compiler/src/elements/elements.dart'; | |
import 'package:compiler/src/resolution/resolution.dart'; | |
import 'package:compiler/src/resolution/semantic_visitor.dart'; | |
import 'package:compiler/src/resolution/operators.dart'; | |
import 'package:compiler/src/tree/tree.dart'; | |
import 'package:compiler/src/util/util.dart'; | |
import 'memory_compiler.dart'; | |
part 'semantic_visitor_test_send_data.dart'; | |
part 'semantic_visitor_test_send_visitor.dart'; | |
part 'semantic_visitor_test_decl_data.dart'; | |
part 'semantic_visitor_test_decl_visitor.dart'; | |
class Visit { | |
final VisitKind method; | |
final element; | |
final rhs; | |
final arguments; | |
final receiver; | |
final name; | |
final expression; | |
final left; | |
final right; | |
final type; | |
final operator; | |
final index; | |
final getter; | |
final setter; | |
final constant; | |
final selector; | |
final parameters; | |
final body; | |
final target; | |
final targetType; | |
final initializers; | |
const Visit(this.method, | |
{this.element, | |
this.rhs, | |
this.arguments, | |
this.receiver, | |
this.name, | |
this.expression, | |
this.left, | |
this.right, | |
this.type, | |
this.operator, | |
this.index, | |
this.getter, | |
this.setter, | |
this.constant, | |
this.selector, | |
this.parameters, | |
this.body, | |
this.target, | |
this.targetType, | |
this.initializers}); | |
int get hashCode => toString().hashCode; | |
bool operator ==(other) => '$this' == '$other'; | |
String toString() { | |
StringBuffer sb = new StringBuffer(); | |
sb.write('method=$method'); | |
if (element != null) { | |
sb.write(',element=$element'); | |
} | |
if (rhs != null) { | |
sb.write(',rhs=$rhs'); | |
} | |
if (arguments != null) { | |
sb.write(',arguments=$arguments'); | |
} | |
if (receiver != null) { | |
sb.write(',receiver=$receiver'); | |
} | |
if (name != null) { | |
sb.write(',name=$name'); | |
} | |
if (expression != null) { | |
sb.write(',expression=$expression'); | |
} | |
if (left != null) { | |
sb.write(',left=$left'); | |
} | |
if (right != null) { | |
sb.write(',right=$right'); | |
} | |
if (type != null) { | |
sb.write(',type=$type'); | |
} | |
if (operator != null) { | |
sb.write(',operator=$operator'); | |
} | |
if (index != null) { | |
sb.write(',index=$index'); | |
} | |
if (getter != null) { | |
sb.write(',getter=$getter'); | |
} | |
if (setter != null) { | |
sb.write(',setter=$setter'); | |
} | |
if (constant != null) { | |
sb.write(',constant=$constant'); | |
} | |
if (selector != null) { | |
sb.write(',selector=$selector'); | |
} | |
if (parameters != null) { | |
sb.write(',parameters=$parameters'); | |
} | |
if (body != null) { | |
sb.write(',body=$body'); | |
} | |
if (target != null) { | |
sb.write(',target=$target'); | |
} | |
if (targetType != null) { | |
sb.write(',targetType=$targetType'); | |
} | |
if (initializers != null) { | |
sb.write(',initializers=$initializers'); | |
} | |
return sb.toString(); | |
} | |
} | |
class Test { | |
final String codeByPrefix; | |
final String code; | |
final /*Visit | List<Visit>*/ expectedVisits; | |
final String cls; | |
final String method; | |
const Test(this.code, this.expectedVisits) | |
: cls = null, method = 'm', codeByPrefix = null; | |
const Test.clazz(this.code, this.expectedVisits, | |
{this.cls: 'C', this.method: 'm'}) | |
: codeByPrefix = null; | |
const Test.prefix(this.codeByPrefix, this.code, this.expectedVisits) | |
: cls = null, method = 'm'; | |
String toString() { | |
StringBuffer sb = new StringBuffer(); | |
sb.writeln(); | |
sb.writeln(code); | |
if (codeByPrefix != null) { | |
sb.writeln('imported by prefix:'); | |
sb.writeln(codeByPrefix); | |
} | |
return sb.toString(); | |
} | |
} | |
const List<VisitKind> UNTESTABLE_KINDS = const <VisitKind>[ | |
// A final field shadowing a non-final field is currently not supported in | |
// resolution. | |
VisitKind.VISIT_SUPER_FIELD_FIELD_COMPOUND, | |
VisitKind.VISIT_SUPER_FIELD_FIELD_PREFIX, | |
VisitKind.VISIT_SUPER_FIELD_FIELD_POSTFIX, | |
// Combination of method and setter with the same name is currently not | |
// supported by the element model. | |
VisitKind.VISIT_STATIC_METHOD_SETTER_COMPOUND, | |
VisitKind.VISIT_STATIC_METHOD_SETTER_PREFIX, | |
VisitKind.VISIT_STATIC_METHOD_SETTER_POSTFIX, | |
VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, | |
VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, | |
VisitKind.VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, | |
VisitKind.VISIT_SUPER_METHOD_SETTER_COMPOUND, | |
VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX, | |
VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX, | |
// Invalid use of setters is currently reported through an erroneous element. | |
VisitKind.VISIT_STATIC_SETTER_INVOKE, | |
VisitKind.VISIT_STATIC_SETTER_GET, | |
VisitKind.VISIT_TOP_LEVEL_SETTER_GET, | |
VisitKind.VISIT_TOP_LEVEL_SETTER_INVOKE, | |
// The constant expressions of assignment to constant type literals cannot be | |
// handled the compile constant evaluator. | |
VisitKind.VISIT_CLASS_TYPE_LITERAL_SET, | |
VisitKind.VISIT_TYPEDEF_TYPE_LITERAL_SET, | |
VisitKind.VISIT_DYNAMIC_TYPE_LITERAL_SET, | |
// Invalid assignments is currently report through an erroneous element. | |
VisitKind.VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, | |
VisitKind.VISIT_FINAL_PARAMETER_SET, | |
VisitKind.VISIT_FINAL_LOCAL_VARIABLE_SET, | |
VisitKind.VISIT_LOCAL_FUNCTION_SET, | |
VisitKind.VISIT_STATIC_GETTER_SET, | |
VisitKind.VISIT_FINAL_STATIC_FIELD_SET, | |
VisitKind.VISIT_STATIC_FUNCTION_SET, | |
VisitKind.VISIT_FINAL_TOP_LEVEL_FIELD_SET, | |
VisitKind.VISIT_TOP_LEVEL_GETTER_SET, | |
VisitKind.VISIT_TOP_LEVEL_FUNCTION_SET, | |
VisitKind.VISIT_FINAL_SUPER_FIELD_SET, | |
VisitKind.VISIT_SUPER_GETTER_SET, | |
VisitKind.VISIT_SUPER_METHOD_SET, | |
// The only undefined unary, `+`, is currently handled and skipped in the | |
// parser. | |
VisitKind.ERROR_UNDEFINED_UNARY_EXPRESSION, | |
// Constant expression are currently not computed during resolution. | |
VisitKind.VISIT_CONSTANT_GET, | |
VisitKind.VISIT_CONSTANT_INVOKE, | |
]; | |
main(List<String> arguments) { | |
Set<VisitKind> kinds = new Set<VisitKind>.from(VisitKind.values); | |
asyncTest(() => Future.forEach([ | |
() { | |
return test( | |
kinds, | |
arguments, | |
SEND_TESTS, | |
(elements) => new SemanticSendTestVisitor(elements)); | |
}, | |
() { | |
return test( | |
kinds, | |
arguments, | |
DECL_TESTS, | |
(elements) => new SemanticDeclarationTestVisitor(elements)); | |
}, | |
() { | |
Set<VisitKind> unvisitedKindSet = | |
kinds.toSet()..removeAll(UNTESTABLE_KINDS); | |
List<VisitKind> unvisitedKindList = unvisitedKindSet.toList(); | |
unvisitedKindList..sort((a, b) => a.index.compareTo(b.index)); | |
Expect.isTrue(unvisitedKindList.isEmpty, | |
"Untested visit kinds:\n ${unvisitedKindList.join(',\n ')},\n"); | |
Set<VisitKind> testedUntestableKinds = | |
UNTESTABLE_KINDS.toSet()..removeAll(kinds); | |
Expect.isTrue(testedUntestableKinds.isEmpty, | |
"Tested untestable visit kinds (remove from UNTESTABLE_KINDS):\n " | |
"${testedUntestableKinds.join(',\n ')},\n"); | |
}, | |
() { | |
ClassMirror mirror1 = reflectType(SemanticSendTestVisitor); | |
Set<Symbol> symbols1 = mirror1.declarations.keys.toSet(); | |
ClassMirror mirror2 = reflectType(SemanticSendVisitor); | |
Set<Symbol> symbols2 = | |
mirror2.declarations.values | |
.where((m) => m is MethodMirror && | |
!m.isConstructor && | |
m.simpleName != #apply) | |
.map((m) => m.simpleName).toSet(); | |
symbols2.removeAll(symbols1); | |
Expect.isTrue(symbols2.isEmpty, | |
"Untested visit methods:\n ${symbols2.join(',\n ')},\n"); | |
} | |
], (f) => f())); | |
} | |
Future test(Set<VisitKind> unvisitedKinds, | |
List<String> arguments, | |
Map<String, List<Test>> TESTS, | |
SemanticTestVisitor createVisitor(TreeElements elements)) { | |
Map<String, String> sourceFiles = {}; | |
Map<String, Test> testMap = {}; | |
StringBuffer mainSource = new StringBuffer(); | |
int index = 0; | |
TESTS.forEach((String group, List<Test> tests) { | |
if (arguments.isNotEmpty && !arguments.contains(group)) return; | |
tests.forEach((Test test) { | |
StringBuffer testSource = new StringBuffer(); | |
if (test.codeByPrefix != null) { | |
String prefixFilename = 'pre$index.dart'; | |
sourceFiles[prefixFilename] = test.codeByPrefix; | |
testSource.writeln("import '$prefixFilename' as p;"); | |
} | |
String filename = 'lib$index.dart'; | |
testSource.writeln(test.code); | |
sourceFiles[filename] = testSource.toString(); | |
mainSource.writeln("import '$filename';"); | |
testMap[filename] = test; | |
index++; | |
}); | |
}); | |
mainSource.writeln("main() {}"); | |
sourceFiles['main.dart'] = mainSource.toString(); | |
Compiler compiler = compilerFor(sourceFiles, | |
options: ['--analyze-all', | |
'--analyze-only', | |
'--enable-null-aware-operators']); | |
return compiler.run(Uri.parse('memory:main.dart')).then((_) { | |
testMap.forEach((String filename, Test test) { | |
LibraryElement library = compiler.libraryLoader.lookupLibrary( | |
Uri.parse('memory:$filename')); | |
Element element; | |
String cls = test.cls; | |
String method = test.method; | |
if (cls == null) { | |
element = library.find(method); | |
} else { | |
ClassElement classElement = library.find(cls); | |
Expect.isNotNull(classElement, | |
"Class '$cls' not found in:\n" | |
"${library.compilationUnit.script.text}"); | |
element = classElement.localLookup(method); | |
} | |
var expectedVisits = test.expectedVisits; | |
if (expectedVisits == null) { | |
Expect.isTrue(element.isErroneous, | |
"Element '$method' expected to be have parse errors in:\n" | |
"${library.compilationUnit.script.text}"); | |
return; | |
} else if (expectedVisits is! List) { | |
expectedVisits = [expectedVisits]; | |
} | |
Expect.isFalse(element.isErroneous, | |
"Element '$method' is not expected to be have parse errors in:\n" | |
"${library.compilationUnit.script.text}"); | |
void testAstElement(AstElement astElement) { | |
Expect.isNotNull(astElement, "Element '$method' not found in:\n" | |
"${library.compilationUnit.script.text}"); | |
ResolvedAst resolvedAst = astElement.resolvedAst; | |
SemanticTestVisitor visitor = createVisitor(resolvedAst.elements); | |
try { | |
compiler.withCurrentElement(resolvedAst.element, () { | |
//print(resolvedAst.node.toDebugString()); | |
resolvedAst.node.accept(visitor); | |
}); | |
} catch (e, s) { | |
Expect.fail("$e:\n$s\nIn test:\n" | |
"${library.compilationUnit.script.text}"); | |
} | |
Expect.listEquals(expectedVisits, visitor.visits, | |
"In test:\n" | |
"${library.compilationUnit.script.text}"); | |
unvisitedKinds.removeAll(visitor.visits.map((visit) => visit.method)); | |
} | |
if (element.isAbstractField) { | |
AbstractFieldElement abstractFieldElement = element; | |
if (abstractFieldElement.getter != null) { | |
testAstElement(abstractFieldElement.getter); | |
} else if (abstractFieldElement.setter != null) { | |
testAstElement(abstractFieldElement.setter); | |
} | |
} else { | |
testAstElement(element); | |
} | |
}); | |
}); | |
} | |
abstract class SemanticTestVisitor extends TraversalVisitor { | |
List<Visit> visits = <Visit>[]; | |
SemanticTestVisitor(TreeElements elements) : super(elements); | |
apply(Node node, arg) => node.accept(this); | |
internalError(Spannable spannable, String message) { | |
throw new SpannableAssertionFailure(spannable, message); | |
} | |
} | |
enum VisitKind { | |
VISIT_PARAMETER_GET, | |
VISIT_PARAMETER_SET, | |
VISIT_PARAMETER_INVOKE, | |
VISIT_PARAMETER_COMPOUND, | |
VISIT_PARAMETER_PREFIX, | |
VISIT_PARAMETER_POSTFIX, | |
VISIT_FINAL_PARAMETER_SET, | |
VISIT_FINAL_PARAMETER_COMPOUND, | |
VISIT_FINAL_PARAMETER_PREFIX, | |
VISIT_FINAL_PARAMETER_POSTFIX, | |
VISIT_LOCAL_VARIABLE_GET, | |
VISIT_LOCAL_VARIABLE_SET, | |
VISIT_LOCAL_VARIABLE_INVOKE, | |
VISIT_LOCAL_VARIABLE_COMPOUND, | |
VISIT_LOCAL_VARIABLE_PREFIX, | |
VISIT_LOCAL_VARIABLE_POSTFIX, | |
VISIT_LOCAL_VARIABLE_DECL, | |
VISIT_LOCAL_CONSTANT_DECL, | |
VISIT_FINAL_LOCAL_VARIABLE_SET, | |
VISIT_FINAL_LOCAL_VARIABLE_COMPOUND, | |
VISIT_FINAL_LOCAL_VARIABLE_PREFIX, | |
VISIT_FINAL_LOCAL_VARIABLE_POSTFIX, | |
VISIT_LOCAL_FUNCTION_GET, | |
VISIT_LOCAL_FUNCTION_INVOKE, | |
VISIT_LOCAL_FUNCTION_DECL, | |
VISIT_CLOSURE_DECL, | |
VISIT_LOCAL_FUNCTION_SET, | |
VISIT_LOCAL_FUNCTION_COMPOUND, | |
VISIT_LOCAL_FUNCTION_PREFIX, | |
VISIT_LOCAL_FUNCTION_POSTFIX, | |
VISIT_STATIC_FIELD_GET, | |
VISIT_STATIC_FIELD_SET, | |
VISIT_STATIC_FIELD_INVOKE, | |
VISIT_STATIC_FIELD_COMPOUND, | |
VISIT_STATIC_FIELD_PREFIX, | |
VISIT_STATIC_FIELD_POSTFIX, | |
VISIT_STATIC_FIELD_DECL, | |
VISIT_STATIC_CONSTANT_DECL, | |
VISIT_STATIC_GETTER_GET, | |
VISIT_STATIC_GETTER_SET, | |
VISIT_STATIC_GETTER_INVOKE, | |
VISIT_STATIC_SETTER_GET, | |
VISIT_STATIC_SETTER_SET, | |
VISIT_STATIC_SETTER_INVOKE, | |
VISIT_STATIC_GETTER_SETTER_COMPOUND, | |
VISIT_STATIC_METHOD_SETTER_COMPOUND, | |
VISIT_STATIC_GETTER_SETTER_PREFIX, | |
VISIT_STATIC_GETTER_SETTER_POSTFIX, | |
VISIT_STATIC_GETTER_DECL, | |
VISIT_STATIC_SETTER_DECL, | |
VISIT_FINAL_STATIC_FIELD_SET, | |
VISIT_STATIC_FINAL_FIELD_COMPOUND, | |
VISIT_STATIC_FINAL_FIELD_POSTFIX, | |
VISIT_STATIC_FINAL_FIELD_PREFIX, | |
VISIT_STATIC_FUNCTION_GET, | |
VISIT_STATIC_FUNCTION_SET, | |
VISIT_STATIC_FUNCTION_INVOKE, | |
VISIT_STATIC_FUNCTION_INCOMPATIBLE_INVOKE, | |
VISIT_STATIC_FUNCTION_DECL, | |
VISIT_STATIC_METHOD_SETTER_PREFIX, | |
VISIT_STATIC_METHOD_SETTER_POSTFIX, | |
VISIT_UNRESOLVED_STATIC_GETTER_COMPOUND, | |
VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND, | |
VISIT_STATIC_METHOD_COMPOUND, | |
VISIT_UNRESOLVED_STATIC_GETTER_PREFIX, | |
VISIT_UNRESOLVED_STATIC_SETTER_PREFIX, | |
VISIT_STATIC_METHOD_PREFIX, | |
VISIT_UNRESOLVED_STATIC_GETTER_POSTFIX, | |
VISIT_UNRESOLVED_STATIC_SETTER_POSTFIX, | |
VISIT_STATIC_METHOD_POSTFIX, | |
VISIT_TOP_LEVEL_FIELD_GET, | |
VISIT_TOP_LEVEL_FIELD_SET, | |
VISIT_TOP_LEVEL_FIELD_INVOKE, | |
VISIT_FINAL_TOP_LEVEL_FIELD_SET, | |
VISIT_TOP_LEVEL_FIELD_COMPOUND, | |
VISIT_TOP_LEVEL_FIELD_PREFIX, | |
VISIT_TOP_LEVEL_FIELD_POSTFIX, | |
VISIT_TOP_LEVEL_FIELD_DECL, | |
VISIT_TOP_LEVEL_CONSTANT_DECL, | |
VISIT_TOP_LEVEL_FINAL_FIELD_COMPOUND, | |
VISIT_TOP_LEVEL_FINAL_FIELD_POSTFIX, | |
VISIT_TOP_LEVEL_FINAL_FIELD_PREFIX, | |
VISIT_TOP_LEVEL_GETTER_GET, | |
VISIT_TOP_LEVEL_GETTER_SET, | |
VISIT_TOP_LEVEL_GETTER_INVOKE, | |
VISIT_TOP_LEVEL_SETTER_GET, | |
VISIT_TOP_LEVEL_SETTER_SET, | |
VISIT_TOP_LEVEL_SETTER_INVOKE, | |
VISIT_TOP_LEVEL_GETTER_SETTER_COMPOUND, | |
VISIT_TOP_LEVEL_GETTER_SETTER_PREFIX, | |
VISIT_TOP_LEVEL_GETTER_SETTER_POSTFIX, | |
VISIT_TOP_LEVEL_GETTER_DECL, | |
VISIT_TOP_LEVEL_SETTER_DECL, | |
VISIT_TOP_LEVEL_FUNCTION_GET, | |
VISIT_TOP_LEVEL_FUNCTION_SET, | |
VISIT_TOP_LEVEL_FUNCTION_INVOKE, | |
VISIT_TOP_LEVEL_FUNCTION_INCOMPATIBLE_INVOKE, | |
VISIT_TOP_LEVEL_FUNCTION_DECL, | |
VISIT_TOP_LEVEL_METHOD_SETTER_COMPOUND, | |
VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX, | |
VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX, | |
VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND, | |
VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND, | |
VISIT_TOP_LEVEL_METHOD_COMPOUND, | |
VISIT_UNRESOLVED_TOP_LEVEL_GETTER_PREFIX, | |
VISIT_UNRESOLVED_TOP_LEVEL_SETTER_PREFIX, | |
VISIT_TOP_LEVEL_METHOD_PREFIX, | |
VISIT_UNRESOLVED_TOP_LEVEL_GETTER_POSTFIX, | |
VISIT_UNRESOLVED_TOP_LEVEL_SETTER_POSTFIX, | |
VISIT_TOP_LEVEL_METHOD_POSTFIX, | |
VISIT_DYNAMIC_PROPERTY_GET, | |
VISIT_DYNAMIC_PROPERTY_SET, | |
VISIT_DYNAMIC_PROPERTY_INVOKE, | |
VISIT_DYNAMIC_PROPERTY_COMPOUND, | |
VISIT_DYNAMIC_PROPERTY_PREFIX, | |
VISIT_DYNAMIC_PROPERTY_POSTFIX, | |
VISIT_THIS_GET, | |
VISIT_THIS_INVOKE, | |
VISIT_THIS_PROPERTY_GET, | |
VISIT_THIS_PROPERTY_SET, | |
VISIT_THIS_PROPERTY_INVOKE, | |
VISIT_THIS_PROPERTY_COMPOUND, | |
VISIT_THIS_PROPERTY_PREFIX, | |
VISIT_THIS_PROPERTY_POSTFIX, | |
VISIT_SUPER_FIELD_GET, | |
VISIT_SUPER_FIELD_SET, | |
VISIT_FINAL_SUPER_FIELD_SET, | |
VISIT_SUPER_FIELD_INVOKE, | |
VISIT_SUPER_FIELD_COMPOUND, | |
VISIT_SUPER_FIELD_PREFIX, | |
VISIT_SUPER_FIELD_POSTFIX, | |
VISIT_SUPER_FINAL_FIELD_COMPOUND, | |
VISIT_SUPER_FINAL_FIELD_PREFIX, | |
VISIT_SUPER_FINAL_FIELD_POSTFIX, | |
VISIT_SUPER_FIELD_FIELD_COMPOUND, | |
VISIT_SUPER_FIELD_FIELD_PREFIX, | |
VISIT_SUPER_FIELD_FIELD_POSTFIX, | |
VISIT_SUPER_GETTER_GET, | |
VISIT_SUPER_GETTER_SET, | |
VISIT_SUPER_GETTER_INVOKE, | |
VISIT_SUPER_SETTER_GET, | |
VISIT_SUPER_SETTER_SET, | |
VISIT_SUPER_SETTER_INVOKE, | |
VISIT_SUPER_GETTER_SETTER_COMPOUND, | |
VISIT_SUPER_GETTER_FIELD_COMPOUND, | |
VISIT_SUPER_FIELD_SETTER_COMPOUND, | |
VISIT_SUPER_GETTER_SETTER_PREFIX, | |
VISIT_SUPER_GETTER_FIELD_PREFIX, | |
VISIT_SUPER_FIELD_SETTER_PREFIX, | |
VISIT_SUPER_GETTER_SETTER_POSTFIX, | |
VISIT_SUPER_GETTER_FIELD_POSTFIX, | |
VISIT_SUPER_FIELD_SETTER_POSTFIX, | |
VISIT_SUPER_METHOD_GET, | |
VISIT_SUPER_METHOD_SET, | |
VISIT_SUPER_METHOD_INVOKE, | |
VISIT_SUPER_METHOD_INCOMPATIBLE_INVOKE, | |
VISIT_SUPER_METHOD_SETTER_COMPOUND, | |
VISIT_SUPER_METHOD_SETTER_PREFIX, | |
VISIT_SUPER_METHOD_SETTER_POSTFIX, | |
VISIT_SUPER_METHOD_COMPOUND, | |
VISIT_SUPER_METHOD_PREFIX, | |
VISIT_SUPER_METHOD_POSTFIX, | |
VISIT_UNRESOLVED_GET, | |
VISIT_UNRESOLVED_SET, | |
VISIT_UNRESOLVED_INVOKE, | |
VISIT_UNRESOLVED_SUPER_GET, | |
VISIT_UNRESOLVED_SUPER_INVOKE, | |
VISIT_BINARY, | |
VISIT_INDEX, | |
VISIT_EQUALS, | |
VISIT_NOT_EQUALS, | |
VISIT_INDEX_PREFIX, | |
VISIT_INDEX_POSTFIX, | |
VISIT_SUPER_BINARY, | |
VISIT_UNRESOLVED_SUPER_BINARY, | |
VISIT_SUPER_INDEX, | |
VISIT_UNRESOLVED_SUPER_INDEX, | |
VISIT_SUPER_EQUALS, | |
VISIT_SUPER_NOT_EQUALS, | |
VISIT_SUPER_INDEX_PREFIX, | |
VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND, | |
VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND, | |
VISIT_UNRESOLVED_SUPER_GETTER_PREFIX, | |
VISIT_UNRESOLVED_SUPER_SETTER_PREFIX, | |
VISIT_UNRESOLVED_SUPER_INDEX_PREFIX, | |
VISIT_UNRESOLVED_SUPER_GETTER_INDEX_PREFIX, | |
VISIT_UNRESOLVED_SUPER_SETTER_INDEX_PREFIX, | |
VISIT_SUPER_INDEX_POSTFIX, | |
VISIT_UNRESOLVED_SUPER_GETTER_POSTFIX, | |
VISIT_UNRESOLVED_SUPER_SETTER_POSTFIX, | |
VISIT_UNRESOLVED_SUPER_INDEX_POSTFIX, | |
VISIT_UNRESOLVED_SUPER_GETTER_INDEX_POSTFIX, | |
VISIT_UNRESOLVED_SUPER_SETTER_INDEX_POSTFIX, | |
VISIT_UNRESOLVED_SUPER_COMPOUND, | |
VISIT_UNRESOLVED_SUPER_PREFIX, | |
VISIT_UNRESOLVED_SUPER_POSTFIX, | |
VISIT_UNARY, | |
VISIT_SUPER_UNARY, | |
VISIT_UNRESOLVED_SUPER_UNARY, | |
VISIT_NOT, | |
VISIT_EXPRESSION_INVOKE, | |
VISIT_CLASS_TYPE_LITERAL_GET, | |
VISIT_CLASS_TYPE_LITERAL_SET, | |
VISIT_CLASS_TYPE_LITERAL_INVOKE, | |
VISIT_CLASS_TYPE_LITERAL_COMPOUND, | |
VISIT_CLASS_TYPE_LITERAL_PREFIX, | |
VISIT_CLASS_TYPE_LITERAL_POSTFIX, | |
VISIT_TYPEDEF_TYPE_LITERAL_GET, | |
VISIT_TYPEDEF_TYPE_LITERAL_SET, | |
VISIT_TYPEDEF_TYPE_LITERAL_INVOKE, | |
VISIT_TYPEDEF_TYPE_LITERAL_COMPOUND, | |
VISIT_TYPEDEF_TYPE_LITERAL_PREFIX, | |
VISIT_TYPEDEF_TYPE_LITERAL_POSTFIX, | |
VISIT_TYPE_VARIABLE_TYPE_LITERAL_GET, | |
VISIT_TYPE_VARIABLE_TYPE_LITERAL_SET, | |
VISIT_TYPE_VARIABLE_TYPE_LITERAL_INVOKE, | |
VISIT_TYPE_VARIABLE_TYPE_LITERAL_COMPOUND, | |
VISIT_TYPE_VARIABLE_TYPE_LITERAL_PREFIX, | |
VISIT_TYPE_VARIABLE_TYPE_LITERAL_POSTFIX, | |
VISIT_DYNAMIC_TYPE_LITERAL_GET, | |
VISIT_DYNAMIC_TYPE_LITERAL_SET, | |
VISIT_DYNAMIC_TYPE_LITERAL_INVOKE, | |
VISIT_DYNAMIC_TYPE_LITERAL_COMPOUND, | |
VISIT_DYNAMIC_TYPE_LITERAL_PREFIX, | |
VISIT_DYNAMIC_TYPE_LITERAL_POSTFIX, | |
VISIT_INDEX_SET, | |
VISIT_COMPOUND_INDEX_SET, | |
VISIT_SUPER_INDEX_SET, | |
VISIT_UNRESOLVED_SUPER_INDEX_SET, | |
VISIT_SUPER_COMPOUND_INDEX_SET, | |
VISIT_UNRESOLVED_SUPER_COMPOUND_INDEX_SET, | |
VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET, | |
VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET, | |
VISIT_ASSERT, | |
VISIT_LOGICAL_AND, | |
VISIT_LOGICAL_OR, | |
VISIT_IS, | |
VISIT_IS_NOT, | |
VISIT_AS, | |
VISIT_CONST_CONSTRUCTOR_INVOKE, | |
VISIT_BOOL_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, | |
VISIT_INT_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, | |
VISIT_STRING_FROM_ENVIRONMENT_CONSTRUCTOR_INVOKE, | |
VISIT_GENERATIVE_CONSTRUCTOR_INVOKE, | |
VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_INVOKE, | |
VISIT_FACTORY_CONSTRUCTOR_INVOKE, | |
VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, | |
VISIT_CONSTRUCTOR_INCOMPATIBLE_INVOKE, | |
ERROR_NON_CONSTANT_CONSTRUCTOR_INVOKE, | |
VISIT_SUPER_CONSTRUCTOR_INVOKE, | |
VISIT_IMPLICIT_SUPER_CONSTRUCTOR_INVOKE, | |
VISIT_THIS_CONSTRUCTOR_INVOKE, | |
VISIT_FIELD_INITIALIZER, | |
VISIT_UNRESOLVED_CLASS_CONSTRUCTOR_INVOKE, | |
VISIT_UNRESOLVED_CONSTRUCTOR_INVOKE, | |
VISIT_ABSTRACT_CLASS_CONSTRUCTOR_INVOKE, | |
VISIT_UNRESOLVED_REDIRECTING_FACTORY_CONSTRUCTOR_INVOKE, | |
VISIT_INSTANCE_GETTER_DECL, | |
VISIT_INSTANCE_SETTER_DECL, | |
VISIT_INSTANCE_METHOD_DECL, | |
VISIT_ABSTRACT_GETTER_DECL, | |
VISIT_ABSTRACT_SETTER_DECL, | |
VISIT_ABSTRACT_METHOD_DECL, | |
VISIT_INSTANCE_FIELD_DECL, | |
VISIT_GENERATIVE_CONSTRUCTOR_DECL, | |
VISIT_REDIRECTING_GENERATIVE_CONSTRUCTOR_DECL, | |
VISIT_FACTORY_CONSTRUCTOR_DECL, | |
VISIT_REDIRECTING_FACTORY_CONSTRUCTOR_DECL, | |
VISIT_REQUIRED_PARAMETER_DECL, | |
VISIT_OPTIONAL_PARAMETER_DECL, | |
VISIT_NAMED_PARAMETER_DECL, | |
VISIT_REQUIRED_INITIALIZING_FORMAL_DECL, | |
VISIT_OPTIONAL_INITIALIZING_FORMAL_DECL, | |
VISIT_NAMED_INITIALIZING_FORMAL_DECL, | |
VISIT_UNRESOLVED_COMPOUND, | |
VISIT_UNRESOLVED_PREFIX, | |
VISIT_UNRESOLVED_POSTFIX, | |
VISIT_IF_NULL, | |
VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_GET, | |
VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_SET, | |
VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_INVOKE, | |
VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_COMPOUND, | |
VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX, | |
VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX, | |
ERROR_INVALID_ASSERT, | |
ERROR_UNDEFINED_UNARY_EXPRESSION, | |
ERROR_UNDEFINED_BINARY_EXPRESSION, | |
VISIT_CONSTANT_GET, | |
VISIT_CONSTANT_INVOKE, | |
} |