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

Side by Side Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 898513002: Fix async/await type checking in analyzer. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Reformat and sort methods Created 5 years, 10 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library engine.resolver; 5 library engine.resolver;
6 6
7 import "dart:math" as math; 7 import "dart:math" as math;
8 import 'dart:collection'; 8 import 'dart:collection';
9 9
10 import 'package:analyzer/src/generated/utilities_collection.dart'; 10 import 'package:analyzer/src/generated/utilities_collection.dart';
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 * a class. 54 * a class.
55 */ 55 */
56 ClassElement _enclosingClass; 56 ClassElement _enclosingClass;
57 57
58 /** 58 /**
59 * The error reporter by which errors will be reported. 59 * The error reporter by which errors will be reported.
60 */ 60 */
61 final ErrorReporter _errorReporter; 61 final ErrorReporter _errorReporter;
62 62
63 /** 63 /**
64 * The type Future<Null>, which is needed for determining whether it is safe
65 * to have a bare "return;" in an async method.
66 */
67 final InterfaceType _futureNullType;
68
69 /**
64 * Create a new instance of the [BestPracticesVerifier]. 70 * Create a new instance of the [BestPracticesVerifier].
65 * 71 *
66 * @param errorReporter the error reporter 72 * @param errorReporter the error reporter
67 */ 73 */
68 BestPracticesVerifier(this._errorReporter); 74 BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider)
75 : _futureNullType = typeProvider.futureType.substitute4(
Brian Wilkerson 2015/02/02 19:41:48 Should we make Future<Null> directly accessible th
Paul Berry 2015/02/02 20:55:38 That's a good idea. I need to do more work in thi
76 <DartType>[typeProvider.nullType]);
69 77
70 @override 78 @override
71 Object visitArgumentList(ArgumentList node) { 79 Object visitArgumentList(ArgumentList node) {
72 _checkForArgumentTypesNotAssignableInList(node); 80 _checkForArgumentTypesNotAssignableInList(node);
73 return super.visitArgumentList(node); 81 return super.visitArgumentList(node);
74 } 82 }
75 83
76 @override 84 @override
77 Object visitAsExpression(AsExpression node) { 85 Object visitAsExpression(AsExpression node) {
78 _checkForUnnecessaryCast(node); 86 _checkForUnnecessaryCast(node);
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 return true; 559 return true;
552 } 560 }
553 return false; 561 return false;
554 } 562 }
555 563
556 /** 564 /**
557 * Generate a hint for functions or methods that have a return type, but do no t have a return 565 * Generate a hint for functions or methods that have a return type, but do no t have a return
558 * statement on all branches. At the end of blocks with no return, Dart implic itly returns 566 * statement on all branches. At the end of blocks with no return, Dart implic itly returns
559 * `null`, avoiding these implicit returns is considered a best practice. 567 * `null`, avoiding these implicit returns is considered a best practice.
560 * 568 *
569 * Note: for async functions/methods, this hint only applies when the
570 * function has a return type that Future<Null> is not assignable to.
571 *
561 * @param node the binary expression to check 572 * @param node the binary expression to check
562 * @param body the function body 573 * @param body the function body
563 * @return `true` if and only if a hint code is generated on the passed node 574 * @return `true` if and only if a hint code is generated on the passed node
564 * See [HintCode.MISSING_RETURN]. 575 * See [HintCode.MISSING_RETURN].
565 */ 576 */
566 bool _checkForMissingReturn(TypeName returnType, FunctionBody body) { 577 bool _checkForMissingReturn(TypeName returnType, FunctionBody body) {
567 // Check that the method or function has a return type, and a function body 578 // Check that the method or function has a return type, and a function body
568 if (returnType == null || body == null) { 579 if (returnType == null || body == null) {
569 return false; 580 return false;
570 } 581 }
571 // Check that the body is a BlockFunctionBody 582 // Check that the body is a BlockFunctionBody
572 if (body is! BlockFunctionBody) { 583 if (body is! BlockFunctionBody) {
573 return false; 584 return false;
574 } 585 }
575 // Check that the type is resolvable, and is not "void" 586 // Check that the type is resolvable, and is not "void"
576 DartType returnTypeType = returnType.type; 587 DartType returnTypeType = returnType.type;
577 if (returnTypeType == null || returnTypeType.isVoid) { 588 if (returnTypeType == null || returnTypeType.isVoid) {
578 return false; 589 return false;
579 } 590 }
591 // For async, give no hint if Future<Null> is assignable to the return
592 // type.
593 if (body.isAsynchronous && _futureNullType.isAssignableTo(returnTypeType)) {
594 return false;
595 }
580 // Check the block for a return statement, if not, create the hint 596 // Check the block for a return statement, if not, create the hint
581 BlockFunctionBody blockFunctionBody = body as BlockFunctionBody; 597 BlockFunctionBody blockFunctionBody = body as BlockFunctionBody;
582 if (!blockFunctionBody.accept(new ExitDetector())) { 598 if (!blockFunctionBody.accept(new ExitDetector())) {
583 _errorReporter.reportErrorForNode( 599 _errorReporter.reportErrorForNode(
584 HintCode.MISSING_RETURN, 600 HintCode.MISSING_RETURN,
585 returnType, 601 returnType,
586 [returnTypeType.displayName]); 602 [returnTypeType.displayName]);
587 return true; 603 return true;
588 } 604 }
589 return false; 605 return false;
(...skipping 3796 matching lines...) Expand 10 before | Expand all | Expand 10 after
4386 4402
4387 /** 4403 /**
4388 * Instances of the class `HintGenerator` traverse a library's worth of dart cod e at a time to 4404 * Instances of the class `HintGenerator` traverse a library's worth of dart cod e at a time to
4389 * generate hints over the set of sources. 4405 * generate hints over the set of sources.
4390 * 4406 *
4391 * See [HintCode]. 4407 * See [HintCode].
4392 */ 4408 */
4393 class HintGenerator { 4409 class HintGenerator {
4394 final List<CompilationUnit> _compilationUnits; 4410 final List<CompilationUnit> _compilationUnits;
4395 4411
4396 final AnalysisContext _context; 4412 final InternalAnalysisContext _context;
4397 4413
4398 final AnalysisErrorListener _errorListener; 4414 final AnalysisErrorListener _errorListener;
4399 4415
4400 LibraryElement _library; 4416 LibraryElement _library;
4401 4417
4402 ImportsVerifier _importsVerifier; 4418 ImportsVerifier _importsVerifier;
4403 4419
4404 bool _enableDart2JSHints = false; 4420 bool _enableDart2JSHints = false;
4405 4421
4406 /** 4422 /**
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4451 ErrorReporter errorReporter = new ErrorReporter(_errorListener, source); 4467 ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
4452 unit.accept(_importsVerifier); 4468 unit.accept(_importsVerifier);
4453 // dead code analysis 4469 // dead code analysis
4454 unit.accept(new DeadCodeVerifier(errorReporter)); 4470 unit.accept(new DeadCodeVerifier(errorReporter));
4455 unit.accept(_usedElementsVisitor); 4471 unit.accept(_usedElementsVisitor);
4456 // dart2js analysis 4472 // dart2js analysis
4457 if (_enableDart2JSHints) { 4473 if (_enableDart2JSHints) {
4458 unit.accept(new Dart2JSVerifier(errorReporter)); 4474 unit.accept(new Dart2JSVerifier(errorReporter));
4459 } 4475 }
4460 // Dart best practices 4476 // Dart best practices
4461 unit.accept(new BestPracticesVerifier(errorReporter)); 4477 unit.accept(
4478 new BestPracticesVerifier(errorReporter, _context.typeProvider));
4462 unit.accept(new OverrideVerifier(_manager, errorReporter)); 4479 unit.accept(new OverrideVerifier(_manager, errorReporter));
4463 // Find to-do comments 4480 // Find to-do comments
4464 new ToDoFinder(errorReporter).findIn(unit); 4481 new ToDoFinder(errorReporter).findIn(unit);
4465 // pub analysis 4482 // pub analysis
4466 // TODO(danrubel/jwren) Commented out until bugs in the pub verifier are 4483 // TODO(danrubel/jwren) Commented out until bugs in the pub verifier are
4467 // fixed 4484 // fixed
4468 // unit.accept(new PubVerifier(context, errorReporter)); 4485 // unit.accept(new PubVerifier(context, errorReporter));
4469 } 4486 }
4470 } 4487 }
4471 4488
(...skipping 3211 matching lines...) Expand 10 before | Expand all | Expand 10 after
7683 * [AnalysisErrorListener] with the [recordingErrorListener]. 7700 * [AnalysisErrorListener] with the [recordingErrorListener].
7684 */ 7701 */
7685 RecordingErrorListener _errorListener; 7702 RecordingErrorListener _errorListener;
7686 7703
7687 /** 7704 /**
7688 * A source object representing the core library (dart:core). 7705 * A source object representing the core library (dart:core).
7689 */ 7706 */
7690 Source _coreLibrarySource; 7707 Source _coreLibrarySource;
7691 7708
7692 /** 7709 /**
7710 * A Source object representing the async library (dart:async).
7711 */
7712 Source _asyncLibrarySource;
7713
7714 /**
7693 * The object representing the core library. 7715 * The object representing the core library.
7694 */ 7716 */
7695 Library _coreLibrary; 7717 Library _coreLibrary;
7696 7718
7697 /** 7719 /**
7720 * The object representing the async library.
7721 */
7722 Library _asyncLibrary;
7723
7724 /**
7698 * The object used to access the types from the core library. 7725 * The object used to access the types from the core library.
7699 */ 7726 */
7700 TypeProvider _typeProvider; 7727 TypeProvider _typeProvider;
7701 7728
7702 /** 7729 /**
7703 * A table mapping library sources to the information being maintained for tho se libraries. 7730 * A table mapping library sources to the information being maintained for tho se libraries.
7704 */ 7731 */
7705 HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>(); 7732 HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>();
7706 7733
7707 /** 7734 /**
7708 * A collection containing the libraries that are being resolved together. 7735 * A collection containing the libraries that are being resolved together.
7709 */ 7736 */
7710 Set<Library> _librariesInCycles; 7737 Set<Library> _librariesInCycles;
7711 7738
7712 /** 7739 /**
7713 * Initialize a newly created library resolver to resolve libraries within the given context. 7740 * Initialize a newly created library resolver to resolve libraries within the given context.
7714 * 7741 *
7715 * @param analysisContext the analysis context in which the library is being a nalyzed 7742 * @param analysisContext the analysis context in which the library is being a nalyzed
7716 */ 7743 */
7717 LibraryResolver(this.analysisContext) { 7744 LibraryResolver(this.analysisContext) {
7718 this._errorListener = new RecordingErrorListener(); 7745 this._errorListener = new RecordingErrorListener();
7719 _coreLibrarySource = 7746 _coreLibrarySource =
7720 analysisContext.sourceFactory.forUri(DartSdk.DART_CORE); 7747 analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
7748 _asyncLibrarySource =
7749 analysisContext.sourceFactory.forUri(DartSdk.DART_ASYNC);
7721 } 7750 }
7722 7751
7723 /** 7752 /**
7724 * Return the listener to which analysis errors will be reported. 7753 * Return the listener to which analysis errors will be reported.
7725 * 7754 *
7726 * @return the listener to which analysis errors will be reported 7755 * @return the listener to which analysis errors will be reported
7727 */ 7756 */
7728 RecordingErrorListener get errorListener => _errorListener; 7757 RecordingErrorListener get errorListener => _errorListener;
7729 7758
7730 /** 7759 /**
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
7762 */ 7791 */
7763 LibraryElement resolveEmbeddedLibrary(Source librarySource, 7792 LibraryElement resolveEmbeddedLibrary(Source librarySource,
7764 CompilationUnit unit, bool fullAnalysis) { 7793 CompilationUnit unit, bool fullAnalysis) {
7765 // 7794 //
7766 // Create the objects representing the library being resolved and the core 7795 // Create the objects representing the library being resolved and the core
7767 // library. 7796 // library.
7768 // 7797 //
7769 Library targetLibrary = _createLibraryWithUnit(librarySource, unit); 7798 Library targetLibrary = _createLibraryWithUnit(librarySource, unit);
7770 _coreLibrary = _libraryMap[_coreLibrarySource]; 7799 _coreLibrary = _libraryMap[_coreLibrarySource];
7771 if (_coreLibrary == null) { 7800 if (_coreLibrary == null) {
7772 // This will be true unless the library being analyzed is the core 7801 // This will only happen if the library being analyzed is the core
7773 // library. 7802 // library.
7774 _coreLibrary = createLibrary(_coreLibrarySource); 7803 _coreLibrary = createLibrary(_coreLibrarySource);
7775 if (_coreLibrary == null) { 7804 if (_coreLibrary == null) {
7776 LibraryResolver2.missingCoreLibrary( 7805 LibraryResolver2.missingCoreLibrary(
7777 analysisContext, 7806 analysisContext,
7778 _coreLibrarySource); 7807 _coreLibrarySource);
7779 } 7808 }
7780 } 7809 }
7810 _asyncLibrary = _libraryMap[_asyncLibrarySource];
7811 if (_asyncLibrary == null) {
7812 // This will only happen if the library being analyzed is the async
7813 // library.
7814 _asyncLibrary = createLibrary(_asyncLibrarySource);
7815 if (_asyncLibrary == null) {
7816 LibraryResolver2.missingAsyncLibrary(
7817 analysisContext,
7818 _asyncLibrarySource);
7819 }
7820 }
7781 // 7821 //
7782 // Compute the set of libraries that need to be resolved together. 7822 // Compute the set of libraries that need to be resolved together.
7783 // 7823 //
7784 _computeEmbeddedLibraryDependencies(targetLibrary, unit); 7824 _computeEmbeddedLibraryDependencies(targetLibrary, unit);
7785 _librariesInCycles = _computeLibrariesInCycles(targetLibrary); 7825 _librariesInCycles = _computeLibrariesInCycles(targetLibrary);
7786 // 7826 //
7787 // Build the element models representing the libraries being resolved. 7827 // Build the element models representing the libraries being resolved.
7788 // This is done in three steps: 7828 // This is done in three steps:
7789 // 7829 //
7790 // 1. Build the basic element models without making any connections 7830 // 1. Build the basic element models without making any connections
7791 // between elements other than the basic parent/child relationships. 7831 // between elements other than the basic parent/child relationships.
7792 // This includes building the elements representing the libraries. 7832 // This includes building the elements representing the libraries.
7793 // 2. Build the elements for the import and export directives. This 7833 // 2. Build the elements for the import and export directives. This
7794 // requires that we have the elements built for the referenced 7834 // requires that we have the elements built for the referenced
7795 // libraries, but because of the possibility of circular references 7835 // libraries, but because of the possibility of circular references
7796 // needs to happen after all of the library elements have been created. 7836 // needs to happen after all of the library elements have been created.
7797 // 3. Build the rest of the type model by connecting superclasses, mixins, 7837 // 3. Build the rest of the type model by connecting superclasses, mixins,
7798 // and interfaces. This requires that we be able to compute the names 7838 // and interfaces. This requires that we be able to compute the names
7799 // visible in the libraries being resolved, which in turn requires that 7839 // visible in the libraries being resolved, which in turn requires that
7800 // we have resolved the import directives. 7840 // we have resolved the import directives.
7801 // 7841 //
7802 _buildElementModels(); 7842 _buildElementModels();
7803 LibraryElement coreElement = _coreLibrary.libraryElement; 7843 LibraryElement coreElement = _coreLibrary.libraryElement;
7804 if (coreElement == null) { 7844 if (coreElement == null) {
7805 throw new AnalysisException("Could not resolve dart:core"); 7845 throw new AnalysisException("Could not resolve dart:core");
7806 } 7846 }
7847 LibraryElement asyncElement = _asyncLibrary.libraryElement;
7848 if (asyncElement == null) {
7849 throw new AnalysisException("Could not resolve dart:async");
7850 }
7807 _buildDirectiveModels(); 7851 _buildDirectiveModels();
7808 _typeProvider = new TypeProviderImpl(coreElement); 7852 _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
7809 _buildTypeAliases(); 7853 _buildTypeAliases();
7810 _buildTypeHierarchies(); 7854 _buildTypeHierarchies();
7811 // 7855 //
7812 // Perform resolution and type analysis. 7856 // Perform resolution and type analysis.
7813 // 7857 //
7814 // TODO(brianwilkerson) Decide whether we want to resolve all of the 7858 // TODO(brianwilkerson) Decide whether we want to resolve all of the
7815 // libraries or whether we want to only resolve the target library. 7859 // libraries or whether we want to only resolve the target library.
7816 // The advantage to resolving everything is that we have already done part 7860 // The advantage to resolving everything is that we have already done part
7817 // of the work so we'll avoid duplicated effort. The disadvantage of 7861 // of the work so we'll avoid duplicated effort. The disadvantage of
7818 // resolving everything is that we might do extra work that we don't 7862 // resolving everything is that we might do extra work that we don't
(...skipping 23 matching lines...) Expand all
7842 * @throws AnalysisException if the library could not be resolved for some rea son 7886 * @throws AnalysisException if the library could not be resolved for some rea son
7843 */ 7887 */
7844 LibraryElement resolveLibrary(Source librarySource, bool fullAnalysis) { 7888 LibraryElement resolveLibrary(Source librarySource, bool fullAnalysis) {
7845 // 7889 //
7846 // Create the objects representing the library being resolved and the core 7890 // Create the objects representing the library being resolved and the core
7847 // library. 7891 // library.
7848 // 7892 //
7849 Library targetLibrary = createLibrary(librarySource); 7893 Library targetLibrary = createLibrary(librarySource);
7850 _coreLibrary = _libraryMap[_coreLibrarySource]; 7894 _coreLibrary = _libraryMap[_coreLibrarySource];
7851 if (_coreLibrary == null) { 7895 if (_coreLibrary == null) {
7852 // This will be true unless the library being analyzed is the core 7896 // This should only happen if the library being analyzed is the core
7853 // library. 7897 // library.
7854 _coreLibrary = _createLibraryOrNull(_coreLibrarySource); 7898 _coreLibrary = _createLibraryOrNull(_coreLibrarySource);
7855 if (_coreLibrary == null) { 7899 if (_coreLibrary == null) {
7856 LibraryResolver2.missingCoreLibrary( 7900 LibraryResolver2.missingCoreLibrary(
7857 analysisContext, 7901 analysisContext,
7858 _coreLibrarySource); 7902 _coreLibrarySource);
7859 } 7903 }
7860 } 7904 }
7905 _asyncLibrary = _libraryMap[_asyncLibrarySource];
7906 if (_asyncLibrary == null) {
7907 // This should only happen if the library being analyzed is the async
7908 // library.
7909 _asyncLibrary = _createLibraryOrNull(_asyncLibrarySource);
7910 if (_asyncLibrary == null) {
7911 LibraryResolver2.missingAsyncLibrary(
7912 analysisContext,
7913 _asyncLibrarySource);
7914 }
7915 }
7861 // 7916 //
7862 // Compute the set of libraries that need to be resolved together. 7917 // Compute the set of libraries that need to be resolved together.
7863 // 7918 //
7864 _computeLibraryDependencies(targetLibrary); 7919 _computeLibraryDependencies(targetLibrary);
7865 _librariesInCycles = _computeLibrariesInCycles(targetLibrary); 7920 _librariesInCycles = _computeLibrariesInCycles(targetLibrary);
7866 // 7921 //
7867 // Build the element models representing the libraries being resolved. 7922 // Build the element models representing the libraries being resolved.
7868 // This is done in three steps: 7923 // This is done in three steps:
7869 // 7924 //
7870 // 1. Build the basic element models without making any connections 7925 // 1. Build the basic element models without making any connections
7871 // between elements other than the basic parent/child relationships. 7926 // between elements other than the basic parent/child relationships.
7872 // This includes building the elements representing the libraries, but 7927 // This includes building the elements representing the libraries, but
7873 // excludes members defined in enums. 7928 // excludes members defined in enums.
7874 // 2. Build the elements for the import and export directives. This 7929 // 2. Build the elements for the import and export directives. This
7875 // requires that we have the elements built for the referenced 7930 // requires that we have the elements built for the referenced
7876 // libraries, but because of the possibility of circular references 7931 // libraries, but because of the possibility of circular references
7877 // needs to happen after all of the library elements have been created. 7932 // needs to happen after all of the library elements have been created.
7878 // 3. Build the members in enum declarations. 7933 // 3. Build the members in enum declarations.
7879 // 4. Build the rest of the type model by connecting superclasses, mixins, 7934 // 4. Build the rest of the type model by connecting superclasses, mixins,
7880 // and interfaces. This requires that we be able to compute the names 7935 // and interfaces. This requires that we be able to compute the names
7881 // visible in the libraries being resolved, which in turn requires that 7936 // visible in the libraries being resolved, which in turn requires that
7882 // we have resolved the import directives. 7937 // we have resolved the import directives.
7883 // 7938 //
7884 _buildElementModels(); 7939 _buildElementModels();
7885 LibraryElement coreElement = _coreLibrary.libraryElement; 7940 LibraryElement coreElement = _coreLibrary.libraryElement;
7886 if (coreElement == null) { 7941 if (coreElement == null) {
7887 throw new AnalysisException("Could not resolve dart:core"); 7942 throw new AnalysisException("Could not resolve dart:core");
7888 } 7943 }
7944 LibraryElement asyncElement = _asyncLibrary.libraryElement;
7945 if (asyncElement == null) {
7946 throw new AnalysisException("Coulb not resolve dart:async");
7947 }
7889 _buildDirectiveModels(); 7948 _buildDirectiveModels();
7890 _typeProvider = new TypeProviderImpl(coreElement); 7949 _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
7891 _buildEnumMembers(); 7950 _buildEnumMembers();
7892 _buildTypeAliases(); 7951 _buildTypeAliases();
7893 _buildTypeHierarchies(); 7952 _buildTypeHierarchies();
7894 _buildImplicitConstructors(); 7953 _buildImplicitConstructors();
7895 // 7954 //
7896 // Perform resolution and type analysis. 7955 // Perform resolution and type analysis.
7897 // 7956 //
7898 // TODO(brianwilkerson) Decide whether we want to resolve all of the 7957 // TODO(brianwilkerson) Decide whether we want to resolve all of the
7899 // libraries or whether we want to only resolve the target library. The 7958 // libraries or whether we want to only resolve the target library. The
7900 // advantage to resolving everything is that we have already done part of 7959 // advantage to resolving everything is that we have already done part of
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
7959 * to the given dependency map. 8018 * to the given dependency map.
7960 * 8019 *
7961 * @param library the library currently being added to the dependency map 8020 * @param library the library currently being added to the dependency map
7962 * @param dependencyMap the dependency map being computed 8021 * @param dependencyMap the dependency map being computed
7963 * @param visitedLibraries the libraries that have already been visited, used to prevent infinite 8022 * @param visitedLibraries the libraries that have already been visited, used to prevent infinite
7964 * recursion 8023 * recursion
7965 */ 8024 */
7966 void _addToDependencyMap(Library library, HashMap<Library, 8025 void _addToDependencyMap(Library library, HashMap<Library,
7967 List<Library>> dependencyMap, Set<Library> visitedLibraries) { 8026 List<Library>> dependencyMap, Set<Library> visitedLibraries) {
7968 if (visitedLibraries.add(library)) { 8027 if (visitedLibraries.add(library)) {
8028 bool asyncFound = false;
7969 for (Library referencedLibrary in library.importsAndExports) { 8029 for (Library referencedLibrary in library.importsAndExports) {
7970 _addDependencyToMap(dependencyMap, library, referencedLibrary); 8030 _addDependencyToMap(dependencyMap, library, referencedLibrary);
7971 _addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries); 8031 _addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries);
8032 if (identical(referencedLibrary, _asyncLibrary)) {
8033 asyncFound = true;
8034 }
7972 } 8035 }
7973 if (!library.explicitlyImportsCore && !identical(library, _coreLibrary)) { 8036 if (!library.explicitlyImportsCore && !identical(library, _coreLibrary)) {
7974 _addDependencyToMap(dependencyMap, library, _coreLibrary); 8037 _addDependencyToMap(dependencyMap, library, _coreLibrary);
7975 } 8038 }
8039 if (!asyncFound && !identical(library, _asyncLibrary)) {
8040 _addDependencyToMap(dependencyMap, library, _asyncLibrary);
8041 _addToDependencyMap(_asyncLibrary, dependencyMap, visitedLibraries);
8042 }
7976 } 8043 }
7977 } 8044 }
7978 8045
7979 /** 8046 /**
7980 * Build the element model representing the combinators declared by the given directive. 8047 * Build the element model representing the combinators declared by the given directive.
7981 * 8048 *
7982 * @param directive the directive that declares the combinators 8049 * @param directive the directive that declares the combinators
7983 * @return an array containing the import combinators that were built 8050 * @return an array containing the import combinators that were built
7984 */ 8051 */
7985 List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) { 8052 List<NamespaceCombinator> _buildCombinators(NamespaceDirective directive) {
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
8332 * 8399 *
8333 * @param library the library to be processed to find libraries that have not yet been traversed 8400 * @param library the library to be processed to find libraries that have not yet been traversed
8334 * @param importedSources an array containing the sources that are imported in to the given library 8401 * @param importedSources an array containing the sources that are imported in to the given library
8335 * @param exportedSources an array containing the sources that are exported fr om the given library 8402 * @param exportedSources an array containing the sources that are exported fr om the given library
8336 * @throws AnalysisException if some portion of the library graph could not be traversed 8403 * @throws AnalysisException if some portion of the library graph could not be traversed
8337 */ 8404 */
8338 void _computeLibraryDependenciesFromDirectives(Library library, 8405 void _computeLibraryDependenciesFromDirectives(Library library,
8339 List<Source> importedSources, List<Source> exportedSources) { 8406 List<Source> importedSources, List<Source> exportedSources) {
8340 List<Library> importedLibraries = new List<Library>(); 8407 List<Library> importedLibraries = new List<Library>();
8341 bool explicitlyImportsCore = false; 8408 bool explicitlyImportsCore = false;
8409 bool importsAsync = false;
8342 for (Source importedSource in importedSources) { 8410 for (Source importedSource in importedSources) {
8343 if (importedSource == _coreLibrarySource) { 8411 if (importedSource == _coreLibrarySource) {
8344 explicitlyImportsCore = true; 8412 explicitlyImportsCore = true;
8345 } 8413 }
8414 if (importedSource == _asyncLibrarySource) {
8415 importsAsync = true;
8416 }
8346 Library importedLibrary = _libraryMap[importedSource]; 8417 Library importedLibrary = _libraryMap[importedSource];
8347 if (importedLibrary == null) { 8418 if (importedLibrary == null) {
8348 importedLibrary = _createLibraryOrNull(importedSource); 8419 importedLibrary = _createLibraryOrNull(importedSource);
8349 if (importedLibrary != null) { 8420 if (importedLibrary != null) {
8350 _computeLibraryDependencies(importedLibrary); 8421 _computeLibraryDependencies(importedLibrary);
8351 } 8422 }
8352 } 8423 }
8353 if (importedLibrary != null) { 8424 if (importedLibrary != null) {
8354 importedLibraries.add(importedLibrary); 8425 importedLibraries.add(importedLibrary);
8355 } 8426 }
(...skipping 16 matching lines...) Expand all
8372 library.explicitlyImportsCore = explicitlyImportsCore; 8443 library.explicitlyImportsCore = explicitlyImportsCore;
8373 if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) { 8444 if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) {
8374 Library importedLibrary = _libraryMap[_coreLibrarySource]; 8445 Library importedLibrary = _libraryMap[_coreLibrarySource];
8375 if (importedLibrary == null) { 8446 if (importedLibrary == null) {
8376 importedLibrary = _createLibraryOrNull(_coreLibrarySource); 8447 importedLibrary = _createLibraryOrNull(_coreLibrarySource);
8377 if (importedLibrary != null) { 8448 if (importedLibrary != null) {
8378 _computeLibraryDependencies(importedLibrary); 8449 _computeLibraryDependencies(importedLibrary);
8379 } 8450 }
8380 } 8451 }
8381 } 8452 }
8453 if (!importsAsync && _asyncLibrarySource != library.librarySource) {
8454 Library importedLibrary = _libraryMap[_asyncLibrarySource];
8455 if (importedLibrary == null) {
8456 importedLibrary = _createLibraryOrNull(_asyncLibrarySource);
8457 if (importedLibrary != null) {
8458 _computeLibraryDependencies(importedLibrary);
8459 }
8460 }
8461 }
8382 } 8462 }
8383 8463
8384 /** 8464 /**
8385 * Create an object to represent the information about the library defined by the compilation unit 8465 * Create an object to represent the information about the library defined by the compilation unit
8386 * with the given source. Return the library object that was created, or `null ` if the 8466 * with the given source. Return the library object that was created, or `null ` if the
8387 * source is not valid. 8467 * source is not valid.
8388 * 8468 *
8389 * @param librarySource the source of the library's defining compilation unit 8469 * @param librarySource the source of the library's defining compilation unit
8390 * @return the library object that was created 8470 * @return the library object that was created
8391 */ 8471 */
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
8553 * [AnalysisErrorListener] with the [recordingErrorListener]. 8633 * [AnalysisErrorListener] with the [recordingErrorListener].
8554 */ 8634 */
8555 RecordingErrorListener _errorListener; 8635 RecordingErrorListener _errorListener;
8556 8636
8557 /** 8637 /**
8558 * A source object representing the core library (dart:core). 8638 * A source object representing the core library (dart:core).
8559 */ 8639 */
8560 Source _coreLibrarySource; 8640 Source _coreLibrarySource;
8561 8641
8562 /** 8642 /**
8643 * A source object representing the async library (dart:async).
8644 */
8645 Source _asyncLibrarySource;
8646
8647 /**
8563 * The object representing the core library. 8648 * The object representing the core library.
8564 */ 8649 */
8565 ResolvableLibrary _coreLibrary; 8650 ResolvableLibrary _coreLibrary;
8566 8651
8567 /** 8652 /**
8653 * The object representing the async library.
8654 */
8655 ResolvableLibrary _asyncLibrary;
8656
8657 /**
8568 * The object used to access the types from the core library. 8658 * The object used to access the types from the core library.
8569 */ 8659 */
8570 TypeProvider _typeProvider; 8660 TypeProvider _typeProvider;
8571 8661
8572 /** 8662 /**
8573 * A table mapping library sources to the information being maintained for tho se libraries. 8663 * A table mapping library sources to the information being maintained for tho se libraries.
8574 */ 8664 */
8575 HashMap<Source, ResolvableLibrary> _libraryMap = 8665 HashMap<Source, ResolvableLibrary> _libraryMap =
8576 new HashMap<Source, ResolvableLibrary>(); 8666 new HashMap<Source, ResolvableLibrary>();
8577 8667
8578 /** 8668 /**
8579 * A collection containing the libraries that are being resolved together. 8669 * A collection containing the libraries that are being resolved together.
8580 */ 8670 */
8581 List<ResolvableLibrary> _librariesInCycle; 8671 List<ResolvableLibrary> _librariesInCycle;
8582 8672
8583 /** 8673 /**
8584 * Initialize a newly created library resolver to resolve libraries within the given context. 8674 * Initialize a newly created library resolver to resolve libraries within the given context.
8585 * 8675 *
8586 * @param analysisContext the analysis context in which the library is being a nalyzed 8676 * @param analysisContext the analysis context in which the library is being a nalyzed
8587 */ 8677 */
8588 LibraryResolver2(this.analysisContext) { 8678 LibraryResolver2(this.analysisContext) {
8589 this._errorListener = new RecordingErrorListener(); 8679 this._errorListener = new RecordingErrorListener();
8590 _coreLibrarySource = 8680 _coreLibrarySource =
8591 analysisContext.sourceFactory.forUri(DartSdk.DART_CORE); 8681 analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
8682 _asyncLibrarySource =
8683 analysisContext.sourceFactory.forUri(DartSdk.DART_ASYNC);
8592 } 8684 }
8593 8685
8594 /** 8686 /**
8595 * Return the listener to which analysis errors will be reported. 8687 * Return the listener to which analysis errors will be reported.
8596 * 8688 *
8597 * @return the listener to which analysis errors will be reported 8689 * @return the listener to which analysis errors will be reported
8598 */ 8690 */
8599 RecordingErrorListener get errorListener => _errorListener; 8691 RecordingErrorListener get errorListener => _errorListener;
8600 8692
8601 /** 8693 /**
(...skipping 18 matching lines...) Expand all
8620 */ 8712 */
8621 LibraryElement resolveLibrary(Source librarySource, 8713 LibraryElement resolveLibrary(Source librarySource,
8622 List<ResolvableLibrary> librariesInCycle) { 8714 List<ResolvableLibrary> librariesInCycle) {
8623 // 8715 //
8624 // Build the map of libraries that are known. 8716 // Build the map of libraries that are known.
8625 // 8717 //
8626 this._librariesInCycle = librariesInCycle; 8718 this._librariesInCycle = librariesInCycle;
8627 _libraryMap = _buildLibraryMap(); 8719 _libraryMap = _buildLibraryMap();
8628 ResolvableLibrary targetLibrary = _libraryMap[librarySource]; 8720 ResolvableLibrary targetLibrary = _libraryMap[librarySource];
8629 _coreLibrary = _libraryMap[_coreLibrarySource]; 8721 _coreLibrary = _libraryMap[_coreLibrarySource];
8722 _asyncLibrary = _libraryMap[_asyncLibrarySource];
8630 // 8723 //
8631 // Build the element models representing the libraries being resolved. 8724 // Build the element models representing the libraries being resolved.
8632 // This is done in three steps: 8725 // This is done in three steps:
8633 // 8726 //
8634 // 1. Build the basic element models without making any connections 8727 // 1. Build the basic element models without making any connections
8635 // between elements other than the basic parent/child relationships. 8728 // between elements other than the basic parent/child relationships.
8636 // This includes building the elements representing the libraries, but 8729 // This includes building the elements representing the libraries, but
8637 // excludes members defined in enums. 8730 // excludes members defined in enums.
8638 // 2. Build the elements for the import and export directives. This 8731 // 2. Build the elements for the import and export directives. This
8639 // requires that we have the elements built for the referenced 8732 // requires that we have the elements built for the referenced
8640 // libraries, but because of the possibility of circular references 8733 // libraries, but because of the possibility of circular references
8641 // needs to happen after all of the library elements have been created. 8734 // needs to happen after all of the library elements have been created.
8642 // 3. Build the members in enum declarations. 8735 // 3. Build the members in enum declarations.
8643 // 4. Build the rest of the type model by connecting superclasses, mixins, 8736 // 4. Build the rest of the type model by connecting superclasses, mixins,
8644 // and interfaces. This requires that we be able to compute the names 8737 // and interfaces. This requires that we be able to compute the names
8645 // visible in the libraries being resolved, which in turn requires that 8738 // visible in the libraries being resolved, which in turn requires that
8646 // we have resolved the import directives. 8739 // we have resolved the import directives.
8647 // 8740 //
8648 _buildElementModels(); 8741 _buildElementModels();
8649 LibraryElement coreElement = _coreLibrary.libraryElement; 8742 LibraryElement coreElement = _coreLibrary.libraryElement;
8650 if (coreElement == null) { 8743 if (coreElement == null) {
8651 missingCoreLibrary(analysisContext, _coreLibrarySource); 8744 missingCoreLibrary(analysisContext, _coreLibrarySource);
8652 } 8745 }
8746 LibraryElement asyncElement = _asyncLibrary.libraryElement;
8747 if (asyncElement == null) {
8748 missingAsyncLibrary(analysisContext, _asyncLibrarySource);
8749 }
8653 _buildDirectiveModels(); 8750 _buildDirectiveModels();
8654 _typeProvider = new TypeProviderImpl(coreElement); 8751 _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
8655 _buildEnumMembers(); 8752 _buildEnumMembers();
8656 _buildTypeAliases(); 8753 _buildTypeAliases();
8657 _buildTypeHierarchies(); 8754 _buildTypeHierarchies();
8658 _buildImplicitConstructors(); 8755 _buildImplicitConstructors();
8659 // 8756 //
8660 // Perform resolution and type analysis. 8757 // Perform resolution and type analysis.
8661 // 8758 //
8662 // TODO(brianwilkerson) Decide whether we want to resolve all of the 8759 // TODO(brianwilkerson) Decide whether we want to resolve all of the
8663 // libraries or whether we want to only resolve the target library. The 8760 // libraries or whether we want to only resolve the target library. The
8664 // advantage to resolving everything is that we have already done part of 8761 // advantage to resolving everything is that we have already done part of
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
9061 ResolverVisitor visitor = 9158 ResolverVisitor visitor =
9062 new ResolverVisitor.con4(library, source, _typeProvider); 9159 new ResolverVisitor.con4(library, source, _typeProvider);
9063 ast.accept(visitor); 9160 ast.accept(visitor);
9064 } 9161 }
9065 } finally { 9162 } finally {
9066 timeCounter.stop(); 9163 timeCounter.stop();
9067 } 9164 }
9068 } 9165 }
9069 9166
9070 /** 9167 /**
9168 * Report that the async library could not be resolved in the given
9169 * [analysisContext] and throw an exception. [asyncLibrarySource] is the sour ce
9170 * representing the async library.
9171 */
9172 static void missingAsyncLibrary(AnalysisContext analysisContext,
9173 Source asyncLibrarySource) {
9174 throw new AnalysisException("Could not resolve dart:async");
9175 }
9176
9177 /**
9071 * Report that the core library could not be resolved in the given analysis co ntext and throw an 9178 * Report that the core library could not be resolved in the given analysis co ntext and throw an
9072 * exception. 9179 * exception.
9073 * 9180 *
9074 * @param analysisContext the analysis context in which the failure occurred 9181 * @param analysisContext the analysis context in which the failure occurred
9075 * @param coreLibrarySource the source representing the core library 9182 * @param coreLibrarySource the source representing the core library
9076 * @throws AnalysisException always 9183 * @throws AnalysisException always
9077 */ 9184 */
9078 static void missingCoreLibrary(AnalysisContext analysisContext, 9185 static void missingCoreLibrary(AnalysisContext analysisContext,
9079 Source coreLibrarySource) { 9186 Source coreLibrarySource) {
9080 throw new AnalysisException("Could not resolve dart:core"); 9187 throw new AnalysisException("Could not resolve dart:core");
(...skipping 4212 matching lines...) Expand 10 before | Expand all | Expand 10 after
13293 DartType get dynamicType; 13400 DartType get dynamicType;
13294 13401
13295 /** 13402 /**
13296 * Return the type representing the built-in type 'Function'. 13403 * Return the type representing the built-in type 'Function'.
13297 * 13404 *
13298 * @return the type representing the built-in type 'Function' 13405 * @return the type representing the built-in type 'Function'
13299 */ 13406 */
13300 InterfaceType get functionType; 13407 InterfaceType get functionType;
13301 13408
13302 /** 13409 /**
13410 * Return the type representing the built-in type 'Future'.
13411 */
13412 InterfaceType get futureType;
13413
13414 /**
13303 * Return the type representing the built-in type 'int'. 13415 * Return the type representing the built-in type 'int'.
13304 * 13416 *
13305 * @return the type representing the built-in type 'int' 13417 * @return the type representing the built-in type 'int'
13306 */ 13418 */
13307 InterfaceType get intType; 13419 InterfaceType get intType;
13308 13420
13309 /** 13421 /**
13310 * Return the type representing the built-in type 'List'. 13422 * Return the type representing the built-in type 'List'.
13311 * 13423 *
13312 * @return the type representing the built-in type 'List' 13424 * @return the type representing the built-in type 'List'
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
13404 * The type representing the built-in type 'dynamic'. 13516 * The type representing the built-in type 'dynamic'.
13405 */ 13517 */
13406 DartType _dynamicType; 13518 DartType _dynamicType;
13407 13519
13408 /** 13520 /**
13409 * The type representing the built-in type 'Function'. 13521 * The type representing the built-in type 'Function'.
13410 */ 13522 */
13411 InterfaceType _functionType; 13523 InterfaceType _functionType;
13412 13524
13413 /** 13525 /**
13526 * The type representing the built-in type 'Future'.
13527 */
13528 InterfaceType _futureType;
13529
13530 /**
13414 * The type representing the built-in type 'int'. 13531 * The type representing the built-in type 'int'.
13415 */ 13532 */
13416 InterfaceType _intType; 13533 InterfaceType _intType;
13417 13534
13418 /** 13535 /**
13419 * The type representing the built-in type 'List'. 13536 * The type representing the built-in type 'List'.
13420 */ 13537 */
13421 InterfaceType _listType; 13538 InterfaceType _listType;
13422 13539
13423 /** 13540 /**
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
13463 /** 13580 /**
13464 * The type representing typenames that can't be resolved. 13581 * The type representing typenames that can't be resolved.
13465 */ 13582 */
13466 DartType _undefinedType; 13583 DartType _undefinedType;
13467 13584
13468 /** 13585 /**
13469 * Initialize a newly created type provider to provide the types defined in th e given library. 13586 * Initialize a newly created type provider to provide the types defined in th e given library.
13470 * 13587 *
13471 * @param coreLibrary the element representing the core library (dart:core). 13588 * @param coreLibrary the element representing the core library (dart:core).
13472 */ 13589 */
13473 TypeProviderImpl(LibraryElement coreLibrary) { 13590 TypeProviderImpl(LibraryElement coreLibrary, LibraryElement asyncLibrary) {
13474 _initializeFrom(coreLibrary); 13591 _initializeFrom(coreLibrary, asyncLibrary);
13475 } 13592 }
13476 13593
13477 @override 13594 @override
13478 InterfaceType get boolType => _boolType; 13595 InterfaceType get boolType => _boolType;
13479 13596
13480 @override 13597 @override
13481 DartType get bottomType => _bottomType; 13598 DartType get bottomType => _bottomType;
13482 13599
13483 @override 13600 @override
13484 InterfaceType get deprecatedType => _deprecatedType; 13601 InterfaceType get deprecatedType => _deprecatedType;
13485 13602
13486 @override 13603 @override
13487 InterfaceType get doubleType => _doubleType; 13604 InterfaceType get doubleType => _doubleType;
13488 13605
13489 @override 13606 @override
13490 DartType get dynamicType => _dynamicType; 13607 DartType get dynamicType => _dynamicType;
13491 13608
13492 @override 13609 @override
13493 InterfaceType get functionType => _functionType; 13610 InterfaceType get functionType => _functionType;
13494 13611
13495 @override 13612 @override
13613 InterfaceType get futureType => _futureType;
13614
13615 @override
13496 InterfaceType get intType => _intType; 13616 InterfaceType get intType => _intType;
13497 13617
13498 @override 13618 @override
13499 InterfaceType get listType => _listType; 13619 InterfaceType get listType => _listType;
13500 13620
13501 @override 13621 @override
13502 InterfaceType get mapType => _mapType; 13622 InterfaceType get mapType => _mapType;
13503 13623
13504 @override 13624 @override
13505 InterfaceType get nullType => _nullType; 13625 InterfaceType get nullType => _nullType;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
13541 return null; 13661 return null;
13542 } 13662 }
13543 return (element as ClassElement).type; 13663 return (element as ClassElement).type;
13544 } 13664 }
13545 13665
13546 /** 13666 /**
13547 * Initialize the types provided by this type provider from the given library. 13667 * Initialize the types provided by this type provider from the given library.
13548 * 13668 *
13549 * @param library the library containing the definitions of the core types 13669 * @param library the library containing the definitions of the core types
13550 */ 13670 */
13551 void _initializeFrom(LibraryElement library) { 13671 void _initializeFrom(LibraryElement coreLibrary,
13552 Namespace namespace = 13672 LibraryElement asyncLibrary) {
13553 new NamespaceBuilder().createPublicNamespaceForLibrary(library); 13673 Namespace coreNamespace =
13554 _boolType = _getType(namespace, "bool"); 13674 new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary);
13675 Namespace asyncNamespace =
13676 new NamespaceBuilder().createPublicNamespaceForLibrary(asyncLibrary);
13677 _boolType = _getType(coreNamespace, "bool");
13555 _bottomType = BottomTypeImpl.instance; 13678 _bottomType = BottomTypeImpl.instance;
13556 _deprecatedType = _getType(namespace, "Deprecated"); 13679 _deprecatedType = _getType(coreNamespace, "Deprecated");
13557 _doubleType = _getType(namespace, "double"); 13680 _doubleType = _getType(coreNamespace, "double");
13558 _dynamicType = DynamicTypeImpl.instance; 13681 _dynamicType = DynamicTypeImpl.instance;
13559 _functionType = _getType(namespace, "Function"); 13682 _functionType = _getType(coreNamespace, "Function");
13560 _intType = _getType(namespace, "int"); 13683 _futureType = _getType(asyncNamespace, "Future");
13561 _listType = _getType(namespace, "List"); 13684 _intType = _getType(coreNamespace, "int");
13562 _mapType = _getType(namespace, "Map"); 13685 _listType = _getType(coreNamespace, "List");
13563 _nullType = _getType(namespace, "Null"); 13686 _mapType = _getType(coreNamespace, "Map");
13564 _numType = _getType(namespace, "num"); 13687 _nullType = _getType(coreNamespace, "Null");
13565 _objectType = _getType(namespace, "Object"); 13688 _numType = _getType(coreNamespace, "num");
13566 _stackTraceType = _getType(namespace, "StackTrace"); 13689 _objectType = _getType(coreNamespace, "Object");
13567 _stringType = _getType(namespace, "String"); 13690 _stackTraceType = _getType(coreNamespace, "StackTrace");
13568 _symbolType = _getType(namespace, "Symbol"); 13691 _stringType = _getType(coreNamespace, "String");
13569 _typeType = _getType(namespace, "Type"); 13692 _symbolType = _getType(coreNamespace, "Symbol");
13693 _typeType = _getType(coreNamespace, "Type");
13570 _undefinedType = UndefinedTypeImpl.instance; 13694 _undefinedType = UndefinedTypeImpl.instance;
13571 } 13695 }
13572 } 13696 }
13573 13697
13574 /** 13698 /**
13575 * Instances of the class `TypeResolverVisitor` are used to resolve the types as sociated with 13699 * Instances of the class `TypeResolverVisitor` are used to resolve the types as sociated with
13576 * the elements in the element model. This includes the types of superclasses, m ixins, interfaces, 13700 * the elements in the element model. This includes the types of superclasses, m ixins, interfaces,
13577 * fields, methods, parameters, and local variables. As a side-effect, this also finishes building 13701 * fields, methods, parameters, and local variables. As a side-effect, this also finishes building
13578 * the type hierarchy. 13702 * the type hierarchy.
13579 */ 13703 */
(...skipping 1880 matching lines...) Expand 10 before | Expand all | Expand 10 after
15460 * library. 15584 * library.
15461 */ 15585 */
15462 final HashSet<String> members = new HashSet<String>(); 15586 final HashSet<String> members = new HashSet<String>();
15463 15587
15464 /** 15588 /**
15465 * Names of resolved or unresolved class members that are read in the 15589 * Names of resolved or unresolved class members that are read in the
15466 * library. 15590 * library.
15467 */ 15591 */
15468 final HashSet<String> readMembers = new HashSet<String>(); 15592 final HashSet<String> readMembers = new HashSet<String>();
15469 } 15593 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698