OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 analyzer.src.task.dart; | 5 library analyzer.src.task.dart; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 import 'dart:math' as math; | 8 import 'dart:math' as math; |
9 | 9 |
10 import 'package:analyzer/src/generated/ast.dart'; | 10 import 'package:analyzer/src/generated/ast.dart'; |
(...skipping 1662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1673 | 1673 |
1674 /** | 1674 /** |
1675 * A task that computes [CONSTANT_DEPENDENCIES] for a constant. | 1675 * A task that computes [CONSTANT_DEPENDENCIES] for a constant. |
1676 */ | 1676 */ |
1677 class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask { | 1677 class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask { |
1678 /** | 1678 /** |
1679 * The name of the [RESOLVED_UNIT6] input. | 1679 * The name of the [RESOLVED_UNIT6] input. |
1680 */ | 1680 */ |
1681 static const String UNIT_INPUT = 'UNIT_INPUT'; | 1681 static const String UNIT_INPUT = 'UNIT_INPUT'; |
1682 | 1682 |
| 1683 /** |
| 1684 * The name of the [TYPE_PROVIDER] input. |
| 1685 */ |
| 1686 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 1687 |
1683 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 1688 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
1684 'ComputeConstantDependenciesTask', createTask, buildInputs, | 1689 'ComputeConstantDependenciesTask', createTask, buildInputs, |
1685 <ResultDescriptor>[CONSTANT_DEPENDENCIES]); | 1690 <ResultDescriptor>[CONSTANT_DEPENDENCIES]); |
1686 | 1691 |
1687 ComputeConstantDependenciesTask( | 1692 ComputeConstantDependenciesTask( |
1688 InternalAnalysisContext context, ConstantEvaluationTarget constant) | 1693 InternalAnalysisContext context, ConstantEvaluationTarget constant) |
1689 : super(context, constant); | 1694 : super(context, constant); |
1690 | 1695 |
1691 @override | 1696 @override |
1692 TaskDescriptor get descriptor => DESCRIPTOR; | 1697 TaskDescriptor get descriptor => DESCRIPTOR; |
1693 | 1698 |
1694 @override | 1699 @override |
1695 void internalPerform() { | 1700 void internalPerform() { |
1696 // | 1701 // |
1697 // Prepare inputs. | 1702 // Prepare inputs. |
1698 // | 1703 // |
1699 // Note: UNIT_INPUT is not needed. It is merely a bookkeeping dependency | 1704 // Note: UNIT_INPUT is not needed. It is merely a bookkeeping dependency |
1700 // to ensure that resolution has occurred before we attempt to determine | 1705 // to ensure that resolution has occurred before we attempt to determine |
1701 // constant dependencies. | 1706 // constant dependencies. |
1702 // | 1707 // |
1703 ConstantEvaluationTarget constant = target; | 1708 ConstantEvaluationTarget constant = target; |
1704 AnalysisContext context = constant.context; | 1709 AnalysisContext context = constant.context; |
1705 TypeProvider typeProvider = context.typeProvider; | 1710 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
1706 // | 1711 // |
1707 // Compute dependencies. | 1712 // Compute dependencies. |
1708 // | 1713 // |
1709 List<ConstantEvaluationTarget> dependencies = <ConstantEvaluationTarget>[]; | 1714 List<ConstantEvaluationTarget> dependencies = <ConstantEvaluationTarget>[]; |
1710 new ConstantEvaluationEngine(typeProvider, context.declaredVariables) | 1715 new ConstantEvaluationEngine(typeProvider, context.declaredVariables) |
1711 .computeDependencies(constant, dependencies.add); | 1716 .computeDependencies(constant, dependencies.add); |
1712 // | 1717 // |
1713 // Record outputs. | 1718 // Record outputs. |
1714 // | 1719 // |
1715 outputs[CONSTANT_DEPENDENCIES] = dependencies; | 1720 outputs[CONSTANT_DEPENDENCIES] = dependencies; |
1716 } | 1721 } |
1717 | 1722 |
1718 /** | 1723 /** |
1719 * Return a map from the names of the inputs of this kind of task to the task | 1724 * Return a map from the names of the inputs of this kind of task to the task |
1720 * input descriptors describing those inputs for a task with the | 1725 * input descriptors describing those inputs for a task with the |
1721 * given [target]. | 1726 * given [target]. |
1722 */ | 1727 */ |
1723 static Map<String, TaskInput> buildInputs(ConstantEvaluationTarget target) { | 1728 static Map<String, TaskInput> buildInputs(ConstantEvaluationTarget target) { |
1724 if (target is Element) { | 1729 if (target is Element) { |
1725 CompilationUnitElementImpl unit = (target as Element) | 1730 CompilationUnitElementImpl unit = (target as Element) |
1726 .getAncestor((Element element) => element is CompilationUnitElement); | 1731 .getAncestor((Element element) => element is CompilationUnitElement); |
1727 return <String, TaskInput>{ | 1732 return <String, TaskInput>{ |
1728 UNIT_INPUT: RESOLVED_UNIT6 | 1733 UNIT_INPUT: RESOLVED_UNIT6 |
1729 .of(new LibrarySpecificUnit(unit.librarySource, target.source)) | 1734 .of(new LibrarySpecificUnit(unit.librarySource, target.source)), |
| 1735 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
1730 }; | 1736 }; |
1731 } else if (target is ConstantEvaluationTarget_Annotation) { | 1737 } else if (target is ConstantEvaluationTarget_Annotation) { |
1732 return <String, TaskInput>{ | 1738 return <String, TaskInput>{ |
1733 UNIT_INPUT: RESOLVED_UNIT6 | 1739 UNIT_INPUT: RESOLVED_UNIT6 |
1734 .of(new LibrarySpecificUnit(target.librarySource, target.source)) | 1740 .of(new LibrarySpecificUnit(target.librarySource, target.source)), |
| 1741 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
1735 }; | 1742 }; |
1736 } else { | 1743 } else { |
1737 // Should never happen. | 1744 // Should never happen. |
1738 assert(false); | 1745 assert(false); |
1739 return <String, TaskInput>{}; | 1746 return <String, TaskInput>{}; |
1740 } | 1747 } |
1741 } | 1748 } |
1742 | 1749 |
1743 /** | 1750 /** |
1744 * Create a [ResolveReferencesTask] based on the given [target] in | 1751 * Create a [ResolveReferencesTask] based on the given [target] in |
1745 * the given [context]. | 1752 * the given [context]. |
1746 */ | 1753 */ |
1747 static ComputeConstantDependenciesTask createTask( | 1754 static ComputeConstantDependenciesTask createTask( |
1748 AnalysisContext context, AnalysisTarget target) { | 1755 AnalysisContext context, AnalysisTarget target) { |
1749 return new ComputeConstantDependenciesTask(context, target); | 1756 return new ComputeConstantDependenciesTask(context, target); |
1750 } | 1757 } |
1751 } | 1758 } |
1752 | 1759 |
1753 /** | 1760 /** |
1754 * A task that computes the value of a constant ([CONSTANT_VALUE]) and | 1761 * A task that computes the value of a constant ([CONSTANT_VALUE]) and |
1755 * stores it in the element model. | 1762 * stores it in the element model. |
1756 */ | 1763 */ |
1757 class ComputeConstantValueTask extends ConstantEvaluationAnalysisTask { | 1764 class ComputeConstantValueTask extends ConstantEvaluationAnalysisTask { |
1758 /** | 1765 /** |
1759 * The name of the input which ensures that dependent constants are evaluated | 1766 * The name of the input which ensures that dependent constants are evaluated |
1760 * before the target. | 1767 * before the target. |
1761 */ | 1768 */ |
1762 static const String DEPENDENCIES_INPUT = 'DEPENDENCIES_INPUT'; | 1769 static const String DEPENDENCIES_INPUT = 'DEPENDENCIES_INPUT'; |
1763 | 1770 |
| 1771 /** |
| 1772 * The name of the [TYPE_PROVIDER] input. |
| 1773 */ |
| 1774 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 1775 |
1764 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 1776 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
1765 'ComputeConstantValueTask', createTask, buildInputs, | 1777 'ComputeConstantValueTask', createTask, buildInputs, |
1766 <ResultDescriptor>[CONSTANT_VALUE]); | 1778 <ResultDescriptor>[CONSTANT_VALUE]); |
1767 | 1779 |
1768 ComputeConstantValueTask( | 1780 ComputeConstantValueTask( |
1769 InternalAnalysisContext context, ConstantEvaluationTarget constant) | 1781 InternalAnalysisContext context, ConstantEvaluationTarget constant) |
1770 : super(context, constant); | 1782 : super(context, constant); |
1771 | 1783 |
1772 @override | 1784 @override |
1773 TaskDescriptor get descriptor => DESCRIPTOR; | 1785 TaskDescriptor get descriptor => DESCRIPTOR; |
1774 | 1786 |
1775 @override | 1787 @override |
1776 void internalPerform() { | 1788 void internalPerform() { |
1777 // | 1789 // |
1778 // Prepare inputs. | 1790 // Prepare inputs. |
1779 // | 1791 // |
1780 // Note: DEPENDENCIES_INPUT is not needed. It is merely a bookkeeping | 1792 // Note: DEPENDENCIES_INPUT is not needed. It is merely a bookkeeping |
1781 // dependency to ensure that the constants that this constant depends on | 1793 // dependency to ensure that the constants that this constant depends on |
1782 // are computed first. | 1794 // are computed first. |
1783 ConstantEvaluationTarget constant = target; | 1795 ConstantEvaluationTarget constant = target; |
1784 AnalysisContext context = constant.context; | 1796 AnalysisContext context = constant.context; |
1785 TypeProvider typeProvider = context.typeProvider; | 1797 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
1786 // | 1798 // |
1787 // Compute the value of the constant. | 1799 // Compute the value of the constant. |
1788 // | 1800 // |
1789 new ConstantEvaluationEngine(typeProvider, context.declaredVariables) | 1801 new ConstantEvaluationEngine(typeProvider, context.declaredVariables) |
1790 .computeConstantValue(constant); | 1802 .computeConstantValue(constant); |
1791 // | 1803 // |
1792 // Record outputs. | 1804 // Record outputs. |
1793 // | 1805 // |
1794 outputs[CONSTANT_VALUE] = constant; | 1806 outputs[CONSTANT_VALUE] = constant; |
1795 } | 1807 } |
1796 | 1808 |
1797 /** | 1809 /** |
1798 * Return a map from the names of the inputs of this kind of task to the task | 1810 * Return a map from the names of the inputs of this kind of task to the task |
1799 * input descriptors describing those inputs for a task with the given | 1811 * input descriptors describing those inputs for a task with the given |
1800 * [target]. | 1812 * [target]. |
1801 */ | 1813 */ |
1802 static Map<String, TaskInput> buildInputs(ConstantEvaluationTarget target) { | 1814 static Map<String, TaskInput> buildInputs(ConstantEvaluationTarget target) { |
1803 return <String, TaskInput>{ | 1815 return <String, TaskInput>{ |
1804 DEPENDENCIES_INPUT: | 1816 DEPENDENCIES_INPUT: |
1805 CONSTANT_DEPENDENCIES.of(target).toListOf(CONSTANT_VALUE) | 1817 CONSTANT_DEPENDENCIES.of(target).toListOf(CONSTANT_VALUE), |
| 1818 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
1806 }; | 1819 }; |
1807 } | 1820 } |
1808 | 1821 |
1809 /** | 1822 /** |
1810 * Create a [ComputeConstantValueTask] based on the given [target] in the | 1823 * Create a [ComputeConstantValueTask] based on the given [target] in the |
1811 * given [context]. | 1824 * given [context]. |
1812 */ | 1825 */ |
1813 static ComputeConstantValueTask createTask( | 1826 static ComputeConstantValueTask createTask( |
1814 AnalysisContext context, AnalysisTarget target) { | 1827 AnalysisContext context, AnalysisTarget target) { |
1815 return new ComputeConstantValueTask(context, target); | 1828 return new ComputeConstantValueTask(context, target); |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2280 * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input. | 2293 * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input. |
2281 */ | 2294 */ |
2282 static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS'; | 2295 static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS'; |
2283 | 2296 |
2284 /** | 2297 /** |
2285 * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input. | 2298 * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input. |
2286 */ | 2299 */ |
2287 static const String USED_IMPORTED_ELEMENTS_INPUT = 'USED_IMPORTED_ELEMENTS'; | 2300 static const String USED_IMPORTED_ELEMENTS_INPUT = 'USED_IMPORTED_ELEMENTS'; |
2288 | 2301 |
2289 /** | 2302 /** |
| 2303 * The name of the [TYPE_PROVIDER] input. |
| 2304 */ |
| 2305 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 2306 |
| 2307 /** |
2290 * The task descriptor describing this kind of task. | 2308 * The task descriptor describing this kind of task. |
2291 */ | 2309 */ |
2292 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 2310 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
2293 'GenerateHintsTask', createTask, buildInputs, <ResultDescriptor>[HINTS]); | 2311 'GenerateHintsTask', createTask, buildInputs, <ResultDescriptor>[HINTS]); |
2294 | 2312 |
2295 GenerateHintsTask(InternalAnalysisContext context, AnalysisTarget target) | 2313 GenerateHintsTask(InternalAnalysisContext context, AnalysisTarget target) |
2296 : super(context, target); | 2314 : super(context, target); |
2297 | 2315 |
2298 @override | 2316 @override |
2299 TaskDescriptor get descriptor => DESCRIPTOR; | 2317 TaskDescriptor get descriptor => DESCRIPTOR; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2333 new UnusedLocalElementsVerifier(errorListener, usedElements); | 2351 new UnusedLocalElementsVerifier(errorListener, usedElements); |
2334 unitElement.accept(visitor); | 2352 unitElement.accept(visitor); |
2335 } | 2353 } |
2336 // Dart2js analysis. | 2354 // Dart2js analysis. |
2337 if (context.analysisOptions.dart2jsHint) { | 2355 if (context.analysisOptions.dart2jsHint) { |
2338 unit.accept(new Dart2JSVerifier(errorReporter)); | 2356 unit.accept(new Dart2JSVerifier(errorReporter)); |
2339 } | 2357 } |
2340 // Dart best practices. | 2358 // Dart best practices. |
2341 InheritanceManager inheritanceManager = | 2359 InheritanceManager inheritanceManager = |
2342 new InheritanceManager(libraryElement); | 2360 new InheritanceManager(libraryElement); |
2343 TypeProvider typeProvider = context.typeProvider; | 2361 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
2344 unit.accept(new BestPracticesVerifier(errorReporter, typeProvider)); | 2362 unit.accept(new BestPracticesVerifier(errorReporter, typeProvider)); |
2345 unit.accept(new OverrideVerifier(errorReporter, inheritanceManager)); | 2363 unit.accept(new OverrideVerifier(errorReporter, inheritanceManager)); |
2346 // Find to-do comments. | 2364 // Find to-do comments. |
2347 new ToDoFinder(errorReporter).findIn(unit); | 2365 new ToDoFinder(errorReporter).findIn(unit); |
2348 // | 2366 // |
2349 // Record outputs. | 2367 // Record outputs. |
2350 // | 2368 // |
2351 outputs[HINTS] = errorListener.errors; | 2369 outputs[HINTS] = errorListener.errors; |
2352 } | 2370 } |
2353 | 2371 |
2354 /** | 2372 /** |
2355 * Return a map from the names of the inputs of this kind of task to the task | 2373 * Return a map from the names of the inputs of this kind of task to the task |
2356 * input descriptors describing those inputs for a task with the | 2374 * input descriptors describing those inputs for a task with the |
2357 * given [target]. | 2375 * given [target]. |
2358 */ | 2376 */ |
2359 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { | 2377 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { |
2360 Source libSource = target.library; | 2378 Source libSource = target.library; |
2361 return <String, TaskInput>{ | 2379 return <String, TaskInput>{ |
2362 RESOLVED_UNIT_INPUT: RESOLVED_UNIT.of(target), | 2380 RESOLVED_UNIT_INPUT: RESOLVED_UNIT.of(target), |
2363 USED_LOCAL_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) { | 2381 USED_LOCAL_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) { |
2364 LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit); | 2382 LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit); |
2365 return USED_LOCAL_ELEMENTS.of(target); | 2383 return USED_LOCAL_ELEMENTS.of(target); |
2366 }), | 2384 }), |
2367 USED_IMPORTED_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) { | 2385 USED_IMPORTED_ELEMENTS_INPUT: UNITS.of(libSource).toList((unit) { |
2368 LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit); | 2386 LibrarySpecificUnit target = new LibrarySpecificUnit(libSource, unit); |
2369 return USED_IMPORTED_ELEMENTS.of(target); | 2387 return USED_IMPORTED_ELEMENTS.of(target); |
2370 }) | 2388 }), |
| 2389 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
2371 }; | 2390 }; |
2372 } | 2391 } |
2373 | 2392 |
2374 /** | 2393 /** |
2375 * Create a [GenerateHintsTask] based on the given [target] in | 2394 * Create a [GenerateHintsTask] based on the given [target] in |
2376 * the given [context]. | 2395 * the given [context]. |
2377 */ | 2396 */ |
2378 static GenerateHintsTask createTask( | 2397 static GenerateHintsTask createTask( |
2379 AnalysisContext context, AnalysisTarget target) { | 2398 AnalysisContext context, AnalysisTarget target) { |
2380 return new GenerateHintsTask(context, target); | 2399 return new GenerateHintsTask(context, target); |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2795 * The name of the [LIBRARY_ELEMENT] input. | 2814 * The name of the [LIBRARY_ELEMENT] input. |
2796 */ | 2815 */ |
2797 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; | 2816 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; |
2798 | 2817 |
2799 /** | 2818 /** |
2800 * The name of the [RESOLVED_UNIT5] input. | 2819 * The name of the [RESOLVED_UNIT5] input. |
2801 */ | 2820 */ |
2802 static const String UNIT_INPUT = 'UNIT_INPUT'; | 2821 static const String UNIT_INPUT = 'UNIT_INPUT'; |
2803 | 2822 |
2804 /** | 2823 /** |
| 2824 * The name of the [TYPE_PROVIDER] input. |
| 2825 */ |
| 2826 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 2827 |
| 2828 /** |
2805 * The task descriptor describing this kind of task. | 2829 * The task descriptor describing this kind of task. |
2806 */ | 2830 */ |
2807 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 2831 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
2808 'ResolveReferencesTask', createTask, buildInputs, <ResultDescriptor>[ | 2832 'ResolveReferencesTask', createTask, buildInputs, <ResultDescriptor>[ |
2809 RESOLVE_REFERENCES_ERRORS, | 2833 RESOLVE_REFERENCES_ERRORS, |
2810 RESOLVED_UNIT6 | 2834 RESOLVED_UNIT6 |
2811 ]); | 2835 ]); |
2812 | 2836 |
2813 ResolveReferencesTask(InternalAnalysisContext context, AnalysisTarget target) | 2837 ResolveReferencesTask(InternalAnalysisContext context, AnalysisTarget target) |
2814 : super(context, target); | 2838 : super(context, target); |
2815 | 2839 |
2816 @override | 2840 @override |
2817 TaskDescriptor get descriptor => DESCRIPTOR; | 2841 TaskDescriptor get descriptor => DESCRIPTOR; |
2818 | 2842 |
2819 @override | 2843 @override |
2820 void internalPerform() { | 2844 void internalPerform() { |
2821 RecordingErrorListener errorListener = new RecordingErrorListener(); | 2845 RecordingErrorListener errorListener = new RecordingErrorListener(); |
2822 // | 2846 // |
2823 // Prepare inputs. | 2847 // Prepare inputs. |
2824 // | 2848 // |
2825 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); | 2849 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); |
2826 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 2850 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
2827 CompilationUnitElement unitElement = unit.element; | 2851 CompilationUnitElement unitElement = unit.element; |
2828 TypeProvider typeProvider = unitElement.context.typeProvider; | 2852 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
2829 // | 2853 // |
2830 // Resolve references. | 2854 // Resolve references. |
2831 // | 2855 // |
2832 InheritanceManager inheritanceManager = | 2856 InheritanceManager inheritanceManager = |
2833 new InheritanceManager(libraryElement); | 2857 new InheritanceManager(libraryElement); |
2834 AstVisitor visitor = new ResolverVisitor.con2(libraryElement, | 2858 AstVisitor visitor = new ResolverVisitor.con2(libraryElement, |
2835 unitElement.source, typeProvider, inheritanceManager, errorListener); | 2859 unitElement.source, typeProvider, inheritanceManager, errorListener); |
2836 unit.accept(visitor); | 2860 unit.accept(visitor); |
2837 // | 2861 // |
2838 // Record outputs. | 2862 // Record outputs. |
2839 // | 2863 // |
2840 outputs[RESOLVE_REFERENCES_ERRORS] = errorListener.errors; | 2864 outputs[RESOLVE_REFERENCES_ERRORS] = errorListener.errors; |
2841 outputs[RESOLVED_UNIT6] = unit; | 2865 outputs[RESOLVED_UNIT6] = unit; |
2842 } | 2866 } |
2843 | 2867 |
2844 /** | 2868 /** |
2845 * Return a map from the names of the inputs of this kind of task to the task | 2869 * Return a map from the names of the inputs of this kind of task to the task |
2846 * input descriptors describing those inputs for a task with the | 2870 * input descriptors describing those inputs for a task with the |
2847 * given [target]. | 2871 * given [target]. |
2848 */ | 2872 */ |
2849 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { | 2873 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { |
2850 return <String, TaskInput>{ | 2874 return <String, TaskInput>{ |
2851 LIBRARY_INPUT: LIBRARY_ELEMENT.of(target.library), | 2875 LIBRARY_INPUT: LIBRARY_ELEMENT.of(target.library), |
2852 UNIT_INPUT: RESOLVED_UNIT5.of(target) | 2876 UNIT_INPUT: RESOLVED_UNIT5.of(target), |
| 2877 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
2853 }; | 2878 }; |
2854 } | 2879 } |
2855 | 2880 |
2856 /** | 2881 /** |
2857 * Create a [ResolveReferencesTask] based on the given [target] in | 2882 * Create a [ResolveReferencesTask] based on the given [target] in |
2858 * the given [context]. | 2883 * the given [context]. |
2859 */ | 2884 */ |
2860 static ResolveReferencesTask createTask( | 2885 static ResolveReferencesTask createTask( |
2861 AnalysisContext context, AnalysisTarget target) { | 2886 AnalysisContext context, AnalysisTarget target) { |
2862 return new ResolveReferencesTask(context, target); | 2887 return new ResolveReferencesTask(context, target); |
2863 } | 2888 } |
2864 } | 2889 } |
2865 | 2890 |
2866 /** | 2891 /** |
2867 * A task that builds [RESOLVED_UNIT4] for a unit. | 2892 * A task that builds [RESOLVED_UNIT4] for a unit. |
2868 */ | 2893 */ |
2869 class ResolveUnitTypeNamesTask extends SourceBasedAnalysisTask { | 2894 class ResolveUnitTypeNamesTask extends SourceBasedAnalysisTask { |
2870 /** | 2895 /** |
2871 * The name of the [RESOLVED_UNIT3] input. | 2896 * The name of the [RESOLVED_UNIT3] input. |
2872 */ | 2897 */ |
2873 static const String UNIT_INPUT = 'UNIT_INPUT'; | 2898 static const String UNIT_INPUT = 'UNIT_INPUT'; |
2874 | 2899 |
2875 /** | 2900 /** |
| 2901 * The name of the [TYPE_PROVIDER] input. |
| 2902 */ |
| 2903 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 2904 |
| 2905 /** |
2876 * The task descriptor describing this kind of task. | 2906 * The task descriptor describing this kind of task. |
2877 */ | 2907 */ |
2878 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 2908 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
2879 'ResolveUnitTypeNamesTask', createTask, buildInputs, <ResultDescriptor>[ | 2909 'ResolveUnitTypeNamesTask', createTask, buildInputs, <ResultDescriptor>[ |
2880 RESOLVE_TYPE_NAMES_ERRORS, | 2910 RESOLVE_TYPE_NAMES_ERRORS, |
2881 RESOLVED_UNIT4 | 2911 RESOLVED_UNIT4 |
2882 ]); | 2912 ]); |
2883 | 2913 |
2884 ResolveUnitTypeNamesTask( | 2914 ResolveUnitTypeNamesTask( |
2885 InternalAnalysisContext context, AnalysisTarget target) | 2915 InternalAnalysisContext context, AnalysisTarget target) |
2886 : super(context, target); | 2916 : super(context, target); |
2887 | 2917 |
2888 @override | 2918 @override |
2889 TaskDescriptor get descriptor => DESCRIPTOR; | 2919 TaskDescriptor get descriptor => DESCRIPTOR; |
2890 | 2920 |
2891 @override | 2921 @override |
2892 void internalPerform() { | 2922 void internalPerform() { |
2893 RecordingErrorListener errorListener = new RecordingErrorListener(); | 2923 RecordingErrorListener errorListener = new RecordingErrorListener(); |
2894 // | 2924 // |
2895 // Prepare inputs. | 2925 // Prepare inputs. |
2896 // | 2926 // |
2897 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 2927 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
2898 CompilationUnitElement unitElement = unit.element; | 2928 CompilationUnitElement unitElement = unit.element; |
| 2929 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
2899 // | 2930 // |
2900 // Resolve TypeName nodes. | 2931 // Resolve TypeName nodes. |
2901 // | 2932 // |
2902 TypeResolverVisitor visitor = new TypeResolverVisitor.con2( | 2933 TypeResolverVisitor visitor = new TypeResolverVisitor.con2( |
2903 unitElement.library, unitElement.source, context.typeProvider, | 2934 unitElement.library, unitElement.source, typeProvider, errorListener); |
2904 errorListener); | |
2905 unit.accept(visitor); | 2935 unit.accept(visitor); |
2906 // | 2936 // |
2907 // Record outputs. | 2937 // Record outputs. |
2908 // | 2938 // |
2909 outputs[RESOLVE_TYPE_NAMES_ERRORS] = errorListener.errors; | 2939 outputs[RESOLVE_TYPE_NAMES_ERRORS] = errorListener.errors; |
2910 outputs[RESOLVED_UNIT4] = unit; | 2940 outputs[RESOLVED_UNIT4] = unit; |
2911 } | 2941 } |
2912 | 2942 |
2913 /** | 2943 /** |
2914 * Return a map from the names of the inputs of this kind of task to the task | 2944 * Return a map from the names of the inputs of this kind of task to the task |
2915 * input descriptors describing those inputs for a task with the | 2945 * input descriptors describing those inputs for a task with the |
2916 * given [target]. | 2946 * given [target]. |
2917 */ | 2947 */ |
2918 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { | 2948 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { |
2919 return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT3.of(target)}; | 2949 return <String, TaskInput>{ |
| 2950 UNIT_INPUT: RESOLVED_UNIT3.of(target), |
| 2951 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
| 2952 }; |
2920 } | 2953 } |
2921 | 2954 |
2922 /** | 2955 /** |
2923 * Create a [ResolveUnitTypeNamesTask] based on the given [target] in | 2956 * Create a [ResolveUnitTypeNamesTask] based on the given [target] in |
2924 * the given [context]. | 2957 * the given [context]. |
2925 */ | 2958 */ |
2926 static ResolveUnitTypeNamesTask createTask( | 2959 static ResolveUnitTypeNamesTask createTask( |
2927 AnalysisContext context, AnalysisTarget target) { | 2960 AnalysisContext context, AnalysisTarget target) { |
2928 return new ResolveUnitTypeNamesTask(context, target); | 2961 return new ResolveUnitTypeNamesTask(context, target); |
2929 } | 2962 } |
2930 } | 2963 } |
2931 | 2964 |
2932 /** | 2965 /** |
2933 * A task that builds [RESOLVED_UNIT5] for a unit. | 2966 * A task that builds [RESOLVED_UNIT5] for a unit. |
2934 */ | 2967 */ |
2935 class ResolveVariableReferencesTask extends SourceBasedAnalysisTask { | 2968 class ResolveVariableReferencesTask extends SourceBasedAnalysisTask { |
2936 /** | 2969 /** |
2937 * The name of the [LIBRARY_ELEMENT] input. | 2970 * The name of the [LIBRARY_ELEMENT] input. |
2938 */ | 2971 */ |
2939 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; | 2972 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; |
2940 | 2973 |
2941 /** | 2974 /** |
2942 * The name of the [RESOLVED_UNIT4] input. | 2975 * The name of the [RESOLVED_UNIT4] input. |
2943 */ | 2976 */ |
2944 static const String UNIT_INPUT = 'UNIT_INPUT'; | 2977 static const String UNIT_INPUT = 'UNIT_INPUT'; |
2945 | 2978 |
2946 /** | 2979 /** |
| 2980 * The name of the [TYPE_PROVIDER] input. |
| 2981 */ |
| 2982 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 2983 |
| 2984 /** |
2947 * The task descriptor describing this kind of task. | 2985 * The task descriptor describing this kind of task. |
2948 */ | 2986 */ |
2949 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 2987 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
2950 'ResolveVariableReferencesTask', createTask, buildInputs, | 2988 'ResolveVariableReferencesTask', createTask, buildInputs, |
2951 <ResultDescriptor>[RESOLVED_UNIT5]); | 2989 <ResultDescriptor>[RESOLVED_UNIT5]); |
2952 | 2990 |
2953 ResolveVariableReferencesTask( | 2991 ResolveVariableReferencesTask( |
2954 InternalAnalysisContext context, AnalysisTarget target) | 2992 InternalAnalysisContext context, AnalysisTarget target) |
2955 : super(context, target); | 2993 : super(context, target); |
2956 | 2994 |
2957 @override | 2995 @override |
2958 TaskDescriptor get descriptor => DESCRIPTOR; | 2996 TaskDescriptor get descriptor => DESCRIPTOR; |
2959 | 2997 |
2960 @override | 2998 @override |
2961 void internalPerform() { | 2999 void internalPerform() { |
2962 RecordingErrorListener errorListener = new RecordingErrorListener(); | 3000 RecordingErrorListener errorListener = new RecordingErrorListener(); |
2963 // | 3001 // |
2964 // Prepare inputs. | 3002 // Prepare inputs. |
2965 // | 3003 // |
2966 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); | 3004 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); |
2967 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 3005 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
2968 CompilationUnitElement unitElement = unit.element; | 3006 CompilationUnitElement unitElement = unit.element; |
2969 // | 3007 // |
2970 // Resolve local variables. | 3008 // Resolve local variables. |
2971 // | 3009 // |
2972 TypeProvider typeProvider = unitElement.context.typeProvider; | 3010 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
2973 Scope nameScope = new LibraryScope(libraryElement, errorListener); | 3011 Scope nameScope = new LibraryScope(libraryElement, errorListener); |
2974 AstVisitor visitor = new VariableResolverVisitor.con2(libraryElement, | 3012 AstVisitor visitor = new VariableResolverVisitor.con2(libraryElement, |
2975 unitElement.source, typeProvider, nameScope, errorListener); | 3013 unitElement.source, typeProvider, nameScope, errorListener); |
2976 unit.accept(visitor); | 3014 unit.accept(visitor); |
2977 // | 3015 // |
2978 // Record outputs. | 3016 // Record outputs. |
2979 // | 3017 // |
2980 outputs[RESOLVED_UNIT5] = unit; | 3018 outputs[RESOLVED_UNIT5] = unit; |
2981 } | 3019 } |
2982 | 3020 |
2983 /** | 3021 /** |
2984 * Return a map from the names of the inputs of this kind of task to the task | 3022 * Return a map from the names of the inputs of this kind of task to the task |
2985 * input descriptors describing those inputs for a task with the | 3023 * input descriptors describing those inputs for a task with the |
2986 * given [target]. | 3024 * given [target]. |
2987 */ | 3025 */ |
2988 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { | 3026 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { |
2989 return <String, TaskInput>{ | 3027 return <String, TaskInput>{ |
2990 LIBRARY_INPUT: LIBRARY_ELEMENT.of(target.library), | 3028 LIBRARY_INPUT: LIBRARY_ELEMENT.of(target.library), |
2991 UNIT_INPUT: RESOLVED_UNIT4.of(target) | 3029 UNIT_INPUT: RESOLVED_UNIT4.of(target), |
| 3030 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
2992 }; | 3031 }; |
2993 } | 3032 } |
2994 | 3033 |
2995 /** | 3034 /** |
2996 * Create a [ResolveVariableReferencesTask] based on the given [target] in | 3035 * Create a [ResolveVariableReferencesTask] based on the given [target] in |
2997 * the given [context]. | 3036 * the given [context]. |
2998 */ | 3037 */ |
2999 static ResolveVariableReferencesTask createTask( | 3038 static ResolveVariableReferencesTask createTask( |
3000 AnalysisContext context, AnalysisTarget target) { | 3039 AnalysisContext context, AnalysisTarget target) { |
3001 return new ResolveVariableReferencesTask(context, target); | 3040 return new ResolveVariableReferencesTask(context, target); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3072 /** | 3111 /** |
3073 * A task that builds [VERIFY_ERRORS] for a unit. | 3112 * A task that builds [VERIFY_ERRORS] for a unit. |
3074 */ | 3113 */ |
3075 class VerifyUnitTask extends SourceBasedAnalysisTask { | 3114 class VerifyUnitTask extends SourceBasedAnalysisTask { |
3076 /** | 3115 /** |
3077 * The name of the [RESOLVED_UNIT] input. | 3116 * The name of the [RESOLVED_UNIT] input. |
3078 */ | 3117 */ |
3079 static const String UNIT_INPUT = 'UNIT_INPUT'; | 3118 static const String UNIT_INPUT = 'UNIT_INPUT'; |
3080 | 3119 |
3081 /** | 3120 /** |
| 3121 * The name of the [TYPE_PROVIDER] input. |
| 3122 */ |
| 3123 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 3124 |
| 3125 /** |
3082 * The task descriptor describing this kind of task. | 3126 * The task descriptor describing this kind of task. |
3083 */ | 3127 */ |
3084 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('VerifyUnitTask', | 3128 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor('VerifyUnitTask', |
3085 createTask, buildInputs, <ResultDescriptor>[VERIFY_ERRORS]); | 3129 createTask, buildInputs, <ResultDescriptor>[VERIFY_ERRORS]); |
3086 | 3130 |
3087 /** | 3131 /** |
3088 * The [ErrorReporter] to report errors to. | 3132 * The [ErrorReporter] to report errors to. |
3089 */ | 3133 */ |
3090 ErrorReporter errorReporter; | 3134 ErrorReporter errorReporter; |
3091 | 3135 |
3092 VerifyUnitTask(InternalAnalysisContext context, AnalysisTarget target) | 3136 VerifyUnitTask(InternalAnalysisContext context, AnalysisTarget target) |
3093 : super(context, target); | 3137 : super(context, target); |
3094 | 3138 |
3095 @override | 3139 @override |
3096 TaskDescriptor get descriptor => DESCRIPTOR; | 3140 TaskDescriptor get descriptor => DESCRIPTOR; |
3097 | 3141 |
3098 @override | 3142 @override |
3099 void internalPerform() { | 3143 void internalPerform() { |
3100 RecordingErrorListener errorListener = new RecordingErrorListener(); | 3144 RecordingErrorListener errorListener = new RecordingErrorListener(); |
3101 Source source = getRequiredSource(); | 3145 Source source = getRequiredSource(); |
3102 errorReporter = new ErrorReporter(errorListener, source); | 3146 errorReporter = new ErrorReporter(errorListener, source); |
3103 TypeProvider typeProvider = context.typeProvider; | 3147 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
3104 // | 3148 // |
3105 // Prepare inputs. | 3149 // Prepare inputs. |
3106 // | 3150 // |
3107 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 3151 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
3108 CompilationUnitElement unitElement = unit.element; | 3152 CompilationUnitElement unitElement = unit.element; |
3109 LibraryElement libraryElement = unitElement.library; | 3153 LibraryElement libraryElement = unitElement.library; |
3110 // | 3154 // |
3111 // Use the ErrorVerifier to compute errors. | 3155 // Use the ErrorVerifier to compute errors. |
3112 // | 3156 // |
3113 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, | 3157 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, |
3114 libraryElement, typeProvider, new InheritanceManager(libraryElement)); | 3158 libraryElement, typeProvider, new InheritanceManager(libraryElement)); |
3115 unit.accept(errorVerifier); | 3159 unit.accept(errorVerifier); |
3116 // | 3160 // |
3117 // Record outputs. | 3161 // Record outputs. |
3118 // | 3162 // |
3119 outputs[VERIFY_ERRORS] = errorListener.errors; | 3163 outputs[VERIFY_ERRORS] = errorListener.errors; |
3120 } | 3164 } |
3121 | 3165 |
3122 /** | 3166 /** |
3123 * Return a map from the names of the inputs of this kind of task to the task | 3167 * Return a map from the names of the inputs of this kind of task to the task |
3124 * input descriptors describing those inputs for a task with the | 3168 * input descriptors describing those inputs for a task with the |
3125 * given [target]. | 3169 * given [target]. |
3126 */ | 3170 */ |
3127 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { | 3171 static Map<String, TaskInput> buildInputs(LibrarySpecificUnit target) { |
3128 return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT.of(target)}; | 3172 return <String, TaskInput>{ |
| 3173 UNIT_INPUT: RESOLVED_UNIT.of(target), |
| 3174 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
| 3175 }; |
3129 } | 3176 } |
3130 | 3177 |
3131 /** | 3178 /** |
3132 * Create a [VerifyUnitTask] based on the given [target] in | 3179 * Create a [VerifyUnitTask] based on the given [target] in |
3133 * the given [context]. | 3180 * the given [context]. |
3134 */ | 3181 */ |
3135 static VerifyUnitTask createTask( | 3182 static VerifyUnitTask createTask( |
3136 AnalysisContext context, AnalysisTarget target) { | 3183 AnalysisContext context, AnalysisTarget target) { |
3137 return new VerifyUnitTask(context, target); | 3184 return new VerifyUnitTask(context, target); |
3138 } | 3185 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3231 @override | 3278 @override |
3232 bool moveNext() { | 3279 bool moveNext() { |
3233 if (_newSources.isEmpty) { | 3280 if (_newSources.isEmpty) { |
3234 return false; | 3281 return false; |
3235 } | 3282 } |
3236 currentTarget = _newSources.first; | 3283 currentTarget = _newSources.first; |
3237 _newSources.remove(currentTarget); | 3284 _newSources.remove(currentTarget); |
3238 return true; | 3285 return true; |
3239 } | 3286 } |
3240 } | 3287 } |
OLD | NEW |