| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library computer.outline; | 5 library computer.outline; |
| 6 | 6 |
| 7 import 'package:analysis_server/src/collections.dart'; | 7 import 'package:analysis_server/src/collections.dart'; |
| 8 import 'package:analysis_server/src/protocol.dart'; | 8 import 'package:analysis_server/src/protocol.dart'; |
| 9 import 'package:analyzer/src/generated/ast.dart'; | 9 import 'package:analyzer/src/generated/ast.dart'; |
| 10 import 'package:analyzer/src/generated/element.dart' as engine; | 10 import 'package:analyzer/src/generated/element.dart' as engine; |
| 11 import 'package:analyzer/src/generated/source.dart'; | 11 import 'package:analyzer/src/generated/source.dart'; |
| 12 | 12 |
| 13 | |
| 14 /** | 13 /** |
| 15 * A computer for [CompilationUnit] outline. | 14 * A computer for [CompilationUnit] outline. |
| 16 */ | 15 */ |
| 17 class DartUnitOutlineComputer { | 16 class DartUnitOutlineComputer { |
| 18 final String file; | 17 final String file; |
| 19 final CompilationUnit unit; | 18 final CompilationUnit unit; |
| 20 final LineInfo lineInfo; | 19 final LineInfo lineInfo; |
| 21 | 20 |
| 22 DartUnitOutlineComputer(this.file, this.lineInfo, this.unit); | 21 DartUnitOutlineComputer(this.file, this.lineInfo, this.unit); |
| 23 | 22 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 36 classContents.add(_newConstructorOutline(constructorDeclaration)); | 35 classContents.add(_newConstructorOutline(constructorDeclaration)); |
| 37 } | 36 } |
| 38 if (classMember is FieldDeclaration) { | 37 if (classMember is FieldDeclaration) { |
| 39 FieldDeclaration fieldDeclaration = classMember; | 38 FieldDeclaration fieldDeclaration = classMember; |
| 40 VariableDeclarationList fields = fieldDeclaration.fields; | 39 VariableDeclarationList fields = fieldDeclaration.fields; |
| 41 if (fields != null) { | 40 if (fields != null) { |
| 42 TypeName fieldType = fields.type; | 41 TypeName fieldType = fields.type; |
| 43 String fieldTypeName = | 42 String fieldTypeName = |
| 44 fieldType != null ? fieldType.toSource() : ''; | 43 fieldType != null ? fieldType.toSource() : ''; |
| 45 for (VariableDeclaration field in fields.variables) { | 44 for (VariableDeclaration field in fields.variables) { |
| 46 classContents.add( | 45 classContents.add(_newVariableOutline(fieldTypeName, |
| 47 _newVariableOutline( | 46 ElementKind.FIELD, field, fieldDeclaration.isStatic)); |
| 48 fieldTypeName, | |
| 49 ElementKind.FIELD, | |
| 50 field, | |
| 51 fieldDeclaration.isStatic)); | |
| 52 } | 47 } |
| 53 } | 48 } |
| 54 } | 49 } |
| 55 if (classMember is MethodDeclaration) { | 50 if (classMember is MethodDeclaration) { |
| 56 MethodDeclaration methodDeclaration = classMember; | 51 MethodDeclaration methodDeclaration = classMember; |
| 57 classContents.add(_newMethodOutline(methodDeclaration)); | 52 classContents.add(_newMethodOutline(methodDeclaration)); |
| 58 } | 53 } |
| 59 } | 54 } |
| 60 unitContents.add(_newClassOutline(classDeclaration, classContents)); | 55 unitContents.add(_newClassOutline(classDeclaration, classContents)); |
| 61 } | 56 } |
| 62 if (unitMember is EnumDeclaration) { | 57 if (unitMember is EnumDeclaration) { |
| 63 EnumDeclaration enumDeclaration = unitMember; | 58 EnumDeclaration enumDeclaration = unitMember; |
| 64 List<Outline> constantOutlines = <Outline>[]; | 59 List<Outline> constantOutlines = <Outline>[]; |
| 65 for (EnumConstantDeclaration constant in enumDeclaration.constants) { | 60 for (EnumConstantDeclaration constant in enumDeclaration.constants) { |
| 66 constantOutlines.add(_newEnumConstant(constant)); | 61 constantOutlines.add(_newEnumConstant(constant)); |
| 67 } | 62 } |
| 68 unitContents.add(_newEnumOutline(enumDeclaration, constantOutlines)); | 63 unitContents.add(_newEnumOutline(enumDeclaration, constantOutlines)); |
| 69 } | 64 } |
| 70 if (unitMember is TopLevelVariableDeclaration) { | 65 if (unitMember is TopLevelVariableDeclaration) { |
| 71 TopLevelVariableDeclaration fieldDeclaration = unitMember; | 66 TopLevelVariableDeclaration fieldDeclaration = unitMember; |
| 72 VariableDeclarationList fields = fieldDeclaration.variables; | 67 VariableDeclarationList fields = fieldDeclaration.variables; |
| 73 if (fields != null) { | 68 if (fields != null) { |
| 74 TypeName fieldType = fields.type; | 69 TypeName fieldType = fields.type; |
| 75 String fieldTypeName = fieldType != null ? fieldType.toSource() : ''; | 70 String fieldTypeName = fieldType != null ? fieldType.toSource() : ''; |
| 76 for (VariableDeclaration field in fields.variables) { | 71 for (VariableDeclaration field in fields.variables) { |
| 77 unitContents.add( | 72 unitContents.add(_newVariableOutline( |
| 78 _newVariableOutline( | 73 fieldTypeName, ElementKind.TOP_LEVEL_VARIABLE, field, false)); |
| 79 fieldTypeName, | |
| 80 ElementKind.TOP_LEVEL_VARIABLE, | |
| 81 field, | |
| 82 false)); | |
| 83 } | 74 } |
| 84 } | 75 } |
| 85 } | 76 } |
| 86 if (unitMember is FunctionDeclaration) { | 77 if (unitMember is FunctionDeclaration) { |
| 87 FunctionDeclaration functionDeclaration = unitMember; | 78 FunctionDeclaration functionDeclaration = unitMember; |
| 88 unitContents.add(_newFunctionOutline(functionDeclaration, true)); | 79 unitContents.add(_newFunctionOutline(functionDeclaration, true)); |
| 89 } | 80 } |
| 90 if (unitMember is ClassTypeAlias) { | 81 if (unitMember is ClassTypeAlias) { |
| 91 ClassTypeAlias alias = unitMember; | 82 ClassTypeAlias alias = unitMember; |
| 92 unitContents.add(_newClassTypeAlias(alias)); | 83 unitContents.add(_newClassTypeAlias(alias)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 // first child: [endOfParent, endOfNode] | 150 // first child: [endOfParent, endOfNode] |
| 160 int index = siblings.indexOf(node); | 151 int index = siblings.indexOf(node); |
| 161 if (index == 0) { | 152 if (index == 0) { |
| 162 return new _SourceRegion(firstOffset, endOffset - firstOffset); | 153 return new _SourceRegion(firstOffset, endOffset - firstOffset); |
| 163 } | 154 } |
| 164 // not first child: [endOfPreviousSibling, endOfNode] | 155 // not first child: [endOfPreviousSibling, endOfNode] |
| 165 int prevSiblingEnd = siblings[index - 1].end; | 156 int prevSiblingEnd = siblings[index - 1].end; |
| 166 return new _SourceRegion(prevSiblingEnd, endOffset - prevSiblingEnd); | 157 return new _SourceRegion(prevSiblingEnd, endOffset - prevSiblingEnd); |
| 167 } | 158 } |
| 168 | 159 |
| 169 Outline _newClassOutline(ClassDeclaration classDeclaration, | 160 Outline _newClassOutline( |
| 170 List<Outline> classContents) { | 161 ClassDeclaration classDeclaration, List<Outline> classContents) { |
| 171 SimpleIdentifier nameNode = classDeclaration.name; | 162 SimpleIdentifier nameNode = classDeclaration.name; |
| 172 String name = nameNode.name; | 163 String name = nameNode.name; |
| 173 _SourceRegion sourceRegion = _getSourceRegion(classDeclaration); | 164 _SourceRegion sourceRegion = _getSourceRegion(classDeclaration); |
| 174 Element element = new Element( | 165 Element element = new Element(ElementKind.CLASS, name, Element.makeFlags( |
| 175 ElementKind.CLASS, | |
| 176 name, | |
| 177 Element.makeFlags( | |
| 178 isPrivate: Identifier.isPrivateName(name), | 166 isPrivate: Identifier.isPrivateName(name), |
| 179 isDeprecated: _isDeprecated(classDeclaration), | 167 isDeprecated: _isDeprecated(classDeclaration), |
| 180 isAbstract: classDeclaration.isAbstract), | 168 isAbstract: classDeclaration.isAbstract), |
| 181 location: _getLocationNode(nameNode)); | 169 location: _getLocationNode(nameNode)); |
| 182 return new Outline( | 170 return new Outline(element, sourceRegion.offset, sourceRegion.length, |
| 183 element, | |
| 184 sourceRegion.offset, | |
| 185 sourceRegion.length, | |
| 186 children: nullIfEmpty(classContents)); | 171 children: nullIfEmpty(classContents)); |
| 187 } | 172 } |
| 188 | 173 |
| 189 Outline _newClassTypeAlias(ClassTypeAlias alias) { | 174 Outline _newClassTypeAlias(ClassTypeAlias alias) { |
| 190 SimpleIdentifier nameNode = alias.name; | 175 SimpleIdentifier nameNode = alias.name; |
| 191 String name = nameNode.name; | 176 String name = nameNode.name; |
| 192 _SourceRegion sourceRegion = _getSourceRegion(alias); | 177 _SourceRegion sourceRegion = _getSourceRegion(alias); |
| 193 Element element = new Element( | 178 Element element = new Element(ElementKind.CLASS_TYPE_ALIAS, name, Element |
| 194 ElementKind.CLASS_TYPE_ALIAS, | 179 .makeFlags( |
| 195 name, | 180 isPrivate: Identifier.isPrivateName(name), |
| 196 Element.makeFlags( | 181 isDeprecated: _isDeprecated(alias), |
| 197 isPrivate: Identifier.isPrivateName(name), | 182 isAbstract: alias.isAbstract), |
| 198 isDeprecated: _isDeprecated(alias), | |
| 199 isAbstract: alias.isAbstract), | |
| 200 location: _getLocationNode(nameNode)); | 183 location: _getLocationNode(nameNode)); |
| 201 return new Outline(element, sourceRegion.offset, sourceRegion.length); | 184 return new Outline(element, sourceRegion.offset, sourceRegion.length); |
| 202 } | 185 } |
| 203 | 186 |
| 204 Outline _newConstructorOutline(ConstructorDeclaration constructor) { | 187 Outline _newConstructorOutline(ConstructorDeclaration constructor) { |
| 205 Identifier returnType = constructor.returnType; | 188 Identifier returnType = constructor.returnType; |
| 206 String name = returnType.name; | 189 String name = returnType.name; |
| 207 int offset = returnType.offset; | 190 int offset = returnType.offset; |
| 208 int length = returnType.length; | 191 int length = returnType.length; |
| 209 SimpleIdentifier constructorNameNode = constructor.name; | 192 SimpleIdentifier constructorNameNode = constructor.name; |
| 210 bool isPrivate = false; | 193 bool isPrivate = false; |
| 211 if (constructorNameNode != null) { | 194 if (constructorNameNode != null) { |
| 212 String constructorName = constructorNameNode.name; | 195 String constructorName = constructorNameNode.name; |
| 213 isPrivate = Identifier.isPrivateName(constructorName); | 196 isPrivate = Identifier.isPrivateName(constructorName); |
| 214 name += '.${constructorName}'; | 197 name += '.${constructorName}'; |
| 215 offset = constructorNameNode.offset; | 198 offset = constructorNameNode.offset; |
| 216 length = constructorNameNode.length; | 199 length = constructorNameNode.length; |
| 217 } | 200 } |
| 218 _SourceRegion sourceRegion = _getSourceRegion(constructor); | 201 _SourceRegion sourceRegion = _getSourceRegion(constructor); |
| 219 FormalParameterList parameters = constructor.parameters; | 202 FormalParameterList parameters = constructor.parameters; |
| 220 String parametersStr = parameters != null ? parameters.toSource() : ''; | 203 String parametersStr = parameters != null ? parameters.toSource() : ''; |
| 221 Element element = new Element( | 204 Element element = new Element(ElementKind.CONSTRUCTOR, name, Element |
| 222 ElementKind.CONSTRUCTOR, | 205 .makeFlags( |
| 223 name, | 206 isPrivate: isPrivate, isDeprecated: _isDeprecated(constructor)), |
| 224 Element.makeFlags( | |
| 225 isPrivate: isPrivate, | |
| 226 isDeprecated: _isDeprecated(constructor)), | |
| 227 location: _getLocationOffsetLength(offset, length), | 207 location: _getLocationOffsetLength(offset, length), |
| 228 parameters: parametersStr); | 208 parameters: parametersStr); |
| 229 List<Outline> contents = _addLocalFunctionOutlines(constructor.body); | 209 List<Outline> contents = _addLocalFunctionOutlines(constructor.body); |
| 230 Outline outline = new Outline( | 210 Outline outline = new Outline( |
| 231 element, | 211 element, sourceRegion.offset, sourceRegion.length, |
| 232 sourceRegion.offset, | |
| 233 sourceRegion.length, | |
| 234 children: nullIfEmpty(contents)); | 212 children: nullIfEmpty(contents)); |
| 235 return outline; | 213 return outline; |
| 236 } | 214 } |
| 237 | 215 |
| 238 Outline _newEnumConstant(EnumConstantDeclaration node) { | 216 Outline _newEnumConstant(EnumConstantDeclaration node) { |
| 239 SimpleIdentifier nameNode = node.name; | 217 SimpleIdentifier nameNode = node.name; |
| 240 String name = nameNode.name; | 218 String name = nameNode.name; |
| 241 _SourceRegion sourceRegion = _getSourceRegion(node); | 219 _SourceRegion sourceRegion = _getSourceRegion(node); |
| 242 Element element = new Element( | 220 Element element = new Element(ElementKind.ENUM_CONSTANT, name, Element |
| 243 ElementKind.ENUM_CONSTANT, | 221 .makeFlags( |
| 244 name, | 222 isPrivate: Identifier.isPrivateName(name), |
| 245 Element.makeFlags( | 223 isDeprecated: _isDeprecated(node)), |
| 246 isPrivate: Identifier.isPrivateName(name), | |
| 247 isDeprecated: _isDeprecated(node)), | |
| 248 location: _getLocationNode(nameNode)); | 224 location: _getLocationNode(nameNode)); |
| 249 return new Outline(element, sourceRegion.offset, sourceRegion.length); | 225 return new Outline(element, sourceRegion.offset, sourceRegion.length); |
| 250 } | 226 } |
| 251 | 227 |
| 252 Outline _newEnumOutline(EnumDeclaration node, List<Outline> children) { | 228 Outline _newEnumOutline(EnumDeclaration node, List<Outline> children) { |
| 253 SimpleIdentifier nameNode = node.name; | 229 SimpleIdentifier nameNode = node.name; |
| 254 String name = nameNode.name; | 230 String name = nameNode.name; |
| 255 _SourceRegion sourceRegion = _getSourceRegion(node); | 231 _SourceRegion sourceRegion = _getSourceRegion(node); |
| 256 Element element = new Element( | 232 Element element = new Element(ElementKind.ENUM, name, Element.makeFlags( |
| 257 ElementKind.ENUM, | |
| 258 name, | |
| 259 Element.makeFlags( | |
| 260 isPrivate: Identifier.isPrivateName(name), | 233 isPrivate: Identifier.isPrivateName(name), |
| 261 isDeprecated: _isDeprecated(node)), | 234 isDeprecated: _isDeprecated(node)), |
| 262 location: _getLocationNode(nameNode)); | 235 location: _getLocationNode(nameNode)); |
| 263 return new Outline( | 236 return new Outline(element, sourceRegion.offset, sourceRegion.length, |
| 264 element, | |
| 265 sourceRegion.offset, | |
| 266 sourceRegion.length, | |
| 267 children: nullIfEmpty(children)); | 237 children: nullIfEmpty(children)); |
| 268 } | 238 } |
| 269 | 239 |
| 270 Outline _newFunctionOutline(FunctionDeclaration function, bool isStatic) { | 240 Outline _newFunctionOutline(FunctionDeclaration function, bool isStatic) { |
| 271 TypeName returnType = function.returnType; | 241 TypeName returnType = function.returnType; |
| 272 SimpleIdentifier nameNode = function.name; | 242 SimpleIdentifier nameNode = function.name; |
| 273 String name = nameNode.name; | 243 String name = nameNode.name; |
| 274 FunctionExpression functionExpression = function.functionExpression; | 244 FunctionExpression functionExpression = function.functionExpression; |
| 275 FormalParameterList parameters = functionExpression.parameters; | 245 FormalParameterList parameters = functionExpression.parameters; |
| 276 ElementKind kind; | 246 ElementKind kind; |
| 277 if (function.isGetter) { | 247 if (function.isGetter) { |
| 278 kind = ElementKind.GETTER; | 248 kind = ElementKind.GETTER; |
| 279 } else if (function.isSetter) { | 249 } else if (function.isSetter) { |
| 280 kind = ElementKind.SETTER; | 250 kind = ElementKind.SETTER; |
| 281 } else { | 251 } else { |
| 282 kind = ElementKind.FUNCTION; | 252 kind = ElementKind.FUNCTION; |
| 283 } | 253 } |
| 284 _SourceRegion sourceRegion = _getSourceRegion(function); | 254 _SourceRegion sourceRegion = _getSourceRegion(function); |
| 285 String parametersStr = parameters != null ? parameters.toSource() : ''; | 255 String parametersStr = parameters != null ? parameters.toSource() : ''; |
| 286 String returnTypeStr = returnType != null ? returnType.toSource() : ''; | 256 String returnTypeStr = returnType != null ? returnType.toSource() : ''; |
| 287 Element element = new Element( | 257 Element element = new Element(kind, name, Element.makeFlags( |
| 288 kind, | |
| 289 name, | |
| 290 Element.makeFlags( | |
| 291 isPrivate: Identifier.isPrivateName(name), | 258 isPrivate: Identifier.isPrivateName(name), |
| 292 isDeprecated: _isDeprecated(function), | 259 isDeprecated: _isDeprecated(function), |
| 293 isStatic: isStatic), | 260 isStatic: isStatic), |
| 294 location: _getLocationNode(nameNode), | 261 location: _getLocationNode(nameNode), |
| 295 parameters: parametersStr, | 262 parameters: parametersStr, |
| 296 returnType: returnTypeStr); | 263 returnType: returnTypeStr); |
| 297 List<Outline> contents = _addLocalFunctionOutlines(functionExpression.body); | 264 List<Outline> contents = _addLocalFunctionOutlines(functionExpression.body); |
| 298 Outline outline = new Outline( | 265 Outline outline = new Outline( |
| 299 element, | 266 element, sourceRegion.offset, sourceRegion.length, |
| 300 sourceRegion.offset, | |
| 301 sourceRegion.length, | |
| 302 children: nullIfEmpty(contents)); | 267 children: nullIfEmpty(contents)); |
| 303 return outline; | 268 return outline; |
| 304 } | 269 } |
| 305 | 270 |
| 306 Outline _newFunctionTypeAliasOutline(FunctionTypeAlias alias) { | 271 Outline _newFunctionTypeAliasOutline(FunctionTypeAlias alias) { |
| 307 TypeName returnType = alias.returnType; | 272 TypeName returnType = alias.returnType; |
| 308 SimpleIdentifier nameNode = alias.name; | 273 SimpleIdentifier nameNode = alias.name; |
| 309 String name = nameNode.name; | 274 String name = nameNode.name; |
| 310 _SourceRegion sourceRegion = _getSourceRegion(alias); | 275 _SourceRegion sourceRegion = _getSourceRegion(alias); |
| 311 FormalParameterList parameters = alias.parameters; | 276 FormalParameterList parameters = alias.parameters; |
| 312 String parametersStr = parameters != null ? parameters.toSource() : ''; | 277 String parametersStr = parameters != null ? parameters.toSource() : ''; |
| 313 String returnTypeStr = returnType != null ? returnType.toSource() : ''; | 278 String returnTypeStr = returnType != null ? returnType.toSource() : ''; |
| 314 Element element = new Element( | 279 Element element = new Element(ElementKind.FUNCTION_TYPE_ALIAS, name, Element |
| 315 ElementKind.FUNCTION_TYPE_ALIAS, | 280 .makeFlags( |
| 316 name, | 281 isPrivate: Identifier.isPrivateName(name), |
| 317 Element.makeFlags( | 282 isDeprecated: _isDeprecated(alias)), |
| 318 isPrivate: Identifier.isPrivateName(name), | |
| 319 isDeprecated: _isDeprecated(alias)), | |
| 320 location: _getLocationNode(nameNode), | 283 location: _getLocationNode(nameNode), |
| 321 parameters: parametersStr, | 284 parameters: parametersStr, |
| 322 returnType: returnTypeStr); | 285 returnType: returnTypeStr); |
| 323 return new Outline(element, sourceRegion.offset, sourceRegion.length); | 286 return new Outline(element, sourceRegion.offset, sourceRegion.length); |
| 324 } | 287 } |
| 325 | 288 |
| 326 Outline _newMethodOutline(MethodDeclaration method) { | 289 Outline _newMethodOutline(MethodDeclaration method) { |
| 327 TypeName returnType = method.returnType; | 290 TypeName returnType = method.returnType; |
| 328 SimpleIdentifier nameNode = method.name; | 291 SimpleIdentifier nameNode = method.name; |
| 329 String name = nameNode.name; | 292 String name = nameNode.name; |
| 330 FormalParameterList parameters = method.parameters; | 293 FormalParameterList parameters = method.parameters; |
| 331 ElementKind kind; | 294 ElementKind kind; |
| 332 if (method.isGetter) { | 295 if (method.isGetter) { |
| 333 kind = ElementKind.GETTER; | 296 kind = ElementKind.GETTER; |
| 334 } else if (method.isSetter) { | 297 } else if (method.isSetter) { |
| 335 kind = ElementKind.SETTER; | 298 kind = ElementKind.SETTER; |
| 336 } else { | 299 } else { |
| 337 kind = ElementKind.METHOD; | 300 kind = ElementKind.METHOD; |
| 338 } | 301 } |
| 339 _SourceRegion sourceRegion = _getSourceRegion(method); | 302 _SourceRegion sourceRegion = _getSourceRegion(method); |
| 340 String parametersStr = parameters != null ? parameters.toSource() : null; | 303 String parametersStr = parameters != null ? parameters.toSource() : null; |
| 341 String returnTypeStr = returnType != null ? returnType.toSource() : ''; | 304 String returnTypeStr = returnType != null ? returnType.toSource() : ''; |
| 342 Element element = new Element( | 305 Element element = new Element(kind, name, Element.makeFlags( |
| 343 kind, | |
| 344 name, | |
| 345 Element.makeFlags( | |
| 346 isPrivate: Identifier.isPrivateName(name), | 306 isPrivate: Identifier.isPrivateName(name), |
| 347 isDeprecated: _isDeprecated(method), | 307 isDeprecated: _isDeprecated(method), |
| 348 isAbstract: method.isAbstract, | 308 isAbstract: method.isAbstract, |
| 349 isStatic: method.isStatic), | 309 isStatic: method.isStatic), |
| 350 location: _getLocationNode(nameNode), | 310 location: _getLocationNode(nameNode), |
| 351 parameters: parametersStr, | 311 parameters: parametersStr, |
| 352 returnType: returnTypeStr); | 312 returnType: returnTypeStr); |
| 353 List<Outline> contents = _addLocalFunctionOutlines(method.body); | 313 List<Outline> contents = _addLocalFunctionOutlines(method.body); |
| 354 Outline outline = new Outline( | 314 Outline outline = new Outline( |
| 355 element, | 315 element, sourceRegion.offset, sourceRegion.length, |
| 356 sourceRegion.offset, | |
| 357 sourceRegion.length, | |
| 358 children: nullIfEmpty(contents)); | 316 children: nullIfEmpty(contents)); |
| 359 return outline; | 317 return outline; |
| 360 } | 318 } |
| 361 | 319 |
| 362 Outline _newUnitOutline(List<Outline> unitContents) { | 320 Outline _newUnitOutline(List<Outline> unitContents) { |
| 363 Element element = new Element( | 321 Element element = new Element( |
| 364 ElementKind.COMPILATION_UNIT, | 322 ElementKind.COMPILATION_UNIT, '<unit>', Element.makeFlags(), |
| 365 '<unit>', | |
| 366 Element.makeFlags(), | |
| 367 location: _getLocationNode(unit)); | 323 location: _getLocationNode(unit)); |
| 368 return new Outline( | 324 return new Outline(element, unit.offset, unit.length, |
| 369 element, | |
| 370 unit.offset, | |
| 371 unit.length, | |
| 372 children: nullIfEmpty(unitContents)); | 325 children: nullIfEmpty(unitContents)); |
| 373 } | 326 } |
| 374 | 327 |
| 375 Outline _newVariableOutline(String typeName, ElementKind kind, | 328 Outline _newVariableOutline(String typeName, ElementKind kind, |
| 376 VariableDeclaration variable, bool isStatic) { | 329 VariableDeclaration variable, bool isStatic) { |
| 377 SimpleIdentifier nameNode = variable.name; | 330 SimpleIdentifier nameNode = variable.name; |
| 378 String name = nameNode.name; | 331 String name = nameNode.name; |
| 379 _SourceRegion sourceRegion = _getSourceRegion(variable); | 332 _SourceRegion sourceRegion = _getSourceRegion(variable); |
| 380 Element element = new Element( | 333 Element element = new Element(kind, name, Element.makeFlags( |
| 381 kind, | |
| 382 name, | |
| 383 Element.makeFlags( | |
| 384 isPrivate: Identifier.isPrivateName(name), | 334 isPrivate: Identifier.isPrivateName(name), |
| 385 isDeprecated: _isDeprecated(variable), | 335 isDeprecated: _isDeprecated(variable), |
| 386 isStatic: isStatic, | 336 isStatic: isStatic, |
| 387 isConst: variable.isConst, | 337 isConst: variable.isConst, |
| 388 isFinal: variable.isFinal), | 338 isFinal: variable.isFinal), |
| 389 location: _getLocationNode(nameNode), | 339 location: _getLocationNode(nameNode), returnType: typeName); |
| 390 returnType: typeName); | |
| 391 Outline outline = | 340 Outline outline = |
| 392 new Outline(element, sourceRegion.offset, sourceRegion.length); | 341 new Outline(element, sourceRegion.offset, sourceRegion.length); |
| 393 return outline; | 342 return outline; |
| 394 } | 343 } |
| 395 | 344 |
| 396 /** | 345 /** |
| 397 * Returns `true` if the given [element] is not `null` and deprecated. | 346 * Returns `true` if the given [element] is not `null` and deprecated. |
| 398 */ | 347 */ |
| 399 static bool _isDeprecated(Declaration declaration) { | 348 static bool _isDeprecated(Declaration declaration) { |
| 400 engine.Element element = declaration.element; | 349 engine.Element element = declaration.element; |
| 401 return element != null && element.isDeprecated; | 350 return element != null && element.isDeprecated; |
| 402 } | 351 } |
| 403 } | 352 } |
| 404 | 353 |
| 405 | |
| 406 /** | 354 /** |
| 407 * A visitor for building local function outlines. | 355 * A visitor for building local function outlines. |
| 408 */ | 356 */ |
| 409 class _LocalFunctionOutlinesVisitor extends RecursiveAstVisitor { | 357 class _LocalFunctionOutlinesVisitor extends RecursiveAstVisitor { |
| 410 final DartUnitOutlineComputer outlineComputer; | 358 final DartUnitOutlineComputer outlineComputer; |
| 411 final List<Outline> contents; | 359 final List<Outline> contents; |
| 412 | 360 |
| 413 _LocalFunctionOutlinesVisitor(this.outlineComputer, this.contents); | 361 _LocalFunctionOutlinesVisitor(this.outlineComputer, this.contents); |
| 414 | 362 |
| 415 @override | 363 @override |
| 416 visitFunctionDeclaration(FunctionDeclaration node) { | 364 visitFunctionDeclaration(FunctionDeclaration node) { |
| 417 contents.add(outlineComputer._newFunctionOutline(node, false)); | 365 contents.add(outlineComputer._newFunctionOutline(node, false)); |
| 418 } | 366 } |
| 419 } | 367 } |
| 420 | 368 |
| 421 | |
| 422 /** | 369 /** |
| 423 * A range of characters. | 370 * A range of characters. |
| 424 */ | 371 */ |
| 425 class _SourceRegion { | 372 class _SourceRegion { |
| 426 final int length; | 373 final int length; |
| 427 final int offset; | 374 final int offset; |
| 428 _SourceRegion(this.offset, this.length); | 375 _SourceRegion(this.offset, this.length); |
| 429 } | 376 } |
| OLD | NEW |