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 2ca3f27e6d1866aea077c8a575371568c910eadf..87076595ffcd58576aeda6ff01d9e1012136b0b3 100644 |
--- a/pkg/analyzer_experimental/lib/src/generated/resolver.dart |
+++ b/pkg/analyzer_experimental/lib/src/generated/resolver.dart |
@@ -1013,7 +1013,23 @@ class DeclarationResolver extends RecursiveASTVisitor<Object> { |
} |
Object visitDefaultFormalParameter(DefaultFormalParameter node) { |
SimpleIdentifier parameterName = node.parameter.identifier; |
- ParameterElement element = find3(_enclosingExecutable.parameters, parameterName); |
+ ParameterElement element = null; |
+ if (_enclosingExecutable != null) { |
+ element = find3(_enclosingExecutable.parameters, parameterName); |
+ } else { |
+ PrintStringWriter writer = new PrintStringWriter(); |
+ writer.println("Invalid state found in the Analysis Engine:"); |
+ writer.println("DeclarationResolver.visitDefaultFormalParameter() is visiting a parameter that does not appear to be in a method or function."); |
+ writer.println("Ancestors:"); |
+ ASTNode parent14 = node.parent; |
+ while (parent14 != null) { |
+ writer.println(parent14.runtimeType.toString()); |
+ writer.println("---------"); |
+ parent14 = parent14.parent; |
+ } |
+ print(new AnalysisException()); |
Brian Wilkerson
2013/04/17 18:59:42
Didn't this need to be "writer.print(...)"?
|
+ AnalysisEngine.instance.logger.logError(writer.toString()); |
+ } |
Expression defaultValue2 = node.defaultValue; |
if (defaultValue2 != null) { |
ExecutableElement outerExecutable = _enclosingExecutable; |
@@ -1500,9 +1516,9 @@ class ElementResolver extends SimpleASTVisitor<Object> { |
if (type14 is DynamicTypeImpl) { |
return null; |
} else if (type14 is! InterfaceType) { |
- ASTNode parent14 = node.parent; |
- if (parent14 is InstanceCreationExpression) { |
- if (((parent14 as InstanceCreationExpression)).isConst()) { |
+ ASTNode parent15 = node.parent; |
Brian Wilkerson
2013/04/17 18:59:42
Enhancement request: It would be nice if we could
|
+ if (parent15 is InstanceCreationExpression) { |
+ if (((parent15 as InstanceCreationExpression)).isConst()) { |
} else { |
} |
} else { |
@@ -3678,11 +3694,11 @@ class ResolverVisitor extends ScopedVisitor { |
* @param expression the expression being tested |
* @return {@code true} if the given expression terminates abruptly |
*/ |
- bool isAbruptTermination(Expression expression18) { |
- while (expression18 is ParenthesizedExpression) { |
- expression18 = ((expression18 as ParenthesizedExpression)).expression; |
+ bool isAbruptTermination(Expression expression19) { |
+ while (expression19 is ParenthesizedExpression) { |
+ expression19 = ((expression19 as ParenthesizedExpression)).expression; |
} |
- return expression18 is ThrowExpression || expression18 is RethrowExpression; |
+ return expression19 is ThrowExpression || expression19 is RethrowExpression; |
} |
/** |
* Return {@code true} if the given statement terminates abruptly (that is, if any statement |
@@ -5107,8 +5123,8 @@ class StaticTypeAnalyzer extends SimpleASTVisitor<Object> { |
* @return {@code true} if the given node is not a type literal |
*/ |
bool isNotTypeLiteral(Identifier node) { |
- ASTNode parent15 = node.parent; |
- return parent15 is TypeName || (parent15 is PrefixedIdentifier && (parent15.parent is TypeName || identical(((parent15 as PrefixedIdentifier)).prefix, node))) || (parent15 is PropertyAccess && identical(((parent15 as PropertyAccess)).target, node)) || (parent15 is MethodInvocation && identical(node, ((parent15 as MethodInvocation)).target)); |
+ ASTNode parent16 = node.parent; |
+ return parent16 is TypeName || (parent16 is PrefixedIdentifier && (parent16.parent is TypeName || identical(((parent16 as PrefixedIdentifier)).prefix, node))) || (parent16 is PropertyAccess && identical(((parent16 as PropertyAccess)).target, node)) || (parent16 is MethodInvocation && identical(node, ((parent16 as MethodInvocation)).target)); |
} |
/** |
* If it is appropriate to do so, override the type of the given element. Use the static type and |
@@ -5737,9 +5753,9 @@ class TypeResolverVisitor extends ScopedVisitor { |
node.type = voidType; |
return null; |
} |
- ASTNode parent16 = node.parent; |
- if (typeName is PrefixedIdentifier && parent16 is ConstructorName && argumentList == null) { |
- ConstructorName name = parent16 as ConstructorName; |
+ ASTNode parent17 = node.parent; |
+ if (typeName is PrefixedIdentifier && parent17 is ConstructorName && argumentList == null) { |
+ ConstructorName name = parent17 as ConstructorName; |
if (name.name == null) { |
SimpleIdentifier prefix7 = ((typeName as PrefixedIdentifier)).prefix; |
element = nameScope.lookup(prefix7, definingLibrary); |
@@ -5907,11 +5923,11 @@ class TypeResolverVisitor extends ScopedVisitor { |
* were provided |
*/ |
ErrorCode getInvalidTypeParametersErrorCode(TypeName node) { |
- ASTNode parent17 = node.parent; |
- if (parent17 is ConstructorName) { |
- parent17 = parent17.parent; |
- if (parent17 is InstanceCreationExpression) { |
- if (((parent17 as InstanceCreationExpression)).isConst()) { |
+ ASTNode parent18 = node.parent; |
+ if (parent18 is ConstructorName) { |
+ parent18 = parent18.parent; |
+ if (parent18 is InstanceCreationExpression) { |
+ if (((parent18 as InstanceCreationExpression)).isConst()) { |
return CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS; |
} else { |
return CompileTimeErrorCode.NEW_WITH_INVALID_TYPE_PARAMETERS; |
@@ -7140,6 +7156,7 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> { |
} |
Object visitSwitchStatement(SwitchStatement node) { |
checkForCaseExpressionTypeImplementsEquals(node); |
+ checkForInconsistentCaseExpressionTypes(node); |
return super.visitSwitchStatement(node); |
} |
Object visitThrowExpression(ThrowExpression node) { |
@@ -7494,9 +7511,9 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> { |
* @see CompileTimeErrorCode#FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR |
*/ |
bool checkForFieldInitializerOutsideConstructor(FieldFormalParameter node) { |
- ASTNode parent18 = node.parent; |
- if (parent18 != null) { |
- ASTNode grandparent = parent18.parent; |
+ ASTNode parent19 = node.parent; |
+ if (parent19 != null) { |
+ ASTNode grandparent = parent19.parent; |
if (grandparent != null && grandparent is! ConstructorDeclaration && grandparent.parent is! ConstructorDeclaration) { |
_errorReporter.reportError(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, node, []); |
return true; |
@@ -7563,6 +7580,33 @@ class ErrorVerifier extends RecursiveASTVisitor<Object> { |
return foundError; |
} |
/** |
+ * This verifies that the passed switch statement case expressions all have the same type. |
+ * @param node the switch statement to evaluate |
+ * @return return {@code true} if and only if an error code is generated on the passed node |
+ * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES |
+ */ |
+ bool checkForInconsistentCaseExpressionTypes(SwitchStatement node) { |
+ NodeList<SwitchMember> switchMembers = node.members; |
+ bool foundError = false; |
+ Type2 firstType = null; |
+ for (SwitchMember switchMember in switchMembers) { |
+ if (switchMember is SwitchCase) { |
+ SwitchCase switchCase = switchMember as SwitchCase; |
+ Expression expression17 = switchCase.expression; |
+ if (firstType == null) { |
+ firstType = expression17.staticType; |
+ } else { |
+ Type2 nType = expression17.staticType; |
+ if (firstType != nType) { |
+ _errorReporter.reportError(CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, expression17, [expression17.toSource(), firstType.name]); |
+ foundError = true; |
+ } |
+ } |
+ } |
+ } |
+ return foundError; |
+ } |
+ /** |
* This verifies that the passed assignment expression represents a valid assignment. |
* @param node the assignment expression to evaluate |
* @return return {@code true} if and only if an error code is generated on the passed node |