Use target file in CREATE_CONSTRUCTOR fixes.
Accidentally triggered an exception while.
R=brianwilkerson@google.com
Change-Id: I0c411378ce49388e0c2db197a408a4a43d8814b9
Reviewed-on: https://dart-review.googlesource.com/c/89040
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index ebbf645..8601890 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -1334,14 +1334,19 @@
if (constructorElement.enclosingElement is! ClassElement) {
return;
}
- ClassElement targetElement = constructorElement.enclosingElement;
- // prepare location for a new constructor
- var targetNode = await _getClassDeclaration(targetElement);
- if (targetNode == null) {
+
+ // prepare target ClassDeclaration
+ var targetElement = constructorElement.enclosingElement;
+ var targetResult = await sessionHelper.getElementDeclaration(targetElement);
+ if (targetResult.node is! ClassOrMixinDeclaration) {
return;
}
- ClassMemberLocation targetLocation =
- utils.prepareNewConstructorLocation(targetNode);
+ ClassOrMixinDeclaration targetNode = targetResult.node;
+
+ // prepare location
+ var targetLocation = CorrectionUtils(targetResult.resolvedUnit)
+ .prepareNewConstructorLocation(targetNode);
+
Source targetSource = targetElement.source;
String targetFile = targetSource.fullName;
var changeBuilder = _newDartChangeBuilder();
@@ -1390,17 +1395,22 @@
if (targetType is! InterfaceType) {
return;
}
- // prepare location for a new constructor
- ClassElement targetElement = targetType.element as ClassElement;
- var targetNode = await _getClassDeclaration(targetElement);
- if (targetNode == null) {
+
+ // prepare target ClassDeclaration
+ ClassElement targetElement = targetType.element;
+ var targetResult = await sessionHelper.getElementDeclaration(targetElement);
+ if (targetResult.node is! ClassOrMixinDeclaration) {
return;
}
- ClassMemberLocation targetLocation =
- utils.prepareNewConstructorLocation(targetNode);
+ ClassOrMixinDeclaration targetNode = targetResult.node;
+
+ // prepare location
+ var targetLocation = CorrectionUtils(targetResult.resolvedUnit)
+ .prepareNewConstructorLocation(targetNode);
+
String targetFile = targetElement.source.fullName;
var changeBuilder = _newDartChangeBuilder();
- await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+ await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
builder.write(targetLocation.prefix);
builder.writeConstructorDeclaration(targetElement.name,
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
index d5e8dd5..c847a3d 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
@@ -34,9 +34,51 @@
@reflectiveTest
class CreateConstructorTest extends FixProcessorTest {
+ static final _text200 = 'x' * 200;
+
@override
FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR;
+ test_inLibrary_insteadOfSyntheticDefault() async {
+ var a = newFile('/home/test/lib/a.dart', content: '''
+/// $_text200
+class A {}
+''').path;
+ await resolveTestUnit('''
+import 'a.dart';
+
+main() {
+ new A.named(1, 2.0);
+}
+''');
+ await assertHasFix('''
+/// $_text200
+class A {
+ A.named(int i, double d);
+}
+''', target: a);
+ }
+
+ test_inLibrary_named() async {
+ var a = newFile('/home/test/lib/a.dart', content: '''
+/// $_text200
+class A {}
+''').path;
+ await resolveTestUnit('''
+import 'a.dart';
+
+main() {
+ new A(1, 2.0);
+}
+''');
+ await assertHasFix('''
+/// $_text200
+class A {
+ A(int i, double d);
+}
+''', target: a);
+ }
+
test_insteadOfSyntheticDefault() async {
await resolveTestUnit('''
class A {