| 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 trydart.poi; | 5 library trydart.poi; |
| 6 | 6 |
| 7 import 'dart:async' show | 7 import 'dart:async' show |
| 8 Completer, | 8 Completer, |
| 9 Future; | 9 Future; |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 import 'package:compiler/compiler.dart' as api; | 27 import 'package:compiler/compiler.dart' as api; |
| 28 | 28 |
| 29 import 'package:compiler/src/dart2jslib.dart' show | 29 import 'package:compiler/src/dart2jslib.dart' show |
| 30 Compiler, | 30 Compiler, |
| 31 CompilerTask, | 31 CompilerTask, |
| 32 Enqueuer, | 32 Enqueuer, |
| 33 QueueFilter, | 33 QueueFilter, |
| 34 WorkItem; | 34 WorkItem; |
| 35 | 35 |
| 36 import 'package:compiler/src/elements/visitor.dart' show | 36 import 'package:compiler/src/elements/visitor.dart' show |
| 37 ElementVisitor; | 37 BaseElementVisitor; |
| 38 | 38 |
| 39 import 'package:compiler/src/elements/elements.dart' show | 39 import 'package:compiler/src/elements/elements.dart' show |
| 40 AbstractFieldElement, | 40 AbstractFieldElement, |
| 41 ClassElement, | 41 ClassElement, |
| 42 CompilationUnitElement, | 42 CompilationUnitElement, |
| 43 Element, | 43 Element, |
| 44 ElementCategory, | 44 ElementCategory, |
| 45 FunctionElement, | 45 FunctionElement, |
| 46 LibraryElement, | 46 LibraryElement, |
| 47 ScopeContainerElement; | 47 ScopeContainerElement; |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 if (poiCount != null) poiCount++; | 485 if (poiCount != null) poiCount++; |
| 486 if (success != true) { | 486 if (success != true) { |
| 487 throw 'Compilation failed'; | 487 throw 'Compilation failed'; |
| 488 } | 488 } |
| 489 return findPosition(position, cachedCompiler.mainApp); | 489 return findPosition(position, cachedCompiler.mainApp); |
| 490 }); | 490 }); |
| 491 } | 491 } |
| 492 | 492 |
| 493 Element findPosition(int position, Element element) { | 493 Element findPosition(int position, Element element) { |
| 494 FindPositionVisitor visitor = new FindPositionVisitor(position, element); | 494 FindPositionVisitor visitor = new FindPositionVisitor(position, element); |
| 495 element.accept(visitor); | 495 element.accept(visitor, null); |
| 496 return visitor.element; | 496 return visitor.element; |
| 497 } | 497 } |
| 498 | 498 |
| 499 String scopeInformation(Element element, int position) { | 499 String scopeInformation(Element element, int position) { |
| 500 ScopeInformationVisitor visitor = | 500 ScopeInformationVisitor visitor = |
| 501 new ScopeInformationVisitor(cachedCompiler, element, position); | 501 new ScopeInformationVisitor(cachedCompiler, element, position); |
| 502 element.accept(visitor); | 502 element.accept(visitor, null); |
| 503 return '${visitor.buffer}'; | 503 return '${visitor.buffer}'; |
| 504 } | 504 } |
| 505 | 505 |
| 506 class FindPositionVisitor extends ElementVisitor { | 506 class FindPositionVisitor extends BaseElementVisitor { |
| 507 final int position; | 507 final int position; |
| 508 Element element; | 508 Element element; |
| 509 | 509 |
| 510 FindPositionVisitor(this.position, this.element); | 510 FindPositionVisitor(this.position, this.element); |
| 511 | 511 |
| 512 visitElement(modelx.ElementX e) { | 512 visitElement(modelx.ElementX e, _) { |
| 513 DeclarationSite site = e.declarationSite; | 513 DeclarationSite site = e.declarationSite; |
| 514 if (site is PartialElement) { | 514 if (site is PartialElement) { |
| 515 if (site.beginToken.charOffset <= position && | 515 if (site.beginToken.charOffset <= position && |
| 516 position < site.endToken.next.charOffset) { | 516 position < site.endToken.next.charOffset) { |
| 517 element = e; | 517 element = e; |
| 518 } | 518 } |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 | 521 |
| 522 visitClassElement(ClassElement e) { | 522 visitClassElement(ClassElement e, _) { |
| 523 if (e is PartialClassElement) { | 523 if (e is PartialClassElement) { |
| 524 if (e.beginToken.charOffset <= position && | 524 if (e.beginToken.charOffset <= position && |
| 525 position < e.endToken.next.charOffset) { | 525 position < e.endToken.next.charOffset) { |
| 526 element = e; | 526 element = e; |
| 527 visitScopeContainerElement(e); | 527 visitScopeContainerElement(e, _); |
| 528 } | 528 } |
| 529 } | 529 } |
| 530 } | 530 } |
| 531 | 531 |
| 532 visitScopeContainerElement(ScopeContainerElement e) { | 532 visitScopeContainerElement(ScopeContainerElement e, _) { |
| 533 e.forEachLocalMember((Element element) => element.accept(this)); | 533 e.forEachLocalMember((Element element) => element.accept(this, _)); |
| 534 } | 534 } |
| 535 } | 535 } |
| 536 | 536 |
| 537 class ScriptOnlyFilter implements QueueFilter { | 537 class ScriptOnlyFilter implements QueueFilter { |
| 538 final Uri script; | 538 final Uri script; |
| 539 | 539 |
| 540 ScriptOnlyFilter(this.script); | 540 ScriptOnlyFilter(this.script); |
| 541 | 541 |
| 542 bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) => true; | 542 bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) => true; |
| 543 | 543 |
| 544 void processWorkItem(void f(WorkItem work), WorkItem work) { | 544 void processWorkItem(void f(WorkItem work), WorkItem work) { |
| 545 if (work.element.library.canonicalUri != script) { | 545 if (work.element.library.canonicalUri != script) { |
| 546 // TODO(ahe): Rather nasty hack to work around another nasty hack in | 546 // TODO(ahe): Rather nasty hack to work around another nasty hack in |
| 547 // backend.dart. Find better solution. | 547 // backend.dart. Find better solution. |
| 548 if (work.element.name != 'closureFromTearOff') { | 548 if (work.element.name != 'closureFromTearOff') { |
| 549 printWallClock('Skipped ${work.element}.'); | 549 printWallClock('Skipped ${work.element}.'); |
| 550 return; | 550 return; |
| 551 } | 551 } |
| 552 } | 552 } |
| 553 f(work); | 553 f(work); |
| 554 printWallClock('Processed ${work.element}.'); | 554 printWallClock('Processed ${work.element}.'); |
| 555 } | 555 } |
| 556 } | 556 } |
| 557 | 557 |
| 558 class PoiTask extends CompilerTask { | 558 class PoiTask extends CompilerTask { |
| 559 PoiTask(Compiler compiler) : super(compiler); | 559 PoiTask(Compiler compiler) : super(compiler); |
| 560 | 560 |
| 561 String get name => 'POI'; | 561 String get name => 'POI'; |
| 562 } | 562 } |
| OLD | NEW |