Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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('mirrors.dart2js'); | 5 #library('mirrors.dart2js'); |
| 6 | 6 |
| 7 #import('../../compiler/compiler.dart', prefix: 'diagnostics'); | 7 #import('../../compiler/compiler.dart', prefix: 'diagnostics'); |
| 8 #import('../../compiler/implementation/elements/elements.dart'); | 8 #import('../../compiler/implementation/elements/elements.dart'); |
| 9 #import('../../compiler/implementation/apiimpl.dart', prefix: 'api'); | 9 #import('../../compiler/implementation/apiimpl.dart', prefix: 'api'); |
| 10 #import('../../compiler/implementation/scanner/scannerlib.dart'); | 10 #import('../../compiler/implementation/scanner/scannerlib.dart'); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 | 98 |
| 99 MethodMirror _convertElementMethodToMethodMirror(Dart2jsObjectMirror library, | 99 MethodMirror _convertElementMethodToMethodMirror(Dart2jsObjectMirror library, |
| 100 Element element) { | 100 Element element) { |
| 101 if (element is FunctionElement) { | 101 if (element is FunctionElement) { |
| 102 return new Dart2jsMethodMirror(library, element); | 102 return new Dart2jsMethodMirror(library, element); |
| 103 } else { | 103 } else { |
| 104 return null; | 104 return null; |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 | 107 |
| 108 class Dart2jsMethodKind { | 108 class Dart2jsMethodKind { |
|
kasperl
2012/07/06 12:40:41
In general, I think I'd prefer calling these Dart2
Johnni Winther
2012/07/09 14:57:18
Done.
| |
| 109 static final Dart2jsMethodKind NORMAL = const Dart2jsMethodKind("normal"); | 109 static final Dart2jsMethodKind NORMAL = const Dart2jsMethodKind("normal"); |
| 110 static final Dart2jsMethodKind CONSTRUCTOR | 110 static final Dart2jsMethodKind CONSTRUCTOR |
| 111 = const Dart2jsMethodKind("constructor"); | 111 = const Dart2jsMethodKind("constructor"); |
| 112 static final Dart2jsMethodKind CONST = const Dart2jsMethodKind("const"); | 112 static final Dart2jsMethodKind CONST = const Dart2jsMethodKind("const"); |
| 113 static final Dart2jsMethodKind FACTORY = const Dart2jsMethodKind("factory"); | 113 static final Dart2jsMethodKind FACTORY = const Dart2jsMethodKind("factory"); |
| 114 static final Dart2jsMethodKind GETTER = const Dart2jsMethodKind("getter"); | 114 static final Dart2jsMethodKind GETTER = const Dart2jsMethodKind("getter"); |
| 115 static final Dart2jsMethodKind SETTER = const Dart2jsMethodKind("setter"); | 115 static final Dart2jsMethodKind SETTER = const Dart2jsMethodKind("setter"); |
| 116 static final Dart2jsMethodKind OPERATOR = const Dart2jsMethodKind("operator"); | 116 static final Dart2jsMethodKind OPERATOR = const Dart2jsMethodKind("operator"); |
| 117 | 117 |
| 118 final String text; | 118 final String text; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 void cancel([String reason, node, token, instruction, element]) { | 163 void cancel([String reason, node, token, instruction, element]) { |
| 164 print(reason); | 164 print(reason); |
| 165 } | 165 } |
| 166 | 166 |
| 167 void log(message) { | 167 void log(message) { |
| 168 print(message); | 168 print(message); |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 //------------------------------------------------------------------------------ | 172 //------------------------------------------------------------------------------ |
| 173 // Compiler extension for apidoc | |
|
kasperl
2012/07/06 12:40:41
Terminate comment with .
Johnni Winther
2012/07/09 14:57:18
Done.
| |
| 174 //------------------------------------------------------------------------------ | |
| 175 | |
| 176 /** | |
| 177 * Extension of the compiler that enables the analysis of several libraries with | |
| 178 * no particular entry point. | |
| 179 */ | |
| 180 class LibraryCompiler extends api.Compiler { | |
| 181 LibraryCompiler(diagnostics.ReadStringFromUri provider, | |
| 182 diagnostics.DiagnosticHandler handler, | |
| 183 Uri libraryRoot, Uri packageRoot, | |
| 184 List<String> options) | |
| 185 : super(provider, handler, libraryRoot, packageRoot, options) { | |
| 186 checker = new LibraryTypeCheckerTask(this); | |
| 187 resolver = new LibraryResolverTask(this); | |
| 188 } | |
| 189 | |
| 190 // TODO(johnniwinther): The following methods are added to enable the analysis | |
| 191 // of a collection of libraries to be used for apidoc. Most of the methods | |
| 192 // are based on copies of existing methods and could probably be implemented | |
| 193 // such that the duplicate code is avoided. Not to affect the correctness and | |
| 194 // speed of dart2js as is, the redundancy is accepted temporarily. | |
| 195 | |
| 196 /** | |
| 197 * Run the compiler on a list of libraries. No entry point is used. | |
| 198 */ | |
| 199 bool runList(List<Uri> uriList) { | |
| 200 bool success = _runList(uriList); | |
| 201 for (final task in tasks) { | |
| 202 log('${task.name} took ${task.timing}msec'); | |
| 203 } | |
| 204 return success; | |
| 205 } | |
| 206 | |
| 207 bool _runList(List<Uri> uriList) { | |
| 208 try { | |
| 209 runCompilerList(uriList); | |
| 210 } catch (CompilerCancelledException exception) { | |
| 211 log(exception.toString()); | |
| 212 log('compilation failed'); | |
| 213 return false; | |
| 214 } | |
| 215 tracer.close(); | |
| 216 log('compilation succeeded'); | |
| 217 return true; | |
| 218 } | |
| 219 | |
| 220 void runCompilerList(List<Uri> uriList) { | |
| 221 scanBuiltinLibraries(); | |
| 222 var elementList = <LibraryElement>[]; | |
| 223 for (var uri in uriList) { | |
| 224 elementList.add(scanner.loadLibrary(uri, null)); | |
| 225 } | |
| 226 | |
| 227 world.populate(this, libraries.getValues()); | |
| 228 | |
| 229 log('Resolving...'); | |
| 230 phase = Compiler.PHASE_RESOLVING; | |
| 231 backend.enqueueHelpers(enqueuer.resolution); | |
| 232 processQueueList(enqueuer.resolution, elementList); | |
| 233 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); | |
| 234 } | |
| 235 | |
| 236 void processQueueList(Enqueuer world, List<LibraryElement> elements) { | |
| 237 backend.processNativeClasses(world, libraries.getValues()); | |
| 238 for (var library in elements) { | |
| 239 library.elements.forEach((_, element) { | |
| 240 world.addToWorkList(element); | |
| 241 }); | |
| 242 } | |
| 243 progress.reset(); | |
| 244 world.forEach((WorkItem work) { | |
| 245 withCurrentElement(work.element, () => work.run(this, world)); | |
| 246 }); | |
| 247 //world.queueIsClosed = true; | |
| 248 assert(world.checkNoEnqueuedInvokedInstanceMethods()); | |
| 249 world.registerFieldClosureInvocations(); | |
| 250 } | |
| 251 | |
| 252 String codegen(WorkItem work, Enqueuer world) { | |
| 253 return null; | |
| 254 } | |
| 255 } | |
| 256 | |
| 257 // TODO(johnniwinther): The source for the apidoc includes calls to methods on | |
| 258 // for instance [MathPrimitives] which are not resolved by dart2js. Since we | |
| 259 // do not need to analyse the body of functions to produce the documenation | |
| 260 // we use a specialized resolver which bypasses method bodies. | |
|
Lasse Reichstein Nielsen
2012/07/09 10:39:33
Good choice. I expect to see MathNatives go away f
| |
| 261 class LibraryResolverTask extends ResolverTask { | |
| 262 LibraryResolverTask(api.Compiler compiler) : super(compiler); | |
| 263 | |
| 264 void visitBody(ResolverVisitor visitor, Statement body) {} | |
| 265 } | |
| 266 | |
| 267 // TODO(johnniwinther): As a side-effect of bypassing method bodies in | |
| 268 // [LibraryResolveTask] we can not perform the typecheck. | |
| 269 class LibraryTypeCheckerTask extends TypeCheckerTask { | |
| 270 LibraryTypeCheckerTask(api.Compiler compiler) : super(compiler); | |
| 271 | |
| 272 void check(Node tree, TreeElements elements) {} | |
| 273 } | |
| 274 | |
| 275 //------------------------------------------------------------------------------ | |
| 173 // Compilation implementation | 276 // Compilation implementation |
| 174 //------------------------------------------------------------------------------ | 277 //------------------------------------------------------------------------------ |
| 175 | 278 |
| 176 class Dart2jsCompilation implements Compilation { | 279 class Dart2jsCompilation implements Compilation { |
| 177 api.Compiler _compiler; | 280 api.Compiler _compiler; |
| 178 Uri cwd; | 281 Uri cwd; |
| 179 bool isAborting = false; | 282 bool isAborting = false; |
| 180 Map<String, SourceFile> sourceFiles; | 283 Map<String, SourceFile> sourceFiles; |
| 181 | 284 |
| 182 Future<String> provider(Uri uri) { | 285 Future<String> provider(Uri uri) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 223 } else { | 326 } else { |
| 224 packageUri = libraryUri; | 327 packageUri = libraryUri; |
| 225 } | 328 } |
| 226 _compiler = new api.Compiler(provider, handler, | 329 _compiler = new api.Compiler(provider, handler, |
| 227 libraryUri, packageUri, <String>[]); | 330 libraryUri, packageUri, <String>[]); |
| 228 var scriptUri = cwd.resolve(nativeToUriPath(script)); | 331 var scriptUri = cwd.resolve(nativeToUriPath(script)); |
| 229 // TODO(johnniwinther): Detect file not found | 332 // TODO(johnniwinther): Detect file not found |
| 230 _compiler.run(scriptUri); | 333 _compiler.run(scriptUri); |
| 231 } | 334 } |
| 232 | 335 |
| 336 Dart2jsCompilation.library(List<String> libraries, String libraryRoot, | |
| 337 [String packageRoot, List<String> opts = const []]) | |
| 338 : cwd = getCurrentDirectory(), | |
| 339 sourceFiles = <SourceFile>{} | |
| 340 { | |
|
Lasse Reichstein Nielsen
2012/07/09 10:39:33
Brace on previous line.
Johnni Winther
2012/07/09 14:57:18
Done.
| |
| 341 var libraryUri = cwd.resolve(nativeToUriPath(libraryRoot)); | |
| 342 var packageUri; | |
| 343 if (packageRoot !== null) { | |
| 344 packageUri = cwd.resolve(nativeToUriPath(packageRoot)); | |
| 345 } else { | |
| 346 packageUri = libraryUri; | |
| 347 } | |
| 348 _compiler = new LibraryCompiler(provider, handler, | |
| 349 libraryUri, packageUri, <String>[]); | |
| 350 var librariesUri = <Uri>[]; | |
| 351 for (var library in libraries) { | |
| 352 librariesUri.add(cwd.resolve(nativeToUriPath(library))); | |
| 353 // TODO(johnniwinther): Detect file not found | |
| 354 } | |
| 355 _compiler.runList(librariesUri); | |
| 356 } | |
| 357 | |
| 233 void addLibrary(String path) { | 358 void addLibrary(String path) { |
| 234 var uri = cwd.resolve(nativeToUriPath(path)); | 359 var uri = cwd.resolve(nativeToUriPath(path)); |
| 235 _compiler.scanner.loadLibrary(uri, null); | 360 _compiler.scanner.loadLibrary(uri, null); |
| 236 } | 361 } |
| 237 | 362 |
| 238 MirrorSystem mirrors() => new Dart2jsMirrorSystem(_compiler); | 363 MirrorSystem mirrors() => new Dart2jsMirrorSystem(_compiler); |
| 239 } | 364 } |
| 240 | 365 |
| 241 | 366 |
| 242 //------------------------------------------------------------------------------ | 367 //------------------------------------------------------------------------------ |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 268 assert (_element !== null); | 393 assert (_element !== null); |
| 269 } | 394 } |
| 270 | 395 |
| 271 String simpleName() => _element.name.slowToString(); | 396 String simpleName() => _element.name.slowToString(); |
| 272 | 397 |
| 273 Location location() => new Dart2jsLocation( | 398 Location location() => new Dart2jsLocation( |
| 274 _element.getCompilationUnit().script, | 399 _element.getCompilationUnit().script, |
| 275 system.compiler.spanFromElement(_element)); | 400 system.compiler.spanFromElement(_element)); |
| 276 | 401 |
| 277 String toString() => _element.toString(); | 402 String toString() => _element.toString(); |
| 403 | |
| 404 int hashCode() => qualifiedName().hashCode(); | |
| 278 } | 405 } |
| 279 | 406 |
| 280 abstract class Dart2jsProxyMirror implements Dart2jsMirror { | 407 abstract class Dart2jsProxyMirror implements Dart2jsMirror { |
| 281 final Dart2jsMirrorSystem system; | 408 final Dart2jsMirrorSystem system; |
| 282 | 409 |
| 283 Dart2jsProxyMirror(this.system); | 410 Dart2jsProxyMirror(this.system); |
| 411 | |
| 412 int hashCode() => qualifiedName().hashCode(); | |
| 284 } | 413 } |
| 285 | 414 |
| 286 /////////////////////////////////////////////////////// | 415 /////////////////////////////////////////////////////// |
| 287 // implementation | 416 // implementation |
| 288 /////////////////////////////////////////////////////// | 417 /////////////////////////////////////////////////////// |
| 289 | 418 |
| 290 class Dart2jsMirrorSystem implements MirrorSystem, Dart2jsMirror { | 419 class Dart2jsMirrorSystem implements MirrorSystem, Dart2jsMirror { |
| 291 final api.Compiler compiler; | 420 final api.Compiler compiler; |
| 292 Map<String, Dart2jsLibraryMirror> _libraries; | 421 Map<String, Dart2jsLibraryMirror> _libraries; |
| 293 Map<LibraryElement, Dart2jsLibraryMirror> _libraryMap; | 422 Map<LibraryElement, Dart2jsLibraryMirror> _libraryMap; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 314 Dart2jsLibraryMirror getLibrary(LibraryElement element) { | 443 Dart2jsLibraryMirror getLibrary(LibraryElement element) { |
| 315 return _libraryMap[element]; | 444 return _libraryMap[element]; |
| 316 } | 445 } |
| 317 | 446 |
| 318 Dart2jsMirrorSystem get system() => this; | 447 Dart2jsMirrorSystem get system() => this; |
| 319 | 448 |
| 320 String simpleName() => "mirror"; | 449 String simpleName() => "mirror"; |
| 321 String qualifiedName() => simpleName(); | 450 String qualifiedName() => simpleName(); |
| 322 | 451 |
| 323 String get canonicalName() => simpleName(); | 452 String get canonicalName() => simpleName(); |
| 453 | |
| 454 // TODO(johnniwinther): Hack! Dart2jsMirrorSystem need not be a Mirror. | |
| 455 int hashCode() => qualifiedName().hashCode(); | |
| 324 } | 456 } |
| 325 | 457 |
| 326 abstract class Dart2jsObjectMirror extends Dart2jsElementMirror | 458 abstract class Dart2jsObjectMirror extends Dart2jsElementMirror |
| 327 implements ObjectMirror { | 459 implements ObjectMirror { |
| 328 Dart2jsObjectMirror(Dart2jsMirrorSystem system, Element element) | 460 Dart2jsObjectMirror(Dart2jsMirrorSystem system, Element element) |
| 329 : super(system, element); | 461 : super(system, element); |
| 330 } | 462 } |
| 331 | 463 |
| 332 class Dart2jsLibraryMirror extends Dart2jsObjectMirror | 464 class Dart2jsLibraryMirror extends Dart2jsObjectMirror |
| 333 implements LibraryMirror { | 465 implements LibraryMirror { |
| 334 Map<String, InterfaceMirror> _types; | 466 Map<String, InterfaceMirror> _types; |
| 335 Map<String, MemberMirror> _members; | 467 Map<String, MemberMirror> _members; |
| 336 | 468 |
| 337 Dart2jsLibraryMirror(Dart2jsMirrorSystem system, LibraryElement library) | 469 Dart2jsLibraryMirror(Dart2jsMirrorSystem system, LibraryElement library) |
| 338 : super(system, library); | 470 : super(system, library); |
| 339 | 471 |
| 340 LibraryElement get _library() => _element; | 472 LibraryElement get _library() => _element; |
| 341 | 473 |
| 474 LibraryMirror library() => this; | |
| 475 | |
| 342 String get canonicalName() => simpleName(); | 476 String get canonicalName() => simpleName(); |
| 343 | 477 |
| 344 /** | 478 /** |
| 345 * Returns the library name (for libraries with a #library tag) or the script | 479 * Returns the library name (for libraries with a #library tag) or the script |
| 346 * file name (for scripts without a #library tag). The latter case is used to | 480 * file name (for scripts without a #library tag). The latter case is used to |
| 347 * provide a 'library name' for scripts, to use for instance in dartdoc. | 481 * provide a 'library name' for scripts, to use for instance in dartdoc. |
| 348 */ | 482 */ |
| 349 String simpleName() { | 483 String simpleName() { |
| 350 if (_library.libraryTag !== null) { | 484 if (_library.libraryTag !== null) { |
| 351 return _library.libraryTag.argument.dartString.slowToString(); | 485 return _library.libraryTag.argument.dartString.slowToString(); |
| (...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1179 if (node !== null) { | 1313 if (node !== null) { |
| 1180 var span = system.compiler.spanFromNode(node, script.uri); | 1314 var span = system.compiler.spanFromNode(node, script.uri); |
| 1181 return new Dart2jsLocation(script, span); | 1315 return new Dart2jsLocation(script, span); |
| 1182 } else { | 1316 } else { |
| 1183 var span = system.compiler.spanFromElement(_variable); | 1317 var span = system.compiler.spanFromElement(_variable); |
| 1184 return new Dart2jsLocation(script, span); | 1318 return new Dart2jsLocation(script, span); |
| 1185 } | 1319 } |
| 1186 } | 1320 } |
| 1187 } | 1321 } |
| 1188 | 1322 |
| OLD | NEW |