mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 09:01:42 +00:00
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:
parent
f5b1063f86
commit
90b2e5f576
|
@ -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,
|
||||
|
|
|
@ -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});
|
||||
|
|
|
@ -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 {}';
|
||||
|
|
Loading…
Reference in a new issue