mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 00:09:49 +00:00
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:
parent
dd5b4cb05c
commit
e30a55d74a
|
@ -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));
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue