| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:analyzer/dart/ast/ast.dart'; | 5 import 'package:analyzer/dart/ast/ast.dart'; |
| 6 import 'package:analyzer/dart/ast/token.dart'; | 6 import 'package:analyzer/dart/ast/token.dart'; |
| 7 import 'package:analyzer/dart/ast/visitor.dart'; | 7 import 'package:analyzer/dart/ast/visitor.dart'; |
| 8 import 'package:analyzer/dart/element/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
| 9 import 'package:analyzer/dart/element/type.dart'; | 9 import 'package:analyzer/dart/element/type.dart'; |
| 10 import 'package:analyzer/src/dart/element/member.dart'; | 10 import 'package:analyzer/src/dart/element/member.dart'; |
| 11 import 'package:analyzer/src/generated/utilities_dart.dart'; | 11 import 'package:analyzer/src/generated/utilities_dart.dart'; |
| 12 import 'package:analyzer/src/summary/format.dart'; | 12 import 'package:analyzer/src/summary/format.dart'; |
| 13 import 'package:analyzer/src/summary/idl.dart'; | 13 import 'package:analyzer/src/summary/idl.dart'; |
| 14 | 14 |
| 15 /** | 15 /** |
| 16 * Information about an element referenced in index. | 16 * Information about an element that is actually put into index for some other |
| 17 * related element. For example for a synthetic getter this is the corresponding |
| 18 * non-synthetic field and [IndexSyntheticElementKind.getter] as the [kind]. |
| 17 */ | 19 */ |
| 18 class ElementInfo { | 20 class IndexElementInfo { |
| 19 /** | 21 final Element element; |
| 20 * The identifier of the [CompilationUnitElement] containing this element. | |
| 21 */ | |
| 22 final int unitId; | |
| 23 | |
| 24 /** | |
| 25 * The name offset of the element. | |
| 26 */ | |
| 27 final int offset; | |
| 28 | |
| 29 /** | |
| 30 * The kind of the element. | |
| 31 */ | |
| 32 final IndexSyntheticElementKind kind; | 22 final IndexSyntheticElementKind kind; |
| 33 | 23 |
| 34 /** | 24 factory IndexElementInfo(Element element) { |
| 35 * The unique id of the element. It is set after indexing of the whole | 25 IndexSyntheticElementKind kind = IndexSyntheticElementKind.notSynthetic; |
| 36 * package is done and we are assembling the full package index. | 26 if (element.isSynthetic) { |
| 37 */ | 27 if (element is ConstructorElement) { |
| 38 int id; | 28 kind = IndexSyntheticElementKind.constructor; |
| 29 element = element.enclosingElement; |
| 30 } else if (element is FunctionElement && element.name == 'loadLibrary') { |
| 31 kind = IndexSyntheticElementKind.loadLibrary; |
| 32 element = element.library; |
| 33 } else if (element is FieldElement) { |
| 34 FieldElement field = element; |
| 35 kind = IndexSyntheticElementKind.field; |
| 36 element = field.getter; |
| 37 element ??= field.setter; |
| 38 } else if (element is PropertyAccessorElement) { |
| 39 PropertyAccessorElement accessor = element; |
| 40 Element enclosing = element.enclosingElement; |
| 41 bool isEnumGetter = enclosing is ClassElement && enclosing.isEnum; |
| 42 if (isEnumGetter && accessor.name == 'index') { |
| 43 kind = IndexSyntheticElementKind.enumIndex; |
| 44 element = enclosing; |
| 45 } else if (isEnumGetter && accessor.name == 'values') { |
| 46 kind = IndexSyntheticElementKind.enumValues; |
| 47 element = enclosing; |
| 48 } else { |
| 49 kind = accessor.isGetter |
| 50 ? IndexSyntheticElementKind.getter |
| 51 : IndexSyntheticElementKind.setter; |
| 52 element = accessor.variable; |
| 53 } |
| 54 } else if (element is TopLevelVariableElement) { |
| 55 TopLevelVariableElement property = element; |
| 56 kind = IndexSyntheticElementKind.topLevelVariable; |
| 57 element = property.getter; |
| 58 element ??= property.setter; |
| 59 } else { |
| 60 throw new ArgumentError( |
| 61 'Unsupported synthetic element ${element.runtimeType}'); |
| 62 } |
| 63 } else if (element is LibraryElement || element is CompilationUnitElement) { |
| 64 kind = IndexSyntheticElementKind.unit; |
| 65 } |
| 66 return new IndexElementInfo._(element, kind); |
| 67 } |
| 39 | 68 |
| 40 ElementInfo(this.unitId, this.offset, this.kind) { | 69 IndexElementInfo._(this.element, this.kind); |
| 41 assert(offset >= 0); | |
| 42 } | |
| 43 } | 70 } |
| 44 | 71 |
| 45 /** | 72 /** |
| 46 * Object that gathers information about the whole package index and then uses | 73 * Object that gathers information about the whole package index and then uses |
| 47 * it to assemble a new [PackageIndexBuilder]. Call [index] on each compilation | 74 * it to assemble a new [PackageIndexBuilder]. Call [indexUnit] on each |
| 48 * unit to be indexed, then call [assemble] to retrieve the complete index for | 75 * compilation unit to be indexed, then call [assemble] to retrieve the |
| 49 * the package. | 76 * complete index for the package. |
| 50 */ | 77 */ |
| 51 class PackageIndexAssembler { | 78 class PackageIndexAssembler { |
| 52 /** | 79 /** |
| 53 * Map associating referenced elements with their [ElementInfo]s. | 80 * The string to use place of the `null` string. |
| 54 */ | 81 */ |
| 55 final Map<Element, ElementInfo> _elementMap = <Element, ElementInfo>{}; | 82 static const NULL_STRING = '--nullString--'; |
| 83 |
| 84 /** |
| 85 * Map associating referenced elements with their [_ElementInfo]s. |
| 86 */ |
| 87 final Map<Element, _ElementInfo> _elementMap = <Element, _ElementInfo>{}; |
| 56 | 88 |
| 57 /** | 89 /** |
| 58 * Map associating [CompilationUnitElement]s with their identifiers, which | 90 * Map associating [CompilationUnitElement]s with their identifiers, which |
| 59 * are indices into [_unitLibraryUris] and [_unitUnitUris]. | 91 * are indices into [_unitLibraryUris] and [_unitUnitUris]. |
| 60 */ | 92 */ |
| 61 final Map<CompilationUnitElement, int> _unitMap = | 93 final Map<CompilationUnitElement, int> _unitMap = |
| 62 <CompilationUnitElement, int>{}; | 94 <CompilationUnitElement, int>{}; |
| 63 | 95 |
| 64 /** | 96 /** |
| 65 * Each item of this list corresponds to the library URI of a unique | 97 * Each item of this list corresponds to the library URI of a unique |
| (...skipping 11 matching lines...) Expand all Loading... |
| 77 * Map associating strings with their [_StringInfo]s. | 109 * Map associating strings with their [_StringInfo]s. |
| 78 */ | 110 */ |
| 79 final Map<String, _StringInfo> _stringMap = <String, _StringInfo>{}; | 111 final Map<String, _StringInfo> _stringMap = <String, _StringInfo>{}; |
| 80 | 112 |
| 81 /** | 113 /** |
| 82 * List of information about each unit indexed in this index. | 114 * List of information about each unit indexed in this index. |
| 83 */ | 115 */ |
| 84 final List<_UnitIndexAssembler> _units = <_UnitIndexAssembler>[]; | 116 final List<_UnitIndexAssembler> _units = <_UnitIndexAssembler>[]; |
| 85 | 117 |
| 86 /** | 118 /** |
| 119 * The [_StringInfo] to use for `null` strings. |
| 120 */ |
| 121 _StringInfo _nullString; |
| 122 |
| 123 PackageIndexAssembler() { |
| 124 _nullString = _getStringInfo(NULL_STRING); |
| 125 } |
| 126 |
| 127 /** |
| 87 * Assemble a new [PackageIndexBuilder] using the information gathered by | 128 * Assemble a new [PackageIndexBuilder] using the information gathered by |
| 88 * [indexDeclarations] or [indexUnit]. | 129 * [indexDeclarations] or [indexUnit]. |
| 89 */ | 130 */ |
| 90 PackageIndexBuilder assemble() { | 131 PackageIndexBuilder assemble() { |
| 91 // sort strings end set IDs | 132 // sort strings end set IDs |
| 92 List<_StringInfo> stringInfoList = _stringMap.values.toList(); | 133 List<_StringInfo> stringInfoList = _stringMap.values.toList(); |
| 93 stringInfoList.sort((a, b) { | 134 stringInfoList.sort((a, b) { |
| 94 return a.value.compareTo(b.value); | 135 return a.value.compareTo(b.value); |
| 95 }); | 136 }); |
| 96 for (int i = 0; i < stringInfoList.length; i++) { | 137 for (int i = 0; i < stringInfoList.length; i++) { |
| 97 stringInfoList[i].id = i; | 138 stringInfoList[i].id = i; |
| 98 } | 139 } |
| 99 // sort elements and set IDs | 140 // sort elements and set IDs |
| 100 List<ElementInfo> elementInfoList = _elementMap.values.toList(); | 141 List<_ElementInfo> elementInfoList = _elementMap.values.toList(); |
| 101 elementInfoList.sort((a, b) { | 142 elementInfoList.sort((a, b) { |
| 102 return a.offset - b.offset; | 143 int delta; |
| 144 delta = a.nameIdUnitMember.id - b.nameIdUnitMember.id; |
| 145 if (delta != null) { |
| 146 return delta; |
| 147 } |
| 148 delta = a.nameIdClassMember.id - b.nameIdClassMember.id; |
| 149 if (delta != null) { |
| 150 return delta; |
| 151 } |
| 152 return a.nameIdParameter.id - b.nameIdParameter.id; |
| 103 }); | 153 }); |
| 104 for (int i = 0; i < elementInfoList.length; i++) { | 154 for (int i = 0; i < elementInfoList.length; i++) { |
| 105 elementInfoList[i].id = i; | 155 elementInfoList[i].id = i; |
| 106 } | 156 } |
| 107 return new PackageIndexBuilder( | 157 return new PackageIndexBuilder( |
| 108 unitLibraryUris: _unitLibraryUris.map((s) => s.id).toList(), | 158 unitLibraryUris: _unitLibraryUris.map((s) => s.id).toList(), |
| 109 unitUnitUris: _unitUnitUris.map((s) => s.id).toList(), | 159 unitUnitUris: _unitUnitUris.map((s) => s.id).toList(), |
| 110 elementUnits: elementInfoList.map((e) => e.unitId).toList(), | 160 elementUnits: elementInfoList.map((e) => e.unitId).toList(), |
| 111 elementOffsets: elementInfoList.map((e) => e.offset).toList(), | 161 elementNameUnitMemberIds: |
| 162 elementInfoList.map((e) => e.nameIdUnitMember.id).toList(), |
| 163 elementNameClassMemberIds: |
| 164 elementInfoList.map((e) => e.nameIdClassMember.id).toList(), |
| 165 elementNameParameterIds: |
| 166 elementInfoList.map((e) => e.nameIdParameter.id).toList(), |
| 112 elementKinds: elementInfoList.map((e) => e.kind).toList(), | 167 elementKinds: elementInfoList.map((e) => e.kind).toList(), |
| 113 strings: stringInfoList.map((s) => s.value).toList(), | 168 strings: stringInfoList.map((s) => s.value).toList(), |
| 114 units: _units.map((unit) => unit.assemble()).toList()); | 169 units: _units.map((unit) => unit.assemble()).toList()); |
| 115 } | 170 } |
| 116 | 171 |
| 117 /** | 172 /** |
| 118 * Index declarations in the given partially resolved [unit]. | 173 * Index declarations in the given partially resolved [unit]. |
| 119 */ | 174 */ |
| 120 void indexDeclarations(CompilationUnit unit) { | 175 void indexDeclarations(CompilationUnit unit) { |
| 121 int unitId = _getUnitId(unit.element); | 176 int unitId = _getUnitId(unit.element); |
| 122 _UnitIndexAssembler assembler = new _UnitIndexAssembler(this, unitId); | 177 _UnitIndexAssembler assembler = new _UnitIndexAssembler(this, unitId); |
| 123 _units.add(assembler); | 178 _units.add(assembler); |
| 124 unit.accept(new _IndexDeclarationContributor(assembler)); | 179 unit.accept(new _IndexDeclarationContributor(assembler)); |
| 125 } | 180 } |
| 126 | 181 |
| 127 /** | 182 /** |
| 128 * Index the given fully resolved [unit]. | 183 * Index the given fully resolved [unit]. |
| 129 */ | 184 */ |
| 130 void indexUnit(CompilationUnit unit) { | 185 void indexUnit(CompilationUnit unit) { |
| 131 int unitId = _getUnitId(unit.element); | 186 int unitId = _getUnitId(unit.element); |
| 132 _UnitIndexAssembler assembler = new _UnitIndexAssembler(this, unitId); | 187 _UnitIndexAssembler assembler = new _UnitIndexAssembler(this, unitId); |
| 133 _units.add(assembler); | 188 _units.add(assembler); |
| 134 unit.accept(new _IndexContributor(assembler)); | 189 unit.accept(new _IndexContributor(assembler)); |
| 135 } | 190 } |
| 136 | 191 |
| 137 /** | 192 /** |
| 138 * Return the unique [ElementInfo] corresponding the [element]. The field | 193 * Return the unique [_ElementInfo] corresponding the [element]. The field |
| 139 * [ElementInfo.id] is filled by [assemble] during final sorting. | 194 * [_ElementInfo.id] is filled by [assemble] during final sorting. |
| 140 */ | 195 */ |
| 141 ElementInfo _getElementInfo(Element element) { | 196 _ElementInfo _getElementInfo(Element element) { |
| 142 if (element is Member) { | 197 if (element is Member) { |
| 143 element = (element as Member).baseElement; | 198 element = (element as Member).baseElement; |
| 144 } | 199 } |
| 145 return _elementMap.putIfAbsent(element, () { | 200 return _elementMap.putIfAbsent(element, () { |
| 146 CompilationUnitElement unitElement = getUnitElement(element); | 201 CompilationUnitElement unitElement = getUnitElement(element); |
| 147 int unitId = _getUnitId(unitElement); | 202 int unitId = _getUnitId(unitElement); |
| 148 return newElementInfo(unitId, element); | 203 return _newElementInfo(unitId, element); |
| 149 }); | 204 }); |
| 150 } | 205 } |
| 151 | 206 |
| 152 /** | 207 /** |
| 153 * Return the unique [_StringInfo] corresponding the [str]. The field | 208 * Return the unique [_StringInfo] corresponding the [str]. The field |
| 154 * [_StringInfo.id] is filled by [assemble] during final sorting. | 209 * [_StringInfo.id] is filled by [assemble] during final sorting. |
| 155 */ | 210 */ |
| 156 _StringInfo _getStringInfo(String str) { | 211 _StringInfo _getStringInfo(String str) { |
| 157 return _stringMap.putIfAbsent(str, () { | 212 return _stringMap.putIfAbsent(str, () { |
| 158 return new _StringInfo(str); | 213 return new _StringInfo(str); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 177 /** | 232 /** |
| 178 * Return the unique [_StringInfo] corresponding [uri]. The field | 233 * Return the unique [_StringInfo] corresponding [uri]. The field |
| 179 * [_StringInfo.id] is filled by [assemble] during final sorting. | 234 * [_StringInfo.id] is filled by [assemble] during final sorting. |
| 180 */ | 235 */ |
| 181 _StringInfo _getUriInfo(Uri uri) { | 236 _StringInfo _getUriInfo(Uri uri) { |
| 182 String str = uri.toString(); | 237 String str = uri.toString(); |
| 183 return _getStringInfo(str); | 238 return _getStringInfo(str); |
| 184 } | 239 } |
| 185 | 240 |
| 186 /** | 241 /** |
| 242 * Return a new [_ElementInfo] for the given [element] in the given [unitId]. |
| 243 * This method is static, so it cannot add any information to the index. |
| 244 */ |
| 245 _ElementInfo _newElementInfo(int unitId, Element element) { |
| 246 IndexElementInfo info = new IndexElementInfo(element); |
| 247 element = info.element; |
| 248 // Prepare name identifiers. |
| 249 _StringInfo nameIdParameter = _nullString; |
| 250 _StringInfo nameIdClassMember = _nullString; |
| 251 _StringInfo nameIdUnitMember = _nullString; |
| 252 if (element is ParameterElement) { |
| 253 nameIdParameter = _getStringInfo(element.name); |
| 254 element = element.enclosingElement; |
| 255 } |
| 256 if (element?.enclosingElement is ClassElement) { |
| 257 nameIdClassMember = _getStringInfo(element.name); |
| 258 element = element.enclosingElement; |
| 259 } |
| 260 if (element?.enclosingElement is CompilationUnitElement) { |
| 261 nameIdUnitMember = _getStringInfo(element.name); |
| 262 } |
| 263 return new _ElementInfo(unitId, nameIdUnitMember, nameIdClassMember, |
| 264 nameIdParameter, info.kind); |
| 265 } |
| 266 |
| 267 /** |
| 187 * Return the [CompilationUnitElement] that should be used for [element]. | 268 * Return the [CompilationUnitElement] that should be used for [element]. |
| 188 * Throw [StateError] if the [element] is not linked into a unit. | 269 * Throw [StateError] if the [element] is not linked into a unit. |
| 189 */ | 270 */ |
| 190 static CompilationUnitElement getUnitElement(Element element) { | 271 static CompilationUnitElement getUnitElement(Element element) { |
| 191 for (Element e = element; e != null; e = e.enclosingElement) { | 272 for (Element e = element; e != null; e = e.enclosingElement) { |
| 192 if (e is CompilationUnitElement) { | 273 if (e is CompilationUnitElement) { |
| 193 return e; | 274 return e; |
| 194 } | 275 } |
| 195 if (e is LibraryElement) { | 276 if (e is LibraryElement) { |
| 196 return e.definingCompilationUnit; | 277 return e.definingCompilationUnit; |
| 197 } | 278 } |
| 198 } | 279 } |
| 199 throw new StateError(element.toString()); | 280 throw new StateError(element.toString()); |
| 200 } | 281 } |
| 201 | |
| 202 /** | |
| 203 * Return a new [ElementInfo] for the given [element] in the given [unitId]. | |
| 204 * This method is static, so it cannot add any information to the index. | |
| 205 */ | |
| 206 static ElementInfo newElementInfo(int unitId, Element element) { | |
| 207 int offset = null; | |
| 208 IndexSyntheticElementKind kind = IndexSyntheticElementKind.notSynthetic; | |
| 209 if (element.isSynthetic) { | |
| 210 if (element is ConstructorElement) { | |
| 211 kind = IndexSyntheticElementKind.constructor; | |
| 212 element = element.enclosingElement; | |
| 213 } else if (element is FunctionElement && element.name == 'loadLibrary') { | |
| 214 kind = IndexSyntheticElementKind.loadLibrary; | |
| 215 element = element.library; | |
| 216 } else if (element is FieldElement) { | |
| 217 FieldElement field = element; | |
| 218 kind = IndexSyntheticElementKind.field; | |
| 219 element = field.getter; | |
| 220 element ??= field.setter; | |
| 221 } else if (element is PropertyAccessorElement) { | |
| 222 PropertyAccessorElement accessor = element; | |
| 223 Element enclosing = element.enclosingElement; | |
| 224 bool isEnumGetter = enclosing is ClassElement && enclosing.isEnum; | |
| 225 if (isEnumGetter && accessor.name == 'index') { | |
| 226 kind = IndexSyntheticElementKind.enumIndex; | |
| 227 element = enclosing; | |
| 228 } else if (isEnumGetter && accessor.name == 'values') { | |
| 229 kind = IndexSyntheticElementKind.enumValues; | |
| 230 element = enclosing; | |
| 231 } else { | |
| 232 kind = accessor.isGetter | |
| 233 ? IndexSyntheticElementKind.getter | |
| 234 : IndexSyntheticElementKind.setter; | |
| 235 element = accessor.variable; | |
| 236 } | |
| 237 } else if (element is TopLevelVariableElement) { | |
| 238 TopLevelVariableElement property = element; | |
| 239 kind = IndexSyntheticElementKind.topLevelVariable; | |
| 240 element = property.getter; | |
| 241 element ??= property.setter; | |
| 242 } else { | |
| 243 throw new ArgumentError( | |
| 244 'Unsupported synthetic element ${element.runtimeType}'); | |
| 245 } | |
| 246 } else if (element is LibraryElement || element is CompilationUnitElement) { | |
| 247 kind = IndexSyntheticElementKind.unit; | |
| 248 offset = 0; | |
| 249 } | |
| 250 offset ??= element.nameOffset; | |
| 251 return new ElementInfo(unitId, offset, kind); | |
| 252 } | |
| 253 } | 282 } |
| 254 | 283 |
| 255 /** | 284 /** |
| 256 * Information about a single defined name. Any [_DefinedNameInfo] is always | 285 * Information about a single defined name. Any [_DefinedNameInfo] is always |
| 257 * part of a [_UnitIndexAssembler], so [offset] should be understood within the | 286 * part of a [_UnitIndexAssembler], so [offset] should be understood within the |
| 258 * context of the compilation unit pointed to by the [_UnitIndexAssembler]. | 287 * context of the compilation unit pointed to by the [_UnitIndexAssembler]. |
| 259 */ | 288 */ |
| 260 class _DefinedNameInfo { | 289 class _DefinedNameInfo { |
| 261 /** | 290 /** |
| 262 * The information about the name returned from | 291 * The information about the name returned from |
| 263 * [PackageIndexAssembler._getStringInfo]. | 292 * [PackageIndexAssembler._getStringInfo]. |
| 264 */ | 293 */ |
| 265 final _StringInfo nameInfo; | 294 final _StringInfo nameInfo; |
| 266 | 295 |
| 267 /** | 296 /** |
| 268 * The coarse-grained kind of the defined name. | 297 * The coarse-grained kind of the defined name. |
| 269 */ | 298 */ |
| 270 final IndexNameKind kind; | 299 final IndexNameKind kind; |
| 271 | 300 |
| 272 /** | 301 /** |
| 273 * The name offset of the defined element. | 302 * The name offset of the defined element. |
| 274 */ | 303 */ |
| 275 final int offset; | 304 final int offset; |
| 276 | 305 |
| 277 _DefinedNameInfo(this.nameInfo, this.kind, this.offset); | 306 _DefinedNameInfo(this.nameInfo, this.kind, this.offset); |
| 278 } | 307 } |
| 279 | 308 |
| 280 /** | 309 /** |
| 310 * Information about an element referenced in index. |
| 311 */ |
| 312 class _ElementInfo { |
| 313 /** |
| 314 * The identifier of the [CompilationUnitElement] containing this element. |
| 315 */ |
| 316 final int unitId; |
| 317 |
| 318 /** |
| 319 * The identifier of the top-level name, or `null` if the element is a |
| 320 * reference to the unit. |
| 321 */ |
| 322 final _StringInfo nameIdUnitMember; |
| 323 |
| 324 /** |
| 325 * The identifier of the class member name, or `null` if the element is not a |
| 326 * class member or a named parameter of a class member. |
| 327 */ |
| 328 final _StringInfo nameIdClassMember; |
| 329 |
| 330 /** |
| 331 * The identifier of the named parameter name, or `null` if the element is not |
| 332 * a named parameter. |
| 333 */ |
| 334 final _StringInfo nameIdParameter; |
| 335 |
| 336 /** |
| 337 * The kind of the element. |
| 338 */ |
| 339 final IndexSyntheticElementKind kind; |
| 340 |
| 341 /** |
| 342 * The unique id of the element. It is set after indexing of the whole |
| 343 * package is done and we are assembling the full package index. |
| 344 */ |
| 345 int id; |
| 346 |
| 347 _ElementInfo(this.unitId, this.nameIdUnitMember, this.nameIdClassMember, |
| 348 this.nameIdParameter, this.kind); |
| 349 } |
| 350 |
| 351 /** |
| 281 * Information about a single relation. Any [_ElementRelationInfo] is always | 352 * Information about a single relation. Any [_ElementRelationInfo] is always |
| 282 * part of a [_UnitIndexAssembler], so [offset] and [length] should be | 353 * part of a [_UnitIndexAssembler], so [offset] and [length] should be |
| 283 * understood within the context of the compilation unit pointed to by the | 354 * understood within the context of the compilation unit pointed to by the |
| 284 * [_UnitIndexAssembler]. | 355 * [_UnitIndexAssembler]. |
| 285 */ | 356 */ |
| 286 class _ElementRelationInfo { | 357 class _ElementRelationInfo { |
| 287 final ElementInfo elementInfo; | 358 final _ElementInfo elementInfo; |
| 288 final IndexRelationKind kind; | 359 final IndexRelationKind kind; |
| 289 final int offset; | 360 final int offset; |
| 290 final int length; | 361 final int length; |
| 291 final bool isQualified; | 362 final bool isQualified; |
| 292 | 363 |
| 293 _ElementRelationInfo( | 364 _ElementRelationInfo( |
| 294 this.elementInfo, this.kind, this.offset, this.length, this.isQualified); | 365 this.elementInfo, this.kind, this.offset, this.length, this.isQualified); |
| 295 } | 366 } |
| 296 | 367 |
| 297 /** | 368 /** |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 } | 834 } |
| 764 | 835 |
| 765 /** | 836 /** |
| 766 * Assembler of a single [CompilationUnit] index. The intended usage sequence: | 837 * Assembler of a single [CompilationUnit] index. The intended usage sequence: |
| 767 * | 838 * |
| 768 * - Call [defineName] for each name defined in the compilation unit. | 839 * - Call [defineName] for each name defined in the compilation unit. |
| 769 * - Call [addElementRelation] for each element relation found in the | 840 * - Call [addElementRelation] for each element relation found in the |
| 770 * compilation unit. | 841 * compilation unit. |
| 771 * - Call [addNameRelation] for each name relation found in the | 842 * - Call [addNameRelation] for each name relation found in the |
| 772 * compilation unit. | 843 * compilation unit. |
| 773 * - Assign ids to all the [ElementInfo] objects reachable from | 844 * - Assign ids to all the [_ElementInfo] objects reachable from |
| 774 * [elementRelations]. | 845 * [elementRelations]. |
| 775 * - Call [assemble] to produce the final unit index. | 846 * - Call [assemble] to produce the final unit index. |
| 776 */ | 847 */ |
| 777 class _UnitIndexAssembler { | 848 class _UnitIndexAssembler { |
| 778 final PackageIndexAssembler pkg; | 849 final PackageIndexAssembler pkg; |
| 779 final int unitId; | 850 final int unitId; |
| 780 final List<_DefinedNameInfo> definedNames = <_DefinedNameInfo>[]; | 851 final List<_DefinedNameInfo> definedNames = <_DefinedNameInfo>[]; |
| 781 final List<_ElementRelationInfo> elementRelations = <_ElementRelationInfo>[]; | 852 final List<_ElementRelationInfo> elementRelations = <_ElementRelationInfo>[]; |
| 782 final List<_NameRelationInfo> nameRelations = <_NameRelationInfo>[]; | 853 final List<_NameRelationInfo> nameRelations = <_NameRelationInfo>[]; |
| 783 | 854 |
| 784 _UnitIndexAssembler(this.pkg, this.unitId); | 855 _UnitIndexAssembler(this.pkg, this.unitId); |
| 785 | 856 |
| 786 void addElementRelation(Element element, IndexRelationKind kind, int offset, | 857 void addElementRelation(Element element, IndexRelationKind kind, int offset, |
| 787 int length, bool isQualified) { | 858 int length, bool isQualified) { |
| 788 try { | 859 try { |
| 789 ElementInfo elementInfo = pkg._getElementInfo(element); | 860 _ElementInfo elementInfo = pkg._getElementInfo(element); |
| 790 elementRelations.add(new _ElementRelationInfo( | 861 elementRelations.add(new _ElementRelationInfo( |
| 791 elementInfo, kind, offset, length, isQualified)); | 862 elementInfo, kind, offset, length, isQualified)); |
| 792 } on StateError {} | 863 } on StateError {} |
| 793 } | 864 } |
| 794 | 865 |
| 795 void addNameRelation( | 866 void addNameRelation( |
| 796 String name, IndexRelationKind kind, int offset, bool isQualified) { | 867 String name, IndexRelationKind kind, int offset, bool isQualified) { |
| 797 _StringInfo nameId = pkg._getStringInfo(name); | 868 _StringInfo nameId = pkg._getStringInfo(name); |
| 798 nameRelations.add(new _NameRelationInfo(nameId, kind, offset, isQualified)); | 869 nameRelations.add(new _NameRelationInfo(nameId, kind, offset, isQualified)); |
| 799 } | 870 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 828 usedNameOffsets: nameRelations.map((r) => r.offset).toList(), | 899 usedNameOffsets: nameRelations.map((r) => r.offset).toList(), |
| 829 usedNameIsQualifiedFlags: | 900 usedNameIsQualifiedFlags: |
| 830 nameRelations.map((r) => r.isQualified).toList()); | 901 nameRelations.map((r) => r.isQualified).toList()); |
| 831 } | 902 } |
| 832 | 903 |
| 833 void defineName(String name, IndexNameKind kind, int offset) { | 904 void defineName(String name, IndexNameKind kind, int offset) { |
| 834 _StringInfo nameInfo = pkg._getStringInfo(name); | 905 _StringInfo nameInfo = pkg._getStringInfo(name); |
| 835 definedNames.add(new _DefinedNameInfo(nameInfo, kind, offset)); | 906 definedNames.add(new _DefinedNameInfo(nameInfo, kind, offset)); |
| 836 } | 907 } |
| 837 } | 908 } |
| OLD | NEW |