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