// 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.

library fasta.kernel_body_builder;

import 'package:kernel/ast.dart' show Expression;

import '../type_inference/type_inferrer.dart' show TypeInferrer;

import 'body_builder.dart' show BodyBuilder;

import 'fangorn.dart' show Fangorn;

import 'forest.dart' show Forest;

import 'kernel_api.dart' show ClassHierarchy, CoreTypes;

import 'kernel_builder.dart'
    show KernelClassBuilder, KernelLibraryBuilder, ModifierBuilder, Scope;

class KernelBodyBuilder extends BodyBuilder {
  @override
  final Forest forest;

  KernelBodyBuilder(
      KernelLibraryBuilder library,
      ModifierBuilder member,
      Scope scope,
      Scope formalParameterScope,
      ClassHierarchy hierarchy,
      CoreTypes coreTypes,
      KernelClassBuilder classBuilder,
      bool isInstanceMember,
      Uri uri,
      TypeInferrer typeInferrer)
      : forest = const Fangorn(),
        super(library, member, scope, formalParameterScope, hierarchy,
            coreTypes, classBuilder, isInstanceMember, uri, typeInferrer);

  KernelBodyBuilder.forField(ModifierBuilder member, TypeInferrer typeInferrer)
      : forest = const Fangorn(),
        super.forField(member, typeInferrer);

  KernelBodyBuilder.forOutlineExpression(
      KernelLibraryBuilder library,
      KernelClassBuilder classBuilder,
      ModifierBuilder member,
      Scope scope,
      Scope parameterScope,
      Uri fileUri)
      : forest = const Fangorn(),
        super(
            library,
            member,
            scope,
            parameterScope,
            library.loader.hierarchy,
            library.loader.coreTypes,
            classBuilder,
            member?.isInstanceMember ?? false,
            fileUri,
            library.loader.typeInferenceEngine
                ?.createLocalTypeInferrer(fileUri, null, library));

  @override
  void enterThenForTypePromotion(Expression condition) {
    typePromoter?.enterThen(condition);
  }
}
