// Copyright (c) 2017, 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 fasta.analyzer_loader;

import 'package:front_end/physical_file_system.dart';
import 'package:kernel/ast.dart' show Program;

import 'package:front_end/src/fasta/builder/builder.dart' show LibraryBuilder;

import 'package:front_end/src/fasta/target_implementation.dart'
    show TargetImplementation;

import 'package:front_end/src/fasta/source/source_class_builder.dart'
    show SourceClassBuilder;

import 'package:front_end/src/fasta/source/source_loader.dart'
    show SourceLoader;

import 'analyzer_diet_listener.dart' show AnalyzerDietListener;

import 'package:kernel/core_types.dart' show CoreTypes;
import 'package:kernel/src/incremental_class_hierarchy.dart';

class AnalyzerLoader<L> extends SourceLoader<L> {
  AnalyzerLoader(TargetImplementation target)
      : super(PhysicalFileSystem.instance, false, target);

  @override
  void computeHierarchy(Program program) {
    ticker.logMs("Built analyzer element model.");
    hierarchy = new IncrementalClassHierarchy();
    ticker.logMs("Computed class hierarchy");
    coreTypes = new CoreTypes(program);
    ticker.logMs("Computed core types");
  }

  @override
  AnalyzerDietListener createDietListener(LibraryBuilder library) {
    return new AnalyzerDietListener(
        library, hierarchy, coreTypes, typeInferenceEngine);
  }

  @override
  void checkOverrides(List<SourceClassBuilder> sourceClasses) {
    // Not implemented yet. Requires [hierarchy].
  }
}
