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

Unified Diff: pkg/analyzer_experimental/lib/src/generated/resolver.dart

Issue 23080005: New analysis_experimental snapshot. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer_experimental/lib/src/generated/resolver.dart
diff --git a/pkg/analyzer_experimental/lib/src/generated/resolver.dart b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
index 2b056f4fb0cc30321c426187bce518ed4102dd63..339a518ca6c59f0291059384e00a9b12951dff75 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -602,7 +602,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
if (element is PropertyInducingElementImpl) {
PropertyInducingElementImpl variable = element as PropertyInducingElementImpl;
if (_inFieldContext) {
- ((variable as FieldElementImpl)).static = matches(((node.parent.parent as FieldDeclaration)).keyword, sc.Keyword.STATIC);
+ ((variable as FieldElementImpl)).static = matches(((node.parent.parent as FieldDeclaration)).staticKeyword, sc.Keyword.STATIC);
}
PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl.con2(variable);
getter.getter = true;
@@ -1031,6 +1031,11 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
RecordingErrorListener _errorListener;
/**
+ * The modification time of the source for which an element is being built.
+ */
+ int _modificationStamp = 0;
+
+ /**
* The line information associated with the source for which an element is being built, or
* `null` if we are not building an element.
*/
@@ -1073,16 +1078,19 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
* @return the HTML element that was built
* @throws AnalysisException if the analysis could not be performed
*/
- HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, _context.parseHtmlUnit(source));
+ HtmlElementImpl buildHtmlElement(Source source) => buildHtmlElement2(source, source.modificationStamp, _context.parseHtmlUnit(source));
/**
* Build the HTML element for the given source.
*
* @param source the source describing the compilation unit
+ * @param modificationStamp the modification time of the source for which an element is being
+ * built
* @param unit the AST structure representing the HTML
* @throws AnalysisException if the analysis could not be performed
*/
- HtmlElementImpl buildHtmlElement2(Source source2, ht.HtmlUnit unit) {
+ HtmlElementImpl buildHtmlElement2(Source source2, int modificationStamp2, ht.HtmlUnit unit) {
+ this._modificationStamp = modificationStamp2;
_lineInfo = _context.computeLineInfo(source2);
HtmlElementImpl result = new HtmlElementImpl(_context, source2.shortName);
result.source = source2;
@@ -1162,7 +1170,7 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
unit.lineInfo = new LineInfo(lineStarts);
try {
LibraryResolver resolver = new LibraryResolver(_context);
- LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSource, unit, true) as LibraryElementImpl;
+ LibraryElementImpl library = resolver.resolveEmbeddedLibrary(htmlSource, _modificationStamp, unit, true) as LibraryElementImpl;
script.scriptLibrary = library;
_resolvedLibraries.addAll(resolver.resolvedLibraries);
_errorListener.addAll(resolver.errorListener);
@@ -1174,14 +1182,15 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
ExternalHtmlScriptElementImpl script = new ExternalHtmlScriptElementImpl(node);
if (scriptSourcePath != null) {
try {
+ scriptSourcePath = Uri.encodeFull(scriptSourcePath);
parseUriWithException(scriptSourcePath);
Source scriptSource = _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath);
script.scriptSource = scriptSource;
- if (!scriptSource.exists()) {
- reportError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute.offset + 1, scriptSourcePath.length, [scriptSourcePath]);
+ if (scriptSource == null || !scriptSource.exists()) {
+ reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, scriptAttribute, [scriptSourcePath]);
}
} on URISyntaxException catch (exception) {
- reportError(HtmlWarningCode.INVALID_URI, scriptAttribute.offset + 1, scriptSourcePath.length, [scriptSourcePath]);
+ reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [scriptSourcePath]);
}
}
_scripts.add(script);
@@ -1246,6 +1255,21 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
void reportError(ErrorCode errorCode, int offset, int length, List<Object> arguments) {
_errorListener.onError(new AnalysisError.con2(_htmlElement.source, offset, length, errorCode, arguments));
}
+
+ /**
+ * Report an error with the given error code at the location of the value of the given attribute.
+ * Use the given arguments to compose the error message.
+ *
+ * @param errorCode the error code of the error to be reported
+ * @param offset the offset of the first character to be highlighted
+ * @param length the number of characters to be highlighted
+ * @param arguments the arguments used to compose the error message
+ */
+ void reportValueError(ErrorCode errorCode, ht.XmlAttributeNode attribute, List<Object> arguments) {
+ int offset = attribute.value.offset + 1;
+ int length = attribute.value.length - 2;
+ reportError(errorCode, offset, length, arguments);
+ }
}
/**
* Instances of the class `DeadCodeVerifier` traverse an AST structure looking for cases of
@@ -1350,7 +1374,7 @@ class DeadCodeVerifier extends RecursiveASTVisitor<Object> {
}
Object visitTryStatement(TryStatement node) {
safelyVisit(node.body);
- safelyVisit(node.finallyClause);
+ safelyVisit(node.finallyBlock);
NodeList<CatchClause> catchClauses = node.catchClauses;
int numOfCatchClauses = catchClauses.length;
List<Type2> visitedTypes = new List<Type2>();
@@ -1602,7 +1626,7 @@ class ImportsVerifier extends RecursiveASTVisitor<Object> {
}
}
putIntoLibraryMap(libraryElement, importDirective);
- addAdditionalLibrariesForExports(_libraryMap, libraryElement, importDirective, new List<LibraryElement>());
+ addAdditionalLibrariesForExports(libraryElement, importDirective, new List<LibraryElement>());
}
}
}
@@ -1632,14 +1656,14 @@ class ImportsVerifier extends RecursiveASTVisitor<Object> {
/**
* Recursively add any exported library elements into the [libraryMap].
*/
- void addAdditionalLibrariesForExports(Map<LibraryElement, List<ImportDirective>> map, LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
+ void addAdditionalLibrariesForExports(LibraryElement library, ImportDirective importDirective, List<LibraryElement> exportPath) {
if (exportPath.contains(library)) {
return;
}
+ exportPath.add(library);
for (LibraryElement exportedLibraryElt in library.exportedLibraries) {
putIntoLibraryMap(exportedLibraryElt, importDirective);
- exportPath.add(exportedLibraryElt);
- addAdditionalLibrariesForExports(map, exportedLibraryElt, importDirective, exportPath);
+ addAdditionalLibrariesForExports(exportedLibraryElt, importDirective, exportPath);
}
}
@@ -1762,7 +1786,7 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
if (JavaString.startsWithBefore(fullName, "/lib", fullNameIndex - 4)) {
String relativePubspecPath = path.substring(0, pathIndex + 3) + _PUBSPEC_YAML;
Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
- if (pubspecSource.exists()) {
+ if (pubspecSource != null && pubspecSource.exists()) {
_errorReporter.reportError2(PubSuggestionCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, uriLiteral, []);
}
return true;
@@ -1802,7 +1826,7 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
Source source = getSource(uriLiteral);
String relativePubspecPath = path.substring(0, pathIndex) + _PUBSPEC_YAML;
Source pubspecSource = _context.sourceFactory.resolveUri(source, relativePubspecPath);
- if (!pubspecSource.exists()) {
+ if (pubspecSource == null || !pubspecSource.exists()) {
return false;
}
String fullName = getSourceFullName(source);
@@ -2499,6 +2523,16 @@ class ElementResolver extends SimpleASTVisitor<Object> {
bool _strictMode = false;
/**
+ * The type representing the type 'dynamic'.
+ */
+ Type2 _dynamicType;
+
+ /**
+ * The type representing the type 'type'.
+ */
+ Type2 _typeType;
+
+ /**
* The name of the method that can be implemented by a class to allow its instances to be invoked
* as if they were a function.
*/
@@ -2518,6 +2552,8 @@ class ElementResolver extends SimpleASTVisitor<Object> {
ElementResolver(ResolverVisitor resolver) {
this._resolver = resolver;
_strictMode = resolver.definingLibrary.context.analysisOptions.strictMode;
+ _dynamicType = resolver.typeProvider.dynamicType;
+ _typeType = resolver.typeProvider.typeType;
}
Object visitAssignmentExpression(AssignmentExpression node) {
sc.Token operator = node.operator;
@@ -2868,8 +2904,8 @@ class ElementResolver extends SimpleASTVisitor<Object> {
ErrorCode errorCode = checkForInvocationError(target, staticElement);
if (identical(errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) {
_resolver.reportError(StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, [methodName.name]);
- } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
- _resolver.reportError(StaticTypeWarningCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
+ } else if (identical(errorCode, CompileTimeErrorCode.UNDEFINED_FUNCTION)) {
+ _resolver.reportError(CompileTimeErrorCode.UNDEFINED_FUNCTION, methodName, [methodName.name]);
} else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
String targetTypeName;
if (target == null) {
@@ -3007,6 +3043,11 @@ class ElementResolver extends SimpleASTVisitor<Object> {
if (node.staticElement != null || node.element != null) {
return null;
}
+ if (node.name == _dynamicType.name) {
+ recordResolution(node, _dynamicType.element);
+ node.staticType = _typeType;
+ return null;
+ }
Element element = resolveSimpleIdentifier(node);
if (isFactoryConstructorReturnType(node) && element != _resolver.enclosingClass) {
_resolver.reportError(CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS, node, []);
@@ -3111,6 +3152,9 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* @return the error code that should be reported
*/
ErrorCode checkForInvocationError(Expression target, Element element) {
+ if (element is PrefixElement) {
+ element = null;
+ }
if (element is PropertyAccessorElement) {
FunctionType getterType = ((element as PropertyAccessorElement)).type;
if (getterType != null) {
@@ -3141,17 +3185,19 @@ class ElementResolver extends SimpleASTVisitor<Object> {
} else {
if (target == null) {
ClassElement enclosingClass = _resolver.enclosingClass;
- if (enclosingClass == null) {
- return StaticTypeWarningCode.UNDEFINED_FUNCTION;
- } else if (element == null) {
- return StaticTypeWarningCode.UNDEFINED_METHOD;
+ if (element == null) {
+ if (enclosingClass == null) {
+ return CompileTimeErrorCode.UNDEFINED_FUNCTION;
+ } else {
+ return StaticTypeWarningCode.UNDEFINED_METHOD;
+ }
} else {
return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
}
} else {
Type2 targetType = getStaticType(target);
if (targetType == null) {
- return StaticTypeWarningCode.UNDEFINED_FUNCTION;
+ return CompileTimeErrorCode.UNDEFINED_FUNCTION;
} else if (!targetType.isDynamic) {
return StaticTypeWarningCode.UNDEFINED_METHOD;
}
@@ -4448,14 +4494,11 @@ class InheritanceManager {
_classLookup[superclassElt] = resultMap;
return resultMap;
}
- recordMapWithClassMembers(resultMap, superclassElt);
+ recordMapWithClassMembers(resultMap, supertype);
}
List<InterfaceType> mixins = classElt.mixins;
for (int i = mixins.length - 1; i >= 0; i--) {
- ClassElement mixinElement = mixins[i].element;
- if (mixinElement != null) {
- recordMapWithClassMembers(resultMap, mixinElement);
- }
+ recordMapWithClassMembers(resultMap, mixins[i]);
}
_classLookup[classElt] = resultMap;
return resultMap;
@@ -4530,16 +4573,26 @@ class InheritanceManager {
ClassElement superclassElement = supertype != null ? supertype.element : null;
List<InterfaceType> mixins = classElt.mixins;
List<InterfaceType> interfaces = classElt.interfaces;
- if ((superclassElement == null || supertype.isObject) && mixins.length == 0 && interfaces.length == 0) {
- _interfaceLookup[classElt] = resultMap;
- return resultMap;
- }
List<Map<String, ExecutableElement>> lookupMaps = new List<Map<String, ExecutableElement>>();
if (superclassElement != null) {
if (!visitedInterfaces.contains(superclassElement)) {
try {
javaSetAdd(visitedInterfaces, superclassElement);
- lookupMaps.add(computeInterfaceLookupMap(superclassElement, visitedInterfaces));
+ Map<String, ExecutableElement> map = computeInterfaceLookupMap(superclassElement, visitedInterfaces);
+ map = new Map<String, ExecutableElement>.from(map);
+ List<MethodElement> methods = supertype.methods;
+ for (MethodElement method in methods) {
+ if (method.isAccessibleIn(_library) && !method.isStatic) {
+ map[method.name] = method;
+ }
+ }
+ List<PropertyAccessorElement> accessors = supertype.accessors;
+ for (PropertyAccessorElement accessor in accessors) {
+ if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+ map[accessor.name] = accessor;
+ }
+ }
+ lookupMaps.add(map);
} finally {
visitedInterfaces.remove(superclassElement);
}
@@ -4554,12 +4607,8 @@ class InheritanceManager {
}
}
for (InterfaceType mixinType in mixins) {
- ClassElement mixinElement = mixinType.element;
- if (mixinElement == null) {
- continue;
- }
Map<String, ExecutableElement> mapWithMixinMembers = new Map<String, ExecutableElement>();
- recordMapWithClassMembers(mapWithMixinMembers, mixinElement);
+ recordMapWithClassMembers(mapWithMixinMembers, mixinType);
lookupMaps.add(mapWithMixinMembers);
}
for (InterfaceType interfaceType in interfaces) {
@@ -4568,7 +4617,21 @@ class InheritanceManager {
if (!visitedInterfaces.contains(interfaceElement)) {
try {
javaSetAdd(visitedInterfaces, interfaceElement);
- lookupMaps.add(computeInterfaceLookupMap(interfaceElement, visitedInterfaces));
+ Map<String, ExecutableElement> map = computeInterfaceLookupMap(interfaceElement, visitedInterfaces);
+ map = new Map<String, ExecutableElement>.from(map);
+ List<MethodElement> methods = interfaceType.methods;
+ for (MethodElement method in methods) {
+ if (method.isAccessibleIn(_library) && !method.isStatic) {
+ map[method.name] = method;
+ }
+ }
+ List<PropertyAccessorElement> accessors = interfaceType.accessors;
+ for (PropertyAccessorElement accessor in accessors) {
+ if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+ map[accessor.name] = accessor;
+ }
+ }
+ lookupMaps.add(map);
} finally {
visitedInterfaces.remove(interfaceElement);
}
@@ -4591,72 +4654,12 @@ class InheritanceManager {
for (Map<String, ExecutableElement> lookupMap in lookupMaps) {
for (MapEntry<String, ExecutableElement> entry in getMapEntrySet(lookupMap)) {
String key = entry.getKey();
- if (!unionMap.containsKey(key)) {
- Set<ExecutableElement> set = new Set<ExecutableElement>();
- javaSetAdd(set, entry.getValue());
+ Set<ExecutableElement> set = unionMap[key];
+ if (set == null) {
+ set = new Set<ExecutableElement>();
unionMap[key] = set;
- } else {
- javaSetAdd(unionMap[key], entry.getValue());
- }
- }
- }
- if (superclassElement != null) {
- List<MethodElement> methods = superclassElement.methods;
- for (MethodElement method in methods) {
- if (method.isAccessibleIn(_library) && !method.isStatic) {
- String key = method.name;
- if (!unionMap.containsKey(key)) {
- Set<ExecutableElement> set = new Set<ExecutableElement>();
- javaSetAdd(set, method);
- unionMap[key] = set;
- } else {
- javaSetAdd(unionMap[key], method);
- }
- }
- }
- List<PropertyAccessorElement> accessors = superclassElement.accessors;
- for (PropertyAccessorElement accessor in accessors) {
- if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
- String key = accessor.name;
- if (!unionMap.containsKey(key)) {
- Set<ExecutableElement> set = new Set<ExecutableElement>();
- javaSetAdd(set, accessor);
- unionMap[key] = set;
- } else {
- javaSetAdd(unionMap[key], accessor);
- }
- }
- }
- }
- for (InterfaceType interfaceType in interfaces) {
- ClassElement interfaceElement = interfaceType.element;
- if (interfaceElement != null) {
- List<MethodElement> methods = interfaceElement.methods;
- for (MethodElement method in methods) {
- if (method.isAccessibleIn(_library) && !method.isStatic) {
- String key = method.name;
- if (!unionMap.containsKey(key)) {
- Set<ExecutableElement> set = new Set<ExecutableElement>();
- javaSetAdd(set, method);
- unionMap[key] = set;
- } else {
- javaSetAdd(unionMap[key], method);
- }
- }
- }
- List<PropertyAccessorElement> accessors = interfaceElement.accessors;
- for (PropertyAccessorElement accessor in accessors) {
- if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
- String key = accessor.name;
- if (!unionMap.containsKey(key)) {
- Set<ExecutableElement> set = new Set<ExecutableElement>();
- javaSetAdd(set, accessor);
- unionMap[key] = set;
- } else {
- javaSetAdd(unionMap[key], accessor);
- }
- }
}
+ javaSetAdd(set, entry.getValue());
}
}
for (MapEntry<String, Set<ExecutableElement>> entry in getMapEntrySet(unionMap)) {
@@ -4750,21 +4753,21 @@ class InheritanceManager {
}
/**
- * Record the passed map with the set of all members (methods, getters and setters) in the class
+ * Record the passed map with the set of all members (methods, getters and setters) in the type
* into the passed map.
*
* @param map some non-`null` map to put the methods and accessors from the passed
* [ClassElement] into
- * @param classElt the class element that will be recorded into the passed map
+ * @param type the type that will be recorded into the passed map
*/
- void recordMapWithClassMembers(Map<String, ExecutableElement> map, ClassElement classElt) {
- List<MethodElement> methods = classElt.methods;
+ void recordMapWithClassMembers(Map<String, ExecutableElement> map, InterfaceType type) {
+ List<MethodElement> methods = type.methods;
for (MethodElement method in methods) {
if (method.isAccessibleIn(_library) && !method.isStatic) {
map[method.name] = method;
}
}
- List<PropertyAccessorElement> accessors = classElt.accessors;
+ List<PropertyAccessorElement> accessors = type.accessors;
for (PropertyAccessorElement accessor in accessors) {
if (accessor.isAccessibleIn(_library) && !accessor.isStatic) {
map[accessor.name] = accessor;
@@ -4850,7 +4853,7 @@ class Library {
* A table mapping the sources for the compilation units in this library to their corresponding
* AST structures.
*/
- Map<Source, CompilationUnit> _astMap = new Map<Source, CompilationUnit>();
+ Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCompilationUnit>();
/**
* The library scope used when resolving elements within this library's compilation units.
@@ -4884,12 +4887,12 @@ class Library {
* @throws AnalysisException if an AST structure could not be created for the compilation unit
*/
CompilationUnit getAST(Source source) {
- CompilationUnit unit = _astMap[source];
- if (unit == null) {
- unit = _analysisContext.computeResolvableCompilationUnit(source);
- _astMap[source] = unit;
+ ResolvableCompilationUnit holder = _astMap[source];
+ if (holder == null) {
+ holder = _analysisContext.computeResolvableCompilationUnit(source);
+ _astMap[source] = holder;
}
- return unit;
+ return holder.compilationUnit;
}
/**
@@ -5013,6 +5016,22 @@ class Library {
Source get librarySource => _librarySource;
/**
+ * Return the modification stamp associated with the given source.
+ *
+ * @param source the source representing the compilation unit whose AST is to be returned
+ * @return the AST structure associated with the given source
+ * @throws AnalysisException if an AST structure could not be created for the compilation unit
+ */
+ int getModificationStamp(Source source) {
+ ResolvableCompilationUnit holder = _astMap[source];
+ if (holder == null) {
+ holder = _analysisContext.computeResolvableCompilationUnit(source);
+ _astMap[source] = holder;
+ }
+ return holder.modificationStamp;
+ }
+
+ /**
* Return the result of resolving the URI of the given URI-based directive against the URI of the
* library, or `null` if the URI is not valid. If the URI is not valid, report the error.
*
@@ -5030,7 +5049,7 @@ class Library {
uriContent = Uri.encodeFull(uriContent);
try {
parseUriWithException(uriContent);
- Source source = getSource2(uriContent);
+ Source source = _analysisContext.sourceFactory.resolveUri(_librarySource, uriContent);
if (source == null || !source.exists()) {
_errorListener.onError(new AnalysisError.con2(_librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
}
@@ -5050,10 +5069,12 @@ class Library {
* Set the AST structure associated with the defining compilation unit for this library to the
* given AST structure.
*
+ * @param modificationStamp the modification time of the source from which the compilation unit
+ * was created
* @param unit the AST structure associated with the defining compilation unit for this library
*/
- void set definingCompilationUnit(CompilationUnit unit) {
- _astMap[_librarySource] = unit;
+ void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) {
+ _astMap[_librarySource] = new ResolvableCompilationUnit(modificationStamp, unit);
}
/**
@@ -5095,20 +5116,6 @@ class Library {
}
}
String toString() => _librarySource.shortName;
-
- /**
- * Return the result of resolving the given URI against the URI of the library, or `null` if
- * the URI is not valid.
- *
- * @param uri the URI to be resolved
- * @return the result of resolving the given URI against the URI of the library
- */
- Source getSource2(String uri) {
- if (uri == null) {
- return null;
- }
- return _analysisContext.sourceFactory.resolveUri(_librarySource, uri);
- }
}
/**
* Instances of the class `LibraryElementBuilder` build an element model for a single library.
@@ -5388,17 +5395,19 @@ class LibraryResolver {
*
* @param librarySource the source specifying the defining compilation unit of the library to be
* resolved
+ * @param modificationStamp the time stamp of the source from which the compilation unit was
+ * created
* @param unit the compilation unit representing the embedded library
* @param fullAnalysis `true` if a full analysis should be performed
* @return the element representing the resolved library
* @throws AnalysisException if the library could not be resolved for some reason
*/
- LibraryElement resolveEmbeddedLibrary(Source librarySource, CompilationUnit unit, bool fullAnalysis) {
+ LibraryElement resolveEmbeddedLibrary(Source librarySource, int modificationStamp, CompilationUnit unit, bool fullAnalysis) {
InstrumentationBuilder instrumentation = Instrumentation.builder2("dart.engine.LibraryResolver.resolveEmbeddedLibrary");
try {
instrumentation.metric("fullAnalysis", fullAnalysis);
instrumentation.data3("fullName", librarySource.fullName);
- Library targetLibrary = createLibrary2(librarySource, unit);
+ Library targetLibrary = createLibrary2(librarySource, modificationStamp, unit);
_coreLibrary = _libraryMap[_coreLibrarySource];
if (_coreLibrary == null) {
_coreLibrary = createLibrary(_coreLibrarySource);
@@ -5820,12 +5829,15 @@ class LibraryResolver {
* with the given source.
*
* @param librarySource the source of the library's defining compilation unit
+ * @param modificationStamp the modification time of the source from which the compilation unit
+ * was created
+ * @param unit the compilation unit that defines the library
* @return the library object that was created
* @throws AnalysisException if the library source is not valid
*/
- Library createLibrary2(Source librarySource, CompilationUnit unit) {
+ Library createLibrary2(Source librarySource, int modificationStamp, CompilationUnit unit) {
Library library = new Library(_analysisContext, _errorListener, librarySource);
- library.definingCompilationUnit = unit;
+ library.setDefiningCompilationUnit(modificationStamp, unit);
_libraryMap[librarySource] = library;
return library;
}
@@ -5943,16 +5955,11 @@ class LibraryResolver {
return null;
}
String uriContent = uriLiteral.stringValue.trim();
- if (uriContent == null) {
+ if (uriContent == null || uriContent.isEmpty) {
return null;
}
uriContent = Uri.encodeFull(uriContent);
- try {
- parseUriWithException(uriContent);
- return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
- } on URISyntaxException catch (exception) {
- return null;
- }
+ return _analysisContext.sourceFactory.resolveUri(librarySource, uriContent);
}
/**
@@ -6852,7 +6859,9 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
Object visitBlock(Block node) {
Scope outerScope = _nameScope;
try {
- _nameScope = new EnclosedScope(_nameScope);
+ EnclosedScope enclosedScope = new EnclosedScope(_nameScope);
+ hideNamesDefinedInBlock(enclosedScope, node);
+ _nameScope = enclosedScope;
super.visitBlock(node);
} finally {
_nameScope = outerScope;
@@ -7202,6 +7211,28 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
}
return outerScope;
}
+
+ /**
+ * Marks the local declarations of the given [Block] hidden in the enclosing scope.
+ * According to the scoping rules name is hidden if block defines it, but name is defined after
+ * its declaration statement.
+ */
+ void hideNamesDefinedInBlock(EnclosedScope scope, Block block) {
+ for (Statement statement in block.statements) {
+ if (statement is VariableDeclarationStatement) {
+ VariableDeclarationStatement vds = statement as VariableDeclarationStatement;
+ for (VariableDeclaration variableDeclaration in vds.variables.variables) {
+ Element element = variableDeclaration.element;
+ scope.hide(element);
+ }
+ }
+ if (statement is FunctionDeclarationStatement) {
+ FunctionDeclarationStatement fds = statement as FunctionDeclarationStatement;
+ Element element = fds.functionDeclaration.element;
+ scope.hide(element);
+ }
+ }
+ }
}
/**
* Instances of the class `StaticTypeAnalyzer` perform two type-related tasks. First, they
@@ -8966,6 +8997,13 @@ class TypeOverrideManager_TypeOverrideScope {
abstract class TypeProvider {
/**
+ * Return the type representing the built-in type 'Null'.
+ *
+ * @return the type representing the built-in type 'null'
+ */
+ InterfaceType get nullType;
+
+ /**
* Return the type representing the built-in type 'bool'.
*
* @return the type representing the built-in type 'bool'
@@ -9112,6 +9150,11 @@ class TypeProviderImpl implements TypeProvider {
InterfaceType _mapType;
/**
+ * The type representing the type 'Null'.
+ */
+ InterfaceType _nullType;
+
+ /**
* The type representing the built-in type 'num'.
*/
InterfaceType _numType;
@@ -9157,6 +9200,7 @@ class TypeProviderImpl implements TypeProvider {
InterfaceType get intType => _intType;
InterfaceType get listType => _listType;
InterfaceType get mapType => _mapType;
+ InterfaceType get nullType => _nullType;
InterfaceType get numType => _numType;
InterfaceType get objectType => _objectType;
InterfaceType get stackTraceType => _stackTraceType;
@@ -9196,6 +9240,7 @@ class TypeProviderImpl implements TypeProvider {
_intType = getType(namespace, "int");
_listType = getType(namespace, "List");
_mapType = getType(namespace, "Map");
+ _nullType = getType(namespace, "Null");
_numType = getType(namespace, "num");
_objectType = getType(namespace, "Object");
_stackTraceType = getType(namespace, "StackTrace");
@@ -10105,6 +10150,13 @@ class EnclosedScope extends Scope {
Scope _enclosingScope;
/**
+ * A set of names that will be defined in this scope, but right now are not defined. However
+ * according to the scoping rules these names are hidden, even if they were defined in an outer
+ * scope.
+ */
+ Set<String> _hiddenNames = new Set<String>();
+
+ /**
* Initialize a newly created scope enclosed within another scope.
*
* @param enclosingScope the scope in which this scope is lexically enclosed
@@ -10116,6 +10168,21 @@ class EnclosedScope extends Scope {
AnalysisErrorListener get errorListener => _enclosingScope.errorListener;
/**
+ * Hides the name of the given element in this scope. If there is already an element with the
+ * given name defined in an outer scope, then it will become unavailable.
+ *
+ * @param element the element to be hidden in this scope
+ */
+ void hide(Element element) {
+ if (element != null) {
+ String name = element.name;
+ if (name != null && !name.isEmpty) {
+ javaSetAdd(_hiddenNames, name);
+ }
+ }
+ }
+
+ /**
* Return the scope in which this scope is lexically enclosed.
*
* @return the scope in which this scope is lexically enclosed
@@ -10126,6 +10193,9 @@ class EnclosedScope extends Scope {
if (element != null) {
return element;
}
+ if (_hiddenNames.contains(name)) {
+ return null;
+ }
return _enclosingScope.lookup3(identifier, name, referencingLibrary);
}
}
@@ -10973,7 +11043,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
}
Object visitListLiteral(ListLiteral node) {
super.visitListLiteral(node);
- if (node.modifier != null) {
+ if (node.constKeyword != null) {
for (Expression element in node.elements) {
validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT);
}
@@ -10982,7 +11052,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
}
Object visitMapLiteral(MapLiteral node) {
super.visitMapLiteral(node);
- bool isConst = node.modifier != null;
+ bool isConst = node.constKeyword != null;
bool reportEqualKeys = true;
Set<Object> keys = new Set<Object>();
List<Expression> invalidKeys = new List<Expression>();
@@ -11300,6 +11370,12 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This is set to `true` iff the visitor is currently visiting children nodes of an
+ * [Comment].
+ */
+ bool _isInComment = false;
+
+ /**
+ * This is set to `true` iff the visitor is currently visiting children nodes of an
* [InstanceCreationExpression].
*/
bool _isInConstInstanceCreation = false;
@@ -11335,6 +11411,12 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
bool _isInConstructorInitializer = false;
/**
+ * This is set to `true` iff the visitor is currently visiting a
+ * [FunctionTypedFormalParameter].
+ */
+ bool _isInFunctionTypedFormalParameter = false;
+
+ /**
* This is set to `true` iff the visitor is currently visiting a static method. By "method"
* here getter, setter and operator declarations are also implied since they are all represented
* with a [MethodDeclaration] in the AST structure.
@@ -11415,6 +11497,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
_isInStaticMethod = false;
_dynamicType = typeProvider.dynamicType;
_DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = <InterfaceType> [
+ typeProvider.nullType,
typeProvider.numType,
typeProvider.intType,
typeProvider.doubleType,
@@ -11511,6 +11594,14 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
return super.visitClassTypeAlias(node);
}
+ Object visitComment(Comment node) {
+ _isInComment = true;
+ try {
+ return super.visitComment(node);
+ } finally {
+ _isInComment = false;
+ }
+ }
Object visitConditionalExpression(ConditionalExpression node) {
checkForNonBoolCondition(node.condition);
return super.visitConditionalExpression(node);
@@ -11521,13 +11612,15 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
_enclosingFunction = node.element;
_isEnclosingConstructorConst = node.constKeyword != null;
checkForConstConstructorWithNonFinalField(node);
+ checkForConstConstructorWithNonConstSuper(node);
checkForConflictingConstructorNameAndMember(node);
checkForAllFinalInitializedErrorCodes(node);
checkForRedirectingConstructorErrorCodes(node);
checkForMultipleSuperInitializers(node);
checkForRecursiveConstructorRedirect(node);
- checkForRecursiveFactoryRedirect(node);
- checkForAllRedirectConstructorErrorCodes(node);
+ if (!checkForRecursiveFactoryRedirect(node)) {
+ checkForAllRedirectConstructorErrorCodes(node);
+ }
checkForUndefinedConstructorInInitializerImplicit(node);
checkForRedirectToNonConstConstructor(node);
checkForReturnInGenerativeConstructor(node);
@@ -11546,6 +11639,11 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
_isInConstructorInitializer = false;
}
}
+ Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+ checkForInvalidAssignment2(node.identifier, node.defaultValue);
+ checkForDefaultValueInFunctionTypedParameter(node);
+ return super.visitDefaultFormalParameter(node);
+ }
Object visitDoStatement(DoStatement node) {
checkForNonBoolCondition(node.condition);
return super.visitDoStatement(node);
@@ -11629,6 +11727,15 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
checkForTypeAliasCannotReferenceItself_function(node);
return super.visitFunctionTypeAlias(node);
}
+ Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+ bool old = _isInFunctionTypedFormalParameter;
+ _isInFunctionTypedFormalParameter = true;
+ try {
+ return super.visitFunctionTypedFormalParameter(node);
+ } finally {
+ _isInFunctionTypedFormalParameter = old;
+ }
+ }
Object visitIfStatement(IfStatement node) {
checkForNonBoolCondition(node.condition);
return super.visitIfStatement(node);
@@ -11665,7 +11772,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
}
Object visitListLiteral(ListLiteral node) {
- if (node.modifier != null) {
+ if (node.constKeyword != null) {
TypeArgumentList typeArguments = node.typeArguments;
if (typeArguments != null) {
NodeList<TypeName> arguments = typeArguments.arguments;
@@ -11683,7 +11790,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
NodeList<TypeName> arguments = typeArguments.arguments;
if (arguments.length != 0) {
checkForInvalidTypeArgumentForKey(arguments);
- if (node.modifier != null) {
+ if (node.constKeyword != null) {
checkForInvalidTypeArgumentInConstTypedLiteral(arguments, CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
}
}
@@ -11726,7 +11833,10 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
}
Object visitMethodInvocation(MethodInvocation node) {
- checkForStaticAccessToInstanceMember(node.target, node.methodName);
+ Expression target = node.realTarget;
+ SimpleIdentifier methodName = node.methodName;
+ checkForStaticAccessToInstanceMember(target, methodName);
+ checkForInstanceAccessToStaticMember(target, methodName);
return super.visitMethodInvocation(node);
}
Object visitNativeClause(NativeClause node) {
@@ -11747,6 +11857,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
Object visitPrefixedIdentifier(PrefixedIdentifier node) {
if (node.parent is! Annotation) {
checkForStaticAccessToInstanceMember(node.prefix, node.identifier);
+ checkForInstanceAccessToStaticMember(node.prefix, node.identifier);
}
return super.visitPrefixedIdentifier(node);
}
@@ -11759,7 +11870,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
Object visitPropertyAccess(PropertyAccess node) {
Expression target = node.realTarget;
- checkForStaticAccessToInstanceMember(target, node.propertyName);
+ SimpleIdentifier propertyName = node.propertyName;
+ checkForStaticAccessToInstanceMember(target, propertyName);
+ checkForInstanceAccessToStaticMember(target, propertyName);
return super.visitPropertyAccess(node);
}
Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
@@ -11941,7 +12054,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks the passed executable element against override-error codes.
*
- * @param executableElement the [ExecutableElement] to evaluate
+ * @param executableElement a non-null [ExecutableElement] to evaluate
* @param parameters the parameters of the executable element
* @param errorNameTarget the node to report problems on
* @return `true` if and only if an error code is generated on the passed node
@@ -11959,7 +12072,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
*/
bool checkForAllInvalidOverrideErrorCodes(ExecutableElement executableElement, List<ParameterElement> parameters2, List<ASTNode> parameterLocations, SimpleIdentifier errorNameTarget) {
String executableElementName = executableElement.name;
- ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
+ ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElementName);
bool isGetter = false;
bool isSetter = false;
if (executableElement is PropertyAccessorElement) {
@@ -12014,13 +12127,13 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
Map<String, Type2> overridingNamedPT = overridingFT.namedParameterTypes;
Map<String, Type2> overriddenNamedPT = overriddenFT.namedParameterTypes;
if (overridingNormalPT.length != overriddenNormalPT.length) {
- _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
+ _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [
overriddenNormalPT.length,
overriddenExecutable.enclosingElement.displayName]);
return true;
}
if (overridingPositionalPT.length < overriddenPositionalPT.length) {
- _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
+ _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [
overriddenPositionalPT.length,
overriddenExecutable.enclosingElement.displayName]);
return true;
@@ -12030,7 +12143,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
while (overriddenParameterNameIterator.hasNext) {
String overriddenParamName = overriddenParameterNameIterator.next();
if (!overridingParameterNameSet.contains(overriddenParamName)) {
- _errorReporter.reportError2(CompileTimeErrorCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
+ _errorReporter.reportError2(StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
overriddenParamName,
overriddenExecutable.enclosingElement.displayName]);
return true;
@@ -12108,7 +12221,11 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
for (ParameterElement parameterElt in overriddenPEs) {
if (parameterElt.parameterKind.isOptional) {
- overriddenParameterElts.add((parameterElt as ParameterElementImpl));
+ if (parameterElt is ParameterElementImpl) {
+ overriddenParameterElts.add((parameterElt as ParameterElementImpl));
+ } else if (parameterElt is ParameterMember) {
+ overriddenParameterElts.add((((parameterElt as ParameterMember)).baseElement as ParameterElementImpl));
+ }
}
}
if (parameterElts.length > 0) {
@@ -12892,7 +13009,51 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
- * This verifies that the passed constructor declaration is 'const' then there are no non-final
+ * This verifies that if the passed constructor declaration is 'const' then there are no
+ * invocations of non-'const' super constructors.
+ *
+ * @param node the constructor declaration to evaluate
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see CompileTimeErrorCode#CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER
+ */
+ bool checkForConstConstructorWithNonConstSuper(ConstructorDeclaration node) {
+ if (!_isEnclosingConstructorConst) {
+ return false;
+ }
+ if (node.factoryKeyword != null) {
+ return false;
+ }
+ for (ConstructorInitializer initializer in node.initializers) {
+ if (initializer is SuperConstructorInvocation) {
+ SuperConstructorInvocation superInvocation = initializer as SuperConstructorInvocation;
+ ConstructorElement element = superInvocation.element;
+ if (element.isConst) {
+ return false;
+ }
+ _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, superInvocation, []);
+ return true;
+ }
+ }
+ InterfaceType supertype = _enclosingClass.supertype;
+ if (supertype == null) {
+ return false;
+ }
+ if (supertype.isObject) {
+ return false;
+ }
+ ConstructorElement unnamedConstructor = supertype.element.unnamedConstructor;
+ if (unnamedConstructor == null) {
+ return false;
+ }
+ if (unnamedConstructor.isConst) {
+ return false;
+ }
+ _errorReporter.reportError2(CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, node, []);
+ return true;
+ }
+
+ /**
+ * This verifies that if the passed constructor declaration is 'const' then there are no non-final
* instance variable.
*
* @param node the constructor declaration to evaluate
@@ -13094,6 +13255,25 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
+ * This verifies that the given default formal parameter is not part of a function typed
+ * parameter.
+ *
+ * @param node the default formal parameter to evaluate
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER
+ */
+ bool checkForDefaultValueInFunctionTypedParameter(DefaultFormalParameter node) {
+ if (!_isInFunctionTypedFormalParameter) {
+ return false;
+ }
+ if (node.defaultValue == null) {
+ return false;
+ }
+ _errorReporter.reportError2(CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPED_PARAMETER, node, []);
+ return true;
+ }
+
+ /**
* This verifies that the enclosing class does not have an instance member with the given name of
* the static member.
*
@@ -13569,6 +13749,40 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
+ * This checks that if the given "target" is not a type reference then the "name" is reference to
+ * a instance member.
+ *
+ * @param target the target of the name access to evaluate
+ * @param name the accessed name to evaluate
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see StaticTypeWarningCode#INSTANCE_ACCESS_TO_STATIC_MEMBER
+ */
+ bool checkForInstanceAccessToStaticMember(Expression target, SimpleIdentifier name2) {
+ if (target == null) {
+ return false;
+ }
+ if (_isInComment) {
+ return false;
+ }
+ Element element = name2.element;
+ if (element is! ExecutableElement) {
+ return false;
+ }
+ ExecutableElement executableElement = element as ExecutableElement;
+ if (executableElement.enclosingElement is! ClassElement) {
+ return false;
+ }
+ if (!executableElement.isStatic) {
+ return false;
+ }
+ if (isTypeReference(target)) {
+ return false;
+ }
+ _errorReporter.reportError2(StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name2, [name2.name]);
+ return true;
+ }
+
+ /**
* This verifies that an 'int' can be assigned to the parameter corresponding to the given
* expression. This is used for prefix and postfix expressions where the argument value is
* implicit.
@@ -13731,7 +13945,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
Type2 listElementType = typeArguments[0].type;
ErrorCode errorCode;
- if (node.modifier != null) {
+ if (node.constKeyword != null) {
errorCode = CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
} else {
errorCode = StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE;
@@ -13767,7 +13981,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
Type2 valueType = typeArguments[1].type;
ErrorCode keyErrorCode;
ErrorCode valueErrorCode;
- if (node.modifier != null) {
+ if (node.constKeyword != null) {
keyErrorCode = CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE;
valueErrorCode = CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE;
} else {
@@ -14156,7 +14370,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
*/
bool checkForNonConstMapAsExpressionStatement(MapLiteral node) {
- if (node.modifier != null) {
+ if (node.constKeyword != null) {
return false;
}
if (node.typeArguments != null) {
@@ -14692,7 +14906,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
} else {
errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
}
- _errorReporter.reportError2(errorCode, argTypeName, [argTypeName.name, boundType.displayName]);
+ _errorReporter.reportError2(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
foundError = true;
}
}
« no previous file with comments | « pkg/analyzer_experimental/lib/src/generated/parser.dart ('k') | pkg/analyzer_experimental/lib/src/generated/sdk_io.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698