Index: pkg/analysis_server/lib/src/utilities/change_builder_dart.dart |
diff --git a/pkg/analysis_server/lib/src/utilities/change_builder_dart.dart b/pkg/analysis_server/lib/src/utilities/change_builder_dart.dart |
index f9dfbef4f734157dfb2d707650a6639cf137a1b0..49378d120b2dabcb575f7ba70aa30ad8403d54c0 100644 |
--- a/pkg/analysis_server/lib/src/utilities/change_builder_dart.dart |
+++ b/pkg/analysis_server/lib/src/utilities/change_builder_dart.dart |
@@ -4,7 +4,8 @@ |
import 'dart:async'; |
-import 'package:analysis_server/plugin/protocol/protocol.dart' hide ElementKind; |
+import 'package:analysis_server/plugin/protocol/protocol.dart' |
+ hide Element, ElementKind; |
import 'package:analysis_server/src/provisional/edit/utilities/change_builder_core.dart'; |
import 'package:analysis_server/src/provisional/edit/utilities/change_builder_dart.dart'; |
import 'package:analysis_server/src/services/correction/name_suggestion.dart'; |
@@ -62,10 +63,34 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
DartFileEditBuilderImpl get dartFileEditBuilder => fileEditBuilder; |
@override |
+ void set targetClassElement(ClassElement element) { |
+ utils.targetClassElement = element; |
+ } |
+ |
+ @override |
LinkedEditBuilderImpl createLinkedEditBuilder() { |
return new DartLinkedEditBuilderImpl(this); |
} |
+ /** |
+ * Returns the indentation with the given [level]. |
+ */ |
+ String getIndent(int level) => ' ' * level; |
+ |
+// /** |
+// * Arrange to have imports added for each of the given [libraries]. |
+// */ |
+// void importLibraries(Iterable<Source> libraries) { |
+// dartFileEditBuilder.importLibraries(libraries); |
+// } |
scheglov
2017/04/03 17:06:06
Should this be removed?
Brian Wilkerson
2017/04/03 17:14:41
Probably. I'll catch it in the next CL.
|
+ |
+ /** |
+ * Arrange to have an import added for the given [library]. |
+ */ |
+ void importLibrary(Source library) { |
+ dartFileEditBuilder.librariesToImport.add(library); |
+ } |
+ |
@override |
void writeClassDeclaration(String name, |
{Iterable<DartType> interfaces, |
@@ -74,7 +99,7 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
Iterable<DartType> mixins, |
String nameGroupName, |
DartType superclass, |
- String superclassGroupName: DartEditBuilder.SUPERCLASS_GROUP_ID}) { |
+ String superclassGroupName}) { |
// TODO(brianwilkerson) Add support for type parameters, probably as a |
// parameterWriter parameter. |
if (isAbstract) { |
@@ -85,7 +110,7 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
if (nameGroupName == null) { |
write(name); |
} else { |
- addLinkedEdit(DartEditBuilder.NAME_GROUP_ID, (LinkedEditBuilder builder) { |
+ addLinkedEdit(nameGroupName, (LinkedEditBuilder builder) { |
write(name); |
}); |
} |
@@ -106,43 +131,41 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
write('}'); |
} |
- //@override |
- void writeConstructorDeclaration(ClassElement classElement, |
+ @override |
+ void writeConstructorDeclaration(String className, |
{ArgumentList argumentList, |
SimpleIdentifier constructorName, |
+ String constructorNameGroupName, |
+ List<String> fieldNames, |
bool isConst: false}) { |
- // TODO(brianwilkerson) Clean up the API and add it to the public API. |
- // |
- // TODO(brianwilkerson) Support passing a list of final fields rather than |
- // an argument list. |
if (isConst) { |
write(Keyword.CONST.syntax); |
write(' '); |
} |
- write(classElement.name); |
- write('.'); |
+ write(className); |
if (constructorName != null) { |
- addLinkedEdit(DartEditBuilder.NAME_GROUP_ID, (LinkedEditBuilder builder) { |
+ write('.'); |
+ if (constructorNameGroupName == null) { |
write(constructorName.name); |
- }); |
- CompilationUnit unit = constructorName |
- .getAncestor((AstNode node) => node is CompilationUnit); |
- if (unit != null) { |
- CompilationUnitElement element = unit.element; |
- if (element != null) { |
- String referenceFile = element.source.fullName; |
- if (referenceFile == dartFileEditBuilder.fileEdit.file) { |
- dartFileEditBuilder.addLinkedPosition(constructorName.offset, |
- constructorName.length, DartEditBuilder.NAME_GROUP_ID); |
- } |
- } |
+ } else { |
+ addLinkedEdit(constructorNameGroupName, (LinkedEditBuilder builder) { |
+ write(constructorName.name); |
+ }); |
} |
} |
write('('); |
if (argumentList != null) { |
writeParametersMatchingArguments(argumentList); |
+ } else if (fieldNames != null) { |
+ for (int i = 0; i < fieldNames.length; i++) { |
+ if (i > 0) { |
+ write(', '); |
+ } |
+ write('this.'); |
+ write(fieldNames[i]); |
+ } |
} |
- writeln(');'); |
+ write(');'); |
} |
@override |
@@ -167,7 +190,7 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
typeRequired = false; |
} |
if (type != null) { |
- writeType(type, groupName: typeGroupName); |
+ writeType(type, groupName: typeGroupName, required: true); |
} else if (typeRequired) { |
write(Keyword.VAR.syntax); |
} |
@@ -237,7 +260,7 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
write(Keyword.STATIC.syntax); |
write(' '); |
} |
- if (returnType != null) { |
+ if (returnType != null && !returnType.isDynamic) { |
writeType(returnType, groupName: returnTypeGroupName); |
write(' '); |
} |
@@ -299,11 +322,12 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
} |
@override |
- void writeOverrideOfInheritedMember(ExecutableElement member) { |
+ void writeOverrideOfInheritedMember(ExecutableElement member, |
+ {String returnTypeGroupName}) { |
// prepare environment |
- String prefix = utils.getIndent(1); |
+ String prefix = getIndent(1); |
// may be property |
- String prefix2 = utils.getIndent(2); |
+ String prefix2 = getIndent(2); |
ElementKind elementKind = member.kind; |
bool isGetter = elementKind == ElementKind.GETTER; |
bool isSetter = elementKind == ElementKind.SETTER; |
@@ -318,9 +342,8 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
writeln('@override'); |
write(prefix); |
// return type |
- // REVIEW: Added groupId |
- bool shouldReturn = writeType(member.type.returnType, |
- groupName: DartEditBuilder.RETURN_TYPE_GROUP_ID); |
+ bool shouldReturn = |
+ writeType(member.type.returnType, groupName: returnTypeGroupName); |
write(' '); |
if (isGetter) { |
write(Keyword.GET.syntax); |
@@ -484,6 +507,31 @@ class DartEditBuilderImpl extends EditBuilderImpl implements DartEditBuilder { |
return false; |
} |
+ @override |
+ void writeTypeParameter(TypeParameterElement typeParameter) { |
+ write(typeParameter.name); |
+ if (typeParameter.bound != null) { |
+ write(' extends '); |
+ writeType(typeParameter.bound); |
+ } |
+ } |
+ |
+ @override |
+ void writeTypeParameters(List<TypeParameterElement> typeParameters) { |
+ if (typeParameters.isNotEmpty) { |
+ write('<'); |
+ bool isFirst = true; |
+ for (TypeParameterElement typeParameter in typeParameters) { |
+ if (!isFirst) { |
+ write(', '); |
+ } |
+ isFirst = false; |
+ writeTypeParameter(typeParameter); |
+ } |
+ write('>'); |
+ } |
+ } |
+ |
/** |
* Write the code for a comma-separated list of [types], optionally prefixed |
* by a [prefix]. If the list of [types] is `null` or does not return any |
@@ -591,6 +639,17 @@ class DartFileEditBuilderImpl extends FileEditBuilderImpl |
} |
@override |
+ void finalize() { |
+ addLibraryImports( |
+ changeBuilder.sourceChange, unit.element.library, librariesToImport); |
+ } |
+ |
+ @override |
+ void importLibraries(Iterable<Source> libraries) { |
+ librariesToImport.addAll(libraries); |
+ } |
+ |
+ @override |
void replaceTypeWithFuture( |
TypeAnnotation typeAnnotation, TypeProvider typeProvider) { |
InterfaceType futureType = typeProvider.futureType; |