CREATE_MISSING_OVERRIDES to create brackets if missing

Fixes #37903

Change-Id: I13ed4e1bf34bf7d5cfd0bdc78d6191c6964cc28a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/210961
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Ahmed Ashour 2021-08-26 20:15:30 +00:00 committed by commit-bot@chromium.org
parent dd5b4cb05c
commit e30a55d74a
2 changed files with 103 additions and 3 deletions

View file

@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/utilities/strings.dart';
@ -27,8 +28,7 @@ class CreateMissingOverrides extends CorrectionProducer {
return;
}
var targetClass = node.parent as ClassDeclaration;
var targetClassElement = targetClass.declaredElement;
utils.targetClassElement = targetClassElement;
utils.targetClassElement = targetClass.declaredElement;
var signatures =
InheritanceOverrideVerifier.missingOverrides(targetClass).toList();
// sort by name, getters before setters
@ -52,12 +52,22 @@ class CreateMissingOverrides extends CorrectionProducer {
var prefix = utils.getIndent(1);
await builder.addDartFileEdit(file, (builder) {
final syntheticLeftBracket = targetClass.leftBracket.isSynthetic;
if (syntheticLeftBracket) {
var previousToLeftBracket = targetClass.leftBracket.previous;
builder.addSimpleInsertion(previousToLeftBracket!.end, ' {');
}
builder.addInsertion(location.offset, (builder) {
// Separator management.
var numOfMembersWritten = 0;
void addSeparatorBetweenDeclarations() {
if (numOfMembersWritten == 0) {
builder.write(location.prefix);
var locationPrefix = location.prefix;
if (syntheticLeftBracket && locationPrefix.startsWith(eol)) {
locationPrefix = locationPrefix.substring(eol.length);
}
builder.write(locationPrefix);
} else {
builder.write(eol); // after the previous member
builder.write(eol); // empty line separator
@ -97,6 +107,19 @@ class CreateMissingOverrides extends CorrectionProducer {
builder.writeOverride(element);
}
builder.write(location.suffix);
if (targetClass.rightBracket.isSynthetic) {
var next = targetClass.rightBracket.next;
if (next!.type != TokenType.CLOSE_CURLY_BRACKET) {
if (!syntheticLeftBracket) {
builder.write(eol);
}
builder.write('}');
if (syntheticLeftBracket) {
builder.write(eol);
}
}
}
});
});
builder.setSelection(Position(file, location.offset));

View file

@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@ -22,6 +23,82 @@ class CreateMissingOverridesTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.CREATE_MISSING_OVERRIDES;
Future<void> test_brackets_both() async {
await resolveTestCode('''
class A {
void m() {};
}
class B implements A
''');
await assertHasFix('''
class A {
void m() {};
}
class B implements A {
@override
void m() {
// TODO: implement m
}
}
''', errorFilter: (error) {
return error.errorCode ==
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE;
});
}
Future<void> test_brackets_left() async {
await resolveTestCode('''
class A {
void m() {};
}
class B implements A
}
''');
await assertHasFix('''
class A {
void m() {};
}
class B implements A {
@override
void m() {
// TODO: implement m
}
}
''', errorFilter: (error) {
return error.errorCode ==
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE;
});
}
Future<void> test_brackets_right() async {
await resolveTestCode('''
class A {
void m() {};
}
class B implements A {
''');
await assertHasFix('''
class A {
void m() {};
}
class B implements A {
@override
void m() {
// TODO: implement m
}
}
''', errorFilter: (error) {
return error.errorCode ==
CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE;
});
}
Future<void> test_field_untyped() async {
await resolveTestCode('''
class A {