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

import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/generated/element_type_provider.dart';
import 'package:analyzer/src/generated/migratable_ast_info_provider.dart';

/// Hooks used by resolution to communicate with the migration engine.
abstract class MigrationResolutionHooks
    implements ElementTypeProvider, MigratableAstInfoProvider {
  /// Called when the resolver is visiting an if statement, if element, or
  /// conditional expression, to determine whether the condition is known to
  /// evaluate to `true` or `false`.
  ///
  /// If the condition is known to evaluate to `true` or `false`, then the value
  /// it is known to evaluate to is returned.  Otherwise `null` is returned.
  bool? getConditionalKnownValue(AstNode node);

  /// Called after the resolver has determined the type of an expression node.
  /// Should return the type that the expression has after migrations have been
  /// applied.
  DartType modifyExpressionType(Expression expression, DartType dartType);

  /// Called after the resolver has inferred the type of a function literal
  /// parameter.  Should return the type that the parameter has after migrations
  /// have been applied.
  DartType modifyInferredParameterType(
      ParameterElement parameter, DartType type);

  /// Called after the resolver has determined the read and write types
  /// of the assignment expression.
  void setCompoundAssignmentExpressionTypes(CompoundAssignmentExpression node);

  /// Called when the resolver starts or stops making use of a [FlowAnalysis]
  /// instance.
  void setFlowAnalysis(
      FlowAnalysis<AstNode, Statement, Expression, PromotableElement, DartType>?
          flowAnalysis);
}
