blob: ba2554c3f32d6a47765301cb5c3051c1cc9ee0e5 [file] [log] [blame]
// 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:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/element/element.dart';
/// Abstraction layer allowing the mechanism for looking up the types of
/// elements to be customized.
///
/// This is needed for the NNBD migration engine, which needs to analyze
/// NNBD-disabled code as though it has NNBD enabled.
///
/// This base class implementation gets types directly from the elements; for
/// other behaviors, create a class that extends or implements this class.
///
/// Getters in the ElementImpl classes are automatically wired into this
/// indirection mechanism, so it should be transparent to clients, as well as
/// most analyzer internal code.
class ElementTypeProvider {
/// The [ElementTypeProvider] currently in use. Change this value to cause
/// element types to be looked up in a different way.
static ElementTypeProvider current = const ElementTypeProvider();
const ElementTypeProvider();
/// Notifies the [ElementTypeProvider] that a fresh type parameter element has
/// been created. If the [ElementTypeProvider] is storing additional
/// information about type parameter elements, this gives it an opportunity to
/// copy that information.
void freshTypeParameterCreated(TypeParameterElement newTypeParameter,
TypeParameterElement oldTypeParameter) {}
List<InterfaceType> getClassInterfaces(ClassElementImpl element) =>
element.interfacesInternal;
/// Queries the parameters of an executable element's signature.
///
/// Equivalent to `getExecutableType(...).parameters`.
List<ParameterElement> getExecutableParameters(
ExecutableElementImpl element) =>
element.parametersInternal;
/// Queries the return type of an executable element.
///
/// Equivalent to `getExecutableType(...).returnType`.
DartType getExecutableReturnType(ElementImplWithFunctionType element) =>
element.returnTypeInternal;
/// Queries the full type of an executable element.
///
/// Guaranteed to be a function type.
FunctionType getExecutableType(ElementImplWithFunctionType element) =>
element.typeInternal;
DartType getExtendedType(ExtensionElementImpl element) =>
element.extendedTypeInternal;
/// Queries the type of a field.
DartType getFieldType(PropertyInducingElementImpl element) =>
element.typeInternal;
/// Queries the bound of a type parameter.
DartType? getTypeParameterBound(TypeParameterElementImpl element) =>
element.boundInternal;
/// Queries the type of a variable element.
DartType getVariableType(VariableElementImpl variable) =>
variable.typeInternal;
/// Queries whether NNBD is enabled for a library.
bool isLibraryNonNullableByDefault(LibraryElementImpl element) =>
element.isNonNullableByDefaultInternal;
}