// Copyright (c) 2018, 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.

// @dart = 2.7

import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/ir/static_type.dart';
import 'package:compiler/src/kernel/loader.dart';
import 'package:kernel/ast.dart' as ir;
import 'package:kernel/class_hierarchy.dart' as ir;
import 'package:kernel/core_types.dart' as ir;
import 'package:kernel/type_environment.dart' as ir;
import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir;

import '../helpers/memory_compiler.dart';
import 'analysis_helper.dart';

const String source = '''
main() {}
''';

main() {
  asyncTest(() async {
    Compiler compiler = await compilerFor(
        memorySourceFiles: {'main.dart': source},
        entryPoint: Uri.parse('memory:main.dart'));
    KernelResult result = await compiler.kernelLoader.load();
    ir.Component component = result.component;
    StaticTypeVisitor visitor = new Visitor(component);
    component.accept(visitor);
  });
}

class Visitor extends StaticTypeVisitorBase {
  Visitor(ir.Component component)
      : super(component,
            new ir.ClassHierarchy(component, new ir.CoreTypes(component)),
            evaluationMode: ir.EvaluationMode.weak);

  ir.DartType getStaticType(ir.Expression node) {
    if (typeEnvironment == null) {
      // The class hierarchy crashes on multiple inheritance. Use `dynamic`
      // as static type.
      return const ir.DynamicType();
    }
    ir.TreeNode enclosingMember = node;
    while (enclosingMember != null && enclosingMember is! ir.Member) {
      enclosingMember = enclosingMember.parent;
    }
    try {
      staticTypeContext =
          new ir.StaticTypeContext(enclosingMember, typeEnvironment);
      return node.getStaticType(staticTypeContext);
    } catch (e) {
      // The static type computation crashes on type errors. Use `dynamic`
      // as static type.
      return const ir.DynamicType();
    }
  }
}
