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

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

Issue 56933002: Version 0.8.10.1 (Closed) Base URL: http://dart.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 1 month 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
« no previous file with comments | « dart/pkg/analyzer/lib/src/generated/parser.dart ('k') | dart/pkg/analyzer/lib/src/generated/scanner.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/pkg/analyzer/lib/src/generated/resolver.dart
===================================================================
--- dart/pkg/analyzer/lib/src/generated/resolver.dart (revision 29785)
+++ dart/pkg/analyzer/lib/src/generated/resolver.dart (working copy)
@@ -3270,7 +3270,19 @@
setMetadata(node.element, node);
return null;
}
- Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) => null;
+ Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+ Expression expression = node.function;
+ if (expression is FunctionExpression) {
+ FunctionExpression functionExpression = expression as FunctionExpression;
+ ExecutableElement functionElement = functionExpression.element;
+ ArgumentList argumentList = node.argumentList;
+ List<ParameterElement> parameters = resolveArgumentsToParameters(false, argumentList, functionElement);
+ if (parameters != null) {
+ argumentList.correspondingStaticParameters = parameters;
+ }
+ }
+ return null;
+ }
Object visitFunctionTypeAlias(FunctionTypeAlias node) {
setMetadata(node.element, node);
return null;
@@ -3491,6 +3503,10 @@
if (element == null) {
if (identifier.inSetterContext()) {
_resolver.reportError5(StaticWarningCode.UNDEFINED_SETTER, identifier, [identifier.name, prefixElement.name]);
+ } else if (node.parent is Annotation) {
+ Annotation annotation = node.parent as Annotation;
+ _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
+ return null;
} else {
_resolver.reportError5(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
}
@@ -3602,6 +3618,9 @@
} else if (element == null || (element is PrefixElement && !isValidAsPrefix(node))) {
if (isConstructorReturnType(node)) {
_resolver.reportError5(CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME, node, []);
+ } else if (node.parent is Annotation) {
+ Annotation annotation = node.parent as Annotation;
+ _resolver.reportError5(CompileTimeErrorCode.INVALID_ANNOTATION, annotation, []);
} else {
_resolver.reportErrorProxyConditionalAnalysisError(_resolver.enclosingClass, StaticWarningCode.UNDEFINED_IDENTIFIER, node, [node.name]);
}
@@ -7304,6 +7323,9 @@
void promote(Expression expression, Type2 potentialType) {
VariableElement element = getPromotionStaticElement(expression);
if (element != null) {
+ if (((element as VariableElementImpl)).isPotentiallyMutatedInClosure) {
+ return;
+ }
Type2 type = expression.staticType;
if (type == null || type.isDynamic) {
return;
@@ -7411,7 +7433,7 @@
*/
void clearTypePromotionsIfAccessedInScopeAndProtentiallyMutated(ASTNode target) {
for (Element element in promoteManager.promotedElements) {
- if (((element as VariableElementImpl)).isPotentiallyMutated) {
+ if (((element as VariableElementImpl)).isPotentiallyMutatedInScope) {
if (isVariableAccessedInClosure(element, target)) {
promoteManager.setType(element, null);
}
@@ -9069,7 +9091,11 @@
staticType = _typeProvider.typeType;
}
} else if (staticElement is FunctionTypeAliasElement) {
- staticType = ((staticElement as FunctionTypeAliasElement)).type;
+ if (isNotTypeLiteral(node)) {
+ staticType = ((staticElement as FunctionTypeAliasElement)).type;
+ } else {
+ staticType = _typeProvider.typeType;
+ }
} else if (staticElement is MethodElement) {
staticType = ((staticElement as MethodElement)).type;
} else if (staticElement is PropertyAccessorElement) {
@@ -9268,7 +9294,11 @@
staticType = _typeProvider.typeType;
}
} else if (element is FunctionTypeAliasElement) {
- staticType = ((element as FunctionTypeAliasElement)).type;
+ if (isNotTypeLiteral(node)) {
+ staticType = ((element as FunctionTypeAliasElement)).type;
+ } else {
+ staticType = _typeProvider.typeType;
+ }
} else if (element is MethodElement) {
staticType = ((element as MethodElement)).type;
} else if (element is PropertyAccessorElement) {
@@ -11401,6 +11431,12 @@
class VariableResolverVisitor extends ScopedVisitor {
/**
+ * The method or function that we are currently visiting, or `null` if we are not inside a
+ * method or function.
+ */
+ ExecutableElement _enclosingFunction;
+
+ /**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
*
* @param library the library containing the compilation unit being resolved
@@ -11408,6 +11444,28 @@
* @param typeProvider the object used to access the types from the core library
*/
VariableResolverVisitor(Library library, Source source, TypeProvider typeProvider) : super.con1(library, source, typeProvider);
+ Object visitFunctionDeclaration(FunctionDeclaration node) {
+ ExecutableElement outerFunction = _enclosingFunction;
+ try {
+ _enclosingFunction = node.element;
+ return super.visitFunctionDeclaration(node);
+ } finally {
+ _enclosingFunction = outerFunction;
+ }
+ }
+ Object visitFunctionExpression(FunctionExpression node) {
+ if (node.parent is! FunctionDeclaration) {
+ ExecutableElement outerFunction = _enclosingFunction;
+ try {
+ _enclosingFunction = node.element;
+ return super.visitFunctionExpression(node);
+ } finally {
+ _enclosingFunction = outerFunction;
+ }
+ } else {
+ return super.visitFunctionExpression(node);
+ }
+ }
Object visitSimpleIdentifier(SimpleIdentifier node) {
if (node.staticElement != null) {
return null;
@@ -11436,12 +11494,20 @@
if (identical(kind, ElementKind.LOCAL_VARIABLE)) {
node.staticElement = element;
if (node.inSetterContext()) {
- ((element as LocalVariableElementImpl)).markPotentiallyMutated();
+ LocalVariableElementImpl variableImpl = element as LocalVariableElementImpl;
+ variableImpl.markPotentiallyMutatedInScope();
+ if (element.enclosingElement != _enclosingFunction) {
+ variableImpl.markPotentiallyMutatedInClosure();
+ }
}
} else if (identical(kind, ElementKind.PARAMETER)) {
node.staticElement = element;
if (node.inSetterContext()) {
- ((element as ParameterElementImpl)).markPotentiallyMutated();
+ ParameterElementImpl parameterImpl = element as ParameterElementImpl;
+ parameterImpl.markPotentiallyMutatedInScope();
+ if (_enclosingFunction != null && (element.enclosingElement != _enclosingFunction)) {
+ parameterImpl.markPotentiallyMutatedInClosure();
+ }
}
}
return null;
@@ -11529,7 +11595,6 @@
EnclosedScope(Scope enclosingScope) {
this.enclosingScope = enclosingScope;
}
- LibraryElement get definingLibrary => enclosingScope.definingLibrary;
AnalysisErrorListener get errorListener => enclosingScope.errorListener;
/**
@@ -11552,7 +11617,7 @@
return element;
}
if (_hiddenNames.contains(name)) {
- errorListener.onError(new AnalysisError.con2(source, identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
+ errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, []));
}
return enclosingScope.lookup3(identifier, name, referencingLibrary);
}
@@ -11770,7 +11835,6 @@
super.define(element);
}
}
- LibraryElement get definingLibrary => _definingLibrary;
AnalysisErrorListener get errorListener => _errorListener;
Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary) {
Element foundElement = localLookup(name, referencingLibrary);
@@ -11795,7 +11859,7 @@
List<Element> conflictingMembers = ((foundElement as MultiplyDefinedElementImpl)).conflictingElements;
String libName1 = getLibraryName(conflictingMembers[0], "");
String libName2 = getLibraryName(conflictingMembers[1], "");
- _errorListener.onError(new AnalysisError.con2(getSource2(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
+ _errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
return foundElement;
}
if (foundElement != null) {
@@ -11837,27 +11901,6 @@
}
/**
- * Return the source that contains the given identifier, or the source associated with this scope
- * if the source containing the identifier could not be determined.
- *
- * @param identifier the identifier whose source is to be returned
- * @return the source that contains the given identifier
- */
- Source getSource2(Identifier identifier) {
- CompilationUnit unit = identifier.getAncestor(CompilationUnit);
- if (unit != null) {
- CompilationUnitElement element = unit.element;
- if (element != null) {
- Source source = element.source;
- if (source != null) {
- return source;
- }
- }
- }
- return this.source;
- }
-
- /**
* Given a collection of elements that a single name could all be mapped to, remove from the list
* all of the names defined in the SDK. Return the element(s) that remain.
*
@@ -11882,7 +11925,7 @@
if (sdkElement != null && to > 0) {
String sdkLibName = getLibraryName(sdkElement, "");
String otherLibName = getLibraryName(conflictingMembers[0], "");
- _errorListener.onError(new AnalysisError.con2(getSource2(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
+ _errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.CONFLICTING_DART_IMPORT, [name, sdkLibName, otherLibName]));
}
if (to == length) {
return foundElement;
@@ -11923,7 +11966,7 @@
offset = accessor.variable.nameOffset;
}
}
- return new AnalysisError.con2(source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
+ return new AnalysisError.con2(duplicate.source, offset, duplicate.displayName.length, CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [existing.displayName]);
}
return super.getErrorForDuplicate(existing, duplicate);
}
@@ -12326,13 +12369,6 @@
}
/**
- * Return the element representing the library in which this scope is enclosed.
- *
- * @return the element representing the library in which this scope is enclosed
- */
- LibraryElement get definingLibrary;
-
- /**
* Return the error code to be used when reporting that a name being defined locally conflicts
* with another element of the same name in the local scope.
*
@@ -12342,9 +12378,6 @@
*/
AnalysisError getErrorForDuplicate(Element existing, Element duplicate) {
Source source = duplicate.source;
- if (source == null) {
- source = this.source;
- }
return new AnalysisError.con2(source, duplicate.nameOffset, duplicate.displayName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, [existing.displayName]);
}
@@ -12356,12 +12389,22 @@
AnalysisErrorListener get errorListener;
/**
- * Return the source object representing the compilation unit with which errors related to this
- * scope should be associated.
+ * Return the source that contains the given identifier, or the source associated with this scope
+ * if the source containing the identifier could not be determined.
*
- * @return the source object with which errors should be associated
+ * @param identifier the identifier whose source is to be returned
+ * @return the source that contains the given identifier
*/
- Source get source => definingLibrary.definingCompilationUnit.source;
+ Source getSource(ASTNode node) {
+ CompilationUnit unit = node.getAncestor(CompilationUnit);
+ if (unit != null) {
+ CompilationUnitElement unitElement = unit.element;
+ if (unitElement != null) {
+ return unitElement.source;
+ }
+ }
+ return null;
+ }
/**
* Return the element with which the given name is associated, or `null` if the name is not
@@ -13386,7 +13429,6 @@
return super.visitSimpleFormalParameter(node);
}
Object visitSimpleIdentifier(SimpleIdentifier node) {
- checkForReferenceToDeclaredVariableInInitializer(node);
checkForImplicitThisReferenceInInitializer(node);
if (!isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
checkForUnqualifiedReferenceToNonLocalStaticMember(node);
@@ -16274,54 +16316,6 @@
}
/**
- * This checks if the passed identifier is banned because it is part of the variable declaration
- * with the same name.
- *
- * @param node the identifier to evaluate
- * @return `true` if and only if an error code is generated on the passed node
- * @see CompileTimeErrorCode#REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER
- */
- bool checkForReferenceToDeclaredVariableInInitializer(SimpleIdentifier node) {
- ASTNode parent = node.parent;
- if (parent is PrefixedIdentifier) {
- PrefixedIdentifier prefixedIdentifier = parent as PrefixedIdentifier;
- if (identical(prefixedIdentifier.identifier, node)) {
- return false;
- }
- }
- if (parent is PropertyAccess) {
- PropertyAccess propertyAccess = parent as PropertyAccess;
- if (identical(propertyAccess.propertyName, node)) {
- return false;
- }
- }
- if (parent is MethodInvocation) {
- MethodInvocation methodInvocation = parent as MethodInvocation;
- if (methodInvocation.target != null && identical(methodInvocation.methodName, node)) {
- return false;
- }
- }
- if (parent is ConstructorName) {
- ConstructorName constructorName = parent as ConstructorName;
- if (identical(constructorName.name, node)) {
- return false;
- }
- }
- if (parent is Label) {
- Label label = parent as Label;
- if (identical(label.label, node)) {
- return false;
- }
- }
- String name = node.name;
- if (!_namesForReferenceToDeclaredVariableInInitializer.contains(name)) {
- return false;
- }
- _errorReporter.reportError2(CompileTimeErrorCode.REFERENCE_TO_DECLARED_VARIABLE_IN_INITIALIZER, node, [name]);
- return true;
- }
-
- /**
* This checks that the rethrow is inside of a catch clause.
*
* @param node the rethrow expression to evaluate
@@ -16973,6 +16967,12 @@
if (parent is Annotation && identical(((parent as Annotation)).constructorName, node)) {
return true;
}
+ if (parent is CommentReference) {
+ CommentReference commentReference = parent as CommentReference;
+ if (commentReference.newKeyword != null) {
+ return true;
+ }
+ }
return false;
}
« no previous file with comments | « dart/pkg/analyzer/lib/src/generated/parser.dart ('k') | dart/pkg/analyzer/lib/src/generated/scanner.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698