Index: pkg/analysis_server/lib/src/services/correction/sort_members.dart |
diff --git a/pkg/analysis_server/lib/src/services/correction/sort_members.dart b/pkg/analysis_server/lib/src/services/correction/sort_members.dart |
index f1d788c228b3c86e4903290e35c6cdcea669fecb..d5bb1265409d9b23d838802a1e28e82aabe5c562 100644 |
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart |
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart |
@@ -7,7 +7,6 @@ library services.src.refactoring.sort_members; |
import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element; |
import 'package:analysis_server/src/services/correction/strings.dart'; |
import 'package:analyzer/dart/ast/ast.dart'; |
-import 'package:analyzer/dart/ast/token.dart'; |
/** |
* Sorter for unit/class members. |
@@ -161,8 +160,12 @@ class MemberSorter { |
* Sorts all [Directive]s. |
*/ |
void _sortUnitDirectives() { |
+ bool hasLibraryDirective = false; |
List<_DirectiveInfo> directives = []; |
for (Directive directive in unit.directives) { |
+ if (directive is LibraryDirective) { |
+ hasLibraryDirective = true; |
+ } |
if (directive is! UriBasedDirective) { |
continue; |
} |
@@ -195,10 +198,17 @@ class MemberSorter { |
kind = _DirectivePriority.PART; |
} |
if (kind != null) { |
- int offset = directive.offset; |
- int length = directive.length; |
+ String documentationText; |
+ if (directive.documentationComment != null) { |
+ documentationText = code.substring( |
+ directive.documentationComment.offset, |
+ directive.documentationComment.end); |
+ } |
+ int offset = directive.firstTokenAfterCommentAndMetadata.offset; |
+ int length = directive.end - offset; |
String text = code.substring(offset, offset + length); |
- directives.add(new _DirectiveInfo(directive, kind, uriContent, text)); |
+ directives.add(new _DirectiveInfo( |
+ directive, kind, uriContent, documentationText, text)); |
} |
} |
// nothing to do |
@@ -207,6 +217,12 @@ class MemberSorter { |
} |
int firstDirectiveOffset = directives[0].directive.offset; |
int lastDirectiveEnd = directives[directives.length - 1].directive.end; |
+ // Without a library directive, the library comment is the comment of the |
+ // first directive. |
+ _DirectiveInfo libraryDocumentationDirective; |
+ if (!hasLibraryDirective && directives.isNotEmpty) { |
+ libraryDocumentationDirective = directives.first; |
+ } |
// do sort |
directives.sort(); |
// append directives with grouping |
@@ -215,6 +231,7 @@ class MemberSorter { |
StringBuffer sb = new StringBuffer(); |
String endOfLine = this.endOfLine; |
_DirectivePriority currentPriority = null; |
+ bool firstOutputDirective = true; |
for (_DirectiveInfo directive in directives) { |
if (currentPriority != directive.priority) { |
if (sb.length != 0) { |
@@ -222,35 +239,25 @@ class MemberSorter { |
} |
currentPriority = directive.priority; |
} |
+ if (directive != libraryDocumentationDirective && |
+ directive.documentationText != null) { |
+ sb.write(directive.documentationText); |
+ sb.write(endOfLine); |
+ } |
+ if (firstOutputDirective) { |
+ firstOutputDirective = false; |
+ if (libraryDocumentationDirective != null && |
+ libraryDocumentationDirective.documentationText != null) { |
+ sb.write(libraryDocumentationDirective.documentationText); |
+ sb.write(endOfLine); |
+ } |
+ } |
sb.write(directive.text); |
sb.write(endOfLine); |
} |
directivesCode = sb.toString(); |
directivesCode = directivesCode.trimRight(); |
} |
- // append comment tokens which otherwise would be removed completely |
- { |
- bool firstCommentToken = true; |
- Token token = unit.beginToken; |
- while (token != null && |
- token.type != TokenType.EOF && |
- token.end < lastDirectiveEnd) { |
- Token commentToken = token.precedingComments; |
- while (commentToken != null) { |
- int offset = commentToken.offset; |
- int end = commentToken.end; |
- if (offset > firstDirectiveOffset && offset < lastDirectiveEnd) { |
- if (firstCommentToken) { |
- directivesCode += endOfLine; |
- firstCommentToken = false; |
- } |
- directivesCode += code.substring(offset, end) + endOfLine; |
- } |
- commentToken = commentToken.next; |
- } |
- token = token.next; |
- } |
- } |
// prepare code |
String beforeDirectives = code.substring(0, firstDirectiveOffset); |
String afterDirectives = code.substring(lastDirectiveEnd); |
@@ -368,9 +375,11 @@ class _DirectiveInfo implements Comparable<_DirectiveInfo> { |
final Directive directive; |
final _DirectivePriority priority; |
final String uri; |
+ final String documentationText; |
final String text; |
- _DirectiveInfo(this.directive, this.priority, this.uri, this.text); |
+ _DirectiveInfo(this.directive, this.priority, this.uri, |
+ this.documentationText, this.text); |
@override |
int compareTo(_DirectiveInfo other) { |