| OLD | NEW |
| 1 // This code was auto-generated, is not intended to be edited, and is subject to | 1 // This code was auto-generated, is not intended to be edited, and is subject to |
| 2 // significant change. Please see the README file for more information. | 2 // significant change. Please see the README file for more information. |
| 3 library engine.resolver; | 3 library engine.resolver; |
| 4 import 'dart:collection'; | 4 import 'dart:collection'; |
| 5 import 'java_core.dart'; | 5 import 'java_core.dart'; |
| 6 import 'java_engine.dart'; | 6 import 'java_engine.dart'; |
| 7 import 'instrumentation.dart'; | 7 import 'instrumentation.dart'; |
| 8 import 'source.dart'; | 8 import 'source.dart'; |
| 9 import 'error.dart'; | 9 import 'error.dart'; |
| 10 import 'scanner.dart' as sc; | 10 import 'scanner.dart' as sc; |
| (...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 static String _TYPE = "type"; | 1021 static String _TYPE = "type"; |
| 1022 | 1022 |
| 1023 /** | 1023 /** |
| 1024 * The analysis context in which the element model will be built. | 1024 * The analysis context in which the element model will be built. |
| 1025 */ | 1025 */ |
| 1026 InternalAnalysisContext _context; | 1026 InternalAnalysisContext _context; |
| 1027 | 1027 |
| 1028 /** | 1028 /** |
| 1029 * The error listener to which errors will be reported. | 1029 * The error listener to which errors will be reported. |
| 1030 */ | 1030 */ |
| 1031 RecordingErrorListener _errorListener; | 1031 RecordingErrorListener errorListener; |
| 1032 | 1032 |
| 1033 /** | 1033 /** |
| 1034 * The modification time of the source for which an element is being built. | 1034 * The modification time of the source for which an element is being built. |
| 1035 */ | 1035 */ |
| 1036 int _modificationStamp = 0; | 1036 int _modificationStamp = 0; |
| 1037 | 1037 |
| 1038 /** | 1038 /** |
| 1039 * The line information associated with the source for which an element is bei
ng built, or | 1039 * The line information associated with the source for which an element is bei
ng built, or |
| 1040 * `null` if we are not building an element. | 1040 * `null` if we are not building an element. |
| 1041 */ | 1041 */ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1052 List<ht.XmlTagNode> _parentNodes; | 1052 List<ht.XmlTagNode> _parentNodes; |
| 1053 | 1053 |
| 1054 /** | 1054 /** |
| 1055 * The script elements being built. | 1055 * The script elements being built. |
| 1056 */ | 1056 */ |
| 1057 List<HtmlScriptElement> _scripts; | 1057 List<HtmlScriptElement> _scripts; |
| 1058 | 1058 |
| 1059 /** | 1059 /** |
| 1060 * A set of the libraries that were resolved while resolving the HTML unit. | 1060 * A set of the libraries that were resolved while resolving the HTML unit. |
| 1061 */ | 1061 */ |
| 1062 Set<Library> _resolvedLibraries = new Set<Library>(); | 1062 final Set<Library> resolvedLibraries = new Set<Library>(); |
| 1063 | 1063 |
| 1064 /** | 1064 /** |
| 1065 * Initialize a newly created HTML unit builder. | 1065 * Initialize a newly created HTML unit builder. |
| 1066 * | 1066 * |
| 1067 * @param context the analysis context in which the element model will be buil
t | 1067 * @param context the analysis context in which the element model will be buil
t |
| 1068 */ | 1068 */ |
| 1069 HtmlUnitBuilder(InternalAnalysisContext context) { | 1069 HtmlUnitBuilder(InternalAnalysisContext context) { |
| 1070 this._context = context; | 1070 this._context = context; |
| 1071 this._errorListener = new RecordingErrorListener(); | 1071 this.errorListener = new RecordingErrorListener(); |
| 1072 } | 1072 } |
| 1073 | 1073 |
| 1074 /** | 1074 /** |
| 1075 * Build the HTML element for the given source. | 1075 * Build the HTML element for the given source. |
| 1076 * | 1076 * |
| 1077 * @param source the source describing the compilation unit | 1077 * @param source the source describing the compilation unit |
| 1078 * @return the HTML element that was built | 1078 * @return the HTML element that was built |
| 1079 * @throws AnalysisException if the analysis could not be performed | 1079 * @throws AnalysisException if the analysis could not be performed |
| 1080 */ | 1080 */ |
| 1081 HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, s
ource.modificationStamp, _context.parseHtmlUnit(source)); | 1081 HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, s
ource.modificationStamp, _context.parseHtmlUnit(source)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1093 this._modificationStamp = modificationStamp2; | 1093 this._modificationStamp = modificationStamp2; |
| 1094 _lineInfo = _context.computeLineInfo(source2); | 1094 _lineInfo = _context.computeLineInfo(source2); |
| 1095 HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName); | 1095 HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName); |
| 1096 result.source = source2; | 1096 result.source = source2; |
| 1097 _htmlElement = result; | 1097 _htmlElement = result; |
| 1098 unit.accept(this); | 1098 unit.accept(this); |
| 1099 _htmlElement = null; | 1099 _htmlElement = null; |
| 1100 unit.element = result; | 1100 unit.element = result; |
| 1101 return result; | 1101 return result; |
| 1102 } | 1102 } |
| 1103 | |
| 1104 /** | |
| 1105 * Return the listener to which analysis errors will be reported. | |
| 1106 * | |
| 1107 * @return the listener to which analysis errors will be reported | |
| 1108 */ | |
| 1109 RecordingErrorListener get errorListener => _errorListener; | |
| 1110 | |
| 1111 /** | |
| 1112 * Return an array containing information about all of the libraries that were
resolved. | |
| 1113 * | |
| 1114 * @return an array containing the libraries that were resolved | |
| 1115 */ | |
| 1116 Set<Library> get resolvedLibraries => _resolvedLibraries; | |
| 1117 Object visitHtmlUnit(ht.HtmlUnit node) { | 1103 Object visitHtmlUnit(ht.HtmlUnit node) { |
| 1118 _parentNodes = new List<ht.XmlTagNode>(); | 1104 _parentNodes = new List<ht.XmlTagNode>(); |
| 1119 _scripts = new List<HtmlScriptElement>(); | 1105 _scripts = new List<HtmlScriptElement>(); |
| 1120 try { | 1106 try { |
| 1121 node.visitChildren(this); | 1107 node.visitChildren(this); |
| 1122 _htmlElement.scripts = new List.from(_scripts); | 1108 _htmlElement.scripts = new List.from(_scripts); |
| 1123 } finally { | 1109 } finally { |
| 1124 _scripts = null; | 1110 _scripts = null; |
| 1125 _parentNodes = null; | 1111 _parentNodes = null; |
| 1126 } | 1112 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1154 try { | 1140 try { |
| 1155 if (isScriptNode(node)) { | 1141 if (isScriptNode(node)) { |
| 1156 Source htmlSource = _htmlElement.source; | 1142 Source htmlSource = _htmlElement.source; |
| 1157 ht.XmlAttributeNode scriptAttribute = getScriptSourcePath(node); | 1143 ht.XmlAttributeNode scriptAttribute = getScriptSourcePath(node); |
| 1158 String scriptSourcePath = scriptAttribute == null ? null : scriptAttribu
te.text; | 1144 String scriptSourcePath = scriptAttribute == null ? null : scriptAttribu
te.text; |
| 1159 if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePa
th == null) { | 1145 if (identical(node.attributeEnd.type, ht.TokenType.GT) && scriptSourcePa
th == null) { |
| 1160 EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementIm
pl(node); | 1146 EmbeddedHtmlScriptElementImpl script = new EmbeddedHtmlScriptElementIm
pl(node); |
| 1161 String contents = node.content; | 1147 String contents = node.content; |
| 1162 int attributeEnd = node.attributeEnd.end; | 1148 int attributeEnd = node.attributeEnd.end; |
| 1163 LineInfo_Location location = _lineInfo.getLocation(attributeEnd); | 1149 LineInfo_Location location = _lineInfo.getLocation(attributeEnd); |
| 1164 sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents,
_errorListener); | 1150 sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents,
errorListener); |
| 1165 scanner.setSourceStart(location.lineNumber, location.columnNumber, att
ributeEnd); | 1151 scanner.setSourceStart(location.lineNumber, location.columnNumber, att
ributeEnd); |
| 1166 sc.Token firstToken = scanner.tokenize(); | 1152 sc.Token firstToken = scanner.tokenize(); |
| 1167 List<int> lineStarts = scanner.lineStarts; | 1153 List<int> lineStarts = scanner.lineStarts; |
| 1168 Parser parser = new Parser(htmlSource, _errorListener); | 1154 Parser parser = new Parser(htmlSource, errorListener); |
| 1169 CompilationUnit unit = parser.parseCompilationUnit(firstToken); | 1155 CompilationUnit unit = parser.parseCompilationUnit(firstToken); |
| 1170 unit.lineInfo = new LineInfo(lineStarts); | 1156 unit.lineInfo = new LineInfo(lineStarts); |
| 1171 try { | 1157 try { |
| 1172 LibraryResolver resolver = new LibraryResolver(_context); | 1158 LibraryResolver resolver = new LibraryResolver(_context); |
| 1173 LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSou
rce, _modificationStamp, unit, true) as LibraryElementImpl; | 1159 LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSou
rce, _modificationStamp, unit, true) as LibraryElementImpl; |
| 1174 script.scriptLibrary = library; | 1160 script.scriptLibrary = library; |
| 1175 _resolvedLibraries.addAll(resolver.resolvedLibraries); | 1161 resolvedLibraries.addAll(resolver.resolvedLibraries); |
| 1176 _errorListener.addAll(resolver.errorListener); | 1162 errorListener.addAll(resolver.errorListener); |
| 1177 } on AnalysisException catch (exception) { | 1163 } on AnalysisException catch (exception) { |
| 1178 AnalysisEngine.instance.logger.logError3(exception); | 1164 AnalysisEngine.instance.logger.logError3(exception); |
| 1179 } | 1165 } |
| 1180 _scripts.add(script); | 1166 _scripts.add(script); |
| 1181 } else { | 1167 } else { |
| 1182 ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementIm
pl(node); | 1168 ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementIm
pl(node); |
| 1183 if (scriptSourcePath != null) { | 1169 if (scriptSourcePath != null) { |
| 1184 try { | 1170 try { |
| 1185 scriptSourcePath = Uri.encodeFull(scriptSourcePath); | 1171 scriptSourcePath = Uri.encodeFull(scriptSourcePath); |
| 1186 parseUriWithException(scriptSourcePath); | 1172 parseUriWithException(scriptSourcePath); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 /** | 1232 /** |
| 1247 * Report an error with the given error code at the given location. Use the gi
ven arguments to | 1233 * Report an error with the given error code at the given location. Use the gi
ven arguments to |
| 1248 * compose the error message. | 1234 * compose the error message. |
| 1249 * | 1235 * |
| 1250 * @param errorCode the error code of the error to be reported | 1236 * @param errorCode the error code of the error to be reported |
| 1251 * @param offset the offset of the first character to be highlighted | 1237 * @param offset the offset of the first character to be highlighted |
| 1252 * @param length the number of characters to be highlighted | 1238 * @param length the number of characters to be highlighted |
| 1253 * @param arguments the arguments used to compose the error message | 1239 * @param arguments the arguments used to compose the error message |
| 1254 */ | 1240 */ |
| 1255 void reportError(ErrorCode errorCode, int offset, int length, List<Object> arg
uments) { | 1241 void reportError(ErrorCode errorCode, int offset, int length, List<Object> arg
uments) { |
| 1256 _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, l
ength, errorCode, arguments)); | 1242 errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, le
ngth, errorCode, arguments)); |
| 1257 } | 1243 } |
| 1258 | 1244 |
| 1259 /** | 1245 /** |
| 1260 * Report an error with the given error code at the location of the value of t
he given attribute. | 1246 * Report an error with the given error code at the location of the value of t
he given attribute. |
| 1261 * Use the given arguments to compose the error message. | 1247 * Use the given arguments to compose the error message. |
| 1262 * | 1248 * |
| 1263 * @param errorCode the error code of the error to be reported | 1249 * @param errorCode the error code of the error to be reported |
| 1264 * @param offset the offset of the first character to be highlighted | 1250 * @param offset the offset of the first character to be highlighted |
| 1265 * @param length the number of characters to be highlighted | 1251 * @param length the number of characters to be highlighted |
| 1266 * @param arguments the arguments used to compose the error message | 1252 * @param arguments the arguments used to compose the error message |
| (...skipping 3541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4808 InheritanceManager _inheritanceManager; | 4794 InheritanceManager _inheritanceManager; |
| 4809 | 4795 |
| 4810 /** | 4796 /** |
| 4811 * The listener to which analysis errors will be reported. | 4797 * The listener to which analysis errors will be reported. |
| 4812 */ | 4798 */ |
| 4813 AnalysisErrorListener _errorListener; | 4799 AnalysisErrorListener _errorListener; |
| 4814 | 4800 |
| 4815 /** | 4801 /** |
| 4816 * The source specifying the defining compilation unit of this library. | 4802 * The source specifying the defining compilation unit of this library. |
| 4817 */ | 4803 */ |
| 4818 Source _librarySource; | 4804 Source librarySource; |
| 4819 | 4805 |
| 4820 /** | 4806 /** |
| 4821 * The library element representing this library. | 4807 * The library element representing this library. |
| 4822 */ | 4808 */ |
| 4823 LibraryElementImpl _libraryElement; | 4809 LibraryElementImpl _libraryElement; |
| 4824 | 4810 |
| 4825 /** | 4811 /** |
| 4826 * A list containing all of the libraries that are imported into this library. | 4812 * A list containing all of the libraries that are imported into this library. |
| 4827 */ | 4813 */ |
| 4828 List<Library> _importedLibraries = _EMPTY_ARRAY; | 4814 List<Library> imports = _EMPTY_ARRAY; |
| 4829 | 4815 |
| 4830 /** | 4816 /** |
| 4831 * A table mapping URI-based directive to the actual URI value. | 4817 * A table mapping URI-based directive to the actual URI value. |
| 4832 */ | 4818 */ |
| 4833 Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, Str
ing>(); | 4819 Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, Str
ing>(); |
| 4834 | 4820 |
| 4835 /** | 4821 /** |
| 4836 * A flag indicating whether this library explicitly imports core. | 4822 * A flag indicating whether this library explicitly imports core. |
| 4837 */ | 4823 */ |
| 4838 bool _explicitlyImportsCore = false; | 4824 bool explicitlyImportsCore = false; |
| 4839 | 4825 |
| 4840 /** | 4826 /** |
| 4841 * A list containing all of the libraries that are exported from this library. | 4827 * A list containing all of the libraries that are exported from this library. |
| 4842 */ | 4828 */ |
| 4843 List<Library> _exportedLibraries = _EMPTY_ARRAY; | 4829 List<Library> exports = _EMPTY_ARRAY; |
| 4844 | 4830 |
| 4845 /** | 4831 /** |
| 4846 * A table mapping the sources for the compilation units in this library to th
eir corresponding | 4832 * A table mapping the sources for the compilation units in this library to th
eir corresponding |
| 4847 * AST structures. | 4833 * AST structures. |
| 4848 */ | 4834 */ |
| 4849 Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCom
pilationUnit>(); | 4835 Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCom
pilationUnit>(); |
| 4850 | 4836 |
| 4851 /** | 4837 /** |
| 4852 * The library scope used when resolving elements within this library's compil
ation units. | 4838 * The library scope used when resolving elements within this library's compil
ation units. |
| 4853 */ | 4839 */ |
| 4854 LibraryScope _libraryScope; | 4840 LibraryScope _libraryScope; |
| 4855 | 4841 |
| 4856 /** | 4842 /** |
| 4857 * An empty array that can be used to initialize lists of libraries. | 4843 * An empty array that can be used to initialize lists of libraries. |
| 4858 */ | 4844 */ |
| 4859 static List<Library> _EMPTY_ARRAY = new List<Library>(0); | 4845 static List<Library> _EMPTY_ARRAY = new List<Library>(0); |
| 4860 | 4846 |
| 4861 /** | 4847 /** |
| 4862 * Initialize a newly created data holder that can maintain the data associate
d with a library. | 4848 * Initialize a newly created data holder that can maintain the data associate
d with a library. |
| 4863 * | 4849 * |
| 4864 * @param analysisContext the analysis context in which this library is being
analyzed | 4850 * @param analysisContext the analysis context in which this library is being
analyzed |
| 4865 * @param errorListener the listener to which analysis errors will be reported | 4851 * @param errorListener the listener to which analysis errors will be reported |
| 4866 * @param librarySource the source specifying the defining compilation unit of
this library | 4852 * @param librarySource the source specifying the defining compilation unit of
this library |
| 4867 */ | 4853 */ |
| 4868 Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorLi
stener, Source librarySource) { | 4854 Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorLi
stener, Source librarySource) { |
| 4869 this._analysisContext = analysisContext; | 4855 this._analysisContext = analysisContext; |
| 4870 this._errorListener = errorListener; | 4856 this._errorListener = errorListener; |
| 4871 this._librarySource = librarySource; | 4857 this.librarySource = librarySource; |
| 4872 this._libraryElement = analysisContext.getLibraryElement(librarySource) as L
ibraryElementImpl; | 4858 this._libraryElement = analysisContext.getLibraryElement(librarySource) as L
ibraryElementImpl; |
| 4873 } | 4859 } |
| 4874 | 4860 |
| 4875 /** | 4861 /** |
| 4876 * Return the AST structure associated with the given source. | 4862 * Return the AST structure associated with the given source. |
| 4877 * | 4863 * |
| 4878 * @param source the source representing the compilation unit whose AST is to
be returned | 4864 * @param source the source representing the compilation unit whose AST is to
be returned |
| 4879 * @return the AST structure associated with the given source | 4865 * @return the AST structure associated with the given source |
| 4880 * @throws AnalysisException if an AST structure could not be created for the
compilation unit | 4866 * @throws AnalysisException if an AST structure could not be created for the
compilation unit |
| 4881 */ | 4867 */ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 4892 * Return an array of the [CompilationUnit]s that make up the library. The fir
st unit is | 4878 * Return an array of the [CompilationUnit]s that make up the library. The fir
st unit is |
| 4893 * always the defining unit. | 4879 * always the defining unit. |
| 4894 * | 4880 * |
| 4895 * @return an array of the [CompilationUnit]s that make up the library. The fi
rst unit is | 4881 * @return an array of the [CompilationUnit]s that make up the library. The fi
rst unit is |
| 4896 * always the defining unit | 4882 * always the defining unit |
| 4897 */ | 4883 */ |
| 4898 List<CompilationUnit> get compilationUnits { | 4884 List<CompilationUnit> get compilationUnits { |
| 4899 List<CompilationUnit> unitArrayList = new List<CompilationUnit>(); | 4885 List<CompilationUnit> unitArrayList = new List<CompilationUnit>(); |
| 4900 unitArrayList.add(definingCompilationUnit); | 4886 unitArrayList.add(definingCompilationUnit); |
| 4901 for (Source source in _astMap.keys.toSet()) { | 4887 for (Source source in _astMap.keys.toSet()) { |
| 4902 if (_librarySource != source) { | 4888 if (librarySource != source) { |
| 4903 unitArrayList.add(getAST(source)); | 4889 unitArrayList.add(getAST(source)); |
| 4904 } | 4890 } |
| 4905 } | 4891 } |
| 4906 return new List.from(unitArrayList); | 4892 return new List.from(unitArrayList); |
| 4907 } | 4893 } |
| 4908 | 4894 |
| 4909 /** | 4895 /** |
| 4910 * Return a collection containing the sources for the compilation units in thi
s library, including | 4896 * Return a collection containing the sources for the compilation units in thi
s library, including |
| 4911 * the defining compilation unit. | 4897 * the defining compilation unit. |
| 4912 * | 4898 * |
| 4913 * @return the sources for the compilation units in this library | 4899 * @return the sources for the compilation units in this library |
| 4914 */ | 4900 */ |
| 4915 Set<Source> get compilationUnitSources => _astMap.keys.toSet(); | 4901 Set<Source> get compilationUnitSources => _astMap.keys.toSet(); |
| 4916 | 4902 |
| 4917 /** | 4903 /** |
| 4918 * Return the AST structure associated with the defining compilation unit for
this library. | 4904 * Return the AST structure associated with the defining compilation unit for
this library. |
| 4919 * | 4905 * |
| 4920 * @return the AST structure associated with the defining compilation unit for
this library | 4906 * @return the AST structure associated with the defining compilation unit for
this library |
| 4921 * @throws AnalysisException if an AST structure could not be created for the
defining compilation | 4907 * @throws AnalysisException if an AST structure could not be created for the
defining compilation |
| 4922 * unit | 4908 * unit |
| 4923 */ | 4909 */ |
| 4924 CompilationUnit get definingCompilationUnit => getAST(_librarySource); | 4910 CompilationUnit get definingCompilationUnit => getAST(librarySource); |
| 4925 | |
| 4926 /** | |
| 4927 * Return `true` if this library explicitly imports core. | |
| 4928 * | |
| 4929 * @return `true` if this library explicitly imports core | |
| 4930 */ | |
| 4931 bool get explicitlyImportsCore => _explicitlyImportsCore; | |
| 4932 | |
| 4933 /** | |
| 4934 * Return an array containing the libraries that are exported from this librar
y. | |
| 4935 * | |
| 4936 * @return an array containing the libraries that are exported from this libra
ry | |
| 4937 */ | |
| 4938 List<Library> get exports => _exportedLibraries; | |
| 4939 | |
| 4940 /** | |
| 4941 * Return an array containing the libraries that are imported into this librar
y. | |
| 4942 * | |
| 4943 * @return an array containing the libraries that are imported into this libra
ry | |
| 4944 */ | |
| 4945 List<Library> get imports => _importedLibraries; | |
| 4946 | 4911 |
| 4947 /** | 4912 /** |
| 4948 * Return an array containing the libraries that are either imported or export
ed from this | 4913 * Return an array containing the libraries that are either imported or export
ed from this |
| 4949 * library. | 4914 * library. |
| 4950 * | 4915 * |
| 4951 * @return the libraries that are either imported or exported from this librar
y | 4916 * @return the libraries that are either imported or exported from this librar
y |
| 4952 */ | 4917 */ |
| 4953 List<Library> get importsAndExports { | 4918 List<Library> get importsAndExports { |
| 4954 Set<Library> libraries = new Set<Library>(); | 4919 Set<Library> libraries = new Set<Library>(); |
| 4955 for (Library library in _importedLibraries) { | 4920 for (Library library in imports) { |
| 4956 javaSetAdd(libraries, library); | 4921 javaSetAdd(libraries, library); |
| 4957 } | 4922 } |
| 4958 for (Library library in _exportedLibraries) { | 4923 for (Library library in exports) { |
| 4959 javaSetAdd(libraries, library); | 4924 javaSetAdd(libraries, library); |
| 4960 } | 4925 } |
| 4961 return new List.from(libraries); | 4926 return new List.from(libraries); |
| 4962 } | 4927 } |
| 4963 | 4928 |
| 4964 /** | 4929 /** |
| 4965 * Return the inheritance manager for this library. | 4930 * Return the inheritance manager for this library. |
| 4966 * | 4931 * |
| 4967 * @return the inheritance manager for this library | 4932 * @return the inheritance manager for this library |
| 4968 */ | 4933 */ |
| 4969 InheritanceManager get inheritanceManager { | 4934 InheritanceManager get inheritanceManager { |
| 4970 if (_inheritanceManager == null) { | 4935 if (_inheritanceManager == null) { |
| 4971 return _inheritanceManager = new InheritanceManager(_libraryElement); | 4936 return _inheritanceManager = new InheritanceManager(_libraryElement); |
| 4972 } | 4937 } |
| 4973 return _inheritanceManager; | 4938 return _inheritanceManager; |
| 4974 } | 4939 } |
| 4975 | 4940 |
| 4976 /** | 4941 /** |
| 4977 * Return the library element representing this library, creating it if necess
ary. | 4942 * Return the library element representing this library, creating it if necess
ary. |
| 4978 * | 4943 * |
| 4979 * @return the library element representing this library | 4944 * @return the library element representing this library |
| 4980 */ | 4945 */ |
| 4981 LibraryElementImpl get libraryElement { | 4946 LibraryElementImpl get libraryElement { |
| 4982 if (_libraryElement == null) { | 4947 if (_libraryElement == null) { |
| 4983 try { | 4948 try { |
| 4984 _libraryElement = _analysisContext.computeLibraryElement(_librarySource)
as LibraryElementImpl; | 4949 _libraryElement = _analysisContext.computeLibraryElement(librarySource)
as LibraryElementImpl; |
| 4985 } on AnalysisException catch (exception) { | 4950 } on AnalysisException catch (exception) { |
| 4986 AnalysisEngine.instance.logger.logError2("Could not compute ilbrary elem
ent for ${_librarySource.fullName}", exception); | 4951 AnalysisEngine.instance.logger.logError2("Could not compute ilbrary elem
ent for ${librarySource.fullName}", exception); |
| 4987 } | 4952 } |
| 4988 } | 4953 } |
| 4989 return _libraryElement; | 4954 return _libraryElement; |
| 4990 } | 4955 } |
| 4991 | 4956 |
| 4992 /** | 4957 /** |
| 4993 * Return the library scope used when resolving elements within this library's
compilation units. | 4958 * Return the library scope used when resolving elements within this library's
compilation units. |
| 4994 * | 4959 * |
| 4995 * @return the library scope used when resolving elements within this library'
s compilation units | 4960 * @return the library scope used when resolving elements within this library'
s compilation units |
| 4996 */ | 4961 */ |
| 4997 LibraryScope get libraryScope { | 4962 LibraryScope get libraryScope { |
| 4998 if (_libraryScope == null) { | 4963 if (_libraryScope == null) { |
| 4999 _libraryScope = new LibraryScope(_libraryElement, _errorListener); | 4964 _libraryScope = new LibraryScope(_libraryElement, _errorListener); |
| 5000 } | 4965 } |
| 5001 return _libraryScope; | 4966 return _libraryScope; |
| 5002 } | 4967 } |
| 5003 | 4968 |
| 5004 /** | 4969 /** |
| 5005 * Return the source specifying the defining compilation unit of this library. | |
| 5006 * | |
| 5007 * @return the source specifying the defining compilation unit of this library | |
| 5008 */ | |
| 5009 Source get librarySource => _librarySource; | |
| 5010 | |
| 5011 /** | |
| 5012 * Return the modification time associated with the given source. | 4970 * Return the modification time associated with the given source. |
| 5013 * | 4971 * |
| 5014 * @param source the source representing the compilation unit whose modificati
on time is to be | 4972 * @param source the source representing the compilation unit whose modificati
on time is to be |
| 5015 * returned | 4973 * returned |
| 5016 * @return the modification time associated with the given source | 4974 * @return the modification time associated with the given source |
| 5017 * @throws AnalysisException if an AST structure could not be created for the
compilation unit | 4975 * @throws AnalysisException if an AST structure could not be created for the
compilation unit |
| 5018 */ | 4976 */ |
| 5019 int getModificationTime(Source source) { | 4977 int getModificationTime(Source source) { |
| 5020 ResolvableCompilationUnit holder = _astMap[source]; | 4978 ResolvableCompilationUnit holder = _astMap[source]; |
| 5021 if (holder == null) { | 4979 if (holder == null) { |
| 5022 holder = _analysisContext.computeResolvableCompilationUnit(source); | 4980 holder = _analysisContext.computeResolvableCompilationUnit(source); |
| 5023 _astMap[source] = holder; | 4981 _astMap[source] = holder; |
| 5024 } | 4982 } |
| 5025 return holder.modificationTime; | 4983 return holder.modificationTime; |
| 5026 } | 4984 } |
| 5027 | 4985 |
| 5028 /** | 4986 /** |
| 5029 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the | 4987 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the |
| 5030 * library, or `null` if the URI is not valid. If the URI is not valid, report
the error. | 4988 * library, or `null` if the URI is not valid. If the URI is not valid, report
the error. |
| 5031 * | 4989 * |
| 5032 * @param directive the directive which URI should be resolved | 4990 * @param directive the directive which URI should be resolved |
| 5033 * @return the result of resolving the URI against the URI of the library | 4991 * @return the result of resolving the URI against the URI of the library |
| 5034 */ | 4992 */ |
| 5035 Source getSource(UriBasedDirective directive) { | 4993 Source getSource(UriBasedDirective directive) { |
| 5036 StringLiteral uriLiteral = directive.uri; | 4994 StringLiteral uriLiteral = directive.uri; |
| 5037 if (uriLiteral is StringInterpolation) { | 4995 if (uriLiteral is StringInterpolation) { |
| 5038 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o
ffset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, [])); | 4996 _errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.of
fset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, [])); |
| 5039 return null; | 4997 return null; |
| 5040 } | 4998 } |
| 5041 String uriContent = uriLiteral.stringValue.trim(); | 4999 String uriContent = uriLiteral.stringValue.trim(); |
| 5042 _directiveUris[directive] = uriContent; | 5000 _directiveUris[directive] = uriContent; |
| 5043 uriContent = Uri.encodeFull(uriContent); | 5001 uriContent = Uri.encodeFull(uriContent); |
| 5044 try { | 5002 try { |
| 5045 parseUriWithException(uriContent); | 5003 parseUriWithException(uriContent); |
| 5046 Source source = _analysisContext.sourceFactory.resolveUri(_librarySource,
uriContent); | 5004 Source source = _analysisContext.sourceFactory.resolveUri(librarySource, u
riContent); |
| 5047 if (source == null || !source.exists()) { | 5005 if (source == null || !source.exists()) { |
| 5048 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral
.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent
])); | 5006 _errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.
offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]
)); |
| 5049 } | 5007 } |
| 5050 return source; | 5008 return source; |
| 5051 } on URISyntaxException catch (exception) { | 5009 } on URISyntaxException catch (exception) { |
| 5052 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o
ffset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent])); | 5010 _errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.of
fset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent])); |
| 5053 } | 5011 } |
| 5054 return null; | 5012 return null; |
| 5055 } | 5013 } |
| 5056 | 5014 |
| 5057 /** | 5015 /** |
| 5058 * Returns the URI value of the given directive. | 5016 * Returns the URI value of the given directive. |
| 5059 */ | 5017 */ |
| 5060 String getUri(UriBasedDirective directive) => _directiveUris[directive]; | 5018 String getUri(UriBasedDirective directive) => _directiveUris[directive]; |
| 5061 | 5019 |
| 5062 /** | 5020 /** |
| 5063 * Set the AST structure associated with the defining compilation unit for thi
s library to the | 5021 * Set the AST structure associated with the defining compilation unit for thi
s library to the |
| 5064 * given AST structure. | 5022 * given AST structure. |
| 5065 * | 5023 * |
| 5066 * @param modificationStamp the modification time of the source from which the
compilation unit | 5024 * @param modificationStamp the modification time of the source from which the
compilation unit |
| 5067 * was created | 5025 * was created |
| 5068 * @param unit the AST structure associated with the defining compilation unit
for this library | 5026 * @param unit the AST structure associated with the defining compilation unit
for this library |
| 5069 */ | 5027 */ |
| 5070 void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) { | 5028 void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) { |
| 5071 _astMap[_librarySource] = new ResolvableCompilationUnit(modificationStamp, u
nit); | 5029 _astMap[librarySource] = new ResolvableCompilationUnit(modificationStamp, un
it); |
| 5072 } | 5030 } |
| 5073 | 5031 |
| 5074 /** | 5032 /** |
| 5075 * Set whether this library explicitly imports core to match the given value. | |
| 5076 * | |
| 5077 * @param explicitlyImportsCore `true` if this library explicitly imports core | |
| 5078 */ | |
| 5079 void set explicitlyImportsCore(bool explicitlyImportsCore2) { | |
| 5080 this._explicitlyImportsCore = explicitlyImportsCore2; | |
| 5081 } | |
| 5082 | |
| 5083 /** | |
| 5084 * Set the libraries that are exported by this library to be those in the give
n array. | 5033 * Set the libraries that are exported by this library to be those in the give
n array. |
| 5085 * | 5034 * |
| 5086 * @param exportedLibraries the libraries that are exported by this library | 5035 * @param exportedLibraries the libraries that are exported by this library |
| 5087 */ | 5036 */ |
| 5088 void set exportedLibraries(List<Library> exportedLibraries2) { | 5037 void set exportedLibraries(List<Library> exportedLibraries2) { |
| 5089 this._exportedLibraries = exportedLibraries2; | 5038 this.exports = exportedLibraries2; |
| 5090 } | 5039 } |
| 5091 | 5040 |
| 5092 /** | 5041 /** |
| 5093 * Set the libraries that are imported into this library to be those in the gi
ven array. | 5042 * Set the libraries that are imported into this library to be those in the gi
ven array. |
| 5094 * | 5043 * |
| 5095 * @param importedLibraries the libraries that are imported into this library | 5044 * @param importedLibraries the libraries that are imported into this library |
| 5096 */ | 5045 */ |
| 5097 void set importedLibraries(List<Library> importedLibraries2) { | 5046 void set importedLibraries(List<Library> importedLibraries2) { |
| 5098 this._importedLibraries = importedLibraries2; | 5047 this.imports = importedLibraries2; |
| 5099 } | 5048 } |
| 5100 | 5049 |
| 5101 /** | 5050 /** |
| 5102 * Set the library element representing this library to the given library elem
ent. | 5051 * Set the library element representing this library to the given library elem
ent. |
| 5103 * | 5052 * |
| 5104 * @param libraryElement the library element representing this library | 5053 * @param libraryElement the library element representing this library |
| 5105 */ | 5054 */ |
| 5106 void set libraryElement(LibraryElementImpl libraryElement2) { | 5055 void set libraryElement(LibraryElementImpl libraryElement2) { |
| 5107 this._libraryElement = libraryElement2; | 5056 this._libraryElement = libraryElement2; |
| 5108 if (_inheritanceManager != null) { | 5057 if (_inheritanceManager != null) { |
| 5109 _inheritanceManager.libraryElement = libraryElement2; | 5058 _inheritanceManager.libraryElement = libraryElement2; |
| 5110 } | 5059 } |
| 5111 } | 5060 } |
| 5112 String toString() => _librarySource.shortName; | 5061 String toString() => librarySource.shortName; |
| 5113 } | 5062 } |
| 5114 /** | 5063 /** |
| 5115 * Instances of the class `LibraryElementBuilder` build an element model for a s
ingle library. | 5064 * Instances of the class `LibraryElementBuilder` build an element model for a s
ingle library. |
| 5116 * | 5065 * |
| 5117 * @coverage dart.engine.resolver | 5066 * @coverage dart.engine.resolver |
| 5118 */ | 5067 */ |
| 5119 class LibraryElementBuilder { | 5068 class LibraryElementBuilder { |
| 5120 | 5069 |
| 5121 /** | 5070 /** |
| 5122 * The analysis context in which the element model will be built. | 5071 * The analysis context in which the element model will be built. |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5303 * Instances of the class `LibraryResolver` are used to resolve one or more mutu
ally dependent | 5252 * Instances of the class `LibraryResolver` are used to resolve one or more mutu
ally dependent |
| 5304 * libraries within a single context. | 5253 * libraries within a single context. |
| 5305 * | 5254 * |
| 5306 * @coverage dart.engine.resolver | 5255 * @coverage dart.engine.resolver |
| 5307 */ | 5256 */ |
| 5308 class LibraryResolver { | 5257 class LibraryResolver { |
| 5309 | 5258 |
| 5310 /** | 5259 /** |
| 5311 * The analysis context in which the libraries are being analyzed. | 5260 * The analysis context in which the libraries are being analyzed. |
| 5312 */ | 5261 */ |
| 5313 InternalAnalysisContext _analysisContext; | 5262 InternalAnalysisContext analysisContext; |
| 5314 | 5263 |
| 5315 /** | 5264 /** |
| 5316 * A flag indicating whether analysis is to generate hint results (e.g. type i
nference based | 5265 * A flag indicating whether analysis is to generate hint results (e.g. type i
nference based |
| 5317 * information and pub best practices). | 5266 * information and pub best practices). |
| 5318 */ | 5267 */ |
| 5319 bool _enableHints = false; | 5268 bool _enableHints = false; |
| 5320 | 5269 |
| 5321 /** | 5270 /** |
| 5322 * The listener to which analysis errors will be reported, this error listener
is either | 5271 * The listener to which analysis errors will be reported, this error listener
is either |
| 5323 * references [recordingErrorListener], or it unions the passed | 5272 * references [recordingErrorListener], or it unions the passed |
| 5324 * [AnalysisErrorListener] with the [recordingErrorListener]. | 5273 * [AnalysisErrorListener] with the [recordingErrorListener]. |
| 5325 */ | 5274 */ |
| 5326 RecordingErrorListener _errorListener; | 5275 RecordingErrorListener errorListener; |
| 5327 | 5276 |
| 5328 /** | 5277 /** |
| 5329 * A source object representing the core library (dart:core). | 5278 * A source object representing the core library (dart:core). |
| 5330 */ | 5279 */ |
| 5331 Source _coreLibrarySource; | 5280 Source _coreLibrarySource; |
| 5332 | 5281 |
| 5333 /** | 5282 /** |
| 5334 * The object representing the core library. | 5283 * The object representing the core library. |
| 5335 */ | 5284 */ |
| 5336 Library _coreLibrary; | 5285 Library _coreLibrary; |
| 5337 | 5286 |
| 5338 /** | 5287 /** |
| 5339 * The object used to access the types from the core library. | 5288 * The object used to access the types from the core library. |
| 5340 */ | 5289 */ |
| 5341 TypeProvider _typeProvider; | 5290 TypeProvider _typeProvider; |
| 5342 | 5291 |
| 5343 /** | 5292 /** |
| 5344 * A table mapping library sources to the information being maintained for tho
se libraries. | 5293 * A table mapping library sources to the information being maintained for tho
se libraries. |
| 5345 */ | 5294 */ |
| 5346 Map<Source, Library> _libraryMap = new Map<Source, Library>(); | 5295 Map<Source, Library> _libraryMap = new Map<Source, Library>(); |
| 5347 | 5296 |
| 5348 /** | 5297 /** |
| 5349 * A collection containing the libraries that are being resolved together. | 5298 * A collection containing the libraries that are being resolved together. |
| 5350 */ | 5299 */ |
| 5351 Set<Library> _librariesInCycles; | 5300 Set<Library> resolvedLibraries; |
| 5352 | 5301 |
| 5353 /** | 5302 /** |
| 5354 * Initialize a newly created library resolver to resolve libraries within the
given context. | 5303 * Initialize a newly created library resolver to resolve libraries within the
given context. |
| 5355 * | 5304 * |
| 5356 * @param analysisContext the analysis context in which the library is being a
nalyzed | 5305 * @param analysisContext the analysis context in which the library is being a
nalyzed |
| 5357 */ | 5306 */ |
| 5358 LibraryResolver(InternalAnalysisContext analysisContext) { | 5307 LibraryResolver(InternalAnalysisContext analysisContext) { |
| 5359 this._analysisContext = analysisContext; | 5308 this.analysisContext = analysisContext; |
| 5360 this._errorListener = new RecordingErrorListener(); | 5309 this.errorListener = new RecordingErrorListener(); |
| 5361 _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE)
; | 5310 _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE)
; |
| 5362 _enableHints = analysisContext.analysisOptions.hint; | 5311 _enableHints = analysisContext.analysisOptions.hint; |
| 5363 } | 5312 } |
| 5364 | 5313 |
| 5365 /** | 5314 /** |
| 5366 * Return the analysis context in which the libraries are being analyzed. | |
| 5367 * | |
| 5368 * @return the analysis context in which the libraries are being analyzed | |
| 5369 */ | |
| 5370 InternalAnalysisContext get analysisContext => _analysisContext; | |
| 5371 | |
| 5372 /** | |
| 5373 * Return the listener to which analysis errors will be reported. | |
| 5374 * | |
| 5375 * @return the listener to which analysis errors will be reported | |
| 5376 */ | |
| 5377 RecordingErrorListener get errorListener => _errorListener; | |
| 5378 | |
| 5379 /** | |
| 5380 * Return an array containing information about all of the libraries that were
resolved. | |
| 5381 * | |
| 5382 * @return an array containing the libraries that were resolved | |
| 5383 */ | |
| 5384 Set<Library> get resolvedLibraries => _librariesInCycles; | |
| 5385 | |
| 5386 /** | |
| 5387 * Resolve the library specified by the given source in the given context. The
library is assumed | 5315 * Resolve the library specified by the given source in the given context. The
library is assumed |
| 5388 * to be embedded in the given source. | 5316 * to be embedded in the given source. |
| 5389 * | 5317 * |
| 5390 * @param librarySource the source specifying the defining compilation unit of
the library to be | 5318 * @param librarySource the source specifying the defining compilation unit of
the library to be |
| 5391 * resolved | 5319 * resolved |
| 5392 * @param modificationStamp the time stamp of the source from which the compil
ation unit was | 5320 * @param modificationStamp the time stamp of the source from which the compil
ation unit was |
| 5393 * created | 5321 * created |
| 5394 * @param unit the compilation unit representing the embedded library | 5322 * @param unit the compilation unit representing the embedded library |
| 5395 * @param fullAnalysis `true` if a full analysis should be performed | 5323 * @param fullAnalysis `true` if a full analysis should be performed |
| 5396 * @return the element representing the resolved library | 5324 * @return the element representing the resolved library |
| 5397 * @throws AnalysisException if the library could not be resolved for some rea
son | 5325 * @throws AnalysisException if the library could not be resolved for some rea
son |
| 5398 */ | 5326 */ |
| 5399 LibraryElement resolveEmbeddedLibrary(Source librarySource, int modificationSt
amp, CompilationUnit unit, bool fullAnalysis) { | 5327 LibraryElement resolveEmbeddedLibrary(Source librarySource, int modificationSt
amp, CompilationUnit unit, bool fullAnalysis) { |
| 5400 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi
ne.LibraryResolver.resolveEmbeddedLibrary"); | 5328 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi
ne.LibraryResolver.resolveEmbeddedLibrary"); |
| 5401 try { | 5329 try { |
| 5402 instrumentation.metric("fullAnalysis", fullAnalysis); | 5330 instrumentation.metric("fullAnalysis", fullAnalysis); |
| 5403 instrumentation.data3("fullName", librarySource.fullName); | 5331 instrumentation.data3("fullName", librarySource.fullName); |
| 5404 Library targetLibrary = createLibrary2(librarySource, modificationStamp, u
nit); | 5332 Library targetLibrary = createLibrary2(librarySource, modificationStamp, u
nit); |
| 5405 _coreLibrary = _libraryMap[_coreLibrarySource]; | 5333 _coreLibrary = _libraryMap[_coreLibrarySource]; |
| 5406 if (_coreLibrary == null) { | 5334 if (_coreLibrary == null) { |
| 5407 _coreLibrary = createLibrary(_coreLibrarySource); | 5335 _coreLibrary = createLibrary(_coreLibrarySource); |
| 5408 } | 5336 } |
| 5409 instrumentation.metric3("createLibrary", "complete"); | 5337 instrumentation.metric3("createLibrary", "complete"); |
| 5410 computeLibraryDependencies2(targetLibrary, unit); | 5338 computeLibraryDependencies2(targetLibrary, unit); |
| 5411 _librariesInCycles = computeLibrariesInCycles(targetLibrary); | 5339 resolvedLibraries = computeLibrariesInCycles(targetLibrary); |
| 5412 buildElementModels(); | 5340 buildElementModels(); |
| 5413 instrumentation.metric3("buildElementModels", "complete"); | 5341 instrumentation.metric3("buildElementModels", "complete"); |
| 5414 LibraryElement coreElement = _coreLibrary.libraryElement; | 5342 LibraryElement coreElement = _coreLibrary.libraryElement; |
| 5415 if (coreElement == null) { | 5343 if (coreElement == null) { |
| 5416 throw new AnalysisException.con1("Could not resolve dart:core"); | 5344 throw new AnalysisException.con1("Could not resolve dart:core"); |
| 5417 } | 5345 } |
| 5418 buildDirectiveModels(); | 5346 buildDirectiveModels(); |
| 5419 instrumentation.metric3("buildDirectiveModels", "complete"); | 5347 instrumentation.metric3("buildDirectiveModels", "complete"); |
| 5420 _typeProvider = new TypeProviderImpl(coreElement); | 5348 _typeProvider = new TypeProviderImpl(coreElement); |
| 5421 buildTypeHierarchies(); | 5349 buildTypeHierarchies(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 5452 try { | 5380 try { |
| 5453 instrumentation.metric("fullAnalysis", fullAnalysis); | 5381 instrumentation.metric("fullAnalysis", fullAnalysis); |
| 5454 instrumentation.data3("fullName", librarySource.fullName); | 5382 instrumentation.data3("fullName", librarySource.fullName); |
| 5455 Library targetLibrary = createLibrary(librarySource); | 5383 Library targetLibrary = createLibrary(librarySource); |
| 5456 _coreLibrary = _libraryMap[_coreLibrarySource]; | 5384 _coreLibrary = _libraryMap[_coreLibrarySource]; |
| 5457 if (_coreLibrary == null) { | 5385 if (_coreLibrary == null) { |
| 5458 _coreLibrary = createLibrary(_coreLibrarySource); | 5386 _coreLibrary = createLibrary(_coreLibrarySource); |
| 5459 } | 5387 } |
| 5460 instrumentation.metric3("createLibrary", "complete"); | 5388 instrumentation.metric3("createLibrary", "complete"); |
| 5461 computeLibraryDependencies(targetLibrary); | 5389 computeLibraryDependencies(targetLibrary); |
| 5462 _librariesInCycles = computeLibrariesInCycles(targetLibrary); | 5390 resolvedLibraries = computeLibrariesInCycles(targetLibrary); |
| 5463 buildElementModels(); | 5391 buildElementModels(); |
| 5464 instrumentation.metric3("buildElementModels", "complete"); | 5392 instrumentation.metric3("buildElementModels", "complete"); |
| 5465 LibraryElement coreElement = _coreLibrary.libraryElement; | 5393 LibraryElement coreElement = _coreLibrary.libraryElement; |
| 5466 if (coreElement == null) { | 5394 if (coreElement == null) { |
| 5467 throw new AnalysisException.con1("Could not resolve dart:core"); | 5395 throw new AnalysisException.con1("Could not resolve dart:core"); |
| 5468 } | 5396 } |
| 5469 buildDirectiveModels(); | 5397 buildDirectiveModels(); |
| 5470 instrumentation.metric3("buildDirectiveModels", "complete"); | 5398 instrumentation.metric3("buildDirectiveModels", "complete"); |
| 5471 _typeProvider = new TypeProviderImpl(coreElement); | 5399 _typeProvider = new TypeProviderImpl(coreElement); |
| 5472 buildTypeHierarchies(); | 5400 buildTypeHierarchies(); |
| 5473 instrumentation.metric3("buildTypeHierarchies", "complete"); | 5401 instrumentation.metric3("buildTypeHierarchies", "complete"); |
| 5474 resolveReferencesAndTypes(); | 5402 resolveReferencesAndTypes(); |
| 5475 instrumentation.metric3("resolveReferencesAndTypes", "complete"); | 5403 instrumentation.metric3("resolveReferencesAndTypes", "complete"); |
| 5476 performConstantEvaluation(); | 5404 performConstantEvaluation(); |
| 5477 instrumentation.metric3("performConstantEvaluation", "complete"); | 5405 instrumentation.metric3("performConstantEvaluation", "complete"); |
| 5478 if (fullAnalysis) { | 5406 if (fullAnalysis) { |
| 5479 runAdditionalAnalyses(); | 5407 runAdditionalAnalyses(); |
| 5480 instrumentation.metric3("runAdditionalAnalyses", "complete"); | 5408 instrumentation.metric3("runAdditionalAnalyses", "complete"); |
| 5481 } | 5409 } |
| 5482 instrumentation.metric2("librariesInCycles", _librariesInCycles.length); | 5410 instrumentation.metric2("librariesInCycles", resolvedLibraries.length); |
| 5483 for (Library lib in _librariesInCycles) { | 5411 for (Library lib in resolvedLibraries) { |
| 5484 instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size",
lib.compilationUnitSources.length); | 5412 instrumentation.metric2("librariesInCycles-CompilationUnitSources-Size",
lib.compilationUnitSources.length); |
| 5485 } | 5413 } |
| 5486 return targetLibrary.libraryElement; | 5414 return targetLibrary.libraryElement; |
| 5487 } finally { | 5415 } finally { |
| 5488 instrumentation.log(); | 5416 instrumentation.log(); |
| 5489 } | 5417 } |
| 5490 } | 5418 } |
| 5491 | 5419 |
| 5492 /** | 5420 /** |
| 5493 * Add a dependency to the given map from the referencing library to the refer
enced library. | 5421 * Add a dependency to the given map from the referencing library to the refer
enced library. |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5570 } | 5498 } |
| 5571 | 5499 |
| 5572 /** | 5500 /** |
| 5573 * Every library now has a corresponding [LibraryElement], so it is now possib
le to resolve | 5501 * Every library now has a corresponding [LibraryElement], so it is now possib
le to resolve |
| 5574 * the import and export directives. | 5502 * the import and export directives. |
| 5575 * | 5503 * |
| 5576 * @throws AnalysisException if the defining compilation unit for any of the l
ibraries could not | 5504 * @throws AnalysisException if the defining compilation unit for any of the l
ibraries could not |
| 5577 * be accessed | 5505 * be accessed |
| 5578 */ | 5506 */ |
| 5579 void buildDirectiveModels() { | 5507 void buildDirectiveModels() { |
| 5580 for (Library library in _librariesInCycles) { | 5508 for (Library library in resolvedLibraries) { |
| 5581 Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixEle
mentImpl>(); | 5509 Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixEle
mentImpl>(); |
| 5582 List<ImportElement> imports = new List<ImportElement>(); | 5510 List<ImportElement> imports = new List<ImportElement>(); |
| 5583 List<ExportElement> exports = new List<ExportElement>(); | 5511 List<ExportElement> exports = new List<ExportElement>(); |
| 5584 for (Directive directive in library.definingCompilationUnit.directives) { | 5512 for (Directive directive in library.definingCompilationUnit.directives) { |
| 5585 if (directive is ImportDirective) { | 5513 if (directive is ImportDirective) { |
| 5586 ImportDirective importDirective = directive as ImportDirective; | 5514 ImportDirective importDirective = directive as ImportDirective; |
| 5587 Source importedSource = library.getSource(importDirective); | 5515 Source importedSource = library.getSource(importDirective); |
| 5588 if (importedSource != null) { | 5516 if (importedSource != null) { |
| 5589 Library importedLibrary = _libraryMap[importedSource]; | 5517 Library importedLibrary = _libraryMap[importedSource]; |
| 5590 if (importedLibrary != null) { | 5518 if (importedLibrary != null) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5603 prefix = new PrefixElementImpl(prefixNode); | 5531 prefix = new PrefixElementImpl(prefixNode); |
| 5604 nameToPrefixMap[prefixName] = prefix; | 5532 nameToPrefixMap[prefixName] = prefix; |
| 5605 } | 5533 } |
| 5606 importElement.prefix = prefix; | 5534 importElement.prefix = prefix; |
| 5607 prefixNode.staticElement = prefix; | 5535 prefixNode.staticElement = prefix; |
| 5608 } | 5536 } |
| 5609 directive.element = importElement; | 5537 directive.element = importElement; |
| 5610 imports.add(importElement); | 5538 imports.add(importElement); |
| 5611 if (doesCompilationUnitHavePartOfDirective(importedLibrary.getAST(
importedSource))) { | 5539 if (doesCompilationUnitHavePartOfDirective(importedLibrary.getAST(
importedSource))) { |
| 5612 StringLiteral uriLiteral = importDirective.uri; | 5540 StringLiteral uriLiteral = importDirective.uri; |
| 5613 _errorListener.onError(new AnalysisError.con2(library.librarySou
rce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LI
BRARY, [uriLiteral.toSource()])); | 5541 errorListener.onError(new AnalysisError.con2(library.librarySour
ce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LIB
RARY, [uriLiteral.toSource()])); |
| 5614 } | 5542 } |
| 5615 } | 5543 } |
| 5616 } | 5544 } |
| 5617 } else if (directive is ExportDirective) { | 5545 } else if (directive is ExportDirective) { |
| 5618 ExportDirective exportDirective = directive as ExportDirective; | 5546 ExportDirective exportDirective = directive as ExportDirective; |
| 5619 Source exportedSource = library.getSource(exportDirective); | 5547 Source exportedSource = library.getSource(exportDirective); |
| 5620 if (exportedSource != null) { | 5548 if (exportedSource != null) { |
| 5621 Library exportedLibrary = _libraryMap[exportedSource]; | 5549 Library exportedLibrary = _libraryMap[exportedSource]; |
| 5622 if (exportedLibrary != null) { | 5550 if (exportedLibrary != null) { |
| 5623 ExportElementImpl exportElement = new ExportElementImpl(); | 5551 ExportElementImpl exportElement = new ExportElementImpl(); |
| 5624 exportElement.uri = library.getUri(exportDirective); | 5552 exportElement.uri = library.getUri(exportDirective); |
| 5625 exportElement.combinators = buildCombinators(exportDirective); | 5553 exportElement.combinators = buildCombinators(exportDirective); |
| 5626 LibraryElement exportedLibraryElement = exportedLibrary.libraryEle
ment; | 5554 LibraryElement exportedLibraryElement = exportedLibrary.libraryEle
ment; |
| 5627 if (exportedLibraryElement != null) { | 5555 if (exportedLibraryElement != null) { |
| 5628 exportElement.exportedLibrary = exportedLibraryElement; | 5556 exportElement.exportedLibrary = exportedLibraryElement; |
| 5629 } | 5557 } |
| 5630 directive.element = exportElement; | 5558 directive.element = exportElement; |
| 5631 exports.add(exportElement); | 5559 exports.add(exportElement); |
| 5632 if (doesCompilationUnitHavePartOfDirective(exportedLibrary.getAST(
exportedSource))) { | 5560 if (doesCompilationUnitHavePartOfDirective(exportedLibrary.getAST(
exportedSource))) { |
| 5633 StringLiteral uriLiteral = exportDirective.uri; | 5561 StringLiteral uriLiteral = exportDirective.uri; |
| 5634 _errorListener.onError(new AnalysisError.con2(library.librarySou
rce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LI
BRARY, [uriLiteral.toSource()])); | 5562 errorListener.onError(new AnalysisError.con2(library.librarySour
ce, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIB
RARY, [uriLiteral.toSource()])); |
| 5635 } | 5563 } |
| 5636 } | 5564 } |
| 5637 } | 5565 } |
| 5638 } | 5566 } |
| 5639 } | 5567 } |
| 5640 Source librarySource = library.librarySource; | 5568 Source librarySource = library.librarySource; |
| 5641 if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource)
{ | 5569 if (!library.explicitlyImportsCore && _coreLibrarySource != librarySource)
{ |
| 5642 ImportElementImpl importElement = new ImportElementImpl(); | 5570 ImportElementImpl importElement = new ImportElementImpl(); |
| 5643 importElement.importedLibrary = _coreLibrary.libraryElement; | 5571 importElement.importedLibrary = _coreLibrary.libraryElement; |
| 5644 importElement.synthetic = true; | 5572 importElement.synthetic = true; |
| 5645 imports.add(importElement); | 5573 imports.add(importElement); |
| 5646 } | 5574 } |
| 5647 LibraryElementImpl libraryElement = library.libraryElement; | 5575 LibraryElementImpl libraryElement = library.libraryElement; |
| 5648 libraryElement.imports = new List.from(imports); | 5576 libraryElement.imports = new List.from(imports); |
| 5649 libraryElement.exports = new List.from(exports); | 5577 libraryElement.exports = new List.from(exports); |
| 5650 } | 5578 } |
| 5651 } | 5579 } |
| 5652 | 5580 |
| 5653 /** | 5581 /** |
| 5654 * Build element models for all of the libraries in the current cycle. | 5582 * Build element models for all of the libraries in the current cycle. |
| 5655 * | 5583 * |
| 5656 * @throws AnalysisException if any of the element models cannot be built | 5584 * @throws AnalysisException if any of the element models cannot be built |
| 5657 */ | 5585 */ |
| 5658 void buildElementModels() { | 5586 void buildElementModels() { |
| 5659 for (Library library in _librariesInCycles) { | 5587 for (Library library in resolvedLibraries) { |
| 5660 LibraryElementBuilder builder = new LibraryElementBuilder(this); | 5588 LibraryElementBuilder builder = new LibraryElementBuilder(this); |
| 5661 LibraryElementImpl libraryElement = builder.buildLibrary(library); | 5589 LibraryElementImpl libraryElement = builder.buildLibrary(library); |
| 5662 library.libraryElement = libraryElement; | 5590 library.libraryElement = libraryElement; |
| 5663 } | 5591 } |
| 5664 } | 5592 } |
| 5665 | 5593 |
| 5666 /** | 5594 /** |
| 5667 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current | 5595 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current |
| 5668 * cycle. | 5596 * cycle. |
| 5669 * | 5597 * |
| 5670 * @throws AnalysisException if any of the type hierarchies could not be resol
ved | 5598 * @throws AnalysisException if any of the type hierarchies could not be resol
ved |
| 5671 */ | 5599 */ |
| 5672 void buildTypeHierarchies() { | 5600 void buildTypeHierarchies() { |
| 5673 for (Library library in _librariesInCycles) { | 5601 for (Library library in resolvedLibraries) { |
| 5674 for (Source source in library.compilationUnitSources) { | 5602 for (Source source in library.compilationUnitSources) { |
| 5675 TypeResolverVisitor visitor = new TypeResolverVisitor.con1(library, sour
ce, _typeProvider); | 5603 TypeResolverVisitor visitor = new TypeResolverVisitor.con1(library, sour
ce, _typeProvider); |
| 5676 library.getAST(source).accept(visitor); | 5604 library.getAST(source).accept(visitor); |
| 5677 } | 5605 } |
| 5678 } | 5606 } |
| 5679 } | 5607 } |
| 5680 | 5608 |
| 5681 /** | 5609 /** |
| 5682 * Compute a dependency map of libraries reachable from the given library. A d
ependency map is a | 5610 * Compute a dependency map of libraries reachable from the given library. A d
ependency map is a |
| 5683 * table that maps individual libraries to a list of the libraries that either
import or export | 5611 * table that maps individual libraries to a list of the libraries that either
import or export |
| (...skipping 28 matching lines...) Expand all Loading... |
| 5712 | 5640 |
| 5713 /** | 5641 /** |
| 5714 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the | 5642 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the |
| 5715 * class [Library] to represent them, and record the references in the library
objects. | 5643 * class [Library] to represent them, and record the references in the library
objects. |
| 5716 * | 5644 * |
| 5717 * @param library the library to be processed to find libraries that have not
yet been traversed | 5645 * @param library the library to be processed to find libraries that have not
yet been traversed |
| 5718 * @throws AnalysisException if some portion of the library graph could not be
traversed | 5646 * @throws AnalysisException if some portion of the library graph could not be
traversed |
| 5719 */ | 5647 */ |
| 5720 void computeLibraryDependencies(Library library) { | 5648 void computeLibraryDependencies(Library library) { |
| 5721 Source librarySource = library.librarySource; | 5649 Source librarySource = library.librarySource; |
| 5722 computeLibraryDependencies3(library, _analysisContext.computeImportedLibrari
es(librarySource), _analysisContext.computeExportedLibraries(librarySource)); | 5650 computeLibraryDependencies3(library, analysisContext.computeImportedLibrarie
s(librarySource), analysisContext.computeExportedLibraries(librarySource)); |
| 5723 } | 5651 } |
| 5724 | 5652 |
| 5725 /** | 5653 /** |
| 5726 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the | 5654 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the |
| 5727 * class [Library] to represent them, and record the references in the library
objects. | 5655 * class [Library] to represent them, and record the references in the library
objects. |
| 5728 * | 5656 * |
| 5729 * @param library the library to be processed to find libraries that have not
yet been traversed | 5657 * @param library the library to be processed to find libraries that have not
yet been traversed |
| 5730 * @throws AnalysisException if some portion of the library graph could not be
traversed | 5658 * @throws AnalysisException if some portion of the library graph could not be
traversed |
| 5731 */ | 5659 */ |
| 5732 void computeLibraryDependencies2(Library library, CompilationUnit unit) { | 5660 void computeLibraryDependencies2(Library library, CompilationUnit unit) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5805 | 5733 |
| 5806 /** | 5734 /** |
| 5807 * Create an object to represent the information about the library defined by
the compilation unit | 5735 * Create an object to represent the information about the library defined by
the compilation unit |
| 5808 * with the given source. | 5736 * with the given source. |
| 5809 * | 5737 * |
| 5810 * @param librarySource the source of the library's defining compilation unit | 5738 * @param librarySource the source of the library's defining compilation unit |
| 5811 * @return the library object that was created | 5739 * @return the library object that was created |
| 5812 * @throws AnalysisException if the library source is not valid | 5740 * @throws AnalysisException if the library source is not valid |
| 5813 */ | 5741 */ |
| 5814 Library createLibrary(Source librarySource) { | 5742 Library createLibrary(Source librarySource) { |
| 5815 Library library = new Library(_analysisContext, _errorListener, librarySourc
e); | 5743 Library library = new Library(analysisContext, errorListener, librarySource)
; |
| 5816 library.definingCompilationUnit; | 5744 library.definingCompilationUnit; |
| 5817 _libraryMap[librarySource] = library; | 5745 _libraryMap[librarySource] = library; |
| 5818 return library; | 5746 return library; |
| 5819 } | 5747 } |
| 5820 | 5748 |
| 5821 /** | 5749 /** |
| 5822 * Create an object to represent the information about the library defined by
the compilation unit | 5750 * Create an object to represent the information about the library defined by
the compilation unit |
| 5823 * with the given source. | 5751 * with the given source. |
| 5824 * | 5752 * |
| 5825 * @param librarySource the source of the library's defining compilation unit | 5753 * @param librarySource the source of the library's defining compilation unit |
| 5826 * @param modificationStamp the modification time of the source from which the
compilation unit | 5754 * @param modificationStamp the modification time of the source from which the
compilation unit |
| 5827 * was created | 5755 * was created |
| 5828 * @param unit the compilation unit that defines the library | 5756 * @param unit the compilation unit that defines the library |
| 5829 * @return the library object that was created | 5757 * @return the library object that was created |
| 5830 * @throws AnalysisException if the library source is not valid | 5758 * @throws AnalysisException if the library source is not valid |
| 5831 */ | 5759 */ |
| 5832 Library createLibrary2(Source librarySource, int modificationStamp, Compilatio
nUnit unit) { | 5760 Library createLibrary2(Source librarySource, int modificationStamp, Compilatio
nUnit unit) { |
| 5833 Library library = new Library(_analysisContext, _errorListener, librarySourc
e); | 5761 Library library = new Library(analysisContext, errorListener, librarySource)
; |
| 5834 library.setDefiningCompilationUnit(modificationStamp, unit); | 5762 library.setDefiningCompilationUnit(modificationStamp, unit); |
| 5835 _libraryMap[librarySource] = library; | 5763 _libraryMap[librarySource] = library; |
| 5836 return library; | 5764 return library; |
| 5837 } | 5765 } |
| 5838 | 5766 |
| 5839 /** | 5767 /** |
| 5840 * Create an object to represent the information about the library defined by
the compilation unit | 5768 * Create an object to represent the information about the library defined by
the compilation unit |
| 5841 * with the given source. Return the library object that was created, or `null
` if the | 5769 * with the given source. Return the library object that was created, or `null
` if the |
| 5842 * source is not valid. | 5770 * source is not valid. |
| 5843 * | 5771 * |
| 5844 * @param librarySource the source of the library's defining compilation unit | 5772 * @param librarySource the source of the library's defining compilation unit |
| 5845 * @return the library object that was created | 5773 * @return the library object that was created |
| 5846 */ | 5774 */ |
| 5847 Library createLibraryOrNull(Source librarySource) { | 5775 Library createLibraryOrNull(Source librarySource) { |
| 5848 if (!librarySource.exists()) { | 5776 if (!librarySource.exists()) { |
| 5849 return null; | 5777 return null; |
| 5850 } | 5778 } |
| 5851 Library library = new Library(_analysisContext, _errorListener, librarySourc
e); | 5779 Library library = new Library(analysisContext, errorListener, librarySource)
; |
| 5852 _libraryMap[librarySource] = library; | 5780 _libraryMap[librarySource] = library; |
| 5853 return library; | 5781 return library; |
| 5854 } | 5782 } |
| 5855 | 5783 |
| 5856 /** | 5784 /** |
| 5857 * Return `true` if and only if the passed [CompilationUnit] has a part-of dir
ective. | 5785 * Return `true` if and only if the passed [CompilationUnit] has a part-of dir
ective. |
| 5858 * | 5786 * |
| 5859 * @param node the [CompilationUnit] to test | 5787 * @param node the [CompilationUnit] to test |
| 5860 * @return `true` if and only if the passed [CompilationUnit] has a part-of di
rective | 5788 * @return `true` if and only if the passed [CompilationUnit] has a part-of di
rective |
| 5861 */ | 5789 */ |
| (...skipping 20 matching lines...) Expand all Loading... |
| 5882 identifiers[i] = names[i].name; | 5810 identifiers[i] = names[i].name; |
| 5883 } | 5811 } |
| 5884 return identifiers; | 5812 return identifiers; |
| 5885 } | 5813 } |
| 5886 | 5814 |
| 5887 /** | 5815 /** |
| 5888 * Compute a value for all of the constants in the libraries being analyzed. | 5816 * Compute a value for all of the constants in the libraries being analyzed. |
| 5889 */ | 5817 */ |
| 5890 void performConstantEvaluation() { | 5818 void performConstantEvaluation() { |
| 5891 ConstantValueComputer computer = new ConstantValueComputer(); | 5819 ConstantValueComputer computer = new ConstantValueComputer(); |
| 5892 for (Library library in _librariesInCycles) { | 5820 for (Library library in resolvedLibraries) { |
| 5893 for (Source source in library.compilationUnitSources) { | 5821 for (Source source in library.compilationUnitSources) { |
| 5894 try { | 5822 try { |
| 5895 CompilationUnit unit = library.getAST(source); | 5823 CompilationUnit unit = library.getAST(source); |
| 5896 if (unit != null) { | 5824 if (unit != null) { |
| 5897 computer.add(unit); | 5825 computer.add(unit); |
| 5898 } | 5826 } |
| 5899 } on AnalysisException catch (exception) { | 5827 } on AnalysisException catch (exception) { |
| 5900 AnalysisEngine.instance.logger.logError2("Internal Error: Could not ac
cess AST for ${source.fullName} during constant evaluation", exception); | 5828 AnalysisEngine.instance.logger.logError2("Internal Error: Could not ac
cess AST for ${source.fullName} during constant evaluation", exception); |
| 5901 } | 5829 } |
| 5902 } | 5830 } |
| 5903 } | 5831 } |
| 5904 computer.computeValues(); | 5832 computer.computeValues(); |
| 5905 } | 5833 } |
| 5906 | 5834 |
| 5907 /** | 5835 /** |
| 5908 * Resolve the identifiers and perform type analysis in the libraries in the c
urrent cycle. | 5836 * Resolve the identifiers and perform type analysis in the libraries in the c
urrent cycle. |
| 5909 * | 5837 * |
| 5910 * @throws AnalysisException if any of the identifiers could not be resolved o
r if any of the | 5838 * @throws AnalysisException if any of the identifiers could not be resolved o
r if any of the |
| 5911 * libraries could not have their types analyzed | 5839 * libraries could not have their types analyzed |
| 5912 */ | 5840 */ |
| 5913 void resolveReferencesAndTypes() { | 5841 void resolveReferencesAndTypes() { |
| 5914 for (Library library in _librariesInCycles) { | 5842 for (Library library in resolvedLibraries) { |
| 5915 resolveReferencesAndTypes2(library); | 5843 resolveReferencesAndTypes2(library); |
| 5916 } | 5844 } |
| 5917 } | 5845 } |
| 5918 | 5846 |
| 5919 /** | 5847 /** |
| 5920 * Resolve the identifiers and perform type analysis in the given library. | 5848 * Resolve the identifiers and perform type analysis in the given library. |
| 5921 * | 5849 * |
| 5922 * @param library the library to be resolved | 5850 * @param library the library to be resolved |
| 5923 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in | 5851 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in |
| 5924 * the library cannot be analyzed | 5852 * the library cannot be analyzed |
| (...skipping 21 matching lines...) Expand all Loading... |
| 5946 Source resolveSource(Source librarySource, UriBasedDirective directive) { | 5874 Source resolveSource(Source librarySource, UriBasedDirective directive) { |
| 5947 StringLiteral uriLiteral = directive.uri; | 5875 StringLiteral uriLiteral = directive.uri; |
| 5948 if (uriLiteral is StringInterpolation) { | 5876 if (uriLiteral is StringInterpolation) { |
| 5949 return null; | 5877 return null; |
| 5950 } | 5878 } |
| 5951 String uriContent = uriLiteral.stringValue.trim(); | 5879 String uriContent = uriLiteral.stringValue.trim(); |
| 5952 if (uriContent == null || uriContent.isEmpty) { | 5880 if (uriContent == null || uriContent.isEmpty) { |
| 5953 return null; | 5881 return null; |
| 5954 } | 5882 } |
| 5955 uriContent = Uri.encodeFull(uriContent); | 5883 uriContent = Uri.encodeFull(uriContent); |
| 5956 return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent); | 5884 return analysisContext.sourceFactory.resolveUri(librarySource, uriContent); |
| 5957 } | 5885 } |
| 5958 | 5886 |
| 5959 /** | 5887 /** |
| 5960 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] | 5888 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] |
| 5961 * analysis in the current cycle. | 5889 * analysis in the current cycle. |
| 5962 * | 5890 * |
| 5963 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in | 5891 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in |
| 5964 * the library cannot be analyzed | 5892 * the library cannot be analyzed |
| 5965 */ | 5893 */ |
| 5966 void runAdditionalAnalyses() { | 5894 void runAdditionalAnalyses() { |
| 5967 for (Library library in _librariesInCycles) { | 5895 for (Library library in resolvedLibraries) { |
| 5968 runAdditionalAnalyses2(library); | 5896 runAdditionalAnalyses2(library); |
| 5969 } | 5897 } |
| 5970 } | 5898 } |
| 5971 | 5899 |
| 5972 /** | 5900 /** |
| 5973 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] | 5901 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] |
| 5974 * analysis in the given library. | 5902 * analysis in the given library. |
| 5975 * | 5903 * |
| 5976 * @param library the library to have the extra analyses processes run | 5904 * @param library the library to have the extra analyses processes run |
| 5977 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in | 5905 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in |
| 5978 * the library cannot be analyzed | 5906 * the library cannot be analyzed |
| 5979 */ | 5907 */ |
| 5980 void runAdditionalAnalyses2(Library library) { | 5908 void runAdditionalAnalyses2(Library library) { |
| 5981 for (Source source in library.compilationUnitSources) { | 5909 for (Source source in library.compilationUnitSources) { |
| 5982 ErrorReporter errorReporter = new ErrorReporter(_errorListener, source); | 5910 ErrorReporter errorReporter = new ErrorReporter(errorListener, source); |
| 5983 CompilationUnit unit = library.getAST(source); | 5911 CompilationUnit unit = library.getAST(source); |
| 5984 ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _t
ypeProvider); | 5912 ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _t
ypeProvider); |
| 5985 unit.accept(constantVerifier); | 5913 unit.accept(constantVerifier); |
| 5986 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.lib
raryElement, _typeProvider, library.inheritanceManager); | 5914 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.lib
raryElement, _typeProvider, library.inheritanceManager); |
| 5987 unit.accept(errorVerifier); | 5915 unit.accept(errorVerifier); |
| 5988 } | 5916 } |
| 5989 if (_enableHints) { | 5917 if (_enableHints) { |
| 5990 HintGenerator hintGenerator = new HintGenerator(library.compilationUnits,
_analysisContext, _errorListener); | 5918 HintGenerator hintGenerator = new HintGenerator(library.compilationUnits,
analysisContext, errorListener); |
| 5991 hintGenerator.generateForLibrary(); | 5919 hintGenerator.generateForLibrary(); |
| 5992 } | 5920 } |
| 5993 } | 5921 } |
| 5994 } | 5922 } |
| 5995 /** | 5923 /** |
| 5996 * This class is a wrapper for an [AnalysisError] which can also be queried afte
r resolution | 5924 * This class is a wrapper for an [AnalysisError] which can also be queried afte
r resolution |
| 5997 * to find out if the error should actually be reported. In this case, these err
ors are conditional | 5925 * to find out if the error should actually be reported. In this case, these err
ors are conditional |
| 5998 * on the non-existence of an `@proxy` annotation. | 5926 * on the non-existence of an `@proxy` annotation. |
| 5999 * | 5927 * |
| 6000 * If we have other conditional error codes in the future, we should have this c
lass implement some | 5928 * If we have other conditional error codes in the future, we should have this c
lass implement some |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6038 | 5966 |
| 6039 /** | 5967 /** |
| 6040 * The enclosing [ClassElement], this is what will determine if the error code
should, or | 5968 * The enclosing [ClassElement], this is what will determine if the error code
should, or |
| 6041 * should not, be generated on the source. | 5969 * should not, be generated on the source. |
| 6042 */ | 5970 */ |
| 6043 Element _enclosingElement; | 5971 Element _enclosingElement; |
| 6044 | 5972 |
| 6045 /** | 5973 /** |
| 6046 * The conditional analysis error. | 5974 * The conditional analysis error. |
| 6047 */ | 5975 */ |
| 6048 AnalysisError _analysisError; | 5976 AnalysisError analysisError; |
| 6049 | 5977 |
| 6050 /** | 5978 /** |
| 6051 * Instantiate a new ProxyConditionalErrorCode with some enclosing element and
the conditional | 5979 * Instantiate a new ProxyConditionalErrorCode with some enclosing element and
the conditional |
| 6052 * analysis error. | 5980 * analysis error. |
| 6053 * | 5981 * |
| 6054 * @param enclosingElement the enclosing element | 5982 * @param enclosingElement the enclosing element |
| 6055 * @param analysisError the conditional analysis error | 5983 * @param analysisError the conditional analysis error |
| 6056 */ | 5984 */ |
| 6057 ProxyConditionalAnalysisError(Element enclosingElement, AnalysisError analysis
Error) { | 5985 ProxyConditionalAnalysisError(Element enclosingElement, AnalysisError analysis
Error) { |
| 6058 this._enclosingElement = enclosingElement; | 5986 this._enclosingElement = enclosingElement; |
| 6059 this._analysisError = analysisError; | 5987 this.analysisError = analysisError; |
| 6060 } | 5988 } |
| 6061 | 5989 |
| 6062 /** | 5990 /** |
| 6063 * Return the analysis error. | |
| 6064 * | |
| 6065 * @return the analysis error | |
| 6066 */ | |
| 6067 AnalysisError get analysisError => _analysisError; | |
| 6068 | |
| 6069 /** | |
| 6070 * Return `true` iff the enclosing class has the proxy annotation. | 5991 * Return `true` iff the enclosing class has the proxy annotation. |
| 6071 * | 5992 * |
| 6072 * @return `true` iff the enclosing class has the proxy annotation | 5993 * @return `true` iff the enclosing class has the proxy annotation |
| 6073 */ | 5994 */ |
| 6074 bool shouldIncludeErrorCode() => !classHasProxyAnnotation(_enclosingElement); | 5995 bool shouldIncludeErrorCode() => !classHasProxyAnnotation(_enclosingElement); |
| 6075 } | 5996 } |
| 6076 /** | 5997 /** |
| 6077 * Instances of the class `ResolverVisitor` are used to resolve the nodes within
a single | 5998 * Instances of the class `ResolverVisitor` are used to resolve the nodes within
a single |
| 6078 * compilation unit. | 5999 * compilation unit. |
| 6079 * | 6000 * |
| (...skipping 13 matching lines...) Expand all Loading... |
| 6093 | 6014 |
| 6094 /** | 6015 /** |
| 6095 * The object used to compute the type associated with the current node. | 6016 * The object used to compute the type associated with the current node. |
| 6096 */ | 6017 */ |
| 6097 StaticTypeAnalyzer _typeAnalyzer; | 6018 StaticTypeAnalyzer _typeAnalyzer; |
| 6098 | 6019 |
| 6099 /** | 6020 /** |
| 6100 * The class element representing the class containing the current node, or `n
ull` if the | 6021 * The class element representing the class containing the current node, or `n
ull` if the |
| 6101 * current node is not contained in a class. | 6022 * current node is not contained in a class. |
| 6102 */ | 6023 */ |
| 6103 ClassElement _enclosingClass = null; | 6024 ClassElement enclosingClass = null; |
| 6104 | 6025 |
| 6105 /** | 6026 /** |
| 6106 * The element representing the function containing the current node, or `null
` if the | 6027 * The element representing the function containing the current node, or `null
` if the |
| 6107 * current node is not contained in a function. | 6028 * current node is not contained in a function. |
| 6108 */ | 6029 */ |
| 6109 ExecutableElement _enclosingFunction = null; | 6030 ExecutableElement enclosingFunction = null; |
| 6110 | 6031 |
| 6111 /** | 6032 /** |
| 6112 * The object keeping track of which elements have had their types overridden. | 6033 * The object keeping track of which elements have had their types overridden. |
| 6113 */ | 6034 */ |
| 6114 TypeOverrideManager _overrideManager = new TypeOverrideManager(); | 6035 final TypeOverrideManager overrideManager = new TypeOverrideManager(); |
| 6115 | 6036 |
| 6116 /** | 6037 /** |
| 6117 * Proxy conditional error codes. | 6038 * Proxy conditional error codes. |
| 6118 */ | 6039 */ |
| 6119 List<ProxyConditionalAnalysisError> _proxyConditionalAnalysisErrors = new List
<ProxyConditionalAnalysisError>(); | 6040 final List<ProxyConditionalAnalysisError> proxyConditionalAnalysisErrors = new
List<ProxyConditionalAnalysisError>(); |
| 6120 | 6041 |
| 6121 /** | 6042 /** |
| 6122 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 6043 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 6123 * | 6044 * |
| 6124 * @param library the library containing the compilation unit being resolved | 6045 * @param library the library containing the compilation unit being resolved |
| 6125 * @param source the source representing the compilation unit being visited | 6046 * @param source the source representing the compilation unit being visited |
| 6126 * @param typeProvider the object used to access the types from the core libra
ry | 6047 * @param typeProvider the object used to access the types from the core libra
ry |
| 6127 */ | 6048 */ |
| 6128 ResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider
) : super.con1(library, source, typeProvider) { | 6049 ResolverVisitor.con1(Library library, Source source, TypeProvider typeProvider
) : super.con1(library, source, typeProvider) { |
| 6129 this._inheritanceManager = library.inheritanceManager; | 6050 this._inheritanceManager = library.inheritanceManager; |
| 6130 this._elementResolver = new ElementResolver(this); | 6051 this._elementResolver = new ElementResolver(this); |
| 6131 this._typeAnalyzer = new StaticTypeAnalyzer(this); | 6052 this._typeAnalyzer = new StaticTypeAnalyzer(this); |
| 6132 } | 6053 } |
| 6133 | 6054 |
| 6134 /** | 6055 /** |
| 6135 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 6056 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 6136 * | 6057 * |
| 6137 * @param definingLibrary the element for the library containing the compilati
on unit being | 6058 * @param definingLibrary the element for the library containing the compilati
on unit being |
| 6138 * visited | 6059 * visited |
| 6139 * @param source the source representing the compilation unit being visited | 6060 * @param source the source representing the compilation unit being visited |
| 6140 * @param typeProvider the object used to access the types from the core libra
ry | 6061 * @param typeProvider the object used to access the types from the core libra
ry |
| 6141 * @param errorListener the error listener that will be informed of any errors
that are found | 6062 * @param errorListener the error listener that will be informed of any errors
that are found |
| 6142 * during resolution | 6063 * during resolution |
| 6143 */ | 6064 */ |
| 6144 ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvid
er typeProvider, InheritanceManager inheritanceManager, AnalysisErrorListener er
rorListener) : super.con2(definingLibrary, source, typeProvider, errorListener)
{ | 6065 ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvid
er typeProvider, InheritanceManager inheritanceManager, AnalysisErrorListener er
rorListener) : super.con2(definingLibrary, source, typeProvider, errorListener)
{ |
| 6145 this._inheritanceManager = inheritanceManager; | 6066 this._inheritanceManager = inheritanceManager; |
| 6146 this._elementResolver = new ElementResolver(this); | 6067 this._elementResolver = new ElementResolver(this); |
| 6147 this._typeAnalyzer = new StaticTypeAnalyzer(this); | 6068 this._typeAnalyzer = new StaticTypeAnalyzer(this); |
| 6148 } | 6069 } |
| 6149 | |
| 6150 /** | |
| 6151 * Return the object keeping track of which elements have had their types over
ridden. | |
| 6152 * | |
| 6153 * @return the object keeping track of which elements have had their types ove
rridden | |
| 6154 */ | |
| 6155 TypeOverrideManager get overrideManager => _overrideManager; | |
| 6156 List<ProxyConditionalAnalysisError> get proxyConditionalAnalysisErrors => _pro
xyConditionalAnalysisErrors; | |
| 6157 Object visitAsExpression(AsExpression node) { | 6070 Object visitAsExpression(AsExpression node) { |
| 6158 super.visitAsExpression(node); | 6071 super.visitAsExpression(node); |
| 6159 override(node.expression, node.type.type); | 6072 override(node.expression, node.type.type); |
| 6160 return null; | 6073 return null; |
| 6161 } | 6074 } |
| 6162 Object visitAssertStatement(AssertStatement node) { | 6075 Object visitAssertStatement(AssertStatement node) { |
| 6163 super.visitAssertStatement(node); | 6076 super.visitAssertStatement(node); |
| 6164 propagateTrueState(node.condition); | 6077 propagateTrueState(node.condition); |
| 6165 return null; | 6078 return null; |
| 6166 } | 6079 } |
| 6167 Object visitBinaryExpression(BinaryExpression node) { | 6080 Object visitBinaryExpression(BinaryExpression node) { |
| 6168 sc.TokenType operatorType = node.operator.type; | 6081 sc.TokenType operatorType = node.operator.type; |
| 6169 Expression leftOperand = node.leftOperand; | 6082 Expression leftOperand = node.leftOperand; |
| 6170 Expression rightOperand = node.rightOperand; | 6083 Expression rightOperand = node.rightOperand; |
| 6171 if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) { | 6084 if (identical(operatorType, sc.TokenType.AMPERSAND_AMPERSAND)) { |
| 6172 safelyVisit(leftOperand); | 6085 safelyVisit(leftOperand); |
| 6173 if (rightOperand != null) { | 6086 if (rightOperand != null) { |
| 6174 try { | 6087 try { |
| 6175 _overrideManager.enterScope(); | 6088 overrideManager.enterScope(); |
| 6176 propagateTrueState(leftOperand); | 6089 propagateTrueState(leftOperand); |
| 6177 rightOperand.accept(this); | 6090 rightOperand.accept(this); |
| 6178 } finally { | 6091 } finally { |
| 6179 _overrideManager.exitScope(); | 6092 overrideManager.exitScope(); |
| 6180 } | 6093 } |
| 6181 } | 6094 } |
| 6182 } else if (identical(operatorType, sc.TokenType.BAR_BAR)) { | 6095 } else if (identical(operatorType, sc.TokenType.BAR_BAR)) { |
| 6183 safelyVisit(leftOperand); | 6096 safelyVisit(leftOperand); |
| 6184 if (rightOperand != null) { | 6097 if (rightOperand != null) { |
| 6185 try { | 6098 try { |
| 6186 _overrideManager.enterScope(); | 6099 overrideManager.enterScope(); |
| 6187 propagateFalseState(leftOperand); | 6100 propagateFalseState(leftOperand); |
| 6188 rightOperand.accept(this); | 6101 rightOperand.accept(this); |
| 6189 } finally { | 6102 } finally { |
| 6190 _overrideManager.exitScope(); | 6103 overrideManager.exitScope(); |
| 6191 } | 6104 } |
| 6192 } | 6105 } |
| 6193 } else { | 6106 } else { |
| 6194 safelyVisit(leftOperand); | 6107 safelyVisit(leftOperand); |
| 6195 safelyVisit(rightOperand); | 6108 safelyVisit(rightOperand); |
| 6196 } | 6109 } |
| 6197 node.accept(_elementResolver); | 6110 node.accept(_elementResolver); |
| 6198 node.accept(_typeAnalyzer); | 6111 node.accept(_typeAnalyzer); |
| 6199 return null; | 6112 return null; |
| 6200 } | 6113 } |
| 6201 Object visitBreakStatement(BreakStatement node) { | 6114 Object visitBreakStatement(BreakStatement node) { |
| 6202 node.accept(_elementResolver); | 6115 node.accept(_elementResolver); |
| 6203 node.accept(_typeAnalyzer); | 6116 node.accept(_typeAnalyzer); |
| 6204 return null; | 6117 return null; |
| 6205 } | 6118 } |
| 6206 Object visitClassDeclaration(ClassDeclaration node) { | 6119 Object visitClassDeclaration(ClassDeclaration node) { |
| 6207 ClassElement outerType = _enclosingClass; | 6120 ClassElement outerType = enclosingClass; |
| 6208 try { | 6121 try { |
| 6209 _enclosingClass = node.element; | 6122 enclosingClass = node.element; |
| 6210 _typeAnalyzer.thisType = _enclosingClass == null ? null : _enclosingClass.
type; | 6123 _typeAnalyzer.thisType = enclosingClass == null ? null : enclosingClass.ty
pe; |
| 6211 super.visitClassDeclaration(node); | 6124 super.visitClassDeclaration(node); |
| 6212 } finally { | 6125 } finally { |
| 6213 _typeAnalyzer.thisType = outerType == null ? null : outerType.type; | 6126 _typeAnalyzer.thisType = outerType == null ? null : outerType.type; |
| 6214 _enclosingClass = outerType; | 6127 enclosingClass = outerType; |
| 6215 } | 6128 } |
| 6216 return null; | 6129 return null; |
| 6217 } | 6130 } |
| 6218 Object visitCommentReference(CommentReference node) { | 6131 Object visitCommentReference(CommentReference node) { |
| 6219 node.accept(_elementResolver); | 6132 node.accept(_elementResolver); |
| 6220 node.accept(_typeAnalyzer); | 6133 node.accept(_typeAnalyzer); |
| 6221 return null; | 6134 return null; |
| 6222 } | 6135 } |
| 6223 Object visitCompilationUnit(CompilationUnit node) { | 6136 Object visitCompilationUnit(CompilationUnit node) { |
| 6224 try { | 6137 try { |
| 6225 _overrideManager.enterScope(); | 6138 overrideManager.enterScope(); |
| 6226 for (Directive directive in node.directives) { | 6139 for (Directive directive in node.directives) { |
| 6227 directive.accept(this); | 6140 directive.accept(this); |
| 6228 } | 6141 } |
| 6229 List<CompilationUnitMember> classes = new List<CompilationUnitMember>(); | 6142 List<CompilationUnitMember> classes = new List<CompilationUnitMember>(); |
| 6230 for (CompilationUnitMember declaration in node.declarations) { | 6143 for (CompilationUnitMember declaration in node.declarations) { |
| 6231 if (declaration is ClassDeclaration) { | 6144 if (declaration is ClassDeclaration) { |
| 6232 classes.add(declaration); | 6145 classes.add(declaration); |
| 6233 } else { | 6146 } else { |
| 6234 declaration.accept(this); | 6147 declaration.accept(this); |
| 6235 } | 6148 } |
| 6236 } | 6149 } |
| 6237 for (CompilationUnitMember declaration in classes) { | 6150 for (CompilationUnitMember declaration in classes) { |
| 6238 declaration.accept(this); | 6151 declaration.accept(this); |
| 6239 } | 6152 } |
| 6240 } finally { | 6153 } finally { |
| 6241 _overrideManager.exitScope(); | 6154 overrideManager.exitScope(); |
| 6242 } | 6155 } |
| 6243 node.accept(_elementResolver); | 6156 node.accept(_elementResolver); |
| 6244 node.accept(_typeAnalyzer); | 6157 node.accept(_typeAnalyzer); |
| 6245 return null; | 6158 return null; |
| 6246 } | 6159 } |
| 6247 Object visitConditionalExpression(ConditionalExpression node) { | 6160 Object visitConditionalExpression(ConditionalExpression node) { |
| 6248 Expression condition = node.condition; | 6161 Expression condition = node.condition; |
| 6249 safelyVisit(condition); | 6162 safelyVisit(condition); |
| 6250 Expression thenExpression = node.thenExpression; | 6163 Expression thenExpression = node.thenExpression; |
| 6251 if (thenExpression != null) { | 6164 if (thenExpression != null) { |
| 6252 try { | 6165 try { |
| 6253 _overrideManager.enterScope(); | 6166 overrideManager.enterScope(); |
| 6254 propagateTrueState(condition); | 6167 propagateTrueState(condition); |
| 6255 thenExpression.accept(this); | 6168 thenExpression.accept(this); |
| 6256 } finally { | 6169 } finally { |
| 6257 _overrideManager.exitScope(); | 6170 overrideManager.exitScope(); |
| 6258 } | 6171 } |
| 6259 } | 6172 } |
| 6260 Expression elseExpression = node.elseExpression; | 6173 Expression elseExpression = node.elseExpression; |
| 6261 if (elseExpression != null) { | 6174 if (elseExpression != null) { |
| 6262 try { | 6175 try { |
| 6263 _overrideManager.enterScope(); | 6176 overrideManager.enterScope(); |
| 6264 propagateFalseState(condition); | 6177 propagateFalseState(condition); |
| 6265 elseExpression.accept(this); | 6178 elseExpression.accept(this); |
| 6266 } finally { | 6179 } finally { |
| 6267 _overrideManager.exitScope(); | 6180 overrideManager.exitScope(); |
| 6268 } | 6181 } |
| 6269 } | 6182 } |
| 6270 node.accept(_elementResolver); | 6183 node.accept(_elementResolver); |
| 6271 node.accept(_typeAnalyzer); | 6184 node.accept(_typeAnalyzer); |
| 6272 bool thenIsAbrupt = isAbruptTermination(thenExpression); | 6185 bool thenIsAbrupt = isAbruptTermination(thenExpression); |
| 6273 bool elseIsAbrupt = isAbruptTermination(elseExpression); | 6186 bool elseIsAbrupt = isAbruptTermination(elseExpression); |
| 6274 if (elseIsAbrupt && !thenIsAbrupt) { | 6187 if (elseIsAbrupt && !thenIsAbrupt) { |
| 6275 propagateTrueState(condition); | 6188 propagateTrueState(condition); |
| 6276 propagateState(thenExpression); | 6189 propagateState(thenExpression); |
| 6277 } else if (thenIsAbrupt && !elseIsAbrupt) { | 6190 } else if (thenIsAbrupt && !elseIsAbrupt) { |
| 6278 propagateFalseState(condition); | 6191 propagateFalseState(condition); |
| 6279 propagateState(elseExpression); | 6192 propagateState(elseExpression); |
| 6280 } | 6193 } |
| 6281 return null; | 6194 return null; |
| 6282 } | 6195 } |
| 6283 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 6196 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 6284 ExecutableElement outerFunction = _enclosingFunction; | 6197 ExecutableElement outerFunction = enclosingFunction; |
| 6285 try { | 6198 try { |
| 6286 _enclosingFunction = node.element; | 6199 enclosingFunction = node.element; |
| 6287 super.visitConstructorDeclaration(node); | 6200 super.visitConstructorDeclaration(node); |
| 6288 } finally { | 6201 } finally { |
| 6289 _enclosingFunction = outerFunction; | 6202 enclosingFunction = outerFunction; |
| 6290 } | 6203 } |
| 6291 return null; | 6204 return null; |
| 6292 } | 6205 } |
| 6293 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) { | 6206 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) { |
| 6294 safelyVisit(node.expression); | 6207 safelyVisit(node.expression); |
| 6295 node.accept(_elementResolver); | 6208 node.accept(_elementResolver); |
| 6296 node.accept(_typeAnalyzer); | 6209 node.accept(_typeAnalyzer); |
| 6297 return null; | 6210 return null; |
| 6298 } | 6211 } |
| 6299 Object visitConstructorName(ConstructorName node) { | 6212 Object visitConstructorName(ConstructorName node) { |
| 6300 node.accept(_elementResolver); | 6213 node.accept(_elementResolver); |
| 6301 node.accept(_typeAnalyzer); | 6214 node.accept(_typeAnalyzer); |
| 6302 return null; | 6215 return null; |
| 6303 } | 6216 } |
| 6304 Object visitContinueStatement(ContinueStatement node) { | 6217 Object visitContinueStatement(ContinueStatement node) { |
| 6305 node.accept(_elementResolver); | 6218 node.accept(_elementResolver); |
| 6306 node.accept(_typeAnalyzer); | 6219 node.accept(_typeAnalyzer); |
| 6307 return null; | 6220 return null; |
| 6308 } | 6221 } |
| 6309 Object visitDoStatement(DoStatement node) { | 6222 Object visitDoStatement(DoStatement node) { |
| 6310 try { | 6223 try { |
| 6311 _overrideManager.enterScope(); | 6224 overrideManager.enterScope(); |
| 6312 super.visitDoStatement(node); | 6225 super.visitDoStatement(node); |
| 6313 } finally { | 6226 } finally { |
| 6314 _overrideManager.exitScope(); | 6227 overrideManager.exitScope(); |
| 6315 } | 6228 } |
| 6316 return null; | 6229 return null; |
| 6317 } | 6230 } |
| 6318 Object visitFieldDeclaration(FieldDeclaration node) { | 6231 Object visitFieldDeclaration(FieldDeclaration node) { |
| 6319 try { | 6232 try { |
| 6320 _overrideManager.enterScope(); | 6233 overrideManager.enterScope(); |
| 6321 super.visitFieldDeclaration(node); | 6234 super.visitFieldDeclaration(node); |
| 6322 } finally { | 6235 } finally { |
| 6323 Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.fie
lds); | 6236 Map<Element, Type2> overrides = overrideManager.captureOverrides(node.fiel
ds); |
| 6324 _overrideManager.exitScope(); | 6237 overrideManager.exitScope(); |
| 6325 _overrideManager.applyOverrides(overrides); | 6238 overrideManager.applyOverrides(overrides); |
| 6326 } | 6239 } |
| 6327 return null; | 6240 return null; |
| 6328 } | 6241 } |
| 6329 Object visitForEachStatement(ForEachStatement node) { | 6242 Object visitForEachStatement(ForEachStatement node) { |
| 6330 try { | 6243 try { |
| 6331 _overrideManager.enterScope(); | 6244 overrideManager.enterScope(); |
| 6332 super.visitForEachStatement(node); | 6245 super.visitForEachStatement(node); |
| 6333 } finally { | 6246 } finally { |
| 6334 _overrideManager.exitScope(); | 6247 overrideManager.exitScope(); |
| 6335 } | 6248 } |
| 6336 return null; | 6249 return null; |
| 6337 } | 6250 } |
| 6338 Object visitForStatement(ForStatement node) { | 6251 Object visitForStatement(ForStatement node) { |
| 6339 try { | 6252 try { |
| 6340 _overrideManager.enterScope(); | 6253 overrideManager.enterScope(); |
| 6341 super.visitForStatement(node); | 6254 super.visitForStatement(node); |
| 6342 } finally { | 6255 } finally { |
| 6343 _overrideManager.exitScope(); | 6256 overrideManager.exitScope(); |
| 6344 } | 6257 } |
| 6345 return null; | 6258 return null; |
| 6346 } | 6259 } |
| 6347 Object visitFunctionBody(FunctionBody node) { | 6260 Object visitFunctionBody(FunctionBody node) { |
| 6348 try { | 6261 try { |
| 6349 _overrideManager.enterScope(); | 6262 overrideManager.enterScope(); |
| 6350 super.visitFunctionBody(node); | 6263 super.visitFunctionBody(node); |
| 6351 } finally { | 6264 } finally { |
| 6352 _overrideManager.exitScope(); | 6265 overrideManager.exitScope(); |
| 6353 } | 6266 } |
| 6354 return null; | 6267 return null; |
| 6355 } | 6268 } |
| 6356 Object visitFunctionDeclaration(FunctionDeclaration node) { | 6269 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 6357 ExecutableElement outerFunction = _enclosingFunction; | 6270 ExecutableElement outerFunction = enclosingFunction; |
| 6358 try { | 6271 try { |
| 6359 SimpleIdentifier functionName = node.name; | 6272 SimpleIdentifier functionName = node.name; |
| 6360 _enclosingFunction = functionName.staticElement as ExecutableElement; | 6273 enclosingFunction = functionName.staticElement as ExecutableElement; |
| 6361 super.visitFunctionDeclaration(node); | 6274 super.visitFunctionDeclaration(node); |
| 6362 } finally { | 6275 } finally { |
| 6363 _enclosingFunction = outerFunction; | 6276 enclosingFunction = outerFunction; |
| 6364 } | 6277 } |
| 6365 return null; | 6278 return null; |
| 6366 } | 6279 } |
| 6367 Object visitFunctionExpression(FunctionExpression node) { | 6280 Object visitFunctionExpression(FunctionExpression node) { |
| 6368 ExecutableElement outerFunction = _enclosingFunction; | 6281 ExecutableElement outerFunction = enclosingFunction; |
| 6369 try { | 6282 try { |
| 6370 _enclosingFunction = node.element; | 6283 enclosingFunction = node.element; |
| 6371 _overrideManager.enterScope(); | 6284 overrideManager.enterScope(); |
| 6372 super.visitFunctionExpression(node); | 6285 super.visitFunctionExpression(node); |
| 6373 } finally { | 6286 } finally { |
| 6374 _overrideManager.exitScope(); | 6287 overrideManager.exitScope(); |
| 6375 _enclosingFunction = outerFunction; | 6288 enclosingFunction = outerFunction; |
| 6376 } | 6289 } |
| 6377 return null; | 6290 return null; |
| 6378 } | 6291 } |
| 6379 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { | 6292 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { |
| 6380 safelyVisit(node.function); | 6293 safelyVisit(node.function); |
| 6381 node.accept(_elementResolver); | 6294 node.accept(_elementResolver); |
| 6382 inferFunctionExpressionsParametersTypes(node.argumentList); | 6295 inferFunctionExpressionsParametersTypes(node.argumentList); |
| 6383 safelyVisit(node.argumentList); | 6296 safelyVisit(node.argumentList); |
| 6384 node.accept(_typeAnalyzer); | 6297 node.accept(_typeAnalyzer); |
| 6385 return null; | 6298 return null; |
| 6386 } | 6299 } |
| 6387 Object visitHideCombinator(HideCombinator node) => null; | 6300 Object visitHideCombinator(HideCombinator node) => null; |
| 6388 Object visitIfStatement(IfStatement node) { | 6301 Object visitIfStatement(IfStatement node) { |
| 6389 Expression condition = node.condition; | 6302 Expression condition = node.condition; |
| 6390 safelyVisit(condition); | 6303 safelyVisit(condition); |
| 6391 Map<Element, Type2> thenOverrides = null; | 6304 Map<Element, Type2> thenOverrides = null; |
| 6392 Statement thenStatement = node.thenStatement; | 6305 Statement thenStatement = node.thenStatement; |
| 6393 if (thenStatement != null) { | 6306 if (thenStatement != null) { |
| 6394 try { | 6307 try { |
| 6395 _overrideManager.enterScope(); | 6308 overrideManager.enterScope(); |
| 6396 propagateTrueState(condition); | 6309 propagateTrueState(condition); |
| 6397 visitStatementInScope(thenStatement); | 6310 visitStatementInScope(thenStatement); |
| 6398 } finally { | 6311 } finally { |
| 6399 thenOverrides = _overrideManager.captureLocalOverrides(); | 6312 thenOverrides = overrideManager.captureLocalOverrides(); |
| 6400 _overrideManager.exitScope(); | 6313 overrideManager.exitScope(); |
| 6401 } | 6314 } |
| 6402 } | 6315 } |
| 6403 Map<Element, Type2> elseOverrides = null; | 6316 Map<Element, Type2> elseOverrides = null; |
| 6404 Statement elseStatement = node.elseStatement; | 6317 Statement elseStatement = node.elseStatement; |
| 6405 if (elseStatement != null) { | 6318 if (elseStatement != null) { |
| 6406 try { | 6319 try { |
| 6407 _overrideManager.enterScope(); | 6320 overrideManager.enterScope(); |
| 6408 propagateFalseState(condition); | 6321 propagateFalseState(condition); |
| 6409 visitStatementInScope(elseStatement); | 6322 visitStatementInScope(elseStatement); |
| 6410 } finally { | 6323 } finally { |
| 6411 elseOverrides = _overrideManager.captureLocalOverrides(); | 6324 elseOverrides = overrideManager.captureLocalOverrides(); |
| 6412 _overrideManager.exitScope(); | 6325 overrideManager.exitScope(); |
| 6413 } | 6326 } |
| 6414 } | 6327 } |
| 6415 node.accept(_elementResolver); | 6328 node.accept(_elementResolver); |
| 6416 node.accept(_typeAnalyzer); | 6329 node.accept(_typeAnalyzer); |
| 6417 bool thenIsAbrupt = isAbruptTermination2(thenStatement); | 6330 bool thenIsAbrupt = isAbruptTermination2(thenStatement); |
| 6418 bool elseIsAbrupt = isAbruptTermination2(elseStatement); | 6331 bool elseIsAbrupt = isAbruptTermination2(elseStatement); |
| 6419 if (elseIsAbrupt && !thenIsAbrupt) { | 6332 if (elseIsAbrupt && !thenIsAbrupt) { |
| 6420 propagateTrueState(condition); | 6333 propagateTrueState(condition); |
| 6421 if (thenOverrides != null) { | 6334 if (thenOverrides != null) { |
| 6422 _overrideManager.applyOverrides(thenOverrides); | 6335 overrideManager.applyOverrides(thenOverrides); |
| 6423 } | 6336 } |
| 6424 } else if (thenIsAbrupt && !elseIsAbrupt) { | 6337 } else if (thenIsAbrupt && !elseIsAbrupt) { |
| 6425 propagateFalseState(condition); | 6338 propagateFalseState(condition); |
| 6426 if (elseOverrides != null) { | 6339 if (elseOverrides != null) { |
| 6427 _overrideManager.applyOverrides(elseOverrides); | 6340 overrideManager.applyOverrides(elseOverrides); |
| 6428 } | 6341 } |
| 6429 } | 6342 } |
| 6430 return null; | 6343 return null; |
| 6431 } | 6344 } |
| 6432 Object visitLabel(Label node) => null; | 6345 Object visitLabel(Label node) => null; |
| 6433 Object visitLibraryIdentifier(LibraryIdentifier node) => null; | 6346 Object visitLibraryIdentifier(LibraryIdentifier node) => null; |
| 6434 Object visitMethodDeclaration(MethodDeclaration node) { | 6347 Object visitMethodDeclaration(MethodDeclaration node) { |
| 6435 ExecutableElement outerFunction = _enclosingFunction; | 6348 ExecutableElement outerFunction = enclosingFunction; |
| 6436 try { | 6349 try { |
| 6437 _enclosingFunction = node.element; | 6350 enclosingFunction = node.element; |
| 6438 super.visitMethodDeclaration(node); | 6351 super.visitMethodDeclaration(node); |
| 6439 } finally { | 6352 } finally { |
| 6440 _enclosingFunction = outerFunction; | 6353 enclosingFunction = outerFunction; |
| 6441 } | 6354 } |
| 6442 return null; | 6355 return null; |
| 6443 } | 6356 } |
| 6444 Object visitMethodInvocation(MethodInvocation node) { | 6357 Object visitMethodInvocation(MethodInvocation node) { |
| 6445 safelyVisit(node.target); | 6358 safelyVisit(node.target); |
| 6446 node.accept(_elementResolver); | 6359 node.accept(_elementResolver); |
| 6447 inferFunctionExpressionsParametersTypes(node.argumentList); | 6360 inferFunctionExpressionsParametersTypes(node.argumentList); |
| 6448 safelyVisit(node.argumentList); | 6361 safelyVisit(node.argumentList); |
| 6449 node.accept(_typeAnalyzer); | 6362 node.accept(_typeAnalyzer); |
| 6450 return null; | 6363 return null; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6475 } | 6388 } |
| 6476 Object visitShowCombinator(ShowCombinator node) => null; | 6389 Object visitShowCombinator(ShowCombinator node) => null; |
| 6477 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { | 6390 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { |
| 6478 safelyVisit(node.argumentList); | 6391 safelyVisit(node.argumentList); |
| 6479 node.accept(_elementResolver); | 6392 node.accept(_elementResolver); |
| 6480 node.accept(_typeAnalyzer); | 6393 node.accept(_typeAnalyzer); |
| 6481 return null; | 6394 return null; |
| 6482 } | 6395 } |
| 6483 Object visitSwitchCase(SwitchCase node) { | 6396 Object visitSwitchCase(SwitchCase node) { |
| 6484 try { | 6397 try { |
| 6485 _overrideManager.enterScope(); | 6398 overrideManager.enterScope(); |
| 6486 super.visitSwitchCase(node); | 6399 super.visitSwitchCase(node); |
| 6487 } finally { | 6400 } finally { |
| 6488 _overrideManager.exitScope(); | 6401 overrideManager.exitScope(); |
| 6489 } | 6402 } |
| 6490 return null; | 6403 return null; |
| 6491 } | 6404 } |
| 6492 Object visitSwitchDefault(SwitchDefault node) { | 6405 Object visitSwitchDefault(SwitchDefault node) { |
| 6493 try { | 6406 try { |
| 6494 _overrideManager.enterScope(); | 6407 overrideManager.enterScope(); |
| 6495 super.visitSwitchDefault(node); | 6408 super.visitSwitchDefault(node); |
| 6496 } finally { | 6409 } finally { |
| 6497 _overrideManager.exitScope(); | 6410 overrideManager.exitScope(); |
| 6498 } | 6411 } |
| 6499 return null; | 6412 return null; |
| 6500 } | 6413 } |
| 6501 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { | 6414 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { |
| 6502 try { | 6415 try { |
| 6503 _overrideManager.enterScope(); | 6416 overrideManager.enterScope(); |
| 6504 super.visitTopLevelVariableDeclaration(node); | 6417 super.visitTopLevelVariableDeclaration(node); |
| 6505 } finally { | 6418 } finally { |
| 6506 Map<Element, Type2> overrides = _overrideManager.captureOverrides(node.var
iables); | 6419 Map<Element, Type2> overrides = overrideManager.captureOverrides(node.vari
ables); |
| 6507 _overrideManager.exitScope(); | 6420 overrideManager.exitScope(); |
| 6508 _overrideManager.applyOverrides(overrides); | 6421 overrideManager.applyOverrides(overrides); |
| 6509 } | 6422 } |
| 6510 return null; | 6423 return null; |
| 6511 } | 6424 } |
| 6512 Object visitTypeName(TypeName node) => null; | 6425 Object visitTypeName(TypeName node) => null; |
| 6513 Object visitWhileStatement(WhileStatement node) { | 6426 Object visitWhileStatement(WhileStatement node) { |
| 6514 Expression condition = node.condition; | 6427 Expression condition = node.condition; |
| 6515 safelyVisit(condition); | 6428 safelyVisit(condition); |
| 6516 Statement body = node.body; | 6429 Statement body = node.body; |
| 6517 if (body != null) { | 6430 if (body != null) { |
| 6518 try { | 6431 try { |
| 6519 _overrideManager.enterScope(); | 6432 overrideManager.enterScope(); |
| 6520 propagateTrueState(condition); | 6433 propagateTrueState(condition); |
| 6521 visitStatementInScope(body); | 6434 visitStatementInScope(body); |
| 6522 } finally { | 6435 } finally { |
| 6523 _overrideManager.exitScope(); | 6436 overrideManager.exitScope(); |
| 6524 } | 6437 } |
| 6525 } | 6438 } |
| 6526 node.accept(_elementResolver); | 6439 node.accept(_elementResolver); |
| 6527 node.accept(_typeAnalyzer); | 6440 node.accept(_typeAnalyzer); |
| 6528 return null; | 6441 return null; |
| 6529 } | 6442 } |
| 6530 | 6443 |
| 6531 /** | 6444 /** |
| 6532 * Return the class element representing the class containing the current node
, or `null` if | |
| 6533 * the current node is not contained in a class. | |
| 6534 * | |
| 6535 * @return the class element representing the class containing the current nod
e | |
| 6536 */ | |
| 6537 ClassElement get enclosingClass => _enclosingClass; | |
| 6538 | |
| 6539 /** | |
| 6540 * Return the element representing the function containing the current node, o
r `null` if | |
| 6541 * the current node is not contained in a function. | |
| 6542 * | |
| 6543 * @return the element representing the function containing the current node | |
| 6544 */ | |
| 6545 ExecutableElement get enclosingFunction => _enclosingFunction; | |
| 6546 | |
| 6547 /** | |
| 6548 * Return the propagated element associated with the given expression whose ty
pe can be | 6445 * Return the propagated element associated with the given expression whose ty
pe can be |
| 6549 * overridden, or `null` if there is no element whose type can be overridden. | 6446 * overridden, or `null` if there is no element whose type can be overridden. |
| 6550 * | 6447 * |
| 6551 * @param expression the expression with which the element is associated | 6448 * @param expression the expression with which the element is associated |
| 6552 * @return the element associated with the given expression | 6449 * @return the element associated with the given expression |
| 6553 */ | 6450 */ |
| 6554 VariableElement getOverridablePropagatedElement(Expression expression) { | 6451 VariableElement getOverridablePropagatedElement(Expression expression) { |
| 6555 Element element = null; | 6452 Element element = null; |
| 6556 if (expression is SimpleIdentifier) { | 6453 if (expression is SimpleIdentifier) { |
| 6557 element = ((expression as SimpleIdentifier)).propagatedElement; | 6454 element = ((expression as SimpleIdentifier)).propagatedElement; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6621 return; | 6518 return; |
| 6622 } | 6519 } |
| 6623 if (element is PropertyInducingElement) { | 6520 if (element is PropertyInducingElement) { |
| 6624 PropertyInducingElement variable = element as PropertyInducingElement; | 6521 PropertyInducingElement variable = element as PropertyInducingElement; |
| 6625 if (!variable.isConst && !variable.isFinal) { | 6522 if (!variable.isConst && !variable.isFinal) { |
| 6626 return; | 6523 return; |
| 6627 } | 6524 } |
| 6628 } | 6525 } |
| 6629 Type2 currentType = getBestType(element); | 6526 Type2 currentType = getBestType(element); |
| 6630 if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) { | 6527 if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) { |
| 6631 _overrideManager.setType(element, potentialType); | 6528 overrideManager.setType(element, potentialType); |
| 6632 } | 6529 } |
| 6633 } | 6530 } |
| 6634 | 6531 |
| 6635 /** | 6532 /** |
| 6636 * Report a conditional analysis error with the given error code and arguments
. | 6533 * Report a conditional analysis error with the given error code and arguments
. |
| 6637 * | 6534 * |
| 6638 * @param enclosingElement the enclosing element | 6535 * @param enclosingElement the enclosing element |
| 6639 * @param errorCode the error code of the error to be reported | 6536 * @param errorCode the error code of the error to be reported |
| 6640 * @param node the node specifying the location of the error | 6537 * @param node the node specifying the location of the error |
| 6641 * @param arguments the arguments to the error, used to compose the error mess
age | 6538 * @param arguments the arguments to the error, used to compose the error mess
age |
| 6642 */ | 6539 */ |
| 6643 void reportErrorProxyConditionalAnalysisError(Element enclosingElement, ErrorC
ode errorCode, ASTNode node, List<Object> arguments) { | 6540 void reportErrorProxyConditionalAnalysisError(Element enclosingElement, ErrorC
ode errorCode, ASTNode node, List<Object> arguments) { |
| 6644 _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclos
ingElement, new AnalysisError.con2(source, node.offset, node.length, errorCode,
arguments))); | 6541 proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosi
ngElement, new AnalysisError.con2(source, node.offset, node.length, errorCode, a
rguments))); |
| 6645 } | 6542 } |
| 6646 | 6543 |
| 6647 /** | 6544 /** |
| 6648 * Report a conditional analysis error with the given error code and arguments
. | 6545 * Report a conditional analysis error with the given error code and arguments
. |
| 6649 * | 6546 * |
| 6650 * @param enclosingElement the enclosing element | 6547 * @param enclosingElement the enclosing element |
| 6651 * @param errorCode the error code of the error to be reported | 6548 * @param errorCode the error code of the error to be reported |
| 6652 * @param offset the offset of the location of the error | 6549 * @param offset the offset of the location of the error |
| 6653 * @param length the length of the location of the error | 6550 * @param length the length of the location of the error |
| 6654 * @param arguments the arguments to the error, used to compose the error mess
age | 6551 * @param arguments the arguments to the error, used to compose the error mess
age |
| 6655 */ | 6552 */ |
| 6656 void reportErrorProxyConditionalAnalysisError2(Element enclosingElement, Error
Code errorCode, int offset, int length, List<Object> arguments) { | 6553 void reportErrorProxyConditionalAnalysisError2(Element enclosingElement, Error
Code errorCode, int offset, int length, List<Object> arguments) { |
| 6657 _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclos
ingElement, new AnalysisError.con2(source, offset, length, errorCode, arguments)
)); | 6554 proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosi
ngElement, new AnalysisError.con2(source, offset, length, errorCode, arguments))
); |
| 6658 } | 6555 } |
| 6659 | 6556 |
| 6660 /** | 6557 /** |
| 6661 * Report a conditional analysis error with the given error code and arguments
. | 6558 * Report a conditional analysis error with the given error code and arguments
. |
| 6662 * | 6559 * |
| 6663 * @param enclosingElement the enclosing element | 6560 * @param enclosingElement the enclosing element |
| 6664 * @param errorCode the error code of the error to be reported | 6561 * @param errorCode the error code of the error to be reported |
| 6665 * @param token the token specifying the location of the error | 6562 * @param token the token specifying the location of the error |
| 6666 * @param arguments the arguments to the error, used to compose the error mess
age | 6563 * @param arguments the arguments to the error, used to compose the error mess
age |
| 6667 */ | 6564 */ |
| 6668 void reportErrorProxyConditionalAnalysisError3(Element enclosingElement, Error
Code errorCode, sc.Token token, List<Object> arguments) { | 6565 void reportErrorProxyConditionalAnalysisError3(Element enclosingElement, Error
Code errorCode, sc.Token token, List<Object> arguments) { |
| 6669 _proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclos
ingElement, new AnalysisError.con2(source, token.offset, token.length, errorCode
, arguments))); | 6566 proxyConditionalAnalysisErrors.add(new ProxyConditionalAnalysisError(enclosi
ngElement, new AnalysisError.con2(source, token.offset, token.length, errorCode,
arguments))); |
| 6670 } | 6567 } |
| 6671 void visitForEachStatementInScope(ForEachStatement node) { | 6568 void visitForEachStatementInScope(ForEachStatement node) { |
| 6672 Expression iterator = node.iterator; | 6569 Expression iterator = node.iterator; |
| 6673 safelyVisit(iterator); | 6570 safelyVisit(iterator); |
| 6674 DeclaredIdentifier loopVariable = node.loopVariable; | 6571 DeclaredIdentifier loopVariable = node.loopVariable; |
| 6675 safelyVisit(loopVariable); | 6572 safelyVisit(loopVariable); |
| 6676 Statement body = node.body; | 6573 Statement body = node.body; |
| 6677 if (body != null) { | 6574 if (body != null) { |
| 6678 try { | 6575 try { |
| 6679 _overrideManager.enterScope(); | 6576 overrideManager.enterScope(); |
| 6680 if (loopVariable != null && iterator != null) { | 6577 if (loopVariable != null && iterator != null) { |
| 6681 LocalVariableElement loopElement = loopVariable.element; | 6578 LocalVariableElement loopElement = loopVariable.element; |
| 6682 if (loopElement != null) { | 6579 if (loopElement != null) { |
| 6683 Type2 iteratorElementType = getIteratorElementType(iterator); | 6580 Type2 iteratorElementType = getIteratorElementType(iterator); |
| 6684 override2(loopElement, iteratorElementType); | 6581 override2(loopElement, iteratorElementType); |
| 6685 recordPropagatedType(loopVariable.identifier, iteratorElementType); | 6582 recordPropagatedType(loopVariable.identifier, iteratorElementType); |
| 6686 } | 6583 } |
| 6687 } | 6584 } |
| 6688 visitStatementInScope(body); | 6585 visitStatementInScope(body); |
| 6689 } finally { | 6586 } finally { |
| 6690 _overrideManager.exitScope(); | 6587 overrideManager.exitScope(); |
| 6691 } | 6588 } |
| 6692 } | 6589 } |
| 6693 node.accept(_elementResolver); | 6590 node.accept(_elementResolver); |
| 6694 node.accept(_typeAnalyzer); | 6591 node.accept(_typeAnalyzer); |
| 6695 } | 6592 } |
| 6696 void visitForStatementInScope(ForStatement node) { | 6593 void visitForStatementInScope(ForStatement node) { |
| 6697 safelyVisit(node.variables); | 6594 safelyVisit(node.variables); |
| 6698 safelyVisit(node.initialization); | 6595 safelyVisit(node.initialization); |
| 6699 safelyVisit(node.condition); | 6596 safelyVisit(node.condition); |
| 6700 _overrideManager.enterScope(); | 6597 overrideManager.enterScope(); |
| 6701 try { | 6598 try { |
| 6702 propagateTrueState(node.condition); | 6599 propagateTrueState(node.condition); |
| 6703 visitStatementInScope(node.body); | 6600 visitStatementInScope(node.body); |
| 6704 node.updaters.accept(this); | 6601 node.updaters.accept(this); |
| 6705 } finally { | 6602 } finally { |
| 6706 _overrideManager.exitScope(); | 6603 overrideManager.exitScope(); |
| 6707 } | 6604 } |
| 6708 } | 6605 } |
| 6709 | 6606 |
| 6710 /** | 6607 /** |
| 6711 * Return the best type information available for the given element. If the ty
pe of the element | 6608 * Return the best type information available for the given element. If the ty
pe of the element |
| 6712 * has been overridden, then return the overriding type. Otherwise, return the
static type. | 6609 * has been overridden, then return the overriding type. Otherwise, return the
static type. |
| 6713 * | 6610 * |
| 6714 * @param element the element for which type information is to be returned | 6611 * @param element the element for which type information is to be returned |
| 6715 * @return the best type information available for the given element | 6612 * @return the best type information available for the given element |
| 6716 */ | 6613 */ |
| 6717 Type2 getBestType(Element element) { | 6614 Type2 getBestType(Element element) { |
| 6718 Type2 bestType = _overrideManager.getType(element); | 6615 Type2 bestType = overrideManager.getType(element); |
| 6719 if (bestType == null) { | 6616 if (bestType == null) { |
| 6720 if (element is LocalVariableElement) { | 6617 if (element is LocalVariableElement) { |
| 6721 bestType = ((element as LocalVariableElement)).type; | 6618 bestType = ((element as LocalVariableElement)).type; |
| 6722 } else if (element is ParameterElement) { | 6619 } else if (element is ParameterElement) { |
| 6723 bestType = ((element as ParameterElement)).type; | 6620 bestType = ((element as ParameterElement)).type; |
| 6724 } | 6621 } |
| 6725 } | 6622 } |
| 6726 return bestType; | 6623 return bestType; |
| 6727 } | 6624 } |
| 6728 | 6625 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6770 FunctionType expectedClosureType = mayByFunctionType as FunctionType; | 6667 FunctionType expectedClosureType = mayByFunctionType as FunctionType; |
| 6771 closure.propagatedType = expectedClosureType; | 6668 closure.propagatedType = expectedClosureType; |
| 6772 NodeList<FormalParameter> parameters = closure.parameters.parameters; | 6669 NodeList<FormalParameter> parameters = closure.parameters.parameters; |
| 6773 List<ParameterElement> expectedParameters = expectedClosureType.parameters; | 6670 List<ParameterElement> expectedParameters = expectedClosureType.parameters; |
| 6774 for (int i = 0; i < parameters.length && i < expectedParameters.length; i++)
{ | 6671 for (int i = 0; i < parameters.length && i < expectedParameters.length; i++)
{ |
| 6775 FormalParameter parameter = parameters[i]; | 6672 FormalParameter parameter = parameters[i]; |
| 6776 ParameterElement element = parameter.element; | 6673 ParameterElement element = parameter.element; |
| 6777 Type2 currentType = getBestType(element); | 6674 Type2 currentType = getBestType(element); |
| 6778 Type2 expectedType = expectedParameters[i].type; | 6675 Type2 expectedType = expectedParameters[i].type; |
| 6779 if (currentType == null || expectedType.isMoreSpecificThan(currentType)) { | 6676 if (currentType == null || expectedType.isMoreSpecificThan(currentType)) { |
| 6780 _overrideManager.setType(element, expectedType); | 6677 overrideManager.setType(element, expectedType); |
| 6781 } | 6678 } |
| 6782 } | 6679 } |
| 6783 } | 6680 } |
| 6784 | 6681 |
| 6785 /** | 6682 /** |
| 6786 * Try to infer types of parameters of the [FunctionExpression] arguments. | 6683 * Try to infer types of parameters of the [FunctionExpression] arguments. |
| 6787 */ | 6684 */ |
| 6788 void inferFunctionExpressionsParametersTypes(ArgumentList argumentList) { | 6685 void inferFunctionExpressionsParametersTypes(ArgumentList argumentList) { |
| 6789 for (Expression argument in argumentList.arguments) { | 6686 for (Expression argument in argumentList.arguments) { |
| 6790 ParameterElement parameter = argument.propagatedParameterElement; | 6687 ParameterElement parameter = argument.propagatedParameterElement; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6905 * @param expression the node whose type is to be recorded | 6802 * @param expression the node whose type is to be recorded |
| 6906 * @param type the propagated type of the node | 6803 * @param type the propagated type of the node |
| 6907 */ | 6804 */ |
| 6908 void recordPropagatedType(Expression expression, Type2 type) { | 6805 void recordPropagatedType(Expression expression, Type2 type) { |
| 6909 if (type != null && !type.isDynamic) { | 6806 if (type != null && !type.isDynamic) { |
| 6910 expression.propagatedType = type; | 6807 expression.propagatedType = type; |
| 6911 } | 6808 } |
| 6912 } | 6809 } |
| 6913 get elementResolver_J2DAccessor => _elementResolver; | 6810 get elementResolver_J2DAccessor => _elementResolver; |
| 6914 set elementResolver_J2DAccessor(__v) => _elementResolver = __v; | 6811 set elementResolver_J2DAccessor(__v) => _elementResolver = __v; |
| 6915 get labelScope_J2DAccessor => _labelScope; | 6812 get labelScope_J2DAccessor => labelScope; |
| 6916 set labelScope_J2DAccessor(__v) => _labelScope = __v; | 6813 set labelScope_J2DAccessor(__v) => labelScope = __v; |
| 6917 get nameScope_J2DAccessor => _nameScope; | 6814 get nameScope_J2DAccessor => nameScope; |
| 6918 set nameScope_J2DAccessor(__v) => _nameScope = __v; | 6815 set nameScope_J2DAccessor(__v) => nameScope = __v; |
| 6919 get typeAnalyzer_J2DAccessor => _typeAnalyzer; | 6816 get typeAnalyzer_J2DAccessor => _typeAnalyzer; |
| 6920 set typeAnalyzer_J2DAccessor(__v) => _typeAnalyzer = __v; | 6817 set typeAnalyzer_J2DAccessor(__v) => _typeAnalyzer = __v; |
| 6921 get enclosingClass_J2DAccessor => _enclosingClass; | 6818 get enclosingClass_J2DAccessor => enclosingClass; |
| 6922 set enclosingClass_J2DAccessor(__v) => _enclosingClass = __v; | 6819 set enclosingClass_J2DAccessor(__v) => enclosingClass = __v; |
| 6923 } | 6820 } |
| 6924 /** | 6821 /** |
| 6925 * The abstract class `ScopedVisitor` maintains name and label scopes as an AST
structure is | 6822 * The abstract class `ScopedVisitor` maintains name and label scopes as an AST
structure is |
| 6926 * being visited. | 6823 * being visited. |
| 6927 * | 6824 * |
| 6928 * @coverage dart.engine.resolver | 6825 * @coverage dart.engine.resolver |
| 6929 */ | 6826 */ |
| 6930 abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> { | 6827 abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> { |
| 6931 | 6828 |
| 6932 /** | 6829 /** |
| 6933 * The element for the library containing the compilation unit being visited. | 6830 * The element for the library containing the compilation unit being visited. |
| 6934 */ | 6831 */ |
| 6935 LibraryElement _definingLibrary; | 6832 LibraryElement definingLibrary; |
| 6936 | 6833 |
| 6937 /** | 6834 /** |
| 6938 * The source representing the compilation unit being visited. | 6835 * The source representing the compilation unit being visited. |
| 6939 */ | 6836 */ |
| 6940 Source _source; | 6837 Source source; |
| 6941 | 6838 |
| 6942 /** | 6839 /** |
| 6943 * The error listener that will be informed of any errors that are found durin
g resolution. | 6840 * The error listener that will be informed of any errors that are found durin
g resolution. |
| 6944 */ | 6841 */ |
| 6945 AnalysisErrorListener _errorListener; | 6842 AnalysisErrorListener _errorListener; |
| 6946 | 6843 |
| 6947 /** | 6844 /** |
| 6948 * The scope used to resolve identifiers. | 6845 * The scope used to resolve identifiers. |
| 6949 */ | 6846 */ |
| 6950 Scope _nameScope; | 6847 Scope nameScope; |
| 6951 | 6848 |
| 6952 /** | 6849 /** |
| 6953 * The object used to access the types from the core library. | 6850 * The object used to access the types from the core library. |
| 6954 */ | 6851 */ |
| 6955 TypeProvider _typeProvider; | 6852 TypeProvider typeProvider; |
| 6956 | 6853 |
| 6957 /** | 6854 /** |
| 6958 * The scope used to resolve labels for `break` and `continue` statements, or | 6855 * The scope used to resolve labels for `break` and `continue` statements, or |
| 6959 * `null` if no labels have been defined in the current context. | 6856 * `null` if no labels have been defined in the current context. |
| 6960 */ | 6857 */ |
| 6961 LabelScope _labelScope; | 6858 LabelScope labelScope; |
| 6962 | 6859 |
| 6963 /** | 6860 /** |
| 6964 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 6861 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 6965 * | 6862 * |
| 6966 * @param library the library containing the compilation unit being resolved | 6863 * @param library the library containing the compilation unit being resolved |
| 6967 * @param source the source representing the compilation unit being visited | 6864 * @param source the source representing the compilation unit being visited |
| 6968 * @param typeProvider the object used to access the types from the core libra
ry | 6865 * @param typeProvider the object used to access the types from the core libra
ry |
| 6969 */ | 6866 */ |
| 6970 ScopedVisitor.con1(Library library, Source source, TypeProvider typeProvider)
{ | 6867 ScopedVisitor.con1(Library library, Source source, TypeProvider typeProvider)
{ |
| 6971 this._definingLibrary = library.libraryElement; | 6868 this.definingLibrary = library.libraryElement; |
| 6972 this._source = source; | 6869 this.source = source; |
| 6973 LibraryScope libraryScope = library.libraryScope; | 6870 LibraryScope libraryScope = library.libraryScope; |
| 6974 this._errorListener = libraryScope.errorListener; | 6871 this._errorListener = libraryScope.errorListener; |
| 6975 this._nameScope = libraryScope; | 6872 this.nameScope = libraryScope; |
| 6976 this._typeProvider = typeProvider; | 6873 this.typeProvider = typeProvider; |
| 6977 } | 6874 } |
| 6978 | 6875 |
| 6979 /** | 6876 /** |
| 6980 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 6877 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 6981 * | 6878 * |
| 6982 * @param definingLibrary the element for the library containing the compilati
on unit being | 6879 * @param definingLibrary the element for the library containing the compilati
on unit being |
| 6983 * visited | 6880 * visited |
| 6984 * @param source the source representing the compilation unit being visited | 6881 * @param source the source representing the compilation unit being visited |
| 6985 * @param typeProvider the object used to access the types from the core libra
ry | 6882 * @param typeProvider the object used to access the types from the core libra
ry |
| 6986 * @param errorListener the error listener that will be informed of any errors
that are found | 6883 * @param errorListener the error listener that will be informed of any errors
that are found |
| 6987 * during resolution | 6884 * during resolution |
| 6988 */ | 6885 */ |
| 6989 ScopedVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider
typeProvider, AnalysisErrorListener errorListener) { | 6886 ScopedVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider
typeProvider, AnalysisErrorListener errorListener) { |
| 6990 this._definingLibrary = definingLibrary; | 6887 this.definingLibrary = definingLibrary; |
| 6991 this._source = source; | 6888 this.source = source; |
| 6992 this._errorListener = errorListener; | 6889 this._errorListener = errorListener; |
| 6993 this._nameScope = new LibraryScope(definingLibrary, errorListener); | 6890 this.nameScope = new LibraryScope(definingLibrary, errorListener); |
| 6994 this._typeProvider = typeProvider; | 6891 this.typeProvider = typeProvider; |
| 6995 } | 6892 } |
| 6996 | 6893 |
| 6997 /** | 6894 /** |
| 6998 * Return the library element for the library containing the compilation unit
being resolved. | |
| 6999 * | |
| 7000 * @return the library element for the library containing the compilation unit
being resolved | |
| 7001 */ | |
| 7002 LibraryElement get definingLibrary => _definingLibrary; | |
| 7003 | |
| 7004 /** | |
| 7005 * Return the object used to access the types from the core library. | |
| 7006 * | |
| 7007 * @return the object used to access the types from the core library | |
| 7008 */ | |
| 7009 TypeProvider get typeProvider => _typeProvider; | |
| 7010 | |
| 7011 /** | |
| 7012 * Report an error with the given analysis error. | 6895 * Report an error with the given analysis error. |
| 7013 * | 6896 * |
| 7014 * @param errorCode analysis error | 6897 * @param errorCode analysis error |
| 7015 */ | 6898 */ |
| 7016 void reportError(AnalysisError analysisError) { | 6899 void reportError(AnalysisError analysisError) { |
| 7017 _errorListener.onError(analysisError); | 6900 _errorListener.onError(analysisError); |
| 7018 } | 6901 } |
| 7019 Object visitBlock(Block node) { | 6902 Object visitBlock(Block node) { |
| 7020 Scope outerScope = _nameScope; | 6903 Scope outerScope = nameScope; |
| 7021 try { | 6904 try { |
| 7022 EnclosedScope enclosedScope = new EnclosedScope(_nameScope); | 6905 EnclosedScope enclosedScope = new EnclosedScope(nameScope); |
| 7023 hideNamesDefinedInBlock(enclosedScope, node); | 6906 hideNamesDefinedInBlock(enclosedScope, node); |
| 7024 _nameScope = enclosedScope; | 6907 nameScope = enclosedScope; |
| 7025 super.visitBlock(node); | 6908 super.visitBlock(node); |
| 7026 } finally { | 6909 } finally { |
| 7027 _nameScope = outerScope; | 6910 nameScope = outerScope; |
| 7028 } | 6911 } |
| 7029 return null; | 6912 return null; |
| 7030 } | 6913 } |
| 7031 Object visitCatchClause(CatchClause node) { | 6914 Object visitCatchClause(CatchClause node) { |
| 7032 SimpleIdentifier exception = node.exceptionParameter; | 6915 SimpleIdentifier exception = node.exceptionParameter; |
| 7033 if (exception != null) { | 6916 if (exception != null) { |
| 7034 Scope outerScope = _nameScope; | 6917 Scope outerScope = nameScope; |
| 7035 try { | 6918 try { |
| 7036 _nameScope = new EnclosedScope(_nameScope); | 6919 nameScope = new EnclosedScope(nameScope); |
| 7037 _nameScope.define(exception.staticElement); | 6920 nameScope.define(exception.staticElement); |
| 7038 SimpleIdentifier stackTrace = node.stackTraceParameter; | 6921 SimpleIdentifier stackTrace = node.stackTraceParameter; |
| 7039 if (stackTrace != null) { | 6922 if (stackTrace != null) { |
| 7040 _nameScope.define(stackTrace.staticElement); | 6923 nameScope.define(stackTrace.staticElement); |
| 7041 } | 6924 } |
| 7042 super.visitCatchClause(node); | 6925 super.visitCatchClause(node); |
| 7043 } finally { | 6926 } finally { |
| 7044 _nameScope = outerScope; | 6927 nameScope = outerScope; |
| 7045 } | 6928 } |
| 7046 } else { | 6929 } else { |
| 7047 super.visitCatchClause(node); | 6930 super.visitCatchClause(node); |
| 7048 } | 6931 } |
| 7049 return null; | 6932 return null; |
| 7050 } | 6933 } |
| 7051 Object visitClassDeclaration(ClassDeclaration node) { | 6934 Object visitClassDeclaration(ClassDeclaration node) { |
| 7052 Scope outerScope = _nameScope; | 6935 Scope outerScope = nameScope; |
| 7053 try { | 6936 try { |
| 7054 _nameScope = new ClassScope(_nameScope, node.element); | 6937 nameScope = new ClassScope(nameScope, node.element); |
| 7055 super.visitClassDeclaration(node); | 6938 super.visitClassDeclaration(node); |
| 7056 } finally { | 6939 } finally { |
| 7057 _nameScope = outerScope; | 6940 nameScope = outerScope; |
| 7058 } | 6941 } |
| 7059 return null; | 6942 return null; |
| 7060 } | 6943 } |
| 7061 Object visitClassTypeAlias(ClassTypeAlias node) { | 6944 Object visitClassTypeAlias(ClassTypeAlias node) { |
| 7062 Scope outerScope = _nameScope; | 6945 Scope outerScope = nameScope; |
| 7063 try { | 6946 try { |
| 7064 _nameScope = new ClassScope(_nameScope, node.element); | 6947 nameScope = new ClassScope(nameScope, node.element); |
| 7065 super.visitClassTypeAlias(node); | 6948 super.visitClassTypeAlias(node); |
| 7066 } finally { | 6949 } finally { |
| 7067 _nameScope = outerScope; | 6950 nameScope = outerScope; |
| 7068 } | 6951 } |
| 7069 return null; | 6952 return null; |
| 7070 } | 6953 } |
| 7071 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 6954 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 7072 Scope outerScope = _nameScope; | 6955 Scope outerScope = nameScope; |
| 7073 try { | 6956 try { |
| 7074 _nameScope = new FunctionScope(_nameScope, node.element); | 6957 nameScope = new FunctionScope(nameScope, node.element); |
| 7075 super.visitConstructorDeclaration(node); | 6958 super.visitConstructorDeclaration(node); |
| 7076 } finally { | 6959 } finally { |
| 7077 _nameScope = outerScope; | 6960 nameScope = outerScope; |
| 7078 } | 6961 } |
| 7079 return null; | 6962 return null; |
| 7080 } | 6963 } |
| 7081 Object visitDeclaredIdentifier(DeclaredIdentifier node) { | 6964 Object visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 7082 VariableElement element = node.element; | 6965 VariableElement element = node.element; |
| 7083 if (element != null) { | 6966 if (element != null) { |
| 7084 _nameScope.define(element); | 6967 nameScope.define(element); |
| 7085 } | 6968 } |
| 7086 super.visitDeclaredIdentifier(node); | 6969 super.visitDeclaredIdentifier(node); |
| 7087 return null; | 6970 return null; |
| 7088 } | 6971 } |
| 7089 Object visitDoStatement(DoStatement node) { | 6972 Object visitDoStatement(DoStatement node) { |
| 7090 LabelScope outerLabelScope = _labelScope; | 6973 LabelScope outerLabelScope = labelScope; |
| 7091 try { | 6974 try { |
| 7092 _labelScope = new LabelScope.con1(_labelScope, false, false); | 6975 labelScope = new LabelScope.con1(labelScope, false, false); |
| 7093 visitStatementInScope(node.body); | 6976 visitStatementInScope(node.body); |
| 7094 safelyVisit(node.condition); | 6977 safelyVisit(node.condition); |
| 7095 } finally { | 6978 } finally { |
| 7096 _labelScope = outerLabelScope; | 6979 labelScope = outerLabelScope; |
| 7097 } | 6980 } |
| 7098 return null; | 6981 return null; |
| 7099 } | 6982 } |
| 7100 Object visitForEachStatement(ForEachStatement node) { | 6983 Object visitForEachStatement(ForEachStatement node) { |
| 7101 Scope outerNameScope = _nameScope; | 6984 Scope outerNameScope = nameScope; |
| 7102 LabelScope outerLabelScope = _labelScope; | 6985 LabelScope outerLabelScope = labelScope; |
| 7103 try { | 6986 try { |
| 7104 _nameScope = new EnclosedScope(_nameScope); | 6987 nameScope = new EnclosedScope(nameScope); |
| 7105 _labelScope = new LabelScope.con1(outerLabelScope, false, false); | 6988 labelScope = new LabelScope.con1(outerLabelScope, false, false); |
| 7106 visitForEachStatementInScope(node); | 6989 visitForEachStatementInScope(node); |
| 7107 } finally { | 6990 } finally { |
| 7108 _labelScope = outerLabelScope; | 6991 labelScope = outerLabelScope; |
| 7109 _nameScope = outerNameScope; | 6992 nameScope = outerNameScope; |
| 7110 } | 6993 } |
| 7111 return null; | 6994 return null; |
| 7112 } | 6995 } |
| 7113 Object visitForStatement(ForStatement node) { | 6996 Object visitForStatement(ForStatement node) { |
| 7114 Scope outerNameScope = _nameScope; | 6997 Scope outerNameScope = nameScope; |
| 7115 LabelScope outerLabelScope = _labelScope; | 6998 LabelScope outerLabelScope = labelScope; |
| 7116 try { | 6999 try { |
| 7117 _nameScope = new EnclosedScope(_nameScope); | 7000 nameScope = new EnclosedScope(nameScope); |
| 7118 _labelScope = new LabelScope.con1(outerLabelScope, false, false); | 7001 labelScope = new LabelScope.con1(outerLabelScope, false, false); |
| 7119 visitForStatementInScope(node); | 7002 visitForStatementInScope(node); |
| 7120 } finally { | 7003 } finally { |
| 7121 _labelScope = outerLabelScope; | 7004 labelScope = outerLabelScope; |
| 7122 _nameScope = outerNameScope; | 7005 nameScope = outerNameScope; |
| 7123 } | 7006 } |
| 7124 return null; | 7007 return null; |
| 7125 } | 7008 } |
| 7126 Object visitFunctionDeclaration(FunctionDeclaration node) { | 7009 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 7127 ExecutableElement function = node.element; | 7010 ExecutableElement function = node.element; |
| 7128 Scope outerScope = _nameScope; | 7011 Scope outerScope = nameScope; |
| 7129 try { | 7012 try { |
| 7130 _nameScope = new FunctionScope(_nameScope, function); | 7013 nameScope = new FunctionScope(nameScope, function); |
| 7131 super.visitFunctionDeclaration(node); | 7014 super.visitFunctionDeclaration(node); |
| 7132 } finally { | 7015 } finally { |
| 7133 _nameScope = outerScope; | 7016 nameScope = outerScope; |
| 7134 } | 7017 } |
| 7135 if (function.enclosingElement is! CompilationUnitElement) { | 7018 if (function.enclosingElement is! CompilationUnitElement) { |
| 7136 _nameScope.define(function); | 7019 nameScope.define(function); |
| 7137 } | 7020 } |
| 7138 return null; | 7021 return null; |
| 7139 } | 7022 } |
| 7140 Object visitFunctionExpression(FunctionExpression node) { | 7023 Object visitFunctionExpression(FunctionExpression node) { |
| 7141 if (node.parent is FunctionDeclaration) { | 7024 if (node.parent is FunctionDeclaration) { |
| 7142 super.visitFunctionExpression(node); | 7025 super.visitFunctionExpression(node); |
| 7143 } else { | 7026 } else { |
| 7144 Scope outerScope = _nameScope; | 7027 Scope outerScope = nameScope; |
| 7145 try { | 7028 try { |
| 7146 ExecutableElement functionElement = node.element; | 7029 ExecutableElement functionElement = node.element; |
| 7147 if (functionElement == null) { | 7030 if (functionElement == null) { |
| 7148 } else { | 7031 } else { |
| 7149 _nameScope = new FunctionScope(_nameScope, functionElement); | 7032 nameScope = new FunctionScope(nameScope, functionElement); |
| 7150 } | 7033 } |
| 7151 super.visitFunctionExpression(node); | 7034 super.visitFunctionExpression(node); |
| 7152 } finally { | 7035 } finally { |
| 7153 _nameScope = outerScope; | 7036 nameScope = outerScope; |
| 7154 } | 7037 } |
| 7155 } | 7038 } |
| 7156 return null; | 7039 return null; |
| 7157 } | 7040 } |
| 7158 Object visitFunctionTypeAlias(FunctionTypeAlias node) { | 7041 Object visitFunctionTypeAlias(FunctionTypeAlias node) { |
| 7159 Scope outerScope = _nameScope; | 7042 Scope outerScope = nameScope; |
| 7160 try { | 7043 try { |
| 7161 _nameScope = new FunctionTypeScope(_nameScope, node.element); | 7044 nameScope = new FunctionTypeScope(nameScope, node.element); |
| 7162 super.visitFunctionTypeAlias(node); | 7045 super.visitFunctionTypeAlias(node); |
| 7163 } finally { | 7046 } finally { |
| 7164 _nameScope = outerScope; | 7047 nameScope = outerScope; |
| 7165 } | 7048 } |
| 7166 return null; | 7049 return null; |
| 7167 } | 7050 } |
| 7168 Object visitIfStatement(IfStatement node) { | 7051 Object visitIfStatement(IfStatement node) { |
| 7169 safelyVisit(node.condition); | 7052 safelyVisit(node.condition); |
| 7170 visitStatementInScope(node.thenStatement); | 7053 visitStatementInScope(node.thenStatement); |
| 7171 visitStatementInScope(node.elseStatement); | 7054 visitStatementInScope(node.elseStatement); |
| 7172 return null; | 7055 return null; |
| 7173 } | 7056 } |
| 7174 Object visitLabeledStatement(LabeledStatement node) { | 7057 Object visitLabeledStatement(LabeledStatement node) { |
| 7175 LabelScope outerScope = addScopesFor(node.labels); | 7058 LabelScope outerScope = addScopesFor(node.labels); |
| 7176 try { | 7059 try { |
| 7177 super.visitLabeledStatement(node); | 7060 super.visitLabeledStatement(node); |
| 7178 } finally { | 7061 } finally { |
| 7179 _labelScope = outerScope; | 7062 labelScope = outerScope; |
| 7180 } | 7063 } |
| 7181 return null; | 7064 return null; |
| 7182 } | 7065 } |
| 7183 Object visitMethodDeclaration(MethodDeclaration node) { | 7066 Object visitMethodDeclaration(MethodDeclaration node) { |
| 7184 Scope outerScope = _nameScope; | 7067 Scope outerScope = nameScope; |
| 7185 try { | 7068 try { |
| 7186 _nameScope = new FunctionScope(_nameScope, node.element); | 7069 nameScope = new FunctionScope(nameScope, node.element); |
| 7187 super.visitMethodDeclaration(node); | 7070 super.visitMethodDeclaration(node); |
| 7188 } finally { | 7071 } finally { |
| 7189 _nameScope = outerScope; | 7072 nameScope = outerScope; |
| 7190 } | 7073 } |
| 7191 return null; | 7074 return null; |
| 7192 } | 7075 } |
| 7193 Object visitSwitchCase(SwitchCase node) { | 7076 Object visitSwitchCase(SwitchCase node) { |
| 7194 node.expression.accept(this); | 7077 node.expression.accept(this); |
| 7195 Scope outerNameScope = _nameScope; | 7078 Scope outerNameScope = nameScope; |
| 7196 try { | 7079 try { |
| 7197 _nameScope = new EnclosedScope(_nameScope); | 7080 nameScope = new EnclosedScope(nameScope); |
| 7198 node.statements.accept(this); | 7081 node.statements.accept(this); |
| 7199 } finally { | 7082 } finally { |
| 7200 _nameScope = outerNameScope; | 7083 nameScope = outerNameScope; |
| 7201 } | 7084 } |
| 7202 return null; | 7085 return null; |
| 7203 } | 7086 } |
| 7204 Object visitSwitchDefault(SwitchDefault node) { | 7087 Object visitSwitchDefault(SwitchDefault node) { |
| 7205 Scope outerNameScope = _nameScope; | 7088 Scope outerNameScope = nameScope; |
| 7206 try { | 7089 try { |
| 7207 _nameScope = new EnclosedScope(_nameScope); | 7090 nameScope = new EnclosedScope(nameScope); |
| 7208 node.statements.accept(this); | 7091 node.statements.accept(this); |
| 7209 } finally { | 7092 } finally { |
| 7210 _nameScope = outerNameScope; | 7093 nameScope = outerNameScope; |
| 7211 } | 7094 } |
| 7212 return null; | 7095 return null; |
| 7213 } | 7096 } |
| 7214 Object visitSwitchStatement(SwitchStatement node) { | 7097 Object visitSwitchStatement(SwitchStatement node) { |
| 7215 LabelScope outerScope = _labelScope; | 7098 LabelScope outerScope = labelScope; |
| 7216 try { | 7099 try { |
| 7217 _labelScope = new LabelScope.con1(outerScope, true, false); | 7100 labelScope = new LabelScope.con1(outerScope, true, false); |
| 7218 for (SwitchMember member in node.members) { | 7101 for (SwitchMember member in node.members) { |
| 7219 for (Label label in member.labels) { | 7102 for (Label label in member.labels) { |
| 7220 SimpleIdentifier labelName = label.label; | 7103 SimpleIdentifier labelName = label.label; |
| 7221 LabelElement labelElement = labelName.staticElement as LabelElement; | 7104 LabelElement labelElement = labelName.staticElement as LabelElement; |
| 7222 _labelScope = new LabelScope.con2(_labelScope, labelName.name, labelEl
ement); | 7105 labelScope = new LabelScope.con2(labelScope, labelName.name, labelElem
ent); |
| 7223 } | 7106 } |
| 7224 } | 7107 } |
| 7225 super.visitSwitchStatement(node); | 7108 super.visitSwitchStatement(node); |
| 7226 } finally { | 7109 } finally { |
| 7227 _labelScope = outerScope; | 7110 labelScope = outerScope; |
| 7228 } | 7111 } |
| 7229 return null; | 7112 return null; |
| 7230 } | 7113 } |
| 7231 Object visitVariableDeclaration(VariableDeclaration node) { | 7114 Object visitVariableDeclaration(VariableDeclaration node) { |
| 7232 if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent
is! FieldDeclaration) { | 7115 if (node.parent.parent is! TopLevelVariableDeclaration && node.parent.parent
is! FieldDeclaration) { |
| 7233 VariableElement element = node.element; | 7116 VariableElement element = node.element; |
| 7234 if (element != null) { | 7117 if (element != null) { |
| 7235 _nameScope.define(element); | 7118 nameScope.define(element); |
| 7236 } | 7119 } |
| 7237 } | 7120 } |
| 7238 super.visitVariableDeclaration(node); | 7121 super.visitVariableDeclaration(node); |
| 7239 return null; | 7122 return null; |
| 7240 } | 7123 } |
| 7241 Object visitWhileStatement(WhileStatement node) { | 7124 Object visitWhileStatement(WhileStatement node) { |
| 7242 LabelScope outerScope = _labelScope; | 7125 LabelScope outerScope = labelScope; |
| 7243 try { | 7126 try { |
| 7244 _labelScope = new LabelScope.con1(outerScope, false, false); | 7127 labelScope = new LabelScope.con1(outerScope, false, false); |
| 7245 safelyVisit(node.condition); | 7128 safelyVisit(node.condition); |
| 7246 visitStatementInScope(node.body); | 7129 visitStatementInScope(node.body); |
| 7247 } finally { | 7130 } finally { |
| 7248 _labelScope = outerScope; | 7131 labelScope = outerScope; |
| 7249 } | 7132 } |
| 7250 return null; | 7133 return null; |
| 7251 } | 7134 } |
| 7252 | 7135 |
| 7253 /** | 7136 /** |
| 7254 * Return the label scope in which the current node is being resolved. | |
| 7255 * | |
| 7256 * @return the label scope in which the current node is being resolved | |
| 7257 */ | |
| 7258 LabelScope get labelScope => _labelScope; | |
| 7259 | |
| 7260 /** | |
| 7261 * Return the name scope in which the current node is being resolved. | |
| 7262 * | |
| 7263 * @return the name scope in which the current node is being resolved | |
| 7264 */ | |
| 7265 Scope get nameScope => _nameScope; | |
| 7266 | |
| 7267 /** | |
| 7268 * Return the source. | |
| 7269 * | |
| 7270 * @return the source | |
| 7271 */ | |
| 7272 Source get source => _source; | |
| 7273 | |
| 7274 /** | |
| 7275 * Report an error with the given error code and arguments. | 7137 * Report an error with the given error code and arguments. |
| 7276 * | 7138 * |
| 7277 * @param errorCode the error code of the error to be reported | 7139 * @param errorCode the error code of the error to be reported |
| 7278 * @param node the node specifying the location of the error | 7140 * @param node the node specifying the location of the error |
| 7279 * @param arguments the arguments to the error, used to compose the error mess
age | 7141 * @param arguments the arguments to the error, used to compose the error mess
age |
| 7280 */ | 7142 */ |
| 7281 void reportError5(ErrorCode errorCode, ASTNode node, List<Object> arguments) { | 7143 void reportError5(ErrorCode errorCode, ASTNode node, List<Object> arguments) { |
| 7282 _errorListener.onError(new AnalysisError.con2(_source, node.offset, node.len
gth, errorCode, arguments)); | 7144 _errorListener.onError(new AnalysisError.con2(source, node.offset, node.leng
th, errorCode, arguments)); |
| 7283 } | 7145 } |
| 7284 | 7146 |
| 7285 /** | 7147 /** |
| 7286 * Report an error with the given error code and arguments. | 7148 * Report an error with the given error code and arguments. |
| 7287 * | 7149 * |
| 7288 * @param errorCode the error code of the error to be reported | 7150 * @param errorCode the error code of the error to be reported |
| 7289 * @param offset the offset of the location of the error | 7151 * @param offset the offset of the location of the error |
| 7290 * @param length the length of the location of the error | 7152 * @param length the length of the location of the error |
| 7291 * @param arguments the arguments to the error, used to compose the error mess
age | 7153 * @param arguments the arguments to the error, used to compose the error mess
age |
| 7292 */ | 7154 */ |
| 7293 void reportError6(ErrorCode errorCode, int offset, int length, List<Object> ar
guments) { | 7155 void reportError6(ErrorCode errorCode, int offset, int length, List<Object> ar
guments) { |
| 7294 _errorListener.onError(new AnalysisError.con2(_source, offset, length, error
Code, arguments)); | 7156 _errorListener.onError(new AnalysisError.con2(source, offset, length, errorC
ode, arguments)); |
| 7295 } | 7157 } |
| 7296 | 7158 |
| 7297 /** | 7159 /** |
| 7298 * Report an error with the given error code and arguments. | 7160 * Report an error with the given error code and arguments. |
| 7299 * | 7161 * |
| 7300 * @param errorCode the error code of the error to be reported | 7162 * @param errorCode the error code of the error to be reported |
| 7301 * @param token the token specifying the location of the error | 7163 * @param token the token specifying the location of the error |
| 7302 * @param arguments the arguments to the error, used to compose the error mess
age | 7164 * @param arguments the arguments to the error, used to compose the error mess
age |
| 7303 */ | 7165 */ |
| 7304 void reportError7(ErrorCode errorCode, sc.Token token, List<Object> arguments)
{ | 7166 void reportError7(ErrorCode errorCode, sc.Token token, List<Object> arguments)
{ |
| 7305 _errorListener.onError(new AnalysisError.con2(_source, token.offset, token.l
ength, errorCode, arguments)); | 7167 _errorListener.onError(new AnalysisError.con2(source, token.offset, token.le
ngth, errorCode, arguments)); |
| 7306 } | 7168 } |
| 7307 | 7169 |
| 7308 /** | 7170 /** |
| 7309 * Visit the given AST node if it is not null. | 7171 * Visit the given AST node if it is not null. |
| 7310 * | 7172 * |
| 7311 * @param node the node to be visited | 7173 * @param node the node to be visited |
| 7312 */ | 7174 */ |
| 7313 void safelyVisit(ASTNode node) { | 7175 void safelyVisit(ASTNode node) { |
| 7314 if (node != null) { | 7176 if (node != null) { |
| 7315 node.accept(this); | 7177 node.accept(this); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7347 /** | 7209 /** |
| 7348 * Visit the given statement after it's scope has been created. This is used b
y ResolverVisitor to | 7210 * Visit the given statement after it's scope has been created. This is used b
y ResolverVisitor to |
| 7349 * correctly visit the 'then' and 'else' statements of an 'if' statement. | 7211 * correctly visit the 'then' and 'else' statements of an 'if' statement. |
| 7350 * | 7212 * |
| 7351 * @param node the statement to be visited | 7213 * @param node the statement to be visited |
| 7352 */ | 7214 */ |
| 7353 void visitStatementInScope(Statement node) { | 7215 void visitStatementInScope(Statement node) { |
| 7354 if (node is Block) { | 7216 if (node is Block) { |
| 7355 visitBlock(node as Block); | 7217 visitBlock(node as Block); |
| 7356 } else if (node != null) { | 7218 } else if (node != null) { |
| 7357 Scope outerNameScope = _nameScope; | 7219 Scope outerNameScope = nameScope; |
| 7358 try { | 7220 try { |
| 7359 _nameScope = new EnclosedScope(_nameScope); | 7221 nameScope = new EnclosedScope(nameScope); |
| 7360 node.accept(this); | 7222 node.accept(this); |
| 7361 } finally { | 7223 } finally { |
| 7362 _nameScope = outerNameScope; | 7224 nameScope = outerNameScope; |
| 7363 } | 7225 } |
| 7364 } | 7226 } |
| 7365 } | 7227 } |
| 7366 | 7228 |
| 7367 /** | 7229 /** |
| 7368 * Add scopes for each of the given labels. | 7230 * Add scopes for each of the given labels. |
| 7369 * | 7231 * |
| 7370 * @param labels the labels for which new scopes are to be added | 7232 * @param labels the labels for which new scopes are to be added |
| 7371 * @return the scope that was in effect before the new scopes were added | 7233 * @return the scope that was in effect before the new scopes were added |
| 7372 */ | 7234 */ |
| 7373 LabelScope addScopesFor(NodeList<Label> labels) { | 7235 LabelScope addScopesFor(NodeList<Label> labels) { |
| 7374 LabelScope outerScope = _labelScope; | 7236 LabelScope outerScope = labelScope; |
| 7375 for (Label label in labels) { | 7237 for (Label label in labels) { |
| 7376 SimpleIdentifier labelNameNode = label.label; | 7238 SimpleIdentifier labelNameNode = label.label; |
| 7377 String labelName = labelNameNode.name; | 7239 String labelName = labelNameNode.name; |
| 7378 LabelElement labelElement = labelNameNode.staticElement as LabelElement; | 7240 LabelElement labelElement = labelNameNode.staticElement as LabelElement; |
| 7379 _labelScope = new LabelScope.con2(_labelScope, labelName, labelElement); | 7241 labelScope = new LabelScope.con2(labelScope, labelName, labelElement); |
| 7380 } | 7242 } |
| 7381 return outerScope; | 7243 return outerScope; |
| 7382 } | 7244 } |
| 7383 | 7245 |
| 7384 /** | 7246 /** |
| 7385 * Marks the local declarations of the given [Block] hidden in the enclosing s
cope. | 7247 * Marks the local declarations of the given [Block] hidden in the enclosing s
cope. |
| 7386 * According to the scoping rules name is hidden if block defines it, but name
is defined after | 7248 * According to the scoping rules name is hidden if block defines it, but name
is defined after |
| 7387 * its declaration statement. | 7249 * its declaration statement. |
| 7388 */ | 7250 */ |
| 7389 void hideNamesDefinedInBlock(EnclosedScope scope, Block block) { | 7251 void hideNamesDefinedInBlock(EnclosedScope scope, Block block) { |
| (...skipping 2910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10300 * Instances of the class `EnclosedScope` implement a scope that is lexically en
closed in | 10162 * Instances of the class `EnclosedScope` implement a scope that is lexically en
closed in |
| 10301 * another scope. | 10163 * another scope. |
| 10302 * | 10164 * |
| 10303 * @coverage dart.engine.resolver | 10165 * @coverage dart.engine.resolver |
| 10304 */ | 10166 */ |
| 10305 class EnclosedScope extends Scope { | 10167 class EnclosedScope extends Scope { |
| 10306 | 10168 |
| 10307 /** | 10169 /** |
| 10308 * The scope in which this scope is lexically enclosed. | 10170 * The scope in which this scope is lexically enclosed. |
| 10309 */ | 10171 */ |
| 10310 Scope _enclosingScope; | 10172 Scope enclosingScope; |
| 10311 | 10173 |
| 10312 /** | 10174 /** |
| 10313 * A set of names that will be defined in this scope, but right now are not de
fined. However | 10175 * A set of names that will be defined in this scope, but right now are not de
fined. However |
| 10314 * according to the scoping rules these names are hidden, even if they were de
fined in an outer | 10176 * according to the scoping rules these names are hidden, even if they were de
fined in an outer |
| 10315 * scope. | 10177 * scope. |
| 10316 */ | 10178 */ |
| 10317 Set<String> _hiddenNames = new Set<String>(); | 10179 Set<String> _hiddenNames = new Set<String>(); |
| 10318 | 10180 |
| 10319 /** | 10181 /** |
| 10320 * Initialize a newly created scope enclosed within another scope. | 10182 * Initialize a newly created scope enclosed within another scope. |
| 10321 * | 10183 * |
| 10322 * @param enclosingScope the scope in which this scope is lexically enclosed | 10184 * @param enclosingScope the scope in which this scope is lexically enclosed |
| 10323 */ | 10185 */ |
| 10324 EnclosedScope(Scope enclosingScope) { | 10186 EnclosedScope(Scope enclosingScope) { |
| 10325 this._enclosingScope = enclosingScope; | 10187 this.enclosingScope = enclosingScope; |
| 10326 } | 10188 } |
| 10327 LibraryElement get definingLibrary => _enclosingScope.definingLibrary; | 10189 LibraryElement get definingLibrary => enclosingScope.definingLibrary; |
| 10328 AnalysisErrorListener get errorListener => _enclosingScope.errorListener; | 10190 AnalysisErrorListener get errorListener => enclosingScope.errorListener; |
| 10329 | 10191 |
| 10330 /** | 10192 /** |
| 10331 * Hides the name of the given element in this scope. If there is already an e
lement with the | 10193 * Hides the name of the given element in this scope. If there is already an e
lement with the |
| 10332 * given name defined in an outer scope, then it will become unavailable. | 10194 * given name defined in an outer scope, then it will become unavailable. |
| 10333 * | 10195 * |
| 10334 * @param element the element to be hidden in this scope | 10196 * @param element the element to be hidden in this scope |
| 10335 */ | 10197 */ |
| 10336 void hide(Element element) { | 10198 void hide(Element element) { |
| 10337 if (element != null) { | 10199 if (element != null) { |
| 10338 String name = element.name; | 10200 String name = element.name; |
| 10339 if (name != null && !name.isEmpty) { | 10201 if (name != null && !name.isEmpty) { |
| 10340 javaSetAdd(_hiddenNames, name); | 10202 javaSetAdd(_hiddenNames, name); |
| 10341 } | 10203 } |
| 10342 } | 10204 } |
| 10343 } | 10205 } |
| 10344 | |
| 10345 /** | |
| 10346 * Return the scope in which this scope is lexically enclosed. | |
| 10347 * | |
| 10348 * @return the scope in which this scope is lexically enclosed | |
| 10349 */ | |
| 10350 Scope get enclosingScope => _enclosingScope; | |
| 10351 Element lookup3(Identifier identifier, String name, LibraryElement referencing
Library) { | 10206 Element lookup3(Identifier identifier, String name, LibraryElement referencing
Library) { |
| 10352 Element element = localLookup(name, referencingLibrary); | 10207 Element element = localLookup(name, referencingLibrary); |
| 10353 if (element != null) { | 10208 if (element != null) { |
| 10354 return element; | 10209 return element; |
| 10355 } | 10210 } |
| 10356 if (_hiddenNames.contains(name)) { | 10211 if (_hiddenNames.contains(name)) { |
| 10357 return null; | 10212 return null; |
| 10358 } | 10213 } |
| 10359 return _enclosingScope.lookup3(identifier, name, referencingLibrary); | 10214 return enclosingScope.lookup3(identifier, name, referencingLibrary); |
| 10360 } | 10215 } |
| 10361 } | 10216 } |
| 10362 /** | 10217 /** |
| 10363 * Instances of the class `FunctionScope` implement the scope defined by a funct
ion. | 10218 * Instances of the class `FunctionScope` implement the scope defined by a funct
ion. |
| 10364 * | 10219 * |
| 10365 * @coverage dart.engine.resolver | 10220 * @coverage dart.engine.resolver |
| 10366 */ | 10221 */ |
| 10367 class FunctionScope extends EnclosedScope { | 10222 class FunctionScope extends EnclosedScope { |
| 10368 | 10223 |
| 10369 /** | 10224 /** |
| (...skipping 5291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15661 ResolverErrorCode.con2(String name, int ordinal, ErrorType type, String messag
e, String correction) : super(name, ordinal) { | 15516 ResolverErrorCode.con2(String name, int ordinal, ErrorType type, String messag
e, String correction) : super(name, ordinal) { |
| 15662 this._type = type; | 15517 this._type = type; |
| 15663 this._message = message; | 15518 this._message = message; |
| 15664 this.correction9 = correction; | 15519 this.correction9 = correction; |
| 15665 } | 15520 } |
| 15666 String get correction => correction9; | 15521 String get correction => correction9; |
| 15667 ErrorSeverity get errorSeverity => _type.severity; | 15522 ErrorSeverity get errorSeverity => _type.severity; |
| 15668 String get message => _message; | 15523 String get message => _message; |
| 15669 ErrorType get type => _type; | 15524 ErrorType get type => _type; |
| 15670 } | 15525 } |
| OLD | NEW |