// 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/elements/resolution_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.isMalformed,
          "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.isMalformed,
        "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_UNRESOLVED_SUPER_SET,
  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_INDEX_SET_IF_NULL,
  VISIT_SUPER_INDEX_SET_IF_NULL,
  VISIT_UNRESOLVED_SUPER_INDEX_SET_IF_NULL,
  VISIT_UNRESOLVED_SUPER_GETTER_INDEX_SET_IF_NULL,
  VISIT_UNRESOLVED_SUPER_SETTER_INDEX_SET_IF_NULL,
  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,
}
