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

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

Issue 17932005: New analyzer_experimental snapshot. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Disable resolver tests Created 7 years, 6 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 dc5fb59a8c358422f466ebefbcdd308ddfbd46fa..9035b9712bd6b5dbb54aed2d4163772d4ef7e93b 100644
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart
@@ -19,12 +19,14 @@ import 'constant.dart';
/**
* Instances of the class `CompilationUnitBuilder` build an element model for a single
* compilation unit.
+ *
* @coverage dart.engine.resolver
*/
class CompilationUnitBuilder {
/**
* Build the compilation unit element for the given source.
+ *
* @param source the source describing the compilation unit
* @param unit the AST structure representing the compilation unit
* @return the compilation unit element that was built
@@ -51,6 +53,7 @@ class CompilationUnitBuilder {
/**
* Instances of the class `ElementBuilder` traverse an AST structure and build the element
* model representing the AST structure.
+ *
* @coverage dart.engine.resolver
*/
class ElementBuilder extends RecursiveASTVisitor<Object> {
@@ -84,6 +87,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Initialize a newly created element builder to build the elements for a compilation unit.
+ *
* @param initialHolder the element holder associated with the compilation unit being built
*/
ElementBuilder(ElementHolder initialHolder) {
@@ -606,6 +610,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Creates the [ConstructorElement]s array with the single default constructor element.
+ *
* @param interfaceType the interface type for which to create a default constructor
* @return the [ConstructorElement]s array with the single default constructor element
*/
@@ -622,6 +627,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Create the types associated with the given type variables, setting the type of each type
* variable, and return an array of types corresponding to the given variables.
+ *
* @param typeVariables the type variables for which types are to be created
* @return
*/
@@ -640,6 +646,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Return the body of the function that contains the given parameter, or `null` if no
* function body could be found.
+ *
* @param node the parameter contained in the function whose body is to be returned
* @return the body of the function that contains the given parameter
*/
@@ -658,6 +665,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Return `true` if the given token is a token for the given keyword.
+ *
* @param token the token being tested
* @param keyword the keyword being tested for
* @return `true` if the given token is a token for the given keyword
@@ -666,6 +674,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Make the given holder be the current holder while visiting the given node.
+ *
* @param holder the holder that will gather elements that are built while visiting the children
* @param node the node to be visited
*/
@@ -683,6 +692,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Make the given holder be the current holder while visiting the children of the given node.
+ *
* @param holder the holder that will gather elements that are built while visiting the children
* @param node the node whose children are to be visited
*/
@@ -701,6 +711,7 @@ class ElementBuilder extends RecursiveASTVisitor<Object> {
/**
* Instances of the class `ElementHolder` hold on to elements created while traversing an AST
* structure so that they can be accessed when creating their enclosing element.
+ *
* @coverage dart.engine.resolver
*/
class ElementHolder {
@@ -1004,7 +1015,8 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
RecordingErrorListener _errorListener;
/**
- * The line information associated with the source for which an element is being built, or`null` if we are not building an element.
+ * The line information associated with the source for which an element is being built, or
+ * `null` if we are not building an element.
*/
LineInfo _lineInfo;
@@ -1030,6 +1042,7 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
/**
* Initialize a newly created HTML unit builder.
+ *
* @param context the analysis context in which the element model will be built
*/
HtmlUnitBuilder(InternalAnalysisContext context) {
@@ -1039,6 +1052,7 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
/**
* Build the HTML element for the given source.
+ *
* @param source the source describing the compilation unit
* @return the HTML element that was built
* @throws AnalysisException if the analysis could not be performed
@@ -1047,6 +1061,7 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
/**
* Build the HTML element for the given source.
+ *
* @param source the source describing the compilation unit
* @param unit the AST structure representing the HTML
* @throws AnalysisException if the analysis could not be performed
@@ -1064,12 +1079,14 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
/**
* Return the listener to which analysis errors will be reported.
+ *
* @return the listener to which analysis errors will be reported
*/
RecordingErrorListener get errorListener => _errorListener;
/**
* Return an array containing information about all of the libraries that were resolved.
+ *
* @return an array containing the libraries that were resolved
*/
Set<Library> get resolvedLibraries => _resolvedLibraries;
@@ -1164,6 +1181,7 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
/**
* Return the first source attribute for the given tag node, or `null` if it does not exist.
+ *
* @param node the node containing attributes
* @return the source attribute contained in the given tag
*/
@@ -1178,6 +1196,7 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
/**
* Determine if the specified node is a Dart script.
+ *
* @param node the node to be tested (not `null`)
* @return `true` if the node is a Dart script
*/
@@ -1202,6 +1221,7 @@ class HtmlUnitBuilder implements ht.XmlVisitor<Object> {
/**
* Report an error with the given error code at the given location. 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
@@ -1249,6 +1269,7 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Resolve the declarations within the given compilation unit to the elements rooted at the given
* element.
+ *
* @param unit the compilation unit to be resolved
* @param element the root of the element model used to resolve the AST nodes
*/
@@ -1569,10 +1590,11 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Append the value of the given string literal to the given string builder.
+ *
* @param builder the builder to which the string's value is to be appended
* @param literal the string literal whose value is to be appended to the builder
* @throws IllegalArgumentException if the string is not a constant string without any string
- * interpolation
+ * interpolation
*/
void appendStringValue(JavaStringBuilder builder, StringLiteral literal) {
if (literal is SimpleStringLiteral) {
@@ -1589,6 +1611,7 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Return the element for the part with the given source, or `null` if there is no element
* for the given source.
+ *
* @param parts the elements for the parts
* @param partSource the source for the part whose element is to be returned
* @return the element for the part with the given source
@@ -1605,6 +1628,7 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Return the element in the given array of elements that was created for the declaration at the
* given offset. This method should only be used when there is no name
+ *
* @param elements the elements of the appropriate kind that exist in the current context
* @param offset the offset of the name of the element to be returned
* @return the element at the given offset
@@ -1614,6 +1638,7 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Return the element in the given array of elements that was created for the declaration with the
* given name.
+ *
* @param elements the elements of the appropriate kind that exist in the current context
* @param identifier the name node in the declaration of the element to be returned
* @return the element created for the declaration with the given name
@@ -1627,6 +1652,7 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Return the element in the given array of elements that was created for the declaration with the
* given name at the given offset.
+ *
* @param elements the elements of the appropriate kind that exist in the current context
* @param name the name of the element to be returned
* @param offset the offset of the name of the element to be returned
@@ -1642,10 +1668,12 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
}
/**
- * Return the export element from the given array whose library has the given source, or`null` if there is no such export.
+ * Return the export element from the given array whose library has the given source, or
+ * `null` if there is no such export.
+ *
* @param exports the export elements being searched
* @param source the source of the library associated with the export element to being searched
- * for
+ * for
* @return the export element whose library has the given source
*/
ExportElement find5(List<ExportElement> exports, Source source2) {
@@ -1660,9 +1688,10 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Return the import element from the given array whose library has the given source and that has
* the given prefix, or `null` if there is no such import.
+ *
* @param imports the import elements being searched
* @param source the source of the library associated with the import element to being searched
- * for
+ * for
* @param prefix the prefix with which the library was imported
* @return the import element whose library has the given source and prefix
*/
@@ -1687,6 +1716,7 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
/**
* Return the value of the given string literal, or `null` if the string is not a constant
* string without any string interpolation.
+ *
* @param literal the string literal whose value is to be returned
* @return the value of the given string literal
*/
@@ -1704,7 +1734,8 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
}
}
/**
- * Instances of the class `ElementResolver` are used by instances of [ResolverVisitor]to resolve references within the AST structure to the elements being referenced. The requirements
+ * Instances of the class `ElementResolver` are used by instances of [ResolverVisitor]
+ * to resolve references within the AST structure to the elements being referenced. The requirements
* for the element resolver are:
* <ol>
* * Every [SimpleIdentifier] should be resolved to the element to which it refers.
@@ -1714,17 +1745,20 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
* declared.
* * An identifier denoting a prefix should resolve to the element representing the import that
* defines the prefix (an [ImportElement]).
- * * An identifier denoting a variable should resolve to the element representing the variable (a[VariableElement]).
+ * * An identifier denoting a variable should resolve to the element representing the variable (a
+ * [VariableElement]).
* * An identifier denoting a parameter should resolve to the element representing the parameter
* (a [ParameterElement]).
* * An identifier denoting a field should resolve to the element representing the getter or
* setter being invoked (a [PropertyAccessorElement]).
* * An identifier denoting the name of a method or function being invoked should resolve to the
* element representing the method or function (a [ExecutableElement]).
- * * An identifier denoting a label should resolve to the element representing the label (a[LabelElement]).
+ * * An identifier denoting a label should resolve to the element representing the label (a
+ * [LabelElement]).
*
* The identifiers within directives are exceptions to this rule and are covered below.
- * * Every node containing a token representing an operator that can be overridden ([BinaryExpression], [PrefixExpression], [PostfixExpression]) should resolve to
+ * * Every node containing a token representing an operator that can be overridden (
+ * [BinaryExpression], [PrefixExpression], [PostfixExpression]) should resolve to
* the element representing the method invoked by that operator (a [MethodElement]).
* * Every [FunctionExpressionInvocation] should resolve to the element representing the
* function being invoked (a [FunctionElement]). This will be the same element as that to
@@ -1738,16 +1772,19 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> {
* exist (an [ImportElement] or [ExportElement]).
* * The identifier representing the prefix in an [ImportDirective] should resolve to the
* element representing the prefix (a [PrefixElement]).
- * * The identifiers in the hide and show combinators in [ImportDirective]s and[ExportDirective]s should resolve to the elements that are being hidden or shown,
+ * * The identifiers in the hide and show combinators in [ImportDirective]s and
+ * [ExportDirective]s should resolve to the elements that are being hidden or shown,
* respectively, unless those names are not defined in the specified library (or the specified
* library does not exist).
* * Every [PartDirective] should resolve to the element representing the compilation unit
- * being specified by the string unless the specified compilation unit does not exist (a[CompilationUnitElement]).
+ * being specified by the string unless the specified compilation unit does not exist (a
+ * [CompilationUnitElement]).
* </ol>
* Note that AST nodes that would represent elements that are not defined are not resolved to
* anything. This includes such things as references to undeclared variables (which is an error) and
* names in hide and show combinators that are not defined in the imported library (which is not an
* error).
+ *
* @coverage dart.engine.resolver
*/
class ElementResolver extends SimpleASTVisitor<Object> {
@@ -1766,7 +1803,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* @return `true` if the given identifier is the return type of a factory constructor
- * declaration.
+ * declaration.
*/
static bool isFactoryConstructorReturnType(SimpleIdentifier node) {
ASTNode parent = node.parent;
@@ -1779,6 +1816,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Checks if the given 'super' expression is used in the valid context.
+ *
* @param node the 'super' expression to analyze
* @return `true` if the given 'super' expression is in the valid context
*/
@@ -1827,6 +1865,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
+ *
* @param resolver the resolver driving this participant
*/
ElementResolver(ResolverVisitor resolver) {
@@ -2190,9 +2229,9 @@ class ElementResolver extends SimpleASTVisitor<Object> {
ClassElement enclosingClass = _resolver.enclosingClass;
targetTypeName = enclosingClass.displayName;
} else {
- Type2 targetType = getPropagatedType(target);
- if (targetType == null) {
- targetType = getStaticType(target);
+ Type2 targetType = getStaticType(target);
+ if (targetType != null && targetType.isDartCoreFunction && methodName.name == CALL_METHOD_NAME) {
+ return null;
}
targetTypeName = targetType == null ? null : targetType.displayName;
}
@@ -2236,6 +2275,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
if (prefixElement is PrefixElement) {
Element element = _resolver.nameScope.lookup(node, _resolver.definingLibrary);
if (element == null) {
+ _resolver.reportError(StaticWarningCode.UNDEFINED_GETTER, identifier, [identifier.name, prefixElement.name]);
return null;
}
if (element is PropertyAccessorElement && identifier.inSetterContext()) {
@@ -2250,6 +2290,19 @@ class ElementResolver extends SimpleASTVisitor<Object> {
recordResolution(identifier, element);
return null;
}
+ if (node.parent is Annotation && prefixElement is ClassElement) {
+ Annotation annotation = node.parent as Annotation;
+ ConstructorElement constructor;
+ {
+ InterfaceType interfaceType = prefix.staticType as InterfaceType;
+ LibraryElement definingLibrary = _resolver.definingLibrary;
+ constructor = interfaceType.lookUpConstructor(identifier.name, definingLibrary);
+ }
+ recordResolution(identifier, constructor);
+ annotation.element = constructor;
+ resolveAnnotationConstructorInvocationArguments(annotation, constructor);
+ return null;
+ }
resolvePropertyAccess(prefix, identifier);
return null;
}
@@ -2322,6 +2375,18 @@ class ElementResolver extends SimpleASTVisitor<Object> {
}
}
recordResolution(node, element);
+ if (node.parent is Annotation && element is ClassElement) {
+ Annotation annotation = node.parent as Annotation;
+ ConstructorElement constructor;
+ {
+ InterfaceType interfaceType = new InterfaceTypeImpl.con1((element as ClassElement));
+ LibraryElement definingLibrary = _resolver.definingLibrary;
+ constructor = interfaceType.lookUpConstructor(null, definingLibrary);
+ }
+ annotation.element = constructor;
+ resolveAnnotationConstructorInvocationArguments(annotation, constructor);
+ return null;
+ }
return null;
}
Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
@@ -2389,6 +2454,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Generate annotation elements for each of the annotations in the given node list and add them to
* the given list of elements.
+ *
* @param annotationList the list of elements to which new elements are to be added
* @param annotations the AST nodes used to generate new elements
*/
@@ -2404,6 +2470,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Given that we have found code to invoke the given element, return the error code that should be
* reported, or `null` if no error should be reported.
+ *
* @param target the target of the invocation, or `null` if there was no target
* @param element the element to be invoked
* @return the error code that should be reported
@@ -2432,10 +2499,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
}
}
} else if (element2 is VariableElement) {
- Type2 variableType = _resolver.overrideManager.getType(element2);
- if (variableType == null) {
- variableType = ((element2 as VariableElement)).type;
- }
+ Type2 variableType = ((element2 as VariableElement)).type;
if (!isExecutableType(variableType)) {
return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
}
@@ -2467,6 +2531,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return `true` if the given class declares a method named "noSuchMethod" and is not the
* class 'Object'.
+ *
* @param element the class being tested
* @return `true` if the given class declares a method named "noSuchMethod"
*/
@@ -2481,9 +2546,10 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return `true` if the given element represents a class that declares a method named
* "noSuchMethod" and is not the class 'Object'.
+ *
* @param element the element being tested
* @return `true` if the given element represents a class that declares a method named
- * "noSuchMethod"
+ * "noSuchMethod"
*/
bool classDeclaresNoSuchMethod2(Element element) {
if (element is ClassElement) {
@@ -2496,6 +2562,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* Given a list of arguments and the element that will be invoked using those argument, compute
* the list of parameters that correspond to the list of arguments. Return the parameters that
* correspond to the arguments, or `null` if no correspondence could be computed.
+ *
* @param argumentList the list of arguments being passed to the element
* @param executableElement the element that will be invoked with the arguments
* @return the parameters that correspond to the arguments
@@ -2540,6 +2607,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* If the given element is a setter, return the getter associated with it. Otherwise, return the
* element unchanged.
+ *
* @param element the element to be normalized
* @return a non-setter element derived from the given element
*/
@@ -2553,6 +2621,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Look for any declarations of the given identifier that are imported using a prefix. Return the
* element that was found, or `null` if the name is not imported using a prefix.
+ *
* @param identifier the identifier that might have been imported using a prefix
* @return the element that was found
*/
@@ -2579,6 +2648,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the name of the method invoked by the given postfix expression.
+ *
* @param node the postfix expression being invoked
* @return the name of the method invoked by the expression
*/
@@ -2586,6 +2656,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the name of the method invoked by the given postfix expression.
+ *
* @param node the postfix expression being invoked
* @return the name of the method invoked by the expression
*/
@@ -2605,6 +2676,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the propagated type of the given expression that is to be used for type analysis.
+ *
* @param expression the expression whose type is to be returned
* @return the type of the given expression
*/
@@ -2618,6 +2690,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the static type of the given expression that is to be used for type analysis.
+ *
* @param expression the expression whose type is to be returned
* @return the type of the given expression
*/
@@ -2634,6 +2707,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the element representing the superclass of the given class.
+ *
* @param targetClass the class whose superclass is to be returned
* @return the element representing the superclass of the given class
*/
@@ -2648,11 +2722,12 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return `true` if the given type represents an object that could be invoked using the call
* operator '()'.
+ *
* @param type the type being tested
* @return `true` if the given type represents an object that could be invoked
*/
bool isExecutableType(Type2 type) {
- if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction) {
+ if (type.isDynamic || (type is FunctionType) || type.isDartCoreFunction || type.isObject) {
return true;
} else if (type is InterfaceType) {
ClassElement classElement = ((type as InterfaceType)).element;
@@ -2664,6 +2739,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return `true` if the given element is a static element.
+ *
* @param element the element being tested
* @return `true` if the given element is a static element
*/
@@ -2677,11 +2753,13 @@ class ElementResolver extends SimpleASTVisitor<Object> {
}
/**
- * Looks up the method element with the given name for index expression, reports[StaticWarningCode#UNDEFINED_OPERATOR] if not found.
+ * Looks up the method element with the given name for index expression, reports
+ * [StaticWarningCode#UNDEFINED_OPERATOR] if not found.
+ *
* @param node the index expression to resolve
* @param target the target of the expression
* @param methodName the name of the operator associated with the context of using of the given
- * index expression
+ * index expression
* @return `true` if and only if an error code is generated on the passed node
*/
bool lookUpCheckIndexOperator(IndexExpression node, Expression target, String methodName, Type2 staticType, Type2 propagatedType) {
@@ -2708,6 +2786,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Look up the getter with the given name in the given type. Return the element representing the
* getter that was found, or `null` if there is no getter with the given name.
+ *
* @param target the target of the invocation, or `null` if there is no target
* @param type the type in which the getter is defined
* @param getterName the name of the getter being looked up
@@ -2733,12 +2812,14 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Look up the getter with the given name in the interfaces implemented by the given type, either
- * directly or indirectly. Return the element representing the getter that was found, or`null` if there is no getter with the given name.
+ * directly or indirectly. Return the element representing the getter that was found, or
+ * `null` if there is no getter with the given name.
+ *
* @param targetType the type in which the getter might be defined
* @param includeTargetType `true` if the search should include the target type
* @param getterName the name of the getter being looked up
* @param visitedInterfaces a set containing all of the interfaces that have been examined, used
- * to prevent infinite recursion and to optimize the search
+ * to prevent infinite recursion and to optimize the search
* @return the element representing the getter that was found
*/
PropertyAccessorElement lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) {
@@ -2776,6 +2857,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* Look up the method or getter with the given name in the given type. Return the element
* representing the method or getter that was found, or `null` if there is no method or
* getter with the given name.
+ *
* @param type the type in which the method or getter is defined
* @param memberName the name of the method or getter being looked up
* @return the element representing the method or getter that was found
@@ -2801,11 +2883,12 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* Look up the method or getter with the given name in the interfaces implemented by the given
* type, either directly or indirectly. Return the element representing the method or getter that
* was found, or `null` if there is no method or getter with the given name.
+ *
* @param targetType the type in which the method or getter might be defined
* @param includeTargetType `true` if the search should include the target type
* @param memberName the name of the method or getter being looked up
* @param visitedInterfaces a set containing all of the interfaces that have been examined, used
- * to prevent infinite recursion and to optimize the search
+ * to prevent infinite recursion and to optimize the search
* @return the element representing the method or getter that was found
*/
ExecutableElement lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) {
@@ -2845,6 +2928,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Find the element corresponding to the given label node in the current label scope.
+ *
* @param parentNode the node containing the given label
* @param labelNode the node representing the label being looked up
* @return the element corresponding to the given label node in the current scope
@@ -2885,6 +2969,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Look up the method with the given name in the given type. Return the element representing the
* method that was found, or `null` if there is no method with the given name.
+ *
* @param target the target of the invocation, or `null` if there is no target
* @param type the type in which the method is defined
* @param methodName the name of the method being looked up
@@ -2910,12 +2995,14 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Look up the method with the given name in the interfaces implemented by the given type, either
- * directly or indirectly. Return the element representing the method that was found, or`null` if there is no method with the given name.
+ * directly or indirectly. Return the element representing the method that was found, or
+ * `null` if there is no method with the given name.
+ *
* @param targetType the type in which the member might be defined
* @param includeTargetType `true` if the search should include the target type
* @param methodName the name of the method being looked up
* @param visitedInterfaces a set containing all of the interfaces that have been examined, used
- * to prevent infinite recursion and to optimize the search
+ * to prevent infinite recursion and to optimize the search
* @return the element representing the method that was found
*/
MethodElement lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, Set<ClassElement> visitedInterfaces) {
@@ -2952,6 +3039,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Look up the setter with the given name in the given type. Return the element representing the
* setter that was found, or `null` if there is no setter with the given name.
+ *
* @param target the target of the invocation, or `null` if there is no target
* @param type the type in which the setter is defined
* @param setterName the name of the setter being looked up
@@ -2977,12 +3065,14 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Look up the setter with the given name in the interfaces implemented by the given type, either
- * directly or indirectly. Return the element representing the setter that was found, or`null` if there is no setter with the given name.
+ * directly or indirectly. Return the element representing the setter that was found, or
+ * `null` if there is no setter with the given name.
+ *
* @param targetType the type in which the setter might be defined
* @param includeTargetType `true` if the search should include the target type
* @param setterName the name of the setter being looked up
* @param visitedInterfaces a set containing all of the interfaces that have been examined, used
- * to prevent infinite recursion and to optimize the search
+ * to prevent infinite recursion and to optimize the search
* @return the element representing the setter that was found
*/
PropertyAccessorElement lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) {
@@ -3018,6 +3108,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the binary operator that is invoked by the given compound assignment operator.
+ *
* @param operator the assignment operator being mapped
* @return the binary operator that invoked by the given assignment operator
*/
@@ -3054,6 +3145,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Record the fact that the given AST node was resolved to the given element.
+ *
* @param node the AST node that was resolved
* @param element the element to which the AST node was resolved
*/
@@ -3064,23 +3156,36 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Record the fact that the given AST node was resolved to the given elements.
+ *
* @param node the AST node that was resolved
* @param staticElement the element to which the AST node was resolved using static type
- * information
+ * information
* @param propagatedElement the element to which the AST node was resolved using propagated type
- * information
+ * information
* @return the element that was associated with the node
*/
void recordResolution2(SimpleIdentifier node, Element staticElement2, Element propagatedElement) {
node.staticElement = staticElement2;
node.element = propagatedElement == null ? staticElement2 : propagatedElement;
}
+ void resolveAnnotationConstructorInvocationArguments(Annotation annotation, ConstructorElement constructor) {
+ ArgumentList argumentList = annotation.arguments;
+ if (argumentList == null) {
+ } else {
+ List<ParameterElement> parameters = resolveArgumentsToParameters(true, argumentList, constructor);
+ if (parameters != null) {
+ argumentList.correspondingStaticParameters = parameters;
+ }
+ }
+ }
/**
* Given a list of arguments and the element that will be invoked using those argument, compute
* the list of parameters that correspond to the list of arguments. Return the parameters that
* correspond to the arguments, or `null` if no correspondence could be computed.
- * @param reportError if `true` then compile-time error should be reported; if `false`then compile-time warning
+ *
+ * @param reportError if `true` then compile-time error should be reported; if `false`
+ * then compile-time warning
* @param argumentList the list of arguments being passed to the element
* @param executableElement the element that will be invoked with the arguments
* @return the parameters that correspond to the arguments
@@ -3097,7 +3202,9 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* Given a list of arguments and the parameters related to the element that will be invoked using
* those argument, compute the list of parameters that correspond to the list of arguments. Return
* the parameters that correspond to the arguments.
- * @param reportError if `true` then compile-time error should be reported; if `false`then compile-time warning
+ *
+ * @param reportError if `true` then compile-time error should be reported; if `false`
+ * then compile-time warning
* @param argumentList the list of arguments being passed to the element
* @param parameters the of the function that will be invoked with the arguments
* @return the parameters that correspond to the arguments
@@ -3160,6 +3267,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Resolve the names in the given combinators in the scope of the given library.
+ *
* @param library the library that defines the names
* @param combinators the combinators containing the names to be resolved
*/
@@ -3189,6 +3297,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* If the returned element is a method, then the method will be invoked. If the returned element
* is a getter, the getter will be invoked without arguments and the result of that invocation
* will then be invoked with the arguments.
+ *
* @param target the target of the invocation ('e')
* @param targetType the type of the target
* @param methodName the name of the method being invoked ('m')
@@ -3199,7 +3308,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
InterfaceType classType = targetType as InterfaceType;
Element element = lookUpMethod(target, classType, methodName.name);
if (element == null) {
- element = classType.getGetter(methodName.name);
+ element = lookUpGetter(target, classType, methodName.name);
}
return element;
} else if (target is SimpleIdentifier) {
@@ -3221,6 +3330,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* the returned element is a method, then the method will be invoked. If the returned element is a
* getter, the getter will be invoked without arguments and the result of that invocation will
* then be invoked with the arguments.
+ *
* @param methodName the name of the method being invoked ('m')
* @return the element being invoked
*/
@@ -3242,6 +3352,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Given that we are accessing a property of the given type with the given name, return the
* element that represents the property.
+ *
* @param target the target of the invocation ('e')
* @param targetType the type in which the search for the property should begin
* @param propertyName the name of the property being accessed
@@ -3296,6 +3407,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* Resolve the given simple identifier if possible. Return the element to which it could be
* resolved, or `null` if it could not be resolved. This does not record the results of the
* resolution.
+ *
* @param node the identifier to be resolved
* @return the element to which the identifier could be resolved
*/
@@ -3337,9 +3449,10 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* If the given type is a type variable, resolve it to the type that should be used when looking
* up members. Otherwise, return the original type.
+ *
* @param type the type that is to be resolved if it is a type variable
* @return the type that should be used in place of the argument if it is a type variable, or the
- * original argument if it isn't a type variable
+ * original argument if it isn't a type variable
*/
Type2 resolveTypeVariable(Type2 type) {
if (type is TypeVariableType) {
@@ -3354,6 +3467,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the propagated element if it is not `null`, or the static element if it is.
+ *
* @param staticElement the element computed using static type information
* @param propagatedElement the element computed using propagated type information
* @return the more specific of the two elements
@@ -3362,6 +3476,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return the propagated method if it is not `null`, or the static method if it is.
+ *
* @param staticMethod the method computed using static type information
* @param propagatedMethod the method computed using propagated type information
* @return the more specific of the two methods
@@ -3372,6 +3487,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
* Given a node that can have annotations associated with it and the element to which that node
* has been resolved, create the annotations in the element model representing the annotations on
* the node.
+ *
* @param element the element to which the node has been resolved
* @param node the node that can have annotations associated with it
*/
@@ -3400,6 +3516,7 @@ class ElementResolver extends SimpleASTVisitor<Object> {
/**
* Return `true` if we should report an error as a result of looking up a member in the
* given type and not finding any member.
+ *
* @param type the type in which we attempted to perform the look-up
* @param member the result of the look-up
* @return `true` if we should report an error
@@ -3429,6 +3546,7 @@ class ElementResolver_SyntheticIdentifier extends Identifier {
/**
* Initialize a newly created synthetic identifier to have the given name.
+ *
* @param name the name of the synthetic identifier
*/
ElementResolver_SyntheticIdentifier(String name) {
@@ -3446,6 +3564,7 @@ class ElementResolver_SyntheticIdentifier extends Identifier {
/**
* Instances of the class `InheritanceManager` manage the knowledge of where class members
* (methods, getters & setters) are inherited from.
+ *
* @coverage dart.engine.resolver
*/
class InheritanceManager {
@@ -3475,6 +3594,7 @@ class InheritanceManager {
/**
* Initialize a newly created inheritance manager.
+ *
* @param library the library element context that the inheritance mappings are being generated
*/
InheritanceManager(LibraryElement library) {
@@ -3484,36 +3604,45 @@ class InheritanceManager {
}
/**
- * Return the set of [AnalysisError]s found on the passed [ClassElement], or`null` if there are none.
+ * Return the set of [AnalysisError]s found on the passed [ClassElement], or
+ * `null` if there are none.
+ *
* @param classElt the class element to query
- * @return the set of [AnalysisError]s found on the passed [ClassElement], or`null` if there are none
+ * @return the set of [AnalysisError]s found on the passed [ClassElement], or
+ * `null` if there are none
*/
Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
/**
* Get and return a mapping between the set of all string names of the members inherited from the
* passed [ClassElement] superclass hierarchy, and the associated [ExecutableElement].
+ *
* @param classElt the class element to query
- * @return a mapping between the set of all members inherited from the passed [ClassElement]superclass hierarchy, and the associated [ExecutableElement]
+ * @return a mapping between the set of all members inherited from the passed [ClassElement]
+ * superclass hierarchy, and the associated [ExecutableElement]
*/
Map<String, ExecutableElement> getMapOfMembersInheritedFromClasses(ClassElement classElt) => computeClassChainLookupMap(classElt, new Set<ClassElement>());
/**
* Get and return a mapping between the set of all string names of the members inherited from the
* passed [ClassElement] interface hierarchy, and the associated [ExecutableElement].
+ *
* @param classElt the class element to query
- * @return a mapping between the set of all string names of the members inherited from the passed[ClassElement] interface hierarchy, and the associated [ExecutableElement].
+ * @return a mapping between the set of all string names of the members inherited from the passed
+ * [ClassElement] interface hierarchy, and the associated [ExecutableElement].
*/
Map<String, ExecutableElement> getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => computeInterfaceLookupMap(classElt, new Set<ClassElement>());
/**
- * Given some [ClassElement class element] and some member name, this returns the[ExecutableElement executable element] that the class inherits from the mixins,
+ * Given some [ClassElement] and some member name, this returns the
+ * [ExecutableElement] that the class inherits from the mixins,
* superclasses or interfaces, that has the member name, if no member is inherited `null` is
* returned.
+ *
* @param classElt the class element to query
* @param memberName the name of the executable element to find and return
* @return the inherited executable element with the member name, or `null` if no such
- * member exists
+ * member exists
*/
ExecutableElement lookupInheritance(ClassElement classElt, String memberName) {
if (memberName == null || memberName.isEmpty) {
@@ -3527,12 +3656,14 @@ class InheritanceManager {
}
/**
- * Given some [ClassElement class element] and some member name, this returns the[ExecutableElement executable element] that the class either declares itself, or
+ * Given some [ClassElement] and some member name, this returns the
+ * [ExecutableElement] that the class either declares itself, or
* inherits, that has the member name, if no member is inherited `null` is returned.
+ *
* @param classElt the class element to query
* @param memberName the name of the executable element to find and return
* @return the inherited executable element with the member name, or `null` if no such
- * member exists
+ * member exists
*/
ExecutableElement lookupMember(ClassElement classElt, String memberName) {
ExecutableElement element = lookupMemberInClass(classElt, memberName);
@@ -3544,6 +3675,7 @@ class InheritanceManager {
/**
* Set the new library element context.
+ *
* @param library the new library element
*/
void set libraryElement(LibraryElement library2) {
@@ -3553,9 +3685,10 @@ class InheritanceManager {
/**
* This method takes some inherited [FunctionType], and resolves all the parameterized types
* in the function type, dependent on the class in which it is being overridden.
+ *
* @param baseFunctionType the function type that is being overridden
* @param memberName the name of the member, this is used to lookup the inheritance path of the
- * override
+ * override
* @param definingType the type that is overriding the member
* @return the passed function type with any parameterized types substituted
*/
@@ -3581,11 +3714,14 @@ class InheritanceManager {
/**
* Compute and return a mapping between the set of all string names of the members inherited from
- * the passed [ClassElement] superclass hierarchy, and the associated[ExecutableElement].
+ * the passed [ClassElement] superclass hierarchy, and the associated
+ * [ExecutableElement].
+ *
* @param classElt the class element to query
* @param visitedClasses a set of visited classes passed back into this method when it calls
- * itself recursively
- * @return a mapping between the set of all string names of the members inherited from the passed[ClassElement] superclass hierarchy, and the associated [ExecutableElement]
+ * itself recursively
+ * @return a mapping between the set of all string names of the members inherited from the passed
+ * [ClassElement] superclass hierarchy, and the associated [ExecutableElement]
*/
Map<String, ExecutableElement> computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
Map<String, ExecutableElement> resultMap = _classLookup[classElt];
@@ -3626,8 +3762,9 @@ class InheritanceManager {
/**
* Compute and return the inheritance path given the context of a type and a member that is
* overridden in the inheritance path (for which the type is in the path).
+ *
* @param chain the inheritance path that is built up as this method calls itself recursively,
- * when this method is called an empty [LinkedList] should be provided
+ * when this method is called an empty [LinkedList] should be provided
* @param currentType the current type in the inheritance path
* @param memberName the name of the member that is being looked up the inheritance path
*/
@@ -3671,11 +3808,14 @@ class InheritanceManager {
/**
* Compute and return a mapping between the set of all string names of the members inherited from
- * the passed [ClassElement] interface hierarchy, and the associated[ExecutableElement].
+ * the passed [ClassElement] interface hierarchy, and the associated
+ * [ExecutableElement].
+ *
* @param classElt the class element to query
* @param visitedInterfaces a set of visited classes passed back into this method when it calls
- * itself recursively
- * @return a mapping between the set of all string names of the members inherited from the passed[ClassElement] interface hierarchy, and the associated [ExecutableElement]
+ * itself recursively
+ * @return a mapping between the set of all string names of the members inherited from the passed
+ * [ClassElement] interface hierarchy, and the associated [ExecutableElement]
*/
Map<String, ExecutableElement> computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
Map<String, ExecutableElement> resultMap = _interfaceLookup[classElt];
@@ -3876,6 +4016,7 @@ class InheritanceManager {
* Given some [ClassElement], this method finds and returns the [ExecutableElement] of
* the passed name in the class element. Static members, members in super types and members not
* accessible from the current library are not considered.
+ *
* @param classElt the class element to query
* @param memberName the name of the member to lookup in the class
* @return the found [ExecutableElement], or `null` if no such member was found
@@ -3899,6 +4040,7 @@ class InheritanceManager {
/**
* Record the passed map with the set of all members (methods, getters and setters) in the class
* into the passed map.
+ *
* @param map some non-`null`
* @param classElt the class element that will be recorded into the passed map
*/
@@ -3921,6 +4063,7 @@ class InheritanceManager {
* This method is used to report errors on when they are found computing inheritance information.
* See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where these generated
* error codes are reported back into the analysis engine.
+ *
* @param classElt the location of the source for which the exception occurred
* @param offset the offset of the location of the error
* @param length the length of the location of the error
@@ -3940,6 +4083,7 @@ class InheritanceManager {
* Instances of the class `Library` represent the data about a single library during the
* resolution of some (possibly different) library. They are not intended to be used except during
* the resolution process.
+ *
* @coverage dart.engine.resolver
*/
class Library {
@@ -3972,7 +4116,7 @@ class Library {
/**
* A list containing all of the libraries that are imported into this library.
*/
- Map<ImportDirective, Library> _importedLibraries = new Map<ImportDirective, Library>();
+ List<Library> _importedLibraries = _EMPTY_ARRAY;
/**
* A table mapping URI-based directive to the actual URI value.
@@ -3987,7 +4131,7 @@ class Library {
/**
* A list containing all of the libraries that are exported from this library.
*/
- Map<ExportDirective, Library> _exportedLibraries = new Map<ExportDirective, Library>();
+ List<Library> _exportedLibraries = _EMPTY_ARRAY;
/**
* A table mapping the sources for the compilation units in this library to their corresponding
@@ -4001,7 +4145,13 @@ class Library {
LibraryScope _libraryScope;
/**
+ * An empty array that can be used to initialize lists of libraries.
+ */
+ static List<Library> _EMPTY_ARRAY = new List<Library>(0);
+
+ /**
* Initialize a newly created data holder that can maintain the data associated with a library.
+ *
* @param analysisContext the analysis context in which this library is being analyzed
* @param errorListener the listener to which analysis errors will be reported
* @param librarySource the source specifying the defining compilation unit of this library
@@ -4014,23 +4164,8 @@ class Library {
}
/**
- * Record that the given library is exported from this library.
- * @param importLibrary the library that is exported from this library
- */
- void addExport(ExportDirective directive, Library exportLibrary) {
- _exportedLibraries[directive] = exportLibrary;
- }
-
- /**
- * Record that the given library is imported into this library.
- * @param importLibrary the library that is imported into this library
- */
- void addImport(ImportDirective directive, Library importLibrary) {
- _importedLibraries[directive] = importLibrary;
- }
-
- /**
* Return the AST structure 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
@@ -4047,72 +4182,61 @@ class Library {
/**
* Return a collection containing the sources for the compilation units in this library, including
* the defining compilation unit.
+ *
* @return the sources for the compilation units in this library
*/
Set<Source> get compilationUnitSources => _astMap.keys.toSet();
/**
* Return the AST structure associated with the defining compilation unit for this library.
+ *
* @return the AST structure associated with the defining compilation unit for this library
* @throws AnalysisException if an AST structure could not be created for the defining compilation
- * unit
+ * unit
*/
CompilationUnit get definingCompilationUnit => getAST(librarySource);
/**
* Return `true` if this library explicitly imports core.
+ *
* @return `true` if this library explicitly imports core
*/
bool get explicitlyImportsCore => _explicitlyImportsCore;
/**
- * Return the library exported by the given directive.
- * @param directive the directive that exports the library to be returned
- * @return the library exported by the given directive
- */
- Library getExport(ExportDirective directive) => _exportedLibraries[directive];
-
- /**
* Return an array containing the libraries that are exported from this library.
+ *
* @return an array containing the libraries that are exported from this library
*/
- List<Library> get exports {
- Set<Library> libraries = new Set<Library>();
- libraries.addAll(_exportedLibraries.values);
- return new List.from(libraries);
- }
-
- /**
- * Return the library imported by the given directive.
- * @param directive the directive that imports the library to be returned
- * @return the library imported by the given directive
- */
- Library getImport(ImportDirective directive) => _importedLibraries[directive];
+ List<Library> get exports => _exportedLibraries;
/**
* Return an array containing the libraries that are imported into this library.
+ *
* @return an array containing the libraries that are imported into this library
*/
- List<Library> get imports {
- Set<Library> libraries = new Set<Library>();
- libraries.addAll(_importedLibraries.values);
- return new List.from(libraries);
- }
+ List<Library> get imports => _importedLibraries;
/**
* Return an array containing the libraries that are either imported or exported from this
* library.
+ *
* @return the libraries that are either imported or exported from this library
*/
List<Library> get importsAndExports {
Set<Library> libraries = new Set<Library>();
- libraries.addAll(_importedLibraries.values);
- libraries.addAll(_exportedLibraries.values);
+ for (Library library in _importedLibraries) {
+ javaSetAdd(libraries, library);
+ }
+ for (Library library in _exportedLibraries) {
+ javaSetAdd(libraries, library);
+ }
return new List.from(libraries);
}
/**
* Return the inheritance manager for this library.
+ *
* @return the inheritance manager for this library
*/
InheritanceManager get inheritanceManager {
@@ -4124,6 +4248,7 @@ class Library {
/**
* Return the library element representing this library, creating it if necessary.
+ *
* @return the library element representing this library
*/
LibraryElementImpl get libraryElement {
@@ -4139,6 +4264,7 @@ class Library {
/**
* Return the library scope used when resolving elements within this library's compilation units.
+ *
* @return the library scope used when resolving elements within this library's compilation units
*/
LibraryScope get libraryScope {
@@ -4150,6 +4276,7 @@ class Library {
/**
* Return the source specifying the defining compilation unit of this library.
+ *
* @return the source specifying the defining compilation unit of this library
*/
Source get librarySource => _librarySource;
@@ -4157,6 +4284,7 @@ class Library {
/**
* 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.
+ *
* @param directive the directive which URI should be resolved
* @return the result of resolving the URI against the URI of the library
*/
@@ -4189,6 +4317,7 @@ class Library {
/**
* Set the AST structure associated with the defining compilation unit for this library to the
* given AST structure.
+ *
* @param unit the AST structure associated with the defining compilation unit for this library
*/
void set definingCompilationUnit(CompilationUnit unit) {
@@ -4197,6 +4326,7 @@ class Library {
/**
* Set whether this library explicitly imports core to match the given value.
+ *
* @param explicitlyImportsCore `true` if this library explicitly imports core
*/
void set explicitlyImportsCore(bool explicitlyImportsCore2) {
@@ -4204,7 +4334,26 @@ class Library {
}
/**
+ * Set the libraries that are exported by this library to be those in the given array.
+ *
+ * @param exportedLibraries the libraries that are exported by this library
+ */
+ void set exportedLibraries(List<Library> exportedLibraries2) {
+ this._exportedLibraries = exportedLibraries2;
+ }
+
+ /**
+ * Set the libraries that are imported into this library to be those in the given array.
+ *
+ * @param importedLibraries the libraries that are imported into this library
+ */
+ void set importedLibraries(List<Library> importedLibraries2) {
+ this._importedLibraries = importedLibraries2;
+ }
+
+ /**
* Set the library element representing this library to the given library element.
+ *
* @param libraryElement the library element representing this library
*/
void set libraryElement(LibraryElementImpl libraryElement2) {
@@ -4218,6 +4367,7 @@ class Library {
/**
* 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
*/
@@ -4230,6 +4380,7 @@ class Library {
}
/**
* Instances of the class `LibraryElementBuilder` build an element model for a single library.
+ *
* @coverage dart.engine.resolver
*/
class LibraryElementBuilder {
@@ -4251,6 +4402,7 @@ class LibraryElementBuilder {
/**
* Initialize a newly created library element builder.
+ *
* @param resolver the resolver for which the element model is being built
*/
LibraryElementBuilder(LibraryResolver resolver) {
@@ -4260,6 +4412,7 @@ class LibraryElementBuilder {
/**
* Build the library element for the given library.
+ *
* @param library the library for which an element model is to be built
* @return the library element that was built
* @throws AnalysisException if the analysis could not be performed
@@ -4327,6 +4480,7 @@ class LibraryElementBuilder {
/**
* Add all of the non-synthetic getters and setters defined in the given compilation unit that
* have no corresponding accessor to one of the given collections.
+ *
* @param getters the map to which getters are to be added
* @param setters the list to which setters are to be added
* @param unit the compilation unit defining the accessors that are potentially being added
@@ -4347,9 +4501,10 @@ class LibraryElementBuilder {
/**
* Search the top-level functions defined in the given compilation unit for the entry point.
+ *
* @param element the compilation unit to be searched
* @return the entry point that was found, or `null` if the compilation unit does not define
- * an entry point
+ * an entry point
*/
FunctionElement findEntryPoint(CompilationUnitElementImpl element) {
for (FunctionElement function in element.functions) {
@@ -4361,11 +4516,13 @@ class LibraryElementBuilder {
}
/**
- * Return the name of the library that the given part is declared to be a part of, or `null`if the part does not contain a part-of directive.
+ * Return the name of the library that the given part is declared to be a part of, or `null`
+ * if the part does not contain a part-of directive.
+ *
* @param library the library containing the part
* @param partSource the source representing the part
* @param directivesToResolve a list of directives that should be resolved to the library being
- * built
+ * built
* @return the name of the library that the given part is declared to be a part of
*/
String getPartLibraryName(Library library, Source partSource, List<Directive> directivesToResolve) {
@@ -4389,6 +4546,7 @@ class LibraryElementBuilder {
* Look through all of the compilation units defined for the given library, looking for getters
* and setters that are defined in different compilation units but that have the same names. If
* any are found, make sure that they have the same variable element.
+ *
* @param libraryElement the library defining the compilation units to be processed
*/
void patchTopLevelAccessors(LibraryElementImpl libraryElement) {
@@ -4411,6 +4569,7 @@ class LibraryElementBuilder {
/**
* Instances of the class `LibraryResolver` are used to resolve one or more mutually dependent
* libraries within a single context.
+ *
* @coverage dart.engine.resolver
*/
class LibraryResolver {
@@ -4422,7 +4581,8 @@ class LibraryResolver {
/**
* The listener to which analysis errors will be reported, this error listener is either
- * references [recordingErrorListener], or it unions the passed[AnalysisErrorListener] with the [recordingErrorListener].
+ * references [recordingErrorListener], or it unions the passed
+ * [AnalysisErrorListener] with the [recordingErrorListener].
*/
RecordingErrorListener _errorListener;
@@ -4437,6 +4597,12 @@ class LibraryResolver {
Library _coreLibrary;
/**
+ * A flag indicating whether analysis is to generate audit results (e.g. type inference based
+ * information and pub best practices).
+ */
+ bool _audit = false;
+
+ /**
* The object used to access the types from the core library.
*/
TypeProvider _typeProvider;
@@ -4453,28 +4619,33 @@ class LibraryResolver {
/**
* Initialize a newly created library resolver to resolve libraries within the given context.
+ *
* @param analysisContext the analysis context in which the library is being analyzed
*/
LibraryResolver(InternalAnalysisContext analysisContext) {
this._analysisContext = analysisContext;
this._errorListener = new RecordingErrorListener();
_coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
+ _audit = analysisContext.analysisOptions.audit;
}
/**
* Return the analysis context in which the libraries are being analyzed.
+ *
* @return the analysis context in which the libraries are being analyzed
*/
InternalAnalysisContext get analysisContext => _analysisContext;
/**
* Return the listener to which analysis errors will be reported.
+ *
* @return the listener to which analysis errors will be reported
*/
RecordingErrorListener get errorListener => _errorListener;
/**
* Return an array containing information about all of the libraries that were resolved.
+ *
* @return an array containing the libraries that were resolved
*/
Set<Library> get resolvedLibraries => _librariesInCycles;
@@ -4482,8 +4653,9 @@ class LibraryResolver {
/**
* Resolve the library specified by the given source in the given context. The library is assumed
* to be embedded in the given source.
+ *
* @param librarySource the source specifying the defining compilation unit of the library to be
- * resolved
+ * resolved
* @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
@@ -4533,8 +4705,9 @@ class LibraryResolver {
* Note that because Dart allows circular imports between libraries, it is possible that more than
* one library will need to be resolved. In such cases the error listener can receive errors from
* multiple libraries.
+ *
* @param librarySource the source specifying the defining compilation unit of the library to be
- * resolved
+ * resolved
* @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
@@ -4583,6 +4756,7 @@ class LibraryResolver {
/**
* Add a dependency to the given map from the referencing library to the referenced library.
+ *
* @param dependencyMap the map to which the dependency is to be added
* @param referencingLibrary the library that references the referenced library
* @param referencedLibrary the library referenced by the referencing library
@@ -4600,10 +4774,11 @@ class LibraryResolver {
* Given a library that is part of a cycle that includes the root library, add to the given set of
* libraries all of the libraries reachable from the root library that are also included in the
* cycle.
+ *
* @param library the library to be added to the collection of libraries in cycles
* @param librariesInCycle a collection of the libraries that are in the cycle
* @param dependencyMap a table mapping libraries to the collection of libraries from which those
- * libraries are referenced
+ * libraries are referenced
*/
void addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<Library, List<Library>> dependencyMap) {
if (javaSetAdd(librariesInCycle, library)) {
@@ -4619,10 +4794,11 @@ class LibraryResolver {
/**
* Add the given library, and all libraries reachable from it that have not already been visited,
* to the given dependency map.
+ *
* @param library the library currently being added to the dependency map
* @param dependencyMap the dependency map being computed
* @param visitedLibraries the libraries that have already been visited, used to prevent infinite
- * recursion
+ * recursion
*/
void addToDependencyMap(Library library, Map<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
if (javaSetAdd(visitedLibraries, library)) {
@@ -4638,6 +4814,7 @@ class LibraryResolver {
/**
* Build the element model representing the combinators declared by the given directive.
+ *
* @param directive the directive that declares the combinators
* @return an array containing the import combinators that were built
*/
@@ -4660,8 +4837,9 @@ class LibraryResolver {
/**
* Every library now has a corresponding [LibraryElement], so it is now possible to resolve
* the import and export directives.
+ *
* @throws AnalysisException if the defining compilation unit for any of the libraries could not
- * be accessed
+ * be accessed
*/
void buildDirectiveModels() {
for (Library library in _librariesInCycles) {
@@ -4671,41 +4849,55 @@ class LibraryResolver {
for (Directive directive in library.definingCompilationUnit.directives) {
if (directive is ImportDirective) {
ImportDirective importDirective = directive as ImportDirective;
- Library importedLibrary = library.getImport(importDirective);
- if (importedLibrary != null) {
- ImportElementImpl importElement = new ImportElementImpl();
- importElement.uri = library.getUri(importDirective);
- importElement.combinators = buildCombinators(importDirective);
- LibraryElement importedLibraryElement = importedLibrary.libraryElement;
- if (importedLibraryElement != null) {
- importElement.importedLibrary = importedLibraryElement;
- }
- SimpleIdentifier prefixNode = ((directive as ImportDirective)).prefix;
- if (prefixNode != null) {
- String prefixName = prefixNode.name;
- PrefixElementImpl prefix = nameToPrefixMap[prefixName];
- if (prefix == null) {
- prefix = new PrefixElementImpl(prefixNode);
- nameToPrefixMap[prefixName] = prefix;
+ Source importedSource = library.getSource(importDirective);
+ if (importedSource != null) {
+ Library importedLibrary = _libraryMap[importedSource];
+ if (importedLibrary != null) {
+ ImportElementImpl importElement = new ImportElementImpl();
+ importElement.uri = library.getUri(importDirective);
+ importElement.combinators = buildCombinators(importDirective);
+ LibraryElement importedLibraryElement = importedLibrary.libraryElement;
+ if (importedLibraryElement != null) {
+ importElement.importedLibrary = importedLibraryElement;
+ }
+ SimpleIdentifier prefixNode = ((directive as ImportDirective)).prefix;
+ if (prefixNode != null) {
+ String prefixName = prefixNode.name;
+ PrefixElementImpl prefix = nameToPrefixMap[prefixName];
+ if (prefix == null) {
+ prefix = new PrefixElementImpl(prefixNode);
+ nameToPrefixMap[prefixName] = prefix;
+ }
+ importElement.prefix = prefix;
+ }
+ directive.element = importElement;
+ imports.add(importElement);
+ if (doesCompilationUnitHavePartOfDirective(importedLibrary.getAST(importedSource))) {
+ StringLiteral uriLiteral = importDirective.uri;
+ _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
}
- importElement.prefix = prefix;
}
- directive.element = importElement;
- imports.add(importElement);
}
} else if (directive is ExportDirective) {
ExportDirective exportDirective = directive as ExportDirective;
- ExportElementImpl exportElement = new ExportElementImpl();
- exportElement.uri = library.getUri(exportDirective);
- exportElement.combinators = buildCombinators(exportDirective);
- Library exportedLibrary = library.getExport(exportDirective);
- if (exportedLibrary != null) {
- LibraryElement exportedLibraryElement = exportedLibrary.libraryElement;
- if (exportedLibraryElement != null) {
- exportElement.exportedLibrary = exportedLibraryElement;
+ Source exportedSource = library.getSource(exportDirective);
+ if (exportedSource != null) {
+ Library exportedLibrary = _libraryMap[exportedSource];
+ if (exportedLibrary != null) {
+ ExportElementImpl exportElement = new ExportElementImpl();
+ exportElement.uri = library.getUri(exportDirective);
+ exportElement.combinators = buildCombinators(exportDirective);
+ LibraryElement exportedLibraryElement = exportedLibrary.libraryElement;
+ if (exportedLibraryElement != null) {
+ exportElement.exportedLibrary = exportedLibraryElement;
+ }
+ directive.element = exportElement;
+ exports.add(exportElement);
+ if (doesCompilationUnitHavePartOfDirective(exportedLibrary.getAST(exportedSource))) {
+ StringLiteral uriLiteral = exportDirective.uri;
+ _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
+ }
}
- directive.element = exportElement;
- exports.add(exportElement);
}
}
}
@@ -4724,6 +4916,7 @@ class LibraryResolver {
/**
* Build element models for all of the libraries in the current cycle.
+ *
* @throws AnalysisException if any of the element models cannot be built
*/
void buildElementModels() {
@@ -4737,6 +4930,7 @@ class LibraryResolver {
/**
* Resolve the type hierarchy across all of the types declared in the libraries in the current
* cycle.
+ *
* @throws AnalysisException if any of the type hierarchies could not be resolved
*/
void buildTypeHierarchies() {
@@ -4756,6 +4950,7 @@ class LibraryResolver {
* This map is used to compute all of the libraries involved in a cycle that include the root
* library. Given that we only add libraries that are reachable from the root library, when we
* work backward we are guaranteed to only get libraries in the cycle.
+ *
* @param library the library currently being added to the dependency map
*/
Map<Library, List<Library>> computeDependencyMap(Library library) {
@@ -4767,9 +4962,10 @@ class LibraryResolver {
/**
* Return a collection containing all of the libraries reachable from the given library that are
* contained in a cycle that includes the given library.
+ *
* @param library the library that must be included in any cycles whose members are to be returned
* @return all of the libraries referenced by the given library that have a circular reference
- * back to the given library
+ * back to the given library
*/
Set<Library> computeLibrariesInCycles(Library library) {
Map<Library, List<Library>> dependencyMap = computeDependencyMap(library);
@@ -4781,56 +4977,44 @@ class LibraryResolver {
/**
* Recursively traverse the libraries reachable from the given library, creating instances of the
* class [Library] to represent them, and record the references in the library objects.
+ *
* @param library the library to be processed to find libraries that have not yet been traversed
* @throws AnalysisException if some portion of the library graph could not be traversed
*/
void computeLibraryDependencies(Library library) {
+ Source librarySource = library.librarySource;
+ List<Library> importedLibraries = new List<Library>();
bool explicitlyImportsCore = false;
- CompilationUnit unit = library.definingCompilationUnit;
- for (Directive directive in unit.directives) {
- if (directive is ImportDirective) {
- ImportDirective importDirective = directive as ImportDirective;
- Source importedSource = library.getSource(importDirective);
- if (importedSource != null) {
- if (importedSource == _coreLibrarySource) {
- explicitlyImportsCore = true;
- }
- Library importedLibrary = _libraryMap[importedSource];
- if (importedLibrary == null) {
- importedLibrary = createLibraryOrNull(importedSource);
- if (importedLibrary != null) {
- computeLibraryDependencies(importedLibrary);
- }
- }
- if (importedLibrary != null) {
- library.addImport(importDirective, importedLibrary);
- if (doesCompilationUnitHavePartOfDirective(importedLibrary.getAST(importedSource))) {
- StringLiteral uriLiteral = importDirective.uri;
- _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
- }
- }
+ for (Source importedSource in _analysisContext.computeImportedLibraries(librarySource)) {
+ if (importedSource == _coreLibrarySource) {
+ explicitlyImportsCore = true;
+ }
+ Library importedLibrary = _libraryMap[importedSource];
+ if (importedLibrary == null) {
+ importedLibrary = createLibraryOrNull(importedSource);
+ if (importedLibrary != null) {
+ computeLibraryDependencies(importedLibrary);
}
- } else if (directive is ExportDirective) {
- ExportDirective exportDirective = directive as ExportDirective;
- Source exportedSource = library.getSource(exportDirective);
- if (exportedSource != null) {
- Library exportedLibrary = _libraryMap[exportedSource];
- if (exportedLibrary == null) {
- exportedLibrary = createLibraryOrNull(exportedSource);
- if (exportedLibrary != null) {
- computeLibraryDependencies(exportedLibrary);
- }
- }
- if (exportedLibrary != null) {
- library.addExport(exportDirective, exportedLibrary);
- if (doesCompilationUnitHavePartOfDirective(exportedLibrary.getAST(exportedSource))) {
- StringLiteral uriLiteral = exportDirective.uri;
- _errorListener.onError(new AnalysisError.con2(library.librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
- }
- }
+ }
+ if (importedLibrary != null) {
+ importedLibraries.add(importedLibrary);
+ }
+ }
+ library.importedLibraries = new List.from(importedLibraries);
+ List<Library> exportedLibraries = new List<Library>();
+ for (Source exportedSource in _analysisContext.computeExportedLibraries(librarySource)) {
+ Library exportedLibrary = _libraryMap[exportedSource];
+ if (exportedLibrary == null) {
+ exportedLibrary = createLibraryOrNull(exportedSource);
+ if (exportedLibrary != null) {
+ computeLibraryDependencies(exportedLibrary);
}
}
+ if (exportedLibrary != null) {
+ exportedLibraries.add(exportedLibrary);
+ }
}
+ library.exportedLibraries = new List.from(exportedLibraries);
library.explicitlyImportsCore = explicitlyImportsCore;
if (!explicitlyImportsCore && _coreLibrarySource != library.librarySource) {
Library importedLibrary = _libraryMap[_coreLibrarySource];
@@ -4846,6 +5030,7 @@ class LibraryResolver {
/**
* Create an object to represent the information about the library defined by the compilation unit
* with the given source.
+ *
* @param librarySource the source of the library's defining compilation unit
* @return the library object that was created
* @throws AnalysisException if the library source is not valid
@@ -4860,6 +5045,7 @@ class LibraryResolver {
/**
* Create an object to represent the information about the library defined by the compilation unit
* with the given source.
+ *
* @param librarySource the source of the library's defining compilation unit
* @return the library object that was created
* @throws AnalysisException if the library source is not valid
@@ -4875,6 +5061,7 @@ class LibraryResolver {
* Create an object to represent the information about the library defined by the compilation unit
* with the given source. Return the library object that was created, or `null` if the
* source is not valid.
+ *
* @param librarySource the source of the library's defining compilation unit
* @return the library object that was created
*/
@@ -4894,6 +5081,7 @@ class LibraryResolver {
/**
* Return `true` if and only if the passed [CompilationUnit] has a part-of directive.
+ *
* @param node the [CompilationUnit] to test
* @return `true` if and only if the passed [CompilationUnit] has a part-of directive
*/
@@ -4909,6 +5097,7 @@ class LibraryResolver {
/**
* Return an array containing the lexical identifiers associated with the nodes in the given list.
+ *
* @param names the AST nodes representing the identifiers
* @return the lexical identifiers associated with the nodes in the list
*/
@@ -4943,8 +5132,9 @@ class LibraryResolver {
/**
* Resolve the identifiers and perform type analysis in the libraries in the current cycle.
+ *
* @throws AnalysisException if any of the identifiers could not be resolved or if any of the
- * libraries could not have their types analyzed
+ * libraries could not have their types analyzed
*/
void resolveReferencesAndTypes() {
for (Library library in _librariesInCycles) {
@@ -4954,9 +5144,10 @@ class LibraryResolver {
/**
* Resolve the identifiers and perform type analysis in the given library.
+ *
* @param library the library to be resolved
* @throws AnalysisException if any of the identifiers could not be resolved or if the types in
- * the library cannot be analyzed
+ * the library cannot be analyzed
*/
void resolveReferencesAndTypes2(Library library) {
for (Source source in library.compilationUnitSources) {
@@ -4966,9 +5157,11 @@ class LibraryResolver {
}
/**
- * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]analysis in the current cycle.
+ * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]
+ * analysis in the current cycle.
+ *
* @throws AnalysisException if any of the identifiers could not be resolved or if the types in
- * the library cannot be analyzed
+ * the library cannot be analyzed
*/
void runAdditionalAnalyses() {
for (Library library in _librariesInCycles) {
@@ -4977,10 +5170,12 @@ class LibraryResolver {
}
/**
- * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]analysis in the given library.
+ * Run additional analyses, such as the [ConstantVerifier] and [ErrorVerifier]
+ * analysis in the given library.
+ *
* @param library the library to have the extra analyses processes run
* @throws AnalysisException if any of the identifiers could not be resolved or if the types in
- * the library cannot be analyzed
+ * the library cannot be analyzed
*/
void runAdditionalAnalyses2(Library library) {
for (Source source in library.compilationUnitSources) {
@@ -4990,12 +5185,16 @@ class LibraryResolver {
unit.accept(constantVerifier);
ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, library.libraryElement, _typeProvider, library.inheritanceManager);
unit.accept(errorVerifier);
+ if (_audit) {
+ unit.accept(new PubVerifier(_analysisContext, errorReporter));
+ }
}
}
}
/**
* Instances of the class `ResolverVisitor` are used to resolve the nodes within a single
* compilation unit.
+ *
* @coverage dart.engine.resolver
*/
class ResolverVisitor extends ScopedVisitor {
@@ -5029,6 +5228,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
+ *
* @param library the library containing the compilation unit being resolved
* @param source the source representing the compilation unit being visited
* @param typeProvider the object used to access the types from the core library
@@ -5043,12 +5243,13 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
+ *
* @param definingLibrary the element for the library containing the compilation unit being
- * visited
+ * visited
* @param source the source representing the compilation unit being visited
* @param typeProvider the object used to access the types from the core library
* @param errorListener the error listener that will be informed of any errors that are found
- * during resolution
+ * during resolution
*/
ResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
_jtd_constructor_275_impl(definingLibrary, source, typeProvider, errorListener);
@@ -5060,6 +5261,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Return the object keeping track of which elements have had their types overridden.
+ *
* @return the object keeping track of which elements have had their types overridden
*/
TypeOverrideManager get overrideManager => _overrideManager;
@@ -5288,6 +5490,14 @@ class ResolverVisitor extends ScopedVisitor {
}
return null;
}
+ Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+ safelyVisit(node.function);
+ node.accept(_elementResolver);
+ inferFunctionExpressionsParametersTypes(node.argumentList);
+ safelyVisit(node.argumentList);
+ node.accept(_typeAnalyzer);
+ return null;
+ }
Object visitHideCombinator(HideCombinator node) => null;
Object visitIfStatement(IfStatement node) {
Expression condition = node.condition;
@@ -5347,8 +5557,9 @@ class ResolverVisitor extends ScopedVisitor {
}
Object visitMethodInvocation(MethodInvocation node) {
safelyVisit(node.target);
- safelyVisit(node.argumentList);
node.accept(_elementResolver);
+ inferFunctionExpressionsParametersTypes(node.argumentList);
+ safelyVisit(node.argumentList);
node.accept(_typeAnalyzer);
return null;
}
@@ -5434,6 +5645,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Return the class element representing the class containing the current node, or `null` if
* the current node is not contained in a class.
+ *
* @return the class element representing the class containing the current node
*/
ClassElement get enclosingClass => _enclosingClass;
@@ -5441,12 +5653,15 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Return the element representing the function containing the current node, or `null` if
* the current node is not contained in a function.
+ *
* @return the element representing the function containing the current node
*/
ExecutableElement get enclosingFunction => _enclosingFunction;
/**
- * Return the element associated with the given expression whose type can be overridden, or`null` if there is no element whose type can be overridden.
+ * Return the element associated with the given expression whose type can be overridden, or
+ * `null` if there is no element whose type can be overridden.
+ *
* @param expression the expression with which the element is associated
* @return the element associated with the given expression
*/
@@ -5469,6 +5684,7 @@ class ResolverVisitor extends ScopedVisitor {
* If it is appropriate to do so, override the current type of the given element with the given
* type. Generally speaking, it is appropriate if the given type is more specific than the current
* type.
+ *
* @param element the element whose type might be overridden
* @param potentialType the potential type of the element
*/
@@ -5527,6 +5743,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Return the best type information available for the given element. If the type of the element
* has been overridden, then return the overriding type. Otherwise, return the static type.
+ *
* @param element the element for which type information is to be returned
* @return the best type information available for the given element
*/
@@ -5546,6 +5763,7 @@ class ResolverVisitor extends ScopedVisitor {
* The given expression is the expression used to compute the iterator for a for-each statement.
* Attempt to compute the type of objects that will be assigned to the loop variable and return
* that type. Return `null` if the type could not be determined.
+ *
* @param iterator the iterator for a for-each statement
* @return the type of objects that will be assigned to the loop variable
*/
@@ -5569,8 +5787,51 @@ class ResolverVisitor extends ScopedVisitor {
}
/**
+ * If given "mayBeClosure" is [FunctionExpression] without explicit parameters types and its
+ * required type is [FunctionType], then infer parameters types from [FunctionType].
+ */
+ void inferFunctionExpressionParametersTypes(Expression mayBeClosure, Type2 mayByFunctionType) {
+ if (mayBeClosure is! FunctionExpression) {
+ return;
+ }
+ FunctionExpression closure = mayBeClosure as FunctionExpression;
+ if (mayByFunctionType is! FunctionType) {
+ return;
+ }
+ FunctionType expectedClosureType = mayByFunctionType as FunctionType;
+ closure.propagatedType = expectedClosureType;
+ NodeList<FormalParameter> parameters = closure.parameters.parameters;
+ List<ParameterElement> expectedParameters = expectedClosureType.parameters;
+ for (int i = 0; i < parameters.length && i < expectedParameters.length; i++) {
+ FormalParameter parameter = parameters[i];
+ ParameterElement element = parameter.element;
+ Type2 currentType = getBestType(element);
+ Type2 expectedType = expectedParameters[i].type;
+ if (currentType == null || expectedType.isMoreSpecificThan(currentType)) {
+ _overrideManager.setType(element, expectedType);
+ }
+ }
+ }
+
+ /**
+ * Try to infer types of parameters of the [FunctionExpression] arguments.
+ */
+ void inferFunctionExpressionsParametersTypes(ArgumentList argumentList) {
+ for (Expression argument in argumentList.arguments) {
+ ParameterElement parameter = argument.parameterElement;
+ if (parameter == null) {
+ parameter = argument.staticParameterElement;
+ }
+ if (parameter != null) {
+ inferFunctionExpressionParametersTypes(argument, parameter.type);
+ }
+ }
+ }
+
+ /**
* Return `true` if the given expression terminates abruptly (that is, if any expression
* following the given expression will not be reached).
+ *
* @param expression the expression being tested
* @return `true` if the given expression terminates abruptly
*/
@@ -5584,6 +5845,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Return `true` if the given statement terminates abruptly (that is, if any statement
* following the given statement will not be reached).
+ *
* @param statement the statement being tested
* @return `true` if the given statement terminates abruptly
*/
@@ -5606,6 +5868,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Propagate any type information that results from knowing that the given condition will have
* been evaluated to 'false'.
+ *
* @param condition the condition that will have evaluated to 'false'
*/
void propagateFalseState(Expression condition) {
@@ -5636,6 +5899,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Propagate any type information that results from knowing that the given expression will have
* been evaluated without altering the flow of execution.
+ *
* @param expression the expression that will have been evaluated
*/
void propagateState(Expression expression) {
@@ -5644,6 +5908,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* Propagate any type information that results from knowing that the given condition will have
* been evaluated to 'true'.
+ *
* @param condition the condition that will have evaluated to 'true'
*/
void propagateTrueState(Expression condition) {
@@ -5684,6 +5949,7 @@ class ResolverVisitor extends ScopedVisitor {
/**
* The abstract class `ScopedVisitor` maintains name and label scopes as an AST structure is
* being visited.
+ *
* @coverage dart.engine.resolver
*/
abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
@@ -5714,12 +5980,14 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
TypeProvider _typeProvider;
/**
- * The scope used to resolve labels for `break` and `continue` statements, or`null` if no labels have been defined in the current context.
+ * The scope used to resolve labels for `break` and `continue` statements, or
+ * `null` if no labels have been defined in the current context.
*/
LabelScope _labelScope;
/**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
+ *
* @param library the library containing the compilation unit being resolved
* @param source the source representing the compilation unit being visited
* @param typeProvider the object used to access the types from the core library
@@ -5738,12 +6006,13 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
/**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
+ *
* @param definingLibrary the element for the library containing the compilation unit being
- * visited
+ * visited
* @param source the source representing the compilation unit being visited
* @param typeProvider the object used to access the types from the core library
* @param errorListener the error listener that will be informed of any errors that are found
- * during resolution
+ * during resolution
*/
ScopedVisitor.con2(LibraryElement definingLibrary2, Source source2, TypeProvider typeProvider2, AnalysisErrorListener errorListener2) {
_jtd_constructor_277_impl(definingLibrary2, source2, typeProvider2, errorListener2);
@@ -5758,12 +6027,14 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
/**
* Return the library element for the library containing the compilation unit being resolved.
+ *
* @return the library element for the library containing the compilation unit being resolved
*/
LibraryElement get definingLibrary => _definingLibrary;
/**
* Return the object used to access the types from the core library.
+ *
* @return the object used to access the types from the core library
*/
TypeProvider get typeProvider => _typeProvider;
@@ -5991,18 +6262,21 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
/**
* Return the label scope in which the current node is being resolved.
+ *
* @return the label scope in which the current node is being resolved
*/
LabelScope get labelScope => _labelScope;
/**
* Return the name scope in which the current node is being resolved.
+ *
* @return the name scope in which the current node is being resolved
*/
Scope get nameScope => _nameScope;
/**
* Report an error with the given error code and arguments.
+ *
* @param errorCode the error code of the error to be reported
* @param node the node specifying the location of the error
* @param arguments the arguments to the error, used to compose the error message
@@ -6013,6 +6287,7 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
/**
* Report an error with the given error code and arguments.
+ *
* @param errorCode the error code of the error to be reported
* @param offset the offset of the location of the error
* @param length the length of the location of the error
@@ -6024,6 +6299,7 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
/**
* Report an error with the given error code and arguments.
+ *
* @param errorCode the error code of the error to be reported
* @param token the token specifying the location of the error
* @param arguments the arguments to the error, used to compose the error message
@@ -6034,6 +6310,7 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
/**
* Visit the given AST node if it is not null.
+ *
* @param node the node to be visited
*/
void safelyVisit(ASTNode node) {
@@ -6046,6 +6323,7 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
* Visit the given statement after it's scope has been created. This replaces the normal call to
* the inherited visit method so that ResolverVisitor can intervene when type propagation is
* enabled.
+ *
* @param node the statement to be visited
*/
void visitForEachStatementInScope(ForEachStatement node) {
@@ -6058,6 +6336,7 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
* Visit the given statement after it's scope has been created. This replaces the normal call to
* the inherited visit method so that ResolverVisitor can intervene when type propagation is
* enabled.
+ *
* @param node the statement to be visited
*/
void visitForStatementInScope(ForStatement node) {
@@ -6066,6 +6345,7 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
/**
* Add scopes for each of the given labels.
+ *
* @param labels the labels for which new scopes are to be added
* @return the scope that was in effect before the new scopes were added
*/
@@ -6088,6 +6368,7 @@ abstract class ScopedVisitor extends GeneralizingASTVisitor<Object> {
* * Every element that refers to types should be fully populated.
* * Every node representing an expression should be resolved to the Type of the expression.
* </ol>
+ *
* @coverage dart.engine.resolver
*/
class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
@@ -6095,6 +6376,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Create a table mapping HTML tag names to the names of the classes (in 'dart:html') that
* implement those tags.
+ *
* @return the table that was created
*/
static Map<String, String> createHtmlTagToClassMap() {
@@ -6187,6 +6469,11 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
TypeOverrideManager _overrideManager;
/**
+ * A table mapping [ExecutableElement]s to their propagated return types.
+ */
+ Map<ExecutableElement, Type2> _propagatedReturnTypes = new Map<ExecutableElement, Type2>();
+
+ /**
* A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
* those tags.
*/
@@ -6194,6 +6481,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Initialize a newly created type analyzer.
+ *
* @param resolver the resolver driving this participant
*/
StaticTypeAnalyzer(ResolverVisitor resolver) {
@@ -6205,6 +6493,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Set the type of the class being analyzed to the given type.
+ *
* @param thisType the type representing the class containing the nodes being analyzed
*/
void set thisType(InterfaceType thisType2) {
@@ -6212,7 +6501,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
/**
- * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is`String`.</blockquote>
+ * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+ * `String`.</blockquote>
*/
Object visitAdjacentStrings(AdjacentStrings node) {
recordStaticType(node, _typeProvider.stringType);
@@ -6266,17 +6556,17 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* The static type of the expression <i>e<sub>1</sub>.v = e<sub>2</sub></i> is the static type of
* <i>e<sub>2</sub></i>.
*
- * ... an assignment of the form <i>e<sub>1</sub>\[e<sub>2</sub>\] = e<sub>3</sub></i> ...
+ * ... an assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> ...
*
- * The static type of the expression <i>e<sub>1</sub>\[e<sub>2</sub>\] = e<sub>3</sub></i> is the
+ * The static type of the expression <i>e<sub>1</sub>[e<sub>2</sub>] = e<sub>3</sub></i> is the
* static type of <i>e<sub>3</sub></i>.
*
* A compound assignment of the form <i>v op= e</i> is equivalent to <i>v = v op e</i>. A compound
* assignment of the form <i>C.v op= e</i> is equivalent to <i>C.v = C.v op e</i>. A compound
* assignment of the form <i>e<sub>1</sub>.v op= e<sub>2</sub></i> is equivalent to <i>((x) => x.v
* = x.v op e<sub>2</sub>)(e<sub>1</sub>)</i> where <i>x</i> is a variable that is not used in
- * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>\[e<sub>2</sub>\] op=
- * e<sub>3</sub></i> is equivalent to <i>((a, i) => a\[i\] = a\[i\] op e<sub>3</sub>)(e<sub>1</sub>,
+ * <i>e<sub>2</sub></i>. A compound assignment of the form <i>e<sub>1</sub>[e<sub>2</sub>] op=
+ * e<sub>3</sub></i> is equivalent to <i>((a, i) => a[i] = a[i] op e<sub>3</sub>)(e<sub>1</sub>,
* e<sub>2</sub>)</i> where <i>a</i> and <i>i</i> are a variables that are not used in
* <i>e<sub>3</sub></i>.</blockquote>
*/
@@ -6290,7 +6580,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
Type2 propagatedType = getPropagatedType(rightHandSide);
if (propagatedType != null) {
if (propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
overrideType = propagatedType;
}
@@ -6300,13 +6590,13 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
} else {
ExecutableElement staticMethodElement = node.staticElement;
- Type2 staticType = computeReturnType(staticMethodElement);
+ Type2 staticType = computeStaticReturnType(staticMethodElement);
recordStaticType(node, staticType);
MethodElement propagatedMethodElement = node.element;
if (propagatedMethodElement != staticMethodElement) {
- Type2 propagatedType = computeReturnType(propagatedMethodElement);
+ Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
}
}
@@ -6352,14 +6642,14 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
*/
Object visitBinaryExpression(BinaryExpression node) {
ExecutableElement staticMethodElement = node.staticElement;
- Type2 staticType = computeReturnType(staticMethodElement);
+ Type2 staticType = computeStaticReturnType(staticMethodElement);
staticType = refineBinaryExpressionType(node, staticType);
recordStaticType(node, staticType);
MethodElement propagatedMethodElement = node.element;
if (propagatedMethodElement != staticMethodElement) {
- Type2 propagatedType = computeReturnType(propagatedMethodElement);
+ Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
}
return null;
@@ -6381,7 +6671,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
*/
Object visitCascadeExpression(CascadeExpression node) {
recordStaticType(node, getStaticType(node.target));
- recordPropagatedType(node, getPropagatedType(node.target));
+ recordPropagatedType2(node, getPropagatedType(node.target));
return null;
}
@@ -6419,7 +6709,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
Type2 propagatedType = propagatedThenType.getLeastUpperBound(propagatedElseType);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
}
return null;
@@ -6436,7 +6726,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
Object visitFunctionDeclaration(FunctionDeclaration node) {
FunctionExpression function = node.functionExpression;
ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
- functionElement.returnType = computeReturnType2(node);
+ functionElement.returnType = computeStaticReturnType2(node);
+ recordPropagatedType(functionElement, function.body);
FunctionTypeImpl functionType = functionElement.type as FunctionTypeImpl;
setTypeInformation(functionType, function.parameters);
recordStaticType(function, functionType);
@@ -6445,10 +6736,10 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* The Dart Language Specification, 12.9: <blockquote>The static type of a function literal of the
- * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub>, \[T<sub>n+1</sub>
- * x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub> = dk\]) => e</i> is
- * <i>(T<sub>1</sub>, &hellip;, Tn, \[T<sub>n+1</sub> x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>
- * x<sub>n+k</sub>\]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is the static type of
+ * form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;, T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub>
+ * x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub> = dk]) => e</i> is
+ * <i>(T<sub>1</sub>, &hellip;, Tn, [T<sub>n+1</sub> x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>
+ * x<sub>n+k</sub>]) &rarr; T<sub>0</sub></i>, where <i>T<sub>0</sub></i> is the static type of
* <i>e</i>. In any case where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is
* considered to have been specified as dynamic.
*
@@ -6460,9 +6751,9 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* &lt;= i &lt;= n</i>, is not specified, it is considered to have been specified as dynamic.
*
* The static type of a function literal of the form <i>(T<sub>1</sub> a<sub>1</sub>, &hellip;,
- * T<sub>n</sub> a<sub>n</sub>, \[T<sub>n+1</sub> x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub>
- * x<sub>n+k</sub> = dk\]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, \[T<sub>n+1</sub>
- * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>\]) &rarr; dynamic</i>. In any case
+ * T<sub>n</sub> a<sub>n</sub>, [T<sub>n+1</sub> x<sub>n+1</sub> = d1, &hellip;, T<sub>n+k</sub>
+ * x<sub>n+k</sub> = dk]) {s}</i> is <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>
+ * x<sub>n+1</sub>, &hellip;, T<sub>n+k</sub> x<sub>n+k</sub>]) &rarr; dynamic</i>. In any case
* where <i>T<sub>i</sub>, 1 &lt;= i &lt;= n</i>, is not specified, it is considered to have been
* specified as dynamic.
*
@@ -6478,7 +6769,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
return null;
}
ExecutableElementImpl functionElement = node.element as ExecutableElementImpl;
- functionElement.returnType = computeReturnType3(node);
+ functionElement.returnType = computeStaticReturnType3(node);
+ recordPropagatedType(functionElement, node.body);
FunctionTypeImpl functionType = node.element.type as FunctionTypeImpl;
setTypeInformation(functionType, node.parameters);
recordStaticType(node, functionType);
@@ -6499,22 +6791,30 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
*/
Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
ExecutableElement staticMethodElement = node.staticElement;
- Type2 staticType = computeReturnType(staticMethodElement);
- recordStaticType(node, staticType);
+ Type2 staticStaticType = computeStaticReturnType(staticMethodElement);
+ recordStaticType(node, staticStaticType);
+ Type2 staticPropagatedType = computePropagatedReturnType(staticMethodElement);
+ if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
+ recordPropagatedType2(node, staticPropagatedType);
+ }
ExecutableElement propagatedMethodElement = node.element;
- Type2 propagatedType = computeReturnType(propagatedMethodElement);
- if (staticType == null) {
- recordStaticType(node, propagatedType);
- } else if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ if (propagatedMethodElement != staticMethodElement) {
+ Type2 propagatedStaticType = computeStaticReturnType(propagatedMethodElement);
+ if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
+ recordPropagatedType2(node, propagatedStaticType);
+ }
+ Type2 propagatedPropagatedType = computePropagatedReturnType(propagatedMethodElement);
+ if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
+ recordPropagatedType2(node, propagatedPropagatedType);
+ }
}
return null;
}
/**
* The Dart Language Specification, 12.29: <blockquote>An assignable expression of the form
- * <i>e<sub>1</sub>\[e<sub>2</sub>\]</i> is evaluated as a method invocation of the operator method
- * <i>\[\]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</blockquote>
+ * <i>e<sub>1</sub>[e<sub>2</sub>]</i> is evaluated as a method invocation of the operator method
+ * <i>[]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</blockquote>
*/
Object visitIndexExpression(IndexExpression node) {
if (node.inSetterContext()) {
@@ -6525,18 +6825,18 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (propagatedMethodElement != staticMethodElement) {
Type2 propagatedType = computeArgumentType(propagatedMethodElement);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
}
} else {
ExecutableElement staticMethodElement = node.staticElement;
- Type2 staticType = computeReturnType(staticMethodElement);
+ Type2 staticType = computeStaticReturnType(staticMethodElement);
recordStaticType(node, staticType);
MethodElement propagatedMethodElement = node.element;
if (propagatedMethodElement != staticMethodElement) {
- Type2 propagatedType = computeReturnType(propagatedMethodElement);
+ Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
}
}
@@ -6560,7 +6860,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (isHtmlLibrary(library)) {
Type2 returnType = getFirstArgumentAsType2(library, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
if (returnType != null) {
- recordPropagatedType(node, returnType);
+ recordPropagatedType2(node, returnType);
}
}
}
@@ -6568,7 +6868,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
/**
- * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is`int`.</blockquote>
+ * The Dart Language Specification, 12.3: <blockquote>The static type of an integer literal is
+ * `int`.</blockquote>
*/
Object visitIntegerLiteral(IntegerLiteral node) {
recordStaticType(node, _typeProvider.intType);
@@ -6588,10 +6889,11 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* The Dart Language Specification, 12.6: <blockquote>The static type of a list literal of the
- * form <i><b>const</b> &lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or the form
- * <i>&lt;E&gt;\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is `List&lt;E&gt;`. The static
- * type a list literal of the form <i><b>const</b> \[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> or
- * the form <i>\[e<sub>1</sub>, &hellip;, e<sub>n</sub>\]</i> is `List&lt;dynamic&gt;`.</blockquote>
+ * form <i><b>const</b> &lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or the form
+ * <i>&lt;E&gt;[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;E&gt;`. The static
+ * type a list literal of the form <i><b>const</b> [e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> or
+ * the form <i>[e<sub>1</sub>, &hellip;, e<sub>n</sub>]</i> is `List&lt;dynamic&gt;`
+ * .</blockquote>
*/
Object visitListLiteral(ListLiteral node) {
Type2 staticType = _dynamicType;
@@ -6623,7 +6925,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
}
if (propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, _typeProvider.listType.substitute5(<Type2> [propagatedType]));
+ recordPropagatedType2(node, _typeProvider.listType.substitute5(<Type2> [propagatedType]));
}
}
return null;
@@ -6697,7 +6999,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (!betterValue) {
propagatedValueType = staticValueType;
}
- recordPropagatedType(node, _typeProvider.mapType.substitute5(<Type2> [propagatedKeyType, propagatedValueType]));
+ recordPropagatedType2(node, _typeProvider.mapType.substitute5(<Type2> [propagatedKeyType, propagatedValueType]));
}
}
return null;
@@ -6745,9 +7047,39 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (staticMethodElement == null) {
staticMethodElement = methodNameNode.element;
}
- Type2 staticType = computeReturnType(staticMethodElement);
- recordStaticType(node, staticType);
+ Type2 staticStaticType = computeStaticReturnType(staticMethodElement);
+ recordStaticType(node, staticStaticType);
+ Type2 staticPropagatedType = computePropagatedReturnType(staticMethodElement);
+ if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
+ recordPropagatedType2(node, staticPropagatedType);
+ }
String methodName = methodNameNode.name;
+ if (methodName == "then") {
+ Expression target = node.realTarget;
+ Type2 targetType = getBestType(target);
+ if (isAsyncFutureType(targetType)) {
+ NodeList<Expression> arguments = node.argumentList.arguments;
+ if (arguments.length == 1) {
+ Expression closureArg = arguments[0];
+ if (closureArg is FunctionExpression) {
+ FunctionExpression closureExpr = closureArg as FunctionExpression;
+ Type2 returnType = computePropagatedReturnType(closureExpr.element);
+ if (returnType != null) {
+ InterfaceTypeImpl newFutureType;
+ if (isAsyncFutureType(returnType)) {
+ newFutureType = returnType as InterfaceTypeImpl;
+ } else {
+ InterfaceType futureType = targetType as InterfaceType;
+ newFutureType = new InterfaceTypeImpl.con1(futureType.element);
+ newFutureType.typeArguments = <Type2> [returnType];
+ }
+ recordPropagatedType2(node, newFutureType);
+ return null;
+ }
+ }
+ }
+ }
+ }
if (methodName == "\$dom_createEvent") {
Expression target = node.realTarget;
if (target != null) {
@@ -6757,7 +7089,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (isHtmlLibrary(library)) {
Type2 returnType = getFirstArgumentAsType(library, node.argumentList);
if (returnType != null) {
- recordPropagatedType(node, returnType);
+ recordPropagatedType2(node, returnType);
}
}
}
@@ -6771,7 +7103,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (isHtmlLibrary(library)) {
Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList);
if (returnType != null) {
- recordPropagatedType(node, returnType);
+ recordPropagatedType2(node, returnType);
}
}
}
@@ -6782,7 +7114,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (isHtmlLibrary(library)) {
Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList);
if (returnType != null) {
- recordPropagatedType(node, returnType);
+ recordPropagatedType2(node, returnType);
}
}
}
@@ -6795,21 +7127,25 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
if (isHtmlLibrary(library)) {
Type2 returnType = getFirstArgumentAsQuery(library, node.argumentList);
if (returnType != null) {
- recordPropagatedType(node, returnType);
+ recordPropagatedType2(node, returnType);
}
}
}
} else if (methodName == "JS") {
Type2 returnType = getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
if (returnType != null) {
- recordPropagatedType(node, returnType);
+ recordPropagatedType2(node, returnType);
}
} else {
Element propagatedElement = methodNameNode.element;
if (propagatedElement != staticMethodElement) {
- Type2 propagatedType = computeReturnType(propagatedElement);
- if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ Type2 propagatedStaticType = computeStaticReturnType(propagatedElement);
+ if (propagatedStaticType != null && (staticStaticType == null || propagatedStaticType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedStaticType.isMoreSpecificThan(staticPropagatedType))) {
+ recordPropagatedType2(node, propagatedStaticType);
+ }
+ Type2 propagatedPropagatedType = computePropagatedReturnType(propagatedElement);
+ if (propagatedPropagatedType != null && (staticStaticType == null || propagatedPropagatedType.isMoreSpecificThan(staticStaticType)) && (staticPropagatedType == null || propagatedPropagatedType.isMoreSpecificThan(staticPropagatedType)) && (propagatedStaticType == null || propagatedPropagatedType.isMoreSpecificThan(propagatedStaticType))) {
+ recordPropagatedType2(node, propagatedPropagatedType);
}
}
}
@@ -6818,7 +7154,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
Object visitNamedExpression(NamedExpression node) {
Expression expression = node.expression;
recordStaticType(node, getStaticType(expression));
- recordPropagatedType(node, getPropagatedType(expression));
+ recordPropagatedType2(node, getPropagatedType(expression));
return null;
}
@@ -6833,7 +7169,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
Object visitParenthesizedExpression(ParenthesizedExpression node) {
Expression expression = node.expression;
recordStaticType(node, getStaticType(expression));
- recordPropagatedType(node, getPropagatedType(expression));
+ recordPropagatedType2(node, getPropagatedType(expression));
return null;
}
@@ -6848,7 +7184,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* A postfix expression of the form <i>e1.v++</i> is equivalent to <i>(x){var r = x.v; x.v = r +
* 1; return r}(e1)</i>.
*
- * A postfix expression of the form <i>e1\[e2\]++</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\]
+ * A postfix expression of the form <i>e1[e2]++</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
* = r + 1; return r}(e1, e2)</i>
*
* A postfix expression of the form <i>v--</i>, where <i>v</i> is an identifier, is equivalent to
@@ -6860,7 +7196,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* A postfix expression of the form <i>e1.v--</i> is equivalent to <i>(x){var r = x.v; x.v = r -
* 1; return r}(e1)</i>.
*
- * A postfix expression of the form <i>e1\[e2\]--</i> is equivalent to <i>(a, i){var r = a\[i\]; a\[i\]
+ * A postfix expression of the form <i>e1[e2]--</i> is equivalent to <i>(a, i){var r = a[i]; a[i]
* = r - 1; return r}(e1, e2)</i></blockquote>
*/
Object visitPostfixExpression(PostfixExpression node) {
@@ -6874,7 +7210,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
}
recordStaticType(node, staticType);
- recordPropagatedType(node, getPropagatedType(operand));
+ recordPropagatedType2(node, getPropagatedType(operand));
return null;
}
@@ -6908,8 +7244,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
recordStaticType(node, staticType);
Type2 propagatedType = _overrideManager.getType(element);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(prefixedIdentifier, propagatedType);
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(prefixedIdentifier, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
return null;
}
@@ -6925,7 +7261,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
recordStaticType(node, _typeProvider.boolType);
} else {
ExecutableElement staticMethodElement = node.staticElement;
- Type2 staticType = computeReturnType(staticMethodElement);
+ Type2 staticType = computeStaticReturnType(staticMethodElement);
if (identical(operator, sc.TokenType.MINUS_MINUS) || identical(operator, sc.TokenType.PLUS_PLUS)) {
Type2 intType = _typeProvider.intType;
if (identical(getStaticType(node.operand), intType)) {
@@ -6935,9 +7271,9 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
recordStaticType(node, staticType);
MethodElement propagatedMethodElement = node.element;
if (propagatedMethodElement != staticMethodElement) {
- Type2 propagatedType = computeReturnType(propagatedMethodElement);
+ Type2 propagatedType = computeStaticReturnType(propagatedMethodElement);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
}
}
@@ -6955,8 +7291,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* p<sub>k</sub>: p<sub>k</sub>);}</i> if <i>m</i> has required parameters <i>r<sub>1</sub>,
* &hellip;, r<sub>n</sub></i>, and named parameters <i>p<sub>1</sub> &hellip; p<sub>k</sub></i>
* with defaults <i>d<sub>1</sub>, &hellip;, d<sub>k</sub></i>.
- * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, \[p<sub>1</sub> = d<sub>1</sub>, &hellip;,
- * p<sub>k</sub> = d<sub>k</sub>\]){return o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
+ * * <i>(r<sub>1</sub>, &hellip;, r<sub>n</sub>, [p<sub>1</sub> = d<sub>1</sub>, &hellip;,
+ * p<sub>k</sub> = d<sub>k</sub>]){return o.m(r<sub>1</sub>, &hellip;, r<sub>n</sub>,
* p<sub>1</sub>, &hellip;, p<sub>k</sub>);}</i> if <i>m</i> has required parameters
* <i>r<sub>1</sub>, &hellip;, r<sub>n</sub></i>, and optional positional parameters
* <i>p<sub>1</sub> &hellip; p<sub>k</sub></i> with defaults <i>d<sub>1</sub>, &hellip;,
@@ -7001,7 +7337,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
recordStaticType(node, staticType);
Type2 propagatedType = _overrideManager.getType(element);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
return null;
}
@@ -7086,13 +7422,14 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
recordStaticType(node, staticType);
Type2 propagatedType = _overrideManager.getType(element);
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
- recordPropagatedType(node, propagatedType);
+ recordPropagatedType2(node, propagatedType);
}
return null;
}
/**
- * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is`String`.</blockquote>
+ * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+ * `String`.</blockquote>
*/
Object visitSimpleStringLiteral(SimpleStringLiteral node) {
recordStaticType(node, _typeProvider.stringType);
@@ -7100,7 +7437,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
/**
- * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is`String`.</blockquote>
+ * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
+ * `String`.</blockquote>
*/
Object visitStringInterpolation(StringInterpolation node) {
recordStaticType(node, _typeProvider.stringType);
@@ -7140,7 +7478,9 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
Expression initializer = node.initializer;
if (initializer != null) {
Type2 rightType = getBestType(initializer);
- VariableElement element = node.name.element as VariableElement;
+ SimpleIdentifier name = node.name;
+ recordPropagatedType2(name, rightType);
+ VariableElement element = name.element as VariableElement;
if (element != null) {
_resolver.override(element, rightType);
}
@@ -7151,6 +7491,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Record that the static type of the given node is the type of the second argument to the method
* represented by the given element.
+ *
* @param element the element representing the method invoked by the given node
*/
Type2 computeArgumentType(ExecutableElement element) {
@@ -7164,11 +7505,46 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
/**
- * Compute the return type of the method or function represented by the given element.
+ * Compute the propagated return type of the method or function represented by the given element.
+ *
* @param element the element representing the method or function invoked by the given node
- * @return the return type that was computed
+ * @return the propagated return type that was computed
+ */
+ Type2 computePropagatedReturnType(Element element) {
+ if (element is ExecutableElement) {
+ return _propagatedReturnTypes[element];
+ }
+ return null;
+ }
+
+ /**
+ * Given a function body, compute the propagated return type of the function. The propagated
+ * return type of functions with a block body is the least upper bound of all
+ * [ReturnStatement] expressions, with an expression body it is the type of the expression.
+ *
+ * @param body the boy of the function whose propagated return type is to be computed
+ * @return the propagated return type that was computed
+ */
+ Type2 computePropagatedReturnType2(FunctionBody body) {
+ if (body is ExpressionFunctionBody) {
+ ExpressionFunctionBody expressionBody = body as ExpressionFunctionBody;
+ return getBestType(expressionBody.expression);
+ }
+ if (body is BlockFunctionBody) {
+ List<Type2> result = [null];
+ body.accept(new GeneralizingASTVisitor_8(this, result));
+ return result[0];
+ }
+ return null;
+ }
+
+ /**
+ * Compute the static return type of the method or function represented by the given element.
+ *
+ * @param element the element representing the method or function invoked by the given node
+ * @return the static return type that was computed
*/
- Type2 computeReturnType(Element element) {
+ Type2 computeStaticReturnType(Element element) {
if (element is PropertyAccessorElement) {
FunctionType propertyType = ((element as PropertyAccessorElement)).type;
if (propertyType != null) {
@@ -7208,13 +7584,14 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
/**
- * Given a function declaration, compute the return type of the function. The return type of
- * functions with a block body is `dynamicType`, with an expression body it is the type of
- * the expression.
- * @param node the function expression whose return type is to be computed
- * @return the return type that was computed
+ * Given a function declaration, compute the return static type of the function. The return type
+ * of functions with a block body is `dynamicType`, with an expression body it is the type
+ * of the expression.
+ *
+ * @param node the function expression whose static return type is to be computed
+ * @return the static return type that was computed
*/
- Type2 computeReturnType2(FunctionDeclaration node) {
+ Type2 computeStaticReturnType2(FunctionDeclaration node) {
TypeName returnType = node.returnType;
if (returnType == null) {
return _dynamicType;
@@ -7226,10 +7603,11 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* Given a function expression, compute the return type of the function. The return type of
* functions with a block body is `dynamicType`, with an expression body it is the type of
* the expression.
+ *
* @param node the function expression whose return type is to be computed
* @return the return type that was computed
*/
- Type2 computeReturnType3(FunctionExpression node) {
+ Type2 computeStaticReturnType3(FunctionExpression node) {
FunctionBody body = node.body;
if (body is ExpressionFunctionBody) {
return getStaticType(((body as ExpressionFunctionBody)).expression);
@@ -7240,6 +7618,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Return the propagated type of the given expression if it is available, or the static type if
* there is no propagated type.
+ *
* @param expression the expression whose type is to be returned
* @return the propagated or static type of the given expression
*/
@@ -7258,6 +7637,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* If the given argument list contains at least one argument, and if the argument is a simple
* string literal, then parse that argument as a query string and return the type specified by the
* argument.
+ *
* @param library the library in which the specified type would be defined
* @param argumentList the list of arguments from which a type is to be extracted
* @return the type specified by the first argument in the argument list
@@ -7285,6 +7665,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* If the given argument list contains at least one argument, and if the argument is a simple
* string literal, return the String value of the argument.
+ *
* @param argumentList the list of arguments from which a string value is to be extracted
* @return the string specified by the first argument in the argument list
*/
@@ -7303,6 +7684,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* If the given argument list contains at least one argument, and if the argument is a simple
* string literal, and if the value of the argument is the name of a class defined within the
* given library, return the type specified by the argument.
+ *
* @param library the library in which the specified type would be defined
* @param argumentList the list of arguments from which a type is to be extracted
* @return the type specified by the first argument in the argument list
@@ -7313,6 +7695,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
* If the given argument list contains at least one argument, and if the argument is a simple
* string literal, and if the value of the argument is the name of a class defined within the
* given library, return the type specified by the argument.
+ *
* @param library the library in which the specified type would be defined
* @param argumentList the list of arguments from which a type is to be extracted
* @return the type specified by the first argument in the argument list
@@ -7333,6 +7716,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Return the propagated type of the given expression.
+ *
* @param expression the expression whose type is to be returned
* @return the propagated type of the given expression
*/
@@ -7343,6 +7727,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Return the static type of the given expression.
+ *
* @param expression the expression whose type is to be returned
* @return the static type of the given expression
*/
@@ -7356,10 +7741,12 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Return the type that should be recorded for a node that resolved to the given accessor.
+ *
* @param accessor the accessor that the node resolved to
- * @param context if the accessor element has context \[by being the RHS of a[PrefixedIdentifier] or [PropertyAccess]\], and the return type of the
- * accessor is a parameter type, then the type of the LHS can be used to get more
- * specific type information
+ * @param context if the accessor element has context [by being the RHS of a
+ * [PrefixedIdentifier] or [PropertyAccess]], and the return type of the
+ * accessor is a parameter type, then the type of the LHS can be used to get more
+ * specific type information
* @return the type that should be recorded for a node that resolved to the given accessor
*/
Type2 getType(PropertyAccessorElement accessor, Type2 context) {
@@ -7399,6 +7786,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Return the type represented by the given type name.
+ *
* @param typeName the type name representing the type to be returned
* @return the type represented by the type name
*/
@@ -7411,7 +7799,22 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
/**
+ * Return `true` if the given [Type] is the `Future` form the 'dart:async'
+ * library.
+ */
+ bool isAsyncFutureType(Type2 type) => type is InterfaceType && type.name == "Future" && isAsyncLibrary(type.element.library);
+
+ /**
+ * Return `true` if the given library is the 'dart:async' library.
+ *
+ * @param library the library being tested
+ * @return `true` if the library is 'dart:async'
+ */
+ bool isAsyncLibrary(LibraryElement library) => library.name == "dart.async";
+
+ /**
* Return `true` if the given library is the 'dart:html' library.
+ *
* @param library the library being tested
* @return `true` if the library is 'dart:html'
*/
@@ -7419,6 +7822,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Return `true` if the given node is not a type literal.
+ *
* @param node the node being tested
* @return `true` if the given node is not a type literal
*/
@@ -7428,11 +7832,36 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
}
/**
+ * Given a function element and its body, compute and record the propagated return type of the
+ * function.
+ *
+ * @param functionElement the function element to record propagated return type for
+ * @param body the boy of the function whose propagated return type is to be computed
+ * @return the propagated return type that was computed, may be `null` if it is not more
+ * specific than the static return type.
+ */
+ void recordPropagatedType(ExecutableElement functionElement, FunctionBody body) {
+ Type2 propagatedReturnType = computePropagatedReturnType2(body);
+ if (propagatedReturnType == null) {
+ return;
+ }
+ if (identical(propagatedReturnType, BottomTypeImpl.instance)) {
+ return;
+ }
+ Type2 staticReturnType = functionElement.returnType;
+ if (!propagatedReturnType.isMoreSpecificThan(staticReturnType)) {
+ return;
+ }
+ _propagatedReturnTypes[functionElement] = propagatedReturnType;
+ }
+
+ /**
* Record that the propagated type of the given node is the given type.
+ *
* @param expression the node whose type is to be recorded
* @param type the propagated type of the node
*/
- void recordPropagatedType(Expression expression, Type2 type) {
+ void recordPropagatedType2(Expression expression, Type2 type) {
if (type != null && !type.isDynamic) {
expression.propagatedType = type;
}
@@ -7440,6 +7869,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Record that the static type of the given node is the given type.
+ *
* @param expression the node whose type is to be recorded
* @param type the static type of the node
*/
@@ -7453,6 +7883,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Attempts to make a better guess for the static type of the given binary expression.
+ *
* @param node the binary expression to analyze
* @param staticType the static type of the expression as resolved
* @return the better type guess, or the same static type as given
@@ -7480,6 +7911,7 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
/**
* Set the return type and parameter type information for the given function type based on the
* given return type and parameter elements.
+ *
* @param functionType the function type to be filled in
* @param parameters the elements representing the parameters to the function
*/
@@ -7508,6 +7940,27 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> {
get thisType_J2DAccessor => _thisType;
set thisType_J2DAccessor(__v) => _thisType = __v;
}
+class GeneralizingASTVisitor_8 extends GeneralizingASTVisitor<Object> {
+ final StaticTypeAnalyzer StaticTypeAnalyzer_this;
+ List<Type2> result;
+ GeneralizingASTVisitor_8(this.StaticTypeAnalyzer_this, this.result) : super();
+ Object visitExpression(Expression node) => null;
+ Object visitReturnStatement(ReturnStatement node) {
+ Type2 type;
+ Expression expression = node.expression;
+ if (expression != null) {
+ type = StaticTypeAnalyzer_this.getBestType(expression);
+ } else {
+ type = BottomTypeImpl.instance;
+ }
+ if (result[0] == null) {
+ result[0] = type;
+ } else {
+ result[0] = result[0].getLeastUpperBound(type);
+ }
+ return null;
+ }
+}
/**
* Instances of the class `TypeOverrideManager` manage the ability to override the type of an
* element within a given context.
@@ -7521,6 +7974,7 @@ class TypeOverrideManager {
/**
* Apply a set of overrides that were previously captured.
+ *
* @param overrides the overrides to be applied
*/
void applyOverrides(Map<Element, Type2> overrides) {
@@ -7533,6 +7987,7 @@ class TypeOverrideManager {
/**
* Return a table mapping the elements whose type is overridden in the current scope to the
* overriding type.
+ *
* @return the overrides in the current scope
*/
Map<Element, Type2> captureLocalOverrides() {
@@ -7545,6 +8000,7 @@ class TypeOverrideManager {
/**
* Return a map from the elements for the variables in the given list that have their types
* overridden to the overriding type.
+ *
* @param variableList the list of variables whose overriding types are to be captured
* @return a table mapping elements to their overriding types
*/
@@ -7575,6 +8031,7 @@ class TypeOverrideManager {
/**
* Return the overridden type of the given element, or `null` if the type of the element has
* not been overridden.
+ *
* @param element the element whose type might have been overridden
* @return the overridden type of the given element
*/
@@ -7587,6 +8044,7 @@ class TypeOverrideManager {
/**
* Set the overridden type of the given element to the given type
+ *
* @param element the element whose type might have been overridden
* @param type the overridden type of the given element
*/
@@ -7615,6 +8073,7 @@ class TypeOverrideManager_TypeOverrideScope {
/**
* Initialize a newly created scope to be an empty child of the given scope.
+ *
* @param outerScope the outer scope in which types might be overridden
*/
TypeOverrideManager_TypeOverrideScope(TypeOverrideManager_TypeOverrideScope outerScope) {
@@ -7623,6 +8082,7 @@ class TypeOverrideManager_TypeOverrideScope {
/**
* Apply a set of overrides that were previously captured.
+ *
* @param overrides the overrides to be applied
*/
void applyOverrides(Map<Element, Type2> overrides) {
@@ -7634,6 +8094,7 @@ class TypeOverrideManager_TypeOverrideScope {
/**
* Return a table mapping the elements whose type is overridden in the current scope to the
* overriding type.
+ *
* @return the overrides in the current scope
*/
Map<Element, Type2> captureLocalOverrides() => _overridenTypes;
@@ -7641,6 +8102,7 @@ class TypeOverrideManager_TypeOverrideScope {
/**
* Return a map from the elements for the variables in the given list that have their types
* overridden to the overriding type.
+ *
* @param variableList the list of variables whose overriding types are to be captured
* @return a table mapping elements to their overriding types
*/
@@ -7663,6 +8125,7 @@ class TypeOverrideManager_TypeOverrideScope {
/**
* Return the overridden type of the given element, or `null` if the type of the element
* has not been overridden.
+ *
* @param element the element whose type might have been overridden
* @return the overridden type of the given element
*/
@@ -7681,6 +8144,7 @@ class TypeOverrideManager_TypeOverrideScope {
/**
* Set the overridden type of the given element to the given type
+ *
* @param element the element whose type might have been overridden
* @param type the overridden type of the given element
*/
@@ -7691,84 +8155,105 @@ class TypeOverrideManager_TypeOverrideScope {
/**
* The interface `TypeProvider` defines the behavior of objects that provide access to types
* defined by the language.
+ *
* @coverage dart.engine.resolver
*/
abstract class TypeProvider {
/**
* Return the type representing the built-in type 'bool'.
+ *
* @return the type representing the built-in type 'bool'
*/
InterfaceType get boolType;
/**
* Return the type representing the type 'bottom'.
+ *
* @return the type representing the type 'bottom'
*/
Type2 get bottomType;
/**
* Return the type representing the built-in type 'double'.
+ *
* @return the type representing the built-in type 'double'
*/
InterfaceType get doubleType;
/**
* Return the type representing the built-in type 'dynamic'.
+ *
* @return the type representing the built-in type 'dynamic'
*/
Type2 get dynamicType;
/**
* Return the type representing the built-in type 'Function'.
+ *
* @return the type representing the built-in type 'Function'
*/
InterfaceType get functionType;
/**
* Return the type representing the built-in type 'int'.
+ *
* @return the type representing the built-in type 'int'
*/
InterfaceType get intType;
/**
* Return the type representing the built-in type 'List'.
+ *
* @return the type representing the built-in type 'List'
*/
InterfaceType get listType;
/**
* Return the type representing the built-in type 'Map'.
+ *
* @return the type representing the built-in type 'Map'
*/
InterfaceType get mapType;
/**
* Return the type representing the built-in type 'num'.
+ *
* @return the type representing the built-in type 'num'
*/
InterfaceType get numType;
/**
* Return the type representing the built-in type 'Object'.
+ *
* @return the type representing the built-in type 'Object'
*/
InterfaceType get objectType;
/**
* Return the type representing the built-in type 'StackTrace'.
+ *
* @return the type representing the built-in type 'StackTrace'
*/
InterfaceType get stackTraceType;
/**
* Return the type representing the built-in type 'String'.
+ *
* @return the type representing the built-in type 'String'
*/
InterfaceType get stringType;
/**
+ * Return the type representing the built-in type 'Symbol'.
+ *
+ * @return the type representing the built-in type 'Symbol'
+ */
+ InterfaceType get symbolType;
+
+ /**
* Return the type representing the built-in type 'Type'.
+ *
* @return the type representing the built-in type 'Type'
*/
InterfaceType get typeType;
@@ -7776,6 +8261,7 @@ abstract class TypeProvider {
/**
* Instances of the class `TypeProviderImpl` provide access to types defined by the language
* by looking for those types in the element model for the core library.
+ *
* @coverage dart.engine.resolver
*/
class TypeProviderImpl implements TypeProvider {
@@ -7841,12 +8327,18 @@ class TypeProviderImpl implements TypeProvider {
InterfaceType _stringType;
/**
+ * The type representing the built-in type 'Symbol'.
+ */
+ InterfaceType _symbolType;
+
+ /**
* The type representing the built-in type 'Type'.
*/
InterfaceType _typeType;
/**
* Initialize a newly created type provider to provide the types defined in the given library.
+ *
* @param coreLibrary the element representing the core library (dart:core).
*/
TypeProviderImpl(LibraryElement coreLibrary) {
@@ -7864,11 +8356,13 @@ class TypeProviderImpl implements TypeProvider {
InterfaceType get objectType => _objectType;
InterfaceType get stackTraceType => _stackTraceType;
InterfaceType get stringType => _stringType;
+ InterfaceType get symbolType => _symbolType;
InterfaceType get typeType => _typeType;
/**
* Return the type with the given name from the given namespace, or `null` if there is no
* class with the given name.
+ *
* @param namespace the namespace in which to search for the given name
* @param typeName the name of the type being searched for
* @return the type that was found
@@ -7884,6 +8378,7 @@ class TypeProviderImpl implements TypeProvider {
/**
* Initialize the types provided by this type provider from the given library.
+ *
* @param library the library containing the definitions of the core types
*/
void initializeFrom(LibraryElement library) {
@@ -7900,6 +8395,7 @@ class TypeProviderImpl implements TypeProvider {
_objectType = getType(namespace, "Object");
_stackTraceType = getType(namespace, "StackTrace");
_stringType = getType(namespace, "String");
+ _symbolType = getType(namespace, "Symbol");
_typeType = getType(namespace, "Type");
}
}
@@ -7908,6 +8404,7 @@ class TypeProviderImpl implements TypeProvider {
* the elements in the element model. This includes the types of superclasses, mixins, interfaces,
* fields, methods, parameters, and local variables. As a side-effect, this also finishes building
* the type hierarchy.
+ *
* @coverage dart.engine.resolver
*/
class TypeResolverVisitor extends ScopedVisitor {
@@ -7924,6 +8421,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
+ *
* @param library the library containing the compilation unit being resolved
* @param source the source representing the compilation unit being visited
* @param typeProvider the object used to access the types from the core library
@@ -7937,12 +8435,13 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Initialize a newly created visitor to resolve the nodes in a compilation unit.
+ *
* @param definingLibrary the element for the library containing the compilation unit being
- * visited
+ * visited
* @param source the source representing the compilation unit being visited
* @param typeProvider the object used to access the types from the core library
* @param errorListener the error listener that will be informed of any errors that are found
- * during resolution
+ * during resolution
*/
TypeResolverVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) : super.con2(definingLibrary, source, typeProvider, errorListener) {
_jtd_constructor_283_impl(definingLibrary, source, typeProvider, errorListener);
@@ -8176,13 +8675,19 @@ class TypeResolverVisitor extends ScopedVisitor {
if (typeName is PrefixedIdentifier && parent is ConstructorName && argumentList == null) {
ConstructorName name = parent as ConstructorName;
if (name.name == null) {
- SimpleIdentifier prefix = ((typeName as PrefixedIdentifier)).prefix;
+ PrefixedIdentifier prefixedIdentifier = typeName as PrefixedIdentifier;
+ SimpleIdentifier prefix = prefixedIdentifier.prefix;
element = nameScope.lookup(prefix, definingLibrary);
if (element is PrefixElement) {
+ if (parent.parent is InstanceCreationExpression && ((parent.parent as InstanceCreationExpression)).isConst) {
+ reportError(CompileTimeErrorCode.CONST_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
+ } else {
+ reportError(StaticWarningCode.NEW_WITH_NON_TYPE, prefixedIdentifier.identifier, [prefixedIdentifier.identifier.name]);
+ }
return null;
} else if (element != null) {
- name.name = ((typeName as PrefixedIdentifier)).identifier;
- name.period = ((typeName as PrefixedIdentifier)).period;
+ name.name = prefixedIdentifier.identifier;
+ name.period = prefixedIdentifier.period;
node.name = prefix;
typeName = prefix;
}
@@ -8219,6 +8724,8 @@ class TypeResolverVisitor extends ScopedVisitor {
reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
} else if (isTypeNameTargetInRedirectedConstructor(node)) {
reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName.name]);
+ } else if (isTypeNameInTypeArgumentList(node)) {
+ reportError(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
} else {
reportError(StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]);
}
@@ -8255,6 +8762,10 @@ class TypeResolverVisitor extends ScopedVisitor {
reportError(StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]);
} else if (isTypeNameInIsExpression(node)) {
reportError(StaticWarningCode.TYPE_TEST_NON_TYPE, typeName, [typeName.name]);
+ } else if (isTypeNameTargetInRedirectedConstructor(node)) {
+ reportError(StaticWarningCode.REDIRECT_TO_NON_CLASS, typeName, [typeName.name]);
+ } else if (isTypeNameInTypeArgumentList(node)) {
+ reportError(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, typeName, [typeName.name]);
} else {
ASTNode parent = typeName.parent;
while (parent is TypeName) {
@@ -8357,6 +8868,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Given a type name representing the return type of a function, compute the return type of the
* function.
+ *
* @param returnType the type name representing the return type of the function
* @return the return type that was computed
*/
@@ -8370,6 +8882,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Return the class element that represents the class whose name was provided.
+ *
* @param identifier the name from the declaration of a class
* @return the class element that represents the class
*/
@@ -8387,6 +8900,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Return an array containing all of the elements associated with the parameters in the given
* list.
+ *
* @param parameterList the list of parameters whose elements are to be returned
* @return the elements associated with the parameters
*/
@@ -8405,9 +8919,10 @@ class TypeResolverVisitor extends ScopedVisitor {
* The number of type arguments in the given type name does not match the number of parameters in
* the corresponding class element. Return the error code that should be used to report this
* error.
+ *
* @param node the type name with the wrong number of type arguments
* @return the error code that should be used to report that the wrong number of type arguments
- * were provided
+ * were provided
*/
ErrorCode getInvalidTypeParametersErrorCode(TypeName node) {
ASTNode parent = node.parent;
@@ -8427,6 +8942,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Given the multiple elements to which a single name could potentially be resolved, return the
* single interface type that should be used, or `null` if there is no clear choice.
+ *
* @param elements the elements to which a single name could potentially be resolved
* @return the single interface type that should be used for the type name
*/
@@ -8445,6 +8961,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Return the type represented by the given type name.
+ *
* @param typeName the type name representing the type to be returned
* @return the type represented by the type name
*/
@@ -8458,6 +8975,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Return the type arguments associated with the given type.
+ *
* @param type the type whole type arguments are to be returned
* @return the type arguments associated with the given type
*/
@@ -8472,6 +8990,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Returns the simple identifier of the given (may be qualified) type name.
+ *
* @param typeName the (may be qualified) qualified type name
* @return the simple identifier of the given (may be qualified) type name.
*/
@@ -8485,6 +9004,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Checks if the given type name is used as the type in an as expression.
+ *
* @param typeName the type name to analyzer
* @return `true` if the given type name is used as the type in an as expression
*/
@@ -8499,6 +9019,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Checks if the given type name is used as the exception type in a catch clause.
+ *
* @param typeName the type name to analyzer
* @return `true` if the given type name is used as the exception type in a catch clause
*/
@@ -8513,9 +9034,10 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Checks if the given type name is used as the type in an instance creation expression.
+ *
* @param typeName the type name to analyzer
* @return `true` if the given type name is used as the type in an instance creation
- * expression
+ * expression
*/
bool isTypeNameInInstanceCreationExpression(TypeName typeName) {
ASTNode parent = typeName.parent;
@@ -8528,6 +9050,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Checks if the given type name is used as the type in an is expression.
+ *
* @param typeName the type name to analyzer
* @return `true` if the given type name is used as the type in an is expression
*/
@@ -8541,7 +9064,16 @@ class TypeResolverVisitor extends ScopedVisitor {
}
/**
+ * Checks if the given type name used in a type argument list.
+ *
+ * @param typeName the type name to analyzer
+ * @return `true` if the given type name is in a type argument list
+ */
+ bool isTypeNameInTypeArgumentList(TypeName typeName) => typeName.parent is TypeArgumentList;
+
+ /**
* Checks if the given type name is the target in a redirected constructor.
+ *
* @param typeName the type name to analyzer
* @return `true` if the given type name is used as the type in a redirected constructor
*/
@@ -8560,6 +9092,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Record that the static type of the given node is the given type.
+ *
* @param expression the node whose type is to be recorded
* @param type the static type of the node
*/
@@ -8575,8 +9108,9 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Resolve the types in the given with and implements clauses and associate those types with the
* given class element.
+ *
* @param classElement the class element with which the mixin and interface types are to be
- * associated
+ * associated
* @param withClause the with clause to be resolved
* @param implementsClause the implements clause to be resolved
*/
@@ -8624,9 +9158,10 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Return the type specified by the given name.
+ *
* @param typeName the type name specifying the type to be returned
* @param nonTypeError the error to produce if the type name is defined to be something other than
- * a type
+ * a type
* @return the type specified by the type name
*/
InterfaceType resolveType(TypeName typeName, ErrorCode nonTypeError) {
@@ -8643,9 +9178,10 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Resolve the types in the given list of type names.
+ *
* @param typeNames the type names to be resolved
* @param nonTypeError the error to produce if the type name is defined to be something other than
- * a type
+ * a type
* @return an array containing all of the types that were resolved.
*/
List<InterfaceType> resolveTypes(NodeList<TypeName> typeNames, ErrorCode nonTypeError) {
@@ -8680,6 +9216,7 @@ class TypeResolverVisitor extends ScopedVisitor {
/**
* Set the return type and parameter type information for the given function type based on the
* given return type and parameter elements.
+ *
* @param functionType the function type to be filled in
* @param parameters the elements representing the parameters to the function
*/
@@ -8712,12 +9249,14 @@ class TypeResolverVisitor extends ScopedVisitor {
}
/**
* Instances of the class `ClassScope` implement the scope defined by a class.
+ *
* @coverage dart.engine.resolver
*/
class ClassScope extends EnclosedScope {
/**
* Initialize a newly created scope enclosed within another scope.
+ *
* @param enclosingScope the scope in which this scope is lexically enclosed
* @param typeElement the element representing the type represented by this scope
*/
@@ -8738,6 +9277,7 @@ class ClassScope extends EnclosedScope {
/**
* Define the instance members defined by the class.
+ *
* @param typeElement the element representing the type represented by this scope
*/
void defineMembers(ClassElement typeElement) {
@@ -8751,6 +9291,7 @@ class ClassScope extends EnclosedScope {
/**
* Define the type parameters for the class.
+ *
* @param typeElement the element representing the type represented by this scope
*/
void defineTypeParameters(ClassElement typeElement) {
@@ -8763,6 +9304,7 @@ class ClassScope extends EnclosedScope {
/**
* Instances of the class `EnclosedScope` implement a scope that is lexically enclosed in
* another scope.
+ *
* @coverage dart.engine.resolver
*/
class EnclosedScope extends Scope {
@@ -8774,6 +9316,7 @@ class EnclosedScope extends Scope {
/**
* Initialize a newly created scope enclosed within another scope.
+ *
* @param enclosingScope the scope in which this scope is lexically enclosed
*/
EnclosedScope(Scope enclosingScope) {
@@ -8784,6 +9327,7 @@ class EnclosedScope extends Scope {
/**
* Return the scope in which this scope is lexically enclosed.
+ *
* @return the scope in which this scope is lexically enclosed
*/
Scope get enclosingScope => _enclosingScope;
@@ -8797,12 +9341,14 @@ class EnclosedScope extends Scope {
}
/**
* Instances of the class `FunctionScope` implement the scope defined by a function.
+ *
* @coverage dart.engine.resolver
*/
class FunctionScope extends EnclosedScope {
/**
* Initialize a newly created scope enclosed within another scope.
+ *
* @param enclosingScope the scope in which this scope is lexically enclosed
* @param functionElement the element representing the type represented by this scope
*/
@@ -8812,6 +9358,7 @@ class FunctionScope extends EnclosedScope {
/**
* Define the parameters for the given function in the scope that encloses this function.
+ *
* @param functionElement the element representing the function represented by this scope
*/
void defineParameters(ExecutableElement functionElement) {
@@ -8832,12 +9379,14 @@ class FunctionScope extends EnclosedScope {
/**
* Instances of the class `FunctionTypeScope` implement the scope defined by a function type
* alias.
+ *
* @coverage dart.engine.resolver
*/
class FunctionTypeScope extends EnclosedScope {
/**
* Initialize a newly created scope enclosed within another scope.
+ *
* @param enclosingScope the scope in which this scope is lexically enclosed
* @param typeElement the element representing the type alias represented by this scope
*/
@@ -8848,6 +9397,7 @@ class FunctionTypeScope extends EnclosedScope {
/**
* Define the parameters for the function type alias.
+ *
* @param typeElement the element representing the type represented by this scope
*/
void defineParameters(FunctionTypeAliasElement typeElement) {
@@ -8858,6 +9408,7 @@ class FunctionTypeScope extends EnclosedScope {
/**
* Define the type variables for the function type alias.
+ *
* @param typeElement the element representing the type represented by this scope
*/
void defineTypeVariables(FunctionTypeAliasElement typeElement) {
@@ -8869,6 +9420,7 @@ class FunctionTypeScope extends EnclosedScope {
}
/**
* Instances of the class `LabelScope` represent a scope in which a single label is defined.
+ *
* @coverage dart.engine.resolver
*/
class LabelScope {
@@ -8894,14 +9446,18 @@ class LabelScope {
static String EMPTY_LABEL = "";
/**
- * The label element returned for scopes that can be the target of an unlabeled `break` or`continue`.
+ * The label element returned for scopes that can be the target of an unlabeled `break` or
+ * `continue`.
*/
static SimpleIdentifier _EMPTY_LABEL_IDENTIFIER = new SimpleIdentifier.full(new sc.StringToken(sc.TokenType.IDENTIFIER, "", 0));
/**
- * Initialize a newly created scope to represent the potential target of an unlabeled`break` or `continue`.
+ * Initialize a newly created scope to represent the potential target of an unlabeled
+ * `break` or `continue`.
+ *
* @param outerScope the label scope enclosing the new label scope
- * @param onSwitchStatement `true` if this label is associated with a `switch`statement
+ * @param onSwitchStatement `true` if this label is associated with a `switch`
+ * statement
* @param onSwitchMember `true` if this label is associated with a `switch` member
*/
LabelScope.con1(LabelScope outerScope, bool onSwitchStatement, bool onSwitchMember) {
@@ -8913,6 +9469,7 @@ class LabelScope {
/**
* Initialize a newly created scope to represent the given label.
+ *
* @param outerScope the label scope enclosing the new label scope
* @param label the label defined in this scope
* @param element the element to which the label resolves
@@ -8929,6 +9486,7 @@ class LabelScope {
/**
* Return the label element corresponding to the given label, or `null` if the given label
* is not defined in this scope.
+ *
* @param targetLabel the label being looked up
* @return the label element corresponding to the given label
*/
@@ -8937,6 +9495,7 @@ class LabelScope {
/**
* Return the label element corresponding to the given label, or `null` if the given label
* is not defined in this scope.
+ *
* @param targetLabel the label being looked up
* @return the label element corresponding to the given label
*/
@@ -8953,6 +9512,7 @@ class LabelScope {
/**
* Instances of the class `LibraryImportScope` represent the scope containing all of the names
* available from imported libraries.
+ *
* @coverage dart.engine.resolver
*/
class LibraryImportScope extends Scope {
@@ -9020,8 +9580,9 @@ class LibraryImportScope extends Scope {
/**
* Initialize a newly created scope representing the names imported into the given library.
+ *
* @param definingLibrary the element representing the library that imports the names defined in
- * this scope
+ * this scope
* @param errorListener the listener that is to be informed when an error is encountered
*/
LibraryImportScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) {
@@ -9076,8 +9637,9 @@ class LibraryImportScope extends Scope {
/**
* Create all of the namespaces associated with the libraries imported into this library. The
* names are not added to this scope, but are stored for later reference.
+ *
* @param definingLibrary the element representing the library that imports the libraries for
- * which namespaces will be created
+ * which namespaces will be created
*/
void createImportedNamespaces(LibraryElement definingLibrary) {
NamespaceBuilder builder = new NamespaceBuilder();
@@ -9089,12 +9651,14 @@ class LibraryImportScope extends Scope {
/**
* Instances of the class `LibraryScope` implement a scope containing all of the names defined
* in a given library.
+ *
* @coverage dart.engine.resolver
*/
class LibraryScope extends EnclosedScope {
/**
* Initialize a newly created scope representing the names defined in the given library.
+ *
* @param definingLibrary the element representing the library represented by this scope
* @param errorListener the listener that is to be informed when an error is encountered
*/
@@ -9118,8 +9682,9 @@ class LibraryScope extends EnclosedScope {
/**
* Add to this scope all of the public top-level names that are defined in the given compilation
* unit.
+ *
* @param compilationUnit the compilation unit defining the top-level names to be added to this
- * scope
+ * scope
*/
void defineLocalNames(CompilationUnitElement compilationUnit) {
for (PropertyAccessorElement element in compilationUnit.accessors) {
@@ -9138,8 +9703,9 @@ class LibraryScope extends EnclosedScope {
/**
* Add to this scope all of the names that are explicitly defined in the given library.
+ *
* @param definingLibrary the element representing the library that defines the names in this
- * scope
+ * scope
*/
void defineTopLevelNames(LibraryElement definingLibrary) {
for (PrefixElement prefix in definingLibrary.prefixes) {
@@ -9154,6 +9720,7 @@ class LibraryScope extends EnclosedScope {
/**
* Instances of the class `Namespace` implement a mapping of identifiers to the elements
* represented by those identifiers. Namespaces are the building blocks for scopes.
+ *
* @coverage dart.engine.resolver
*/
class Namespace {
@@ -9171,8 +9738,9 @@ class Namespace {
/**
* Initialize a newly created namespace to have the given defined names.
+ *
* @param definedNames the mapping from names that are defined in this namespace to the
- * corresponding elements
+ * corresponding elements
*/
Namespace(Map<String, Element> definedNames) {
this._definedNames = definedNames;
@@ -9181,6 +9749,7 @@ class Namespace {
/**
* Return the element in this namespace that is available to the containing scope using the given
* name.
+ *
* @param name the name used to reference the
* @return the element represented by the given identifier
*/
@@ -9188,6 +9757,7 @@ class Namespace {
/**
* Return a table containing the same mappings as those defined by this namespace.
+ *
* @return a table containing the same mappings as those defined by this namespace
*/
Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
@@ -9195,12 +9765,14 @@ class Namespace {
/**
* Instances of the class `NamespaceBuilder` are used to build a `Namespace`. Namespace
* builders are thread-safe and re-usable.
+ *
* @coverage dart.engine.resolver
*/
class NamespaceBuilder {
/**
* Create a namespace representing the export namespace of the given [ExportElement].
+ *
* @param element the export element whose export namespace is to be created
* @return the export namespace that was created
*/
@@ -9216,6 +9788,7 @@ class NamespaceBuilder {
/**
* Create a namespace representing the export namespace of the given library.
+ *
* @param library the library whose export namespace is to be created
* @return the export namespace that was created
*/
@@ -9223,6 +9796,7 @@ class NamespaceBuilder {
/**
* Create a namespace representing the import namespace of the given library.
+ *
* @param library the library whose import namespace is to be created
* @return the import namespace that was created
*/
@@ -9239,6 +9813,7 @@ class NamespaceBuilder {
/**
* Create a namespace representing the public namespace of the given library.
+ *
* @param library the library whose public namespace is to be created
* @return the public namespace that was created
*/
@@ -9253,6 +9828,7 @@ class NamespaceBuilder {
/**
* Add all of the names in the given namespace to the given mapping table.
+ *
* @param definedNames the mapping table to which the names in the given namespace are to be added
* @param namespace the namespace containing the names to be added to this namespace
*/
@@ -9264,6 +9840,7 @@ class NamespaceBuilder {
/**
* Add all of the names in the given namespace to the given mapping table.
+ *
* @param definedNames the mapping table to which the names in the given namespace are to be added
* @param namespace the namespace containing the names to be added to this namespace
*/
@@ -9275,6 +9852,7 @@ class NamespaceBuilder {
/**
* Add the given element to the given mapping table if it has a publicly visible name.
+ *
* @param definedNames the mapping table to which the public name is to be added
* @param element the element to be added
*/
@@ -9288,9 +9866,10 @@ class NamespaceBuilder {
/**
* Add to the given mapping table all of the public top-level names that are defined in the given
* compilation unit.
+ *
* @param definedNames the mapping table to which the public names are to be added
* @param compilationUnit the compilation unit defining the top-level names to be added to this
- * namespace
+ * namespace
*/
void addPublicNames(Map<String, Element> definedNames, CompilationUnitElement compilationUnit) {
for (PropertyAccessorElement element in compilationUnit.accessors) {
@@ -9309,6 +9888,7 @@ class NamespaceBuilder {
/**
* Apply the given combinators to all of the names in the given mapping table.
+ *
* @param definedNames the mapping table to which the namespace operations are to be applied
* @param combinators the combinators to be applied
*/
@@ -9327,6 +9907,7 @@ class NamespaceBuilder {
/**
* Apply the given prefix to all of the names in the table of defined names.
+ *
* @param definedNames the names that were defined before this operation
* @param prefixElement the element defining the prefix to be added to the names
*/
@@ -9345,10 +9926,11 @@ class NamespaceBuilder {
/**
* Create a mapping table representing the export namespace of the given library.
+ *
* @param library the library whose public namespace is to be created
* @param visitedElements a set of libraries that do not need to be visited when processing the
- * export directives of the given library because all of the names defined by them will
- * be added by another library
+ * export directives of the given library because all of the names defined by them will
+ * be added by another library
* @return the mapping table that was created
*/
Map<String, Element> createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
@@ -9372,6 +9954,7 @@ class NamespaceBuilder {
/**
* Hide all of the given names by removing them from the given collection of defined names.
+ *
* @param definedNames the names that were defined before this operation
* @param hiddenNames the names to be hidden
*/
@@ -9385,6 +9968,7 @@ class NamespaceBuilder {
/**
* Show only the given names by removing all other names from the given collection of defined
* names.
+ *
* @param definedNames the names that were defined before this operation
* @param shownNames the names to be shown
*/
@@ -9407,6 +9991,7 @@ class NamespaceBuilder {
/**
* The abstract class `Scope` defines the behavior common to name scopes used by the resolver
* to determine which names are visible at any given point in the code.
+ *
* @coverage dart.engine.resolver
*/
abstract class Scope {
@@ -9430,6 +10015,7 @@ abstract class Scope {
/**
* Return `true` if the given name is a library-private name.
+ *
* @param name the name being tested
* @return `true` if the given name is a library-private name
*/
@@ -9446,6 +10032,7 @@ abstract class Scope {
* in this scope, then an error will be generated and the original element will continue to be
* mapped to the name. If there is an element with the given name in an enclosing scope, then a
* warning will be generated but the given element will hide the inherited element.
+ *
* @param element the element to be added to this scope
*/
void define(Element element) {
@@ -9462,15 +10049,17 @@ abstract class Scope {
/**
* Return the element with which the given identifier is associated, or `null` if the name
* is not defined within this scope.
+ *
* @param identifier the identifier associated with the element to be returned
* @param referencingLibrary the library that contains the reference to the name, used to
- * implement library-level privacy
+ * implement library-level privacy
* @return the element with which the given identifier is associated
*/
Element lookup(Identifier identifier, LibraryElement referencingLibrary) => lookup3(identifier, identifier.name, referencingLibrary);
/**
* Add the given element to this scope without checking for duplication or hiding.
+ *
* @param element the element to be added to this scope
*/
void defineWithoutChecking(Element element) {
@@ -9479,6 +10068,7 @@ abstract class Scope {
/**
* Add the given element to this scope without checking for duplication or hiding.
+ *
* @param name the name of the element to be added
* @param element the element to be added to this scope
*/
@@ -9488,6 +10078,7 @@ abstract class Scope {
/**
* 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;
@@ -9495,6 +10086,7 @@ abstract class Scope {
/**
* 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.
+ *
* @param existing the first element to be declared with the conflicting name
* @param duplicate another element declared with the conflicting name
* @return the error code used to report duplicate names within a scope
@@ -9509,6 +10101,7 @@ abstract class Scope {
/**
* Return the listener that is to be informed when an error is encountered.
+ *
* @return the listener that is to be informed when an error is encountered
*/
AnalysisErrorListener get errorListener;
@@ -9516,6 +10109,7 @@ abstract class Scope {
/**
* Return the source object representing the compilation unit with which errors related to this
* scope should be associated.
+ *
* @return the source object with which errors should be associated
*/
Source get source => definingLibrary.definingCompilationUnit.source;
@@ -9524,9 +10118,10 @@ abstract class Scope {
* Return the element with which the given name is associated, or `null` if the name is not
* defined within this scope. This method only returns elements that are directly defined within
* this scope, not elements that are defined in an enclosing scope.
+ *
* @param name the name associated with the element to be returned
* @param referencingLibrary the library that contains the reference to the name, used to
- * implement library-level privacy
+ * implement library-level privacy
* @return the element with which the given name is associated
*/
Element localLookup(String name, LibraryElement referencingLibrary) => _definedNames[name];
@@ -9534,17 +10129,19 @@ abstract class Scope {
/**
* Return the element with which the given name is associated, or `null` if the name is not
* defined within this scope.
+ *
* @param identifier the identifier node to lookup element for, used to report correct kind of a
- * problem and associate problem with
+ * problem and associate problem with
* @param name the name associated with the element to be returned
* @param referencingLibrary the library that contains the reference to the name, used to
- * implement library-level privacy
+ * implement library-level privacy
* @return the element with which the given name is associated
*/
Element lookup3(Identifier identifier, String name, LibraryElement referencingLibrary);
/**
* Return the name that will be used to look up the given element.
+ *
* @param element the element whose look-up name is to be returned
* @return the name that will be used to look up the given element
*/
@@ -9562,6 +10159,7 @@ abstract class Scope {
* Instances of the class `ConstantVerifier` traverse an AST structure looking for additional
* errors and warnings not covered by the parser and resolver. In particular, it looks for errors
* and warnings related to constant expressions.
+ *
* @coverage dart.engine.resolver
*/
class ConstantVerifier extends RecursiveASTVisitor<Object> {
@@ -9593,6 +10191,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
/**
* Initialize a newly created constant verifier.
+ *
* @param errorReporter the error reporter by which errors will be reported
*/
ConstantVerifier(ErrorReporter errorReporter, TypeProvider typeProvider) {
@@ -9697,6 +10296,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
* Return `true` if the given value is the result of evaluating an expression whose value is
* a valid key in a const map literal. Keys in const map literals must be either a string, number,
* boolean, list, map, or null.
+ *
* @param value
* @return `true` if the given value is a valid key in a const map literal
*/
@@ -9705,6 +10305,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
/**
* If the given result represents one or more errors, report those errors. Except for special
* cases, use the given error code rather than the one reported in the error.
+ *
* @param result the result containing any errors that need to be reported
* @param errorCode the error code to be used if the result represents an error
*/
@@ -9712,7 +10313,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
if (result is ErrorResult) {
for (ErrorResult_ErrorData data in ((result as ErrorResult)).errorData) {
ErrorCode dataErrorCode = data.errorCode;
- if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
+ if (identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM)) {
_errorReporter.reportError2(dataErrorCode, data.node, []);
} else {
_errorReporter.reportError2(errorCode2, data.node, []);
@@ -9724,6 +10325,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
/**
* Validate that the given expression is a compile time constant. Return the value of the compile
* time constant, or `null` if the expression is not a compile time constant.
+ *
* @param expression the expression to be validated
* @param errorCode the error code to be used if the expression is not a compile time constant
* @return the value of the compile time constant
@@ -9737,6 +10339,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
/**
* Validate that if the passed instance creation is 'const' then all its arguments are constant
* expressions.
+ *
* @param node the instance creation evaluate
*/
void validateConstantArguments(InstanceCreationExpression node) {
@@ -9758,6 +10361,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
/**
* Validate that the default value associated with each of the parameters in the given list is a
* compile time constant.
+ *
* @param parameters the list of parameters to be validated
*/
void validateDefaultValues(FormalParameterList parameters2) {
@@ -9779,19 +10383,21 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
/**
* Validates that the given expression is a compile time constant.
+ *
* @param parameterElements the elements of parameters of constant constructor, they are
- * considered as a valid potentially constant expressions
+ * considered as a valid potentially constant expressions
* @param expression the expression to validate
*/
void validateInitializerExpression(List<ParameterElement> parameterElements, Expression expression) {
- EvaluationResultImpl result = expression.accept(new ConstantVisitor_9(this, parameterElements));
+ EvaluationResultImpl result = expression.accept(new ConstantVisitor_10(this, parameterElements));
reportErrors(result, CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
}
/**
* Validates that all of the arguments of a constructor initializer are compile time constants.
+ *
* @param parameterElements the elements of parameters of constant constructor, they are
- * considered as a valid potentially constant expressions
+ * considered as a valid potentially constant expressions
* @param argumentList the argument list to validate
*/
void validateInitializerInvocationArguments(List<ParameterElement> parameterElements, ArgumentList argumentList) {
@@ -9806,6 +10412,7 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
/**
* Validates that the expressions of the given initializers (of a constant constructor) are all
* compile time constants.
+ *
* @param constructor the constant constructor declaration to validate
*/
void validateInitializers(ConstructorDeclaration constructor) {
@@ -9827,10 +10434,10 @@ class ConstantVerifier extends RecursiveASTVisitor<Object> {
}
}
}
-class ConstantVisitor_9 extends ConstantVisitor {
+class ConstantVisitor_10 extends ConstantVisitor {
final ConstantVerifier ConstantVerifier_this;
List<ParameterElement> parameterElements;
- ConstantVisitor_9(this.ConstantVerifier_this, this.parameterElements) : super();
+ ConstantVisitor_10(this.ConstantVerifier_this, this.parameterElements) : super();
EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) {
Element element = node.element;
for (ParameterElement parameterElement in parameterElements) {
@@ -9862,12 +10469,14 @@ class ConstantVisitor_9 extends ConstantVisitor {
/**
* Instances of the class `ErrorVerifier` traverse an AST structure looking for additional
* errors and warnings not covered by the parser and resolver.
+ *
* @coverage dart.engine.resolver
*/
class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Checks if the given expression is the reference to the type.
+ *
* @param expr the expression to evaluate
* @return `true` if the given expression is the reference to the type
*/
@@ -9911,23 +10520,45 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
bool _strictMode = false;
/**
- * This is set to `true` iff the visitor is currently visiting children nodes of a[ConstructorDeclaration] and the constructor is 'const'.
+ * This is set to `true` iff the visitor is currently visiting children nodes of a
+ * [ConstructorDeclaration] and the constructor is 'const'.
+ *
* @see #visitConstructorDeclaration(ConstructorDeclaration)
*/
bool _isEnclosingConstructorConst = false;
/**
- * This is set to `true` iff the visitor is currently visiting children nodes of a[CatchClause].
+ * This is set to `true` iff the visitor is currently visiting children nodes of a
+ * [CatchClause].
+ *
* @see #visitCatchClause(CatchClause)
*/
bool _isInCatchClause = false;
/**
- * This is set to `true` iff the visitor is currently visiting a[ConstructorInitializer].
+ * This is set to `true` iff the visitor is currently visiting an instance variable
+ * declaration.
+ */
+ bool _isInInstanceVariableDeclaration = false;
+
+ /**
+ * This is set to `true` iff the visitor is currently visiting an instance variable
+ * initializer.
+ */
+ bool _isInInstanceVariableInitializer = false;
+
+ /**
+ * This is set to `true` iff the visitor is currently visiting a
+ * [ConstructorInitializer].
*/
bool _isInConstructorInitializer = false;
/**
+ * This is set to `true` iff the visitor is currently visiting a static method.
+ */
+ bool _isInStaticMethod = false;
+
+ /**
* This is set to `true` iff the visitor is currently visiting code in the SDK.
*/
bool _isInSystemLibrary = false;
@@ -9948,10 +10579,13 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* This map is initialized when visiting the contents of a class declaration. If the visitor is
* not in an enclosing class declaration, then the map is set to `null`.
*
- * When set the map maps the set of [FieldElement]s in the class to an[INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code>
+ * When set the map maps the set of [FieldElement]s in the class to an
+ * [INIT_STATE#NOT_INIT] or [INIT_STATE#INIT_IN_DECLARATION]. <code>checkFor*</code>
* methods, specifically [checkForAllFinalInitializedErrorCodes],
* can make a copy of the map to compute error code states. <code>checkFor*</code> methods should
- * only ever make a copy, or read from this map after it has been set in[visitClassDeclaration].
+ * only ever make a copy, or read from this map after it has been set in
+ * [visitClassDeclaration].
+ *
* @see #visitClassDeclaration(ClassDeclaration)
* @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
*/
@@ -9978,7 +10612,8 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String>();
/**
- * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and[CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
+ * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
+ * [CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS] error codes.
*/
List<InterfaceType> _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT;
ErrorVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary, TypeProvider typeProvider, InheritanceManager inheritanceManager) {
@@ -10058,6 +10693,8 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
}
checkForFinalNotInitialized(node);
+ checkForDuplicateDefinitionInheritance();
+ checkForConflictingGetterAndMethod();
return super.visitClassDeclaration(node);
} finally {
_initialFieldElementsMap = null;
@@ -10137,7 +10774,12 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
_errorReporter.reportError4(CompileTimeErrorCode.CONST_INSTANCE_FIELD, variables.keyword, []);
}
}
- return super.visitFieldDeclaration(node);
+ _isInInstanceVariableDeclaration = !node.isStatic;
+ try {
+ return super.visitFieldDeclaration(node);
+ } finally {
+ _isInInstanceVariableDeclaration = false;
+ }
}
Object visitFieldFormalParameter(FieldFormalParameter node) {
checkForConstFormalParameter(node);
@@ -10214,7 +10856,6 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
} else {
checkForNewWithUndefinedConstructor(node);
}
- checkForTypeArgumentNotMatchingBounds(node, constructorName.element, typeName);
}
return super.visitInstanceCreationExpression(node);
}
@@ -10247,14 +10888,15 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
Object visitMethodDeclaration(MethodDeclaration node) {
ExecutableElement previousFunction = _enclosingFunction;
try {
+ _isInStaticMethod = node.isStatic;
_enclosingFunction = node.element;
SimpleIdentifier identifier = node.name;
- String methoName = "";
+ String methodName = "";
if (identifier != null) {
- methoName = identifier.name;
+ methodName = identifier.name;
}
if (node.isSetter || node.isGetter) {
- checkForMismatchedAccessorTypes(node, methoName);
+ checkForMismatchedAccessorTypes(node, methodName);
checkForConflictingInstanceGetterAndSuperclassMember(node);
}
if (node.isGetter) {
@@ -10273,6 +10915,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
return super.visitMethodDeclaration(node);
} finally {
_enclosingFunction = previousFunction;
+ _isInStaticMethod = false;
}
}
Object visitMethodInvocation(MethodInvocation node) {
@@ -10288,7 +10931,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
return super.visitPostfixExpression(node);
}
Object visitPrefixedIdentifier(PrefixedIdentifier node) {
- checkForStaticAccessToInstanceMember(node.prefix, node.identifier);
+ if (node.parent is! Annotation) {
+ checkForStaticAccessToInstanceMember(node.prefix, node.identifier);
+ }
return super.visitPrefixedIdentifier(node);
}
Object visitPrefixExpression(PrefixExpression node) {
@@ -10335,7 +10980,6 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
}
Object visitSwitchStatement(SwitchStatement node) {
- checkForCaseExpressionTypeImplementsEquals(node);
checkForInconsistentCaseExpressionTypes(node);
checkForSwitchExpressionNotAssignable(node);
checkForCaseBlocksNotTerminated(node);
@@ -10353,6 +10997,10 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
checkForFinalNotInitialized2(node.variables);
return super.visitTopLevelVariableDeclaration(node);
}
+ Object visitTypeName(TypeName node) {
+ checkForTypeArgumentNotMatchingBounds(node);
+ return super.visitTypeName(node);
+ }
Object visitTypeParameter(TypeParameter node) {
checkForBuiltInIdentifierAsName(node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME);
return super.visitTypeParameter(node);
@@ -10364,11 +11012,13 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
nameNode.accept(this);
String name = nameNode.name;
javaSetAdd(_namesForReferenceToDeclaredVariableInInitializer, name);
+ _isInInstanceVariableInitializer = _isInInstanceVariableDeclaration;
try {
if (initializerNode != null) {
initializerNode.accept(this);
}
} finally {
+ _isInInstanceVariableInitializer = false;
_namesForReferenceToDeclaredVariableInInitializer.remove(name);
}
return null;
@@ -10389,6 +11039,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed constructor declaration does not violate any of the error codes
* relating to the initialization of fields in the enclosing class.
+ *
* @param node the [ConstructorDeclaration] to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see #initialFieldElementsMap
@@ -10456,6 +11107,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks the passed method declaration against override-error codes.
+ *
* @param node the [MethodDeclaration] to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
@@ -10663,6 +11315,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that all classes of the passed 'with' clause are valid.
+ *
* @param node the 'with' clause to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#MIXIN_DECLARES_CONSTRUCTOR
@@ -10689,6 +11342,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks error related to the redirected constructors.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#REDIRECT_TO_INVALID_RETURN_TYPE
@@ -10739,6 +11393,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
*
* This checks that the return type matches the type of the declared return type in the enclosing
* method or function.
+ *
* @param node the return statement to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#RETURN_IN_GENERATIVE_CONSTRUCTOR
@@ -10770,6 +11425,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the export namespace of the passed export directive does not export any name
* already exported by other export directive.
+ *
* @param node the export directive node to report problem on
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#AMBIGUOUS_EXPORT
@@ -10799,6 +11455,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed argument definition test identifier is a parameter.
+ *
* @param node the [ArgumentDefinitionTest] to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#ARGUMENT_DEFINITION_TEST_NON_PARAMETER
@@ -10815,6 +11472,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed arguments can be assigned to their corresponding parameters.
+ *
* @param node the arguments to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
@@ -10832,6 +11490,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed argument can be assigned to their corresponding parameters.
+ *
* @param node the argument to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
@@ -10872,6 +11531,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that left hand side of the passed assignment expression is not final.
+ *
* @param node the assignment expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#ASSIGNMENT_TO_FINAL
@@ -10883,6 +11543,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed expression is not final.
+ *
* @param node the expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#ASSIGNMENT_TO_FINAL
@@ -10917,9 +11578,13 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed identifier is not a keyword, and generates the passed error code
* on the identifier if it is a keyword.
+ *
* @param identifier the identifier to check to ensure that it is not a keyword
* @param errorCode if the passed identifier is a keyword then this error code is created on the
- * identifier, the error code will be one of[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME] or[CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
+ * identifier, the error code will be one of
+ * [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME],
+ * [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME] or
+ * [CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME]
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_NAME
* @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE_VARIABLE_NAME
@@ -10936,6 +11601,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed variable declaration list does not have a built-in identifier.
+ *
* @param node the variable declaration list to check
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#BUILT_IN_IDENTIFIER_AS_TYPE
@@ -10961,6 +11627,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the given switch case is terminated with 'break', 'continue', 'return' or
* 'throw'.
+ *
* @param node the switch case to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
@@ -10996,6 +11663,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the switch cases in the given switch statement is terminated with 'break',
* 'continue', 'return' or 'throw'.
+ *
* @param node the switch statement containing the cases to be checked
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#CASE_BLOCK_NOT_TERMINATED
@@ -11016,30 +11684,33 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed switch statement does not have a case expression with the
* operator '==' overridden.
+ *
* @param node the switch statement to evaluate
+ * @param type the common type of all 'case' expressions
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
*/
- bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node) {
- Expression expression = node.expression;
- Type2 type = getStaticType(expression);
- if (type != null && type != _typeProvider.intType && type != _typeProvider.stringType) {
- Element element = type.element;
- if (element is ClassElement) {
- ClassElement classElement = element as ClassElement;
- MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
- if (method != null && method.enclosingElement.type != _typeProvider.objectType) {
- _errorReporter.reportError2(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, expression, [element.displayName]);
- return true;
- }
- }
+ bool checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, Type2 type2) {
+ if (type2 == null || type2 == _typeProvider.intType || type2 == _typeProvider.stringType) {
+ return false;
}
- return false;
+ Element element = type2.element;
+ if (element is! ClassElement) {
+ return false;
+ }
+ ClassElement classElement = element as ClassElement;
+ MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
+ if (method == null || method.enclosingElement.type.isObject) {
+ return false;
+ }
+ _errorReporter.reportError4(CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, node.keyword, [element.displayName]);
+ return true;
}
/**
* This verifies that the passed method declaration is abstract only if the enclosing class is
* also abstract.
+ *
* @param node the method declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
@@ -11056,6 +11727,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies all possible conflicts of the constructor name with other constructors and
* members of the same class.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#DUPLICATE_CONSTRUCTOR_DEFAULT
@@ -11102,8 +11774,46 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
+ * This verifies that the [enclosingClass] does not have method and getter with the same
+ * names.
+ *
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see CompileTimeErrorCode#CONFLICTING_GETTER_AND_METHOD
+ * @see CompileTimeErrorCode#CONFLICTING_METHOD_AND_GETTER
+ */
+ bool checkForConflictingGetterAndMethod() {
+ if (_enclosingClass == null) {
+ return false;
+ }
+ bool hasProblem = false;
+ for (MethodElement method in _enclosingClass.methods) {
+ String name = method.name;
+ ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+ if (inherited is! PropertyAccessorElement) {
+ continue;
+ }
+ hasProblem = true;
+ _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, name.length, [_enclosingClass.displayName, inherited.enclosingElement.displayName, name]);
+ }
+ for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
+ if (!accessor.isGetter) {
+ continue;
+ }
+ String name = accessor.name;
+ ExecutableElement inherited = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+ if (inherited is! MethodElement) {
+ continue;
+ }
+ hasProblem = true;
+ _errorReporter.reportError3(CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, accessor.nameOffset, name.length, [_enclosingClass.displayName, inherited.enclosingElement.displayName, name]);
+ }
+ return hasProblem;
+ }
+
+ /**
* This verifies that the superclass of the enclosing class does not declare accessible static
* member with the same name as the passed instance getter/setter method declaration.
+ *
* @param node the method declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER
@@ -11149,6 +11859,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the enclosing class does not have an instance member with the same name as
* the passed static getter method declaration.
+ *
* @param node the method declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER
@@ -11182,6 +11893,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the enclosing class does not have an instance member with the same name as
* the passed static getter method declaration.
+ *
* @param node the method declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER
@@ -11222,6 +11934,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed constructor declaration is 'const' then there are no non-final
* instance variable.
+ *
* @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_FINAL_FIELD
@@ -11242,6 +11955,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed throw expression is not enclosed in a 'const' constructor
* declaration.
+ *
* @param node the throw expression expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_CONSTRUCTOR_THROWS_EXCEPTION
@@ -11256,6 +11970,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed normal formal parameter is not 'const'.
+ *
* @param node the normal formal parameter to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_FORMAL_PARAMETER
@@ -11271,8 +11986,10 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed instance creation expression is not being invoked on an abstract
* class.
+ *
* @param node the instance creation expression to evaluate
- * @param typeName the [TypeName] of the [ConstructorName] from the[InstanceCreationExpression], this is the AST node that the error is attached to
+ * @param typeName the [TypeName] of the [ConstructorName] from the
+ * [InstanceCreationExpression], this is the AST node that the error is attached to
* @param type the type being constructed with this [InstanceCreationExpression]
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#CONST_WITH_ABSTRACT_CLASS
@@ -11298,6 +12015,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* constructor that is not 'const'.
*
* This method assumes that the instance creation was tested to be 'const' before being called.
+ *
* @param node the instance creation expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_WITH_NON_CONST
@@ -11316,6 +12034,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* parameters.
*
* This method assumes that the instance creation was tested to be 'const' before being called.
+ *
* @param node the instance creation expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
@@ -11331,6 +12050,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed type name does not reference any type parameters.
+ *
* @param typeName the type name to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_WITH_TYPE_PARAMETERS
@@ -11362,6 +12082,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* resolved constructor.
*
* This method assumes that the instance creation was tested to be 'const' before being called.
+ *
* @param node the instance creation expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_WITH_UNDEFINED_CONSTRUCTOR
@@ -11391,6 +12112,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that there are no default parameters in the passed function type alias.
+ *
* @param node the function type alias to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS
@@ -11412,7 +12134,53 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
+ * This verifies that the enclosing class does not have an instance member with the given name of
+ * the static member.
+ *
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
+ */
+ bool checkForDuplicateDefinitionInheritance() {
+ if (_enclosingClass == null) {
+ return false;
+ }
+ bool hasProblem = false;
+ for (MethodElement method in _enclosingClass.methods) {
+ if (!method.isStatic) {
+ continue;
+ }
+ hasProblem = javaBooleanOr(hasProblem, checkForDuplicateDefinitionInheritance2(method));
+ }
+ return hasProblem;
+ }
+
+ /**
+ * This verifies that the enclosing class does not have an instance member with the given name of
+ * the static member.
+ *
+ * @param staticMember the static member to check conflict for
+ * @return `true` if and only if an error code is generated on the passed node
+ * @see CompileTimeErrorCode#DUPLICATE_DEFINITION_INHERITANCE
+ */
+ bool checkForDuplicateDefinitionInheritance2(ExecutableElement staticMember) {
+ String name = staticMember.name;
+ if (name == null) {
+ return false;
+ }
+ ExecutableElement inheritedMember = _inheritanceManager.lookupInheritance(_enclosingClass, name);
+ if (inheritedMember == null) {
+ return false;
+ }
+ if (inheritedMember.isStatic) {
+ return false;
+ }
+ _errorReporter.reportError3(CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, staticMember.nameOffset, name.length, [name, inheritedMember.enclosingElement.displayName]);
+ return true;
+ }
+
+ /**
* This verifies the passed import has unique name among other exported libraries.
+ *
* @param node the export directive to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#EXPORT_DUPLICATED_LIBRARY_NAME
@@ -11443,6 +12211,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Check that if the visiting library is not system, then any passed library should not be SDK
* internal library.
+ *
* @param node the export directive to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#EXPORT_INTERNAL_LIBRARY
@@ -11471,6 +12240,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed extends clause does not extend classes such as num or String.
+ *
* @param node the extends clause to test
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS
@@ -11485,6 +12255,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed type name does not extend or implement classes such as 'num' or
* 'String'.
+ *
* @param node the type name to test
* @return `true` if and only if an error code is generated on the passed node
* @see #checkForExtendsDisallowedClass(ExtendsClause)
@@ -11519,6 +12290,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed constructor field initializer has compatible field and
* initializer expression types.
+ *
* @param node the constructor field initializer to test
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE
@@ -11563,6 +12335,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed field formal parameter is in a constructor declaration.
+ *
* @param node the field formal parameter to test
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR
@@ -11590,6 +12363,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* This verifies that final fields that are declared, without any constructors in the enclosing
* class, are initialized. Cases in which there is at least one constructor are handled at the end
* of [checkForAllFinalInitializedErrorCodes].
+ *
* @param node the class declaration to test
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
@@ -11613,7 +12387,11 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed variable declaration list has only initialized variables if the
- * list is final or const. This method is called by[checkForFinalNotInitialized],[visitTopLevelVariableDeclaration] and[visitVariableDeclarationStatement].
+ * list is final or const. This method is called by
+ * [checkForFinalNotInitialized],
+ * [visitTopLevelVariableDeclaration] and
+ * [visitVariableDeclarationStatement].
+ *
* @param node the class declaration to test
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#FINAL_NOT_INITIALIZED
@@ -11635,6 +12413,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed implements clause does not implement classes such as 'num' or
* 'String'.
+ *
* @param node the implements clause to test
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#IMPLEMENTS_DISALLOWED_CLASS
@@ -11653,12 +12432,14 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that if the passed identifier is part of constructor initializer, then it does
* not reference implicitly 'this' expression.
+ *
* @param node the simple identifier to test
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#IMPLICIT_THIS_REFERENCE_IN_INITIALIZER
+ * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
*/
bool checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
- if (!_isInConstructorInitializer) {
+ if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer) {
return false;
}
Element element = node.element;
@@ -11674,6 +12455,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
return false;
}
ASTNode parent = node.parent;
+ if (parent is CommentReference) {
+ return false;
+ }
if (parent is MethodInvocation) {
MethodInvocation invocation = parent as MethodInvocation;
if (identical(invocation.methodName, node) && invocation.realTarget != null) {
@@ -11694,12 +12478,17 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
}
}
- _errorReporter.reportError2(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
+ if (_isInConstructorInitializer || _isInInstanceVariableInitializer) {
+ _errorReporter.reportError2(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
+ } else if (_isInStaticMethod) {
+ _errorReporter.reportError2(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
+ }
return true;
}
/**
* This verifies the passed import has unique name among other imported libraries.
+ *
* @param node the import directive to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#IMPORT_DUPLICATED_LIBRARY_NAME
@@ -11730,6 +12519,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Check that if the visiting library is not system, then any passed library should not be SDK
* internal library.
+ *
* @param node the import directive to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#IMPORT_INTERNAL_LIBRARY
@@ -11758,6 +12548,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed switch statement case expressions all have the same type.
+ *
* @param node the switch statement to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
@@ -11781,12 +12572,16 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
}
}
+ if (!foundError) {
+ checkForCaseExpressionTypeImplementsEquals(node, firstType);
+ }
return foundError;
}
/**
* For each class declaration, this method is called which verifies that all inherited members are
* inherited consistently.
+ *
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#INCONSISTENT_METHOD_INHERITANCE
*/
@@ -11805,6 +12600,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Given an assignment using a compound assignment operator, this verifies that the given
* assignment is valid.
+ *
* @param node the assignment expression being tested
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#INVALID_ASSIGNMENT
@@ -11833,6 +12629,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed left hand side and right hand side represent a valid assignment.
+ *
* @param lhs the left hand side expression
* @param rhs the right hand side expression
* @return `true` if and only if an error code is generated on the passed node
@@ -11864,6 +12661,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the usage of the passed 'this' is valid.
+ *
* @param node the 'this' expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#INVALID_REFERENCE_TO_THIS
@@ -11878,7 +12676,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Checks to ensure that first type argument to a map literal must be the 'String' type.
- * @param arguments a non-`null`, non-empty [TypeName] node list from the respective[MapLiteral]
+ *
+ * @param arguments a non-`null`, non-empty [TypeName] node list from the respective
+ * [MapLiteral]
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_FOR_KEY
*/
@@ -11895,8 +12695,11 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Checks to ensure that the passed [ListLiteral] or [MapLiteral] does not have a type
* parameter as a type argument.
- * @param arguments a non-`null`, non-empty [TypeName] node list from the respective[ListLiteral] or [MapLiteral]
- * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or[CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
+ *
+ * @param arguments a non-`null`, non-empty [TypeName] node list from the respective
+ * [ListLiteral] or [MapLiteral]
+ * @param errorCode either [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_LIST] or
+ * [CompileTimeErrorCode#INVALID_TYPE_ARGUMENT_IN_CONST_MAP]
* @return `true` if and only if an error code is generated on the passed node
*/
bool checkForInvalidTypeArgumentInConstTypedLiteral(NodeList<TypeName> arguments, ErrorCode errorCode) {
@@ -11913,6 +12716,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the [enclosingClass] does not define members with the same name as
* the enclosing class.
+ *
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#MEMBER_WITH_CLASS_NAME
*/
@@ -11937,6 +12741,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Check to make sure that all similarly typed accessors are of the same type (including inherited
* accessors).
+ *
* @param node The accessor currently being visited.
*/
void checkForMismatchedAccessorTypes(Declaration accessorDeclaration, String accessorTextName) {
@@ -11967,6 +12772,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed mixin does not have an explicitly declared constructor.
+ *
* @param mixinName the node to report problem on
* @param mixinElement the mixing to evaluate
* @return `true` if and only if an error code is generated on the passed node
@@ -11984,6 +12790,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed mixin has the 'Object' superclass.
+ *
* @param mixinName the node to report problem on
* @param mixinElement the mixing to evaluate
* @return `true` if and only if an error code is generated on the passed node
@@ -12002,6 +12809,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed mixin does not reference 'super'.
+ *
* @param mixinName the node to report problem on
* @param mixinElement the mixing to evaluate
* @return `true` if and only if an error code is generated on the passed node
@@ -12016,6 +12824,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed constructor has at most one 'super' initializer.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#MULTIPLE_SUPER_INITIALIZERS
@@ -12035,6 +12844,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Checks to ensure that native function bodies can only in SDK code.
+ *
* @param node the native function body to test
* @return `true` if and only if an error code is generated on the passed node
* @see ParserErrorCode#NATIVE_FUNCTION_BODY_IN_NON_SDK_CODE
@@ -12051,6 +12861,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* This verifies that the passed 'new' instance creation expression invokes existing constructor.
*
* This method assumes that the instance creation was tested to be 'new' before being called.
+ *
* @param node the instance creation expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#NEW_WITH_UNDEFINED_CONSTRUCTOR
@@ -12078,11 +12889,12 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
- * This checks that passed if the passed class declaration implicitly calls default constructor of
- * its superclass, there should be such default constructor - implicit or explicit.
+ * This checks that if the passed class declaration implicitly calls default constructor of its
+ * superclass, there should be such default constructor - implicit or explicit.
+ *
* @param node the [ClassDeclaration] to evaluate
* @return `true` if and only if an error code is generated on the passed node
- * @see StaticWarningCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
+ * @see CompileTimeErrorCode#NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT
*/
bool checkForNoDefaultSuperConstructorImplicit(ClassDeclaration node) {
List<ConstructorElement> constructors = _enclosingClass.constructors;
@@ -12093,17 +12905,25 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
if (superType == null) {
return false;
}
- ClassElement superClass = superType.element;
- if (superClass.hasDefaultConstructor()) {
- return false;
+ ClassElement superElement = superType.element;
+ ConstructorElement superUnnamedConstructor = superElement.unnamedConstructor;
+ if (superUnnamedConstructor != null) {
+ if (superUnnamedConstructor.isFactory) {
+ _errorReporter.reportError2(CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, node.name, [superUnnamedConstructor]);
+ return true;
+ }
+ if (superUnnamedConstructor.isDefaultConstructor) {
+ return true;
+ }
}
- _errorReporter.reportError2(StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
+ _errorReporter.reportError2(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, node.name, [superType.displayName]);
return true;
}
/**
* This checks that passed class declaration overrides all members required by its superclasses
* and interfaces.
+ *
* @param node the [ClassDeclaration] to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE
@@ -12176,26 +12996,25 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
return false;
}
List<ExecutableElement> missingOverridesArray = new List.from(missingOverrides);
- List<String> stringTypeArray = new List<String>(Math.min(missingOverridesSize, 4));
- String GET = "get ";
- String SET = "set ";
- for (int i = 0; i < stringTypeArray.length; i++) {
- stringTypeArray[i] = StringUtilities.EMPTY;
- if (missingOverridesArray[i] is PropertyAccessorElement) {
- stringTypeArray[i] = ((missingOverridesArray[i] as PropertyAccessorElement)).isGetter ? GET : SET;
+ List<String> stringMembersArrayListSet = new List<String>();
+ for (int i = 0; i < missingOverridesArray.length; i++) {
+ String newStrMember = "${missingOverridesArray[i].enclosingElement.displayName}.${missingOverridesArray[i].displayName}";
+ if (!stringMembersArrayListSet.contains(newStrMember)) {
+ stringMembersArrayListSet.add(newStrMember);
}
}
+ List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
AnalysisErrorWithProperties analysisError;
- if (missingOverridesSize == 1) {
- analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName]);
- } else if (missingOverridesSize == 2) {
- analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName]);
- } else if (missingOverridesSize == 3) {
- analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName]);
- } else if (missingOverridesSize == 4) {
- analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName]);
+ if (stringMembersArray.length == 1) {
+ analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, node.name, [stringMembersArray[0]]);
+ } else if (stringMembersArray.length == 2) {
+ analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, node.name, [stringMembersArray[0], stringMembersArray[1]]);
+ } else if (stringMembersArray.length == 3) {
+ analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, node.name, [stringMembersArray[0], stringMembersArray[1], stringMembersArray[2]]);
+ } else if (stringMembersArray.length == 4) {
+ analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR, node.name, [stringMembersArray[0], stringMembersArray[1], stringMembersArray[2], stringMembersArray[3]]);
} else {
- analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [stringTypeArray[0], missingOverridesArray[0].enclosingElement.displayName, missingOverridesArray[0].displayName, stringTypeArray[1], missingOverridesArray[1].enclosingElement.displayName, missingOverridesArray[1].displayName, stringTypeArray[2], missingOverridesArray[2].enclosingElement.displayName, missingOverridesArray[2].displayName, stringTypeArray[3], missingOverridesArray[3].enclosingElement.displayName, missingOverridesArray[3].displayName, missingOverridesArray.length - 4]);
+ analysisError = _errorReporter.newErrorWithProperties(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS, node.name, [stringMembersArray[0], stringMembersArray[1], stringMembersArray[2], stringMembersArray[3], stringMembersArray.length - 4]);
}
analysisError.setProperty(ErrorProperty.UNIMPLEMENTED_METHODS, missingOverridesArray);
_errorReporter.reportError(analysisError);
@@ -12205,6 +13024,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Checks to ensure that the expressions that need to be of type bool, are. Otherwise an error is
* reported on the expression.
+ *
* @param condition the conditional expression to test
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#NON_BOOL_CONDITION
@@ -12220,6 +13040,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed assert statement has either a 'bool' or '() -> bool' input.
+ *
* @param node the assert statement to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#NON_BOOL_EXPRESSION
@@ -12249,6 +13070,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* * has explicit type arguments
* * is not start of the statement
*
+ *
* @param node the map literal to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#NON_CONST_MAP_AS_EXPRESSION_STATEMENT
@@ -12272,8 +13094,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
- * This verifies the passed method declaration of operator `\[\]=`, has `void` return
+ * This verifies the passed method declaration of operator `[]=`, has `void` return
* type.
+ *
* @param node the method declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#NON_VOID_RETURN_FOR_OPERATOR
@@ -12295,6 +13118,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies the passed setter has no return type or the `void` return type.
+ *
* @param typeName the type name to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#NON_VOID_RETURN_FOR_SETTER
@@ -12314,6 +13138,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
*
* This method assumes that the method declaration was tested to be an operator declaration before
* being called.
+ *
* @param node the method declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#OPTIONAL_PARAMETER_IN_OPERATOR
@@ -12336,6 +13161,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks for named optional parameters that begin with '_'.
+ *
* @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#PRIVATE_OPTIONAL_PARAMETER
@@ -12356,6 +13182,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks if the passed constructor declaration is the redirecting generative constructor and
* references itself directly or indirectly.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#RECURSIVE_CONSTRUCTOR_REDIRECT
@@ -12380,6 +13207,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks if the passed constructor declaration has redirected constructor and references
* itself directly or indirectly.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#RECURSIVE_FACTORY_REDIRECT
@@ -12399,6 +13227,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks the class declaration is not a superinterface to itself.
+ *
* @param classElt the class element to test
* @param list a list containing the potentially cyclic implements path
* @return `true` if and only if an error code is generated on the passed element
@@ -12464,6 +13293,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks the passed constructor declaration has a valid combination of redirected
* constructor invocation(s), super constructor invocations and field initializers.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS
@@ -12499,7 +13329,8 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks if the passed constructor declaration has redirected constructor and references
- * itself directly or indirectly. TODO(scheglov)
+ * itself directly or indirectly.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#REDIRECT_TO_NON_CONST_CONSTRUCTOR
@@ -12530,6 +13361,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* 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
@@ -12576,6 +13408,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks that the rethrow is inside of a catch clause.
+ *
* @param node the rethrow expression to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#RETHROW_OUTSIDE_CATCH
@@ -12592,7 +13425,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
* This checks that a type mis-match between the return type and the expressed return type by the
* enclosing method or function.
*
- * This method is called both by [checkForAllReturnStatementErrorCodes]and [visitExpressionFunctionBody].
+ * This method is called both by [checkForAllReturnStatementErrorCodes]
+ * and [visitExpressionFunctionBody].
+ *
* @param returnExpression the returned expression to evaluate
* @param expectedReturnType the expressed return type by the enclosing method or function
* @return `true` if and only if an error code is generated on the passed node
@@ -12628,6 +13463,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks that if the given "target" is the type reference then the "name" is not the
* 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
@@ -12652,6 +13488,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* This checks that the type of the passed 'switch' expression is assignable to the type of the
* 'case' members.
+ *
* @param node the 'switch' statement to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticWarningCode#SWITCH_EXPRESSION_NOT_ASSIGNABLE
@@ -12680,39 +13517,49 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
- * This verifies that the type arguments in the passed instance creation expression are all within
- * their bounds as specified by the class element where the constructor \[that is being invoked\] is
- * declared.
- * @param node the instance creation expression to evaluate
- * @param typeName the [TypeName] of the [ConstructorName] from the[InstanceCreationExpression], this is the AST node that the error is attached to
- * @param constructorElement the [ConstructorElement] from the instance creation expression
+ * This verifies that the type arguments in the passed type name are all within their bounds.
+ *
+ * @param node the [TypeName] to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
*/
- bool checkForTypeArgumentNotMatchingBounds(InstanceCreationExpression node, ConstructorElement constructorElement, TypeName typeName) {
- if (typeName.typeArguments != null && constructorElement != null) {
- NodeList<TypeName> typeNameArgList = typeName.typeArguments.arguments;
- List<TypeVariableElement> boundingElts = constructorElement.enclosingElement.typeVariables;
- int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length);
- for (int i = 0; i < loopThroughIndex; i++) {
- TypeName argTypeName = typeNameArgList[i];
- Type2 argType = argTypeName.type;
- Type2 boundType = boundingElts[i].bound;
- if (argType != null && boundType != null) {
- if (!argType.isSubtypeOf(boundType)) {
- _errorReporter.reportError2(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, argTypeName, [argTypeName.name, boundingElts[i].displayName]);
- return true;
- }
+ bool checkForTypeArgumentNotMatchingBounds(TypeName node) {
+ if (node.typeArguments == null) {
+ return false;
+ }
+ List<TypeVariableElement> boundingElts = null;
+ Type2 type = node.type;
+ if (type == null) {
+ return false;
+ }
+ Element element = type.element;
+ if (element is ClassElement) {
+ boundingElts = ((element as ClassElement)).typeVariables;
+ } else {
+ return false;
+ }
+ NodeList<TypeName> typeNameArgList = node.typeArguments.arguments;
+ int loopThroughIndex = Math.min(typeNameArgList.length, boundingElts.length);
+ bool foundError = false;
+ for (int i = 0; i < loopThroughIndex; i++) {
+ TypeName argTypeName = typeNameArgList[i];
+ Type2 argType = argTypeName.type;
+ Type2 boundType = boundingElts[i].bound;
+ if (argType != null && boundType != null) {
+ if (!argType.isSubtypeOf(boundType)) {
+ _errorReporter.reportError2(StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, argTypeName, [argTypeName.name, boundingElts[i].bound.displayName]);
+ foundError = true;
}
}
}
- return false;
+ return foundError;
}
/**
* This checks that if the passed generative constructor has neither an explicit super constructor
* invocation nor a redirecting constructor invocation, that the superclass has a default
* generative constructor.
+ *
* @param node the constructor declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT
@@ -12751,7 +13598,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
offset = returnType.offset;
length = (name != null ? name.end : returnType.end) - offset;
}
- _errorReporter.reportError3(StaticWarningCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
+ _errorReporter.reportError3(CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, length, [superType.displayName]);
}
return false;
}
@@ -12764,6 +13611,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
*
* This method assumes that the method declaration was tested to be an operator declaration before
* being called.
+ *
* @param node the method declaration to evaluate
* @return `true` if and only if an error code is generated on the passed node
* @see CompileTimeErrorCode#WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR
@@ -12799,9 +13647,10 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
}
/**
- * This verifies if the passed setter parameter list have only one parameter.
+ * This verifies if the passed setter parameter list have only one required parameter.
*
* This method assumes that the method declaration was tested to be a setter before being called.
+ *
* @param setterName the name of the setter to report problems on
* @param parameterList the parameter list to evaluate
* @return `true` if and only if an error code is generated on the passed node
@@ -12814,9 +13663,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
if (parameterList == null) {
return false;
}
- int numberOfParameters = parameterList.parameters.length;
- if (numberOfParameters != 1) {
- _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, [numberOfParameters]);
+ NodeList<FormalParameter> parameters = parameterList.parameters;
+ if (parameters.length != 1 || parameters[0].kind != ParameterKind.REQUIRED) {
+ _errorReporter.reportError2(CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER, setterName, []);
return true;
}
return false;
@@ -12825,6 +13674,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Return the propagated type of the given expression, or the static type if there is no
* propagated type information.
+ *
* @param expression the expression whose type is to be returned
* @return the propagated or static type of the given expression, whichever is best
*/
@@ -12838,6 +13688,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Returns the Type (return type) for a given getter.
+ *
* @param propertyAccessorElement
* @return The type of the given getter.
*/
@@ -12852,6 +13703,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Return the propagated type of the given expression that is to be used for type analysis.
+ *
* @param expression the expression whose type is to be returned
* @return the propagated type of the given expression
*/
@@ -12859,6 +13711,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Returns the Type (first and only parameter) for a given setter.
+ *
* @param propertyAccessorElement
* @return The type of the given setter.
*/
@@ -12872,6 +13725,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Return the static type of the given expression that is to be used for type analysis.
+ *
* @param expression the expression whose type is to be returned
* @return the static type of the given expression
*/
@@ -12886,6 +13740,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> {
/**
* Return the variable element represented by the given expression, or `null` if there is no
* such element.
+ *
* @param expression the expression whose element is to be returned
* @return the variable element represented by the expression
*/
@@ -12994,6 +13849,7 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
* This verifies that the passed file import directive is not contained in a source inside a
* package "lib" directory hierarchy referencing a source outside that package "lib" directory
* hierarchy.
+ *
* @param uriLiteral the import URL (not `null`)
* @param path the file path being verified (not `null`)
* @return `true` if and only if an error code is generated on the passed node
@@ -13028,6 +13884,7 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
* This verifies that the passed file import directive is not contained in a source outside a
* package "lib" directory hierarchy referencing a source inside that package "lib" directory
* hierarchy.
+ *
* @param uriLiteral the import URL (not `null`)
* @param path the file path being verified (not `null`)
* @return `true` if and only if an error code is generated on the passed node
@@ -13067,6 +13924,7 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
/**
* This verifies that the passed package import directive does not contain ".."
+ *
* @param uriLiteral the import URL (not `null`)
* @param path the path to be validated (not `null`)
* @return `true` if and only if an error code is generated on the passed node
@@ -13082,6 +13940,7 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
/**
* Answer the source associated with the compilation unit containing the given AST node.
+ *
* @param node the node (not `null`)
* @return the source or `null` if it could not be determined
*/
@@ -13098,7 +13957,9 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
}
/**
- * Answer the full name of the given source. The returned value will have all[File#separatorChar] replace by '/'.
+ * Answer the full name of the given source. The returned value will have all
+ * [File#separatorChar] replace by '/'.
+ *
* @param source the source
* @return the full name or `null` if it could not be determined
*/
@@ -13117,6 +13978,7 @@ class PubVerifier extends RecursiveASTVisitor<Object> {
* resolver. The convention for this class is for the name of the error code to indicate the problem
* that caused the error to be generated and for the error message to explain what is wrong and,
* when appropriate, how the problem can be corrected.
+ *
* @coverage dart.engine.resolver
*/
class ResolverErrorCode implements Comparable<ResolverErrorCode>, ErrorCode {
@@ -13143,6 +14005,7 @@ class ResolverErrorCode implements Comparable<ResolverErrorCode>, ErrorCode {
/**
* Initialize a newly created error code to have the given type and message.
+ *
* @param type the type of this error
* @param message the message template used to create the message to be displayed for the error
*/
« no previous file with comments | « pkg/analyzer_experimental/lib/src/generated/parser.dart ('k') | pkg/analyzer_experimental/lib/src/generated/scanner.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698