Version 3.9.0-290.0.dev Merge b7ba61acbc82b9867113b6ef2056a3127d071525 into dev
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index ac68e8e..280549c 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -110,7 +110,7 @@ // TODO(scheglov): Clean up the list of implicitly analyzed files. class AnalysisDriver { /// The version of data format, should be incremented on every format change. - static const int DATA_VERSION = 483; + static const int DATA_VERSION = 484; /// The number of exception contexts allowed to write. Once this field is /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart index 00bd9e7..37df019 100644 --- a/pkg/analyzer/lib/src/dart/ast/utilities.dart +++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -10,7 +10,6 @@ import 'package:analyzer/dart/ast/visitor.dart'; import 'package:analyzer/exception/exception.dart'; import 'package:analyzer/src/dart/ast/ast.dart'; -import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine; export 'package:analyzer/src/dart/ast/constant_evaluator.dart'; @@ -546,11 +545,7 @@ } else if (identical(node.defaultValue, _oldNode)) { node.defaultValue = _newNode as ExpressionImpl; var parameterElement = node.declaredFragment; - if (parameterElement is DefaultParameterFragmentImpl) { - parameterElement.constantInitializer = _newNode; - } else if (parameterElement is DefaultFieldFormalParameterElementImpl) { - parameterElement.constantInitializer = _newNode; - } + parameterElement?.constantInitializer = _newNode; return true; } return visitNode(node);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart index 5bb736a..40fa444 100644 --- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart +++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -93,24 +93,22 @@ var library = constant.library as LibraryElementImpl; if (constant is FormalParameterFragmentImpl) { - if (constant is ConstVariableFragment) { - var defaultValue = constant.constantInitializer; - if (defaultValue != null) { - var diagnosticListener = RecordingDiagnosticListener(); - var diagnosticReporter = DiagnosticReporter( - diagnosticListener, - constant.source!, - ); - var constantVisitor = ConstantVisitor( - this, - library, - diagnosticReporter, - ); - var dartConstant = constantVisitor.evaluateConstant(defaultValue); - constant.evaluationResult = dartConstant; - } else { - constant.evaluationResult = _nullObject(library); - } + var defaultValue = constant.constantInitializer; + if (defaultValue != null) { + var diagnosticListener = RecordingDiagnosticListener(); + var diagnosticReporter = DiagnosticReporter( + diagnosticListener, + constant.source!, + ); + var constantVisitor = ConstantVisitor( + this, + library, + diagnosticReporter, + ); + var dartConstant = constantVisitor.evaluateConstant(defaultValue); + constant.evaluationResult = dartConstant; + } else { + constant.evaluationResult = _nullObject(library); } } else if (constant is VariableFragmentImpl) { var constantInitializer = constant.constantInitializer;
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart index f902e30..83c201b 100644 --- a/pkg/analyzer/lib/src/dart/constant/utilities.dart +++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -198,10 +198,9 @@ !element.isStatic)) { constantsToCompute.add(element); // Fill error nodes. - if (element is ConstVariableFragment) { - var constElement = element as ConstVariableFragment; + if (element.constantInitializer case var constantInitializer?) { configuration.addErrorNode( - fromElement: constElement.constantInitializer, + fromElement: constantInitializer, fromAst: node.initializer, ); }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index 68a90ec..7e17af2 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -62,8 +62,8 @@ // TODO(fshcheglov): Remove after third_party/pkg/dartdoc stops using it. // https://github.com/dart-lang/dartdoc/issues/4066 -@Deprecated('Use ConstVariableFragment instead') -typedef ConstVariableElement = ConstVariableFragment; +@Deprecated('Use VariableFragmentImpl instead') +typedef ConstVariableElement = VariableFragmentImpl; abstract class AnnotatableElementImpl implements ElementImpl, Annotatable { @override @@ -481,24 +481,17 @@ var formalParameterElements = <FormalParameterElementImpl>[]; var superInvocationArguments = <ExpressionImpl>[]; for (var superFormalParameter in superConstructor.formalParameters) { - FormalParameterFragmentImpl formalParameterFragment; - if (superFormalParameter.firstFragment - case ConstVariableFragment constVariable) { - // TODO(scheglov): Maybe stop making this distinction - formalParameterFragment = DefaultParameterFragmentImpl( + var formalParameterFragment = FormalParameterFragmentImpl( nameOffset: -1, name2: superFormalParameter.name3, nameOffset2: null, parameterKind: superFormalParameter.parameterKind, - )..constantInitializer = constVariable.constantInitializer; - } else { - formalParameterFragment = FormalParameterFragmentImpl( - nameOffset: -1, - name2: superFormalParameter.name3, - nameOffset2: null, - parameterKind: superFormalParameter.parameterKind, - ); - } + ) + ..constantInitializer = + superFormalParameter + .baseElement + .firstFragment + .constantInitializer; formalParameterFragment.isConst = superFormalParameter.isConst; formalParameterFragment.isFinal = superFormalParameter.isFinal; @@ -734,8 +727,7 @@ /// A `LocalVariableElement` for a local 'const' variable that has an /// initializer. -class ConstLocalVariableFragmentImpl extends LocalVariableFragmentImpl - with ConstVariableFragment { +class ConstLocalVariableFragmentImpl extends LocalVariableFragmentImpl { /// Initialize a newly created local variable element to have the given [name] /// and [offset]. ConstLocalVariableFragmentImpl({ @@ -1139,179 +1131,6 @@ } } -/// Mixin used by elements that represent constant variables and have -/// initializers. -/// -/// Note that in correct Dart code, all constant variables must have -/// initializers. However, analyzer also needs to handle incorrect Dart code, -/// in which case there might be some constant variables that lack initializers. -/// This interface is only used for constant variables that have initializers. -/// -/// This class is not intended to be part of the public API for analyzer. -mixin ConstVariableFragment implements FragmentImpl, ConstantEvaluationTarget { - /// If this element represents a constant variable, and it has an initializer, - /// a copy of the initializer for the constant. Otherwise `null`. - /// - /// Note that in correct Dart code, all constant variables must have - /// initializers. However, analyzer also needs to handle incorrect Dart code, - /// in which case there might be some constant variables that lack - /// initializers. - ExpressionImpl? constantInitializer; - - Constant? _evaluationResult; - - Constant? get evaluationResult => _evaluationResult; - - set evaluationResult(Constant? evaluationResult) { - _evaluationResult = evaluationResult; - } - - @override - bool get isConstantEvaluated => _evaluationResult != null; - - /// Return a representation of the value of this variable, forcing the value - /// to be computed if it had not previously been computed, or `null` if either - /// this variable was not declared with the 'const' modifier or if the value - /// of this variable could not be computed because of errors. - DartObject? computeConstantValue() { - if (evaluationResult == null) { - var library = this.library; - // TODO(scheglov): https://github.com/dart-lang/sdk/issues/47915 - if (library == null) { - throw StateError( - '[library: null][this: ($runtimeType) $this]' - '[enclosingElement: $enclosingElement3]', - ); - } - computeConstants( - declaredVariables: context.declaredVariables, - constants: [this], - featureSet: library.featureSet, - configuration: ConstantEvaluationConfiguration(), - ); - } - - if (evaluationResult case DartObjectImpl result) { - return result; - } - return null; - } -} - -/// A [FieldFormalParameterFragmentImpl] for parameters that have an initializer. -class DefaultFieldFormalParameterElementImpl - extends FieldFormalParameterFragmentImpl - with ConstVariableFragment { - /// Initialize a newly created parameter element to have the given [name] and - /// [nameOffset]. - DefaultFieldFormalParameterElementImpl({ - required super.nameOffset, - required super.name2, - required super.nameOffset2, - required super.parameterKind, - }); - - @override - String? get defaultValueCode { - return constantInitializer?.toSource(); - } -} - -/// A [FormalParameterFragmentImpl] for parameters that have an initializer. -class DefaultParameterFragmentImpl extends FormalParameterFragmentImpl - with ConstVariableFragment { - /// Initialize a newly created parameter element to have the given [name] and - /// [nameOffset]. - DefaultParameterFragmentImpl({ - required super.nameOffset, - required super.name2, - required super.nameOffset2, - required super.parameterKind, - }); - - @override - String? get defaultValueCode { - return constantInitializer?.toSource(); - } -} - -class DefaultSuperFormalParameterElementImpl - extends SuperFormalParameterFragmentImpl - with ConstVariableFragment { - /// Initialize a newly created parameter element to have the given [name] and - /// [nameOffset]. - DefaultSuperFormalParameterElementImpl({ - required super.nameOffset, - required super.name2, - required super.nameOffset2, - required super.parameterKind, - }); - - @override - String? get defaultValueCode { - if (isRequired) { - return null; - } - - var constantInitializer = this.constantInitializer; - if (constantInitializer != null) { - return constantInitializer.toSource(); - } - - if (_superConstructorParameterDefaultValue != null) { - return superConstructorParameter?.defaultValueCode; - } - - return null; - } - - @override - Constant? get evaluationResult { - if (constantInitializer != null) { - return super.evaluationResult; - } - - var superConstructorParameter = this.superConstructorParameter?.baseElement; - if (superConstructorParameter is FormalParameterElementImpl) { - return superConstructorParameter.firstFragment.evaluationResult; - } - - return null; - } - - DartObject? get _superConstructorParameterDefaultValue { - var superDefault = superConstructorParameter?.computeConstantValue(); - if (superDefault == null) { - return null; - } - - // TODO(scheglov): eliminate this cast - superDefault as DartObjectImpl; - var superDefaultType = superDefault.type; - - var typeSystem = library?.typeSystem; - if (typeSystem == null) { - return null; - } - - var requiredType = type.extensionTypeErasure; - if (typeSystem.isSubtypeOf(superDefaultType, requiredType)) { - return superDefault; - } - - return null; - } - - @override - DartObject? computeConstantValue() { - if (constantInitializer != null) { - return super.computeConstantValue(); - } - - return _superConstructorParameterDefaultValue; - } -} - /// This mixin is used to set up loading class members from summaries only when /// they are requested. The summary reader uses [deferReadMembers], and /// getters invoke [ensureReadMembers]. @@ -3021,7 +2840,6 @@ } class FieldFragmentImpl extends PropertyInducingFragmentImpl - with ConstVariableFragment implements FieldFragment { /// True if this field inherits from a covariant parameter. This happens /// when it overrides a field in a supertype that is covariant. @@ -3424,7 +3242,9 @@ FormalParameterFragmentImpl get declaration => this; @override - String? get defaultValueCode => null; + String? get defaultValueCode { + return constantInitializer?.toSource(); + } @override FormalParameterElementImpl get element { @@ -8994,9 +8814,6 @@ } @override - bool get isConstantEvaluated => true; - - @override bool get isLate { return hasModifier(Modifier.LATE); } @@ -9283,9 +9100,41 @@ }); @override + String? get defaultValueCode { + if (isRequired) { + return null; + } + + var constantInitializer = this.constantInitializer; + if (constantInitializer != null) { + return constantInitializer.toSource(); + } + + if (_superConstructorParameterDefaultValue != null) { + return superConstructorParameter?.defaultValueCode; + } + + return null; + } + + @override SuperFormalParameterElementImpl get element => super.element as SuperFormalParameterElementImpl; + @override + Constant? get evaluationResult { + if (constantInitializer != null) { + return super.evaluationResult; + } + + var superConstructorParameter = this.superConstructorParameter?.baseElement; + if (superConstructorParameter is FormalParameterElementImpl) { + return superConstructorParameter.firstFragment.evaluationResult; + } + + return null; + } + /// Super parameters are visible only in the initializer list scope, /// and introduce final variables. @override @@ -9332,6 +9181,38 @@ return null; } + DartObject? get _superConstructorParameterDefaultValue { + var superDefault = superConstructorParameter?.computeConstantValue(); + if (superDefault == null) { + return null; + } + + // TODO(scheglov): eliminate this cast + superDefault as DartObjectImpl; + var superDefaultType = superDefault.type; + + var typeSystem = library?.typeSystem; + if (typeSystem == null) { + return null; + } + + var requiredType = type.extensionTypeErasure; + if (typeSystem.isSubtypeOf(superDefaultType, requiredType)) { + return superDefault; + } + + return null; + } + + @override + DartObject? computeConstantValue() { + if (constantInitializer != null) { + return super.computeConstantValue(); + } + + return _superConstructorParameterDefaultValue; + } + /// Return the index of this super-formal parameter among other super-formals. int indexIn(ConstructorFragmentImpl enclosingElement) { return enclosingElement.parameters @@ -9549,7 +9430,6 @@ } class TopLevelVariableFragmentImpl extends PropertyInducingFragmentImpl - with ConstVariableFragment implements TopLevelVariableFragment { @override late TopLevelVariableElementImpl element; @@ -10390,14 +10270,11 @@ implements VariableElementOrMember, AnnotatableFragmentImpl, + ConstantEvaluationTarget, VariableFragment { /// The type of this variable. TypeImpl? _type; - /// Initialize a newly created variable element to have the given [name] and - /// [offset]. - VariableFragmentImpl({required super.nameOffset}); - /// If this element represents a constant variable, and it has an initializer, /// a copy of the initializer for the constant. Otherwise `null`. /// @@ -10405,7 +10282,17 @@ /// initializers. However, analyzer also needs to handle incorrect Dart code, /// in which case there might be some constant variables that lack /// initializers. - ExpressionImpl? get constantInitializer => null; + ExpressionImpl? constantInitializer; + + /// The result of evaluating [constantInitializer]. + /// + /// Is `null` if [constantInitializer] is `null`, or if the value could not + /// be computed because of errors. + Constant? evaluationResult; + + /// Initialize a newly created variable element to have the given [name] and + /// [offset]. + VariableFragmentImpl({required super.nameOffset}); @override VariableFragmentImpl get declaration => this; @@ -10416,18 +10303,6 @@ @override VariableElementImpl get element; - /// Return the result of evaluating this variable's initializer as a - /// compile-time constant expression, or `null` if this variable is not a - /// 'const' variable, if it does not have an initializer, or if the - /// compilation unit containing the variable has not been resolved. - Constant? get evaluationResult => null; - - /// Set the result of evaluating this variable's initializer as a compile-time - /// constant expression to the given [result]. - set evaluationResult(Constant? result) { - throw StateError("Invalid attempt to set a compile-time constant result"); - } - @override bool get hasImplicitType { return hasModifier(Modifier.IMPLICIT_TYPE); @@ -10459,7 +10334,7 @@ } @override - bool get isConstantEvaluated => true; + bool get isConstantEvaluated => evaluationResult != null; /// Set whether this variable is external. set isExternal(bool isExternal) { @@ -10503,8 +10378,31 @@ builder.writeVariableElement(this); } + /// Return a representation of the value of this variable, forcing the value + /// to be computed if it had not previously been computed, or `null` if either + /// this variable was not declared with the 'const' modifier or if the value + /// of this variable could not be computed because of errors. @override - DartObject? computeConstantValue() => null; + DartObject? computeConstantValue() { + if (evaluationResult == null) { + var library = this.library; + // TODO(scheglov): https://github.com/dart-lang/sdk/issues/47915 + if (library == null) { + return null; + } + computeConstants( + declaredVariables: context.declaredVariables, + constants: [this], + featureSet: library.featureSet, + configuration: ConstantEvaluationConfiguration(), + ); + } + + if (evaluationResult case DartObjectImpl result) { + return result; + } + return null; + } } mixin WrappedElementMixin implements ElementImpl {
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart index a34a69f..ffc49aa 100644 --- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart +++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -444,7 +444,7 @@ var nameOffset2 = nameToken?.offset; if (node.parameter is FieldFormalParameter) { // Only for recovery, this should not happen in valid code. - fragment = DefaultFieldFormalParameterElementImpl( + fragment = FieldFormalParameterFragmentImpl( nameOffset: nameOffset2 ?? -1, parameterKind: node.kind, name2: name2, @@ -452,14 +452,14 @@ )..constantInitializer = node.defaultValue; } else if (node.parameter is SuperFormalParameter) { // Only for recovery, this should not happen in valid code. - fragment = DefaultSuperFormalParameterElementImpl( + fragment = SuperFormalParameterFragmentImpl( nameOffset: nameOffset2 ?? -1, parameterKind: node.kind, name2: name2, nameOffset2: nameOffset2, )..constantInitializer = node.defaultValue; } else { - fragment = DefaultParameterFragmentImpl( + fragment = FormalParameterFragmentImpl( nameOffset: nameOffset2 ?? -1, parameterKind: node.kind, name2: name2,
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index 6db82dd..85d8787 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -2392,7 +2392,7 @@ popRewrite(); } - if (fragment is DefaultParameterFragmentImpl && node.isOfLocalFunction) { + if (node.isOfLocalFunction) { fragment.constantInitializer = defaultValue; } }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart index 9780536..62fdeaf 100644 --- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart +++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -450,7 +450,7 @@ ); var nonDefaultElement = parameter.declaredFragment!; - var fragment = DefaultParameterFragmentImpl( + var fragment = FormalParameterFragmentImpl( nameOffset: nonDefaultElement.nameOffset, name2: nonDefaultElement.name2, nameOffset2: nonDefaultElement.nameOffset2,
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart index 4c15f88..3abe553 100644 --- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart +++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -736,13 +736,7 @@ _readTypeParameters2(unitElement, reader, parameter.typeParameters); _readFormalParameters2(unitElement, reader, parameter.parameters); parameter.type = reader.readRequiredType(); - if (parameter is ConstVariableFragment) { - var defaultParameter = parameter as ConstVariableFragment; - var initializer = reader.readOptionalExpression(); - if (initializer != null) { - defaultParameter.constantInitializer = initializer; - } - } + parameter.constantInitializer = reader.readOptionalExpression(); if (parameter is FieldFormalParameterFragmentImpl) { // TODO(scheglov): use element parameter.field = @@ -1050,7 +1044,6 @@ return _reader.readTypedList(() { var id = _readFragmentId(); var fragmentName = _readFragmentName(); - var isDefault = _reader.readBool(); var isInitializingFormal = _reader.readBool(); var isSuperFormal = _reader.readBool(); @@ -1058,52 +1051,27 @@ var kind = ResolutionReader._formalParameterKind(kindIndex); FormalParameterFragmentImpl element; - if (!isDefault) { - if (isInitializingFormal) { - element = FieldFormalParameterFragmentImpl( - nameOffset: -1, - name2: fragmentName, - nameOffset2: null, - parameterKind: kind, - ); - } else if (isSuperFormal) { - element = SuperFormalParameterFragmentImpl( - nameOffset: -1, - name2: fragmentName, - nameOffset2: null, - parameterKind: kind, - ); - } else { - element = FormalParameterFragmentImpl( - nameOffset: -1, - name2: fragmentName, - nameOffset2: null, - parameterKind: kind, - ); - } + if (isInitializingFormal) { + element = FieldFormalParameterFragmentImpl( + nameOffset: -1, + name2: fragmentName, + nameOffset2: null, + parameterKind: kind, + ); + } else if (isSuperFormal) { + element = SuperFormalParameterFragmentImpl( + nameOffset: -1, + name2: fragmentName, + nameOffset2: null, + parameterKind: kind, + ); } else { - if (isInitializingFormal) { - element = DefaultFieldFormalParameterElementImpl( - nameOffset: -1, - name2: fragmentName, - nameOffset2: null, - parameterKind: kind, - ); - } else if (isSuperFormal) { - element = DefaultSuperFormalParameterElementImpl( - nameOffset: -1, - name2: fragmentName, - nameOffset2: null, - parameterKind: kind, - ); - } else { - element = DefaultParameterFragmentImpl( - nameOffset: -1, - name2: fragmentName, - nameOffset2: null, - parameterKind: kind, - ); - } + element = FormalParameterFragmentImpl( + nameOffset: -1, + name2: fragmentName, + nameOffset2: null, + parameterKind: kind, + ); } idFragmentMap[id] = element; ParameterElementFlags.read(_reader, element); @@ -1801,55 +1769,36 @@ return readTypedList(() { var kindIndex = _reader.readByte(); var kind = _formalParameterKind(kindIndex); - var isDefault = _reader.readBool(); var hasImplicitType = _reader.readBool(); var isInitializingFormal = _reader.readBool(); var typeParameters = _readTypeParameters(unitElement); var type = readRequiredType(); var name = _readFragmentName(); - if (!isDefault) { - FormalParameterFragmentImpl element; - if (isInitializingFormal) { - element = FieldFormalParameterFragmentImpl( - nameOffset: -1, - name2: name, - nameOffset2: null, - parameterKind: kind, - )..type = type; - } else { - element = FormalParameterFragmentImpl( - nameOffset: -1, - name2: name, - nameOffset2: null, - parameterKind: kind, - )..type = type; - } - element.hasImplicitType = hasImplicitType; - element.typeParameters = typeParameters; - element.parameters = _readFormalParameters(unitElement); - // TODO(scheglov): reuse for formal parameters - _localElements.length -= typeParameters.length; - if (unitElement != null) { - element.metadata = _readMetadata(unitElement: unitElement); - } - return element; - } else { - var element = DefaultParameterFragmentImpl( + FormalParameterFragmentImpl element; + if (isInitializingFormal) { + element = FieldFormalParameterFragmentImpl( nameOffset: -1, name2: name, nameOffset2: null, parameterKind: kind, )..type = type; - element.hasImplicitType = hasImplicitType; - element.typeParameters = typeParameters; - element.parameters = _readFormalParameters(unitElement); - // TODO(scheglov): reuse for formal parameters - _localElements.length -= typeParameters.length; - if (unitElement != null) { - element.metadata = _readMetadata(unitElement: unitElement); - } - return element; + } else { + element = FormalParameterFragmentImpl( + nameOffset: -1, + name2: name, + nameOffset2: null, + parameterKind: kind, + )..type = type; } + element.hasImplicitType = hasImplicitType; + element.typeParameters = typeParameters; + element.parameters = _readFormalParameters(unitElement); + // TODO(scheglov): reuse for formal parameters + _localElements.length -= typeParameters.length; + if (unitElement != null) { + element.metadata = _readMetadata(unitElement: unitElement); + } + return element; }); }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart index 145df80..2efdfa1 100644 --- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart +++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -629,7 +629,6 @@ void _writeParameterElement(FormalParameterFragmentImpl element) { _writeFragmentId(element); _writeFragmentName(element); - _sink.writeBool(element is ConstVariableFragment); _sink.writeBool(element.isInitializingFormal); _sink.writeBool(element.isSuperFormal); _sink._writeFormalParameterKind(element); @@ -640,11 +639,8 @@ _writeTypeParameters(element.typeParameters, () { _writeList(element.parameters, _writeParameterElement); _resolutionSink.writeType(element.type); + _resolutionSink._writeOptionalNode(element.constantInitializer); - if (element is ConstVariableFragment) { - var constElement = element as ConstVariableFragment; - _resolutionSink._writeOptionalNode(constElement.constantInitializer); - } if (element is FieldFormalParameterFragmentImpl) { // TODO(scheglov): formal parameter types? Anything else? // _resolutionSink.writeFragmentOrMember(element.field); @@ -1002,7 +998,6 @@ writeUInt30(parameters.length); for (var parameter in parameters) { _writeFormalParameterKind(parameter); - writeBool(parameter is ConstVariableFragment); writeBool(parameter.hasImplicitType); writeBool(parameter.isInitializingFormal); _writeTypeParameters(parameter.typeParameters, () {
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart index 149f8ce..6980385 100644 --- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart +++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -41,11 +41,12 @@ FormalParameterFragmentImpl element, ) { var node = _linker.getLinkingNode(element); - if (node is DefaultFormalParameterImpl && node.defaultValue != null) { - return node; - } else { - return null; + if (node?.parent case DefaultFormalParameterImpl defaultParent) { + if (defaultParent.defaultValue != null) { + return defaultParent; + } } + return null; } void _executable(_Context context, ExecutableFragmentImpl element) {
diff --git a/pkg/analyzer/lib/src/summary2/detach_nodes.dart b/pkg/analyzer/lib/src/summary2/detach_nodes.dart index 7652999..9114ebb 100644 --- a/pkg/analyzer/lib/src/summary2/detach_nodes.dart +++ b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
@@ -108,19 +108,15 @@ void _detachConstVariable(Object element) { if (element is VariableElementImpl) { for (var fragment in element.fragments) { - if (fragment case ConstVariableFragment fragment) { - var initializer = fragment.constantInitializer; - if (initializer is ExpressionImpl) { - _detachNode(initializer); + fragment as VariableFragmentImpl; + var initializer = fragment.constantInitializer; + if (initializer is ExpressionImpl) { + _detachNode(initializer); - initializer = replaceNotSerializableNode(initializer); - fragment.constantInitializer = initializer; + initializer = replaceNotSerializableNode(initializer); + fragment.constantInitializer = initializer; - ConstantContextForExpressionImpl( - fragment as VariableFragmentImpl, - initializer, - ); - } + ConstantContextForExpressionImpl(fragment, initializer); } } element.resetConstantInitializer();
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart index 4c86d41..6d954c5 100644 --- a/pkg/analyzer/lib/src/summary2/element_builder.dart +++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -1320,27 +1320,17 @@ var name2 = _getFragmentName(nameToken); var nameOffset2 = nameToken.offset.nullIfNegative; - FormalParameterFragmentImpl fragment; - var parent = node.parent; - if (parent is DefaultFormalParameterImpl) { - fragment = DefaultFieldFormalParameterElementImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - )..constantInitializer = parent.defaultValue; - _linker.elementNodes[fragment] = parent; - var refName = node.isNamed ? name2 : null; - _enclosingContext.addParameter(refName, fragment); - } else { - fragment = FieldFormalParameterFragmentImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - ); - _linker.elementNodes[fragment] = node; - _enclosingContext.addParameter(null, fragment); + var fragment = FieldFormalParameterFragmentImpl( + nameOffset: nameOffset2 ?? -1, + name2: name2, + nameOffset2: nameOffset2, + parameterKind: node.kind, + ); + _linker.elementNodes[fragment] = node; + _enclosingContext.addParameter(null, fragment); + + if (node.parent case DefaultFormalParameterImpl parent) { + fragment.constantInitializer = parent.defaultValue; } fragment.nameOffset2 = _getFragmentNameOffset(nameToken); @@ -1497,25 +1487,19 @@ var name2 = _getFragmentName(nameToken); var nameOffset2 = nameToken.offset.nullIfNegative; - FormalParameterFragmentImpl fragment; - var parent = node.parent; - if (parent is DefaultFormalParameterImpl) { - fragment = DefaultParameterFragmentImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - )..constantInitializer = parent.defaultValue; - _linker.elementNodes[fragment] = parent; - } else { - fragment = FormalParameterFragmentImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - ); - _linker.elementNodes[fragment] = node; + var fragment = FormalParameterFragmentImpl( + nameOffset: nameOffset2 ?? -1, + name2: name2, + nameOffset2: nameOffset2, + parameterKind: node.kind, + ); + _linker.elementNodes[fragment] = node; + _enclosingContext.addParameter(null, fragment); + + if (node.parent case DefaultFormalParameterImpl parent) { + fragment.constantInitializer = parent.defaultValue; } + fragment.nameOffset2 = _getFragmentNameOffset(nameToken); fragment.isExplicitlyCovariant = node.covariantKeyword != null; fragment.isFinal = node.isFinal; @@ -1523,9 +1507,6 @@ _setCodeRange(fragment, node); node.declaredFragment = fragment; - _linker.elementNodes[fragment] = node; - var refName = node.isNamed ? name2 : null; - _enclosingContext.addParameter(refName, fragment); var holder = _EnclosingContext( instanceElementBuilder: null, @@ -1816,28 +1797,19 @@ var name2 = _getFragmentName(nameToken); var nameOffset2 = nameToken?.offset; - FormalParameterFragmentImpl fragment; - var parent = node.parent; - if (parent is DefaultFormalParameterImpl && - _enclosingContext.hasDefaultFormalParameters) { - fragment = DefaultParameterFragmentImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - )..constantInitializer = parent.defaultValue; - _linker.elementNodes[fragment] = parent; - var refName = node.isNamed ? name2 : null; - _enclosingContext.addParameter(refName, fragment); - } else { - fragment = FormalParameterFragmentImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - ); - _linker.elementNodes[fragment] = node; - _enclosingContext.addParameter(null, fragment); + var fragment = FormalParameterFragmentImpl( + nameOffset: nameOffset2 ?? -1, + name2: name2, + nameOffset2: nameOffset2, + parameterKind: node.kind, + ); + _linker.elementNodes[fragment] = node; + _enclosingContext.addParameter(null, fragment); + + if (_enclosingContext.hasDefaultFormalParameters) { + if (node.parent case DefaultFormalParameterImpl parent) { + fragment.constantInitializer = parent.defaultValue; + } } fragment.nameOffset2 = _getFragmentNameOffset(nameToken); @@ -1858,28 +1830,19 @@ var name2 = _getFragmentName(nameToken); var nameOffset2 = nameToken.offset.nullIfNegative; - SuperFormalParameterFragmentImpl fragment; - var parent = node.parent; - if (parent is DefaultFormalParameterImpl) { - fragment = DefaultSuperFormalParameterElementImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - )..constantInitializer = parent.defaultValue; - _linker.elementNodes[fragment] = parent; - var refName = node.isNamed ? name2 : null; - _enclosingContext.addParameter(refName, fragment); - } else { - fragment = SuperFormalParameterFragmentImpl( - nameOffset: nameOffset2 ?? -1, - name2: name2, - nameOffset2: nameOffset2, - parameterKind: node.kind, - ); - _linker.elementNodes[fragment] = node; - _enclosingContext.addParameter(null, fragment); + var fragment = SuperFormalParameterFragmentImpl( + nameOffset: nameOffset2 ?? -1, + name2: name2, + nameOffset2: nameOffset2, + parameterKind: node.kind, + ); + _linker.elementNodes[fragment] = node; + _enclosingContext.addParameter(null, fragment); + + if (node.parent case DefaultFormalParameterImpl parent) { + fragment.constantInitializer = parent.defaultValue; } + fragment.nameOffset2 = _getFragmentNameOffset(nameToken); fragment.hasImplicitType = node.type == null && node.parameters == null; fragment.metadata = _buildMetadata(node.metadata); @@ -2205,8 +2168,8 @@ /// Not all optional formal parameters can have default values. /// For example, formal parameters of methods can, but formal parameters - /// of function types - not. This flag specifies if we should create - /// [FormalParameterFragmentImpl]s or [DefaultParameterFragmentImpl]s. + /// of function types - not. This flag specifies if we should store + /// the default value into [FormalParameterFragmentImpl]s. final bool hasDefaultFormalParameters; _EnclosingContext({
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart index 392a35b..647580a 100644 --- a/pkg/analyzer/lib/src/summary2/informative_data.dart +++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -1935,7 +1935,7 @@ void applyToConstantInitializer(FragmentImpl element) { if (element is FieldFragmentImpl && element.isEnumConstant) { _applyToEnumConstantInitializer(element); - } else if (element is ConstVariableFragment) { + } else if (element is VariableFragmentImpl) { element.constantInitializer?.accept(this); } }
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart index f62d727..046494f 100644 --- a/pkg/analyzer/lib/src/summary2/library_builder.dart +++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -84,7 +84,7 @@ int _nextUnnamedId = 0; /// The fields that were speculatively created as [FieldFragmentImpl], - /// but we want to clear [ConstVariableFragment.constantInitializer] for it + /// but we want to clear [VariableFragmentImpl.constantInitializer] for it /// if the class will not end up with a `const` constructor. We don't know /// at the time when we create them, because of future augmentations. final Set<FieldFragmentImpl> finalInstanceFields = Set.identity();
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart index fcc3b40..4e5bfcd 100644 --- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart +++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -65,9 +65,7 @@ return; } - var constElement = element.ifTypeOrNull<ConstVariableFragment>(); - if (constElement == null) return; - if (constElement.constantInitializer == null) return; + if (element.constantInitializer == null) return; var variable = linker.getLinkingNode(element); if (variable is! VariableDeclarationImpl) return; @@ -86,7 +84,7 @@ ); // We could have rewritten the initializer. - constElement.constantInitializer = variable.initializer; + element.constantInitializer = variable.initializer; } }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart index 84e6c7c..b5f150e 100644 --- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart +++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -1143,7 +1143,7 @@ } FormalParameterElement _namedParameter(String name, TypeImpl type) { - var fragment = DefaultParameterFragmentImpl( + var fragment = FormalParameterFragmentImpl( nameOffset: 0, name2: name, nameOffset2: 0,
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart index 3832d89..113869f 100644 --- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart +++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -5406,7 +5406,7 @@ return result; } - DartObjectImpl? _evaluationResult(ConstVariableFragment element) { + DartObjectImpl? _evaluationResult(VariableFragmentImpl element) { var evaluationResult = element.evaluationResult; switch (evaluationResult) { case null: @@ -5420,19 +5420,19 @@ DartObjectImpl? _field(String variableName) { var element = findElement2.field(variableName); - var constFragment = element.firstFragment as ConstVariableFragment; + var constFragment = element.firstFragment as VariableFragmentImpl; return _evaluationResult(constFragment); } DartObjectImpl? _localVar(String variableName) { var element = findElement2.localVar(variableName); - var constFragment = element.firstFragment as ConstVariableFragment; + var constFragment = element.firstFragment as VariableFragmentImpl; return _evaluationResult(constFragment); } DartObjectImpl? _topLevelVar(String variableName) { var element = findElement2.topVar(variableName); - var constFragment = element.firstFragment as ConstVariableFragment; + var constFragment = element.firstFragment as VariableFragmentImpl; return _evaluationResult(constFragment); } }
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart index 8d716a6..f59b134 100644 --- a/pkg/analyzer/test/src/dart/resolution/constant_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -41,7 +41,7 @@ var aLib = findElement2.import('package:test/a.dart').importedLibrary2!; var aConstructor = aLib.getClass2('A')!.constructors.single; var p = aConstructor.formalParameters.single; - var pf = p.firstFragment as DefaultParameterFragmentImpl; + var pf = p.firstFragment as FormalParameterFragmentImpl; // To evaluate `const A()` we have to evaluate `{int p}`. // Even if its value is `null`. @@ -281,7 +281,7 @@ assertErrorsInResolvedUnit(result, []); var bElement = findElement2.field('b'); - var bFragment = bElement.firstFragment as ConstVariableFragment; + var bFragment = bElement.firstFragment as VariableFragmentImpl; var bValue = bFragment.evaluationResult as DartObjectImpl; var superFields = bValue.getField(GenericState.SUPERCLASS_FIELD); expect(superFields!.getField('f1')!.toBoolValue(), false);
diff --git a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart index f19c1da..28ec5ff 100644 --- a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart +++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -277,7 +277,7 @@ '''); var vg = findNode.simple('a;').element as PropertyAccessorElement; - var v = vg.variable3!.firstFragment as ConstVariableFragment; + var v = vg.variable3!.firstFragment as VariableFragmentImpl; var creation = v.constantInitializer as InstanceCreationExpression; return creation;
diff --git a/pkg/analyzer/test/src/summary/elements/metadata_test.dart b/pkg/analyzer/test/src/summary/elements/metadata_test.dart index c6a0491..38150e4 100644 --- a/pkg/analyzer/test/src/summary/elements/metadata_test.dart +++ b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
@@ -2358,7 +2358,7 @@ initializer: expression_1 NullLiteral literal: null @28 - staticType: null + staticType: Null topLevelVariables const hasInitializer a reference: <testLibrary>::@topLevelVariable::a
diff --git a/tools/VERSION b/tools/VERSION index 38730c8..46d096a 100644 --- a/tools/VERSION +++ b/tools/VERSION
@@ -27,5 +27,5 @@ MAJOR 3 MINOR 9 PATCH 0 -PRERELEASE 289 +PRERELEASE 290 PRERELEASE_PATCH 0