Skip to content

Commit bf2fc7d

Browse files
FMorschelCommit Queue
authored andcommitted
[DAS] Fixes part file handling for some create fixes
Bug: #61192 Change-Id: I8aa765fca2d2948ab6fe1b47a6bff6bf58de3cd3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447341 Auto-Submit: Felipe Morschel <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent b1aed87 commit bf2fc7d

File tree

14 files changed

+683
-158
lines changed

14 files changed

+683
-158
lines changed

pkg/analysis_server/lib/src/services/correction/dart/create_extension_member.dart

Lines changed: 115 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class CreateExtensionGetter extends _CreateExtensionMember {
3333

3434
@override
3535
Future<void> compute(ChangeBuilder builder) async {
36+
var addStaticKeyword = inStaticContext;
3637
var nameNode = node;
3738
if (nameNode is! SimpleIdentifier) {
3839
return;
@@ -44,29 +45,34 @@ class CreateExtensionGetter extends _CreateExtensionMember {
4445
_getterName = nameNode.name;
4546

4647
// prepare target
47-
DartType? targetType;
48-
ExtensionElement? extensionElement;
48+
Expression? target;
4949
switch (nameNode.parent) {
5050
case PrefixedIdentifier prefixedIdentifier:
5151
if (prefixedIdentifier.identifier == nameNode) {
52-
targetType = prefixedIdentifier.prefix.staticType;
52+
target = prefixedIdentifier.prefix;
5353
}
5454
case PropertyAccess propertyAccess:
5555
if (propertyAccess.propertyName == nameNode) {
56-
targetType = propertyAccess.realTarget.staticType;
57-
if (propertyAccess.realTarget case ExtensionOverride(
58-
:var element,
59-
) when targetType == null) {
60-
extensionElement = element;
61-
targetType = extensionElement.thisType;
62-
}
63-
}
64-
case ExpressionFunctionBody expressionFunctionBody:
65-
if (expressionFunctionBody.expression == nameNode) {
66-
targetType = node.enclosingInstanceElement?.thisType;
56+
target = propertyAccess.realTarget;
6757
}
68-
default:
69-
targetType = nameNode.enclosingInstanceElement?.thisType;
58+
}
59+
60+
DartType? targetType;
61+
ExtensionElement? extensionElement;
62+
if (target is ExtensionOverride) {
63+
targetType = target.extendedType;
64+
extensionElement = target.element;
65+
} else if (target == null) {
66+
extensionElement = node.enclosingInstanceElement?.ifTypeOrNull();
67+
targetType = extensionElement?.thisType;
68+
} else {
69+
// We need the type for the extension.
70+
targetType = target.staticType;
71+
}
72+
if (targetType == null && target is SimpleIdentifier) {
73+
extensionElement = target.element?.ifTypeOrNull();
74+
targetType = extensionElement?.thisType;
75+
addStaticKeyword = true;
7076
}
7177

7278
// TODO(FMorschel): We should take into account if the target type contains
@@ -86,7 +92,7 @@ class CreateExtensionGetter extends _CreateExtensionMember {
8692
}
8793

8894
void writeGetter(DartEditBuilder builder) {
89-
if (inStaticContext) {
95+
if (addStaticKeyword) {
9096
builder.write('static ');
9197
}
9298
if (fieldType != null) {
@@ -151,7 +157,7 @@ class CreateExtensionMethod extends _CreateExtensionMember {
151157

152158
@override
153159
Future<void> compute(ChangeBuilder builder) async {
154-
var static = false;
160+
var addStaticKeyword = inStaticContext;
155161
var nameNode = node;
156162
if (nameNode is! SimpleIdentifier) {
157163
return;
@@ -191,7 +197,7 @@ class CreateExtensionMethod extends _CreateExtensionMember {
191197
if (targetType == null && target is SimpleIdentifier) {
192198
extensionElement = target.element?.ifTypeOrNull();
193199
targetType = extensionElement?.thisType;
194-
static = true;
200+
addStaticKeyword = true;
195201
}
196202
if (targetType == null ||
197203
targetType is DynamicType ||
@@ -224,7 +230,7 @@ class CreateExtensionMethod extends _CreateExtensionMember {
224230
var functionType = !isInvocation ? returnType as FunctionType : null;
225231

226232
void writeMethod(DartEditBuilder builder) {
227-
if (static) {
233+
if (addStaticKeyword) {
228234
builder.write('static ');
229235
}
230236

@@ -356,7 +362,18 @@ class CreateExtensionOperator extends _CreateExtensionMember {
356362
}
357363

358364
// We need the type for the extension.
359-
var targetType = target.staticType;
365+
DartType? targetType;
366+
ExtensionElement? extensionElement;
367+
if (target is ExtensionOverride) {
368+
targetType = target.extendedType;
369+
extensionElement = target.element;
370+
} else {
371+
targetType = target.staticType;
372+
}
373+
if (targetType == null && target is SimpleIdentifier) {
374+
extensionElement = target.element?.ifTypeOrNull();
375+
targetType = extensionElement?.thisType;
376+
}
360377
if (targetType == null ||
361378
targetType is DynamicType ||
362379
targetType is InvalidType) {
@@ -406,14 +423,27 @@ class CreateExtensionOperator extends _CreateExtensionMember {
406423
builder.write(') {}');
407424
}
408425

409-
var updatedExisting = await _updateExistingExtension(builder, targetType, (
410-
extension,
411-
builder,
412-
) {
413-
builder.insertMethod(extension, (builder) {
414-
writeMethod(builder);
426+
bool updatedExisting;
427+
if (extensionElement != null) {
428+
updatedExisting = await _updateExistingExtension2(
429+
builder,
430+
extensionElement,
431+
(extension, builder) {
432+
builder.insertMethod(extension, (builder) {
433+
writeMethod(builder);
434+
});
435+
},
436+
);
437+
} else {
438+
updatedExisting = await _updateExistingExtension(builder, targetType, (
439+
extension,
440+
builder,
441+
) {
442+
builder.insertMethod(extension, (builder) {
443+
writeMethod(builder);
444+
});
415445
});
416-
});
446+
}
417447
if (updatedExisting) {
418448
return;
419449
}
@@ -441,6 +471,7 @@ class CreateExtensionSetter extends _CreateExtensionMember {
441471

442472
@override
443473
Future<void> compute(ChangeBuilder builder) async {
474+
var addStaticKeyword = inStaticContext;
444475
var nameNode = node;
445476
if (nameNode is! SimpleIdentifier) {
446477
return;
@@ -463,14 +494,28 @@ class CreateExtensionSetter extends _CreateExtensionMember {
463494
target = propertyAccess.realTarget;
464495
}
465496
}
466-
if (target == null) {
467-
return;
497+
498+
DartType? targetType;
499+
ExtensionElement? extensionElement;
500+
if (target is ExtensionOverride) {
501+
targetType = target.extendedType;
502+
extensionElement = target.element;
503+
} else if (target == null) {
504+
extensionElement = node.enclosingInstanceElement?.ifTypeOrNull();
505+
targetType = extensionElement?.thisType;
506+
} else {
507+
// We need the type for the extension.
508+
targetType = target.staticType;
509+
}
510+
if (targetType == null && target is SimpleIdentifier) {
511+
extensionElement = target.element?.ifTypeOrNull();
512+
targetType = extensionElement?.thisType;
513+
addStaticKeyword = true;
468514
}
469515

470516
// TODO(FMorschel): We should take into account if the target type contains
471517
// a setter for the same name and stop the fix from being applied.
472518
// We need the type for the extension.
473-
var targetType = target.staticType;
474519
if (targetType == null ||
475520
targetType is DynamicType ||
476521
targetType is InvalidType) {
@@ -489,19 +534,33 @@ class CreateExtensionSetter extends _CreateExtensionMember {
489534
_setterName,
490535
nameGroupName: 'NAME',
491536
parameterType: fieldType,
537+
isStatic: addStaticKeyword,
492538
parameterTypeGroupName: 'TYPE',
493539
typeParametersInScope: methodBeingCopied?.typeParameters,
494540
);
495541
}
496542

497-
var updatedExisting = await _updateExistingExtension(builder, targetType, (
498-
extension,
499-
builder,
500-
) {
501-
builder.insertGetter(extension, (builder) {
502-
writeSetter(builder);
543+
bool updatedExisting;
544+
if (extensionElement != null) {
545+
updatedExisting = await _updateExistingExtension2(
546+
builder,
547+
extensionElement,
548+
(extension, builder) {
549+
builder.insertGetter(extension, (builder) {
550+
writeSetter(builder);
551+
});
552+
},
553+
);
554+
} else {
555+
updatedExisting = await _updateExistingExtension(builder, targetType, (
556+
extension,
557+
builder,
558+
) {
559+
builder.insertGetter(extension, (builder) {
560+
writeSetter(builder);
561+
});
503562
});
504-
});
563+
}
505564
if (updatedExisting) {
506565
return;
507566
}
@@ -600,23 +659,34 @@ abstract class _CreateExtensionMember extends ResolvedCorrectionProducer {
600659
if (library.isInSdk) {
601660
return null;
602661
}
603-
var path = library.library.firstFragment.source.fullName;
662+
var existingExtension = await getDeclarationNodeFromElement(
663+
extension,
664+
includeExtensions: true,
665+
);
666+
if (existingExtension is! ExtensionDeclaration) {
667+
return null;
668+
}
669+
var path =
670+
existingExtension.declaredFragment?.libraryFragment.source.fullName;
671+
if (path == null) {
672+
// Should never happen.
673+
assert(
674+
false,
675+
'How is path to an existing extension null? $existingExtension',
676+
);
677+
return null;
678+
}
604679
var unit = await unitResult.session.getResolvedUnit(path);
605680
if (unit is! ResolvedUnitResult) {
606681
return null;
607682
}
608-
var existingExtension = unit.unit.declarations
609-
.whereType<ExtensionDeclaration>()
610-
.firstWhere(
611-
(declaration) => declaration.declaredFragment!.element == extension,
612-
);
613683
var instantiated = [extension].applicableTo(
614684
targetLibrary: libraryElement2,
615685
targetType: extension.thisType as TypeImpl,
616686
strictCasts: true,
617687
);
618688
if (instantiated.isNotEmpty) {
619-
return (path, existingExtension);
689+
return (unit.path, existingExtension);
620690
}
621691
return null;
622692
}

pkg/analysis_server/lib/src/services/correction/dart/create_field.dart

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,9 @@ class CreateField extends CreateFieldOrGetter {
7575
}
7676
// Prepare target `ClassDeclaration`.
7777
var targetFragment = targetElement.firstFragment;
78-
var targetDeclarationResult = await sessionHelper.getFragmentDeclaration(
79-
targetFragment,
78+
var targetNode = await getDeclarationNodeFromElement(
79+
targetFragment.element,
8080
);
81-
if (targetDeclarationResult == null) {
82-
return;
83-
}
84-
var targetNode = targetDeclarationResult.node;
8581
if (targetNode is! CompilationUnitMember) {
8682
return;
8783
}

pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -211,21 +211,10 @@ class CreateGetter extends CreateFieldOrGetter {
211211
return;
212212
}
213213
// prepare target declaration
214-
var targetDeclarationResult = await sessionHelper.getFragmentDeclaration(
215-
targetFragment,
214+
var targetNode = await getDeclarationNodeFromElement(
215+
targetFragment.element,
216216
);
217-
if (targetDeclarationResult == null) {
218-
return;
219-
}
220-
var targetNode = targetDeclarationResult.node;
221-
if (targetNode is CompilationUnitMember) {
222-
if (targetDeclarationResult.node is! ClassDeclaration &&
223-
targetDeclarationResult.node is! ExtensionDeclaration &&
224-
targetDeclarationResult.node is! ExtensionTypeDeclaration &&
225-
targetDeclarationResult.node is! MixinDeclaration) {
226-
return;
227-
}
228-
} else {
217+
if (targetNode is! CompilationUnitMember) {
229218
return;
230219
}
231220
// Build method source.

pkg/analysis_server/lib/src/services/correction/dart/create_method.dart

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class CreateMethod extends ResolvedCorrectionProducer {
111111
);
112112
if (targetClassElement == null) return;
113113

114-
var targetNode = await _declarationNodeFromElement(targetClassElement);
114+
var targetNode = await getDeclarationNodeFromElement(targetClassElement);
115115
if (targetNode is! CompilationUnitMember) return;
116116

117117
await _writeMethod(
@@ -167,7 +167,7 @@ class CreateMethod extends ResolvedCorrectionProducer {
167167
if (targetClassElement == null) return;
168168
targetFragment = targetClassElement.firstFragment;
169169

170-
targetNode = await _declarationNodeFromElement(targetClassElement);
170+
targetNode = await getDeclarationNodeFromElement(targetClassElement);
171171
if (targetNode == null) return;
172172

173173
// Maybe static.
@@ -189,26 +189,6 @@ class CreateMethod extends ResolvedCorrectionProducer {
189189
);
190190
}
191191

192-
Future<CompilationUnitMember?> _declarationNodeFromElement(
193-
InterfaceElement element,
194-
) async {
195-
if (element.library.isInSdk) return null;
196-
if (element is MixinElement) {
197-
var fragment = element.firstFragment;
198-
return await getMixinDeclaration(fragment);
199-
} else if (element is ClassElement) {
200-
var fragment = element.firstFragment;
201-
return await getClassDeclaration(fragment);
202-
} else if (element is ExtensionTypeElement) {
203-
var fragment = element.firstFragment;
204-
return await getExtensionTypeDeclaration(fragment);
205-
} else if (element is EnumElement) {
206-
var fragment = element.firstFragment;
207-
return await getEnumDeclaration(fragment);
208-
}
209-
return null;
210-
}
211-
212192
/// Inserts the new method into the source code.
213193
Future<void> _writeMethod(
214194
ChangeBuilder builder,

pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -220,31 +220,14 @@ class CreateMethodOrFunction extends ResolvedCorrectionProducer {
220220
required bool isStatic,
221221
}) async {
222222
var name = (node as SimpleIdentifier).name;
223-
// prepare environment
224-
var targetSource = targetClassElement.firstFragment.libraryFragment.source;
225223
// prepare insert offset
226-
CompilationUnitMember? targetNode;
227-
List<ClassMember>? classMembers;
228-
if (targetClassElement is MixinElement) {
229-
var fragment = targetClassElement.firstFragment;
230-
var node = targetNode = await getMixinDeclaration(fragment);
231-
classMembers = node?.members;
232-
} else if (targetClassElement is ClassElement) {
233-
var fragment = targetClassElement.firstFragment;
234-
var node = targetNode = await getClassDeclaration(fragment);
235-
classMembers = node?.members;
236-
} else if (targetClassElement is ExtensionTypeElement) {
237-
var fragment = targetClassElement.firstFragment;
238-
var node = targetNode = await getExtensionTypeDeclaration(fragment);
239-
classMembers = node?.members;
240-
} else if (targetClassElement is EnumElement) {
241-
var fragment = targetClassElement.firstFragment;
242-
var node = targetNode = await getEnumDeclaration(fragment);
243-
classMembers = node?.members;
244-
}
245-
if (targetNode == null || classMembers == null) {
224+
var targetNode = await getDeclarationNodeFromElement(targetClassElement);
225+
if (targetNode == null) {
246226
return;
247227
}
228+
// prepare environment
229+
var targetSource = targetClassElement.firstFragment.libraryFragment.source;
230+
var classMembers = targetNode.classMembers;
248231
var insertOffset = targetNode.end - 1;
249232
// prepare prefix
250233
var prefix = ' ';

0 commit comments

Comments
 (0)