Index: pkg/analysis_server/lib/src/computer/computer_highlights.dart |
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart |
index 483ce20a84ec16a1b23477fc351f61a8007f7986..2c11d1dddca6f0d33571d7ef49ae97e40a814736 100644 |
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart |
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart |
@@ -4,8 +4,6 @@ |
library computer.highlights; |
-import 'dart:collection'; |
- |
import 'package:analysis_server/src/constants.dart'; |
import 'package:analyzer/src/generated/ast.dart'; |
import 'package:analyzer/src/generated/element.dart'; |
@@ -18,7 +16,7 @@ import 'package:analyzer/src/generated/scanner.dart'; |
class DartUnitHighlightsComputer { |
final CompilationUnit _unit; |
- final List<Map<String, Object>> _regions = <HashMap<String, Object>>[]; |
+ final List<HighlightRegion> _regions = <HighlightRegion>[]; |
DartUnitHighlightsComputer(this._unit); |
@@ -27,7 +25,33 @@ class DartUnitHighlightsComputer { |
*/ |
List<Map<String, Object>> compute() { |
_unit.accept(new _DartUnitHighlightsComputerVisitor(this)); |
- return _regions; |
+ _addCommentRanges(); |
+ return _regions.map((region) => region.toJson()).toList(); |
+ } |
+ |
+ void _addCommentRanges() { |
+ Token token = _unit.beginToken; |
+ while (token != null && token.type != TokenType.EOF) { |
+ Token commentToken = token.precedingComments; |
+ while (commentToken != null) { |
+ HighlightType highlightType = null; |
+ if (commentToken.type == TokenType.MULTI_LINE_COMMENT) { |
+ if (commentToken.lexeme.startsWith('/**')) { |
+ highlightType = HighlightType.COMMENT_DOCUMENTATION; |
+ } else { |
+ highlightType = HighlightType.COMMENT_BLOCK; |
+ } |
+ } |
+ if (commentToken.type == TokenType.SINGLE_LINE_COMMENT) { |
+ highlightType = HighlightType.COMMENT_END_OF_LINE; |
+ } |
+ if (highlightType != null) { |
+ _addRegion_token(commentToken, highlightType); |
+ } |
+ commentToken = commentToken.next; |
+ } |
+ token = token.next; |
+ } |
} |
void _addIdentifierRegion(SimpleIdentifier node) { |
@@ -81,7 +105,8 @@ class DartUnitHighlightsComputer { |
if (arguments == null) { |
_addRegion_node(node, HighlightType.ANNOTATION); |
} else { |
- _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, HighlightType.ANNOTATION); |
+ _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, |
+ HighlightType.ANNOTATION); |
_addRegion_token(arguments.endToken, HighlightType.ANNOTATION); |
} |
} |
@@ -177,7 +202,8 @@ class DartUnitHighlightsComputer { |
return false; |
} |
// getter or setter |
- PropertyAccessorElement propertyAccessorElement = element as PropertyAccessorElement; |
+ PropertyAccessorElement propertyAccessorElement = element as |
+ PropertyAccessorElement; |
if (propertyAccessorElement.isGetter) { |
return _addRegion_node(node, HighlightType.GETTER_DECLARATION); |
} else { |
@@ -266,7 +292,7 @@ class DartUnitHighlightsComputer { |
} |
void _addRegion(int offset, int length, HighlightType type) { |
- _regions.add({OFFSET: offset, LENGTH: length, TYPE: type.name}); |
+ _regions.add(new HighlightRegion(offset, length, type)); |
} |
bool _addRegion_node(AstNode node, HighlightType type) { |
@@ -298,6 +324,142 @@ class DartUnitHighlightsComputer { |
} |
+class HighlightRegion { |
+ final int offset; |
+ final int length; |
+ final HighlightType type; |
+ |
+ HighlightRegion(this.offset, this.length, this.type); |
+ |
+ factory HighlightRegion.fromJson(Map<String, Object> map) { |
+ HighlightType type = HighlightType.valueOf(map[TYPE]); |
+ return new HighlightRegion(map[OFFSET], map[LENGTH], type); |
+ } |
+ |
+ Map<String, Object> toJson() { |
+ Map<String, Object> json = <String, Object>{}; |
+ json[OFFSET] = offset; |
+ json[LENGTH] = length; |
+ json[TYPE] = type.name; |
+ return json; |
+ } |
+ |
+ @override |
+ String toString() => toJson().toString(); |
+} |
+ |
+ |
+/** |
+ * Highlighting kinds constants. |
+ */ |
+class HighlightType { |
+ static const HighlightType ANNOTATION = const HighlightType('ANNOTATION'); |
+ static const HighlightType BUILT_IN = const HighlightType('BUILT_IN'); |
+ static const HighlightType CLASS = const HighlightType('CLASS'); |
+ static const HighlightType COMMENT_BLOCK = const HighlightType( |
+ 'COMMENT_BLOCK'); |
+ static const HighlightType COMMENT_DOCUMENTATION = const HighlightType( |
+ 'COMMENT_DOCUMENTATION'); |
+ static const HighlightType COMMENT_END_OF_LINE = const HighlightType( |
+ 'COMMENT_END_OF_LINE'); |
+ static const HighlightType CONSTRUCTOR = const HighlightType('CONSTRUCTOR'); |
+ static const HighlightType DIRECTIVE = const HighlightType('DIRECTIVE'); |
+ static const HighlightType DYNAMIC_TYPE = const HighlightType('DYNAMIC_TYPE'); |
+ static const HighlightType FIELD = const HighlightType('FIELD'); |
+ static const HighlightType FIELD_STATIC = const HighlightType('FIELD_STATIC'); |
+ static const HighlightType FUNCTION_DECLARATION = const HighlightType( |
+ 'FUNCTION_DECLARATION'); |
+ static const HighlightType FUNCTION = const HighlightType('FUNCTION'); |
+ static const HighlightType FUNCTION_TYPE_ALIAS = const HighlightType( |
+ 'FUNCTION_TYPE_ALIAS'); |
+ static const HighlightType GETTER_DECLARATION = const HighlightType( |
+ 'GETTER_DECLARATION'); |
+ static const HighlightType KEYWORD = const HighlightType('KEYWORD'); |
+ static const HighlightType IDENTIFIER_DEFAULT = const HighlightType( |
+ 'IDENTIFIER_DEFAULT'); |
+ static const HighlightType IMPORT_PREFIX = const HighlightType( |
+ 'IMPORT_PREFIX'); |
+ static const HighlightType LITERAL_BOOLEAN = const HighlightType( |
+ 'LITERAL_BOOLEAN'); |
+ static const HighlightType LITERAL_DOUBLE = const HighlightType( |
+ 'LITERAL_DOUBLE'); |
+ static const HighlightType LITERAL_INTEGER = const HighlightType( |
+ 'LITERAL_INTEGER'); |
+ static const HighlightType LITERAL_LIST = const HighlightType('LITERAL_LIST'); |
+ static const HighlightType LITERAL_MAP = const HighlightType('LITERAL_MAP'); |
+ static const HighlightType LITERAL_STRING = const HighlightType( |
+ 'LITERAL_STRING'); |
+ static const HighlightType LOCAL_VARIABLE_DECLARATION = const HighlightType( |
+ 'LOCAL_VARIABLE_DECLARATION'); |
+ static const HighlightType LOCAL_VARIABLE = const HighlightType( |
+ 'LOCAL_VARIABLE'); |
+ static const HighlightType METHOD_DECLARATION = const HighlightType( |
+ 'METHOD_DECLARATION'); |
+ static const HighlightType METHOD_DECLARATION_STATIC = const HighlightType( |
+ 'METHOD_DECLARATION_STATIC'); |
+ static const HighlightType METHOD = const HighlightType('METHOD'); |
+ static const HighlightType METHOD_STATIC = const HighlightType( |
+ 'METHOD_STATIC'); |
+ static const HighlightType PARAMETER = const HighlightType('PARAMETER'); |
+ static const HighlightType SETTER_DECLARATION = const HighlightType( |
+ 'SETTER_DECLARATION'); |
+ static const HighlightType TOP_LEVEL_VARIABLE = const HighlightType( |
+ 'TOP_LEVEL_VARIABLE'); |
+ static const HighlightType TYPE_NAME_DYNAMIC = const HighlightType( |
+ 'TYPE_NAME_DYNAMIC'); |
+ static const HighlightType TYPE_PARAMETER = const HighlightType( |
+ 'TYPE_PARAMETER'); |
+ |
+ final String name; |
+ |
+ const HighlightType(this.name); |
+ |
+ @override |
+ String toString() => name; |
+ |
+ static HighlightType valueOf(String name) { |
+ if (ANNOTATION.name == name) return ANNOTATION; |
+ if (BUILT_IN.name == name) return BUILT_IN; |
+ if (CLASS.name == name) return CLASS; |
+ if (COMMENT_BLOCK.name == name) return COMMENT_BLOCK; |
+ if (COMMENT_DOCUMENTATION.name == name) return COMMENT_DOCUMENTATION; |
+ if (COMMENT_END_OF_LINE.name == name) return COMMENT_END_OF_LINE; |
+ if (CONSTRUCTOR.name == name) return CONSTRUCTOR; |
+ if (DIRECTIVE.name == name) return DIRECTIVE; |
+ if (DYNAMIC_TYPE.name == name) return DYNAMIC_TYPE; |
+ if (FIELD.name == name) return FIELD; |
+ if (FIELD_STATIC.name == name) return FIELD_STATIC; |
+ if (FUNCTION_DECLARATION.name == name) return FUNCTION_DECLARATION; |
+ if (FUNCTION.name == name) return FUNCTION; |
+ if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS; |
+ if (GETTER_DECLARATION.name == name) return GETTER_DECLARATION; |
+ if (KEYWORD.name == name) return KEYWORD; |
+ if (IDENTIFIER_DEFAULT.name == name) return IDENTIFIER_DEFAULT; |
+ if (IMPORT_PREFIX.name == name) return IMPORT_PREFIX; |
+ if (LITERAL_BOOLEAN.name == name) return LITERAL_BOOLEAN; |
+ if (LITERAL_DOUBLE.name == name) return LITERAL_DOUBLE; |
+ if (LITERAL_INTEGER.name == name) return LITERAL_INTEGER; |
+ if (LITERAL_LIST.name == name) return LITERAL_LIST; |
+ if (LITERAL_MAP.name == name) return LITERAL_MAP; |
+ if (LITERAL_STRING.name == name) return LITERAL_STRING; |
+ if (LOCAL_VARIABLE_DECLARATION.name == name) return |
+ LOCAL_VARIABLE_DECLARATION; |
+ if (LOCAL_VARIABLE.name == name) return LOCAL_VARIABLE; |
+ if (METHOD_DECLARATION.name == name) return METHOD_DECLARATION; |
+ if (METHOD_DECLARATION_STATIC.name == name) return |
+ METHOD_DECLARATION_STATIC; |
+ if (METHOD.name == name) return METHOD; |
+ if (METHOD_STATIC.name == name) return METHOD_STATIC; |
+ if (PARAMETER.name == name) return PARAMETER; |
+ if (SETTER_DECLARATION.name == name) return SETTER_DECLARATION; |
+ if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE; |
+ if (TYPE_NAME_DYNAMIC.name == name) return TYPE_NAME_DYNAMIC; |
+ if (TYPE_PARAMETER.name == name) return TYPE_PARAMETER; |
+ throw new ArgumentError('Unknown HighlightType: $name'); |
+ } |
+} |
+ |
+ |
/** |
* An AST visitor for [DartUnitHighlightsComputer]. |
*/ |
@@ -435,7 +597,8 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<Object> { |
@override |
Object visitPartOfDirective(PartOfDirective node) { |
- computer._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, HighlightType.BUILT_IN); |
+ computer._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, |
+ HighlightType.BUILT_IN); |
return super.visitPartOfDirective(node); |
} |
@@ -469,49 +632,3 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<Object> { |
return super.visitTypeName(node); |
} |
} |
- |
- |
-/** |
- * Highlighting kinds constants. |
- */ |
-class HighlightType { |
- static const HighlightType ANNOTATION = const HighlightType('ANNOTATION'); |
- static const HighlightType BUILT_IN = const HighlightType('BUILT_IN'); |
- static const HighlightType CLASS = const HighlightType('CLASS'); |
- static const HighlightType COMMENT_BLOCK = const HighlightType('COMMENT_BLOCK'); |
- static const HighlightType COMMENT_DOCUMENTATION = const HighlightType('COMMENT_DOCUMENTATION'); |
- static const HighlightType COMMENT_END_OF_LINE = const HighlightType('COMMENT_END_OF_LINE'); |
- static const HighlightType CONSTRUCTOR = const HighlightType('CONSTRUCTOR'); |
- static const HighlightType DIRECTIVE = const HighlightType('DIRECTIVE'); |
- static const HighlightType DYNAMIC_TYPE = const HighlightType('DYNAMIC_TYPE'); |
- static const HighlightType FIELD = const HighlightType('FIELD'); |
- static const HighlightType FIELD_STATIC = const HighlightType('FIELD_STATIC'); |
- static const HighlightType FUNCTION_DECLARATION = const HighlightType('FUNCTION_DECLARATION'); |
- static const HighlightType FUNCTION = const HighlightType('FUNCTION'); |
- static const HighlightType FUNCTION_TYPE_ALIAS = const HighlightType('FUNCTION_TYPE_ALIAS'); |
- static const HighlightType GETTER_DECLARATION = const HighlightType('GETTER_DECLARATION'); |
- static const HighlightType KEYWORD = const HighlightType('KEYWORD'); |
- static const HighlightType IDENTIFIER_DEFAULT = const HighlightType('IDENTIFIER_DEFAULT'); |
- static const HighlightType IMPORT_PREFIX = const HighlightType('IMPORT_PREFIX'); |
- static const HighlightType LITERAL_BOOLEAN = const HighlightType('LITERAL_BOOLEAN'); |
- static const HighlightType LITERAL_DOUBLE = const HighlightType('LITERAL_DOUBLE'); |
- static const HighlightType LITERAL_INTEGER = const HighlightType('LITERAL_INTEGER'); |
- static const HighlightType LITERAL_LIST = const HighlightType('LITERAL_LIST'); |
- static const HighlightType LITERAL_MAP = const HighlightType('LITERAL_MAP'); |
- static const HighlightType LITERAL_STRING = const HighlightType('LITERAL_STRING'); |
- static const HighlightType LOCAL_VARIABLE_DECLARATION = const HighlightType('LOCAL_VARIABLE_DECLARATION'); |
- static const HighlightType LOCAL_VARIABLE = const HighlightType('LOCAL_VARIABLE'); |
- static const HighlightType METHOD_DECLARATION = const HighlightType('METHOD_DECLARATION'); |
- static const HighlightType METHOD_DECLARATION_STATIC = const HighlightType('METHOD_DECLARATION_STATIC'); |
- static const HighlightType METHOD = const HighlightType('METHOD'); |
- static const HighlightType METHOD_STATIC = const HighlightType('METHOD_STATIC'); |
- static const HighlightType PARAMETER = const HighlightType('PARAMETER'); |
- static const HighlightType SETTER_DECLARATION = const HighlightType('SETTER_DECLARATION'); |
- static const HighlightType TOP_LEVEL_VARIABLE = const HighlightType('TOP_LEVEL_VARIABLE'); |
- static const HighlightType TYPE_NAME_DYNAMIC = const HighlightType('TYPE_NAME_DYNAMIC'); |
- static const HighlightType TYPE_PARAMETER = const HighlightType('TYPE_PARAMETER'); |
- |
- final String name; |
- |
- const HighlightType(this.name); |
-} |