Chromium Code Reviews| 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 services.src.index.store.codec; | 5 library services.src.index.store.codec; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analysis_server/analysis/index/index_core.dart'; | |
| 9 import 'package:analysis_server/src/services/index/index.dart'; | 10 import 'package:analysis_server/src/services/index/index.dart'; |
| 11 import 'package:analysis_server/src/services/index/indexable_element.dart'; | |
| 10 import 'package:analyzer/src/generated/element.dart'; | 12 import 'package:analyzer/src/generated/element.dart'; |
| 11 import 'package:analyzer/src/generated/engine.dart'; | 13 import 'package:analyzer/src/generated/engine.dart'; |
| 12 import 'package:analyzer/src/generated/source.dart'; | 14 import 'package:analyzer/src/generated/source.dart'; |
| 13 import 'package:analyzer/src/generated/utilities_general.dart'; | 15 import 'package:analyzer/src/generated/utilities_general.dart'; |
| 14 | 16 |
| 15 /** | 17 /** |
| 16 * A helper that encodes/decodes [AnalysisContext]s from/to integers. | 18 * A helper that encodes/decodes [AnalysisContext]s from/to integers. |
| 17 */ | 19 */ |
| 18 class ContextCodec { | 20 class ContextCodec { |
| 19 /** | 21 /** |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 58 int id = _contextToIndex.remove(context); | 60 int id = _contextToIndex.remove(context); |
| 59 if (id != null) { | 61 if (id != null) { |
| 60 _indexToContext.remove(id); | 62 _indexToContext.remove(id); |
| 61 } | 63 } |
| 62 } | 64 } |
| 63 } | 65 } |
| 64 | 66 |
| 65 /** | 67 /** |
| 66 * A helper that encodes/decodes [Element]s to/from integers. | 68 * A helper that encodes/decodes [Element]s to/from integers. |
| 67 */ | 69 */ |
| 68 class ElementCodec { | 70 class ElementCodec { |
|
scheglov
2015/05/25 18:29:33
It seems that this class needs more work.
We will
Brian Wilkerson
2015/06/01 13:20:08
Done
| |
| 69 static const int _CONSTRUCTOR_KIND_BASE = -100; | |
| 70 | |
| 71 final StringCodec _stringCodec; | 71 final StringCodec _stringCodec; |
| 72 | 72 |
| 73 ElementCodec(this._stringCodec); | 73 ElementCodec(this._stringCodec); |
| 74 | 74 |
| 75 /** | 75 /** |
| 76 * Returns an [Element] that corresponds to the given identifiers. | 76 * Returns an [IndexableObject] that corresponds to the given identifiers. |
| 77 */ | 77 */ |
| 78 Element decode(AnalysisContext context, int fileId, int offset, int kindId) { | 78 IndexableObject decode( |
| 79 AnalysisContext context, int fileId, int offset, int kindId) { | |
| 79 String filePath = _stringCodec.decode(fileId); | 80 String filePath = _stringCodec.decode(fileId); |
| 80 List<Source> unitSources = context.getSourcesWithFullName(filePath); | 81 IndexableObjectKind kind = IndexableObjectKind.getKind(kindId); |
| 81 for (Source unitSource in unitSources) { | 82 if (kind == null) { |
| 82 List<Source> libSources = context.getLibrariesContaining(unitSource); | 83 return null; |
| 83 for (Source libSource in libSources) { | 84 } else if (kind is IndexableNameKind) { |
| 84 CompilationUnitElement unitElement = | 85 return new IndexableElement(new NameElement(_stringCodec.decode(offset))); |
| 85 context.getCompilationUnitElement(unitSource, libSource); | |
| 86 if (unitElement == null) { | |
| 87 return null; | |
| 88 } | |
| 89 if (kindId == ElementKind.LIBRARY.ordinal) { | |
| 90 return unitElement.library; | |
| 91 } else if (kindId == ElementKind.COMPILATION_UNIT.ordinal) { | |
| 92 return unitElement; | |
| 93 } else { | |
| 94 Element element = unitElement.getElementAt(offset); | |
| 95 if (element == null) { | |
| 96 return null; | |
| 97 } | |
| 98 if (element is ClassElement && kindId <= _CONSTRUCTOR_KIND_BASE) { | |
| 99 int constructorIndex = -1 * (kindId - _CONSTRUCTOR_KIND_BASE); | |
| 100 return element.constructors[constructorIndex]; | |
| 101 } | |
| 102 if (element is PropertyInducingElement) { | |
| 103 if (kindId == ElementKind.GETTER.ordinal) { | |
| 104 return element.getter; | |
| 105 } | |
| 106 if (kindId == ElementKind.SETTER.ordinal) { | |
| 107 return element.setter; | |
| 108 } | |
| 109 } | |
| 110 return element; | |
| 111 } | |
| 112 } | |
| 113 } | 86 } |
| 114 return null; | 87 return kind.decode(context, filePath, offset); |
| 115 } | 88 } |
| 116 | 89 |
| 117 /** | 90 /** |
| 118 * Returns the first component of the [element] id. | 91 * Returns the first component of the [element] id. |
| 119 * In the most cases it is an encoding of the [element]'s file path. | 92 * In the most cases it is an encoding of the [element]'s file path. |
| 120 * If the given [element] is not defined in a file, returns `-1`. | 93 * If the given [element] is not defined in a file, returns `-1`. |
| 121 */ | 94 */ |
| 122 int encode1(Element element) { | 95 int encode1(IndexableObject indexable) { |
| 123 Source source = element.source; | 96 Source source = indexable.source; |
| 124 if (source == null) { | 97 if (source == null) { |
| 125 return -1; | 98 return -1; |
| 126 } | 99 } |
| 127 String filePath = source.fullName; | 100 String filePath = source.fullName; |
| 128 return _stringCodec.encode(filePath); | 101 return _stringCodec.encode(filePath); |
| 129 } | 102 } |
| 130 | 103 |
| 131 /** | 104 /** |
| 132 * Returns the second component of the [element] id. | 105 * Returns the second component of the [element] id. |
| 133 * In the most cases it is the [element]'s name offset. | 106 * In the most cases it is the [element]'s name offset. |
| 134 */ | 107 */ |
| 135 int encode2(Element element) { | 108 int encode2(IndexableObject indexable) { |
| 136 if (element is NameElement) { | 109 if (indexable is IndexableName) { |
| 137 String name = element.name; | 110 String name = indexable.name; |
| 138 return _stringCodec.encode(name); | 111 return _stringCodec.encode(name); |
| 139 } | 112 } |
| 140 if (element is ConstructorElement) { | 113 int offset = indexable.offset; |
| 141 return element.enclosingElement.nameOffset; | 114 if (offset < 0) { |
| 115 return _stringCodec.encode(indexable.name); | |
| 142 } | 116 } |
| 143 return element.nameOffset; | 117 return offset; |
| 144 } | 118 } |
| 145 | 119 |
| 146 /** | 120 /** |
| 147 * Returns the third component of the [element] id. | 121 * Returns the third component of the [element] id. |
| 148 * In the most cases it is the [element]'s kind. | 122 * In the most cases it is the [element]'s kind. |
| 149 */ | 123 */ |
| 150 int encode3(Element element) { | 124 int encode3(IndexableObject indexable) { |
| 151 if (element is ConstructorElement) { | 125 return indexable.kind.index; |
| 152 ClassElement classElement = element.enclosingElement; | |
| 153 int constructorIndex = classElement.constructors.indexOf(element); | |
| 154 return _CONSTRUCTOR_KIND_BASE - constructorIndex; | |
| 155 } | |
| 156 return element.kind.ordinal; | |
| 157 } | 126 } |
| 158 | 127 |
| 159 /** | 128 /** |
| 160 * Returns an integer that corresponds to the name of [element]. | 129 * Returns an integer that corresponds to the name of [element]. |
| 161 */ | 130 */ |
| 162 int encodeHash(Element element) { | 131 int encodeHash(IndexableObject indexable) { |
|
scheglov
2015/05/25 18:29:33
Could we move implementation into IndexableObjectK
Brian Wilkerson
2015/06/01 13:20:08
TODO added so we don't forget in a future pass.
| |
| 163 String elementName = element.displayName; | 132 String elementName = indexable.name; // was: indexable.displayName; |
| 164 int elementNameId = _stringCodec.encode(elementName); | 133 int elementNameId = _stringCodec.encode(elementName); |
| 165 LibraryElement libraryElement = element.library; | 134 if (indexable is IndexableElement) { |
| 166 if (libraryElement != null) { | 135 LibraryElement libraryElement = indexable.element.library; |
| 167 String libraryPath = libraryElement.source.fullName; | 136 if (libraryElement != null) { |
| 168 int libraryPathId = _stringCodec.encode(libraryPath); | 137 String libraryPath = libraryElement.source.fullName; |
| 169 return JenkinsSmiHash.combine(libraryPathId, elementNameId); | 138 int libraryPathId = _stringCodec.encode(libraryPath); |
| 170 } else { | 139 return JenkinsSmiHash.combine(libraryPathId, elementNameId); |
| 171 return elementNameId; | 140 } |
| 172 } | 141 } |
| 142 return elementNameId; | |
| 173 } | 143 } |
| 174 } | 144 } |
| 175 | 145 |
| 176 /** | 146 /** |
| 177 * A helper that encodes/decodes [Relationship]s to/from integers. | 147 * A helper that encodes/decodes [Relationship]s to/from integers. |
| 178 */ | 148 */ |
| 179 class RelationshipCodec { | 149 class RelationshipCodec { |
| 180 final StringCodec _stringCodec; | 150 final StringCodec _stringCodec; |
| 181 | 151 |
| 182 RelationshipCodec(this._stringCodec); | 152 RelationshipCodec(this._stringCodec); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 int encode(String name) { | 187 int encode(String name) { |
| 218 int index = nameToIndex[name]; | 188 int index = nameToIndex[name]; |
| 219 if (index == null) { | 189 if (index == null) { |
| 220 index = _indexToName.length; | 190 index = _indexToName.length; |
| 221 nameToIndex[name] = index; | 191 nameToIndex[name] = index; |
| 222 _indexToName.add(name); | 192 _indexToName.add(name); |
| 223 } | 193 } |
| 224 return index; | 194 return index; |
| 225 } | 195 } |
| 226 } | 196 } |
| OLD | NEW |