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 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 initializer.functions = holder.functions; | 595 initializer.functions = holder.functions; |
596 initializer.labels = holder.labels; | 596 initializer.labels = holder.labels; |
597 initializer.localVariables = holder.localVariables; | 597 initializer.localVariables = holder.localVariables; |
598 initializer.synthetic = true; | 598 initializer.synthetic = true; |
599 element.initializer = initializer; | 599 element.initializer = initializer; |
600 holder.validate(); | 600 holder.validate(); |
601 } | 601 } |
602 if (element is PropertyInducingElementImpl) { | 602 if (element is PropertyInducingElementImpl) { |
603 PropertyInducingElementImpl variable = element as PropertyInducingElementI
mpl; | 603 PropertyInducingElementImpl variable = element as PropertyInducingElementI
mpl; |
604 if (_inFieldContext) { | 604 if (_inFieldContext) { |
605 ((variable as FieldElementImpl)).static = matches(((node.parent.parent a
s FieldDeclaration)).keyword, sc.Keyword.STATIC); | 605 ((variable as FieldElementImpl)).static = matches(((node.parent.parent a
s FieldDeclaration)).staticKeyword, sc.Keyword.STATIC); |
606 } | 606 } |
607 PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(
variable); | 607 PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(
variable); |
608 getter.getter = true; | 608 getter.getter = true; |
609 getter.static = variable.isStatic; | 609 getter.static = variable.isStatic; |
610 _currentHolder.addAccessor(getter); | 610 _currentHolder.addAccessor(getter); |
611 variable.getter = getter; | 611 variable.getter = getter; |
612 if (!isFinal) { | 612 if (!isFinal) { |
613 PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con
2(variable); | 613 PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl.con
2(variable); |
614 setter.setter = true; | 614 setter.setter = true; |
615 setter.static = variable.isStatic; | 615 setter.static = variable.isStatic; |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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. |
| 1035 */ |
| 1036 int _modificationStamp = 0; |
| 1037 |
| 1038 /** |
1034 * 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 |
1035 * `null` if we are not building an element. | 1040 * `null` if we are not building an element. |
1036 */ | 1041 */ |
1037 LineInfo _lineInfo; | 1042 LineInfo _lineInfo; |
1038 | 1043 |
1039 /** | 1044 /** |
1040 * The HTML element being built. | 1045 * The HTML element being built. |
1041 */ | 1046 */ |
1042 HtmlElementImpl _htmlElement; | 1047 HtmlElementImpl _htmlElement; |
1043 | 1048 |
(...skipping 22 matching lines...) Expand all Loading... |
1066 this._errorListener = new RecordingErrorListener(); | 1071 this._errorListener = new RecordingErrorListener(); |
1067 } | 1072 } |
1068 | 1073 |
1069 /** | 1074 /** |
1070 * Build the HTML element for the given source. | 1075 * Build the HTML element for the given source. |
1071 * | 1076 * |
1072 * @param source the source describing the compilation unit | 1077 * @param source the source describing the compilation unit |
1073 * @return the HTML element that was built | 1078 * @return the HTML element that was built |
1074 * @throws AnalysisException if the analysis could not be performed | 1079 * @throws AnalysisException if the analysis could not be performed |
1075 */ | 1080 */ |
1076 HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, _
context.parseHtmlUnit(source)); | 1081 HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, s
ource.modificationStamp, _context.parseHtmlUnit(source)); |
1077 | 1082 |
1078 /** | 1083 /** |
1079 * Build the HTML element for the given source. | 1084 * Build the HTML element for the given source. |
1080 * | 1085 * |
1081 * @param source the source describing the compilation unit | 1086 * @param source the source describing the compilation unit |
| 1087 * @param modificationStamp the modification time of the source for which an e
lement is being |
| 1088 * built |
1082 * @param unit the AST structure representing the HTML | 1089 * @param unit the AST structure representing the HTML |
1083 * @throws AnalysisException if the analysis could not be performed | 1090 * @throws AnalysisException if the analysis could not be performed |
1084 */ | 1091 */ |
1085 HtmlElementImpl buildHtmlElement2(Source source2, ht.HtmlUnit unit) { | 1092 HtmlElementImpl buildHtmlElement2(Source source2, int modificationStamp2, ht.H
tmlUnit unit) { |
| 1093 this._modificationStamp = modificationStamp2; |
1086 _lineInfo = _context.computeLineInfo(source2); | 1094 _lineInfo = _context.computeLineInfo(source2); |
1087 HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName); | 1095 HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName); |
1088 result.source = source2; | 1096 result.source = source2; |
1089 _htmlElement = result; | 1097 _htmlElement = result; |
1090 unit.accept(this); | 1098 unit.accept(this); |
1091 _htmlElement = null; | 1099 _htmlElement = null; |
1092 unit.element = result; | 1100 unit.element = result; |
1093 return result; | 1101 return result; |
1094 } | 1102 } |
1095 | 1103 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 LineInfo_Location location = _lineInfo.getLocation(attributeEnd); | 1163 LineInfo_Location location = _lineInfo.getLocation(attributeEnd); |
1156 sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents,
_errorListener); | 1164 sc.StringScanner scanner = new sc.StringScanner(htmlSource, contents,
_errorListener); |
1157 scanner.setSourceStart(location.lineNumber, location.columnNumber, att
ributeEnd); | 1165 scanner.setSourceStart(location.lineNumber, location.columnNumber, att
ributeEnd); |
1158 sc.Token firstToken = scanner.tokenize(); | 1166 sc.Token firstToken = scanner.tokenize(); |
1159 List<int> lineStarts = scanner.lineStarts; | 1167 List<int> lineStarts = scanner.lineStarts; |
1160 Parser parser = new Parser(htmlSource, _errorListener); | 1168 Parser parser = new Parser(htmlSource, _errorListener); |
1161 CompilationUnit unit = parser.parseCompilationUnit(firstToken); | 1169 CompilationUnit unit = parser.parseCompilationUnit(firstToken); |
1162 unit.lineInfo = new LineInfo(lineStarts); | 1170 unit.lineInfo = new LineInfo(lineStarts); |
1163 try { | 1171 try { |
1164 LibraryResolver resolver = new LibraryResolver(_context); | 1172 LibraryResolver resolver = new LibraryResolver(_context); |
1165 LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSou
rce, unit, true) as LibraryElementImpl; | 1173 LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSou
rce, _modificationStamp, unit, true) as LibraryElementImpl; |
1166 script.scriptLibrary = library; | 1174 script.scriptLibrary = library; |
1167 _resolvedLibraries.addAll(resolver.resolvedLibraries); | 1175 _resolvedLibraries.addAll(resolver.resolvedLibraries); |
1168 _errorListener.addAll(resolver.errorListener); | 1176 _errorListener.addAll(resolver.errorListener); |
1169 } on AnalysisException catch (exception) { | 1177 } on AnalysisException catch (exception) { |
1170 AnalysisEngine.instance.logger.logError3(exception); | 1178 AnalysisEngine.instance.logger.logError3(exception); |
1171 } | 1179 } |
1172 _scripts.add(script); | 1180 _scripts.add(script); |
1173 } else { | 1181 } else { |
1174 ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementIm
pl(node); | 1182 ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementIm
pl(node); |
1175 if (scriptSourcePath != null) { | 1183 if (scriptSourcePath != null) { |
1176 try { | 1184 try { |
| 1185 scriptSourcePath = Uri.encodeFull(scriptSourcePath); |
1177 parseUriWithException(scriptSourcePath); | 1186 parseUriWithException(scriptSourcePath); |
1178 Source scriptSource = _context.sourceFactory.resolveUri(htmlSource
, scriptSourcePath); | 1187 Source scriptSource = _context.sourceFactory.resolveUri(htmlSource
, scriptSourcePath); |
1179 script.scriptSource = scriptSource; | 1188 script.scriptSource = scriptSource; |
1180 if (!scriptSource.exists()) { | 1189 if (scriptSource == null || !scriptSource.exists()) { |
1181 reportError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute.
offset + 1, scriptSourcePath.length, [scriptSourcePath]); | 1190 reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttri
bute, [scriptSourcePath]); |
1182 } | 1191 } |
1183 } on URISyntaxException catch (exception) { | 1192 } on URISyntaxException catch (exception) { |
1184 reportError(HtmlWarningCode.INVALID_URI, scriptAttribute.offset +
1, scriptSourcePath.length, [scriptSourcePath]); | 1193 reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [sc
riptSourcePath]); |
1185 } | 1194 } |
1186 } | 1195 } |
1187 _scripts.add(script); | 1196 _scripts.add(script); |
1188 } | 1197 } |
1189 } else { | 1198 } else { |
1190 node.visitChildren(this); | 1199 node.visitChildren(this); |
1191 } | 1200 } |
1192 } finally { | 1201 } finally { |
1193 _parentNodes.remove(node); | 1202 _parentNodes.remove(node); |
1194 } | 1203 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1239 * compose the error message. | 1248 * compose the error message. |
1240 * | 1249 * |
1241 * @param errorCode the error code of the error to be reported | 1250 * @param errorCode the error code of the error to be reported |
1242 * @param offset the offset of the first character to be highlighted | 1251 * @param offset the offset of the first character to be highlighted |
1243 * @param length the number of characters to be highlighted | 1252 * @param length the number of characters to be highlighted |
1244 * @param arguments the arguments used to compose the error message | 1253 * @param arguments the arguments used to compose the error message |
1245 */ | 1254 */ |
1246 void reportError(ErrorCode errorCode, int offset, int length, List<Object> arg
uments) { | 1255 void reportError(ErrorCode errorCode, int offset, int length, List<Object> arg
uments) { |
1247 _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, l
ength, errorCode, arguments)); | 1256 _errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, l
ength, errorCode, arguments)); |
1248 } | 1257 } |
| 1258 |
| 1259 /** |
| 1260 * 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. |
| 1262 * |
| 1263 * @param errorCode the error code of the error to be reported |
| 1264 * @param offset the offset of the first character to be highlighted |
| 1265 * @param length the number of characters to be highlighted |
| 1266 * @param arguments the arguments used to compose the error message |
| 1267 */ |
| 1268 void reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute, List
<Object> arguments) { |
| 1269 int offset = attribute.value.offset + 1; |
| 1270 int length = attribute.value.length - 2; |
| 1271 reportError(errorCode, offset, length, arguments); |
| 1272 } |
1249 } | 1273 } |
1250 /** | 1274 /** |
1251 * Instances of the class `DeadCodeVerifier` traverse an AST structure looking f
or cases of | 1275 * Instances of the class `DeadCodeVerifier` traverse an AST structure looking f
or cases of |
1252 * [HintCode#DEAD_CODE]. | 1276 * [HintCode#DEAD_CODE]. |
1253 * | 1277 * |
1254 * @coverage dart.engine.resolver | 1278 * @coverage dart.engine.resolver |
1255 */ | 1279 */ |
1256 class DeadCodeVerifier extends RecursiveASTVisitor<Object> { | 1280 class DeadCodeVerifier extends RecursiveASTVisitor<Object> { |
1257 | 1281 |
1258 /** | 1282 /** |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1343 } else { | 1367 } else { |
1344 _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenStatement, []); | 1368 _errorReporter.reportError2(HintCode.DEAD_CODE, node.thenStatement, []); |
1345 safelyVisit(node.elseStatement); | 1369 safelyVisit(node.elseStatement); |
1346 return null; | 1370 return null; |
1347 } | 1371 } |
1348 } | 1372 } |
1349 return super.visitIfStatement(node); | 1373 return super.visitIfStatement(node); |
1350 } | 1374 } |
1351 Object visitTryStatement(TryStatement node) { | 1375 Object visitTryStatement(TryStatement node) { |
1352 safelyVisit(node.body); | 1376 safelyVisit(node.body); |
1353 safelyVisit(node.finallyClause); | 1377 safelyVisit(node.finallyBlock); |
1354 NodeList<CatchClause> catchClauses = node.catchClauses; | 1378 NodeList<CatchClause> catchClauses = node.catchClauses; |
1355 int numOfCatchClauses = catchClauses.length; | 1379 int numOfCatchClauses = catchClauses.length; |
1356 List<Type2> visitedTypes = new List<Type2>(); | 1380 List<Type2> visitedTypes = new List<Type2>(); |
1357 for (int i = 0; i < numOfCatchClauses; i++) { | 1381 for (int i = 0; i < numOfCatchClauses; i++) { |
1358 CatchClause catchClause = catchClauses[i]; | 1382 CatchClause catchClause = catchClauses[i]; |
1359 if (catchClause.onKeyword != null) { | 1383 if (catchClause.onKeyword != null) { |
1360 TypeName typeName = catchClause.exceptionType; | 1384 TypeName typeName = catchClause.exceptionType; |
1361 if (typeName != null && typeName.type != null) { | 1385 if (typeName != null && typeName.type != null) { |
1362 Type2 currentType = typeName.type; | 1386 Type2 currentType = typeName.type; |
1363 if (currentType.isObject) { | 1387 if (currentType.isObject) { |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1595 SimpleIdentifier prefixIdentifier = importDirective.prefix; | 1619 SimpleIdentifier prefixIdentifier = importDirective.prefix; |
1596 if (prefixIdentifier != null) { | 1620 if (prefixIdentifier != null) { |
1597 Element element = prefixIdentifier.element; | 1621 Element element = prefixIdentifier.element; |
1598 if (element is PrefixElement) { | 1622 if (element is PrefixElement) { |
1599 PrefixElement prefixElementKey = element as PrefixElement; | 1623 PrefixElement prefixElementKey = element as PrefixElement; |
1600 _prefixElementMap[prefixElementKey] = importDirective; | 1624 _prefixElementMap[prefixElementKey] = importDirective; |
1601 } | 1625 } |
1602 } | 1626 } |
1603 } | 1627 } |
1604 putIntoLibraryMap(libraryElement, importDirective); | 1628 putIntoLibraryMap(libraryElement, importDirective); |
1605 addAdditionalLibrariesForExports(_libraryMap, libraryElement, import
Directive, new List<LibraryElement>()); | 1629 addAdditionalLibrariesForExports(libraryElement, importDirective, ne
w List<LibraryElement>()); |
1606 } | 1630 } |
1607 } | 1631 } |
1608 } | 1632 } |
1609 } | 1633 } |
1610 if (_unusedImports.isEmpty) { | 1634 if (_unusedImports.isEmpty) { |
1611 return null; | 1635 return null; |
1612 } | 1636 } |
1613 return super.visitCompilationUnit(node); | 1637 return super.visitCompilationUnit(node); |
1614 } | 1638 } |
1615 Object visitExportDirective(ExportDirective node) => null; | 1639 Object visitExportDirective(ExportDirective node) => null; |
1616 Object visitImportDirective(ImportDirective node) => null; | 1640 Object visitImportDirective(ImportDirective node) => null; |
1617 Object visitLibraryDirective(LibraryDirective node) => null; | 1641 Object visitLibraryDirective(LibraryDirective node) => null; |
1618 Object visitPrefixedIdentifier(PrefixedIdentifier node) { | 1642 Object visitPrefixedIdentifier(PrefixedIdentifier node) { |
1619 SimpleIdentifier prefixIdentifier = node.prefix; | 1643 SimpleIdentifier prefixIdentifier = node.prefix; |
1620 Element element = prefixIdentifier.element; | 1644 Element element = prefixIdentifier.element; |
1621 if (element is PrefixElement) { | 1645 if (element is PrefixElement) { |
1622 _unusedImports.remove(_prefixElementMap[element]); | 1646 _unusedImports.remove(_prefixElementMap[element]); |
1623 return null; | 1647 return null; |
1624 } | 1648 } |
1625 return visitIdentifier(element, prefixIdentifier.name); | 1649 return visitIdentifier(element, prefixIdentifier.name); |
1626 } | 1650 } |
1627 Object visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node.el
ement, node.name); | 1651 Object visitSimpleIdentifier(SimpleIdentifier node) => visitIdentifier(node.el
ement, node.name); |
1628 void set inDefiningCompilationUnit(bool inDefiningCompilationUnit2) { | 1652 void set inDefiningCompilationUnit(bool inDefiningCompilationUnit2) { |
1629 this._inDefiningCompilationUnit = inDefiningCompilationUnit2; | 1653 this._inDefiningCompilationUnit = inDefiningCompilationUnit2; |
1630 } | 1654 } |
1631 | 1655 |
1632 /** | 1656 /** |
1633 * Recursively add any exported library elements into the [libraryMap]. | 1657 * Recursively add any exported library elements into the [libraryMap]. |
1634 */ | 1658 */ |
1635 void addAdditionalLibrariesForExports(Map<LibraryElement, List<ImportDirective
>> map, LibraryElement library, ImportDirective importDirective, List<LibraryEle
ment> exportPath) { | 1659 void addAdditionalLibrariesForExports(LibraryElement library, ImportDirective
importDirective, List<LibraryElement> exportPath) { |
1636 if (exportPath.contains(library)) { | 1660 if (exportPath.contains(library)) { |
1637 return; | 1661 return; |
1638 } | 1662 } |
| 1663 exportPath.add(library); |
1639 for (LibraryElement exportedLibraryElt in library.exportedLibraries) { | 1664 for (LibraryElement exportedLibraryElt in library.exportedLibraries) { |
1640 putIntoLibraryMap(exportedLibraryElt, importDirective); | 1665 putIntoLibraryMap(exportedLibraryElt, importDirective); |
1641 exportPath.add(exportedLibraryElt); | 1666 addAdditionalLibrariesForExports(exportedLibraryElt, importDirective, expo
rtPath); |
1642 addAdditionalLibrariesForExports(map, exportedLibraryElt, importDirective,
exportPath); | |
1643 } | 1667 } |
1644 } | 1668 } |
1645 | 1669 |
1646 /** | 1670 /** |
1647 * Lookup and return the [Namespace] from the [namespaceMap], if the map does
not | 1671 * Lookup and return the [Namespace] from the [namespaceMap], if the map does
not |
1648 * have the computed namespace, compute it and cache it in the map. If the imp
ort directive is not | 1672 * have the computed namespace, compute it and cache it in the map. If the imp
ort directive is not |
1649 * resolved or is not resolvable, `null` is returned. | 1673 * resolved or is not resolvable, `null` is returned. |
1650 * | 1674 * |
1651 * @param importDirective the import directive used to compute the returned na
mespace | 1675 * @param importDirective the import directive used to compute the returned na
mespace |
1652 * @return the computed or looked up [Namespace] | 1676 * @return the computed or looked up [Namespace] |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1755 int pathIndex = 0; | 1779 int pathIndex = 0; |
1756 int fullNameIndex = fullName.length; | 1780 int fullNameIndex = fullName.length; |
1757 while (pathIndex < path.length && JavaString.startsWithBefore(path, "../",
pathIndex)) { | 1781 while (pathIndex < path.length && JavaString.startsWithBefore(path, "../",
pathIndex)) { |
1758 fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex); | 1782 fullNameIndex = JavaString.lastIndexOf(fullName, '/', fullNameIndex); |
1759 if (fullNameIndex < 4) { | 1783 if (fullNameIndex < 4) { |
1760 return false; | 1784 return false; |
1761 } | 1785 } |
1762 if (JavaString.startsWithBefore(fullName, "/lib", fullNameIndex - 4)) { | 1786 if (JavaString.startsWithBefore(fullName, "/lib", fullNameIndex - 4)) { |
1763 String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSP
EC_YAML; | 1787 String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSP
EC_YAML; |
1764 Source pubspecSource = _context.sourceFactory.resolveUri(source, relat
ivePubspecPath); | 1788 Source pubspecSource = _context.sourceFactory.resolveUri(source, relat
ivePubspecPath); |
1765 if (pubspecSource.exists()) { | 1789 if (pubspecSource != null && pubspecSource.exists()) { |
1766 _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB
_REFERENCES_FILE_OUTSIDE, uriLiteral, []); | 1790 _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB
_REFERENCES_FILE_OUTSIDE, uriLiteral, []); |
1767 } | 1791 } |
1768 return true; | 1792 return true; |
1769 } | 1793 } |
1770 pathIndex += 3; | 1794 pathIndex += 3; |
1771 } | 1795 } |
1772 } | 1796 } |
1773 return false; | 1797 return false; |
1774 } | 1798 } |
1775 | 1799 |
(...skipping 19 matching lines...) Expand all Loading... |
1795 return true; | 1819 return true; |
1796 } | 1820 } |
1797 pathIndex = JavaString.indexOf(path, "/lib/", pathIndex + 4); | 1821 pathIndex = JavaString.indexOf(path, "/lib/", pathIndex + 4); |
1798 } | 1822 } |
1799 return false; | 1823 return false; |
1800 } | 1824 } |
1801 bool checkForFileImportOutsideLibReferencesFileInside2(StringLiteral uriLitera
l, String path, int pathIndex) { | 1825 bool checkForFileImportOutsideLibReferencesFileInside2(StringLiteral uriLitera
l, String path, int pathIndex) { |
1802 Source source = getSource(uriLiteral); | 1826 Source source = getSource(uriLiteral); |
1803 String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML; | 1827 String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML; |
1804 Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePub
specPath); | 1828 Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePub
specPath); |
1805 if (!pubspecSource.exists()) { | 1829 if (pubspecSource == null || !pubspecSource.exists()) { |
1806 return false; | 1830 return false; |
1807 } | 1831 } |
1808 String fullName = getSourceFullName(source); | 1832 String fullName = getSourceFullName(source); |
1809 if (fullName != null) { | 1833 if (fullName != null) { |
1810 if (!fullName.contains("/lib/")) { | 1834 if (!fullName.contains("/lib/")) { |
1811 _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_RE
FERENCES_FILE_INSIDE, uriLiteral, []); | 1835 _errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_OUTSIDE_LIB_RE
FERENCES_FILE_INSIDE, uriLiteral, []); |
1812 return true; | 1836 return true; |
1813 } | 1837 } |
1814 } | 1838 } |
1815 return false; | 1839 return false; |
(...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2492 */ | 2516 */ |
2493 ResolverVisitor _resolver; | 2517 ResolverVisitor _resolver; |
2494 | 2518 |
2495 /** | 2519 /** |
2496 * A flag indicating whether we are running in strict mode. In strict mode, er
ror reporting is | 2520 * A flag indicating whether we are running in strict mode. In strict mode, er
ror reporting is |
2497 * based exclusively on the static type information. | 2521 * based exclusively on the static type information. |
2498 */ | 2522 */ |
2499 bool _strictMode = false; | 2523 bool _strictMode = false; |
2500 | 2524 |
2501 /** | 2525 /** |
| 2526 * The type representing the type 'dynamic'. |
| 2527 */ |
| 2528 Type2 _dynamicType; |
| 2529 |
| 2530 /** |
| 2531 * The type representing the type 'type'. |
| 2532 */ |
| 2533 Type2 _typeType; |
| 2534 |
| 2535 /** |
2502 * The name of the method that can be implemented by a class to allow its inst
ances to be invoked | 2536 * The name of the method that can be implemented by a class to allow its inst
ances to be invoked |
2503 * as if they were a function. | 2537 * as if they were a function. |
2504 */ | 2538 */ |
2505 static String CALL_METHOD_NAME = "call"; | 2539 static String CALL_METHOD_NAME = "call"; |
2506 | 2540 |
2507 /** | 2541 /** |
2508 * The name of the method that will be invoked if an attempt is made to invoke
an undefined method | 2542 * The name of the method that will be invoked if an attempt is made to invoke
an undefined method |
2509 * on an object. | 2543 * on an object. |
2510 */ | 2544 */ |
2511 static String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod"; | 2545 static String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod"; |
2512 | 2546 |
2513 /** | 2547 /** |
2514 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 2548 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
2515 * | 2549 * |
2516 * @param resolver the resolver driving this participant | 2550 * @param resolver the resolver driving this participant |
2517 */ | 2551 */ |
2518 ElementResolver(ResolverVisitor resolver) { | 2552 ElementResolver(ResolverVisitor resolver) { |
2519 this._resolver = resolver; | 2553 this._resolver = resolver; |
2520 _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode; | 2554 _strictMode = resolver.definingLibrary.context.analysisOptions.strictMode; |
| 2555 _dynamicType = resolver.typeProvider.dynamicType; |
| 2556 _typeType = resolver.typeProvider.typeType; |
2521 } | 2557 } |
2522 Object visitAssignmentExpression(AssignmentExpression node) { | 2558 Object visitAssignmentExpression(AssignmentExpression node) { |
2523 sc.Token operator = node.operator; | 2559 sc.Token operator = node.operator; |
2524 sc.TokenType operatorType = operator.type; | 2560 sc.TokenType operatorType = operator.type; |
2525 if (operatorType != sc.TokenType.EQ) { | 2561 if (operatorType != sc.TokenType.EQ) { |
2526 operatorType = operatorFromCompoundAssignment(operatorType); | 2562 operatorType = operatorFromCompoundAssignment(operatorType); |
2527 Expression leftHandSide = node.leftHandSide; | 2563 Expression leftHandSide = node.leftHandSide; |
2528 if (leftHandSide != null) { | 2564 if (leftHandSide != null) { |
2529 String methodName = operatorType.lexeme; | 2565 String methodName = operatorType.lexeme; |
2530 Type2 staticType = getStaticType(leftHandSide); | 2566 Type2 staticType = getStaticType(leftHandSide); |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2861 } | 2897 } |
2862 if (propagatedElement != null) { | 2898 if (propagatedElement != null) { |
2863 List<ParameterElement> parameters = computeCorrespondingParameters(argumen
tList, propagatedElement); | 2899 List<ParameterElement> parameters = computeCorrespondingParameters(argumen
tList, propagatedElement); |
2864 if (parameters != null) { | 2900 if (parameters != null) { |
2865 argumentList.correspondingPropagatedParameters = parameters; | 2901 argumentList.correspondingPropagatedParameters = parameters; |
2866 } | 2902 } |
2867 } | 2903 } |
2868 ErrorCode errorCode = checkForInvocationError(target, staticElement); | 2904 ErrorCode errorCode = checkForInvocationError(target, staticElement); |
2869 if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION))
{ | 2905 if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION))
{ |
2870 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, me
thodName, [methodName.name]); | 2906 _resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, me
thodName, [methodName.name]); |
2871 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) { | 2907 } else if (identical(errorCode, CompileTimeErrorCode.UNDEFINED_FUNCTION)) { |
2872 _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName
, [methodName.name]); | 2908 _resolver.reportError(CompileTimeErrorCode.UNDEFINED_FUNCTION, methodName,
[methodName.name]); |
2873 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { | 2909 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { |
2874 String targetTypeName; | 2910 String targetTypeName; |
2875 if (target == null) { | 2911 if (target == null) { |
2876 ClassElement enclosingClass = _resolver.enclosingClass; | 2912 ClassElement enclosingClass = _resolver.enclosingClass; |
2877 targetTypeName = enclosingClass.displayName; | 2913 targetTypeName = enclosingClass.displayName; |
2878 } else { | 2914 } else { |
2879 Type2 targetType = getStaticType(target); | 2915 Type2 targetType = getStaticType(target); |
2880 if (targetType != null && targetType.isDartCoreFunction && methodName.na
me == CALL_METHOD_NAME) { | 2916 if (targetType != null && targetType.isDartCoreFunction && methodName.na
me == CALL_METHOD_NAME) { |
2881 return null; | 2917 return null; |
2882 } | 2918 } |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3000 List<ParameterElement> parameters = resolveArgumentsToParameters(false, argu
mentList, element); | 3036 List<ParameterElement> parameters = resolveArgumentsToParameters(false, argu
mentList, element); |
3001 if (parameters != null) { | 3037 if (parameters != null) { |
3002 argumentList.correspondingStaticParameters = parameters; | 3038 argumentList.correspondingStaticParameters = parameters; |
3003 } | 3039 } |
3004 return null; | 3040 return null; |
3005 } | 3041 } |
3006 Object visitSimpleIdentifier(SimpleIdentifier node) { | 3042 Object visitSimpleIdentifier(SimpleIdentifier node) { |
3007 if (node.staticElement != null || node.element != null) { | 3043 if (node.staticElement != null || node.element != null) { |
3008 return null; | 3044 return null; |
3009 } | 3045 } |
| 3046 if (node.name == _dynamicType.name) { |
| 3047 recordResolution(node, _dynamicType.element); |
| 3048 node.staticType = _typeType; |
| 3049 return null; |
| 3050 } |
3010 Element element = resolveSimpleIdentifier(node); | 3051 Element element = resolveSimpleIdentifier(node); |
3011 if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingCl
ass) { | 3052 if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingCl
ass) { |
3012 _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLAS
S, node, []); | 3053 _resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLAS
S, node, []); |
3013 } else if (element == null || (element is PrefixElement && !isValidAsPrefix(
node))) { | 3054 } else if (element == null || (element is PrefixElement && !isValidAsPrefix(
node))) { |
3014 if (isConstructorReturnType(node)) { | 3055 if (isConstructorReturnType(node)) { |
3015 _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, nod
e, []); | 3056 _resolver.reportError(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, nod
e, []); |
3016 } else { | 3057 } else { |
3017 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [nod
e.name]); | 3058 _resolver.reportError(StaticWarningCode.UNDEFINED_IDENTIFIER, node, [nod
e.name]); |
3018 } | 3059 } |
3019 } | 3060 } |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3104 | 3145 |
3105 /** | 3146 /** |
3106 * Given that we have found code to invoke the given element, return the error
code that should be | 3147 * Given that we have found code to invoke the given element, return the error
code that should be |
3107 * reported, or `null` if no error should be reported. | 3148 * reported, or `null` if no error should be reported. |
3108 * | 3149 * |
3109 * @param target the target of the invocation, or `null` if there was no targe
t | 3150 * @param target the target of the invocation, or `null` if there was no targe
t |
3110 * @param element the element to be invoked | 3151 * @param element the element to be invoked |
3111 * @return the error code that should be reported | 3152 * @return the error code that should be reported |
3112 */ | 3153 */ |
3113 ErrorCode checkForInvocationError(Expression target, Element element) { | 3154 ErrorCode checkForInvocationError(Expression target, Element element) { |
| 3155 if (element is PrefixElement) { |
| 3156 element = null; |
| 3157 } |
3114 if (element is PropertyAccessorElement) { | 3158 if (element is PropertyAccessorElement) { |
3115 FunctionType getterType = ((element as PropertyAccessorElement)).type; | 3159 FunctionType getterType = ((element as PropertyAccessorElement)).type; |
3116 if (getterType != null) { | 3160 if (getterType != null) { |
3117 Type2 returnType = getterType.returnType; | 3161 Type2 returnType = getterType.returnType; |
3118 if (!isExecutableType(returnType)) { | 3162 if (!isExecutableType(returnType)) { |
3119 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; | 3163 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; |
3120 } | 3164 } |
3121 } | 3165 } |
3122 } else if (element is ExecutableElement) { | 3166 } else if (element is ExecutableElement) { |
3123 return null; | 3167 return null; |
(...skipping 10 matching lines...) Expand all Loading... |
3134 } | 3178 } |
3135 } | 3179 } |
3136 } else if (element is VariableElement) { | 3180 } else if (element is VariableElement) { |
3137 Type2 variableType = ((element as VariableElement)).type; | 3181 Type2 variableType = ((element as VariableElement)).type; |
3138 if (!isExecutableType(variableType)) { | 3182 if (!isExecutableType(variableType)) { |
3139 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; | 3183 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; |
3140 } | 3184 } |
3141 } else { | 3185 } else { |
3142 if (target == null) { | 3186 if (target == null) { |
3143 ClassElement enclosingClass = _resolver.enclosingClass; | 3187 ClassElement enclosingClass = _resolver.enclosingClass; |
3144 if (enclosingClass == null) { | 3188 if (element == null) { |
3145 return StaticTypeWarningCode.UNDEFINED_FUNCTION; | 3189 if (enclosingClass == null) { |
3146 } else if (element == null) { | 3190 return CompileTimeErrorCode.UNDEFINED_FUNCTION; |
3147 return StaticTypeWarningCode.UNDEFINED_METHOD; | 3191 } else { |
| 3192 return StaticTypeWarningCode.UNDEFINED_METHOD; |
| 3193 } |
3148 } else { | 3194 } else { |
3149 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; | 3195 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; |
3150 } | 3196 } |
3151 } else { | 3197 } else { |
3152 Type2 targetType = getStaticType(target); | 3198 Type2 targetType = getStaticType(target); |
3153 if (targetType == null) { | 3199 if (targetType == null) { |
3154 return StaticTypeWarningCode.UNDEFINED_FUNCTION; | 3200 return CompileTimeErrorCode.UNDEFINED_FUNCTION; |
3155 } else if (!targetType.isDynamic) { | 3201 } else if (!targetType.isDynamic) { |
3156 return StaticTypeWarningCode.UNDEFINED_METHOD; | 3202 return StaticTypeWarningCode.UNDEFINED_METHOD; |
3157 } | 3203 } |
3158 } | 3204 } |
3159 } | 3205 } |
3160 } | 3206 } |
3161 return null; | 3207 return null; |
3162 } | 3208 } |
3163 | 3209 |
3164 /** | 3210 /** |
(...skipping 1276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4441 return resultMap; | 4487 return resultMap; |
4442 } | 4488 } |
4443 if (superclassElt != null) { | 4489 if (superclassElt != null) { |
4444 if (!visitedClasses.contains(superclassElt)) { | 4490 if (!visitedClasses.contains(superclassElt)) { |
4445 javaSetAdd(visitedClasses, classElt); | 4491 javaSetAdd(visitedClasses, classElt); |
4446 resultMap = new Map<String, ExecutableElement>.from(computeClassChainLoo
kupMap(superclassElt, visitedClasses)); | 4492 resultMap = new Map<String, ExecutableElement>.from(computeClassChainLoo
kupMap(superclassElt, visitedClasses)); |
4447 } else { | 4493 } else { |
4448 _classLookup[superclassElt] = resultMap; | 4494 _classLookup[superclassElt] = resultMap; |
4449 return resultMap; | 4495 return resultMap; |
4450 } | 4496 } |
4451 recordMapWithClassMembers(resultMap, superclassElt); | 4497 recordMapWithClassMembers(resultMap, supertype); |
4452 } | 4498 } |
4453 List<InterfaceType> mixins = classElt.mixins; | 4499 List<InterfaceType> mixins = classElt.mixins; |
4454 for (int i = mixins.length - 1; i >= 0; i--) { | 4500 for (int i = mixins.length - 1; i >= 0; i--) { |
4455 ClassElement mixinElement = mixins[i].element; | 4501 recordMapWithClassMembers(resultMap, mixins[i]); |
4456 if (mixinElement != null) { | |
4457 recordMapWithClassMembers(resultMap, mixinElement); | |
4458 } | |
4459 } | 4502 } |
4460 _classLookup[classElt] = resultMap; | 4503 _classLookup[classElt] = resultMap; |
4461 return resultMap; | 4504 return resultMap; |
4462 } | 4505 } |
4463 | 4506 |
4464 /** | 4507 /** |
4465 * Compute and return the inheritance path given the context of a type and a m
ember that is | 4508 * Compute and return the inheritance path given the context of a type and a m
ember that is |
4466 * overridden in the inheritance path (for which the type is in the path). | 4509 * overridden in the inheritance path (for which the type is in the path). |
4467 * | 4510 * |
4468 * @param chain the inheritance path that is built up as this method calls its
elf recursively, | 4511 * @param chain the inheritance path that is built up as this method calls its
elf recursively, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4523 Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt]; | 4566 Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt]; |
4524 if (resultMap != null) { | 4567 if (resultMap != null) { |
4525 return resultMap; | 4568 return resultMap; |
4526 } else { | 4569 } else { |
4527 resultMap = new Map<String, ExecutableElement>(); | 4570 resultMap = new Map<String, ExecutableElement>(); |
4528 } | 4571 } |
4529 InterfaceType supertype = classElt.supertype; | 4572 InterfaceType supertype = classElt.supertype; |
4530 ClassElement superclassElement = supertype != null ? supertype.element : nul
l; | 4573 ClassElement superclassElement = supertype != null ? supertype.element : nul
l; |
4531 List<InterfaceType> mixins = classElt.mixins; | 4574 List<InterfaceType> mixins = classElt.mixins; |
4532 List<InterfaceType> interfaces = classElt.interfaces; | 4575 List<InterfaceType> interfaces = classElt.interfaces; |
4533 if ((superclassElement == null || supertype.isObject) && mixins.length == 0
&& interfaces.length == 0) { | |
4534 _interfaceLookup[classElt] = resultMap; | |
4535 return resultMap; | |
4536 } | |
4537 List<Map<String, ExecutableElement>> lookupMaps = new List<Map<String, Execu
tableElement>>(); | 4576 List<Map<String, ExecutableElement>> lookupMaps = new List<Map<String, Execu
tableElement>>(); |
4538 if (superclassElement != null) { | 4577 if (superclassElement != null) { |
4539 if (!visitedInterfaces.contains(superclassElement)) { | 4578 if (!visitedInterfaces.contains(superclassElement)) { |
4540 try { | 4579 try { |
4541 javaSetAdd(visitedInterfaces, superclassElement); | 4580 javaSetAdd(visitedInterfaces, superclassElement); |
4542 lookupMaps.add(computeInterfaceLookupMap(superclassElement, visitedInt
erfaces)); | 4581 Map<String, ExecutableElement> map = computeInterfaceLookupMap(supercl
assElement, visitedInterfaces); |
| 4582 map = new Map<String, ExecutableElement>.from(map); |
| 4583 List<MethodElement> methods = supertype.methods; |
| 4584 for (MethodElement method in methods) { |
| 4585 if (method.isAccessibleIn(_library) && !method.isStatic) { |
| 4586 map[method.name] = method; |
| 4587 } |
| 4588 } |
| 4589 List<PropertyAccessorElement> accessors = supertype.accessors; |
| 4590 for (PropertyAccessorElement accessor in accessors) { |
| 4591 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) { |
| 4592 map[accessor.name] = accessor; |
| 4593 } |
| 4594 } |
| 4595 lookupMaps.add(map); |
4543 } finally { | 4596 } finally { |
4544 visitedInterfaces.remove(superclassElement); | 4597 visitedInterfaces.remove(superclassElement); |
4545 } | 4598 } |
4546 } else { | 4599 } else { |
4547 Map<String, ExecutableElement> map = _interfaceLookup[classElt]; | 4600 Map<String, ExecutableElement> map = _interfaceLookup[classElt]; |
4548 if (map != null) { | 4601 if (map != null) { |
4549 lookupMaps.add(map); | 4602 lookupMaps.add(map); |
4550 } else { | 4603 } else { |
4551 _interfaceLookup[superclassElement] = resultMap; | 4604 _interfaceLookup[superclassElement] = resultMap; |
4552 return resultMap; | 4605 return resultMap; |
4553 } | 4606 } |
4554 } | 4607 } |
4555 } | 4608 } |
4556 for (InterfaceType mixinType in mixins) { | 4609 for (InterfaceType mixinType in mixins) { |
4557 ClassElement mixinElement = mixinType.element; | |
4558 if (mixinElement == null) { | |
4559 continue; | |
4560 } | |
4561 Map<String, ExecutableElement> mapWithMixinMembers = new Map<String, Execu
tableElement>(); | 4610 Map<String, ExecutableElement> mapWithMixinMembers = new Map<String, Execu
tableElement>(); |
4562 recordMapWithClassMembers(mapWithMixinMembers, mixinElement); | 4611 recordMapWithClassMembers(mapWithMixinMembers, mixinType); |
4563 lookupMaps.add(mapWithMixinMembers); | 4612 lookupMaps.add(mapWithMixinMembers); |
4564 } | 4613 } |
4565 for (InterfaceType interfaceType in interfaces) { | 4614 for (InterfaceType interfaceType in interfaces) { |
4566 ClassElement interfaceElement = interfaceType.element; | 4615 ClassElement interfaceElement = interfaceType.element; |
4567 if (interfaceElement != null) { | 4616 if (interfaceElement != null) { |
4568 if (!visitedInterfaces.contains(interfaceElement)) { | 4617 if (!visitedInterfaces.contains(interfaceElement)) { |
4569 try { | 4618 try { |
4570 javaSetAdd(visitedInterfaces, interfaceElement); | 4619 javaSetAdd(visitedInterfaces, interfaceElement); |
4571 lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedIn
terfaces)); | 4620 Map<String, ExecutableElement> map = computeInterfaceLookupMap(inter
faceElement, visitedInterfaces); |
| 4621 map = new Map<String, ExecutableElement>.from(map); |
| 4622 List<MethodElement> methods = interfaceType.methods; |
| 4623 for (MethodElement method in methods) { |
| 4624 if (method.isAccessibleIn(_library) && !method.isStatic) { |
| 4625 map[method.name] = method; |
| 4626 } |
| 4627 } |
| 4628 List<PropertyAccessorElement> accessors = interfaceType.accessors; |
| 4629 for (PropertyAccessorElement accessor in accessors) { |
| 4630 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) { |
| 4631 map[accessor.name] = accessor; |
| 4632 } |
| 4633 } |
| 4634 lookupMaps.add(map); |
4572 } finally { | 4635 } finally { |
4573 visitedInterfaces.remove(interfaceElement); | 4636 visitedInterfaces.remove(interfaceElement); |
4574 } | 4637 } |
4575 } else { | 4638 } else { |
4576 Map<String, ExecutableElement> map = _interfaceLookup[classElt]; | 4639 Map<String, ExecutableElement> map = _interfaceLookup[classElt]; |
4577 if (map != null) { | 4640 if (map != null) { |
4578 lookupMaps.add(map); | 4641 lookupMaps.add(map); |
4579 } else { | 4642 } else { |
4580 _interfaceLookup[interfaceElement] = resultMap; | 4643 _interfaceLookup[interfaceElement] = resultMap; |
4581 return resultMap; | 4644 return resultMap; |
4582 } | 4645 } |
4583 } | 4646 } |
4584 } | 4647 } |
4585 } | 4648 } |
4586 if (lookupMaps.length == 0) { | 4649 if (lookupMaps.length == 0) { |
4587 _interfaceLookup[classElt] = resultMap; | 4650 _interfaceLookup[classElt] = resultMap; |
4588 return resultMap; | 4651 return resultMap; |
4589 } | 4652 } |
4590 Map<String, Set<ExecutableElement>> unionMap = new Map<String, Set<Executabl
eElement>>(); | 4653 Map<String, Set<ExecutableElement>> unionMap = new Map<String, Set<Executabl
eElement>>(); |
4591 for (Map<String, ExecutableElement> lookupMap in lookupMaps) { | 4654 for (Map<String, ExecutableElement> lookupMap in lookupMaps) { |
4592 for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(lookupMap
)) { | 4655 for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(lookupMap
)) { |
4593 String key = entry.getKey(); | 4656 String key = entry.getKey(); |
4594 if (!unionMap.containsKey(key)) { | 4657 Set<ExecutableElement> set = unionMap[key]; |
4595 Set<ExecutableElement> set = new Set<ExecutableElement>(); | 4658 if (set == null) { |
4596 javaSetAdd(set, entry.getValue()); | 4659 set = new Set<ExecutableElement>(); |
4597 unionMap[key] = set; | 4660 unionMap[key] = set; |
4598 } else { | |
4599 javaSetAdd(unionMap[key], entry.getValue()); | |
4600 } | 4661 } |
4601 } | 4662 javaSetAdd(set, entry.getValue()); |
4602 } | |
4603 if (superclassElement != null) { | |
4604 List<MethodElement> methods = superclassElement.methods; | |
4605 for (MethodElement method in methods) { | |
4606 if (method.isAccessibleIn(_library) && !method.isStatic) { | |
4607 String key = method.name; | |
4608 if (!unionMap.containsKey(key)) { | |
4609 Set<ExecutableElement> set = new Set<ExecutableElement>(); | |
4610 javaSetAdd(set, method); | |
4611 unionMap[key] = set; | |
4612 } else { | |
4613 javaSetAdd(unionMap[key], method); | |
4614 } | |
4615 } | |
4616 } | |
4617 List<PropertyAccessorElement> accessors = superclassElement.accessors; | |
4618 for (PropertyAccessorElement accessor in accessors) { | |
4619 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) { | |
4620 String key = accessor.name; | |
4621 if (!unionMap.containsKey(key)) { | |
4622 Set<ExecutableElement> set = new Set<ExecutableElement>(); | |
4623 javaSetAdd(set, accessor); | |
4624 unionMap[key] = set; | |
4625 } else { | |
4626 javaSetAdd(unionMap[key], accessor); | |
4627 } | |
4628 } | |
4629 } | |
4630 } | |
4631 for (InterfaceType interfaceType in interfaces) { | |
4632 ClassElement interfaceElement = interfaceType.element; | |
4633 if (interfaceElement != null) { | |
4634 List<MethodElement> methods = interfaceElement.methods; | |
4635 for (MethodElement method in methods) { | |
4636 if (method.isAccessibleIn(_library) && !method.isStatic) { | |
4637 String key = method.name; | |
4638 if (!unionMap.containsKey(key)) { | |
4639 Set<ExecutableElement> set = new Set<ExecutableElement>(); | |
4640 javaSetAdd(set, method); | |
4641 unionMap[key] = set; | |
4642 } else { | |
4643 javaSetAdd(unionMap[key], method); | |
4644 } | |
4645 } | |
4646 } | |
4647 List<PropertyAccessorElement> accessors = interfaceElement.accessors; | |
4648 for (PropertyAccessorElement accessor in accessors) { | |
4649 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) { | |
4650 String key = accessor.name; | |
4651 if (!unionMap.containsKey(key)) { | |
4652 Set<ExecutableElement> set = new Set<ExecutableElement>(); | |
4653 javaSetAdd(set, accessor); | |
4654 unionMap[key] = set; | |
4655 } else { | |
4656 javaSetAdd(unionMap[key], accessor); | |
4657 } | |
4658 } | |
4659 } | |
4660 } | 4663 } |
4661 } | 4664 } |
4662 for (MapEntry<String, Set<ExecutableElement>> entry in getMapEntrySet(unionM
ap)) { | 4665 for (MapEntry<String, Set<ExecutableElement>> entry in getMapEntrySet(unionM
ap)) { |
4663 String key = entry.getKey(); | 4666 String key = entry.getKey(); |
4664 Set<ExecutableElement> set = entry.getValue(); | 4667 Set<ExecutableElement> set = entry.getValue(); |
4665 int numOfEltsWithMatchingNames = set.length; | 4668 int numOfEltsWithMatchingNames = set.length; |
4666 if (numOfEltsWithMatchingNames == 1) { | 4669 if (numOfEltsWithMatchingNames == 1) { |
4667 resultMap[key] = new JavaIterator(set).next(); | 4670 resultMap[key] = new JavaIterator(set).next(); |
4668 } else { | 4671 } else { |
4669 bool allMethods = true; | 4672 bool allMethods = true; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4743 List<PropertyAccessorElement> accessors = classElt.accessors; | 4746 List<PropertyAccessorElement> accessors = classElt.accessors; |
4744 for (PropertyAccessorElement accessor in accessors) { | 4747 for (PropertyAccessorElement accessor in accessors) { |
4745 if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !a
ccessor.isStatic) { | 4748 if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !a
ccessor.isStatic) { |
4746 return accessor; | 4749 return accessor; |
4747 } | 4750 } |
4748 } | 4751 } |
4749 return null; | 4752 return null; |
4750 } | 4753 } |
4751 | 4754 |
4752 /** | 4755 /** |
4753 * Record the passed map with the set of all members (methods, getters and set
ters) in the class | 4756 * Record the passed map with the set of all members (methods, getters and set
ters) in the type |
4754 * into the passed map. | 4757 * into the passed map. |
4755 * | 4758 * |
4756 * @param map some non-`null` map to put the methods and accessors from the pa
ssed | 4759 * @param map some non-`null` map to put the methods and accessors from the pa
ssed |
4757 * [ClassElement] into | 4760 * [ClassElement] into |
4758 * @param classElt the class element that will be recorded into the passed map | 4761 * @param type the type that will be recorded into the passed map |
4759 */ | 4762 */ |
4760 void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElemen
t classElt) { | 4763 void recordMapWithClassMembers(Map<String, ExecutableElement> map, InterfaceTy
pe type) { |
4761 List<MethodElement> methods = classElt.methods; | 4764 List<MethodElement> methods = type.methods; |
4762 for (MethodElement method in methods) { | 4765 for (MethodElement method in methods) { |
4763 if (method.isAccessibleIn(_library) && !method.isStatic) { | 4766 if (method.isAccessibleIn(_library) && !method.isStatic) { |
4764 map[method.name] = method; | 4767 map[method.name] = method; |
4765 } | 4768 } |
4766 } | 4769 } |
4767 List<PropertyAccessorElement> accessors = classElt.accessors; | 4770 List<PropertyAccessorElement> accessors = type.accessors; |
4768 for (PropertyAccessorElement accessor in accessors) { | 4771 for (PropertyAccessorElement accessor in accessors) { |
4769 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) { | 4772 if (accessor.isAccessibleIn(_library) && !accessor.isStatic) { |
4770 map[accessor.name] = accessor; | 4773 map[accessor.name] = accessor; |
4771 } | 4774 } |
4772 } | 4775 } |
4773 } | 4776 } |
4774 | 4777 |
4775 /** | 4778 /** |
4776 * This method is used to report errors on when they are found computing inher
itance information. | 4779 * This method is used to report errors on when they are found computing inher
itance information. |
4777 * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where thes
e generated | 4780 * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where thes
e generated |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4843 | 4846 |
4844 /** | 4847 /** |
4845 * A list containing all of the libraries that are exported from this library. | 4848 * A list containing all of the libraries that are exported from this library. |
4846 */ | 4849 */ |
4847 List<Library> _exportedLibraries = _EMPTY_ARRAY; | 4850 List<Library> _exportedLibraries = _EMPTY_ARRAY; |
4848 | 4851 |
4849 /** | 4852 /** |
4850 * A table mapping the sources for the compilation units in this library to th
eir corresponding | 4853 * A table mapping the sources for the compilation units in this library to th
eir corresponding |
4851 * AST structures. | 4854 * AST structures. |
4852 */ | 4855 */ |
4853 Map<Source, CompilationUnit> _astMap = new Map<Source, CompilationUnit>(); | 4856 Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCom
pilationUnit>(); |
4854 | 4857 |
4855 /** | 4858 /** |
4856 * The library scope used when resolving elements within this library's compil
ation units. | 4859 * The library scope used when resolving elements within this library's compil
ation units. |
4857 */ | 4860 */ |
4858 LibraryScope _libraryScope; | 4861 LibraryScope _libraryScope; |
4859 | 4862 |
4860 /** | 4863 /** |
4861 * An empty array that can be used to initialize lists of libraries. | 4864 * An empty array that can be used to initialize lists of libraries. |
4862 */ | 4865 */ |
4863 static List<Library> _EMPTY_ARRAY = new List<Library>(0); | 4866 static List<Library> _EMPTY_ARRAY = new List<Library>(0); |
(...skipping 13 matching lines...) Expand all Loading... |
4877 } | 4880 } |
4878 | 4881 |
4879 /** | 4882 /** |
4880 * Return the AST structure associated with the given source. | 4883 * Return the AST structure associated with the given source. |
4881 * | 4884 * |
4882 * @param source the source representing the compilation unit whose AST is to
be returned | 4885 * @param source the source representing the compilation unit whose AST is to
be returned |
4883 * @return the AST structure associated with the given source | 4886 * @return the AST structure associated with the given source |
4884 * @throws AnalysisException if an AST structure could not be created for the
compilation unit | 4887 * @throws AnalysisException if an AST structure could not be created for the
compilation unit |
4885 */ | 4888 */ |
4886 CompilationUnit getAST(Source source) { | 4889 CompilationUnit getAST(Source source) { |
4887 CompilationUnit unit = _astMap[source]; | 4890 ResolvableCompilationUnit holder = _astMap[source]; |
4888 if (unit == null) { | 4891 if (holder == null) { |
4889 unit = _analysisContext.computeResolvableCompilationUnit(source); | 4892 holder = _analysisContext.computeResolvableCompilationUnit(source); |
4890 _astMap[source] = unit; | 4893 _astMap[source] = holder; |
4891 } | 4894 } |
4892 return unit; | 4895 return holder.compilationUnit; |
4893 } | 4896 } |
4894 | 4897 |
4895 /** | 4898 /** |
4896 * Return an array of the [CompilationUnit]s that make up the library. The fir
st unit is | 4899 * Return an array of the [CompilationUnit]s that make up the library. The fir
st unit is |
4897 * always the defining unit. | 4900 * always the defining unit. |
4898 * | 4901 * |
4899 * @return an array of the [CompilationUnit]s that make up the library. The fi
rst unit is | 4902 * @return an array of the [CompilationUnit]s that make up the library. The fi
rst unit is |
4900 * always the defining unit | 4903 * always the defining unit |
4901 */ | 4904 */ |
4902 List<CompilationUnit> get compilationUnits { | 4905 List<CompilationUnit> get compilationUnits { |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5006 } | 5009 } |
5007 | 5010 |
5008 /** | 5011 /** |
5009 * Return the source specifying the defining compilation unit of this library. | 5012 * Return the source specifying the defining compilation unit of this library. |
5010 * | 5013 * |
5011 * @return the source specifying the defining compilation unit of this library | 5014 * @return the source specifying the defining compilation unit of this library |
5012 */ | 5015 */ |
5013 Source get librarySource => _librarySource; | 5016 Source get librarySource => _librarySource; |
5014 | 5017 |
5015 /** | 5018 /** |
| 5019 * Return the modification stamp associated with the given source. |
| 5020 * |
| 5021 * @param source the source representing the compilation unit whose AST is to
be returned |
| 5022 * @return the AST structure associated with the given source |
| 5023 * @throws AnalysisException if an AST structure could not be created for the
compilation unit |
| 5024 */ |
| 5025 int getModificationStamp(Source source) { |
| 5026 ResolvableCompilationUnit holder = _astMap[source]; |
| 5027 if (holder == null) { |
| 5028 holder = _analysisContext.computeResolvableCompilationUnit(source); |
| 5029 _astMap[source] = holder; |
| 5030 } |
| 5031 return holder.modificationStamp; |
| 5032 } |
| 5033 |
| 5034 /** |
5016 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the | 5035 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the |
5017 * library, or `null` if the URI is not valid. If the URI is not valid, report
the error. | 5036 * library, or `null` if the URI is not valid. If the URI is not valid, report
the error. |
5018 * | 5037 * |
5019 * @param directive the directive which URI should be resolved | 5038 * @param directive the directive which URI should be resolved |
5020 * @return the result of resolving the URI against the URI of the library | 5039 * @return the result of resolving the URI against the URI of the library |
5021 */ | 5040 */ |
5022 Source getSource(UriBasedDirective directive) { | 5041 Source getSource(UriBasedDirective directive) { |
5023 StringLiteral uriLiteral = directive.uri; | 5042 StringLiteral uriLiteral = directive.uri; |
5024 if (uriLiteral is StringInterpolation) { | 5043 if (uriLiteral is StringInterpolation) { |
5025 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o
ffset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, [])); | 5044 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o
ffset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, [])); |
5026 return null; | 5045 return null; |
5027 } | 5046 } |
5028 String uriContent = uriLiteral.stringValue.trim(); | 5047 String uriContent = uriLiteral.stringValue.trim(); |
5029 _directiveUris[directive] = uriContent; | 5048 _directiveUris[directive] = uriContent; |
5030 uriContent = Uri.encodeFull(uriContent); | 5049 uriContent = Uri.encodeFull(uriContent); |
5031 try { | 5050 try { |
5032 parseUriWithException(uriContent); | 5051 parseUriWithException(uriContent); |
5033 Source source = getSource2(uriContent); | 5052 Source source = _analysisContext.sourceFactory.resolveUri(_librarySource,
uriContent); |
5034 if (source == null || !source.exists()) { | 5053 if (source == null || !source.exists()) { |
5035 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral
.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent
])); | 5054 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral
.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent
])); |
5036 } | 5055 } |
5037 return source; | 5056 return source; |
5038 } on URISyntaxException catch (exception) { | 5057 } on URISyntaxException catch (exception) { |
5039 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o
ffset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent])); | 5058 _errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.o
ffset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent])); |
5040 } | 5059 } |
5041 return null; | 5060 return null; |
5042 } | 5061 } |
5043 | 5062 |
5044 /** | 5063 /** |
5045 * Returns the URI value of the given directive. | 5064 * Returns the URI value of the given directive. |
5046 */ | 5065 */ |
5047 String getUri(UriBasedDirective directive) => _directiveUris[directive]; | 5066 String getUri(UriBasedDirective directive) => _directiveUris[directive]; |
5048 | 5067 |
5049 /** | 5068 /** |
5050 * Set the AST structure associated with the defining compilation unit for thi
s library to the | 5069 * Set the AST structure associated with the defining compilation unit for thi
s library to the |
5051 * given AST structure. | 5070 * given AST structure. |
5052 * | 5071 * |
| 5072 * @param modificationStamp the modification time of the source from which the
compilation unit |
| 5073 * was created |
5053 * @param unit the AST structure associated with the defining compilation unit
for this library | 5074 * @param unit the AST structure associated with the defining compilation unit
for this library |
5054 */ | 5075 */ |
5055 void set definingCompilationUnit(CompilationUnit unit) { | 5076 void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) { |
5056 _astMap[_librarySource] = unit; | 5077 _astMap[_librarySource] = new ResolvableCompilationUnit(modificationStamp, u
nit); |
5057 } | 5078 } |
5058 | 5079 |
5059 /** | 5080 /** |
5060 * Set whether this library explicitly imports core to match the given value. | 5081 * Set whether this library explicitly imports core to match the given value. |
5061 * | 5082 * |
5062 * @param explicitlyImportsCore `true` if this library explicitly imports core | 5083 * @param explicitlyImportsCore `true` if this library explicitly imports core |
5063 */ | 5084 */ |
5064 void set explicitlyImportsCore(bool explicitlyImportsCore2) { | 5085 void set explicitlyImportsCore(bool explicitlyImportsCore2) { |
5065 this._explicitlyImportsCore = explicitlyImportsCore2; | 5086 this._explicitlyImportsCore = explicitlyImportsCore2; |
5066 } | 5087 } |
(...skipping 21 matching lines...) Expand all Loading... |
5088 * | 5109 * |
5089 * @param libraryElement the library element representing this library | 5110 * @param libraryElement the library element representing this library |
5090 */ | 5111 */ |
5091 void set libraryElement(LibraryElementImpl libraryElement2) { | 5112 void set libraryElement(LibraryElementImpl libraryElement2) { |
5092 this._libraryElement = libraryElement2; | 5113 this._libraryElement = libraryElement2; |
5093 if (_inheritanceManager != null) { | 5114 if (_inheritanceManager != null) { |
5094 _inheritanceManager.libraryElement = libraryElement2; | 5115 _inheritanceManager.libraryElement = libraryElement2; |
5095 } | 5116 } |
5096 } | 5117 } |
5097 String toString() => _librarySource.shortName; | 5118 String toString() => _librarySource.shortName; |
5098 | |
5099 /** | |
5100 * Return the result of resolving the given URI against the URI of the library
, or `null` if | |
5101 * the URI is not valid. | |
5102 * | |
5103 * @param uri the URI to be resolved | |
5104 * @return the result of resolving the given URI against the URI of the librar
y | |
5105 */ | |
5106 Source getSource2(String uri) { | |
5107 if (uri == null) { | |
5108 return null; | |
5109 } | |
5110 return _analysisContext.sourceFactory.resolveUri(_librarySource, uri); | |
5111 } | |
5112 } | 5119 } |
5113 /** | 5120 /** |
5114 * Instances of the class `LibraryElementBuilder` build an element model for a s
ingle library. | 5121 * Instances of the class `LibraryElementBuilder` build an element model for a s
ingle library. |
5115 * | 5122 * |
5116 * @coverage dart.engine.resolver | 5123 * @coverage dart.engine.resolver |
5117 */ | 5124 */ |
5118 class LibraryElementBuilder { | 5125 class LibraryElementBuilder { |
5119 | 5126 |
5120 /** | 5127 /** |
5121 * The analysis context in which the element model will be built. | 5128 * The analysis context in which the element model will be built. |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5381 * @return an array containing the libraries that were resolved | 5388 * @return an array containing the libraries that were resolved |
5382 */ | 5389 */ |
5383 Set<Library> get resolvedLibraries => _librariesInCycles; | 5390 Set<Library> get resolvedLibraries => _librariesInCycles; |
5384 | 5391 |
5385 /** | 5392 /** |
5386 * Resolve the library specified by the given source in the given context. The
library is assumed | 5393 * Resolve the library specified by the given source in the given context. The
library is assumed |
5387 * to be embedded in the given source. | 5394 * to be embedded in the given source. |
5388 * | 5395 * |
5389 * @param librarySource the source specifying the defining compilation unit of
the library to be | 5396 * @param librarySource the source specifying the defining compilation unit of
the library to be |
5390 * resolved | 5397 * resolved |
| 5398 * @param modificationStamp the time stamp of the source from which the compil
ation unit was |
| 5399 * created |
5391 * @param unit the compilation unit representing the embedded library | 5400 * @param unit the compilation unit representing the embedded library |
5392 * @param fullAnalysis `true` if a full analysis should be performed | 5401 * @param fullAnalysis `true` if a full analysis should be performed |
5393 * @return the element representing the resolved library | 5402 * @return the element representing the resolved library |
5394 * @throws AnalysisException if the library could not be resolved for some rea
son | 5403 * @throws AnalysisException if the library could not be resolved for some rea
son |
5395 */ | 5404 */ |
5396 LibraryElement resolveEmbeddedLibrary(Source librarySource, CompilationUnit un
it, bool fullAnalysis) { | 5405 LibraryElement resolveEmbeddedLibrary(Source librarySource, int modificationSt
amp, CompilationUnit unit, bool fullAnalysis) { |
5397 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi
ne.LibraryResolver.resolveEmbeddedLibrary"); | 5406 InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engi
ne.LibraryResolver.resolveEmbeddedLibrary"); |
5398 try { | 5407 try { |
5399 instrumentation.metric("fullAnalysis", fullAnalysis); | 5408 instrumentation.metric("fullAnalysis", fullAnalysis); |
5400 instrumentation.data3("fullName", librarySource.fullName); | 5409 instrumentation.data3("fullName", librarySource.fullName); |
5401 Library targetLibrary = createLibrary2(librarySource, unit); | 5410 Library targetLibrary = createLibrary2(librarySource, modificationStamp, u
nit); |
5402 _coreLibrary = _libraryMap[_coreLibrarySource]; | 5411 _coreLibrary = _libraryMap[_coreLibrarySource]; |
5403 if (_coreLibrary == null) { | 5412 if (_coreLibrary == null) { |
5404 _coreLibrary = createLibrary(_coreLibrarySource); | 5413 _coreLibrary = createLibrary(_coreLibrarySource); |
5405 } | 5414 } |
5406 instrumentation.metric3("createLibrary", "complete"); | 5415 instrumentation.metric3("createLibrary", "complete"); |
5407 computeLibraryDependencies2(targetLibrary, unit); | 5416 computeLibraryDependencies2(targetLibrary, unit); |
5408 _librariesInCycles = computeLibrariesInCycles(targetLibrary); | 5417 _librariesInCycles = computeLibrariesInCycles(targetLibrary); |
5409 buildElementModels(); | 5418 buildElementModels(); |
5410 instrumentation.metric3("buildElementModels", "complete"); | 5419 instrumentation.metric3("buildElementModels", "complete"); |
5411 LibraryElement coreElement = _coreLibrary.libraryElement; | 5420 LibraryElement coreElement = _coreLibrary.libraryElement; |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5813 library.definingCompilationUnit; | 5822 library.definingCompilationUnit; |
5814 _libraryMap[librarySource] = library; | 5823 _libraryMap[librarySource] = library; |
5815 return library; | 5824 return library; |
5816 } | 5825 } |
5817 | 5826 |
5818 /** | 5827 /** |
5819 * Create an object to represent the information about the library defined by
the compilation unit | 5828 * Create an object to represent the information about the library defined by
the compilation unit |
5820 * with the given source. | 5829 * with the given source. |
5821 * | 5830 * |
5822 * @param librarySource the source of the library's defining compilation unit | 5831 * @param librarySource the source of the library's defining compilation unit |
| 5832 * @param modificationStamp the modification time of the source from which the
compilation unit |
| 5833 * was created |
| 5834 * @param unit the compilation unit that defines the library |
5823 * @return the library object that was created | 5835 * @return the library object that was created |
5824 * @throws AnalysisException if the library source is not valid | 5836 * @throws AnalysisException if the library source is not valid |
5825 */ | 5837 */ |
5826 Library createLibrary2(Source librarySource, CompilationUnit unit) { | 5838 Library createLibrary2(Source librarySource, int modificationStamp, Compilatio
nUnit unit) { |
5827 Library library = new Library(_analysisContext, _errorListener, librarySourc
e); | 5839 Library library = new Library(_analysisContext, _errorListener, librarySourc
e); |
5828 library.definingCompilationUnit = unit; | 5840 library.setDefiningCompilationUnit(modificationStamp, unit); |
5829 _libraryMap[librarySource] = library; | 5841 _libraryMap[librarySource] = library; |
5830 return library; | 5842 return library; |
5831 } | 5843 } |
5832 | 5844 |
5833 /** | 5845 /** |
5834 * Create an object to represent the information about the library defined by
the compilation unit | 5846 * Create an object to represent the information about the library defined by
the compilation unit |
5835 * with the given source. Return the library object that was created, or `null
` if the | 5847 * with the given source. Return the library object that was created, or `null
` if the |
5836 * source is not valid. | 5848 * source is not valid. |
5837 * | 5849 * |
5838 * @param librarySource the source of the library's defining compilation unit | 5850 * @param librarySource the source of the library's defining compilation unit |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5936 * @param librarySource the source representing the library containing the dir
ective | 5948 * @param librarySource the source representing the library containing the dir
ective |
5937 * @param directive the directive which URI should be resolved | 5949 * @param directive the directive which URI should be resolved |
5938 * @return the result of resolving the URI against the URI of the library | 5950 * @return the result of resolving the URI against the URI of the library |
5939 */ | 5951 */ |
5940 Source resolveSource(Source librarySource, UriBasedDirective directive) { | 5952 Source resolveSource(Source librarySource, UriBasedDirective directive) { |
5941 StringLiteral uriLiteral = directive.uri; | 5953 StringLiteral uriLiteral = directive.uri; |
5942 if (uriLiteral is StringInterpolation) { | 5954 if (uriLiteral is StringInterpolation) { |
5943 return null; | 5955 return null; |
5944 } | 5956 } |
5945 String uriContent = uriLiteral.stringValue.trim(); | 5957 String uriContent = uriLiteral.stringValue.trim(); |
5946 if (uriContent == null) { | 5958 if (uriContent == null || uriContent.isEmpty) { |
5947 return null; | 5959 return null; |
5948 } | 5960 } |
5949 uriContent = Uri.encodeFull(uriContent); | 5961 uriContent = Uri.encodeFull(uriContent); |
5950 try { | 5962 return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent); |
5951 parseUriWithException(uriContent); | |
5952 return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent
); | |
5953 } on URISyntaxException catch (exception) { | |
5954 return null; | |
5955 } | |
5956 } | 5963 } |
5957 | 5964 |
5958 /** | 5965 /** |
5959 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] | 5966 * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier] |
5960 * analysis in the current cycle. | 5967 * analysis in the current cycle. |
5961 * | 5968 * |
5962 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in | 5969 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in |
5963 * the library cannot be analyzed | 5970 * the library cannot be analyzed |
5964 */ | 5971 */ |
5965 void runAdditionalAnalyses() { | 5972 void runAdditionalAnalyses() { |
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6845 | 6852 |
6846 /** | 6853 /** |
6847 * Return the object used to access the types from the core library. | 6854 * Return the object used to access the types from the core library. |
6848 * | 6855 * |
6849 * @return the object used to access the types from the core library | 6856 * @return the object used to access the types from the core library |
6850 */ | 6857 */ |
6851 TypeProvider get typeProvider => _typeProvider; | 6858 TypeProvider get typeProvider => _typeProvider; |
6852 Object visitBlock(Block node) { | 6859 Object visitBlock(Block node) { |
6853 Scope outerScope = _nameScope; | 6860 Scope outerScope = _nameScope; |
6854 try { | 6861 try { |
6855 _nameScope = new EnclosedScope(_nameScope); | 6862 EnclosedScope enclosedScope = new EnclosedScope(_nameScope); |
| 6863 hideNamesDefinedInBlock(enclosedScope, node); |
| 6864 _nameScope = enclosedScope; |
6856 super.visitBlock(node); | 6865 super.visitBlock(node); |
6857 } finally { | 6866 } finally { |
6858 _nameScope = outerScope; | 6867 _nameScope = outerScope; |
6859 } | 6868 } |
6860 return null; | 6869 return null; |
6861 } | 6870 } |
6862 Object visitCatchClause(CatchClause node) { | 6871 Object visitCatchClause(CatchClause node) { |
6863 SimpleIdentifier exception = node.exceptionParameter; | 6872 SimpleIdentifier exception = node.exceptionParameter; |
6864 if (exception != null) { | 6873 if (exception != null) { |
6865 Scope outerScope = _nameScope; | 6874 Scope outerScope = _nameScope; |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7195 LabelScope addScopesFor(NodeList<Label> labels) { | 7204 LabelScope addScopesFor(NodeList<Label> labels) { |
7196 LabelScope outerScope = _labelScope; | 7205 LabelScope outerScope = _labelScope; |
7197 for (Label label in labels) { | 7206 for (Label label in labels) { |
7198 SimpleIdentifier labelNameNode = label.label; | 7207 SimpleIdentifier labelNameNode = label.label; |
7199 String labelName = labelNameNode.name; | 7208 String labelName = labelNameNode.name; |
7200 LabelElement labelElement = labelNameNode.element as LabelElement; | 7209 LabelElement labelElement = labelNameNode.element as LabelElement; |
7201 _labelScope = new LabelScope.con2(_labelScope, labelName, labelElement); | 7210 _labelScope = new LabelScope.con2(_labelScope, labelName, labelElement); |
7202 } | 7211 } |
7203 return outerScope; | 7212 return outerScope; |
7204 } | 7213 } |
| 7214 |
| 7215 /** |
| 7216 * Marks the local declarations of the given [Block] hidden in the enclosing s
cope. |
| 7217 * According to the scoping rules name is hidden if block defines it, but name
is defined after |
| 7218 * its declaration statement. |
| 7219 */ |
| 7220 void hideNamesDefinedInBlock(EnclosedScope scope, Block block) { |
| 7221 for (Statement statement in block.statements) { |
| 7222 if (statement is VariableDeclarationStatement) { |
| 7223 VariableDeclarationStatement vds = statement as VariableDeclarationState
ment; |
| 7224 for (VariableDeclaration variableDeclaration in vds.variables.variables)
{ |
| 7225 Element element = variableDeclaration.element; |
| 7226 scope.hide(element); |
| 7227 } |
| 7228 } |
| 7229 if (statement is FunctionDeclarationStatement) { |
| 7230 FunctionDeclarationStatement fds = statement as FunctionDeclarationState
ment; |
| 7231 Element element = fds.functionDeclaration.element; |
| 7232 scope.hide(element); |
| 7233 } |
| 7234 } |
| 7235 } |
7205 } | 7236 } |
7206 /** | 7237 /** |
7207 * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. F
irst, they | 7238 * Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. F
irst, they |
7208 * compute the static type of every expression. Second, they look for any static
type errors or | 7239 * compute the static type of every expression. Second, they look for any static
type errors or |
7209 * warnings that might need to be generated. The requirements for the type analy
zer are: | 7240 * warnings that might need to be generated. The requirements for the type analy
zer are: |
7210 * <ol> | 7241 * <ol> |
7211 * * Every element that refers to types should be fully populated. | 7242 * * Every element that refers to types should be fully populated. |
7212 * * Every node representing an expression should be resolved to the Type of the
expression. | 7243 * * Every node representing an expression should be resolved to the Type of the
expression. |
7213 * </ol> | 7244 * </ol> |
7214 * | 7245 * |
(...skipping 1744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8959 } | 8990 } |
8960 /** | 8991 /** |
8961 * The interface `TypeProvider` defines the behavior of objects that provide acc
ess to types | 8992 * The interface `TypeProvider` defines the behavior of objects that provide acc
ess to types |
8962 * defined by the language. | 8993 * defined by the language. |
8963 * | 8994 * |
8964 * @coverage dart.engine.resolver | 8995 * @coverage dart.engine.resolver |
8965 */ | 8996 */ |
8966 abstract class TypeProvider { | 8997 abstract class TypeProvider { |
8967 | 8998 |
8968 /** | 8999 /** |
| 9000 * Return the type representing the built-in type 'Null'. |
| 9001 * |
| 9002 * @return the type representing the built-in type 'null' |
| 9003 */ |
| 9004 InterfaceType get nullType; |
| 9005 |
| 9006 /** |
8969 * Return the type representing the built-in type 'bool'. | 9007 * Return the type representing the built-in type 'bool'. |
8970 * | 9008 * |
8971 * @return the type representing the built-in type 'bool' | 9009 * @return the type representing the built-in type 'bool' |
8972 */ | 9010 */ |
8973 InterfaceType get boolType; | 9011 InterfaceType get boolType; |
8974 | 9012 |
8975 /** | 9013 /** |
8976 * Return the type representing the type 'bottom'. | 9014 * Return the type representing the type 'bottom'. |
8977 * | 9015 * |
8978 * @return the type representing the type 'bottom' | 9016 * @return the type representing the type 'bottom' |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9105 * The type representing the built-in type 'List'. | 9143 * The type representing the built-in type 'List'. |
9106 */ | 9144 */ |
9107 InterfaceType _listType; | 9145 InterfaceType _listType; |
9108 | 9146 |
9109 /** | 9147 /** |
9110 * The type representing the built-in type 'Map'. | 9148 * The type representing the built-in type 'Map'. |
9111 */ | 9149 */ |
9112 InterfaceType _mapType; | 9150 InterfaceType _mapType; |
9113 | 9151 |
9114 /** | 9152 /** |
| 9153 * The type representing the type 'Null'. |
| 9154 */ |
| 9155 InterfaceType _nullType; |
| 9156 |
| 9157 /** |
9115 * The type representing the built-in type 'num'. | 9158 * The type representing the built-in type 'num'. |
9116 */ | 9159 */ |
9117 InterfaceType _numType; | 9160 InterfaceType _numType; |
9118 | 9161 |
9119 /** | 9162 /** |
9120 * The type representing the built-in type 'Object'. | 9163 * The type representing the built-in type 'Object'. |
9121 */ | 9164 */ |
9122 InterfaceType _objectType; | 9165 InterfaceType _objectType; |
9123 | 9166 |
9124 /** | 9167 /** |
(...skipping 25 matching lines...) Expand all Loading... |
9150 initializeFrom(coreLibrary); | 9193 initializeFrom(coreLibrary); |
9151 } | 9194 } |
9152 InterfaceType get boolType => _boolType; | 9195 InterfaceType get boolType => _boolType; |
9153 Type2 get bottomType => _bottomType; | 9196 Type2 get bottomType => _bottomType; |
9154 InterfaceType get doubleType => _doubleType; | 9197 InterfaceType get doubleType => _doubleType; |
9155 Type2 get dynamicType => _dynamicType; | 9198 Type2 get dynamicType => _dynamicType; |
9156 InterfaceType get functionType => _functionType; | 9199 InterfaceType get functionType => _functionType; |
9157 InterfaceType get intType => _intType; | 9200 InterfaceType get intType => _intType; |
9158 InterfaceType get listType => _listType; | 9201 InterfaceType get listType => _listType; |
9159 InterfaceType get mapType => _mapType; | 9202 InterfaceType get mapType => _mapType; |
| 9203 InterfaceType get nullType => _nullType; |
9160 InterfaceType get numType => _numType; | 9204 InterfaceType get numType => _numType; |
9161 InterfaceType get objectType => _objectType; | 9205 InterfaceType get objectType => _objectType; |
9162 InterfaceType get stackTraceType => _stackTraceType; | 9206 InterfaceType get stackTraceType => _stackTraceType; |
9163 InterfaceType get stringType => _stringType; | 9207 InterfaceType get stringType => _stringType; |
9164 InterfaceType get symbolType => _symbolType; | 9208 InterfaceType get symbolType => _symbolType; |
9165 InterfaceType get typeType => _typeType; | 9209 InterfaceType get typeType => _typeType; |
9166 | 9210 |
9167 /** | 9211 /** |
9168 * Return the type with the given name from the given namespace, or `null` if
there is no | 9212 * Return the type with the given name from the given namespace, or `null` if
there is no |
9169 * class with the given name. | 9213 * class with the given name. |
(...skipping 19 matching lines...) Expand all Loading... |
9189 void initializeFrom(LibraryElement library) { | 9233 void initializeFrom(LibraryElement library) { |
9190 Namespace namespace = new NamespaceBuilder().createPublicNamespace(library); | 9234 Namespace namespace = new NamespaceBuilder().createPublicNamespace(library); |
9191 _boolType = getType(namespace, "bool"); | 9235 _boolType = getType(namespace, "bool"); |
9192 _bottomType = BottomTypeImpl.instance; | 9236 _bottomType = BottomTypeImpl.instance; |
9193 _doubleType = getType(namespace, "double"); | 9237 _doubleType = getType(namespace, "double"); |
9194 _dynamicType = DynamicTypeImpl.instance; | 9238 _dynamicType = DynamicTypeImpl.instance; |
9195 _functionType = getType(namespace, "Function"); | 9239 _functionType = getType(namespace, "Function"); |
9196 _intType = getType(namespace, "int"); | 9240 _intType = getType(namespace, "int"); |
9197 _listType = getType(namespace, "List"); | 9241 _listType = getType(namespace, "List"); |
9198 _mapType = getType(namespace, "Map"); | 9242 _mapType = getType(namespace, "Map"); |
| 9243 _nullType = getType(namespace, "Null"); |
9199 _numType = getType(namespace, "num"); | 9244 _numType = getType(namespace, "num"); |
9200 _objectType = getType(namespace, "Object"); | 9245 _objectType = getType(namespace, "Object"); |
9201 _stackTraceType = getType(namespace, "StackTrace"); | 9246 _stackTraceType = getType(namespace, "StackTrace"); |
9202 _stringType = getType(namespace, "String"); | 9247 _stringType = getType(namespace, "String"); |
9203 _symbolType = getType(namespace, "Symbol"); | 9248 _symbolType = getType(namespace, "Symbol"); |
9204 _typeType = getType(namespace, "Type"); | 9249 _typeType = getType(namespace, "Type"); |
9205 } | 9250 } |
9206 } | 9251 } |
9207 /** | 9252 /** |
9208 * Instances of the class `TypeResolverVisitor` are used to resolve the types as
sociated with | 9253 * Instances of the class `TypeResolverVisitor` are used to resolve the types as
sociated with |
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10098 * @coverage dart.engine.resolver | 10143 * @coverage dart.engine.resolver |
10099 */ | 10144 */ |
10100 class EnclosedScope extends Scope { | 10145 class EnclosedScope extends Scope { |
10101 | 10146 |
10102 /** | 10147 /** |
10103 * The scope in which this scope is lexically enclosed. | 10148 * The scope in which this scope is lexically enclosed. |
10104 */ | 10149 */ |
10105 Scope _enclosingScope; | 10150 Scope _enclosingScope; |
10106 | 10151 |
10107 /** | 10152 /** |
| 10153 * A set of names that will be defined in this scope, but right now are not de
fined. However |
| 10154 * according to the scoping rules these names are hidden, even if they were de
fined in an outer |
| 10155 * scope. |
| 10156 */ |
| 10157 Set<String> _hiddenNames = new Set<String>(); |
| 10158 |
| 10159 /** |
10108 * Initialize a newly created scope enclosed within another scope. | 10160 * Initialize a newly created scope enclosed within another scope. |
10109 * | 10161 * |
10110 * @param enclosingScope the scope in which this scope is lexically enclosed | 10162 * @param enclosingScope the scope in which this scope is lexically enclosed |
10111 */ | 10163 */ |
10112 EnclosedScope(Scope enclosingScope) { | 10164 EnclosedScope(Scope enclosingScope) { |
10113 this._enclosingScope = enclosingScope; | 10165 this._enclosingScope = enclosingScope; |
10114 } | 10166 } |
10115 LibraryElement get definingLibrary => _enclosingScope.definingLibrary; | 10167 LibraryElement get definingLibrary => _enclosingScope.definingLibrary; |
10116 AnalysisErrorListener get errorListener => _enclosingScope.errorListener; | 10168 AnalysisErrorListener get errorListener => _enclosingScope.errorListener; |
10117 | 10169 |
10118 /** | 10170 /** |
| 10171 * Hides the name of the given element in this scope. If there is already an e
lement with the |
| 10172 * given name defined in an outer scope, then it will become unavailable. |
| 10173 * |
| 10174 * @param element the element to be hidden in this scope |
| 10175 */ |
| 10176 void hide(Element element) { |
| 10177 if (element != null) { |
| 10178 String name = element.name; |
| 10179 if (name != null && !name.isEmpty) { |
| 10180 javaSetAdd(_hiddenNames, name); |
| 10181 } |
| 10182 } |
| 10183 } |
| 10184 |
| 10185 /** |
10119 * Return the scope in which this scope is lexically enclosed. | 10186 * Return the scope in which this scope is lexically enclosed. |
10120 * | 10187 * |
10121 * @return the scope in which this scope is lexically enclosed | 10188 * @return the scope in which this scope is lexically enclosed |
10122 */ | 10189 */ |
10123 Scope get enclosingScope => _enclosingScope; | 10190 Scope get enclosingScope => _enclosingScope; |
10124 Element lookup3(Identifier identifier, String name, LibraryElement referencing
Library) { | 10191 Element lookup3(Identifier identifier, String name, LibraryElement referencing
Library) { |
10125 Element element = localLookup(name, referencingLibrary); | 10192 Element element = localLookup(name, referencingLibrary); |
10126 if (element != null) { | 10193 if (element != null) { |
10127 return element; | 10194 return element; |
10128 } | 10195 } |
| 10196 if (_hiddenNames.contains(name)) { |
| 10197 return null; |
| 10198 } |
10129 return _enclosingScope.lookup3(identifier, name, referencingLibrary); | 10199 return _enclosingScope.lookup3(identifier, name, referencingLibrary); |
10130 } | 10200 } |
10131 } | 10201 } |
10132 /** | 10202 /** |
10133 * Instances of the class `FunctionScope` implement the scope defined by a funct
ion. | 10203 * Instances of the class `FunctionScope` implement the scope defined by a funct
ion. |
10134 * | 10204 * |
10135 * @coverage dart.engine.resolver | 10205 * @coverage dart.engine.resolver |
10136 */ | 10206 */ |
10137 class FunctionScope extends EnclosedScope { | 10207 class FunctionScope extends EnclosedScope { |
10138 | 10208 |
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10966 super.visitFunctionExpression(node); | 11036 super.visitFunctionExpression(node); |
10967 validateDefaultValues(node.parameters); | 11037 validateDefaultValues(node.parameters); |
10968 return null; | 11038 return null; |
10969 } | 11039 } |
10970 Object visitInstanceCreationExpression(InstanceCreationExpression node) { | 11040 Object visitInstanceCreationExpression(InstanceCreationExpression node) { |
10971 validateConstantArguments2(node); | 11041 validateConstantArguments2(node); |
10972 return super.visitInstanceCreationExpression(node); | 11042 return super.visitInstanceCreationExpression(node); |
10973 } | 11043 } |
10974 Object visitListLiteral(ListLiteral node) { | 11044 Object visitListLiteral(ListLiteral node) { |
10975 super.visitListLiteral(node); | 11045 super.visitListLiteral(node); |
10976 if (node.modifier != null) { | 11046 if (node.constKeyword != null) { |
10977 for (Expression element in node.elements) { | 11047 for (Expression element in node.elements) { |
10978 validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT); | 11048 validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT); |
10979 } | 11049 } |
10980 } | 11050 } |
10981 return null; | 11051 return null; |
10982 } | 11052 } |
10983 Object visitMapLiteral(MapLiteral node) { | 11053 Object visitMapLiteral(MapLiteral node) { |
10984 super.visitMapLiteral(node); | 11054 super.visitMapLiteral(node); |
10985 bool isConst = node.modifier != null; | 11055 bool isConst = node.constKeyword != null; |
10986 bool reportEqualKeys = true; | 11056 bool reportEqualKeys = true; |
10987 Set<Object> keys = new Set<Object>(); | 11057 Set<Object> keys = new Set<Object>(); |
10988 List<Expression> invalidKeys = new List<Expression>(); | 11058 List<Expression> invalidKeys = new List<Expression>(); |
10989 for (MapLiteralEntry entry in node.entries) { | 11059 for (MapLiteralEntry entry in node.entries) { |
10990 Expression key = entry.key; | 11060 Expression key = entry.key; |
10991 if (isConst) { | 11061 if (isConst) { |
10992 EvaluationResultImpl result = validate(key, CompileTimeErrorCode.NON_CON
STANT_MAP_KEY); | 11062 EvaluationResultImpl result = validate(key, CompileTimeErrorCode.NON_CON
STANT_MAP_KEY); |
10993 validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE); | 11063 validate(entry.value, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE); |
10994 if (result is ValidResult) { | 11064 if (result is ValidResult) { |
10995 Object value = ((result as ValidResult)).value; | 11065 Object value = ((result as ValidResult)).value; |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11293 /** | 11363 /** |
11294 * This is set to `true` iff the visitor is currently visiting children nodes
of a | 11364 * This is set to `true` iff the visitor is currently visiting children nodes
of a |
11295 * [CatchClause]. | 11365 * [CatchClause]. |
11296 * | 11366 * |
11297 * @see #visitCatchClause(CatchClause) | 11367 * @see #visitCatchClause(CatchClause) |
11298 */ | 11368 */ |
11299 bool _isInCatchClause = false; | 11369 bool _isInCatchClause = false; |
11300 | 11370 |
11301 /** | 11371 /** |
11302 * This is set to `true` iff the visitor is currently visiting children nodes
of an | 11372 * This is set to `true` iff the visitor is currently visiting children nodes
of an |
| 11373 * [Comment]. |
| 11374 */ |
| 11375 bool _isInComment = false; |
| 11376 |
| 11377 /** |
| 11378 * This is set to `true` iff the visitor is currently visiting children nodes
of an |
11303 * [InstanceCreationExpression]. | 11379 * [InstanceCreationExpression]. |
11304 */ | 11380 */ |
11305 bool _isInConstInstanceCreation = false; | 11381 bool _isInConstInstanceCreation = false; |
11306 | 11382 |
11307 /** | 11383 /** |
11308 * This is set to `true` iff the visitor is currently visiting children nodes
of a native | 11384 * This is set to `true` iff the visitor is currently visiting children nodes
of a native |
11309 * [ClassDeclaration]. | 11385 * [ClassDeclaration]. |
11310 */ | 11386 */ |
11311 bool _isInNativeClass = false; | 11387 bool _isInNativeClass = false; |
11312 | 11388 |
(...skipping 15 matching lines...) Expand all Loading... |
11328 */ | 11404 */ |
11329 bool _isInInstanceVariableInitializer = false; | 11405 bool _isInInstanceVariableInitializer = false; |
11330 | 11406 |
11331 /** | 11407 /** |
11332 * This is set to `true` iff the visitor is currently visiting a | 11408 * This is set to `true` iff the visitor is currently visiting a |
11333 * [ConstructorInitializer]. | 11409 * [ConstructorInitializer]. |
11334 */ | 11410 */ |
11335 bool _isInConstructorInitializer = false; | 11411 bool _isInConstructorInitializer = false; |
11336 | 11412 |
11337 /** | 11413 /** |
| 11414 * This is set to `true` iff the visitor is currently visiting a |
| 11415 * [FunctionTypedFormalParameter]. |
| 11416 */ |
| 11417 bool _isInFunctionTypedFormalParameter = false; |
| 11418 |
| 11419 /** |
11338 * This is set to `true` iff the visitor is currently visiting a static method
. By "method" | 11420 * This is set to `true` iff the visitor is currently visiting a static method
. By "method" |
11339 * here getter, setter and operator declarations are also implied since they a
re all represented | 11421 * here getter, setter and operator declarations are also implied since they a
re all represented |
11340 * with a [MethodDeclaration] in the AST structure. | 11422 * with a [MethodDeclaration] in the AST structure. |
11341 */ | 11423 */ |
11342 bool _isInStaticMethod = false; | 11424 bool _isInStaticMethod = false; |
11343 | 11425 |
11344 /** | 11426 /** |
11345 * This is set to `true` iff the visitor is currently visiting code in the SDK
. | 11427 * This is set to `true` iff the visitor is currently visiting code in the SDK
. |
11346 */ | 11428 */ |
11347 bool _isInSystemLibrary = false; | 11429 bool _isInSystemLibrary = false; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11408 _strictMode = currentLibrary.context.analysisOptions.strictMode; | 11490 _strictMode = currentLibrary.context.analysisOptions.strictMode; |
11409 _isEnclosingConstructorConst = false; | 11491 _isEnclosingConstructorConst = false; |
11410 _isInCatchClause = false; | 11492 _isInCatchClause = false; |
11411 _isInStaticVariableDeclaration = false; | 11493 _isInStaticVariableDeclaration = false; |
11412 _isInInstanceVariableDeclaration = false; | 11494 _isInInstanceVariableDeclaration = false; |
11413 _isInInstanceVariableInitializer = false; | 11495 _isInInstanceVariableInitializer = false; |
11414 _isInConstructorInitializer = false; | 11496 _isInConstructorInitializer = false; |
11415 _isInStaticMethod = false; | 11497 _isInStaticMethod = false; |
11416 _dynamicType = typeProvider.dynamicType; | 11498 _dynamicType = typeProvider.dynamicType; |
11417 _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [ | 11499 _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [ |
| 11500 typeProvider.nullType, |
11418 typeProvider.numType, | 11501 typeProvider.numType, |
11419 typeProvider.intType, | 11502 typeProvider.intType, |
11420 typeProvider.doubleType, | 11503 typeProvider.doubleType, |
11421 typeProvider.boolType, | 11504 typeProvider.boolType, |
11422 typeProvider.stringType]; | 11505 typeProvider.stringType]; |
11423 } | 11506 } |
11424 Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) { | 11507 Object visitArgumentDefinitionTest(ArgumentDefinitionTest node) { |
11425 checkForArgumentDefinitionTestNonParameter(node); | 11508 checkForArgumentDefinitionTestNonParameter(node); |
11426 return super.visitArgumentDefinitionTest(node); | 11509 return super.visitArgumentDefinitionTest(node); |
11427 } | 11510 } |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11504 ClassElement outerClassElement = _enclosingClass; | 11587 ClassElement outerClassElement = _enclosingClass; |
11505 try { | 11588 try { |
11506 _enclosingClass = node.element; | 11589 _enclosingClass = node.element; |
11507 checkForRecursiveInterfaceInheritance(node.element, new List<ClassElement>
()); | 11590 checkForRecursiveInterfaceInheritance(node.element, new List<ClassElement>
()); |
11508 checkForTypeAliasCannotReferenceItself_mixin(node); | 11591 checkForTypeAliasCannotReferenceItself_mixin(node); |
11509 } finally { | 11592 } finally { |
11510 _enclosingClass = outerClassElement; | 11593 _enclosingClass = outerClassElement; |
11511 } | 11594 } |
11512 return super.visitClassTypeAlias(node); | 11595 return super.visitClassTypeAlias(node); |
11513 } | 11596 } |
| 11597 Object visitComment(Comment node) { |
| 11598 _isInComment = true; |
| 11599 try { |
| 11600 return super.visitComment(node); |
| 11601 } finally { |
| 11602 _isInComment = false; |
| 11603 } |
| 11604 } |
11514 Object visitConditionalExpression(ConditionalExpression node) { | 11605 Object visitConditionalExpression(ConditionalExpression node) { |
11515 checkForNonBoolCondition(node.condition); | 11606 checkForNonBoolCondition(node.condition); |
11516 return super.visitConditionalExpression(node); | 11607 return super.visitConditionalExpression(node); |
11517 } | 11608 } |
11518 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 11609 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
11519 ExecutableElement outerFunction = _enclosingFunction; | 11610 ExecutableElement outerFunction = _enclosingFunction; |
11520 try { | 11611 try { |
11521 _enclosingFunction = node.element; | 11612 _enclosingFunction = node.element; |
11522 _isEnclosingConstructorConst = node.constKeyword != null; | 11613 _isEnclosingConstructorConst = node.constKeyword != null; |
11523 checkForConstConstructorWithNonFinalField(node); | 11614 checkForConstConstructorWithNonFinalField(node); |
| 11615 checkForConstConstructorWithNonConstSuper(node); |
11524 checkForConflictingConstructorNameAndMember(node); | 11616 checkForConflictingConstructorNameAndMember(node); |
11525 checkForAllFinalInitializedErrorCodes(node); | 11617 checkForAllFinalInitializedErrorCodes(node); |
11526 checkForRedirectingConstructorErrorCodes(node); | 11618 checkForRedirectingConstructorErrorCodes(node); |
11527 checkForMultipleSuperInitializers(node); | 11619 checkForMultipleSuperInitializers(node); |
11528 checkForRecursiveConstructorRedirect(node); | 11620 checkForRecursiveConstructorRedirect(node); |
11529 checkForRecursiveFactoryRedirect(node); | 11621 if (!checkForRecursiveFactoryRedirect(node)) { |
11530 checkForAllRedirectConstructorErrorCodes(node); | 11622 checkForAllRedirectConstructorErrorCodes(node); |
| 11623 } |
11531 checkForUndefinedConstructorInInitializerImplicit(node); | 11624 checkForUndefinedConstructorInInitializerImplicit(node); |
11532 checkForRedirectToNonConstConstructor(node); | 11625 checkForRedirectToNonConstConstructor(node); |
11533 checkForReturnInGenerativeConstructor(node); | 11626 checkForReturnInGenerativeConstructor(node); |
11534 return super.visitConstructorDeclaration(node); | 11627 return super.visitConstructorDeclaration(node); |
11535 } finally { | 11628 } finally { |
11536 _isEnclosingConstructorConst = false; | 11629 _isEnclosingConstructorConst = false; |
11537 _enclosingFunction = outerFunction; | 11630 _enclosingFunction = outerFunction; |
11538 } | 11631 } |
11539 } | 11632 } |
11540 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) { | 11633 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) { |
11541 _isInConstructorInitializer = true; | 11634 _isInConstructorInitializer = true; |
11542 try { | 11635 try { |
11543 checkForFieldInitializerNotAssignable(node); | 11636 checkForFieldInitializerNotAssignable(node); |
11544 return super.visitConstructorFieldInitializer(node); | 11637 return super.visitConstructorFieldInitializer(node); |
11545 } finally { | 11638 } finally { |
11546 _isInConstructorInitializer = false; | 11639 _isInConstructorInitializer = false; |
11547 } | 11640 } |
11548 } | 11641 } |
| 11642 Object visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 11643 checkForInvalidAssignment2(node.identifier, node.defaultValue); |
| 11644 checkForDefaultValueInFunctionTypedParameter(node); |
| 11645 return super.visitDefaultFormalParameter(node); |
| 11646 } |
11549 Object visitDoStatement(DoStatement node) { | 11647 Object visitDoStatement(DoStatement node) { |
11550 checkForNonBoolCondition(node.condition); | 11648 checkForNonBoolCondition(node.condition); |
11551 return super.visitDoStatement(node); | 11649 return super.visitDoStatement(node); |
11552 } | 11650 } |
11553 Object visitExportDirective(ExportDirective node) { | 11651 Object visitExportDirective(ExportDirective node) { |
11554 checkForAmbiguousExport(node); | 11652 checkForAmbiguousExport(node); |
11555 checkForExportDuplicateLibraryName(node); | 11653 checkForExportDuplicateLibraryName(node); |
11556 checkForExportInternalLibrary(node); | 11654 checkForExportInternalLibrary(node); |
11557 return super.visitExportDirective(node); | 11655 return super.visitExportDirective(node); |
11558 } | 11656 } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11622 } else { | 11720 } else { |
11623 return super.visitFunctionExpression(node); | 11721 return super.visitFunctionExpression(node); |
11624 } | 11722 } |
11625 } | 11723 } |
11626 Object visitFunctionTypeAlias(FunctionTypeAlias node) { | 11724 Object visitFunctionTypeAlias(FunctionTypeAlias node) { |
11627 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE
NTIFIER_AS_TYPEDEF_NAME); | 11725 checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDE
NTIFIER_AS_TYPEDEF_NAME); |
11628 checkForDefaultValueInFunctionTypeAlias(node); | 11726 checkForDefaultValueInFunctionTypeAlias(node); |
11629 checkForTypeAliasCannotReferenceItself_function(node); | 11727 checkForTypeAliasCannotReferenceItself_function(node); |
11630 return super.visitFunctionTypeAlias(node); | 11728 return super.visitFunctionTypeAlias(node); |
11631 } | 11729 } |
| 11730 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { |
| 11731 bool old = _isInFunctionTypedFormalParameter; |
| 11732 _isInFunctionTypedFormalParameter = true; |
| 11733 try { |
| 11734 return super.visitFunctionTypedFormalParameter(node); |
| 11735 } finally { |
| 11736 _isInFunctionTypedFormalParameter = old; |
| 11737 } |
| 11738 } |
11632 Object visitIfStatement(IfStatement node) { | 11739 Object visitIfStatement(IfStatement node) { |
11633 checkForNonBoolCondition(node.condition); | 11740 checkForNonBoolCondition(node.condition); |
11634 return super.visitIfStatement(node); | 11741 return super.visitIfStatement(node); |
11635 } | 11742 } |
11636 Object visitImportDirective(ImportDirective node) { | 11743 Object visitImportDirective(ImportDirective node) { |
11637 checkForImportDuplicateLibraryName(node); | 11744 checkForImportDuplicateLibraryName(node); |
11638 checkForImportInternalLibrary(node); | 11745 checkForImportInternalLibrary(node); |
11639 return super.visitImportDirective(node); | 11746 return super.visitImportDirective(node); |
11640 } | 11747 } |
11641 Object visitIndexExpression(IndexExpression node) { | 11748 Object visitIndexExpression(IndexExpression node) { |
(...skipping 16 matching lines...) Expand all Loading... |
11658 } else { | 11765 } else { |
11659 checkForNewWithUndefinedConstructor(node); | 11766 checkForNewWithUndefinedConstructor(node); |
11660 } | 11767 } |
11661 } | 11768 } |
11662 return super.visitInstanceCreationExpression(node); | 11769 return super.visitInstanceCreationExpression(node); |
11663 } finally { | 11770 } finally { |
11664 _isInConstInstanceCreation = false; | 11771 _isInConstInstanceCreation = false; |
11665 } | 11772 } |
11666 } | 11773 } |
11667 Object visitListLiteral(ListLiteral node) { | 11774 Object visitListLiteral(ListLiteral node) { |
11668 if (node.modifier != null) { | 11775 if (node.constKeyword != null) { |
11669 TypeArgumentList typeArguments = node.typeArguments; | 11776 TypeArgumentList typeArguments = node.typeArguments; |
11670 if (typeArguments != null) { | 11777 if (typeArguments != null) { |
11671 NodeList<TypeName> arguments = typeArguments.arguments; | 11778 NodeList<TypeName> arguments = typeArguments.arguments; |
11672 if (arguments.length != 0) { | 11779 if (arguments.length != 0) { |
11673 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE
rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST); | 11780 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE
rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST); |
11674 } | 11781 } |
11675 } | 11782 } |
11676 } | 11783 } |
11677 checkForListElementTypeNotAssignable(node); | 11784 checkForListElementTypeNotAssignable(node); |
11678 return super.visitListLiteral(node); | 11785 return super.visitListLiteral(node); |
11679 } | 11786 } |
11680 Object visitMapLiteral(MapLiteral node) { | 11787 Object visitMapLiteral(MapLiteral node) { |
11681 TypeArgumentList typeArguments = node.typeArguments; | 11788 TypeArgumentList typeArguments = node.typeArguments; |
11682 if (typeArguments != null) { | 11789 if (typeArguments != null) { |
11683 NodeList<TypeName> arguments = typeArguments.arguments; | 11790 NodeList<TypeName> arguments = typeArguments.arguments; |
11684 if (arguments.length != 0) { | 11791 if (arguments.length != 0) { |
11685 checkForInvalidTypeArgumentForKey(arguments); | 11792 checkForInvalidTypeArgumentForKey(arguments); |
11686 if (node.modifier != null) { | 11793 if (node.constKeyword != null) { |
11687 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE
rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP); | 11794 checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeE
rrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP); |
11688 } | 11795 } |
11689 } | 11796 } |
11690 } | 11797 } |
11691 checkForNonConstMapAsExpressionStatement(node); | 11798 checkForNonConstMapAsExpressionStatement(node); |
11692 checkForMapTypeNotAssignable(node); | 11799 checkForMapTypeNotAssignable(node); |
11693 return super.visitMapLiteral(node); | 11800 return super.visitMapLiteral(node); |
11694 } | 11801 } |
11695 Object visitMethodDeclaration(MethodDeclaration node) { | 11802 Object visitMethodDeclaration(MethodDeclaration node) { |
11696 ExecutableElement previousFunction = _enclosingFunction; | 11803 ExecutableElement previousFunction = _enclosingFunction; |
(...skipping 22 matching lines...) Expand all Loading... |
11719 } | 11826 } |
11720 checkForConcreteClassWithAbstractMember(node); | 11827 checkForConcreteClassWithAbstractMember(node); |
11721 checkForAllInvalidOverrideErrorCodes3(node); | 11828 checkForAllInvalidOverrideErrorCodes3(node); |
11722 return super.visitMethodDeclaration(node); | 11829 return super.visitMethodDeclaration(node); |
11723 } finally { | 11830 } finally { |
11724 _enclosingFunction = previousFunction; | 11831 _enclosingFunction = previousFunction; |
11725 _isInStaticMethod = false; | 11832 _isInStaticMethod = false; |
11726 } | 11833 } |
11727 } | 11834 } |
11728 Object visitMethodInvocation(MethodInvocation node) { | 11835 Object visitMethodInvocation(MethodInvocation node) { |
11729 checkForStaticAccessToInstanceMember(node.target, node.methodName); | 11836 Expression target = node.realTarget; |
| 11837 SimpleIdentifier methodName = node.methodName; |
| 11838 checkForStaticAccessToInstanceMember(target, methodName); |
| 11839 checkForInstanceAccessToStaticMember(target, methodName); |
11730 return super.visitMethodInvocation(node); | 11840 return super.visitMethodInvocation(node); |
11731 } | 11841 } |
11732 Object visitNativeClause(NativeClause node) { | 11842 Object visitNativeClause(NativeClause node) { |
11733 if (!_isInSystemLibrary) { | 11843 if (!_isInSystemLibrary) { |
11734 _errorReporter.reportError2(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE,
node, []); | 11844 _errorReporter.reportError2(ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE,
node, []); |
11735 } | 11845 } |
11736 return super.visitNativeClause(node); | 11846 return super.visitNativeClause(node); |
11737 } | 11847 } |
11738 Object visitNativeFunctionBody(NativeFunctionBody node) { | 11848 Object visitNativeFunctionBody(NativeFunctionBody node) { |
11739 checkForNativeFunctionBodyInNonSDKCode(node); | 11849 checkForNativeFunctionBodyInNonSDKCode(node); |
11740 return super.visitNativeFunctionBody(node); | 11850 return super.visitNativeFunctionBody(node); |
11741 } | 11851 } |
11742 Object visitPostfixExpression(PostfixExpression node) { | 11852 Object visitPostfixExpression(PostfixExpression node) { |
11743 checkForAssignmentToFinal2(node.operand); | 11853 checkForAssignmentToFinal2(node.operand); |
11744 checkForIntNotAssignable(node.operand); | 11854 checkForIntNotAssignable(node.operand); |
11745 return super.visitPostfixExpression(node); | 11855 return super.visitPostfixExpression(node); |
11746 } | 11856 } |
11747 Object visitPrefixedIdentifier(PrefixedIdentifier node) { | 11857 Object visitPrefixedIdentifier(PrefixedIdentifier node) { |
11748 if (node.parent is! Annotation) { | 11858 if (node.parent is! Annotation) { |
11749 checkForStaticAccessToInstanceMember(node.prefix, node.identifier); | 11859 checkForStaticAccessToInstanceMember(node.prefix, node.identifier); |
| 11860 checkForInstanceAccessToStaticMember(node.prefix, node.identifier); |
11750 } | 11861 } |
11751 return super.visitPrefixedIdentifier(node); | 11862 return super.visitPrefixedIdentifier(node); |
11752 } | 11863 } |
11753 Object visitPrefixExpression(PrefixExpression node) { | 11864 Object visitPrefixExpression(PrefixExpression node) { |
11754 if (node.operator.type.isIncrementOperator) { | 11865 if (node.operator.type.isIncrementOperator) { |
11755 checkForAssignmentToFinal2(node.operand); | 11866 checkForAssignmentToFinal2(node.operand); |
11756 } | 11867 } |
11757 checkForIntNotAssignable(node.operand); | 11868 checkForIntNotAssignable(node.operand); |
11758 return super.visitPrefixExpression(node); | 11869 return super.visitPrefixExpression(node); |
11759 } | 11870 } |
11760 Object visitPropertyAccess(PropertyAccess node) { | 11871 Object visitPropertyAccess(PropertyAccess node) { |
11761 Expression target = node.realTarget; | 11872 Expression target = node.realTarget; |
11762 checkForStaticAccessToInstanceMember(target, node.propertyName); | 11873 SimpleIdentifier propertyName = node.propertyName; |
| 11874 checkForStaticAccessToInstanceMember(target, propertyName); |
| 11875 checkForInstanceAccessToStaticMember(target, propertyName); |
11763 return super.visitPropertyAccess(node); | 11876 return super.visitPropertyAccess(node); |
11764 } | 11877 } |
11765 Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation
node) { | 11878 Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation
node) { |
11766 _isInConstructorInitializer = true; | 11879 _isInConstructorInitializer = true; |
11767 try { | 11880 try { |
11768 return super.visitRedirectingConstructorInvocation(node); | 11881 return super.visitRedirectingConstructorInvocation(node); |
11769 } finally { | 11882 } finally { |
11770 _isInConstructorInitializer = false; | 11883 _isInConstructorInitializer = false; |
11771 } | 11884 } |
11772 } | 11885 } |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11934 foundError = true; | 12047 foundError = true; |
11935 } | 12048 } |
11936 } | 12049 } |
11937 } | 12050 } |
11938 return foundError; | 12051 return foundError; |
11939 } | 12052 } |
11940 | 12053 |
11941 /** | 12054 /** |
11942 * This checks the passed executable element against override-error codes. | 12055 * This checks the passed executable element against override-error codes. |
11943 * | 12056 * |
11944 * @param executableElement the [ExecutableElement] to evaluate | 12057 * @param executableElement a non-null [ExecutableElement] to evaluate |
11945 * @param parameters the parameters of the executable element | 12058 * @param parameters the parameters of the executable element |
11946 * @param errorNameTarget the node to report problems on | 12059 * @param errorNameTarget the node to report problems on |
11947 * @return `true` if and only if an error code is generated on the passed node | 12060 * @return `true` if and only if an error code is generated on the passed node |
11948 * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC | 12061 * @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC |
11949 * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED | 12062 * @see CompileTimeErrorCode#INVALID_OVERRIDE_REQUIRED |
11950 * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL | 12063 * @see CompileTimeErrorCode#INVALID_OVERRIDE_POSITIONAL |
11951 * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED | 12064 * @see CompileTimeErrorCode#INVALID_OVERRIDE_NAMED |
11952 * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE | 12065 * @see StaticWarningCode#INVALID_GETTER_OVERRIDE_RETURN_TYPE |
11953 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE | 12066 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_RETURN_TYPE |
11954 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE | 12067 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE |
11955 * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE | 12068 * @see StaticWarningCode#INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE |
11956 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE | 12069 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE |
11957 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE | 12070 * @see StaticWarningCode#INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE |
11958 * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES | 12071 * @see StaticWarningCode#INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES |
11959 */ | 12072 */ |
11960 bool checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement,
List<ParameterElement> parameters2, List<ASTNode> parameterLocations, SimpleIde
ntifier errorNameTarget) { | 12073 bool checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement,
List<ParameterElement> parameters2, List<ASTNode> parameterLocations, SimpleIde
ntifier errorNameTarget) { |
11961 String executableElementName = executableElement.name; | 12074 String executableElementName = executableElement.name; |
11962 ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritan
ce(_enclosingClass, executableElement.name); | 12075 ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritan
ce(_enclosingClass, executableElementName); |
11963 bool isGetter = false; | 12076 bool isGetter = false; |
11964 bool isSetter = false; | 12077 bool isSetter = false; |
11965 if (executableElement is PropertyAccessorElement) { | 12078 if (executableElement is PropertyAccessorElement) { |
11966 PropertyAccessorElement accessorElement = executableElement as PropertyAcc
essorElement; | 12079 PropertyAccessorElement accessorElement = executableElement as PropertyAcc
essorElement; |
11967 isGetter = accessorElement.isGetter; | 12080 isGetter = accessorElement.isGetter; |
11968 isSetter = accessorElement.isSetter; | 12081 isSetter = accessorElement.isSetter; |
11969 } | 12082 } |
11970 if (overriddenExecutable == null) { | 12083 if (overriddenExecutable == null) { |
11971 if (!isGetter && !isSetter && !executableElement.isOperator) { | 12084 if (!isGetter && !isSetter && !executableElement.isOperator) { |
11972 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | 12085 Set<ClassElement> visitedClasses = new Set<ClassElement>(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12007 } | 12120 } |
12008 Type2 overridingFTReturnType = overridingFT.returnType; | 12121 Type2 overridingFTReturnType = overridingFT.returnType; |
12009 Type2 overriddenFTReturnType = overriddenFT.returnType; | 12122 Type2 overriddenFTReturnType = overriddenFT.returnType; |
12010 List<Type2> overridingNormalPT = overridingFT.normalParameterTypes; | 12123 List<Type2> overridingNormalPT = overridingFT.normalParameterTypes; |
12011 List<Type2> overriddenNormalPT = overriddenFT.normalParameterTypes; | 12124 List<Type2> overriddenNormalPT = overriddenFT.normalParameterTypes; |
12012 List<Type2> overridingPositionalPT = overridingFT.optionalParameterTypes; | 12125 List<Type2> overridingPositionalPT = overridingFT.optionalParameterTypes; |
12013 List<Type2> overriddenPositionalPT = overriddenFT.optionalParameterTypes; | 12126 List<Type2> overriddenPositionalPT = overriddenFT.optionalParameterTypes; |
12014 Map<String, Type2> overridingNamedPT = overridingFT.namedParameterTypes; | 12127 Map<String, Type2> overridingNamedPT = overridingFT.namedParameterTypes; |
12015 Map<String, Type2> overriddenNamedPT = overriddenFT.namedParameterTypes; | 12128 Map<String, Type2> overriddenNamedPT = overriddenFT.namedParameterTypes; |
12016 if (overridingNormalPT.length != overriddenNormalPT.length) { | 12129 if (overridingNormalPT.length != overriddenNormalPT.length) { |
12017 _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED
, errorNameTarget, [ | 12130 _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, e
rrorNameTarget, [ |
12018 overriddenNormalPT.length, | 12131 overriddenNormalPT.length, |
12019 overriddenExecutable.enclosingElement.displayName]); | 12132 overriddenExecutable.enclosingElement.displayName]); |
12020 return true; | 12133 return true; |
12021 } | 12134 } |
12022 if (overridingPositionalPT.length < overriddenPositionalPT.length) { | 12135 if (overridingPositionalPT.length < overriddenPositionalPT.length) { |
12023 _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_POSITION
AL, errorNameTarget, [ | 12136 _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL,
errorNameTarget, [ |
12024 overriddenPositionalPT.length, | 12137 overriddenPositionalPT.length, |
12025 overriddenExecutable.enclosingElement.displayName]); | 12138 overriddenExecutable.enclosingElement.displayName]); |
12026 return true; | 12139 return true; |
12027 } | 12140 } |
12028 Set<String> overridingParameterNameSet = overridingNamedPT.keys.toSet(); | 12141 Set<String> overridingParameterNameSet = overridingNamedPT.keys.toSet(); |
12029 JavaIterator<String> overriddenParameterNameIterator = new JavaIterator(over
riddenNamedPT.keys.toSet()); | 12142 JavaIterator<String> overriddenParameterNameIterator = new JavaIterator(over
riddenNamedPT.keys.toSet()); |
12030 while (overriddenParameterNameIterator.hasNext) { | 12143 while (overriddenParameterNameIterator.hasNext) { |
12031 String overriddenParamName = overriddenParameterNameIterator.next(); | 12144 String overriddenParamName = overriddenParameterNameIterator.next(); |
12032 if (!overridingParameterNameSet.contains(overriddenParamName)) { | 12145 if (!overridingParameterNameSet.contains(overriddenParamName)) { |
12033 _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_NAMED,
errorNameTarget, [ | 12146 _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_NAMED, er
rorNameTarget, [ |
12034 overriddenParamName, | 12147 overriddenParamName, |
12035 overriddenExecutable.enclosingElement.displayName]); | 12148 overriddenExecutable.enclosingElement.displayName]); |
12036 return true; | 12149 return true; |
12037 } | 12150 } |
12038 } | 12151 } |
12039 if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnTy
pe.isAssignableTo(overriddenFTReturnType)) { | 12152 if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnTy
pe.isAssignableTo(overriddenFTReturnType)) { |
12040 _errorReporter.reportError2(!isGetter ? StaticWarningCode.INVALID_METHOD_O
VERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, err
orNameTarget, [ | 12153 _errorReporter.reportError2(!isGetter ? StaticWarningCode.INVALID_METHOD_O
VERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, err
orNameTarget, [ |
12041 overridingFTReturnType.displayName, | 12154 overridingFTReturnType.displayName, |
12042 overriddenFTReturnType.displayName, | 12155 overriddenFTReturnType.displayName, |
12043 overriddenExecutable.enclosingElement.displayName]); | 12156 overriddenExecutable.enclosingElement.displayName]); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12101 List<ParameterElement> overriddenPEs = overriddenExecutable.parameters; | 12214 List<ParameterElement> overriddenPEs = overriddenExecutable.parameters; |
12102 for (int i = 0; i < parameters2.length; i++) { | 12215 for (int i = 0; i < parameters2.length; i++) { |
12103 ParameterElement parameter = parameters2[i]; | 12216 ParameterElement parameter = parameters2[i]; |
12104 if (parameter.parameterKind.isOptional) { | 12217 if (parameter.parameterKind.isOptional) { |
12105 formalParameters.add(parameterLocations[i]); | 12218 formalParameters.add(parameterLocations[i]); |
12106 parameterElts.add((parameter as ParameterElementImpl)); | 12219 parameterElts.add((parameter as ParameterElementImpl)); |
12107 } | 12220 } |
12108 } | 12221 } |
12109 for (ParameterElement parameterElt in overriddenPEs) { | 12222 for (ParameterElement parameterElt in overriddenPEs) { |
12110 if (parameterElt.parameterKind.isOptional) { | 12223 if (parameterElt.parameterKind.isOptional) { |
12111 overriddenParameterElts.add((parameterElt as ParameterElementImpl)); | 12224 if (parameterElt is ParameterElementImpl) { |
| 12225 overriddenParameterElts.add((parameterElt as ParameterElementImpl)); |
| 12226 } else if (parameterElt is ParameterMember) { |
| 12227 overriddenParameterElts.add((((parameterElt as ParameterMember)).baseE
lement as ParameterElementImpl)); |
| 12228 } |
12112 } | 12229 } |
12113 } | 12230 } |
12114 if (parameterElts.length > 0) { | 12231 if (parameterElts.length > 0) { |
12115 if (identical(parameterElts[0].parameterKind, ParameterKind.NAMED)) { | 12232 if (identical(parameterElts[0].parameterKind, ParameterKind.NAMED)) { |
12116 for (int i = 0; i < parameterElts.length; i++) { | 12233 for (int i = 0; i < parameterElts.length; i++) { |
12117 ParameterElementImpl parameterElt = parameterElts[i]; | 12234 ParameterElementImpl parameterElt = parameterElts[i]; |
12118 EvaluationResultImpl result = parameterElt.evaluationResult; | 12235 EvaluationResultImpl result = parameterElt.evaluationResult; |
12119 if (result == null || identical(result, ValidResult.RESULT_OBJECT)) { | 12236 if (result == null || identical(result, ValidResult.RESULT_OBJECT)) { |
12120 continue; | 12237 continue; |
12121 } | 12238 } |
(...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12885 if (member.isStatic) { | 13002 if (member.isStatic) { |
12886 return false; | 13003 return false; |
12887 } | 13004 } |
12888 ClassElement memberClass = member.enclosingElement as ClassElement; | 13005 ClassElement memberClass = member.enclosingElement as ClassElement; |
12889 InterfaceType memberType = memberClass.type; | 13006 InterfaceType memberType = memberClass.type; |
12890 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_
INSTANCE_MEMBER, nameNode, [memberType.displayName]); | 13007 _errorReporter.reportError2(StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_
INSTANCE_MEMBER, nameNode, [memberType.displayName]); |
12891 return true; | 13008 return true; |
12892 } | 13009 } |
12893 | 13010 |
12894 /** | 13011 /** |
12895 * This verifies that the passed constructor declaration is 'const' then there
are no non-final | 13012 * This verifies that if the passed constructor declaration is 'const' then th
ere are no |
| 13013 * invocations of non-'const' super constructors. |
| 13014 * |
| 13015 * @param node the constructor declaration to evaluate |
| 13016 * @return `true` if and only if an error code is generated on the passed node |
| 13017 * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER |
| 13018 */ |
| 13019 bool checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) { |
| 13020 if (!_isEnclosingConstructorConst) { |
| 13021 return false; |
| 13022 } |
| 13023 if (node.factoryKeyword != null) { |
| 13024 return false; |
| 13025 } |
| 13026 for (ConstructorInitializer initializer in node.initializers) { |
| 13027 if (initializer is SuperConstructorInvocation) { |
| 13028 SuperConstructorInvocation superInvocation = initializer as SuperConstru
ctorInvocation; |
| 13029 ConstructorElement element = superInvocation.element; |
| 13030 if (element.isConst) { |
| 13031 return false; |
| 13032 } |
| 13033 _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_
NON_CONST_SUPER, superInvocation, []); |
| 13034 return true; |
| 13035 } |
| 13036 } |
| 13037 InterfaceType supertype = _enclosingClass.supertype; |
| 13038 if (supertype == null) { |
| 13039 return false; |
| 13040 } |
| 13041 if (supertype.isObject) { |
| 13042 return false; |
| 13043 } |
| 13044 ConstructorElement unnamedConstructor = supertype.element.unnamedConstructor
; |
| 13045 if (unnamedConstructor == null) { |
| 13046 return false; |
| 13047 } |
| 13048 if (unnamedConstructor.isConst) { |
| 13049 return false; |
| 13050 } |
| 13051 _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_
CONST_SUPER, node, []); |
| 13052 return true; |
| 13053 } |
| 13054 |
| 13055 /** |
| 13056 * This verifies that if the passed constructor declaration is 'const' then th
ere are no non-final |
12896 * instance variable. | 13057 * instance variable. |
12897 * | 13058 * |
12898 * @param node the constructor declaration to evaluate | 13059 * @param node the constructor declaration to evaluate |
12899 * @return `true` if and only if an error code is generated on the passed node | 13060 * @return `true` if and only if an error code is generated on the passed node |
12900 * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD | 13061 * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD |
12901 */ | 13062 */ |
12902 bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) { | 13063 bool checkForConstConstructorWithNonFinalField(ConstructorDeclaration node) { |
12903 if (!_isEnclosingConstructorConst) { | 13064 if (!_isEnclosingConstructorConst) { |
12904 return false; | 13065 return false; |
12905 } | 13066 } |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13087 if (defaultFormalParameter.defaultValue != null) { | 13248 if (defaultFormalParameter.defaultValue != null) { |
13088 _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNC
TION_TYPE_ALIAS, node, []); | 13249 _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNC
TION_TYPE_ALIAS, node, []); |
13089 result = true; | 13250 result = true; |
13090 } | 13251 } |
13091 } | 13252 } |
13092 } | 13253 } |
13093 return result; | 13254 return result; |
13094 } | 13255 } |
13095 | 13256 |
13096 /** | 13257 /** |
| 13258 * This verifies that the given default formal parameter is not part of a func
tion typed |
| 13259 * parameter. |
| 13260 * |
| 13261 * @param node the default formal parameter to evaluate |
| 13262 * @return `true` if and only if an error code is generated on the passed node |
| 13263 * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER |
| 13264 */ |
| 13265 bool checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node)
{ |
| 13266 if (!_isInFunctionTypedFormalParameter) { |
| 13267 return false; |
| 13268 } |
| 13269 if (node.defaultValue == null) { |
| 13270 return false; |
| 13271 } |
| 13272 _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_T
YPED_PARAMETER, node, []); |
| 13273 return true; |
| 13274 } |
| 13275 |
| 13276 /** |
13097 * This verifies that the enclosing class does not have an instance member wit
h the given name of | 13277 * This verifies that the enclosing class does not have an instance member wit
h the given name of |
13098 * the static member. | 13278 * the static member. |
13099 * | 13279 * |
13100 * @return `true` if and only if an error code is generated on the passed node | 13280 * @return `true` if and only if an error code is generated on the passed node |
13101 * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE | 13281 * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE |
13102 */ | 13282 */ |
13103 bool checkForDuplicateDefinitionInheritance() { | 13283 bool checkForDuplicateDefinitionInheritance() { |
13104 if (_enclosingClass == null) { | 13284 if (_enclosingClass == null) { |
13105 return false; | 13285 return false; |
13106 } | 13286 } |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13562 if (errors == null || errors.isEmpty) { | 13742 if (errors == null || errors.isEmpty) { |
13563 return false; | 13743 return false; |
13564 } | 13744 } |
13565 for (AnalysisError error in errors) { | 13745 for (AnalysisError error in errors) { |
13566 _errorReporter.reportError(error); | 13746 _errorReporter.reportError(error); |
13567 } | 13747 } |
13568 return true; | 13748 return true; |
13569 } | 13749 } |
13570 | 13750 |
13571 /** | 13751 /** |
| 13752 * This checks that if the given "target" is not a type reference then the "na
me" is reference to |
| 13753 * a instance member. |
| 13754 * |
| 13755 * @param target the target of the name access to evaluate |
| 13756 * @param name the accessed name to evaluate |
| 13757 * @return `true` if and only if an error code is generated on the passed node |
| 13758 * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER |
| 13759 */ |
| 13760 bool checkForInstanceAccessToStaticMember(Expression target, SimpleIdentifier
name2) { |
| 13761 if (target == null) { |
| 13762 return false; |
| 13763 } |
| 13764 if (_isInComment) { |
| 13765 return false; |
| 13766 } |
| 13767 Element element = name2.element; |
| 13768 if (element is! ExecutableElement) { |
| 13769 return false; |
| 13770 } |
| 13771 ExecutableElement executableElement = element as ExecutableElement; |
| 13772 if (executableElement.enclosingElement is! ClassElement) { |
| 13773 return false; |
| 13774 } |
| 13775 if (!executableElement.isStatic) { |
| 13776 return false; |
| 13777 } |
| 13778 if (isTypeReference(target)) { |
| 13779 return false; |
| 13780 } |
| 13781 _errorReporter.reportError2(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_
MEMBER, name2, [name2.name]); |
| 13782 return true; |
| 13783 } |
| 13784 |
| 13785 /** |
13572 * This verifies that an 'int' can be assigned to the parameter corresponding
to the given | 13786 * This verifies that an 'int' can be assigned to the parameter corresponding
to the given |
13573 * expression. This is used for prefix and postfix expressions where the argum
ent value is | 13787 * expression. This is used for prefix and postfix expressions where the argum
ent value is |
13574 * implicit. | 13788 * implicit. |
13575 * | 13789 * |
13576 * @param argument the expression to which the operator is being applied | 13790 * @param argument the expression to which the operator is being applied |
13577 * @return `true` if and only if an error code is generated on the passed node | 13791 * @return `true` if and only if an error code is generated on the passed node |
13578 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE | 13792 * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE |
13579 * @see CompileTimeErrorCode#ARGUMENT_TYPE_NOT_ASSIGNABLE | 13793 * @see CompileTimeErrorCode#ARGUMENT_TYPE_NOT_ASSIGNABLE |
13580 */ | 13794 */ |
13581 bool checkForIntNotAssignable(Expression argument) { | 13795 bool checkForIntNotAssignable(Expression argument) { |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13724 TypeArgumentList typeArgumentList = node.typeArguments; | 13938 TypeArgumentList typeArgumentList = node.typeArguments; |
13725 if (typeArgumentList == null) { | 13939 if (typeArgumentList == null) { |
13726 return false; | 13940 return false; |
13727 } | 13941 } |
13728 NodeList<TypeName> typeArguments = typeArgumentList.arguments; | 13942 NodeList<TypeName> typeArguments = typeArgumentList.arguments; |
13729 if (typeArguments.length < 1) { | 13943 if (typeArguments.length < 1) { |
13730 return false; | 13944 return false; |
13731 } | 13945 } |
13732 Type2 listElementType = typeArguments[0].type; | 13946 Type2 listElementType = typeArguments[0].type; |
13733 ErrorCode errorCode; | 13947 ErrorCode errorCode; |
13734 if (node.modifier != null) { | 13948 if (node.constKeyword != null) { |
13735 errorCode = CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE; | 13949 errorCode = CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE; |
13736 } else { | 13950 } else { |
13737 errorCode = StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE; | 13951 errorCode = StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE; |
13738 } | 13952 } |
13739 bool hasProblems = false; | 13953 bool hasProblems = false; |
13740 for (Expression element in node.elements) { | 13954 for (Expression element in node.elements) { |
13741 hasProblems = javaBooleanOr(hasProblems, checkForArgumentTypeNotAssignable
3(element, listElementType, null, errorCode)); | 13955 hasProblems = javaBooleanOr(hasProblems, checkForArgumentTypeNotAssignable
3(element, listElementType, null, errorCode)); |
13742 } | 13956 } |
13743 return hasProblems; | 13957 return hasProblems; |
13744 } | 13958 } |
(...skipping 15 matching lines...) Expand all Loading... |
13760 return false; | 13974 return false; |
13761 } | 13975 } |
13762 NodeList<TypeName> typeArguments = typeArgumentList.arguments; | 13976 NodeList<TypeName> typeArguments = typeArgumentList.arguments; |
13763 if (typeArguments.length < 2) { | 13977 if (typeArguments.length < 2) { |
13764 return false; | 13978 return false; |
13765 } | 13979 } |
13766 Type2 keyType = typeArguments[0].type; | 13980 Type2 keyType = typeArguments[0].type; |
13767 Type2 valueType = typeArguments[1].type; | 13981 Type2 valueType = typeArguments[1].type; |
13768 ErrorCode keyErrorCode; | 13982 ErrorCode keyErrorCode; |
13769 ErrorCode valueErrorCode; | 13983 ErrorCode valueErrorCode; |
13770 if (node.modifier != null) { | 13984 if (node.constKeyword != null) { |
13771 keyErrorCode = CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE; | 13985 keyErrorCode = CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE; |
13772 valueErrorCode = CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE; | 13986 valueErrorCode = CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE; |
13773 } else { | 13987 } else { |
13774 keyErrorCode = StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE; | 13988 keyErrorCode = StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE; |
13775 valueErrorCode = StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE; | 13989 valueErrorCode = StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE; |
13776 } | 13990 } |
13777 bool hasProblems = false; | 13991 bool hasProblems = false; |
13778 NodeList<MapLiteralEntry> entries = node.entries; | 13992 NodeList<MapLiteralEntry> entries = node.entries; |
13779 for (MapLiteralEntry entry in entries) { | 13993 for (MapLiteralEntry entry in entries) { |
13780 Expression key = entry.key; | 13994 Expression key = entry.key; |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14149 * * has `const modifier` | 14363 * * has `const modifier` |
14150 * * has explicit type arguments | 14364 * * has explicit type arguments |
14151 * * is not start of the statement | 14365 * * is not start of the statement |
14152 * | 14366 * |
14153 * | 14367 * |
14154 * @param node the map literal to evaluate | 14368 * @param node the map literal to evaluate |
14155 * @return `true` if and only if an error code is generated on the passed node | 14369 * @return `true` if and only if an error code is generated on the passed node |
14156 * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT | 14370 * @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT |
14157 */ | 14371 */ |
14158 bool checkForNonConstMapAsExpressionStatement(MapLiteral node) { | 14372 bool checkForNonConstMapAsExpressionStatement(MapLiteral node) { |
14159 if (node.modifier != null) { | 14373 if (node.constKeyword != null) { |
14160 return false; | 14374 return false; |
14161 } | 14375 } |
14162 if (node.typeArguments != null) { | 14376 if (node.typeArguments != null) { |
14163 return false; | 14377 return false; |
14164 } | 14378 } |
14165 Statement statement = node.getAncestor(ExpressionStatement); | 14379 Statement statement = node.getAncestor(ExpressionStatement); |
14166 if (statement == null) { | 14380 if (statement == null) { |
14167 return false; | 14381 return false; |
14168 } | 14382 } |
14169 if (statement.beginToken != node.beginToken) { | 14383 if (statement.beginToken != node.beginToken) { |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14685 Type2 argType = argTypeName.type; | 14899 Type2 argType = argTypeName.type; |
14686 Type2 boundType = boundingElts[i].bound; | 14900 Type2 boundType = boundingElts[i].bound; |
14687 if (argType != null && boundType != null) { | 14901 if (argType != null && boundType != null) { |
14688 if (!argType.isSubtypeOf(boundType)) { | 14902 if (!argType.isSubtypeOf(boundType)) { |
14689 ErrorCode errorCode; | 14903 ErrorCode errorCode; |
14690 if (isInConstConstructorInvocation(node)) { | 14904 if (isInConstConstructorInvocation(node)) { |
14691 errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS; | 14905 errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS; |
14692 } else { | 14906 } else { |
14693 errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS; | 14907 errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS; |
14694 } | 14908 } |
14695 _errorReporter.reportError2(errorCode, argTypeName, [argTypeName.name,
boundType.displayName]); | 14909 _errorReporter.reportError2(errorCode, argTypeName, [argType.displayNa
me, boundType.displayName]); |
14696 foundError = true; | 14910 foundError = true; |
14697 } | 14911 } |
14698 } | 14912 } |
14699 } | 14913 } |
14700 return foundError; | 14914 return foundError; |
14701 } | 14915 } |
14702 | 14916 |
14703 /** | 14917 /** |
14704 * This checks that if the passed type name is a type parameter being used to
define a static | 14918 * This checks that if the passed type name is a type parameter being used to
define a static |
14705 * member. | 14919 * member. |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15214 this._type = type; | 15428 this._type = type; |
15215 this._message = message; | 15429 this._message = message; |
15216 } | 15430 } |
15217 ErrorSeverity get errorSeverity => _type.severity; | 15431 ErrorSeverity get errorSeverity => _type.severity; |
15218 String get message => _message; | 15432 String get message => _message; |
15219 ErrorType get type => _type; | 15433 ErrorType get type => _type; |
15220 int compareTo(ResolverErrorCode other) => ordinal - other.ordinal; | 15434 int compareTo(ResolverErrorCode other) => ordinal - other.ordinal; |
15221 int get hashCode => ordinal; | 15435 int get hashCode => ordinal; |
15222 String toString() => name; | 15436 String toString() => name; |
15223 } | 15437 } |
OLD | NEW |