Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ef3156b

Browse files
author
Dart CI
committed
Version 2.17.0-56.0.dev
Merge commit '1708703d159b97d950b152a698afb53317cf2f78' into 'dev'
2 parents e388130 + 1708703 commit ef3156b

File tree

19 files changed

+845
-274
lines changed

19 files changed

+845
-274
lines changed

pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart

Lines changed: 330 additions & 203 deletions
Large diffs are not rendered by default.

pkg/analysis_server/test/analysis/get_hover_test.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,54 @@ class A {
933933
expect(hover.elementKind, 'parameter');
934934
}
935935

936+
Future<void>
937+
test_parameter_ofConstructor_optionalPositional_super_defaultValue_explicit() async {
938+
addTestFile('''
939+
class A {
940+
A([int a = 1]);
941+
}
942+
class B extends A {
943+
B([super.a = 2]);
944+
}
945+
''');
946+
var hover = await prepareHover('a = 2]');
947+
// element
948+
expect(hover.elementDescription, '[int a = 2]');
949+
expect(hover.elementKind, 'parameter');
950+
}
951+
952+
Future<void>
953+
test_parameter_ofConstructor_optionalPositional_super_defaultValue_inherited() async {
954+
addTestFile('''
955+
class A {
956+
A([int a = 1]);
957+
}
958+
class B extends A {
959+
B([super.a]);
960+
}
961+
''');
962+
var hover = await prepareHover('a]');
963+
// element
964+
expect(hover.elementDescription, '[int a = 1]');
965+
expect(hover.elementKind, 'parameter');
966+
}
967+
968+
Future<void>
969+
test_parameter_ofConstructor_optionalPositional_super_defaultValue_inherited2() async {
970+
addTestFile('''
971+
class A {
972+
A([num a = 1.2]);
973+
}
974+
class B extends A{
975+
B([int super.a]);
976+
}
977+
''');
978+
var hover = await prepareHover('a]');
979+
// element
980+
expect(hover.elementDescription, '[int a]');
981+
expect(hover.elementKind, 'parameter');
982+
}
983+
936984
Future<void> test_parameter_reference_fieldFormal() async {
937985
addTestFile('''
938986
class A {

pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class C<S, T> {
3333
void C() {}
3434
}
3535
''');
36-
setPackageData(_add(0, components: ['C', 'C']));
36+
setPackageData(_add(0, components: ['C']));
3737
await resolveTestCode('''
3838
import '$importUri';
3939

pkg/analysis_server/test/src/services/correction/fix/data_driven/element_matcher_test.dart

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ class ElementMatcherComponentAndKindTest extends AbstractElementMatcherTest {
5454
/// The kinds that are expected where an invocation is allowed.
5555
static List<ElementKind> invocationKinds = [
5656
ElementKind.classKind,
57+
ElementKind.constructorKind,
5758
ElementKind.extensionKind,
5859
ElementKind.functionKind,
60+
ElementKind.getterKind,
5961
ElementKind.methodKind,
6062
];
6163

@@ -109,7 +111,7 @@ class C {
109111
}
110112
}
111113
''');
112-
_assertMatcher('g;', expectedComponents: ['g', 'C']);
114+
_assertMatcher('g;', expectedComponents: ['g']);
113115
}
114116

115117
Future<void> test_getter_withoutTarget_unresolved() async {
@@ -149,17 +151,7 @@ void f() {
149151
s.length;
150152
}
151153
''');
152-
// TODO(brianwilkerson) Several of these kinds don't seem to be appropriate,
153-
// so we might want to narrow down the list.
154-
_assertMatcher('s', expectedComponents: [
155-
's'
156-
], expectedKinds: [
157-
ElementKind.classKind,
158-
ElementKind.enumKind,
159-
ElementKind.extensionKind,
160-
ElementKind.mixinKind,
161-
ElementKind.typedefKind,
162-
]);
154+
_assertMatcher('s', expectedComponents: ['s'], expectedKinds: []);
163155
}
164156

165157
Future<void> test_method_withoutTarget_resolved() async {
@@ -217,7 +209,7 @@ class C {
217209
}
218210
}
219211
''');
220-
_assertMatcher('s =', expectedComponents: ['s', 'C']);
212+
_assertMatcher('s =', expectedComponents: ['s']);
221213
}
222214

223215
Future<void> test_setter_withoutTarget_unresolved() async {

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,16 @@ abstract class AbstractClassElementImpl extends _ExistingElementImpl
129129
_typeParameterElements = typeParameters;
130130
}
131131

132+
@override
133+
ConstructorElement? get unnamedConstructor {
134+
for (ConstructorElement element in constructors) {
135+
if (element.name.isEmpty) {
136+
return element;
137+
}
138+
}
139+
return null;
140+
}
141+
132142
@override
133143
T? accept<T>(ElementVisitor<T> visitor) => visitor.visitClassElement(this);
134144

@@ -777,16 +787,6 @@ class ClassElementImpl extends AbstractClassElementImpl {
777787
return super.typeParameters;
778788
}
779789

780-
@override
781-
ConstructorElement? get unnamedConstructor {
782-
for (ConstructorElement element in constructors) {
783-
if (element.name.isEmpty) {
784-
return element;
785-
}
786-
}
787-
return null;
788-
}
789-
790790
@override
791791
void appendTo(ElementDisplayStringBuilder builder) {
792792
builder.writeClassElement(this);
@@ -1584,23 +1584,19 @@ class DefaultSuperFormalParameterElementImpl
15841584

15851585
@override
15861586
String? get defaultValueCode {
1587-
return constantInitializer?.toSource();
1588-
}
1589-
1590-
@override
1591-
bool get hasDefaultValue {
1592-
if (super.hasDefaultValue) {
1593-
return true;
1587+
final constantInitializer = this.constantInitializer;
1588+
if (constantInitializer != null) {
1589+
return constantInitializer.toSource();
15941590
}
1595-
return computeConstantValue() != null;
1596-
}
15971591

1598-
@override
1599-
DartObject? computeConstantValue() {
1600-
if (constantInitializer != null) {
1601-
return super.computeConstantValue();
1592+
if (_superConstructorParameterDefaultValue != null) {
1593+
return superConstructorParameter?.defaultValueCode;
16021594
}
16031595

1596+
return null;
1597+
}
1598+
1599+
DartObject? get _superConstructorParameterDefaultValue {
16041600
var superDefault = superConstructorParameter?.computeConstantValue();
16051601
var superDefaultType = superDefault?.type;
16061602
var libraryElement = library;
@@ -1612,6 +1608,15 @@ class DefaultSuperFormalParameterElementImpl
16121608

16131609
return null;
16141610
}
1611+
1612+
@override
1613+
DartObject? computeConstantValue() {
1614+
if (constantInitializer != null) {
1615+
return super.computeConstantValue();
1616+
}
1617+
1618+
return _superConstructorParameterDefaultValue;
1619+
}
16151620
}
16161621

16171622
/// The synthetic element representing the declaration of the type `dynamic`.
@@ -2767,9 +2772,6 @@ class EnumElementImpl extends AbstractClassElementImpl {
27672772
return super.typeParameters;
27682773
}
27692774

2770-
@override
2771-
ConstructorElement? get unnamedConstructor => null;
2772-
27732775
@override
27742776
void appendTo(ElementDisplayStringBuilder builder) {
27752777
builder.writeEnumElement(this);

pkg/analyzer/lib/src/dart/element/extensions.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ extension ElementExtension on Element {
103103
}
104104
}
105105

106+
extension ExecutableElementExtension on ExecutableElement {
107+
bool get isEnumConstructor {
108+
return this is ConstructorElement && enclosingElement is EnumElementImpl;
109+
}
110+
}
111+
106112
extension ParameterElementExtensions on ParameterElement {
107113
/// Return [ParameterElement] with the specified properties replaced.
108114
ParameterElement copyWith({

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,15 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
394394

395395
node.metadata.accept(this);
396396
_setElementAnnotations(node.metadata, element.metadata);
397+
398+
var arguments = node.arguments;
399+
if (arguments != null) {
400+
_withElementWalker(null, () {
401+
_withElementHolder(ElementHolder(element), () {
402+
arguments.accept(this);
403+
});
404+
});
405+
}
397406
}
398407

399408
@override

pkg/analyzer/lib/src/generated/declaration_resolver.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:analyzer/src/dart/element/element.dart';
7+
import 'package:analyzer/src/dart/element/extensions.dart';
78

89
/// Keeps track of the set of non-synthetic child elements of an element,
910
/// yielding them one at a time in response to "get" method calls.
@@ -67,7 +68,9 @@ class ElementWalker {
6768
ElementWalker.forExecutable(ExecutableElement element)
6869
: element = element,
6970
_functions = const <ExecutableElement>[],
70-
_parameters = element.parameters,
71+
_parameters = element.isEnumConstructor
72+
? element.parameters.skip(2).toList()
73+
: element.parameters,
7174
_typeParameters = element.typeParameters;
7275

7376
/// Creates an [ElementWalker] which walks the child elements of an extension

pkg/analyzer/lib/src/generated/resolver.dart

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1539,9 +1539,39 @@ class ResolverVisitor extends ThrowingAstVisitor<void>
15391539

15401540
@override
15411541
void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
1542+
node as EnumConstantDeclarationImpl;
1543+
1544+
node.documentationComment?.accept(this);
15421545
node.metadata.accept(this);
15431546
checkUnreachableNode(node);
1544-
node.visitChildren(this);
1547+
1548+
var element = node.declaredElement as ConstFieldElementImpl;
1549+
var initializer = element.constantInitializer;
1550+
if (initializer is InstanceCreationExpression) {
1551+
var constructor = initializer.constructorName.staticElement;
1552+
node.constructorElement = constructor;
1553+
var arguments = node.arguments;
1554+
if (arguments != null) {
1555+
var argumentList = arguments.argumentList;
1556+
if (constructor != null) {
1557+
InferenceContext.setType(argumentList, constructor.type);
1558+
argumentList.correspondingStaticParameters =
1559+
ResolverVisitor.resolveArgumentsToParameters(
1560+
argumentList: argumentList,
1561+
parameters: constructor.parameters.skip(2).toList(),
1562+
);
1563+
for (var argument in argumentList.arguments) {
1564+
var parameter = argument.staticParameterElement;
1565+
if (parameter != null) {
1566+
InferenceContext.setType(argument, parameter.type);
1567+
}
1568+
argument.accept(this);
1569+
}
1570+
}
1571+
arguments.typeArguments?.accept(this);
1572+
}
1573+
}
1574+
15451575
elementResolver.visitEnumConstantDeclaration(node);
15461576
}
15471577

@@ -3039,6 +3069,7 @@ class ScopeResolverVisitor extends UnifyingAstVisitor<void> {
30393069
void visitEnumMembersInScope(EnumDeclaration node) {
30403070
node.documentationComment?.accept(this);
30413071
node.constants.accept(this);
3072+
node.members.accept(this);
30423073
}
30433074

30443075
@override

pkg/analyzer/lib/src/summary2/element_builder.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
268268
name: astFactory.simpleIdentifier(
269269
StringToken(TokenType.STRING, element.name, -1),
270270
),
271+
typeArguments: constant.arguments?.typeArguments,
271272
),
272273
Tokens.period(),
273274
astFactory.simpleIdentifier(

pkg/analyzer/lib/src/summary2/informative_data.dart

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ class _InformativeDataWriter {
12991299
_writeDocumentationComment(node);
13001300
_writeOffsets(
13011301
metadata: node.metadata,
1302-
enumConstantArguments: node.arguments?.argumentList,
1302+
enumConstantArguments: node.arguments,
13031303
);
13041304
}
13051305

@@ -1433,7 +1433,7 @@ class _InformativeDataWriter {
14331433
NodeList<ConstructorInitializer>? constructorInitializers,
14341434
NodeList<EnumConstantDeclaration>? enumConstants,
14351435
TypeAnnotation? aliasedType,
1436-
ArgumentList? enumConstantArguments,
1436+
EnumConstantArguments? enumConstantArguments,
14371437
}) {
14381438
var collector = _OffsetsCollector();
14391439

@@ -1485,7 +1485,8 @@ class _InformativeDataWriter {
14851485
addTypeParameters(aliasedType.typeParameters);
14861486
addFormalParameters(aliasedType.parameters);
14871487
}
1488-
enumConstantArguments?.arguments.accept(collector);
1488+
enumConstantArguments?.typeArguments?.accept(collector);
1489+
enumConstantArguments?.argumentList.arguments.accept(collector);
14891490
sink.writeUint30List(collector.offsets);
14901491
}
14911492

@@ -1662,14 +1663,7 @@ class _OffsetsApplier extends _OffsetsAstVisitor {
16621663

16631664
void applyToConstantInitializer(Element element) {
16641665
if (element is ConstFieldElementImpl && element.isEnumConstant) {
1665-
var initializer = element.constantInitializer;
1666-
if (initializer is InstanceCreationExpression) {
1667-
var arguments = initializer.argumentList.arguments;
1668-
// Skip synthetic `index` and `name` arguments.
1669-
for (var argument in arguments.skip(2)) {
1670-
argument.accept(this);
1671-
}
1672-
}
1666+
_applyToEnumConstantInitializer(element);
16731667
} else if (element is ConstVariableElement) {
16741668
element.constantInitializer?.accept(this);
16751669
}
@@ -1744,6 +1738,18 @@ class _OffsetsApplier extends _OffsetsAstVisitor {
17441738
element.nameOffset = identifier.offset;
17451739
}
17461740
}
1741+
1742+
void _applyToEnumConstantInitializer(ConstFieldElementImpl element) {
1743+
var initializer = element.constantInitializer;
1744+
if (initializer is InstanceCreationExpression) {
1745+
initializer.constructorName.type2.typeArguments?.accept(this);
1746+
var arguments = initializer.argumentList.arguments;
1747+
// Skip synthetic `index` and `name` arguments.
1748+
for (var argument in arguments.skip(2)) {
1749+
argument.accept(this);
1750+
}
1751+
}
1752+
}
17471753
}
17481754

17491755
abstract class _OffsetsAstVisitor extends RecursiveAstVisitor<void> {

0 commit comments

Comments
 (0)