Enhance DartEditBuilder.writeParameter to support the covariant and required keywords

Change-Id: I625196ff5786d9a6029db92809487d79e0e8d710
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/159385
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Brian Wilkerson 2020-08-20 14:03:18 +00:00 committed by commit-bot@chromium.org
parent f5b1063f86
commit 90b2e5f576
3 changed files with 121 additions and 2 deletions

View file

@ -4,6 +4,7 @@
import 'dart:async';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart';
@ -509,7 +510,9 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder {
@override
void writeParameter(String name,
{ExecutableElement methodBeingCopied,
{bool isCovariant = false,
bool isRequiredNamed = false,
ExecutableElement methodBeingCopied,
String nameGroupName,
DartType type,
String typeGroupName}) {
@ -535,6 +538,24 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder {
}
}
if (isCovariant) {
write('covariant ');
}
if (isRequiredNamed) {
var library = dartFileEditBuilder.resolvedUnit.libraryElement;
if (library.featureSet.isEnabled(Feature.non_nullable)) {
write('required ');
} else {
var result = dartFileEditBuilder
.importLibraryElement(Uri.parse('package:meta/meta.dart'));
var prefix = result.prefix;
if (prefix != null) {
write('@$prefix.required ');
} else {
write('@required ');
}
}
}
if (type != null) {
var hasType = writeType();
if (name.isNotEmpty) {
@ -612,6 +633,8 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder {
var groupPrefix =
methodBeingCopied != null ? '${methodBeingCopied.name}:' : '';
writeParameter(name,
isCovariant: parameter.isCovariant,
isRequiredNamed: parameter.isRequiredNamed,
methodBeingCopied: methodBeingCopied,
nameGroupName: parameter.isNamed ? null : '${groupPrefix}PARAM$i',
type: parameter.type,

View file

@ -207,8 +207,16 @@ abstract class DartEditBuilder implements EditBuilder {
///
/// If a [type] and [typeGroupName] are both provided, then the type of the
/// parameter will be included in a linked edit.
///
/// If [isCovariant] is `true` then the keyword `covariant` will be included
/// in the parameter declaration.
///
/// If [isRequiredNamed] is `true` then either the keyword `required` or the
/// annotation `@required` will be included in the parameter declaration.
void writeParameter(String name,
{ExecutableElement methodBeingCopied,
{bool isCovariant,
bool isRequiredNamed,
ExecutableElement methodBeingCopied,
String nameGroupName,
DartType type,
String typeGroupName});

View file

@ -830,6 +830,94 @@ class MyClass {}''';
expect(edit.replacement, equalsIgnoringWhitespace('a'));
}
Future<void> test_writeParameter_covariant() async {
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';
addSource(path, content);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
builder.addInsertion(content.length - 1, (builder) {
builder.writeParameter('a', isCovariant: true);
});
});
var edit = getEdit(builder);
expect(edit.replacement, equalsIgnoringWhitespace('covariant a'));
}
Future<void> test_writeParameter_covariantAndRequired() async {
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';
addSource(path, content);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
builder.addInsertion(content.length - 1, (builder) {
builder.writeParameter('a', isCovariant: true, isRequiredNamed: true);
});
});
var edits = getEdits(builder);
expect(edits, hasLength(2));
expect(edits[0].replacement,
equalsIgnoringWhitespace('covariant @required a'));
expect(edits[1].replacement,
equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
}
Future<void> test_writeParameter_required_addImport() async {
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';
addSource(path, content);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
builder.addInsertion(content.length - 1, (builder) {
builder.writeParameter('a', isRequiredNamed: true);
});
});
var edits = getEdits(builder);
expect(edits, hasLength(2));
expect(edits[0].replacement, equalsIgnoringWhitespace('@required a'));
expect(edits[1].replacement,
equalsIgnoringWhitespace("import 'package:meta/meta.dart';"));
}
Future<void> test_writeParameter_required_existingImport() async {
addMetaPackage();
var path = convertPath('/home/test/lib/test.dart');
var content = '''
import 'package:meta/meta.dart';
class A {}
''';
addSource(path, content);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
builder.addInsertion(content.length - 1, (builder) {
builder.writeParameter('a', isRequiredNamed: true);
});
});
var edit = getEdit(builder);
expect(edit.replacement, equalsIgnoringWhitespace('@required a'));
}
Future<void> test_writeParameter_required_keyword() async {
createAnalysisOptionsFile(experiments: ['non-nullable']);
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';
addSource(path, content);
var builder = newBuilder();
await builder.addDartFileEdit(path, (builder) {
builder.addInsertion(content.length - 1, (builder) {
builder.writeParameter('a', isRequiredNamed: true);
});
});
var edit = getEdit(builder);
expect(edit.replacement, equalsIgnoringWhitespace('required a'));
}
Future<void> test_writeParameter_type() async {
var path = convertPath('/home/test/lib/test.dart');
var content = 'class A {}';