Elements. Stop using ConstructorElementMixin in constants evaluation.
Change-Id: I54e22bd9a0068ffa8de5a7ded932131327f672fa
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/437105
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
index d8e5e5d..39de746 100644
--- a/pkg/analyzer/lib/src/dart/constant/compute.dart
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -67,8 +67,9 @@
var constantsInCycle = scc.map((node) => node.constant);
for (var node in scc) {
var constant = node.constant;
- if (constant is ConstructorFragmentImpl) {
- constant.isCycleFree = false;
+ if (constant is ConstructorElementImpl) {
+ // TODO(scheglov): move the flag to the element
+ constant.firstFragment.isCycleFree = false;
}
_getEvaluationEngine(node).generateCycleError(constantsInCycle, constant);
}
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 4de239f..f978b32 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -33,7 +33,6 @@
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/exhaustiveness.dart';
import 'package:analyzer/src/utilities/extensions/ast.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
/// Instances of the class `ConstantVerifier` traverse an AST structure looking
/// for additional errors and warnings not covered by the parser and resolver.
@@ -213,11 +212,7 @@
if (node.isConst) {
var constructor = node.constructorName.element;
if (constructor is ConstructorElementMixin2) {
- _validateConstructorInvocation(
- node,
- constructor.asElement,
- node.argumentList,
- );
+ _validateConstructorInvocation(node, constructor, node.argumentList);
}
} else {
super.visitDotShorthandConstructorInvocation(node);
@@ -288,7 +283,7 @@
CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS,
);
- var constructor = node.constructorName.element?.asElement;
+ var constructor = node.constructorName.element;
if (constructor != null) {
_validateConstructorInvocation(node, constructor, node.argumentList);
}
@@ -916,7 +911,7 @@
/// arguments are constant expressions.
void _validateConstructorInvocation(
AstNode node,
- ConstructorElementMixin constructor,
+ ConstructorElementMixin2 constructor,
ArgumentList argumentList,
) {
var constantVisitor = ConstantVisitor(
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 297d0f4..c5b036a 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -87,6 +87,10 @@
constant = element.declaration as ConstantEvaluationTarget;
}
+ if (constant case ConstructorElementMixin2 constructor) {
+ constant = constructor.baseElement;
+ }
+
var library = constant.library as LibraryElementImpl;
if (constant is FormalParameterFragmentImpl) {
if (constant is ConstVariableFragment) {
@@ -166,13 +170,13 @@
constant.evaluationResult = dartConstant;
}
- } else if (constant is ConstructorFragmentImpl) {
+ } else if (constant is ConstructorElementImpl) {
if (constant.isConst) {
// No evaluation needs to be done; constructor declarations are only in
// the dependency graph to ensure that any constants referred to in
// initializer lists and parameter defaults are evaluated before
// invocations of the constructor.
- constant.isConstantEvaluated = true;
+ constant.firstFragment.isConstantEvaluated = true;
}
} else if (constant is ElementAnnotationImpl) {
var constNode = constant.annotationAst;
@@ -210,7 +214,7 @@
constNode,
element.returnType.typeArguments,
constNode.arguments!.arguments,
- element.asElement,
+ element,
constantVisitor,
);
constant.evaluationResult = result;
@@ -258,20 +262,21 @@
}
ReferenceFinder referenceFinder = ReferenceFinder(callback);
- if (constant is ConstructorElementMixin) {
- constant = constant.declaration;
+ if (constant case ConstructorElementMixin2 constructor) {
+ constant = constructor.baseElement;
}
+
if (constant is VariableElementOrMember) {
var declaration = constant.declaration;
var initializer = declaration.constantInitializer;
if (initializer != null) {
initializer.accept(referenceFinder);
}
- } else if (constant is ConstructorFragmentImpl) {
+ } else if (constant is ConstructorElementImpl) {
if (constant.isConst) {
var redirectedConstructor = getConstRedirectedConstructor(constant);
if (redirectedConstructor != null) {
- var redirectedConstructorBase = redirectedConstructor.declaration;
+ var redirectedConstructorBase = redirectedConstructor.baseElement;
callback(redirectedConstructorBase);
return;
} else if (constant.isFactory) {
@@ -302,21 +307,21 @@
var unnamedConstructor =
superclass.element.unnamedConstructor2?.baseElement;
if (unnamedConstructor != null && unnamedConstructor.isConst) {
- callback(unnamedConstructor.asElement);
+ callback(unnamedConstructor);
}
}
}
- for (var field in constant.enclosingElement3.fields) {
+ for (var field in constant.enclosingElement.fields) {
// Note: non-static const isn't allowed but we handle it anyway so
// that we won't be confused by incorrect code.
if ((field.isFinal || field.isConst) &&
!field.isStatic &&
field.hasInitializer) {
- callback(field);
+ callback(field.firstFragment);
}
}
- for (var parameterElement in constant.parameters) {
- callback(parameterElement);
+ for (var parameterElement in constant.formalParameters) {
+ callback(parameterElement.firstFragment as ParameterElementMixin);
}
}
} else if (constant is ElementAnnotationImpl) {
@@ -333,7 +338,7 @@
// The annotation is a constructor invocation, so it depends on the
// constructor.
var baseElement = element.baseElement;
- callback(baseElement.firstFragment as ConstructorFragmentImpl);
+ callback(baseElement as ConstructorElementImpl);
} else {
// This could happen in the event of invalid code. The error will be
// reported at constant evaluation time.
@@ -363,7 +368,7 @@
AstNode node,
List<TypeImpl>? typeArguments,
List<Expression> arguments,
- ConstructorElementMixin constructor,
+ ConstructorElementMixin2 constructor,
ConstantVisitor constantVisitor, {
ConstructorInvocation? invocation,
}) {
@@ -412,7 +417,7 @@
AstNode node,
List<TypeImpl>? typeArguments,
List<Expression> arguments,
- ConstructorElementMixin constructor,
+ ConstructorElementMixin2 constructor,
ConstantVisitor constantVisitor, {
ConstructorInvocation? invocation,
}) {
@@ -453,7 +458,7 @@
element: constant.asElement2!,
diagnosticCode: CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT,
);
- } else if (constant is ConstructorFragmentImpl) {
+ } else if (constant is ConstructorElementImpl) {
// We don't report cycle errors on constructor declarations here since
// there is nowhere to put the error information.
//
@@ -472,15 +477,14 @@
/// If [constructor] redirects to another const constructor, return the
/// const constructor it redirects to. Otherwise return `null`.
- static ConstructorElementMixin? getConstRedirectedConstructor(
- ConstructorElementMixin constructor,
+ static ConstructorElementMixin2? getConstRedirectedConstructor(
+ ConstructorElementMixin2 constructor,
) {
if (!constructor.isFactory) {
return null;
}
var typeProvider = constructor.library.typeProvider;
- if (constructor.asElement2.enclosingElement ==
- typeProvider.symbolElement2) {
+ if (constructor.enclosingElement == typeProvider.symbolElement2) {
// The dart:core.Symbol has a const factory constructor that redirects
// to dart:_internal.Symbol. That in turn redirects to an external
// const constructor, which we won't be able to evaluate.
@@ -488,7 +492,7 @@
// let [evaluateInstanceCreationExpression] handle it specially.
return null;
}
- var redirectedConstructor = constructor.asElement2.redirectedConstructor2;
+ var redirectedConstructor = constructor.redirectedConstructor2;
if (redirectedConstructor == null) {
// This can happen if constructor is an external factory constructor.
return null;
@@ -499,7 +503,7 @@
// [ErrorVerifier.checkForRedirectToNonConstConstructor()]).
return null;
}
- return redirectedConstructor.asElement as ConstructorElementMixin;
+ return redirectedConstructor;
}
static _EnumConstant? _enumConstant(VariableFragmentImpl element) {
@@ -911,7 +915,7 @@
node,
constructor.returnType.typeArguments,
node.argumentList.arguments,
- constructor.asElement,
+ constructor,
this,
);
}
@@ -1039,7 +1043,7 @@
// https://github.com/dart-lang/sdk/issues/47061
return InvalidConstant.genericError(node: node);
}
- var constructor = node.constructorName.element?.asElement;
+ var constructor = node.constructorName.element;
if (constructor == null) {
// Couldn't resolve the constructor so we can't compute a value. No
// problem - the error has already been reported.
@@ -2834,7 +2838,10 @@
/// because they usually happen in a different source. But they still should
/// cause a constant evaluation error for the current node.
late final DiagnosticReporter _externalDiagnosticReporter =
- DiagnosticReporter(_externalDiagnosticListener, _constructor.source);
+ DiagnosticReporter(
+ _externalDiagnosticListener,
+ _constructor.firstFragment.libraryFragment.source,
+ );
late final ConstantVisitor _initializerVisitor = ConstantVisitor(
_evaluationEngine,
@@ -2848,7 +2855,7 @@
/// The node used for most error reporting.
final AstNode _errorNode;
- final ConstructorElementMixin _constructor;
+ final ConstructorElementMixin2 _constructor;
final List<TypeImpl>? _typeArguments;
@@ -2897,9 +2904,9 @@
/// Evaluates this constructor call as a factory constructor call.
Constant evaluateFactoryConstructorCall(List<Expression> arguments) {
- var definingClass = _constructor.asElement2.enclosingElement;
+ var definingClass = _constructor.enclosingElement;
var argumentCount = arguments.length;
- if (_constructor.name2 == "fromEnvironment") {
+ if (_constructor.name3 == "fromEnvironment") {
if (!_checkFromEnvironmentArguments(arguments, definingType)) {
return InvalidConstant.forEntity(
entity: _errorNode,
@@ -2920,26 +2927,26 @@
return FromEnvironmentEvaluator(
typeSystem,
_declaredVariables,
- ).getBool2(variableName, _namedValues, _constructor.asElement2);
+ ).getBool2(variableName, _namedValues, _constructor);
} else if (definingClass == typeProvider.intElement2) {
return FromEnvironmentEvaluator(
typeSystem,
_declaredVariables,
- ).getInt2(variableName, _namedValues, _constructor.asElement2);
+ ).getInt2(variableName, _namedValues, _constructor);
} else if (definingClass == typeProvider.stringElement2) {
return FromEnvironmentEvaluator(
typeSystem,
_declaredVariables,
- ).getString2(variableName, _namedValues, _constructor.asElement2);
+ ).getString2(variableName, _namedValues, _constructor);
}
- } else if (_constructor.name2 == 'hasEnvironment' &&
+ } else if (_constructor.name3 == 'hasEnvironment' &&
definingClass == typeProvider.boolElement2) {
var name = argumentCount < 1 ? null : firstArgument?.toStringValue();
return FromEnvironmentEvaluator(
typeSystem,
_declaredVariables,
).hasEnvironment(name);
- } else if (_constructor.name2 == 'new' &&
+ } else if (_constructor.name3 == 'new' &&
definingClass == typeProvider.symbolElement2 &&
argumentCount == 1) {
if (!_checkSymbolArguments(arguments)) {
@@ -3011,17 +3018,17 @@
void _addImplicitArgumentsFromSuperFormals(List<Expression> superArguments) {
var positionalIndex = 0;
- for (var parameter in _constructor.parameters) {
- if (parameter is SuperFormalParameterElementOrMember) {
+ for (var parameter in _constructor.formalParameters) {
+ if (parameter is SuperFormalParameterElement) {
var value =
SimpleIdentifierImpl(
token: StringToken(
TokenType.STRING,
- parameter.name2 ?? '',
- parameter.nameOffset,
+ parameter.name3 ?? '',
+ parameter.firstFragment.nameOffset2 ?? -1,
),
)
- ..element = parameter.asElement2
+ ..element = parameter
..setPseudoExpressionStaticType(parameter.type);
if (parameter.isPositional) {
superArguments.insert(positionalIndex++, value);
@@ -3032,10 +3039,10 @@
label: SimpleIdentifierImpl(
token: StringToken(
TokenType.STRING,
- parameter.name2 ?? '',
- parameter.nameOffset,
+ parameter.name3 ?? '',
+ parameter.firstFragment.nameOffset2 ?? -1,
),
- )..element = parameter.asElement2,
+ )..element = parameter,
colon: StringToken(TokenType.COLON, ':', -1),
),
expression: value,
@@ -3051,10 +3058,10 @@
/// Returns an [InvalidConstant] if one is found, or `null` otherwise.
InvalidConstant? _checkFields() {
var substitution = Substitution.fromInterfaceType(_constructor.returnType);
- var fields = _constructor.declaration.enclosingElement3.fields;
+ var fields = _constructor.baseElement.enclosingElement.fields;
for (var field in fields) {
if ((field.isFinal || field.isConst) && !field.isStatic) {
- var fieldValue = field.evaluationResult;
+ var fieldValue = field.firstFragment.evaluationResult;
// It is possible that the evaluation result is null.
// This happens for example when we have duplicate fields.
@@ -3066,20 +3073,20 @@
var fieldType = substitution.substituteType(field.type);
if (!typeSystem.runtimeTypeMatch(fieldValue, fieldType)) {
var isRuntimeException = hasTypeParameterReference(field.type);
- var errorNode = field.constantInitializer ?? _errorNode;
+ var errorNode = field.constantInitializer2?.expression ?? _errorNode;
return InvalidConstant.forEntity(
entity: errorNode,
diagnosticCode:
CompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
arguments: [
fieldValue.type.getDisplayString(),
- field.name2 ?? '',
+ field.name3 ?? '',
fieldType.getDisplayString(),
],
isRuntimeException: isRuntimeException,
);
}
- _fieldMap[field.name2 ?? ''] = fieldValue;
+ _fieldMap[field.name3 ?? ''] = fieldValue;
}
}
return null;
@@ -3129,7 +3136,7 @@
/// redirecting constructor invocation, an [InvalidConstant], or an
/// incomplete state for further evaluation.
_InitializersEvaluationResult _checkInitializers() {
- var constructorBase = _constructor.declaration;
+ var constructorBase = _constructor.baseElement;
// If we encounter a superinitializer, store the name of the constructor,
// and the arguments.
String? superName;
@@ -3200,7 +3207,12 @@
if (evaluationResult.contextMessages.isEmpty) {
evaluationResult.contextMessages.add(
DiagnosticMessageImpl(
- filePath: _constructor.source.fullName,
+ filePath:
+ _constructor
+ .firstFragment
+ .libraryFragment
+ .source
+ .fullName,
length: evaluationResult.length,
message:
"The error is in the field initializer of "
@@ -3233,10 +3245,10 @@
} else if (initializer is RedirectingConstructorInvocationImpl) {
// This is a redirecting constructor, so just evaluate the constructor
// it redirects to.
- var baseElement = initializer.element?.lastFragment;
+ var baseElement = initializer.element;
if (baseElement != null && baseElement.isConst) {
// Instantiate the constructor with the in-scope type arguments.
- var constructor = ConstructorMember.from(baseElement, definingType);
+ var constructor = ConstructorMember.from2(baseElement, definingType);
var result = _evaluationEngine.evaluateConstructorCall(
_library,
_errorNode,
@@ -3296,7 +3308,12 @@
if (evaluationResult.contextMessages.isEmpty) {
evaluationResult.contextMessages.add(
DiagnosticMessageImpl(
- filePath: _constructor.source.fullName,
+ filePath:
+ _constructor
+ .firstFragment
+ .libraryFragment
+ .source
+ .fullName,
length: evaluationResult.length,
message:
"The error is in the assert initializer of "
@@ -3339,17 +3356,17 @@
///
/// Returns an [InvalidConstant] if one is found, or `null` otherwise.
InvalidConstant? _checkParameters(List<Expression> arguments) {
- var parameters = _constructor.parameters;
+ var parameters = _constructor.formalParameters;
var parameterCount = parameters.length;
for (var i = 0; i < parameterCount; i++) {
var parameter = parameters[i];
- var baseParameter = parameter.declaration;
+ var baseParameter = parameter.baseElement;
DartObjectImpl? argumentValue;
AstNode? errorTarget;
if (baseParameter.isNamed) {
- argumentValue = _namedValues[baseParameter.name2 ?? ''];
- errorTarget = _namedNodes[baseParameter.name2 ?? ''];
+ argumentValue = _namedValues[baseParameter.name3 ?? ''];
+ errorTarget = _namedNodes[baseParameter.name3 ?? ''];
} else if (i < _argumentValues.length) {
argumentValue = _argumentValues[i];
errorTarget = arguments[i];
@@ -3361,7 +3378,7 @@
if (argumentValue == null && baseParameter.isOptional) {
// The parameter is an optional positional parameter for which no value
// was provided, so use the default value.
- var evaluationResult = baseParameter.evaluationResult;
+ var evaluationResult = baseParameter.firstFragment.evaluationResult;
if (evaluationResult == null) {
// No default was provided, so the default value is null.
argumentValue = ConstantEvaluationEngine._nullObject(_library);
@@ -3393,9 +3410,9 @@
);
}
if (baseParameter.isInitializingFormal) {
- var field = (parameter as FieldFormalParameterElementOrMember).field;
+ var field = (parameter as FieldFormalParameterElement).field2;
if (field != null) {
- var fieldType = field.type;
+ var fieldType = field.type as TypeImpl;
if (fieldType != parameter.type) {
// We've already checked that the argument can be assigned to the
// parameter; we also need to check that it can be assigned to
@@ -3414,7 +3431,7 @@
);
}
}
- var fieldName = field.name2 ?? '';
+ var fieldName = field.name3 ?? '';
if (_fieldMap.containsKey(fieldName)) {
return InvalidConstant.forEntity(
entity: _errorNode,
@@ -3425,7 +3442,7 @@
_fieldMap[fieldName] = argumentValue;
}
}
- _parameterMap[baseParameter.name2 ?? ''] = argumentValue;
+ _parameterMap[baseParameter.name3 ?? ''] = argumentValue;
}
}
return null;
@@ -3445,10 +3462,10 @@
}) {
var superclass = definingType.superclass;
if (superclass != null && !superclass.isDartCoreObject) {
- var superConstructor =
- superclass
- .lookUpConstructor(superName, _constructor.library)
- ?.asElement;
+ var superConstructor = superclass.lookUpConstructor(
+ superName,
+ _constructor.library,
+ );
if (superConstructor == null) {
return null;
}
@@ -3472,7 +3489,12 @@
if (evaluationResult.contextMessages.isEmpty) {
evaluationResult.contextMessages.add(
DiagnosticMessageImpl(
- filePath: _constructor.source.fullName,
+ filePath:
+ _constructor
+ .firstFragment
+ .libraryFragment
+ .source
+ .fullName,
length: evaluationResult.length,
message:
"The error is in the super constructor invocation "
@@ -3524,7 +3546,7 @@
void _checkTypeParameters() {
var typeParameters =
- _constructor.declaration.enclosingElement3.typeParameters;
+ _constructor.baseElement.enclosingElement.typeParameters2;
var typeArguments = _typeArguments;
if (typeParameters.isNotEmpty &&
typeArguments != null &&
@@ -3532,7 +3554,7 @@
for (int i = 0; i < typeParameters.length; i++) {
var typeParameter = typeParameters[i];
var typeArgument = typeArguments[i];
- _typeParameterMap[typeParameter.asElement2] = typeArgument;
+ _typeParameterMap[typeParameter] = typeArgument;
}
}
}
@@ -3540,17 +3562,17 @@
/// Returns a context message that mimics a stack trace where [superConstructor] is
/// called by [constructor]
DiagnosticMessageImpl _stackTraceContextMessage(
- ConstructorElementMixin superConstructor,
- ConstructorElementMixin constructor,
+ ConstructorElementMixin2 superConstructor,
+ ConstructorElementMixin2 constructor,
) {
return DiagnosticMessageImpl(
- filePath: constructor.source.fullName,
- length: constructor.nameLength,
+ filePath: constructor.firstFragment.libraryFragment.source.fullName,
+ length: 1,
message:
"The evaluated constructor '${superConstructor.displayName}' "
"is called by '${constructor.displayName}' and "
"'${constructor.displayName}' is defined here.",
- offset: constructor.nameOffset,
+ offset: constructor.firstFragment.offset,
url: null,
);
}
@@ -3561,7 +3583,7 @@
DeclaredVariables declaredVariables,
LibraryElementImpl library,
AstNode node,
- ConstructorElementMixin constructor,
+ ConstructorElementMixin2 constructor,
List<TypeImpl>? typeArguments,
List<Expression> arguments,
ConstantVisitor constantVisitor, {
@@ -3580,7 +3602,7 @@
);
}
- if (!constructor.declaration.isCycleFree) {
+ if (!constructor.baseElement.firstFragment.isCycleFree) {
// It's not safe to evaluate this constructor, so bail out.
//
// Instead of reporting an error at the call-sites, we will report an
@@ -3616,8 +3638,8 @@
namedValues[name] = argumentConstant;
} else {
var parameterType =
- i < constructor.parameters.length
- ? constructor.parameters[i].type
+ i < constructor.formalParameters.length
+ ? constructor.formalParameters[i].type
: InvalidTypeImpl.instance;
var argumentConstant = constantVisitor._valueOf(
argument,
@@ -3632,7 +3654,7 @@
}
invocation ??= ConstructorInvocation(
- constructor.asElement2,
+ constructor,
argumentValues,
namedValues,
);
@@ -3667,19 +3689,19 @@
/// chain terminates. If there is a problem (e.g. a redirection can't be
/// found, or a cycle is encountered), the chain will be followed as far as
/// possible and then a const factory constructor will be returned.
- static ConstructorElementMixin _followConstantRedirectionChain(
- ConstructorElementMixin constructor,
+ static ConstructorElementMixin2 _followConstantRedirectionChain(
+ ConstructorElementMixin2 constructor,
) {
- var constructorsVisited = <ConstructorElementMixin>{};
+ var constructorsVisited = <ConstructorElementMixin2>{};
while (true) {
var redirectedConstructor =
ConstantEvaluationEngine.getConstRedirectedConstructor(constructor);
if (redirectedConstructor == null) {
break;
} else {
- var constructorBase = constructor.declaration;
+ var constructorBase = constructor.baseElement;
constructorsVisited.add(constructorBase);
- var redirectedConstructorBase = redirectedConstructor.declaration;
+ var redirectedConstructorBase = redirectedConstructor.baseElement;
if (constructorsVisited.contains(redirectedConstructorBase)) {
// Cycle in redirecting factory constructors--this is not allowed
// and is checked elsewhere--see
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 15ab98a..f902e30 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -155,7 +155,7 @@
if (node.constKeyword != null) {
var fragment = node.declaredFragment;
if (fragment != null) {
- constantsToCompute.add(fragment);
+ constantsToCompute.add(fragment.element);
constantsToCompute.addAll(fragment.parameters);
}
}
@@ -228,7 +228,7 @@
if (node.isConst) {
var constructor = node.constructorName.element?.baseElement;
if (constructor != null && constructor.isConst) {
- _callback(constructor.firstFragment);
+ _callback(constructor);
}
}
super.visitInstanceCreationExpression(node);
@@ -250,7 +250,7 @@
super.visitRedirectingConstructorInvocation(node);
var target = node.element?.baseElement;
if (target != null) {
- _callback(target.firstFragment);
+ _callback(target);
}
}
@@ -273,7 +273,7 @@
super.visitSuperConstructorInvocation(node);
var constructor = node.element?.baseElement;
if (constructor != null) {
- _callback(constructor.firstFragment);
+ _callback(constructor);
}
}
}
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index bb8ce64..eec1db3 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -788,6 +788,9 @@
}
@override
+ AnalysisContext get context => firstFragment.context;
+
+ @override
String get displayName {
var className = enclosingElement.name3 ?? '<null>';
var name = name3 ?? '<null>';
@@ -828,6 +831,9 @@
bool get isConst => firstFragment.isConst;
@override
+ bool get isConstantEvaluated => firstFragment.isConstantEvaluated;
+
+ @override
bool get isDefaultConstructor => firstFragment.isDefaultConstructor;
@override
@@ -845,6 +851,9 @@
}
@override
+ Source? get librarySource => firstFragment.librarySource;
+
+ @override
Element get nonSynthetic {
if (isSynthetic) {
return enclosingElement;
@@ -869,6 +878,9 @@
}
@override
+ Source? get source => firstFragment.source;
+
+ @override
ConstructorElementMixin2? get superConstructor2 {
_ensureReadResolution();
return _superConstructor;
@@ -897,8 +909,7 @@
}
}
-mixin ConstructorElementMixin
- implements ConstantEvaluationTarget, ExecutableElementOrMember {
+mixin ConstructorElementMixin implements ExecutableElementOrMember {
@override
ConstructorFragmentImpl get declaration;
@@ -916,19 +927,15 @@
bool get isGenerative;
@override
- LibraryElementImpl get library;
-
- @Deprecated('Use library instead')
- @override
- LibraryElementImpl get library2;
-
- @override
InterfaceTypeImpl get returnType;
}
/// Common implementation for methods defined in [ConstructorElement].
mixin ConstructorElementMixin2
- implements ExecutableElement2OrMember, ConstructorElement {
+ implements
+ ConstantEvaluationTarget,
+ ExecutableElement2OrMember,
+ ConstructorElement {
@override
ConstructorElementImpl get baseElement;
@@ -936,7 +943,16 @@
InterfaceElementImpl get enclosingElement;
@override
+ LibraryElementImpl get library;
+
+ @override
+ ConstructorElementMixin2? get redirectedConstructor2;
+
+ @override
InterfaceTypeImpl get returnType;
+
+ @override
+ ConstructorElementMixin2? get superConstructor2;
}
/// A concrete implementation of a [ConstructorFragment].
@@ -977,7 +993,7 @@
/// is a part of a cycle.
bool isCycleFree = true;
- @override
+ /// Return whether this constant is evaluated.
bool isConstantEvaluated = false;
/// Initialize a newly created constructor element to have the given [name]
@@ -1061,10 +1077,6 @@
@override
ElementKind get kind => ElementKind.CONSTRUCTOR;
- @Deprecated('Use library instead')
- @override
- LibraryElementImpl get library2 => library;
-
@override
int get nameLength {
var nameEnd = this.nameEnd;
@@ -1116,7 +1128,7 @@
if (!isConstantEvaluated) {
computeConstants(
declaredVariables: context.declaredVariables,
- constants: [this],
+ constants: [element],
featureSet: library.featureSet,
configuration: ConstantEvaluationConfiguration(),
);
@@ -2304,7 +2316,7 @@
}
@override
- LibraryElement get library {
+ LibraryElementImpl get library {
var firstFragment = this.firstFragment as ExecutableFragmentImpl;
return firstFragment.library;
}
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 0a7b7e7..2aabe30 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -432,7 +432,9 @@
/// A parameter element defined in a parameterized type where the values of the
/// type parameters are known.
class FieldFormalParameterMember extends ParameterMember
- implements FieldFormalParameterElementOrMember {
+ implements
+ FieldFormalParameterElementOrMember,
+ FieldFormalParameterElement {
factory FieldFormalParameterMember({
required FieldFormalParameterFragmentImpl declaration,
required MapSubstitution substitution,
@@ -455,6 +457,10 @@
}) : super._();
@override
+ FieldFormalParameterElementImpl get baseElement =>
+ super.baseElement as FieldFormalParameterElementImpl;
+
+ @override
FieldFormalParameterFragmentImpl get declaration {
return _declaration as FieldFormalParameterFragmentImpl;
}
@@ -470,6 +476,24 @@
}
@override
+ FieldElement? get field2 {
+ var field = baseElement.field2;
+ if (field == null) {
+ return null;
+ }
+
+ return FieldMember.from(field, substitution);
+ }
+
+ @override
+ FieldFormalParameterFragment get firstFragment => baseElement.firstFragment;
+
+ @override
+ List<FieldFormalParameterFragment> get fragments {
+ return baseElement.fragments;
+ }
+
+ @override
bool get hasDefaultValue => declaration.hasDefaultValue;
@override
@@ -1340,7 +1364,9 @@
}
class SuperFormalParameterMember extends ParameterMember
- implements SuperFormalParameterElementOrMember {
+ implements
+ SuperFormalParameterElementOrMember,
+ SuperFormalParameterElement {
factory SuperFormalParameterMember({
required SuperFormalParameterFragmentImpl declaration,
required MapSubstitution substitution,
@@ -1363,11 +1389,23 @@
}) : super._();
@override
+ SuperFormalParameterElementImpl get baseElement =>
+ super.baseElement as SuperFormalParameterElementImpl;
+
+ @override
SuperFormalParameterFragmentImpl get declaration {
return _declaration as SuperFormalParameterFragmentImpl;
}
@override
+ SuperFormalParameterFragment get firstFragment => baseElement.firstFragment;
+
+ @override
+ List<SuperFormalParameterFragment> get fragments {
+ return baseElement.fragments;
+ }
+
+ @override
bool get hasDefaultValue => declaration.hasDefaultValue;
@override
@@ -1383,6 +1421,7 @@
return ParameterMember.from2(superConstructorParameter, substitution);
}
+ @override
FormalParameterElement? get superConstructorParameter2 =>
superConstructorParameter;
}