Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 /// Convertion of elements between the analyzer element model and the dart2js | |
| 6 /// element model. | |
| 7 | |
| 8 library analyzer2dart.element_converter; | |
| 9 | |
| 10 import 'package:compiler/implementation/elements/elements.dart' as dart2js; | |
| 11 import 'package:compiler/implementation/elements/modelx.dart' as modelx; | |
| 12 import 'package:compiler/implementation/util/util.dart' as util; | |
| 13 import 'package:compiler/implementation/dart_types.dart'; | |
| 14 import 'package:analyzer/src/generated/element.dart' as analyzer; | |
| 15 | |
| 16 class ElementConverter { | |
| 17 /// Map from analyzer elements to their equivalent dart2js elements. | |
| 18 Map<analyzer.Element, dart2js.Element> conversionMap = | |
| 19 <analyzer.Element, dart2js.Element>{}; | |
| 20 | |
| 21 /// Map from dart2js elements to their equivalent analyzer elements. | |
| 22 Map<dart2js.Element, analyzer.Element> inversionMap = | |
| 23 <dart2js.Element, analyzer.Element>{}; | |
| 24 | |
| 25 dart2js.Element convertElement(analyzer.Element input) { | |
| 26 return conversionMap.putIfAbsent(input, () { | |
| 27 dart2js.Element output = convertElementInternal(input); | |
| 28 inversionMap[output] = input; | |
| 29 return output; | |
| 30 }); | |
| 31 } | |
| 32 | |
| 33 analyzer.Element invertElement(dart2js.Element input) { | |
| 34 return inversionMap[input]; | |
| 35 } | |
| 36 | |
| 37 dart2js.Element convertElementInternal(analyzer.Element input) { | |
| 38 if (input is analyzer.FunctionElement) { | |
|
Brian Wilkerson
2014/09/08 13:47:09
In case you didn't know, there is an ElementVisito
Johnni Winther
2014/09/09 14:21:26
Done.
| |
| 39 return new TopLevelFunctionElementY(this, input); | |
| 40 } else if (input is analyzer.LibraryElement) { | |
| 41 return new LibraryElementY(this, input); | |
| 42 } | |
| 43 throw new UnsupportedError( | |
| 44 "Conversion of $input (${input.runtimeType}) is not supported."); | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 class ElementY extends dart2js.Element { | |
|
sigurdm
2014/09/08 14:07:15
Document
Johnni Winther
2014/09/09 14:21:26
Done.
| |
| 49 final ElementConverter converter; | |
| 50 final analyzer.Element element; | |
| 51 | |
| 52 @override | |
| 53 String get name => element.name; | |
| 54 | |
| 55 ElementY(this.converter, this.element); | |
| 56 | |
| 57 @override | |
| 58 dart2js.LibraryElement get implementationLibrary => library; | |
| 59 | |
| 60 @override | |
| 61 dart2js.Element get origin => this; | |
| 62 | |
| 63 @override | |
| 64 dart2js.Element get patch => null; | |
| 65 | |
| 66 @override | |
| 67 dart2js.Element get declaration => this; | |
| 68 | |
| 69 @override | |
| 70 dart2js.Element get implementation => this; | |
| 71 | |
| 72 @override | |
| 73 bool get isPatch => false; | |
| 74 | |
| 75 @override | |
| 76 bool get isPatched => false; | |
| 77 | |
| 78 @override | |
| 79 dart2js.LibraryElement get library { | |
| 80 return converter.convertElement(element.library); | |
| 81 } | |
| 82 | |
| 83 unsupported(String method) { | |
| 84 throw new UnsupportedError( | |
| 85 "'$method' is unsupported on $this ($runtimeType)"); | |
| 86 } | |
| 87 | |
| 88 | |
| 89 @override | |
| 90 bool get isFinal => unsupported('isFinal'); | |
| 91 | |
| 92 @override | |
| 93 bool get isStatic => unsupported('isStatic'); | |
| 94 | |
| 95 @override | |
| 96 bool isForeign(_) => unsupported('isForeign'); | |
| 97 | |
| 98 @override | |
| 99 bool get impliesType => unsupported('impliesType'); | |
| 100 | |
| 101 @override | |
| 102 bool get isOperator => unsupported('impliesType'); | |
| 103 | |
| 104 @override | |
| 105 get position => unsupported('position'); | |
| 106 | |
| 107 @override | |
| 108 computeType(_) => unsupported('computeType'); | |
| 109 | |
| 110 @override | |
| 111 get enclosingElement => unsupported('enclosingElement'); | |
| 112 | |
| 113 @override | |
| 114 accept(_) => unsupported('accept'); | |
| 115 | |
| 116 @override | |
| 117 void addMetadata(_) => unsupported('addMetadata'); | |
| 118 | |
| 119 @override | |
| 120 get analyzableElement => unsupported('analyzableElement'); | |
| 121 | |
| 122 @override | |
| 123 asFunctionElement() => unsupported('asFunctionElement'); | |
| 124 | |
| 125 @override | |
| 126 buildScope() => unsupported('buildScope'); | |
| 127 | |
| 128 @override | |
| 129 get compilationUnit => unsupported('compilationUnit'); | |
| 130 | |
| 131 @override | |
| 132 get contextClass => unsupported('contextClass'); | |
| 133 | |
| 134 @override | |
| 135 void diagnose(context, listener) => unsupported('diagnose'); | |
| 136 | |
| 137 @override | |
| 138 get enclosingClass => unsupported('enclosingClass'); | |
| 139 | |
| 140 @override | |
| 141 get enclosingClassOrCompilationUnit { | |
| 142 return unsupported('enclosingClassOrCompilationUnit'); | |
| 143 } | |
| 144 | |
| 145 @override | |
| 146 String get fixedBackendName => unsupported('fixedBackendName'); | |
| 147 | |
| 148 @override | |
| 149 bool get hasFixedBackendName => unsupported('hasFixedBackendName'); | |
| 150 | |
| 151 @override | |
| 152 bool get isAbstract => unsupported('isAbstract'); | |
| 153 | |
| 154 @override | |
| 155 bool get isAssignable => unsupported('isAssignable'); | |
| 156 | |
| 157 @override | |
| 158 bool get isClassMember => unsupported('isClassMember'); | |
| 159 | |
| 160 @override | |
| 161 bool get isClosure => unsupported('isClosure'); | |
| 162 | |
| 163 @override | |
| 164 bool get isConst => unsupported('isConst'); | |
| 165 | |
| 166 @override | |
| 167 bool get isDeclaration => unsupported('isDeclaration'); | |
| 168 | |
| 169 @override | |
| 170 bool get isDeferredLoaderGetter => unsupported('isDeferredLoaderGetter'); | |
| 171 | |
| 172 @override | |
| 173 bool get isFactoryConstructor => unsupported('isFactoryConstructor'); | |
| 174 | |
| 175 @override | |
| 176 bool get isForwardingConstructor => unsupported('isForwardingConstructor'); | |
| 177 | |
| 178 @override | |
| 179 bool get isImplementation => unsupported('isImplementation'); | |
| 180 | |
| 181 @override | |
| 182 bool get isInjected => unsupported('isInjected'); | |
| 183 | |
| 184 @override | |
| 185 bool get isInstanceMember => unsupported('isInstanceMember'); | |
| 186 | |
| 187 @override | |
| 188 bool get isMixinApplication => unsupported('isMixinApplication'); | |
| 189 | |
| 190 @override | |
| 191 bool get isNative => unsupported('isNative'); | |
| 192 | |
| 193 @override | |
| 194 bool get isSynthesized => unsupported('isSynthesized'); | |
| 195 | |
| 196 @override | |
| 197 bool get isTopLevel => unsupported('isTopLevel'); | |
| 198 | |
| 199 @override | |
| 200 get kind => unsupported('kind'); | |
| 201 | |
| 202 @override | |
| 203 get metadata => unsupported('metadata'); | |
| 204 | |
| 205 @override | |
| 206 get outermostEnclosingMemberOrTopLevel { | |
| 207 return unsupported('outermostEnclosingMemberOrTopLevel'); | |
| 208 } | |
| 209 | |
| 210 @override | |
| 211 void setFixedBackendName(String name) => unsupported('setFixedBackendName'); | |
| 212 | |
| 213 @override | |
| 214 void setNative(String name) => unsupported('setNative'); | |
| 215 } | |
| 216 | |
| 217 class LibraryElementY extends ElementY implements dart2js.LibraryElement { | |
| 218 analyzer.LibraryElement get element => super.element; | |
| 219 | |
| 220 @override | |
| 221 dart2js.ElementKind get kind => dart2js.ElementKind.LIBRARY; | |
| 222 | |
| 223 // TODO(johnniwinther): Ensure the correct semantics of this. | |
| 224 @override | |
| 225 bool get isInternalLibrary => isPlatformLibrary && element.isPrivate; | |
| 226 | |
| 227 // TODO(johnniwinther): Ensure the correct semantics of this. | |
| 228 @override | |
| 229 bool get isPlatformLibrary => element.isInSdk; | |
| 230 | |
| 231 @override | |
| 232 bool get isDartCore => element.isDartCore; | |
| 233 | |
| 234 LibraryElementY(ElementConverter converter, analyzer.LibraryElement element) | |
| 235 : super(converter, element); | |
| 236 | |
| 237 @override | |
| 238 void addCompilationUnit(_) => unsupported('addCompilationUnit'); | |
| 239 | |
| 240 @override | |
| 241 void addImport(element, import, listener) => unsupported('addImport'); | |
| 242 | |
| 243 @override | |
| 244 void addMember(element, listener) => unsupported('addMember'); | |
| 245 | |
| 246 @override | |
| 247 void addTag(tag, listener) => unsupported('addTag'); | |
| 248 | |
| 249 @override | |
| 250 void addToScope(element, listener) => unsupported('addToScope'); | |
| 251 | |
| 252 @override | |
| 253 void set canUseNative(bool value) => unsupported('canUseNative'); | |
| 254 | |
| 255 @override | |
| 256 bool get canUseNative => unsupported('canUseNative'); | |
| 257 | |
| 258 @override | |
| 259 Uri get canonicalUri => unsupported('canonicalUri'); | |
| 260 | |
| 261 @override | |
| 262 int compareTo(other) => unsupported('compareTo'); | |
| 263 | |
| 264 @override | |
| 265 get compilationUnits => unsupported('compilationUnits'); | |
| 266 | |
| 267 @override | |
| 268 get entryCompilationUnit => unsupported('entryCompilationUnit'); | |
| 269 | |
| 270 @override | |
| 271 get exports => unsupported('exports'); | |
| 272 | |
| 273 @override | |
| 274 bool get exportsHandled => unsupported('exportsHandled'); | |
| 275 | |
| 276 @override | |
| 277 find(String elementName) => unsupported('find'); | |
| 278 | |
| 279 @override | |
| 280 findExported(String elementName) => unsupported('findExported'); | |
| 281 | |
| 282 @override | |
| 283 findLocal(String elementName) => unsupported('findLocal'); | |
| 284 | |
| 285 @override | |
| 286 void forEachExport(_) => unsupported('forEachExport'); | |
| 287 | |
| 288 @override | |
| 289 void forEachLocalMember(_) => unsupported('forEachLocalMember'); | |
| 290 | |
| 291 @override | |
| 292 getImportsFor(element) => unsupported('getImportsFor'); | |
| 293 | |
| 294 @override | |
| 295 getLibraryFromTag(tag) => unsupported('getLibraryFromTag'); | |
| 296 | |
| 297 @override | |
| 298 String getLibraryName() => unsupported('getLibraryName'); | |
| 299 | |
| 300 @override | |
| 301 String getLibraryOrScriptName() => unsupported('getLibraryOrScriptName'); | |
| 302 | |
| 303 @override | |
| 304 getNonPrivateElementsInScope() => unsupported('getNonPrivateElementsInScope'); | |
| 305 | |
| 306 @override | |
| 307 bool hasLibraryName() => unsupported('hasLibraryName'); | |
| 308 | |
| 309 @override | |
| 310 bool get hasTreeElements => unsupported('hasTreeElements'); | |
| 311 | |
| 312 @override | |
| 313 bool get isPackageLibrary => unsupported('isPackageLibrary'); | |
| 314 | |
| 315 @override | |
| 316 get libraryTag => unsupported('libraryTag'); | |
| 317 | |
| 318 @override | |
| 319 void set libraryTag(value) => unsupported('libraryTag'); | |
| 320 | |
| 321 @override | |
| 322 localLookup(elementName) => unsupported('localLookup'); | |
| 323 | |
| 324 @override | |
| 325 void recordResolvedTag(tag, library) => unsupported('recordResolvedTag'); | |
| 326 | |
| 327 @override | |
| 328 void setExports(exportedElements) => unsupported('setExports'); | |
| 329 | |
| 330 @override | |
| 331 get tags => unsupported('tags'); | |
| 332 | |
| 333 @override | |
| 334 get treeElements => unsupported('treeElements'); | |
| 335 } | |
| 336 | |
| 337 class TopLevelFunctionElementY extends ElementY implements dart2js.FunctionEleme nt { | |
|
sigurdm
2014/09/08 14:07:15
long line
Johnni Winther
2014/09/09 14:21:26
Done.
| |
| 338 analyzer.FunctionElement get element => super.element; | |
| 339 | |
| 340 final dart2js.FunctionSignature functionSignature = | |
| 341 new modelx.FunctionSignatureX( | |
| 342 const util.Link<dart2js.Element>(), | |
| 343 const util.Link<dart2js.Element>(), | |
| 344 0, 0, false, const <dart2js.Element>[], | |
| 345 new FunctionType.synthesized()); | |
| 346 | |
| 347 | |
| 348 // TODO(johnniwinther): Ensure the correct semantics of this. | |
| 349 @override | |
| 350 bool get isFactoryConstructor => false; | |
| 351 | |
| 352 @override | |
| 353 bool get isStatic { | |
| 354 // Semantic difference: Analyzer considers top-level and static class | |
| 355 // members to be static, dart2js only considers static class members to be | |
| 356 // static. | |
| 357 return false; | |
| 358 } | |
| 359 | |
| 360 // TODO(johnniwinther): Ensure the correct semantics of this. | |
| 361 @override | |
| 362 bool get isAbstract => false; | |
| 363 | |
| 364 @override | |
| 365 dart2js.ElementKind get kind => dart2js.ElementKind.FUNCTION; | |
| 366 | |
| 367 @override | |
| 368 bool get isClassMember => false; | |
| 369 | |
| 370 @override | |
| 371 bool get isInstanceMember => false; | |
| 372 | |
| 373 @override | |
| 374 bool get isTopLevel => true; | |
| 375 | |
| 376 TopLevelFunctionElementY(ElementConverter converter, | |
| 377 analyzer.FunctionElement element) | |
| 378 : super(converter, element); | |
| 379 | |
| 380 @override | |
| 381 get abstractField => unsupported('abstractField'); | |
| 382 | |
| 383 @override | |
| 384 computeSignature(_) => unsupported('computeSignature'); | |
| 385 | |
| 386 @override | |
| 387 bool get hasNode => unsupported('hasNode'); | |
| 388 | |
| 389 @override | |
| 390 bool get hasResolvedAst => unsupported('hasResolvedAst'); | |
| 391 | |
| 392 @override | |
| 393 bool get hasTreeElements => unsupported('hasTreeElements'); | |
| 394 | |
| 395 @override | |
| 396 get memberContext => unsupported('memberContext'); | |
| 397 | |
| 398 @override | |
| 399 get node => unsupported('node'); | |
| 400 | |
| 401 @override | |
| 402 get resolvedAst => unsupported('resolvedAst'); | |
| 403 | |
| 404 @override | |
| 405 get treeElements => unsupported('treeElements'); | |
| 406 | |
| 407 @override | |
| 408 FunctionType get type => functionSignature.type; | |
| 409 } | |
| OLD | NEW |