// 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/commandline_options.dart';
import 'package:compiler/src/constants/expressions.dart';
import 'package:compiler/src/dart_types.dart';
import 'package:compiler/src/diagnostics/spannable.dart';
import 'package:compiler/src/diagnostics/messages.dart' show MessageKind;
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/elements.dart';
import 'package:compiler/src/resolution/operators.dart';
import 'package:compiler/src/resolution/semantic_visitor.dart';
import 'package:compiler/src/resolution/tree_elements.dart';
import 'package:compiler/src/tree/tree.dart';
import 'package:compiler/src/universe/call_structure.dart' show
    CallStructure;
import 'package:compiler/src/universe/selector.dart' show
    Selector;
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;
  final error;

  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,
               this.error});

  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');
    }
    if (error != null) {
      sb.write(',error=$error');
    }
    return sb.toString();
  }
}

class Test {
  final String codeByPrefix;
  final bool isDeferred;
  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, isDeferred = false;
  const Test.clazz(this.code, this.expectedVisits,
                   {this.cls: 'C', this.method: 'm'})
      : codeByPrefix = null, isDeferred = false;
  const Test.prefix(this.codeByPrefix, this.code, this.expectedVisits,
                   {this.isDeferred: false})
      : 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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  VisitKind.VISIT_SUPER_METHOD_SETTER_PREFIX,
  VisitKind.VISIT_SUPER_METHOD_SETTER_POSTFIX,
  // 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)) async {
  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;
        if (test.isDeferred) {
          testSource.writeln("import '$prefixFilename' deferred as p;");
        } else {
          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();

  CompilationResult result = await runCompiler(
      memorySourceFiles: sourceFiles,
      options: [Flags.analyzeAll, Flags.analyzeOnly]);
  Compiler compiler = result.compiler;
  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.reporter.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}\n\n"
          "Expected: $expectedVisits\n"
          "Found: ${visitor.visits}");
      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_SET_IF_NULL,
  VISIT_PARAMETER_PREFIX,
  VISIT_PARAMETER_POSTFIX,
  VISIT_FINAL_PARAMETER_SET,
  VISIT_FINAL_PARAMETER_COMPOUND,
  VISIT_FINAL_PARAMETER_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  VISIT_FINAL_LOCAL_VARIABLE_PREFIX,
  VISIT_FINAL_LOCAL_VARIABLE_POSTFIX,

  VISIT_LOCAL_FUNCTION_GET,
  VISIT_LOCAL_FUNCTION_INVOKE,
  VISIT_LOCAL_FUNCTION_INCOMPATIBLE_INVOKE,
  VISIT_LOCAL_FUNCTION_DECL,
  VISIT_CLOSURE_DECL,
  VISIT_LOCAL_FUNCTION_SET,
  VISIT_LOCAL_FUNCTION_COMPOUND,
  VISIT_LOCAL_FUNCTION_SET_IF_NULL,
  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_SET_IF_NULL,
  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_GETTER_SETTER_SET_IF_NULL,
  VISIT_STATIC_METHOD_SETTER_COMPOUND,
  VISIT_STATIC_METHOD_SETTER_SET_IF_NULL,
  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_SET_IF_NULL,
  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_GETTER_SET_IF_NULL,
  VISIT_UNRESOLVED_STATIC_SETTER_COMPOUND,
  VISIT_UNRESOLVED_STATIC_SETTER_SET_IF_NULL,
  VISIT_STATIC_METHOD_COMPOUND,
  VISIT_STATIC_METHOD_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  VISIT_TOP_LEVEL_METHOD_SETTER_PREFIX,
  VISIT_TOP_LEVEL_METHOD_SETTER_POSTFIX,

  VISIT_UNRESOLVED_TOP_LEVEL_GETTER_COMPOUND,
  VISIT_UNRESOLVED_TOP_LEVEL_GETTER_SET_IF_NULL,
  VISIT_UNRESOLVED_TOP_LEVEL_SETTER_COMPOUND,
  VISIT_UNRESOLVED_TOP_LEVEL_SETTER_SET_IF_NULL,
  VISIT_TOP_LEVEL_METHOD_COMPOUND,
  VISIT_TOP_LEVEL_METHOD_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  VISIT_SUPER_FIELD_PREFIX,
  VISIT_SUPER_FIELD_POSTFIX,
  VISIT_SUPER_FINAL_FIELD_COMPOUND,
  VISIT_SUPER_FINAL_FIELD_SET_IF_NULL,
  VISIT_SUPER_FINAL_FIELD_PREFIX,
  VISIT_SUPER_FINAL_FIELD_POSTFIX,
  VISIT_SUPER_FIELD_FIELD_COMPOUND,
  VISIT_SUPER_FIELD_FIELD_SET_IF_NULL,
  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_SETTER_SET_IF_NULL,
  VISIT_SUPER_GETTER_FIELD_COMPOUND,
  VISIT_SUPER_GETTER_FIELD_SET_IF_NULL,
  VISIT_SUPER_FIELD_SETTER_COMPOUND,
  VISIT_SUPER_FIELD_SETTER_SET_IF_NULL,
  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_SET_IF_NULL,
  VISIT_SUPER_METHOD_SETTER_PREFIX,
  VISIT_SUPER_METHOD_SETTER_POSTFIX,
  VISIT_SUPER_METHOD_COMPOUND,
  VISIT_SUPER_METHOD_SET_IF_NULL,
  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_GETTER_SET_IF_NULL,
  VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND,
  VISIT_UNRESOLVED_SUPER_SETTER_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_SET_IF_NULL,
  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_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_SET_IF_NULL,
  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_SET_IF_NULL,
  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX,
  VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX,

  ERROR_UNDEFINED_UNARY_EXPRESSION,
  ERROR_UNDEFINED_BINARY_EXPRESSION,
  ERROR_INVALID_GET,
  ERROR_INVALID_INVOKE,
  ERROR_INVALID_SET,
  ERROR_INVALID_PREFIX,
  ERROR_INVALID_POSTFIX,
  ERROR_INVALID_COMPOUND,
  ERROR_INVALID_SET_IF_NULL,
  ERROR_INVALID_UNARY,
  ERROR_INVALID_EQUALS,
  ERROR_INVALID_NOT_EQUALS,
  ERROR_INVALID_BINARY,
  ERROR_INVALID_INDEX,
  ERROR_INVALID_INDEX_SET,
  ERROR_INVALID_COMPOUND_INDEX_SET,
  ERROR_INVALID_INDEX_PREFIX,
  ERROR_INVALID_INDEX_POSTFIX,

  VISIT_CONSTANT_GET,
  VISIT_CONSTANT_INVOKE,

  PREVISIT_DEFERRED_ACCESS,
}
