Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(660)

Side by Side Diff: pkg/analyzer/lib/src/task/dart.dart

Issue 1386023002: Resolve ordering issues. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Small fixes Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 8
9 import 'package:analyzer/src/context/cache.dart'; 9 import 'package:analyzer/src/context/cache.dart';
10 import 'package:analyzer/src/generated/ast.dart'; 10 import 'package:analyzer/src/generated/ast.dart';
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 /** 146 /**
147 * The sources representing the combined import/export closure of a library. 147 * The sources representing the combined import/export closure of a library.
148 * The [Source]s include only library sources, not their units. 148 * The [Source]s include only library sources, not their units.
149 * 149 *
150 * The result is only available for [Source]s representing a library. 150 * The result is only available for [Source]s representing a library.
151 */ 151 */
152 final ListResultDescriptor<Source> IMPORT_EXPORT_SOURCE_CLOSURE = 152 final ListResultDescriptor<Source> IMPORT_EXPORT_SOURCE_CLOSURE =
153 new ListResultDescriptor<Source>('IMPORT_EXPORT_SOURCE_CLOSURE', null); 153 new ListResultDescriptor<Source>('IMPORT_EXPORT_SOURCE_CLOSURE', null);
154 154
155 /** 155 /**
156 * The errors produced while inferring the type of a static variable. 156 * A list of the [LibraryElement]s that make up the strongly connected
157 * component in the import/export graph in which the target resides.
157 * 158 *
158 * The list will be empty if there were no errors, but will not be `null`. 159 * Only non-empty in strongMode
Brian Wilkerson 2015/10/06 19:04:46 nit: It would be helpful (here and elsewhere) to i
Leaf 2015/10/07 18:53:55 Done.
159 * 160 *
160 * The result is only available for [VariableElement]s, and only when strong
161 * mode is enabled.
162 */ 161 */
163 final ListResultDescriptor<AnalysisError> INFER_STATIC_VARIABLE_ERRORS = 162 final ListResultDescriptor<LibraryElement> LIBRARY_CYCLE =
164 new ListResultDescriptor<AnalysisError>( 163 new ListResultDescriptor<LibraryElement>('LIBRARY_CYCLE', null);
165 'INFER_STATIC_VARIABLE_ERRORS', AnalysisError.NO_ERRORS);
166 164
167 /** 165 /**
168 * The errors produced while inferring the types of all of the static variables 166 * A list of the [CompilationUnitElement]s (including all parts) that make up
169 * in a compilation unit. 167 * the strongly connected component in the import/export graph in which the
168 * target resides.
170 * 169 *
171 * The list will be empty if there were no errors, but will not be `null`. 170 * Only non-empty in strongMode
172 * 171 *
173 * The result is only available for [LibrarySpecificUnit]s.
174 */ 172 */
175 final ListResultDescriptor<AnalysisError> INFER_STATIC_VARIABLE_TYPES_ERRORS = 173 final ListResultDescriptor<CompilationUnitElement> LIBRARY_CYCLE_UNITS =
176 new ListResultDescriptor<AnalysisError>( 174 new ListResultDescriptor<CompilationUnitElement>(
177 'INFER_STATIC_VARIABLE_TYPES_ERRORS', AnalysisError.NO_ERRORS); 175 'LIBRARY_CYCLE_UNITS', null);
176
177 /**
178 * A list of the [CompilationUnitElement]s that comprise all of the parts and
179 * libraries in the direct import/export dependencies of the library cycle
180 * of the target, with the intra-component dependencies excluded.
181 *
182 * Only non-empty in strongMode
183 *
184 */
185 final ListResultDescriptor<CompilationUnitElement> LIBRARY_CYCLE_DEPENDENCIES =
186 new ListResultDescriptor<CompilationUnitElement>(
187 'LIBRARY_CYCLE_DEPENDENCIES', null);
178 188
179 /** 189 /**
180 * A list of the [VariableElement]s whose type should be inferred that another 190 * A list of the [VariableElement]s whose type should be inferred that another
181 * inferable static variable (the target) depends on. 191 * inferable static variable (the target) depends on.
182 * 192 *
183 * The result is only available for [VariableElement]s, and only when strong 193 * The result is only available for [VariableElement]s, and only when strong
184 * mode is enabled. 194 * mode is enabled.
185 */ 195 */
186 final ListResultDescriptor< 196 final ListResultDescriptor<
187 VariableElement> INFERABLE_STATIC_VARIABLE_DEPENDENCIES = 197 VariableElement> INFERABLE_STATIC_VARIABLE_DEPENDENCIES =
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 * 305 *
296 * The list will be empty if there were no errors, but will not be `null`. 306 * The list will be empty if there were no errors, but will not be `null`.
297 * 307 *
298 * The result is only available for [Source]s representing a compilation unit. 308 * The result is only available for [Source]s representing a compilation unit.
299 */ 309 */
300 final ListResultDescriptor<AnalysisError> PARSE_ERRORS = 310 final ListResultDescriptor<AnalysisError> PARSE_ERRORS =
301 new ListResultDescriptor<AnalysisError>( 311 new ListResultDescriptor<AnalysisError>(
302 'PARSE_ERRORS', AnalysisError.NO_ERRORS); 312 'PARSE_ERRORS', AnalysisError.NO_ERRORS);
303 313
304 /** 314 /**
305 * The errors produced while resolving references outside of function bodies.
306 *
307 * The list will be empty if there were no errors, but will not be `null`.
308 *
309 * The result is only available for [LibrarySpecificUnit]s.
310 */
311 final ListResultDescriptor<AnalysisError> PARTIALLY_RESOLVE_REFERENCES_ERRORS =
312 new ListResultDescriptor<AnalysisError>(
313 'PARTIALLY_RESOLVE_REFERENCES_ERRORS', AnalysisError.NO_ERRORS);
314
315 /**
316 * The names (resolved and not) referenced by a unit. 315 * The names (resolved and not) referenced by a unit.
317 * 316 *
318 * The result is only available for [Source]s representing a compilation unit. 317 * The result is only available for [Source]s representing a compilation unit.
319 */ 318 */
320 final ResultDescriptor<ReferencedNames> REFERENCED_NAMES = 319 final ResultDescriptor<ReferencedNames> REFERENCED_NAMES =
321 new ResultDescriptor<ReferencedNames>('REFERENCED_NAMES', null); 320 new ResultDescriptor<ReferencedNames>('REFERENCED_NAMES', null);
322 321
323 /** 322 /**
324 * The errors produced while resolving the function bodies within a compilation 323 * The errors produced while resolving a full compilation unit.
325 * unit.
326 * 324 *
327 * The list will be empty if there were no errors, but will not be `null`. 325 * The list will be empty if there were no errors, but will not be `null`.
328 * 326 *
329 * The result is only available for [LibrarySpecificUnit]s. 327 * The result is only available for [LibrarySpecificUnit]s.
330 */ 328 */
331 final ListResultDescriptor<AnalysisError> RESOLVE_FUNCTION_BODIES_ERRORS = 329 final ListResultDescriptor<AnalysisError> RESOLVE_UNIT_ERRORS =
332 new ListResultDescriptor<AnalysisError>( 330 new ListResultDescriptor<AnalysisError>(
333 'RESOLVE_FUNCTION_BODIES_ERRORS', AnalysisError.NO_ERRORS); 331 'RESOLVE_UNIT_ERRORS', AnalysisError.NO_ERRORS);
334 332
335 /** 333 /**
336 * The errors produced while resolving type names. 334 * The errors produced while resolving type names.
337 * 335 *
338 * The list will be empty if there were no errors, but will not be `null`. 336 * The list will be empty if there were no errors, but will not be `null`.
339 * 337 *
340 * The result is only available for [LibrarySpecificUnit]s. 338 * The result is only available for [LibrarySpecificUnit]s.
341 */ 339 */
342 final ListResultDescriptor<AnalysisError> RESOLVE_TYPE_NAMES_ERRORS = 340 final ListResultDescriptor<AnalysisError> RESOLVE_TYPE_NAMES_ERRORS =
343 new ListResultDescriptor<AnalysisError>( 341 new ListResultDescriptor<AnalysisError>(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 * that is true of a [RESOLVED_UNIT5]. 402 * that is true of a [RESOLVED_UNIT5].
405 * 403 *
406 * The result is only available for [LibrarySpecificUnit]s. 404 * The result is only available for [LibrarySpecificUnit]s.
407 */ 405 */
408 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT6 = 406 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT6 =
409 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT6', null, 407 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT6', null,
410 cachingPolicy: AST_CACHING_POLICY); 408 cachingPolicy: AST_CACHING_POLICY);
411 409
412 /** 410 /**
413 * The resolved [CompilationUnit] associated with a compilation unit in which 411 * The resolved [CompilationUnit] associated with a compilation unit in which
414 * the types of class members have been inferred in addition to everything that 412 * the right hand sides of instance variables have been re-resolved in addition
415 * is true of a [RESOLVED_UNIT7]. 413 * to everything that is true of a [RESOLVED_UNIT6].
416 * 414 *
417 * The result is only available for [LibrarySpecificUnit]s. 415 * The result is only available for [LibrarySpecificUnit]s.
418 */ 416 */
419 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT7 = 417 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT7 =
420 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT7', null, 418 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT7', null,
421 cachingPolicy: AST_CACHING_POLICY); 419 cachingPolicy: AST_CACHING_POLICY);
422 420
423 /** 421 /**
424 * The resolved [CompilationUnit] associated with a compilation unit, with 422 * The resolved [CompilationUnit] associated with a compilation unit in which
425 * constants not yet resolved. 423 * the types of class members have been inferred in addition to everything that
424 * is true of a [RESOLVED_UNIT8].
426 * 425 *
427 * The result is only available for [LibrarySpecificUnit]s. 426 * The result is only available for [LibrarySpecificUnit]s.
428 */ 427 */
429 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT8 = 428 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT8 =
430 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT8', null, 429 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT8', null,
431 cachingPolicy: AST_CACHING_POLICY); 430 cachingPolicy: AST_CACHING_POLICY);
432 431
433 /** 432 /**
433 * The resolved [CompilationUnit] associated with a compilation unit, with
434 * constants not yet resolved.
435 *
436 * The result is only available for [LibrarySpecificUnit]s.
437 */
438 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT9 =
439 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT9', null,
440 cachingPolicy: AST_CACHING_POLICY);
441
442 /**
434 * The errors produced while scanning a compilation unit. 443 * The errors produced while scanning a compilation unit.
435 * 444 *
436 * The list will be empty if there were no errors, but will not be `null`. 445 * The list will be empty if there were no errors, but will not be `null`.
437 * 446 *
438 * The result is only available for [Source]s representing a compilation unit. 447 * The result is only available for [Source]s representing a compilation unit.
439 */ 448 */
440 final ListResultDescriptor<AnalysisError> SCAN_ERRORS = 449 final ListResultDescriptor<AnalysisError> SCAN_ERRORS =
441 new ListResultDescriptor<AnalysisError>( 450 new ListResultDescriptor<AnalysisError>(
442 'SCAN_ERRORS', AnalysisError.NO_ERRORS); 451 'SCAN_ERRORS', AnalysisError.NO_ERRORS);
443 452
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after
1475 AnalysisContext context, AnalysisTarget target) { 1484 AnalysisContext context, AnalysisTarget target) {
1476 return new BuildTypeProviderTask(context, target); 1485 return new BuildTypeProviderTask(context, target);
1477 } 1486 }
1478 } 1487 }
1479 1488
1480 /** 1489 /**
1481 * A task that computes [CONSTANT_DEPENDENCIES] for a constant. 1490 * A task that computes [CONSTANT_DEPENDENCIES] for a constant.
1482 */ 1491 */
1483 class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask { 1492 class ComputeConstantDependenciesTask extends ConstantEvaluationAnalysisTask {
1484 /** 1493 /**
1485 * The name of the [RESOLVED_UNIT8] input. 1494 * The name of the [RESOLVED_UNIT9] input.
1486 */ 1495 */
1487 static const String UNIT_INPUT = 'UNIT_INPUT'; 1496 static const String UNIT_INPUT = 'UNIT_INPUT';
1488 1497
1489 /** 1498 /**
1490 * The name of the [TYPE_PROVIDER] input. 1499 * The name of the [TYPE_PROVIDER] input.
1491 */ 1500 */
1492 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; 1501 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
1493 1502
1494 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 1503 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
1495 'ComputeConstantDependenciesTask', 1504 'ComputeConstantDependenciesTask',
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 /** 1540 /**
1532 * Return a map from the names of the inputs of this kind of task to the task 1541 * Return a map from the names of the inputs of this kind of task to the task
1533 * input descriptors describing those inputs for a task with the 1542 * input descriptors describing those inputs for a task with the
1534 * given [target]. 1543 * given [target].
1535 */ 1544 */
1536 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 1545 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
1537 if (target is Element) { 1546 if (target is Element) {
1538 CompilationUnitElementImpl unit = target 1547 CompilationUnitElementImpl unit = target
1539 .getAncestor((Element element) => element is CompilationUnitElement); 1548 .getAncestor((Element element) => element is CompilationUnitElement);
1540 return <String, TaskInput>{ 1549 return <String, TaskInput>{
1541 UNIT_INPUT: RESOLVED_UNIT8 1550 UNIT_INPUT: RESOLVED_UNIT9
1542 .of(new LibrarySpecificUnit(unit.librarySource, target.source)), 1551 .of(new LibrarySpecificUnit(unit.librarySource, target.source)),
1543 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) 1552 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
1544 }; 1553 };
1545 } else if (target is ConstantEvaluationTarget_Annotation) { 1554 } else if (target is ConstantEvaluationTarget_Annotation) {
1546 return <String, TaskInput>{ 1555 return <String, TaskInput>{
1547 UNIT_INPUT: RESOLVED_UNIT8 1556 UNIT_INPUT: RESOLVED_UNIT9
1548 .of(new LibrarySpecificUnit(target.librarySource, target.source)), 1557 .of(new LibrarySpecificUnit(target.librarySource, target.source)),
1549 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) 1558 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request)
1550 }; 1559 };
1551 } 1560 }
1552 throw new AnalysisException( 1561 throw new AnalysisException(
1553 'Cannot build inputs for a ${target.runtimeType}'); 1562 'Cannot build inputs for a ${target.runtimeType}');
1554 } 1563 }
1555 1564
1556 /** 1565 /**
1557 * Create a [ComputeConstantDependenciesTask] based on the given [target] in 1566 * Create a [ComputeConstantDependenciesTask] based on the given [target] in
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1736 * Create a [ComputeInferableStaticVariableDependenciesTask] based on the 1745 * Create a [ComputeInferableStaticVariableDependenciesTask] based on the
1737 * given [target] in the given [context]. 1746 * given [target] in the given [context].
1738 */ 1747 */
1739 static ComputeInferableStaticVariableDependenciesTask createTask( 1748 static ComputeInferableStaticVariableDependenciesTask createTask(
1740 AnalysisContext context, AnalysisTarget target) { 1749 AnalysisContext context, AnalysisTarget target) {
1741 return new ComputeInferableStaticVariableDependenciesTask(context, target); 1750 return new ComputeInferableStaticVariableDependenciesTask(context, target);
1742 } 1751 }
1743 } 1752 }
1744 1753
1745 /** 1754 /**
1755 * A task that computes the [LIBRARY_CYCLE_DEPENDENCIES] for a
1756 * compilation unit
Brian Wilkerson 2015/10/06 19:04:46 nit: missing period
Leaf 2015/10/07 18:53:55 Done.
1757 */
1758 class ComputeLibraryCycleDependenciesTask extends SourceBasedAnalysisTask {
Brian Wilkerson 2015/10/06 19:04:46 Is there a reason for this to be a separate task?
Leaf 2015/10/07 18:53:55 Done.
1759 /**
1760 * The name of the [LIBRARY_CYCLE] input.
1761 */
1762 static const String LIBRARY_CYCLE_INPUT = 'LIBRARY_CYCLE_INPUT';
1763
1764 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
1765 'ComputeLibraryCycleDependenciesTask',
1766 createTask,
1767 buildInputs,
1768 <ResultDescriptor>[LIBRARY_CYCLE_DEPENDENCIES]);
1769
1770 ComputeLibraryCycleDependenciesTask(
1771 InternalAnalysisContext context, AnalysisTarget target)
1772 : super(context, target);
1773
1774 @override
1775 TaskDescriptor get descriptor => DESCRIPTOR;
1776
1777 @override
1778 void internalPerform() {
1779 if (context.analysisOptions.strongMode) {
1780 //
1781 // Prepare inputs.
1782 //
1783 List<LibraryElement> scc = getRequiredInput(LIBRARY_CYCLE_INPUT);
1784
1785 Set<LibraryElement> filter = new Set<LibraryElement>.from(scc);
1786 Set<CompilationUnitElement> deps = new Set<CompilationUnitElement>();
1787 void addLibrary(l) {
1788 if (!filter.contains(l)) {
1789 deps.addAll(l.units);
1790 }
1791 }
1792 for (LibraryElement l in scc) {
1793 l.importedLibraries.forEach(addLibrary);
1794 l.exportedLibraries.forEach(addLibrary);
1795 }
1796 outputs[LIBRARY_CYCLE_DEPENDENCIES] = deps.toList();
1797 } else {
1798 outputs[LIBRARY_CYCLE_DEPENDENCIES] = [];
1799 }
1800 }
1801
1802 /**
1803 * Return a map from the names of the inputs of this kind of task to the task
1804 * input descriptors describing those inputs for a task with the
1805 * given [target].
1806 */
1807 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
1808 LibrarySpecificUnit unit = target;
1809 return <String, TaskInput>{LIBRARY_CYCLE_INPUT: LIBRARY_CYCLE.of(unit)};
1810 }
1811
1812 /**
1813 * Create a [ComputeLibraryCycleDependenciesTask] based on the
1814 * given [target] in the given [context].
1815 */
1816 static ComputeLibraryCycleDependenciesTask createTask(
1817 AnalysisContext context, AnalysisTarget target) {
1818 return new ComputeLibraryCycleDependenciesTask(context, target);
1819 }
1820 }
1821
1822 /**
1823 * A task that computes the [LIBRARY_CYCLE] for a
1824 * library element. Also computes the [LIBRARY_CYCLE_UNITS]
Brian Wilkerson 2015/10/06 19:04:46 nit: missing period
Leaf 2015/10/07 18:53:55 Done.
1825 */
1826 class ComputeLibraryCycleTask extends SourceBasedAnalysisTask {
1827 /**
1828 * The name of the [LIBRARY_ELEMENT2] input.
1829 */
1830 static const String UNIT_INPUT = 'UNIT_INPUT';
Brian Wilkerson 2015/10/06 19:04:46 Perhaps "LIBRARY_ELEMENT2_INPUT"? ("UNIT_INPUT" is
Leaf 2015/10/07 18:53:55 Done.
1831
1832 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
1833 'ComputeLibraryCycleForUnitTask',
1834 createTask,
1835 buildInputs,
1836 <ResultDescriptor>[LIBRARY_CYCLE, LIBRARY_CYCLE_UNITS]);
1837
1838 ComputeLibraryCycleTask(
1839 InternalAnalysisContext context, AnalysisTarget target)
1840 : super(context, target);
1841
1842 @override
1843 TaskDescriptor get descriptor => DESCRIPTOR;
1844
1845 @override
1846 void internalPerform() {
1847 //
1848 // Record outputs.
1849 //
1850 if (context.analysisOptions.strongMode) {
1851 LibraryElementImpl library = getRequiredInput(UNIT_INPUT);
1852 List<LibraryElement> component = library.libraryCycle;
1853 outputs[LIBRARY_CYCLE] = component;
1854 outputs[LIBRARY_CYCLE_UNITS] = component.expand((l) => l.units).toList();
1855 } else {
1856 outputs[LIBRARY_CYCLE] = [];
1857 outputs[LIBRARY_CYCLE_UNITS] = [];
1858 }
1859 }
1860
1861 /**
1862 * Return a map from the names of the inputs of this kind of task to the task
1863 * input descriptors describing those inputs for a task with the
1864 * given [target].
1865 */
1866 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
1867 LibrarySpecificUnit unit = target;
1868 return <String, TaskInput>{
1869 'resolveReachableLibraries': new _ImportExportSourceClosureTaskInput(
1870 unit.library, LIBRARY_ELEMENT2),
1871 UNIT_INPUT: LIBRARY_ELEMENT2.of(unit.library)
1872 };
1873 }
1874
1875 /**
1876 * Create a [ComputeLibraryCycleTask] based on the
1877 * given [target] in the given [context].
1878 */
1879 static ComputeLibraryCycleTask createTask(
1880 AnalysisContext context, AnalysisTarget target) {
1881 return new ComputeLibraryCycleTask(context, target);
1882 }
1883 }
1884
1885 /**
1746 * A base class for analysis tasks whose target is expected to be a 1886 * A base class for analysis tasks whose target is expected to be a
1747 * [ConstantEvaluationTarget]. 1887 * [ConstantEvaluationTarget].
1748 */ 1888 */
1749 abstract class ConstantEvaluationAnalysisTask extends AnalysisTask { 1889 abstract class ConstantEvaluationAnalysisTask extends AnalysisTask {
1750 /** 1890 /**
1751 * Initialize a newly created task to perform analysis within the given 1891 * Initialize a newly created task to perform analysis within the given
1752 * [context] in order to produce results for the given [constant]. 1892 * [context] in order to produce results for the given [constant].
1753 */ 1893 */
1754 ConstantEvaluationAnalysisTask( 1894 ConstantEvaluationAnalysisTask(
1755 AnalysisContext context, ConstantEvaluationTarget constant) 1895 AnalysisContext context, ConstantEvaluationTarget constant)
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
1994 AnalysisContext context, AnalysisTarget target) { 2134 AnalysisContext context, AnalysisTarget target) {
1995 return new DartErrorsTask(context, target); 2135 return new DartErrorsTask(context, target);
1996 } 2136 }
1997 } 2137 }
1998 2138
1999 /** 2139 /**
2000 * A task that builds [RESOLVED_UNIT] for a unit. 2140 * A task that builds [RESOLVED_UNIT] for a unit.
2001 */ 2141 */
2002 class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask { 2142 class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask {
2003 /** 2143 /**
2004 * The name of the [RESOLVED_UNIT8] input. 2144 * The name of the [RESOLVED_UNIT9] input.
2005 */ 2145 */
2006 static const String UNIT_INPUT = 'UNIT_INPUT'; 2146 static const String UNIT_INPUT = 'UNIT_INPUT';
2007 2147
2008 /** 2148 /**
2009 * The name of the [CONSTANT_VALUE] input. 2149 * The name of the [CONSTANT_VALUE] input.
2010 */ 2150 */
2011 static const String CONSTANT_VALUES = 'CONSTANT_VALUES'; 2151 static const String CONSTANT_VALUES = 'CONSTANT_VALUES';
2012 2152
2013 /** 2153 /**
2014 * The task descriptor describing this kind of task. 2154 * The task descriptor describing this kind of task.
(...skipping 20 matching lines...) Expand all
2035 2175
2036 /** 2176 /**
2037 * Return a map from the names of the inputs of this kind of task to the task 2177 * Return a map from the names of the inputs of this kind of task to the task
2038 * input descriptors describing those inputs for a task with the 2178 * input descriptors describing those inputs for a task with the
2039 * given [target]. 2179 * given [target].
2040 */ 2180 */
2041 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 2181 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2042 LibrarySpecificUnit unit = target; 2182 LibrarySpecificUnit unit = target;
2043 return <String, TaskInput>{ 2183 return <String, TaskInput>{
2044 'libraryElement': LIBRARY_ELEMENT.of(unit.library), 2184 'libraryElement': LIBRARY_ELEMENT.of(unit.library),
2045 UNIT_INPUT: RESOLVED_UNIT8.of(unit), 2185 UNIT_INPUT: RESOLVED_UNIT9.of(unit),
2046 CONSTANT_VALUES: 2186 CONSTANT_VALUES:
2047 COMPILATION_UNIT_CONSTANTS.of(unit).toListOf(CONSTANT_VALUE) 2187 COMPILATION_UNIT_CONSTANTS.of(unit).toListOf(CONSTANT_VALUE)
2048 }; 2188 };
2049 } 2189 }
2050 2190
2051 /** 2191 /**
2052 * Create an [EvaluateUnitConstantsTask] based on the given [target] in 2192 * Create an [EvaluateUnitConstantsTask] based on the given [target] in
2053 * the given [context]. 2193 * the given [context].
2054 */ 2194 */
2055 static EvaluateUnitConstantsTask createTask( 2195 static EvaluateUnitConstantsTask createTask(
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2159 } 2299 }
2160 return newNames; 2300 return newNames;
2161 } 2301 }
2162 } 2302 }
2163 2303
2164 /** 2304 /**
2165 * A task that builds [USED_IMPORTED_ELEMENTS] for a unit. 2305 * A task that builds [USED_IMPORTED_ELEMENTS] for a unit.
2166 */ 2306 */
2167 class GatherUsedImportedElementsTask extends SourceBasedAnalysisTask { 2307 class GatherUsedImportedElementsTask extends SourceBasedAnalysisTask {
2168 /** 2308 /**
2169 * The name of the [RESOLVED_UNIT8] input. 2309 * The name of the [RESOLVED_UNIT9] input.
2170 */ 2310 */
2171 static const String UNIT_INPUT = 'UNIT_INPUT'; 2311 static const String UNIT_INPUT = 'UNIT_INPUT';
2172 2312
2173 /** 2313 /**
2174 * The task descriptor describing this kind of task. 2314 * The task descriptor describing this kind of task.
2175 */ 2315 */
2176 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 2316 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
2177 'GatherUsedImportedElementsTask', 2317 'GatherUsedImportedElementsTask',
2178 createTask, 2318 createTask,
2179 buildInputs, 2319 buildInputs,
(...skipping 23 matching lines...) Expand all
2203 outputs[USED_IMPORTED_ELEMENTS] = visitor.usedElements; 2343 outputs[USED_IMPORTED_ELEMENTS] = visitor.usedElements;
2204 } 2344 }
2205 2345
2206 /** 2346 /**
2207 * Return a map from the names of the inputs of this kind of task to the task 2347 * Return a map from the names of the inputs of this kind of task to the task
2208 * input descriptors describing those inputs for a task with the 2348 * input descriptors describing those inputs for a task with the
2209 * given [target]. 2349 * given [target].
2210 */ 2350 */
2211 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 2351 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2212 LibrarySpecificUnit unit = target; 2352 LibrarySpecificUnit unit = target;
2213 return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT8.of(unit)}; 2353 return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT9.of(unit)};
2214 } 2354 }
2215 2355
2216 /** 2356 /**
2217 * Create a [GatherUsedImportedElementsTask] based on the given [target] in 2357 * Create a [GatherUsedImportedElementsTask] based on the given [target] in
2218 * the given [context]. 2358 * the given [context].
2219 */ 2359 */
2220 static GatherUsedImportedElementsTask createTask( 2360 static GatherUsedImportedElementsTask createTask(
2221 AnalysisContext context, AnalysisTarget target) { 2361 AnalysisContext context, AnalysisTarget target) {
2222 return new GatherUsedImportedElementsTask(context, target); 2362 return new GatherUsedImportedElementsTask(context, target);
2223 } 2363 }
2224 } 2364 }
2225 2365
2226 /** 2366 /**
2227 * A task that builds [USED_LOCAL_ELEMENTS] for a unit. 2367 * A task that builds [USED_LOCAL_ELEMENTS] for a unit.
2228 */ 2368 */
2229 class GatherUsedLocalElementsTask extends SourceBasedAnalysisTask { 2369 class GatherUsedLocalElementsTask extends SourceBasedAnalysisTask {
2230 /** 2370 /**
2231 * The name of the [RESOLVED_UNIT8] input. 2371 * The name of the [RESOLVED_UNIT9] input.
2232 */ 2372 */
2233 static const String UNIT_INPUT = 'UNIT_INPUT'; 2373 static const String UNIT_INPUT = 'UNIT_INPUT';
2234 2374
2235 /** 2375 /**
2236 * The task descriptor describing this kind of task. 2376 * The task descriptor describing this kind of task.
2237 */ 2377 */
2238 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 2378 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
2239 'GatherUsedLocalElementsTask', 2379 'GatherUsedLocalElementsTask',
2240 createTask, 2380 createTask,
2241 buildInputs, 2381 buildInputs,
(...skipping 23 matching lines...) Expand all
2265 outputs[USED_LOCAL_ELEMENTS] = visitor.usedElements; 2405 outputs[USED_LOCAL_ELEMENTS] = visitor.usedElements;
2266 } 2406 }
2267 2407
2268 /** 2408 /**
2269 * Return a map from the names of the inputs of this kind of task to the task 2409 * Return a map from the names of the inputs of this kind of task to the task
2270 * input descriptors describing those inputs for a task with the 2410 * input descriptors describing those inputs for a task with the
2271 * given [target]. 2411 * given [target].
2272 */ 2412 */
2273 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 2413 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2274 LibrarySpecificUnit unit = target; 2414 LibrarySpecificUnit unit = target;
2275 return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT8.of(unit)}; 2415 return <String, TaskInput>{UNIT_INPUT: RESOLVED_UNIT9.of(unit)};
2276 } 2416 }
2277 2417
2278 /** 2418 /**
2279 * Create a [GatherUsedLocalElementsTask] based on the given [target] in 2419 * Create a [GatherUsedLocalElementsTask] based on the given [target] in
2280 * the given [context]. 2420 * the given [context].
2281 */ 2421 */
2282 static GatherUsedLocalElementsTask createTask( 2422 static GatherUsedLocalElementsTask createTask(
2283 AnalysisContext context, AnalysisTarget target) { 2423 AnalysisContext context, AnalysisTarget target) {
2284 return new GatherUsedLocalElementsTask(context, target); 2424 return new GatherUsedLocalElementsTask(context, target);
2285 } 2425 }
2286 } 2426 }
2287 2427
2288 /** 2428 /**
2289 * A task that generates [HINTS] for a unit. 2429 * A task that generates [HINTS] for a unit.
2290 */ 2430 */
2291 class GenerateHintsTask extends SourceBasedAnalysisTask { 2431 class GenerateHintsTask extends SourceBasedAnalysisTask {
2292 /** 2432 /**
2293 * The name of the [RESOLVED_UNIT8] input. 2433 * The name of the [RESOLVED_UNIT9] input.
2294 */ 2434 */
2295 static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT'; 2435 static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT';
2296 2436
2297 /** 2437 /**
2298 * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input. 2438 * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input.
2299 */ 2439 */
2300 static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS'; 2440 static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS';
2301 2441
2302 /** 2442 /**
2303 * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input. 2443 * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input.
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2434 */ 2574 */
2435 static const String UNIT_INPUT = 'UNIT_INPUT'; 2575 static const String UNIT_INPUT = 'UNIT_INPUT';
2436 2576
2437 /** 2577 /**
2438 * The task descriptor describing this kind of task. 2578 * The task descriptor describing this kind of task.
2439 */ 2579 */
2440 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 2580 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
2441 'InferInstanceMembersInUnitTask', 2581 'InferInstanceMembersInUnitTask',
2442 createTask, 2582 createTask,
2443 buildInputs, 2583 buildInputs,
2444 <ResultDescriptor>[RESOLVED_UNIT7]); 2584 <ResultDescriptor>[RESOLVED_UNIT8]);
2445 2585
2446 /** 2586 /**
2447 * Initialize a newly created task to build a library element for the given 2587 * Initialize a newly created task to build a library element for the given
2448 * [unit] in the given [context]. 2588 * [unit] in the given [context].
2449 */ 2589 */
2450 InferInstanceMembersInUnitTask( 2590 InferInstanceMembersInUnitTask(
2451 InternalAnalysisContext context, LibrarySpecificUnit unit) 2591 InternalAnalysisContext context, LibrarySpecificUnit unit)
2452 : super(context, unit); 2592 : super(context, unit);
2453 2593
2454 @override 2594 @override
(...skipping 10 matching lines...) Expand all
2465 // Infer instance members. 2605 // Infer instance members.
2466 // 2606 //
2467 if (context.analysisOptions.strongMode) { 2607 if (context.analysisOptions.strongMode) {
2468 InstanceMemberInferrer inferrer = new InstanceMemberInferrer(typeProvider, 2608 InstanceMemberInferrer inferrer = new InstanceMemberInferrer(typeProvider,
2469 typeSystem: context.typeSystem); 2609 typeSystem: context.typeSystem);
2470 inferrer.inferCompilationUnit(unit.element); 2610 inferrer.inferCompilationUnit(unit.element);
2471 } 2611 }
2472 // 2612 //
2473 // Record outputs. 2613 // Record outputs.
2474 // 2614 //
2475 outputs[RESOLVED_UNIT7] = unit; 2615 outputs[RESOLVED_UNIT8] = unit;
2476 } 2616 }
2477 2617
2478 /** 2618 /**
2479 * Return a map from the names of the inputs of this kind of task to the task 2619 * Return a map from the names of the inputs of this kind of task to the task
2480 * input descriptors describing those inputs for a task with the given 2620 * input descriptors describing those inputs for a task with the given
2481 * [libSource]. 2621 * [libSource].
2482 */ 2622 */
2483 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 2623 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2484 LibrarySpecificUnit unit = target; 2624 LibrarySpecificUnit unit = target;
2485 return <String, TaskInput>{ 2625 return <String, TaskInput>{
2486 UNIT_INPUT: RESOLVED_UNIT6.of(unit), 2626 UNIT_INPUT: RESOLVED_UNIT7.of(unit),
2487 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) 2627 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
2628 // In strong mode, add additional dependencies to enforce inference
2629 // ordering.
2630
2631 // Require that field re-resolution be complete for all units in the
2632 // current library cycle.
2633 'orderLibraryCycleTasks': LIBRARY_CYCLE_UNITS.of(unit).toList(
2634 (CompilationUnitElementImpl unit) => RESOLVED_UNIT7
2635 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))),
2636 // Require that full inference be complete for all dependencies of the
2637 // current library cycle.
2638 'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES.of(unit).toList(
2639 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8
2640 .of(new LibrarySpecificUnit(unit.librarySource, unit.source)))
2488 }; 2641 };
2489 } 2642 }
2490 2643
2491 /** 2644 /**
2492 * Create a [InferInstanceMembersInUnitTask] based on the given [target] in 2645 * Create a [InferInstanceMembersInUnitTask] based on the given [target] in
2493 * the given [context]. 2646 * the given [context].
2494 */ 2647 */
2495 static InferInstanceMembersInUnitTask createTask( 2648 static InferInstanceMembersInUnitTask createTask(
2496 AnalysisContext context, AnalysisTarget target) { 2649 AnalysisContext context, AnalysisTarget target) {
2497 return new InferInstanceMembersInUnitTask(context, target); 2650 return new InferInstanceMembersInUnitTask(context, target);
2498 } 2651 }
2499 } 2652 }
2500 2653
2501 /** 2654 /**
2655 * A task that ensures that all of the inferrable instance members in a
2656 * compilation unit have had their right hand sides re-resolved
2657 */
2658 class ResolveInstanceFieldsInUnitTask extends SourceBasedAnalysisTask {
2659 /**
2660 * The name of the [TYPE_PROVIDER] input.
2661 */
2662 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
2663
2664 /**
2665 * The name of the input whose value is the [RESOLVED_UNIT6] for the
2666 * compilation unit.
2667 */
2668 static const String UNIT_INPUT = 'UNIT_INPUT';
2669
2670 /**
2671 * The task descriptor describing this kind of task.
2672 */
2673 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
2674 'ResolveInstanceFieldsInUnitTask',
2675 createTask,
2676 buildInputs,
2677 <ResultDescriptor>[RESOLVED_UNIT7]);
2678
2679 /**
2680 * Initialize a newly created task to build a library element for the given
2681 * [unit] in the given [context].
2682 */
2683 ResolveInstanceFieldsInUnitTask(
2684 InternalAnalysisContext context, LibrarySpecificUnit unit)
2685 : super(context, unit);
2686
2687 @override
2688 TaskDescriptor get descriptor => DESCRIPTOR;
2689
2690 @override
2691 void internalPerform() {
2692 //
2693 // Prepare inputs.
2694 //
2695 CompilationUnit unit = getRequiredInput(UNIT_INPUT);
2696 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
2697 if (context.analysisOptions.strongMode) {
2698 //
2699 // Resolve instance fields.
2700 //
2701 CompilationUnitElement unitElement = unit.element;
2702 RecordingErrorListener errorListener = new RecordingErrorListener();
Brian Wilkerson 2015/10/06 19:04:46 nit: In places where we are going to discard the e
Leaf 2015/10/07 18:53:55 Done.
2703 for (CompilationUnitMember unitMember in unit.declarations) {
2704 if (unitMember is ClassDeclaration) {
2705 for (ClassMember member in unitMember.members) {
2706 if (member is FieldDeclaration &&
2707 !(member.fields.isConst || member.isStatic)) {
2708 member.fields.variables.forEach((v) => _resolveVariable(
2709 v, unitElement, typeProvider, errorListener));
2710 }
2711 }
2712 }
2713 }
2714 }
2715 //
2716 // Record outputs.
2717 //
2718 outputs[RESOLVED_UNIT7] = unit;
2719 }
2720
2721 void _resolveVariable(
2722 VariableDeclaration variable,
2723 CompilationUnitElement unitElement,
2724 TypeProvider typeProvider,
2725 RecordingErrorListener errorListener) {
2726 ResolutionContext resolutionContext =
2727 ResolutionContextBuilder.contextFor(variable, errorListener);
2728 ResolverVisitor visitor = new ResolverVisitor(
2729 unitElement.library, unitElement.source, typeProvider, errorListener,
2730 nameScope: resolutionContext.scope);
2731 if (resolutionContext.enclosingClassDeclaration != null) {
2732 visitor.prepareToResolveMembersInClass(
2733 resolutionContext.enclosingClassDeclaration);
2734 }
2735 visitor.initForIncrementalResolution(variable);
2736 variable.accept(visitor);
2737 }
2738
2739 /**
2740 * Return a map from the names of the inputs of this kind of task to the task
2741 * input descriptors describing those inputs for a task with the given
2742 * [libSource].
2743 */
2744 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2745 LibrarySpecificUnit unit = target;
2746 return <String, TaskInput>{
2747 UNIT_INPUT: RESOLVED_UNIT6.of(unit),
2748 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
2749 // In strong mode, add additional dependencies to enforce inference
2750 // ordering.
2751
2752 // Require that static variable inference be complete for all units in
2753 // the current library cycle.
2754 'orderLibraryCycleTasks': LIBRARY_CYCLE_UNITS.of(unit).toList(
2755 (CompilationUnitElementImpl unit) => RESOLVED_UNIT6
2756 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))),
2757 // Require that full inference be complete for all dependencies of the
2758 // current library cycle.
2759 'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES.of(unit).toList(
2760 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8
2761 .of(new LibrarySpecificUnit(unit.librarySource, unit.source)))
2762 };
2763 }
2764
2765 /**
2766 * Create a [ResolveInstanceFieldsInUnitTask] based on the given [target] in
2767 * the given [context].
2768 */
2769 static ResolveInstanceFieldsInUnitTask createTask(
2770 AnalysisContext context, AnalysisTarget target) {
2771 return new ResolveInstanceFieldsInUnitTask(context, target);
2772 }
2773 }
2774
2775 /**
2502 * An abstract class that defines utility methods that are useful for tasks 2776 * An abstract class that defines utility methods that are useful for tasks
2503 * operating on static variables. 2777 * operating on static variables.
2504 */ 2778 */
2505 abstract class InferStaticVariableTask extends ConstantEvaluationAnalysisTask { 2779 abstract class InferStaticVariableTask extends ConstantEvaluationAnalysisTask {
2506 InferStaticVariableTask( 2780 InferStaticVariableTask(
2507 InternalAnalysisContext context, VariableElement variable) 2781 InternalAnalysisContext context, VariableElement variable)
2508 : super(context, variable); 2782 : super(context, variable);
2509 2783
2510 /** 2784 /**
2511 * Return the declaration of the target within the given compilation [unit]. 2785 * Return the declaration of the target within the given compilation [unit].
(...skipping 24 matching lines...) Expand all
2536 */ 2810 */
2537 static const String UNIT_INPUT = 'UNIT_INPUT'; 2811 static const String UNIT_INPUT = 'UNIT_INPUT';
2538 2812
2539 /** 2813 /**
2540 * The name of the input whose value is a list of the inferrable static 2814 * The name of the input whose value is a list of the inferrable static
2541 * variables whose types have been computed. 2815 * variables whose types have been computed.
2542 */ 2816 */
2543 static const String INFERRED_VARIABLES_INPUT = 'INFERRED_VARIABLES_INPUT'; 2817 static const String INFERRED_VARIABLES_INPUT = 'INFERRED_VARIABLES_INPUT';
2544 2818
2545 /** 2819 /**
2546 * The name of the input whose value is a list of the errors produced while
2547 * inferring types for static variables.
2548 */
2549 static const String INFER_STATIC_VARIABLE_ERRORS_INPUT =
2550 'INFER_STATIC_VARIABLE_ERRORS';
2551
2552 /**
2553 * The task descriptor describing this kind of task. 2820 * The task descriptor describing this kind of task.
2554 */ 2821 */
2555 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 2822 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
2556 'InferStaticVariableTypesInUnitTask', 2823 'InferStaticVariableTypesInUnitTask',
2557 createTask, 2824 createTask,
2558 buildInputs, 2825 buildInputs,
2559 <ResultDescriptor>[INFER_STATIC_VARIABLE_TYPES_ERRORS, RESOLVED_UNIT6]); 2826 <ResultDescriptor>[RESOLVED_UNIT6]);
2560 2827
2561 /** 2828 /**
2562 * Initialize a newly created task to build a library element for the given 2829 * Initialize a newly created task to build a library element for the given
2563 * [unit] in the given [context]. 2830 * [unit] in the given [context].
2564 */ 2831 */
2565 InferStaticVariableTypesInUnitTask( 2832 InferStaticVariableTypesInUnitTask(
2566 InternalAnalysisContext context, LibrarySpecificUnit unit) 2833 InternalAnalysisContext context, LibrarySpecificUnit unit)
2567 : super(context, unit); 2834 : super(context, unit);
2568 2835
2569 @override 2836 @override
2570 TaskDescriptor get descriptor => DESCRIPTOR; 2837 TaskDescriptor get descriptor => DESCRIPTOR;
2571 2838
2572 @override 2839 @override
2573 void internalPerform() { 2840 void internalPerform() {
2574 // 2841 //
2575 // Prepare inputs. 2842 // Prepare inputs.
2576 // 2843 //
2577 CompilationUnit unit = getRequiredInput(UNIT_INPUT); 2844 CompilationUnit unit = getRequiredInput(UNIT_INPUT);
2578 List<List<AnalysisError>> perVariableErrors =
2579 getRequiredInput(INFER_STATIC_VARIABLE_ERRORS_INPUT);
2580 List<AnalysisError> errors = <AnalysisError>[];
2581 for (List<AnalysisError> variableErrors in perVariableErrors) {
2582 errors.addAll(variableErrors);
2583 }
2584 // 2845 //
2585 // Record outputs. There is no additional work to be done at this time 2846 // Record outputs. There is no additional work to be done at this time
2586 // because the work has implicitly been done by virtue of the task model 2847 // because the work has implicitly been done by virtue of the task model
2587 // preparing all of the inputs. 2848 // preparing all of the inputs.
2588 // 2849 //
2589 outputs[INFER_STATIC_VARIABLE_TYPES_ERRORS] = errors;
2590 outputs[RESOLVED_UNIT6] = unit; 2850 outputs[RESOLVED_UNIT6] = unit;
2591 } 2851 }
2592 2852
2593 /** 2853 /**
2594 * Return a map from the names of the inputs of this kind of task to the task 2854 * Return a map from the names of the inputs of this kind of task to the task
2595 * input descriptors describing those inputs for a task with the given 2855 * input descriptors describing those inputs for a task with the given
2596 * [libSource]. 2856 * [libSource].
2597 */ 2857 */
2598 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 2858 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2599 LibrarySpecificUnit unit = target; 2859 LibrarySpecificUnit unit = target;
2600 return <String, TaskInput>{ 2860 return <String, TaskInput>{
2601 INFERRED_VARIABLES_INPUT: INFERABLE_STATIC_VARIABLES_IN_UNIT 2861 INFERRED_VARIABLES_INPUT: INFERABLE_STATIC_VARIABLES_IN_UNIT
2602 .of(unit) 2862 .of(unit)
2603 .toListOf(INFERRED_STATIC_VARIABLE), 2863 .toListOf(INFERRED_STATIC_VARIABLE),
2604 INFER_STATIC_VARIABLE_ERRORS_INPUT: INFERABLE_STATIC_VARIABLES_IN_UNIT
2605 .of(unit)
2606 .toListOf(INFER_STATIC_VARIABLE_ERRORS),
2607 UNIT_INPUT: RESOLVED_UNIT5.of(unit) 2864 UNIT_INPUT: RESOLVED_UNIT5.of(unit)
2608 }; 2865 };
2609 } 2866 }
2610 2867
2611 /** 2868 /**
2612 * Create a [InferStaticVariableTypesInUnitTask] based on the given [target] 2869 * Create a [InferStaticVariableTypesInUnitTask] based on the given [target]
2613 * in the given [context]. 2870 * in the given [context].
2614 */ 2871 */
2615 static InferStaticVariableTypesInUnitTask createTask( 2872 static InferStaticVariableTypesInUnitTask createTask(
2616 AnalysisContext context, AnalysisTarget target) { 2873 AnalysisContext context, AnalysisTarget target) {
(...skipping 18 matching lines...) Expand all
2635 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; 2892 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
2636 2893
2637 /** 2894 /**
2638 * The name of the [RESOLVED_UNIT5] input. 2895 * The name of the [RESOLVED_UNIT5] input.
2639 */ 2896 */
2640 static const String UNIT_INPUT = 'UNIT_INPUT'; 2897 static const String UNIT_INPUT = 'UNIT_INPUT';
2641 2898
2642 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 2899 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
2643 'InferStaticVariableTypeTask', 2900 'InferStaticVariableTypeTask',
2644 createTask, 2901 createTask,
2645 buildInputs, <ResultDescriptor>[ 2902 buildInputs,
2646 INFER_STATIC_VARIABLE_ERRORS, 2903 <ResultDescriptor>[INFERRED_STATIC_VARIABLE]);
2647 INFERRED_STATIC_VARIABLE
2648 ]);
2649 2904
2650 InferStaticVariableTypeTask( 2905 InferStaticVariableTypeTask(
2651 InternalAnalysisContext context, VariableElement variable) 2906 InternalAnalysisContext context, VariableElement variable)
2652 : super(context, variable); 2907 : super(context, variable);
2653 2908
2654 @override 2909 @override
2655 TaskDescriptor get descriptor => DESCRIPTOR; 2910 TaskDescriptor get descriptor => DESCRIPTOR;
2656 2911
2657 @override 2912 @override
2658 bool get handlesDependencyCycles => true; 2913 bool get handlesDependencyCycles => true;
2659 2914
2660 @override 2915 @override
2661 void internalPerform() { 2916 void internalPerform() {
2662 // 2917 //
2663 // Prepare inputs. 2918 // Prepare inputs.
2664 // 2919 //
2665 // Note: DEPENDENCIES_INPUT is not needed. It is merely a bookkeeping 2920 // Note: DEPENDENCIES_INPUT is not needed. It is merely a bookkeeping
2666 // dependency to ensure that the variables that this variable references 2921 // dependency to ensure that the variables that this variable references
2667 // have types inferred before inferring the type of this variable. 2922 // have types inferred before inferring the type of this variable.
2668 // 2923 //
2669 VariableElementImpl variable = target; 2924 VariableElementImpl variable = target;
2670 2925
2671 CompilationUnit unit = getRequiredInput(UNIT_INPUT); 2926 CompilationUnit unit = getRequiredInput(UNIT_INPUT);
2672 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); 2927 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
2673 RecordingErrorListener errorListener = new RecordingErrorListener(); 2928 RecordingErrorListener errorListener = new RecordingErrorListener();
2674 VariableDeclaration declaration = getDeclaration(unit);
2675 //
2676 // Re-resolve the variable's initializer so that the inferred types of other
2677 // variables will be propagated.
2678 //
2679 Expression initializer = declaration.initializer;
2680 ResolutionEraser.erase(initializer, eraseDeclarations: false);
2681 ResolutionContext resolutionContext =
2682 ResolutionContextBuilder.contextFor(initializer, errorListener);
2683 ResolverVisitor visitor = new ResolverVisitor(
2684 variable.library, variable.source, typeProvider, errorListener,
2685 nameScope: resolutionContext.scope);
2686 if (resolutionContext.enclosingClassDeclaration != null) {
2687 visitor.prepareToResolveMembersInClass(
2688 resolutionContext.enclosingClassDeclaration);
2689 }
2690 visitor.initForIncrementalResolution();
2691 initializer.accept(visitor);
2692 2929
2693 // If we're not in a dependency cycle, and we have no type annotation, 2930 // If we're not in a dependency cycle, and we have no type annotation,
2694 // do inference. 2931 // re-resolve the right hand side and do inference.
2695 if (dependencyCycle == null && variable.hasImplicitType) { 2932 if (dependencyCycle == null && variable.hasImplicitType) {
2933 VariableDeclaration declaration = getDeclaration(unit);
2934 //
2935 // Re-resolve the variable's initializer so that the inferred types
2936 // of other variables will be propagated.
2937 //
2938 Expression initializer = declaration.initializer;
2939 ResolutionContext resolutionContext =
2940 ResolutionContextBuilder.contextFor(initializer, errorListener);
2941 ResolverVisitor visitor = new ResolverVisitor(
2942 variable.library, variable.source, typeProvider, errorListener,
2943 nameScope: resolutionContext.scope);
2944 if (resolutionContext.enclosingClassDeclaration != null) {
2945 visitor.prepareToResolveMembersInClass(
2946 resolutionContext.enclosingClassDeclaration);
2947 }
2948 visitor.initForIncrementalResolution();
2949 initializer.accept(visitor);
2950
2696 // 2951 //
2697 // Record the type of the variable. 2952 // Record the type of the variable.
2698 // 2953 //
2699 DartType newType = initializer.staticType; 2954 DartType newType = initializer.staticType;
2700 if (newType == null || newType.isBottom) { 2955 if (newType == null || newType.isBottom) {
2701 newType = typeProvider.dynamicType; 2956 newType = typeProvider.dynamicType;
2702 } 2957 }
2703 variable.type = newType; 2958 variable.type = newType;
2704 (variable.initializer as ExecutableElementImpl).returnType = newType; 2959 (variable.initializer as ExecutableElementImpl).returnType = newType;
2705 if (variable is PropertyInducingElementImpl) { 2960 if (variable is PropertyInducingElementImpl) {
2706 setReturnType(variable.getter, newType); 2961 setReturnType(variable.getter, newType);
2707 if (!variable.isFinal && !variable.isConst) { 2962 if (!variable.isFinal && !variable.isConst) {
2708 setParameterType(variable.setter, newType); 2963 setParameterType(variable.setter, newType);
2709 } 2964 }
2710 } 2965 }
2711 } else { 2966 } else {
2712 // TODO(brianwilkerson) For now we simply don't infer any type for 2967 // TODO(brianwilkerson) For now we simply don't infer any type for
2713 // variables or fields involved in a cycle. We could try to be smarter 2968 // variables or fields involved in a cycle. We could try to be smarter
2714 // by re-resolving the initializer in a context in which the types of all 2969 // by re-resolving the initializer in a context in which the types of all
2715 // of the variables in the cycle are assumed to be `null`, but it isn't 2970 // of the variables in the cycle are assumed to be `null`, but it isn't
2716 // clear to me that this would produce better results often enough to 2971 // clear to me that this would produce better results often enough to
2717 // warrant the extra effort. 2972 // warrant the extra effort.
2718 } 2973 }
2719 // 2974 //
2720 // Record outputs. 2975 // Record outputs.
2721 // 2976 //
2722 outputs[INFERRED_STATIC_VARIABLE] = variable; 2977 outputs[INFERRED_STATIC_VARIABLE] = variable;
2723 outputs[INFER_STATIC_VARIABLE_ERRORS] = errorListener.errors;
2724 } 2978 }
2725 2979
2726 /** 2980 /**
2727 * Return a map from the names of the inputs of this kind of task to the task 2981 * Return a map from the names of the inputs of this kind of task to the task
2728 * input descriptors describing those inputs for a task with the given 2982 * input descriptors describing those inputs for a task with the given
2729 * [target]. 2983 * [target].
2730 */ 2984 */
2731 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 2985 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2732 VariableElement variable = target; 2986 VariableElement variable = target;
2733 LibrarySpecificUnit unit = 2987 LibrarySpecificUnit unit =
2734 new LibrarySpecificUnit(variable.library.source, variable.source); 2988 new LibrarySpecificUnit(variable.library.source, variable.source);
2735 return <String, TaskInput>{ 2989 return <String, TaskInput>{
2736 DEPENDENCIES_INPUT: INFERABLE_STATIC_VARIABLE_DEPENDENCIES 2990 DEPENDENCIES_INPUT: INFERABLE_STATIC_VARIABLE_DEPENDENCIES
2737 .of(variable) 2991 .of(variable)
2738 .toListOf(INFERRED_STATIC_VARIABLE), 2992 .toListOf(INFERRED_STATIC_VARIABLE),
2739 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request), 2993 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
2740 UNIT_INPUT: RESOLVED_UNIT5.of(unit) 2994 UNIT_INPUT: RESOLVED_UNIT5.of(unit),
2995 // In strong mode, add additional dependencies to enforce inference
2996 // ordering.
2997
2998 // Require that full inference be complete for all dependencies of the
2999 // current library cycle.
3000 'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES.of(unit).toList(
3001 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8
3002 .of(new LibrarySpecificUnit(unit.librarySource, unit.source)))
2741 }; 3003 };
2742 } 3004 }
2743 3005
2744 /** 3006 /**
2745 * Create a [InferStaticVariableTypeTask] based on the given [target] in the 3007 * Create a [InferStaticVariableTypeTask] based on the given [target] in the
2746 * given [context]. 3008 * given [context].
2747 */ 3009 */
2748 static InferStaticVariableTypeTask createTask( 3010 static InferStaticVariableTypeTask createTask(
2749 AnalysisContext context, AnalysisTarget target) { 3011 AnalysisContext context, AnalysisTarget target) {
2750 return new InferStaticVariableTypeTask(context, target); 3012 return new InferStaticVariableTypeTask(context, target);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2812 * The name of the [BUILD_LIBRARY_ERRORS] input. 3074 * The name of the [BUILD_LIBRARY_ERRORS] input.
2813 */ 3075 */
2814 static const String BUILD_LIBRARY_ERRORS_INPUT = 'BUILD_LIBRARY_ERRORS'; 3076 static const String BUILD_LIBRARY_ERRORS_INPUT = 'BUILD_LIBRARY_ERRORS';
2815 3077
2816 /** 3078 /**
2817 * The name of the [HINTS] input. 3079 * The name of the [HINTS] input.
2818 */ 3080 */
2819 static const String HINTS_INPUT = 'HINTS'; 3081 static const String HINTS_INPUT = 'HINTS';
2820 3082
2821 /** 3083 /**
2822 * The name of the [INFER_STATIC_VARIABLE_TYPES_ERRORS] input.
2823 */
2824 static const String INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT =
2825 'INFER_STATIC_VARIABLE_TYPES_ERRORS';
2826
2827 /**
2828 * The name of the [PARTIALLY_RESOLVE_REFERENCES_ERRORS] input.
2829 */
2830 static const String PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT =
2831 'PARTIALLY_RESOLVE_REFERENCES_ERRORS';
2832
2833 /**
2834 * The name of the [RESOLVE_FUNCTION_BODIES_ERRORS] input.
2835 */
2836 static const String RESOLVE_FUNCTION_BODIES_ERRORS_INPUT =
2837 'RESOLVE_FUNCTION_BODIES_ERRORS';
2838
2839 /**
2840 * The name of the [RESOLVE_TYPE_NAMES_ERRORS] input. 3084 * The name of the [RESOLVE_TYPE_NAMES_ERRORS] input.
2841 */ 3085 */
2842 static const String RESOLVE_TYPE_NAMES_ERRORS_INPUT = 3086 static const String RESOLVE_TYPE_NAMES_ERRORS_INPUT =
2843 'RESOLVE_TYPE_NAMES_ERRORS'; 3087 'RESOLVE_TYPE_NAMES_ERRORS';
2844 3088
2845 /** 3089 /**
3090 * The name of the [RESOLVE_UNIT_ERRORS] input.
3091 */
3092 static const String RESOLVE_UNIT_ERRORS_INPUT = 'RESOLVE_UNIT_ERRORS';
3093
3094 /**
2846 * The name of the [VARIABLE_REFERENCE_ERRORS] input. 3095 * The name of the [VARIABLE_REFERENCE_ERRORS] input.
2847 */ 3096 */
2848 static const String VARIABLE_REFERENCE_ERRORS_INPUT = 3097 static const String VARIABLE_REFERENCE_ERRORS_INPUT =
2849 'VARIABLE_REFERENCE_ERRORS'; 3098 'VARIABLE_REFERENCE_ERRORS';
2850 3099
2851 /** 3100 /**
2852 * The name of the [VERIFY_ERRORS] input. 3101 * The name of the [VERIFY_ERRORS] input.
2853 */ 3102 */
2854 static const String VERIFY_ERRORS_INPUT = 'VERIFY_ERRORS'; 3103 static const String VERIFY_ERRORS_INPUT = 'VERIFY_ERRORS';
2855 3104
(...skipping 14 matching lines...) Expand all
2870 3119
2871 @override 3120 @override
2872 void internalPerform() { 3121 void internalPerform() {
2873 // 3122 //
2874 // Prepare inputs. 3123 // Prepare inputs.
2875 // 3124 //
2876 List<List<AnalysisError>> errorLists = <List<AnalysisError>>[]; 3125 List<List<AnalysisError>> errorLists = <List<AnalysisError>>[];
2877 errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT)); 3126 errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT));
2878 errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT)); 3127 errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT));
2879 errorLists.add(getRequiredInput(HINTS_INPUT)); 3128 errorLists.add(getRequiredInput(HINTS_INPUT));
2880 errorLists.add(getRequiredInput(INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT));
2881 errorLists.add(getRequiredInput(PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT));
2882 errorLists.add(getRequiredInput(RESOLVE_FUNCTION_BODIES_ERRORS_INPUT));
2883 errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT)); 3129 errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT));
3130 errorLists.add(getRequiredInput(RESOLVE_UNIT_ERRORS_INPUT));
2884 errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT)); 3131 errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT));
2885 errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT)); 3132 errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT));
2886 // 3133 //
2887 // Record outputs. 3134 // Record outputs.
2888 // 3135 //
2889 outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists); 3136 outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists);
2890 } 3137 }
2891 3138
2892 /** 3139 /**
2893 * Return a map from the names of the inputs of this kind of task to the task 3140 * Return a map from the names of the inputs of this kind of task to the task
2894 * input descriptors describing those inputs for a task with the 3141 * input descriptors describing those inputs for a task with the
2895 * given [unit]. 3142 * given [unit].
2896 */ 3143 */
2897 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 3144 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2898 LibrarySpecificUnit unit = target; 3145 LibrarySpecificUnit unit = target;
2899 Map<String, TaskInput> inputs = <String, TaskInput>{ 3146 Map<String, TaskInput> inputs = <String, TaskInput>{
2900 HINTS_INPUT: HINTS.of(unit), 3147 HINTS_INPUT: HINTS.of(unit),
2901 INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT:
2902 INFER_STATIC_VARIABLE_TYPES_ERRORS.of(unit),
2903 PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT:
2904 PARTIALLY_RESOLVE_REFERENCES_ERRORS.of(unit),
2905 RESOLVE_FUNCTION_BODIES_ERRORS_INPUT:
2906 RESOLVE_FUNCTION_BODIES_ERRORS.of(unit),
2907 RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit), 3148 RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit),
3149 RESOLVE_UNIT_ERRORS_INPUT: RESOLVE_UNIT_ERRORS.of(unit),
2908 VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit), 3150 VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit),
2909 VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit) 3151 VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit)
2910 }; 3152 };
2911 Source source = unit.source; 3153 Source source = unit.source;
2912 if (unit.library == source) { 3154 if (unit.library == source) {
2913 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] = 3155 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] =
2914 BUILD_DIRECTIVES_ERRORS.of(source); 3156 BUILD_DIRECTIVES_ERRORS.of(source);
2915 inputs[BUILD_LIBRARY_ERRORS_INPUT] = BUILD_LIBRARY_ERRORS.of(source); 3157 inputs[BUILD_LIBRARY_ERRORS_INPUT] = BUILD_LIBRARY_ERRORS.of(source);
2916 } else { 3158 } else {
2917 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] = 3159 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] =
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
3138 * The name of the [TYPE_PROVIDER] input. 3380 * The name of the [TYPE_PROVIDER] input.
3139 */ 3381 */
3140 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; 3382 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
3141 3383
3142 /** 3384 /**
3143 * The task descriptor describing this kind of task. 3385 * The task descriptor describing this kind of task.
3144 */ 3386 */
3145 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 3387 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
3146 'PartiallyResolveUnitReferencesTask', 3388 'PartiallyResolveUnitReferencesTask',
3147 createTask, 3389 createTask,
3148 buildInputs, <ResultDescriptor>[ 3390 buildInputs,
3149 INFERABLE_STATIC_VARIABLES_IN_UNIT, 3391 <ResultDescriptor>[INFERABLE_STATIC_VARIABLES_IN_UNIT, RESOLVED_UNIT5]);
3150 PARTIALLY_RESOLVE_REFERENCES_ERRORS,
3151 RESOLVED_UNIT5
3152 ]);
3153 3392
3154 PartiallyResolveUnitReferencesTask( 3393 PartiallyResolveUnitReferencesTask(
3155 InternalAnalysisContext context, AnalysisTarget target) 3394 InternalAnalysisContext context, AnalysisTarget target)
3156 : super(context, target); 3395 : super(context, target);
3157 3396
3158 @override 3397 @override
3159 TaskDescriptor get descriptor => DESCRIPTOR; 3398 TaskDescriptor get descriptor => DESCRIPTOR;
3160 3399
3161 @override 3400 @override
3162 void internalPerform() { 3401 void internalPerform() {
(...skipping 11 matching lines...) Expand all
3174 InheritanceManager inheritanceManager = 3413 InheritanceManager inheritanceManager =
3175 new InheritanceManager(libraryElement); 3414 new InheritanceManager(libraryElement);
3176 PartialResolverVisitor visitor = new PartialResolverVisitor( 3415 PartialResolverVisitor visitor = new PartialResolverVisitor(
3177 libraryElement, unitElement.source, typeProvider, errorListener, 3416 libraryElement, unitElement.source, typeProvider, errorListener,
3178 inheritanceManager: inheritanceManager); 3417 inheritanceManager: inheritanceManager);
3179 unit.accept(visitor); 3418 unit.accept(visitor);
3180 // 3419 //
3181 // Record outputs. 3420 // Record outputs.
3182 // 3421 //
3183 outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = visitor.variablesAndFields; 3422 outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = visitor.variablesAndFields;
3184 outputs[PARTIALLY_RESOLVE_REFERENCES_ERRORS] =
3185 removeDuplicateErrors(errorListener.errors);
3186 outputs[RESOLVED_UNIT5] = unit; 3423 outputs[RESOLVED_UNIT5] = unit;
3187 } 3424 }
3188 3425
3189 /** 3426 /**
3190 * Return a map from the names of the inputs of this kind of task to the task 3427 * Return a map from the names of the inputs of this kind of task to the task
3191 * input descriptors describing those inputs for a task with the 3428 * input descriptors describing those inputs for a task with the
3192 * given [target]. 3429 * given [target].
3193 */ 3430 */
3194 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 3431 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
3195 LibrarySpecificUnit unit = target; 3432 LibrarySpecificUnit unit = target;
3196 return <String, TaskInput>{ 3433 return <String, TaskInput>{
3197 'fullyBuiltLibraryElements': IMPORT_EXPORT_SOURCE_CLOSURE 3434 'fullyBuiltLibraryElements': IMPORT_EXPORT_SOURCE_CLOSURE
3198 .of(unit.library) 3435 .of(unit.library)
3199 .toListOf(LIBRARY_ELEMENT5), 3436 .toListOf(LIBRARY_ELEMENT5),
3200 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library), 3437 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library),
3201 UNIT_INPUT: RESOLVED_UNIT4.of(unit), 3438 UNIT_INPUT: RESOLVED_UNIT4.of(unit),
3202 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) 3439 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
3440 // In strong mode, add additional dependencies to enforce inference
3441 // ordering.
3442
3443 // Require that full inference be complete for all dependencies of the
3444 // current library cycle.
3445 'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES.of(unit).toList(
3446 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8
3447 .of(new LibrarySpecificUnit(unit.librarySource, unit.source)))
3203 }; 3448 };
3204 } 3449 }
3205 3450
3206 /** 3451 /**
3207 * Create a [PartiallyResolveUnitReferencesTask] based on the given [target] 3452 * Create a [PartiallyResolveUnitReferencesTask] based on the given [target]
3208 * in the given [context]. 3453 * in the given [context].
3209 */ 3454 */
3210 static PartiallyResolveUnitReferencesTask createTask( 3455 static PartiallyResolveUnitReferencesTask createTask(
3211 AnalysisContext context, AnalysisTarget target) { 3456 AnalysisContext context, AnalysisTarget target) {
3212 return new PartiallyResolveUnitReferencesTask(context, target); 3457 return new PartiallyResolveUnitReferencesTask(context, target);
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
3347 dependsOn.add(name); 3592 dependsOn.add(name);
3348 } 3593 }
3349 } 3594 }
3350 } 3595 }
3351 } 3596 }
3352 3597
3353 /** 3598 /**
3354 * A task that resolves the bodies of top-level functions, constructors, and 3599 * A task that resolves the bodies of top-level functions, constructors, and
3355 * methods within a single compilation unit. 3600 * methods within a single compilation unit.
3356 */ 3601 */
3357 class ResolveFunctionBodiesInUnitTask extends SourceBasedAnalysisTask { 3602 class ResolveUnitTask extends SourceBasedAnalysisTask {
3603 /**
3604 * The name of the input whose value is the defining [LIBRARY_ELEMENT5].
3605 */
3606 static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
3607
3358 /** 3608 /**
3359 * The name of the [TYPE_PROVIDER] input. 3609 * The name of the [TYPE_PROVIDER] input.
3360 */ 3610 */
3361 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; 3611 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
3362 3612
3363 /** 3613 /**
3364 * The name of the [RESOLVED_UNIT7] input. 3614 * The name of the [RESOLVED_UNIT8] input.
3365 */ 3615 */
3366 static const String UNIT_INPUT = 'UNIT_INPUT'; 3616 static const String UNIT_INPUT = 'UNIT_INPUT';
3367 3617
3368 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 3618 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
3369 'ResolveFunctionBodiesInUnitTask', 3619 'ResolveUnitTask',
3370 createTask, 3620 createTask,
3371 buildInputs, 3621 buildInputs,
3372 <ResultDescriptor>[RESOLVE_FUNCTION_BODIES_ERRORS, RESOLVED_UNIT8]); 3622 <ResultDescriptor>[RESOLVE_UNIT_ERRORS, RESOLVED_UNIT9]);
3373 3623
3374 ResolveFunctionBodiesInUnitTask( 3624 ResolveUnitTask(
3375 InternalAnalysisContext context, LibrarySpecificUnit compilationUnit) 3625 InternalAnalysisContext context, LibrarySpecificUnit compilationUnit)
3376 : super(context, compilationUnit); 3626 : super(context, compilationUnit);
3377 3627
3378 @override 3628 @override
3379 TaskDescriptor get descriptor => DESCRIPTOR; 3629 TaskDescriptor get descriptor => DESCRIPTOR;
3380 3630
3381 @override 3631 @override
3382 void internalPerform() { 3632 void internalPerform() {
3383 // 3633 //
3384 // Prepare inputs. 3634 // Prepare inputs.
3385 // 3635 //
3636 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT);
3386 CompilationUnit unit = getRequiredInput(UNIT_INPUT); 3637 CompilationUnit unit = getRequiredInput(UNIT_INPUT);
3387 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); 3638 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
3388 // 3639 //
3389 // Resolve function bodies. 3640 // Resolve everything
3390 // 3641 //
3391 CompilationUnitElement unitElement = unit.element; 3642 CompilationUnitElement unitElement = unit.element;
3392 RecordingErrorListener errorListener = new RecordingErrorListener(); 3643 RecordingErrorListener errorListener = new RecordingErrorListener();
3393 for (CompilationUnitMember unitMember in unit.declarations) { 3644 ResolverVisitor visitor = new ResolverVisitor(
3394 if (unitMember is FunctionDeclaration) { 3645 libraryElement, unitElement.source, typeProvider, errorListener);
3395 _resolveFunctionBody(unitMember.functionExpression.body, unitElement, 3646 unit.accept(visitor);
3396 typeProvider, errorListener);
3397 } else if (unitMember is ClassDeclaration) {
3398 for (ClassMember classMember in unitMember.members) {
3399 if (classMember is ConstructorDeclaration) {
3400 _resolveFunctionBody(
3401 classMember.body, unitElement, typeProvider, errorListener);
3402 } else if (classMember is MethodDeclaration) {
3403 _resolveFunctionBody(
3404 classMember.body, unitElement, typeProvider, errorListener);
3405 }
3406 }
3407 }
3408 }
3409 // 3647 //
3410 // Record outputs. 3648 // Record outputs.
3411 // 3649 //
3412 outputs[RESOLVE_FUNCTION_BODIES_ERRORS] = errorListener.errors; 3650 outputs[RESOLVE_UNIT_ERRORS] = errorListener.errors;
3413 outputs[RESOLVED_UNIT8] = unit; 3651 outputs[RESOLVED_UNIT9] = unit;
3414 }
3415
3416 void _resolveFunctionBody(
3417 FunctionBody functionBody,
3418 CompilationUnitElement unitElement,
3419 TypeProvider typeProvider,
3420 RecordingErrorListener errorListener) {
3421 ResolutionContext resolutionContext =
3422 ResolutionContextBuilder.contextFor(functionBody, errorListener);
3423 ResolverVisitor visitor = new ResolverVisitor(
3424 unitElement.library, unitElement.source, typeProvider, errorListener,
3425 nameScope: resolutionContext.scope);
3426 if (resolutionContext.enclosingClassDeclaration != null) {
3427 visitor.prepareToResolveMembersInClass(
3428 resolutionContext.enclosingClassDeclaration);
3429 }
3430 Declaration declaration = functionBody.getAncestor((AstNode node) =>
3431 node is ConstructorDeclaration ||
3432 node is FunctionDeclaration ||
3433 node is MethodDeclaration);
3434 visitor.initForIncrementalResolution(declaration);
3435 functionBody.accept(visitor);
3436 if (declaration is FunctionDeclaration) {
3437 // This is in the wrong place. The propagated return type is stored
3438 // locally in the resolver, not in the declaration (or element). Hence,
3439 // this needs to happen later.
3440 declaration.accept(visitor.typeAnalyzer);
3441 }
3442 } 3652 }
3443 3653
3444 /** 3654 /**
3445 * Return a map from the names of the inputs of this kind of task to the task 3655 * Return a map from the names of the inputs of this kind of task to the task
3446 * input descriptors describing those inputs for a task with the given 3656 * input descriptors describing those inputs for a task with the given
3447 * [target]. 3657 * [target].
3448 */ 3658 */
3449 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 3659 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
3450 LibrarySpecificUnit unit = target; 3660 LibrarySpecificUnit unit = target;
3451 return <String, TaskInput>{ 3661 return <String, TaskInput>{
3662 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library),
3452 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request), 3663 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request),
3453 UNIT_INPUT: RESOLVED_UNIT7.of(unit) 3664 UNIT_INPUT: RESOLVED_UNIT8.of(unit),
3665 // In strong mode, add additional dependencies to enforce inference
3666 // ordering.
3667
3668 // Require that inference be complete for all units in the
3669 // current library cycle.
3670 'orderLibraryCycleTasks': LIBRARY_CYCLE_UNITS.of(unit).toList(
3671 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8
3672 .of(new LibrarySpecificUnit(unit.librarySource, unit.source)))
3454 }; 3673 };
3455 } 3674 }
3456 3675
3457 /** 3676 /**
3458 * Create a [ResolveFunctionBodiesInUnitTask] based on the given [target] in 3677 * Create a [ResolveUnitTask] based on the given [target] in
3459 * the given [context]. 3678 * the given [context].
3460 */ 3679 */
3461 static ResolveFunctionBodiesInUnitTask createTask( 3680 static ResolveUnitTask createTask(
3462 AnalysisContext context, AnalysisTarget target) { 3681 AnalysisContext context, AnalysisTarget target) {
3463 return new ResolveFunctionBodiesInUnitTask(context, target); 3682 return new ResolveUnitTask(context, target);
3464 } 3683 }
3465 } 3684 }
3466 3685
3467 /** 3686 /**
3468 * A task that finishes resolution by requesting [RESOLVED_UNIT_NO_CONSTANTS] fo r every 3687 * A task that finishes resolution by requesting [RESOLVED_UNIT_NO_CONSTANTS] fo r every
3469 * unit in the libraries closure and produces [LIBRARY_ELEMENT]. 3688 * unit in the libraries closure and produces [LIBRARY_ELEMENT].
3470 */ 3689 */
3471 class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask { 3690 class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask {
3472 /** 3691 /**
3473 * The name of the [LIBRARY_ELEMENT5] input. 3692 * The name of the [LIBRARY_ELEMENT5] input.
3474 */ 3693 */
3475 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; 3694 static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
3476 3695
3477 /** 3696 /**
3478 * The name of the list of [RESOLVED_UNIT8] input. 3697 * The name of the list of [RESOLVED_UNIT9] input.
3479 */ 3698 */
3480 static const String UNITS_INPUT = 'UNITS_INPUT'; 3699 static const String UNITS_INPUT = 'UNITS_INPUT';
3481 3700
3482 /** 3701 /**
3483 * The task descriptor describing this kind of task. 3702 * The task descriptor describing this kind of task.
3484 */ 3703 */
3485 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 3704 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
3486 'ResolveLibraryReferencesTask', 3705 'ResolveLibraryReferencesTask',
3487 createTask, 3706 createTask,
3488 buildInputs, 3707 buildInputs,
(...skipping 28 matching lines...) Expand all
3517 /** 3736 /**
3518 * Return a map from the names of the inputs of this kind of task to the task 3737 * Return a map from the names of the inputs of this kind of task to the task
3519 * input descriptors describing those inputs for a task with the 3738 * input descriptors describing those inputs for a task with the
3520 * given [target]. 3739 * given [target].
3521 */ 3740 */
3522 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 3741 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
3523 Source source = target; 3742 Source source = target;
3524 return <String, TaskInput>{ 3743 return <String, TaskInput>{
3525 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(source), 3744 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(source),
3526 UNITS_INPUT: UNITS.of(source).toList((Source unit) => 3745 UNITS_INPUT: UNITS.of(source).toList((Source unit) =>
3527 RESOLVED_UNIT8.of(new LibrarySpecificUnit(source, unit))), 3746 RESOLVED_UNIT9.of(new LibrarySpecificUnit(source, unit))),
3528 'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE 3747 'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE
3529 .of(source) 3748 .of(source)
3530 .toMapOf(UNITS) 3749 .toMapOf(UNITS)
3531 .toFlattenList((Source library, Source unit) => 3750 .toFlattenList((Source library, Source unit) =>
3532 RESOLVED_UNIT8.of(new LibrarySpecificUnit(library, unit))), 3751 RESOLVED_UNIT9.of(new LibrarySpecificUnit(library, unit))),
3533 }; 3752 };
3534 } 3753 }
3535 3754
3536 /** 3755 /**
3537 * Create a [ResolveLibraryReferencesTask] based on the given [target] in 3756 * Create a [ResolveLibraryReferencesTask] based on the given [target] in
3538 * the given [context]. 3757 * the given [context].
3539 */ 3758 */
3540 static ResolveLibraryReferencesTask createTask( 3759 static ResolveLibraryReferencesTask createTask(
3541 AnalysisContext context, AnalysisTarget target) { 3760 AnalysisContext context, AnalysisTarget target) {
3542 return new ResolveLibraryReferencesTask(context, target); 3761 return new ResolveLibraryReferencesTask(context, target);
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
4126 4345
4127 @override 4346 @override
4128 bool moveNext() { 4347 bool moveNext() {
4129 if (_newSources.isEmpty) { 4348 if (_newSources.isEmpty) {
4130 return false; 4349 return false;
4131 } 4350 }
4132 currentTarget = _newSources.removeLast(); 4351 currentTarget = _newSources.removeLast();
4133 return true; 4352 return true;
4134 } 4353 }
4135 } 4354 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698