Chromium Code Reviews| Index: pkg/analysis_server/lib/src/computer/computer_outline.dart |
| diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart |
| index c37192b5cbc0f2d760f1bdaff9903e14caddb150..8b55cd302b99bb8fa36b1f473ed8a6ff9917a8c3 100644 |
| --- a/pkg/analysis_server/lib/src/computer/computer_outline.dart |
| +++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart |
| @@ -4,10 +4,7 @@ |
| library computer.outline; |
| -import 'package:analysis_server/src/computer/element.dart'; |
| -import 'package:analysis_server/src/constants.dart'; |
| -import 'package:analysis_server/src/protocol2.dart' show ElementKind; |
| -import 'package:analysis_server/src/services/json.dart'; |
| +import 'package:analysis_server/src/protocol2.dart'; |
| import 'package:analyzer/src/generated/ast.dart'; |
| import 'package:analyzer/src/generated/element.dart' as engine; |
| import 'package:analyzer/src/generated/engine.dart'; |
| @@ -31,15 +28,15 @@ class DartUnitOutlineComputer { |
| * Returns the computed outline, not `null`. |
| */ |
| Outline compute() { |
| - Outline unitOutline = _newUnitOutline(); |
| + List<Outline> unitContents = <Outline>[]; |
| for (CompilationUnitMember unitMember in _unit.declarations) { |
| if (unitMember is ClassDeclaration) { |
| ClassDeclaration classDeclaration = unitMember; |
| - Outline classOutline = _newClassOutline(unitOutline, classDeclaration); |
| + List<Outline> classContents = <Outline>[]; |
| for (ClassMember classMember in classDeclaration.members) { |
| if (classMember is ConstructorDeclaration) { |
| ConstructorDeclaration constructorDeclaration = classMember; |
| - _newConstructorOutline(classOutline, constructorDeclaration); |
| + classContents.add(_newConstructorOutline(constructorDeclaration)); |
| } |
| if (classMember is FieldDeclaration) { |
| FieldDeclaration fieldDeclaration = classMember; |
| @@ -49,16 +46,17 @@ class DartUnitOutlineComputer { |
| String fieldTypeName = fieldType != null ? fieldType.toSource() : |
| ''; |
| for (VariableDeclaration field in fields.variables) { |
| - _newVariableOutline(classOutline, fieldTypeName, |
| - ElementKind.FIELD, field, fieldDeclaration.isStatic); |
| + classContents.add(_newVariableOutline(fieldTypeName, |
| + ElementKind.FIELD, field, fieldDeclaration.isStatic)); |
| } |
| } |
| } |
| if (classMember is MethodDeclaration) { |
| MethodDeclaration methodDeclaration = classMember; |
| - _newMethodOutline(classOutline, methodDeclaration); |
| + classContents.add(_newMethodOutline(methodDeclaration)); |
| } |
| } |
| + unitContents.add(_newClassOutline(classDeclaration, classContents)); |
| } |
| if (unitMember is TopLevelVariableDeclaration) { |
| TopLevelVariableDeclaration fieldDeclaration = unitMember; |
| @@ -67,29 +65,32 @@ class DartUnitOutlineComputer { |
| TypeName fieldType = fields.type; |
| String fieldTypeName = fieldType != null ? fieldType.toSource() : ''; |
| for (VariableDeclaration field in fields.variables) { |
| - _newVariableOutline(unitOutline, fieldTypeName, |
| - ElementKind.TOP_LEVEL_VARIABLE, field, false); |
| + unitContents.add(_newVariableOutline(fieldTypeName, |
| + ElementKind.TOP_LEVEL_VARIABLE, field, false)); |
| } |
| } |
| } |
| if (unitMember is FunctionDeclaration) { |
| FunctionDeclaration functionDeclaration = unitMember; |
| - _newFunctionOutline(unitOutline, functionDeclaration, true); |
| + unitContents.add(_newFunctionOutline(functionDeclaration, true)); |
| } |
| if (unitMember is ClassTypeAlias) { |
| ClassTypeAlias alias = unitMember; |
| - _newClassTypeAlias(unitOutline, alias); |
| + unitContents.add(_newClassTypeAlias(alias)); |
| } |
| if (unitMember is FunctionTypeAlias) { |
| FunctionTypeAlias alias = unitMember; |
| - _newFunctionTypeAliasOutline(unitOutline, alias); |
| + unitContents.add(_newFunctionTypeAliasOutline(alias)); |
| } |
| } |
| + Outline unitOutline = _newUnitOutline(unitContents); |
| return unitOutline; |
| } |
| - void _addLocalFunctionOutlines(Outline parent, FunctionBody body) { |
| - body.accept(new _LocalFunctionOutlinesVisitor(this, parent)); |
| + List<Outline> _addLocalFunctionOutlines(FunctionBody body) { |
| + List<Outline> contents = <Outline>[]; |
| + body.accept(new _LocalFunctionOutlinesVisitor(this, contents)); |
| + return contents; |
| } |
| Location _getLocationNode(AstNode node) { |
| @@ -152,33 +153,34 @@ class DartUnitOutlineComputer { |
| return new _SourceRegion(prevSiblingEnd, endOffset - prevSiblingEnd); |
| } |
| - Outline _newClassOutline(Outline parent, ClassDeclaration classDeclaration) { |
| + Outline _newClassOutline(ClassDeclaration classDeclaration, |
| + List<Outline> classContents) { |
| SimpleIdentifier nameNode = classDeclaration.name; |
| String name = nameNode.name; |
| _SourceRegion sourceRegion = _getSourceRegion(classDeclaration); |
| - Element element = new Element(ElementKind.CLASS, name, _getLocationNode( |
| - nameNode), Identifier.isPrivateName(name), _isDeprecated(classDeclaration), |
| - isAbstract: classDeclaration.isAbstract); |
| - Outline outline = new Outline(element, sourceRegion.offset, |
| - sourceRegion.length); |
| - parent.children.add(outline); |
| - return outline; |
| + Element element = new Element(ElementKind.CLASS, name, |
| + Element.makeFlags(isPrivate: Identifier.isPrivateName(name), |
| + isDeprecated: _isDeprecated(classDeclaration), |
| + isAbstract: classDeclaration.isAbstract), |
| + location: _getLocationNode(nameNode)); |
| + return new Outline(element, sourceRegion.offset, |
| + sourceRegion.length, |
| + children: classContents.isNotEmpty ? classContents : null); |
|
scheglov
2014/08/21 18:03:22
Do we already use null instead of empty lists?
Sho
Paul Berry
2014/08/21 20:00:44
Ok, I'll look into this in a future CL.
|
| } |
| - void _newClassTypeAlias(Outline parent, ClassTypeAlias alias) { |
| + Outline _newClassTypeAlias(ClassTypeAlias alias) { |
| SimpleIdentifier nameNode = alias.name; |
| String name = nameNode.name; |
| _SourceRegion sourceRegion = _getSourceRegion(alias); |
| Element element = new Element(ElementKind.CLASS_TYPE_ALIAS, name, |
| - _getLocationNode(nameNode), Identifier.isPrivateName(name), _isDeprecated( |
| - alias), isAbstract: alias.isAbstract); |
| - Outline outline = new Outline(element, sourceRegion.offset, |
| + Element.makeFlags(isPrivate: Identifier.isPrivateName(name), |
| + isDeprecated: _isDeprecated(alias), isAbstract: alias.isAbstract), |
| + location: _getLocationNode(nameNode)); |
| + return new Outline(element, sourceRegion.offset, |
| sourceRegion.length); |
| - parent.children.add(outline); |
| } |
| - void _newConstructorOutline(Outline parent, |
| - ConstructorDeclaration constructor) { |
| + Outline _newConstructorOutline(ConstructorDeclaration constructor) { |
| Identifier returnType = constructor.returnType; |
| String name = returnType.name; |
| int offset = returnType.offset; |
| @@ -196,16 +198,17 @@ class DartUnitOutlineComputer { |
| FormalParameterList parameters = constructor.parameters; |
| String parametersStr = parameters != null ? parameters.toSource() : ''; |
| Element element = new Element(ElementKind.CONSTRUCTOR, name, |
| - _getLocationOffsetLength(offset, length), isPrivate, _isDeprecated(constructor), |
| + Element.makeFlags(isPrivate: isPrivate, |
| + isDeprecated: _isDeprecated(constructor)), |
| + location: _getLocationOffsetLength(offset, length), |
| parameters: parametersStr); |
| + List<Outline> contents = _addLocalFunctionOutlines(constructor.body); |
| Outline outline = new Outline(element, sourceRegion.offset, |
| - sourceRegion.length); |
| - parent.children.add(outline); |
| - _addLocalFunctionOutlines(outline, constructor.body); |
| + sourceRegion.length, children: contents.isNotEmpty ? contents : null); |
| + return outline; |
| } |
| - void _newFunctionOutline(Outline parent, FunctionDeclaration function, |
| - bool isStatic) { |
| + Outline _newFunctionOutline(FunctionDeclaration function, bool isStatic) { |
| TypeName returnType = function.returnType; |
| SimpleIdentifier nameNode = function.name; |
| String name = nameNode.name; |
| @@ -222,16 +225,18 @@ class DartUnitOutlineComputer { |
| _SourceRegion sourceRegion = _getSourceRegion(function); |
| String parametersStr = parameters != null ? parameters.toSource() : ''; |
| String returnTypeStr = returnType != null ? returnType.toSource() : ''; |
| - Element element = new Element(kind, name, _getLocationNode(nameNode), |
| - Identifier.isPrivateName(name), _isDeprecated(function), parameters: |
| - parametersStr, returnType: returnTypeStr, isStatic: isStatic); |
| + Element element = new Element(kind, name, |
| + Element.makeFlags(isPrivate: Identifier.isPrivateName(name), |
| + isDeprecated: _isDeprecated(function), isStatic: isStatic), |
| + location: _getLocationNode(nameNode), parameters: parametersStr, |
| + returnType: returnTypeStr); |
| + List<Outline> contents = _addLocalFunctionOutlines(functionExpression.body); |
| Outline outline = new Outline(element, sourceRegion.offset, |
| - sourceRegion.length); |
| - parent.children.add(outline); |
| - _addLocalFunctionOutlines(outline, functionExpression.body); |
| + sourceRegion.length, children: contents.isNotEmpty ? contents : null); |
| + return outline; |
| } |
| - void _newFunctionTypeAliasOutline(Outline parent, FunctionTypeAlias alias) { |
| + Outline _newFunctionTypeAliasOutline(FunctionTypeAlias alias) { |
| TypeName returnType = alias.returnType; |
| SimpleIdentifier nameNode = alias.name; |
| String name = nameNode.name; |
| @@ -240,14 +245,15 @@ class DartUnitOutlineComputer { |
| String parametersStr = parameters != null ? parameters.toSource() : ''; |
| String returnTypeStr = returnType != null ? returnType.toSource() : ''; |
| Element element = new Element(ElementKind.FUNCTION_TYPE_ALIAS, name, |
| - _getLocationNode(nameNode), Identifier.isPrivateName(name), _isDeprecated( |
| - alias), parameters: parametersStr, returnType: returnTypeStr); |
| - Outline outline = new Outline(element, sourceRegion.offset, |
| + Element.makeFlags(isPrivate: Identifier.isPrivateName(name), |
| + isDeprecated: _isDeprecated(alias)), |
| + location: _getLocationNode(nameNode), parameters: parametersStr, |
| + returnType: returnTypeStr); |
| + return new Outline(element, sourceRegion.offset, |
| sourceRegion.length); |
| - parent.children.add(outline); |
| } |
| - void _newMethodOutline(Outline parent, MethodDeclaration method) { |
| + Outline _newMethodOutline(MethodDeclaration method) { |
| TypeName returnType = method.returnType; |
| SimpleIdentifier nameNode = method.name; |
| String name = nameNode.name; |
| @@ -263,33 +269,38 @@ class DartUnitOutlineComputer { |
| _SourceRegion sourceRegion = _getSourceRegion(method); |
| String parametersStr = parameters != null ? parameters.toSource() : ''; |
| String returnTypeStr = returnType != null ? returnType.toSource() : ''; |
| - Element element = new Element(kind, name, _getLocationNode(nameNode), |
| - Identifier.isPrivateName(name), _isDeprecated(method), parameters: |
| - parametersStr, returnType: returnTypeStr, isAbstract: method.isAbstract, |
| - isStatic: method.isStatic); |
| + Element element = new Element(kind, name, |
| + Element.makeFlags(isPrivate: Identifier.isPrivateName(name), |
| + isDeprecated: _isDeprecated(method), isAbstract: method.isAbstract, |
| + isStatic: method.isStatic), location: _getLocationNode(nameNode), |
| + parameters: parametersStr, returnType: returnTypeStr); |
| + List<Outline> contents = _addLocalFunctionOutlines(method.body); |
| Outline outline = new Outline(element, sourceRegion.offset, |
| - sourceRegion.length); |
| - parent.children.add(outline); |
| - _addLocalFunctionOutlines(outline, method.body); |
| + sourceRegion.length, children: contents.isNotEmpty ? contents : null); |
| + return outline; |
| } |
| - Outline _newUnitOutline() { |
| + Outline _newUnitOutline(List<Outline> unitContents) { |
| Element element = new Element(ElementKind.COMPILATION_UNIT, '<unit>', |
| - _getLocationNode(_unit), false, false); |
| - return new Outline(element, _unit.offset, _unit.length); |
| + Element.makeFlags(), location: _getLocationNode(_unit)); |
| + return new Outline(element, _unit.offset, _unit.length, |
| + children: unitContents.isNotEmpty ? unitContents : null); |
| } |
| - void _newVariableOutline(Outline parent, String typeName, ElementKind kind, |
| + Outline _newVariableOutline(String typeName, ElementKind kind, |
| VariableDeclaration variable, bool isStatic) { |
| SimpleIdentifier nameNode = variable.name; |
| String name = nameNode.name; |
| _SourceRegion sourceRegion = _getSourceRegion(variable); |
| - Element element = new Element(kind, name, _getLocationNode(nameNode), |
| - Identifier.isPrivateName(name), _isDeprecated(variable), returnType: typeName, |
| - isStatic: isStatic, isConst: variable.isConst, isFinal: variable.isFinal); |
| + Element element = new Element(kind, name, |
| + Element.makeFlags(isPrivate: Identifier.isPrivateName(name), |
| + isDeprecated: _isDeprecated(variable), |
| + isStatic: isStatic, isConst: variable.isConst, |
| + isFinal: variable.isFinal), location: _getLocationNode(nameNode), |
| + returnType: typeName); |
| Outline outline = new Outline(element, sourceRegion.offset, |
| sourceRegion.length); |
| - parent.children.add(outline); |
| + return outline; |
| } |
| /** |
| @@ -303,74 +314,17 @@ class DartUnitOutlineComputer { |
| /** |
| - * An element outline. |
| - */ |
| -class Outline implements HasToJson { |
| - static const List<Outline> EMPTY_ARRAY = const <Outline>[]; |
| - |
| - /** |
| - * The children of the node. |
| - * The field will be omitted in JSON if the node has no children. |
| - */ |
| - final List<Outline> children = <Outline>[]; |
| - |
| - /** |
| - * A description of the element represented by this node. |
| - */ |
| - final Element element; |
| - |
| - /** |
| - * The length of the element. |
| - */ |
| - final int length; |
| - |
| - /** |
| - * The offset of the first character of the element. |
| - */ |
| - final int offset; |
| - |
| - Outline(this.element, this.offset, this.length); |
| - |
| - factory Outline.fromJson(Map<String, Object> map) { |
| - Element element = new Element.fromJson(map[ELEMENT]); |
| - Outline outline = new Outline(element, map[OFFSET], map[LENGTH]); |
| - // add children |
| - List<Map<String, Object>> childrenMaps = map[CHILDREN]; |
| - if (childrenMaps != null) { |
| - childrenMaps.forEach((childMap) { |
| - outline.children.add(new Outline.fromJson(childMap)); |
| - }); |
| - } |
| - // done |
| - return outline; |
| - } |
| - |
| - Map<String, Object> toJson() { |
| - Map<String, Object> json = { |
| - ELEMENT: element.toJson(), |
| - OFFSET: offset, |
| - LENGTH: length |
| - }; |
| - if (children.isNotEmpty) { |
| - json[CHILDREN] = children.map((child) => child.toJson()).toList(); |
| - } |
| - return json; |
| - } |
| -} |
| - |
| - |
| -/** |
| * A visitor for building local function outlines. |
| */ |
| class _LocalFunctionOutlinesVisitor extends RecursiveAstVisitor { |
| final DartUnitOutlineComputer outlineComputer; |
| - final Outline parent; |
| + final List<Outline> contents; |
| - _LocalFunctionOutlinesVisitor(this.outlineComputer, this.parent); |
| + _LocalFunctionOutlinesVisitor(this.outlineComputer, this.contents); |
| @override |
| visitFunctionDeclaration(FunctionDeclaration node) { |
| - outlineComputer._newFunctionOutline(parent, node, false); |
| + contents.add(outlineComputer._newFunctionOutline(node, false)); |
| } |
| } |