Index: pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart |
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart |
index b24c6109c93bd237b383b1d972c4dd9abc991cf0..d9495ebb0783a3be11ba6315bbcd068541db137f 100644 |
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart |
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_target.dart |
@@ -103,6 +103,12 @@ class CompletionTarget { |
final Object entity; |
/** |
+ * The [entity] is a comment token, which is either not a documentation |
+ * comment or the position is not in a [CommentReference]. |
+ */ |
+ final bool isCommentText; |
+ |
+ /** |
* If the target is an argument in an [ArgumentList], then this is the index |
* of the argument in the list, otherwise this is `null`. |
*/ |
@@ -145,8 +151,13 @@ class CompletionTarget { |
for (var entity in containingNode.childEntities) { |
if (entity is Token) { |
if (_isCandidateToken(entity, offset)) { |
+ // Try to replace with a comment token. |
+ Token commentToken = _getContainingCommentToken(entity, offset); |
+ if (commentToken != null) { |
+ return new CompletionTarget._(containingNode, commentToken, true); |
+ } |
// Target found. |
- return new CompletionTarget._(containingNode, entity); |
+ return new CompletionTarget._(containingNode, entity, false); |
} else { |
// Since entity is a token, we don't need to look inside it; just |
// proceed to the next entity. |
@@ -162,19 +173,24 @@ class CompletionTarget { |
// If the node is a candidate target, then we are done. |
if (_isCandidateNode(entity, offset)) { |
- // Check to see if the offset is in a preceeding comment |
- Token commentToken = _getContainingCommentToken(entity, offset); |
+ // Check to see if the offset is in a preceding comment |
+ Token commentToken = |
+ _getContainingCommentToken(entity.beginToken, offset); |
if (commentToken != null) { |
entity = commentToken; |
- // If the preceeding comment is dartdoc token then update |
- // the containing node to be the dartdoc comment |
+ // If the preceding comment is dartdoc token, then update |
+ // the containing node to be the dartdoc comment. |
+ // Otherwise completion is not required. |
Comment docComment = |
_getContainingDocComment(containingNode, commentToken); |
if (docComment != null) { |
containingNode = docComment; |
+ } else { |
+ return new CompletionTarget._( |
+ compilationUnit, commentToken, true); |
} |
} |
- return new CompletionTarget._(containingNode, entity); |
+ return new CompletionTarget._(containingNode, entity, false); |
} |
// Otherwise, the completion target is somewhere inside the entity, |
@@ -198,7 +214,7 @@ class CompletionTarget { |
// Since no completion target was found, we set the completion target |
// entity to null and use the compilationUnit as the parent. |
- return new CompletionTarget._(compilationUnit, null); |
+ return new CompletionTarget._(compilationUnit, null, false); |
} |
} |
@@ -206,7 +222,7 @@ class CompletionTarget { |
* Create a [CompletionTarget] holding the given [containingNode] and |
* [entity]. |
*/ |
- CompletionTarget._(AstNode containingNode, Object entity) |
+ CompletionTarget._(AstNode containingNode, Object entity, this.isCommentText) |
: this.containingNode = containingNode, |
this.entity = entity, |
this.argIndex = _computeArgIndex(containingNode, entity); |
@@ -252,15 +268,14 @@ class CompletionTarget { |
} |
/** |
- * Determine if the offset is contained in a preceeding comment token |
+ * Determine if the offset is contained in a preceding comment token |
* and return that token, otherwise return `null`. |
*/ |
- static Token _getContainingCommentToken(AstNode node, int offset) { |
- if (offset >= node.offset) { |
+ static Token _getContainingCommentToken(Token token, int offset) { |
+ if (token == null) { |
return null; |
} |
- Token token = node.beginToken; |
- if (token == null) { |
+ if (offset >= token.offset) { |
return null; |
} |
token = token.precedingComments; |