Resynthesize DefaultFieldFormalParameterElementImpl.
R=brianwilkerson@google.com
Change-Id: I7b59a8c8df8812acc6a620ef57cfd2b5c8e24e92
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97681
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index d5b5c03..766ca7b 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2794,6 +2794,10 @@
DefaultFieldFormalParameterElementImpl(String name, int nameOffset)
: super(name, nameOffset);
+ DefaultFieldFormalParameterElementImpl.forLinkedNode(
+ ElementImpl enclosing, Reference reference, LinkedNode linkedNode)
+ : super.forLinkedNode(enclosing, reference, linkedNode);
+
/// Initialize a newly created parameter element to have the given [name].
DefaultFieldFormalParameterElementImpl.forNode(Identifier name)
: super.forNode(name);
@@ -4883,9 +4887,9 @@
@override
DartType get type {
if (linkedNode != null) {
- return _type ??= enclosingUnit.linkedContext.getType(
- linkedNode.fieldFormalParameter_type2,
- );
+ if (_type != null) return _type;
+ var context = enclosingUnit.linkedContext;
+ return _type = context.getFormalParameterType(linkedNode);
}
if (unlinkedParam != null &&
unlinkedParam.type == null &&
@@ -7894,14 +7898,7 @@
@override
bool get isFinal {
if (linkedNode != null) {
- if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
- var parameter = linkedNode.defaultFormalParameter_parameter;
- return parameter.simpleFormalParameter_keyword != 0;
- }
- if (linkedNode.kind == LinkedNodeKind.fieldFormalParameter) {
- return false;
- }
- return linkedNode.simpleFormalParameter_keyword != 0;
+ return enclosingUnit.linkedContext.isFinal(linkedNode);
}
if (unlinkedParam != null) {
return unlinkedParam.isFinal;
@@ -8014,15 +8011,8 @@
DartType get type {
if (linkedNode != null) {
if (_type != null) return _type;
- if (linkedNode.kind == LinkedNodeKind.defaultFormalParameter) {
- var parameter = linkedNode.defaultFormalParameter_parameter;
- return _type = enclosingUnit.linkedContext.getType(
- parameter.simpleFormalParameter_type2,
- );
- }
- return _type = enclosingUnit.linkedContext.getType(
- linkedNode.simpleFormalParameter_type2,
- );
+ var context = enclosingUnit.linkedContext;
+ return _type = context.getFormalParameterType(linkedNode);
}
_resynthesizeTypeAndParameters();
return super.type;
@@ -8147,11 +8137,19 @@
var name = context.getFormalParameterName(parameterNode);
var reference = containerRef.getChild(name);
reference.node = node;
- return DefaultParameterElementImpl.forLinkedNode(
- enclosing,
- reference,
- node,
- );
+ if (parameterNode.kind == LinkedNodeKind.fieldFormalParameter) {
+ return DefaultFieldFormalParameterElementImpl.forLinkedNode(
+ enclosing,
+ reference,
+ node,
+ );
+ } else {
+ return DefaultParameterElementImpl.forLinkedNode(
+ enclosing,
+ reference,
+ node,
+ );
+ }
} else {
var name = context.getFormalParameterName(node);
var reference = containerRef.getChild(name);
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index 1d50b06..7e2cdb7 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -212,6 +212,12 @@
bool isConst(LinkedNode node) {
var kind = node.kind;
+ if (kind == LinkedNodeKind.defaultFormalParameter) {
+ return isConst(node.defaultFormalParameter_parameter);
+ }
+ if (kind == LinkedNodeKind.simpleFormalParameter) {
+ return isConstKeyword(node.simpleFormalParameter_keyword);
+ }
if (kind == LinkedNodeKind.variableDeclaration) {
return node.variableDeclaration_declaration.isConst;
}
@@ -239,11 +245,34 @@
}
}
+ DartType getFormalParameterType(LinkedNode node) {
+ var kind = node.kind;
+ if (kind == LinkedNodeKind.defaultFormalParameter) {
+ return getFormalParameterType(node.defaultFormalParameter_parameter);
+ }
+ if (kind == LinkedNodeKind.fieldFormalParameter) {
+ return getType(node.fieldFormalParameter_type2);
+ }
+ if (kind == LinkedNodeKind.simpleFormalParameter) {
+ return getType(node.simpleFormalParameter_type2);
+ }
+ throw UnimplementedError('$kind');
+ }
+
bool isFinal(LinkedNode node) {
var kind = node.kind;
+ if (kind == LinkedNodeKind.defaultFormalParameter) {
+ return isFinal(node.defaultFormalParameter_parameter);
+ }
if (kind == LinkedNodeKind.enumConstantDeclaration) {
return false;
}
+ if (kind == LinkedNodeKind.fieldFormalParameter) {
+ return isFinalKeyword(node.fieldFormalParameter_keyword);
+ }
+ if (kind == LinkedNodeKind.simpleFormalParameter) {
+ return isFinalKeyword(node.simpleFormalParameter_keyword);
+ }
if (kind == LinkedNodeKind.variableDeclaration) {
return node.variableDeclaration_declaration.isFinal;
}
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 8f16bbd..5d7f97a 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -48,13 +48,16 @@
if (type == null) {
throw StateError('Field $name should have a type.');
}
- fields[name] = type;
+ fields[name] ??= type;
});
for (var member in members) {
if (member.kind == LinkedNodeKind.constructorDeclaration) {
for (var parameter in member.constructorDeclaration_parameters
.formalParameterList_parameters) {
+ if (parameter.kind == LinkedNodeKind.defaultFormalParameter) {
+ parameter = parameter.defaultFormalParameter_parameter;
+ }
if (parameter.kind == LinkedNodeKind.fieldFormalParameter &&
parameter.fieldFormalParameter_type2 == null) {
var name = unit.context.getSimpleName(
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index a5fa356..6a7e658 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -189,12 +189,6 @@
@override
@failingTest
- test_class_alias_with_forwarding_constructors() async {
- await super.test_class_alias_with_forwarding_constructors();
- }
-
- @override
- @failingTest
test_class_alias_with_forwarding_constructors_type_substitution() async {
await super
.test_class_alias_with_forwarding_constructors_type_substitution();
@@ -202,13 +196,6 @@
@override
@failingTest
- test_class_alias_with_forwarding_constructors_type_substitution_complex() async {
- await super
- .test_class_alias_with_forwarding_constructors_type_substitution_complex();
- }
-
- @override
- @failingTest
test_class_constructor_field_formal_functionTyped_noReturnType() async {
await super
.test_class_constructor_field_formal_functionTyped_noReturnType();
@@ -223,36 +210,6 @@
@override
@failingTest
- test_class_constructor_field_formal_multiple_matching_fields() async {
- await super.test_class_constructor_field_formal_multiple_matching_fields();
- }
-
- @override
- @failingTest
- test_class_constructor_fieldFormal_named_noDefault() async {
- await super.test_class_constructor_fieldFormal_named_noDefault();
- }
-
- @override
- @failingTest
- test_class_constructor_fieldFormal_named_withDefault() async {
- await super.test_class_constructor_fieldFormal_named_withDefault();
- }
-
- @override
- @failingTest
- test_class_constructor_fieldFormal_optional_noDefault() async {
- await super.test_class_constructor_fieldFormal_optional_noDefault();
- }
-
- @override
- @failingTest
- test_class_constructor_fieldFormal_optional_withDefault() async {
- await super.test_class_constructor_fieldFormal_optional_withDefault();
- }
-
- @override
- @failingTest
test_class_type_parameters_f_bound_complex() async {
await super.test_class_type_parameters_f_bound_complex();
}
@@ -454,19 +411,6 @@
@override
@failingTest
- test_const_parameterDefaultValue_initializingFormal_named() async {
- await super.test_const_parameterDefaultValue_initializingFormal_named();
- }
-
- @override
- @failingTest
- test_const_parameterDefaultValue_initializingFormal_positional() async {
- await super
- .test_const_parameterDefaultValue_initializingFormal_positional();
- }
-
- @override
- @failingTest
test_const_reference_staticField_imported_withPrefix() async {
await super.test_const_reference_staticField_imported_withPrefix();
}
@@ -1373,12 +1317,6 @@
@override
@failingTest
- test_parameterTypeNotInferred_initializingFormal() async {
- await super.test_parameterTypeNotInferred_initializingFormal();
- }
-
- @override
- @failingTest
test_parts() async {
await super.test_parts();
}