### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java,v retrieving revision 1.63 diff -u -r1.63 ParameterizedQualifiedTypeReference.java --- compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java 1 Nov 2010 14:15:46 -0000 1.63 +++ compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java 14 Apr 2011 15:55:49 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -148,6 +148,7 @@ } } } + createArrayType(scope); return null; } @@ -173,6 +174,7 @@ } } } + createArrayType(scope); return null; } ReferenceBinding currentType = (ReferenceBinding) this.resolvedType; @@ -219,31 +221,32 @@ } } if (argHasError) { + createArrayType(scope); return null; } if (isClassScope) { ((ClassScope) scope).superTypeReference = keep; - if (((ClassScope) scope).detectHierarchyCycle(currentOriginal, this)) + if (((ClassScope) scope).detectHierarchyCycle(currentOriginal, this)) { + createArrayType(scope); return null; + } } TypeVariableBinding[] typeVariables = currentOriginal.typeVariables(); if (typeVariables == Binding.NO_TYPE_VARIABLES) { // check generic if (scope.compilerOptions().originalSourceLevel >= ClassFileConstants.JDK1_5) { // below 1.5, already reported as syntax error scope.problemReporter().nonGenericTypeCannotBeParameterized(i, this, currentType, argTypes); + createArrayType(scope); return null; } this.resolvedType = (qualifyingType != null && qualifyingType.isParameterizedType()) ? scope.environment().createParameterizedType(currentOriginal, null, qualifyingType) : currentType; - if (this.dimensions > 0) { - if (this.dimensions > 255) - scope.problemReporter().tooManyDimensions(this); - this.resolvedType = scope.createArrayType(this.resolvedType, this.dimensions); - } + createArrayType(scope); return this.resolvedType; } else if (argLength != typeVariables.length) { // check arity scope.problemReporter().incorrectArityForParameterizedType(this, currentType, argTypes, i); + createArrayType(scope); return null; } // check parameterizing non-static member type of raw type @@ -265,8 +268,10 @@ } else { ReferenceBinding currentOriginal = (ReferenceBinding)currentType.original(); if (isClassScope) - if (((ClassScope) scope).detectHierarchyCycle(currentOriginal, this)) + if (((ClassScope) scope).detectHierarchyCycle(currentOriginal, this)) { + createArrayType(scope); return null; + } if (currentOriginal.isGenericType()) { if (typeIsConsistent && qualifyingType != null && qualifyingType.isParameterizedType()) { scope.problemReporter().parameterizedMemberTypeMissingArguments(this, scope.environment().createParameterizedType(currentOriginal, null, qualifyingType), i); @@ -283,13 +288,16 @@ reportDeprecatedType(qualifyingType, scope, i); this.resolvedType = qualifyingType; } + createArrayType(scope); + return this.resolvedType; + } + private void createArrayType(Scope scope) { // array type ? if (this.dimensions > 0) { if (this.dimensions > 255) scope.problemReporter().tooManyDimensions(this); this.resolvedType = scope.createArrayType(this.resolvedType, this.dimensions); } - return this.resolvedType; } public StringBuffer printExpression(int indent, StringBuffer output) { Index: compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java,v retrieving revision 1.54 diff -u -r1.54 ParameterizedSingleTypeReference.java --- compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java 1 Nov 2010 14:15:46 -0000 1.54 +++ compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedSingleTypeReference.java 14 Apr 2011 15:55:49 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -105,7 +105,6 @@ } } } - boolean hasGenericError = false; ReferenceBinding currentType; this.bits |= ASTNode.DidResolve; if (enclosingType == null) { @@ -113,7 +112,6 @@ if (this.resolvedType.isValidBinding()) { currentType = (ReferenceBinding) this.resolvedType; } else { - hasGenericError = true; reportInvalidType(scope); switch (this.resolvedType.problemId()) { case ProblemReasons.NotFound : @@ -127,16 +125,17 @@ //$FALL-THROUGH$ - unable to complete type binding, but still resolve type arguments default : boolean isClassScope = scope.kind == Scope.CLASS_SCOPE; - int argLength = this.typeArguments.length; - for (int i = 0; i < argLength; i++) { - TypeReference typeArgument = this.typeArguments[i]; - if (isClassScope) { - typeArgument.resolveType((ClassScope) scope); - } else { - typeArgument.resolveType((BlockScope) scope, checkBounds); + int argLength = this.typeArguments.length; + for (int i = 0; i < argLength; i++) { + TypeReference typeArgument = this.typeArguments[i]; + if (isClassScope) { + typeArgument.resolveType((ClassScope) scope); + } else { + typeArgument.resolveType((BlockScope) scope, checkBounds); + } } - } - return null; + createArrayType(scope); + return null; } // be resilient, still attempt resolving arguments } @@ -150,8 +149,8 @@ } else { // resolving member type (relatively to enclosingType) this.resolvedType = currentType = scope.getMemberType(this.token, enclosingType); if (!this.resolvedType.isValidBinding()) { - hasGenericError = true; scope.problemReporter().invalidEnclosingType(this, currentType, enclosingType); + createArrayType(scope); return null; } if (isTypeUseDeprecated(currentType, scope)) @@ -163,34 +162,37 @@ } // check generic and arity - boolean isClassScope = scope.kind == Scope.CLASS_SCOPE; - TypeReference keep = null; - if (isClassScope) { - keep = ((ClassScope) scope).superTypeReference; - ((ClassScope) scope).superTypeReference = null; - } + boolean isClassScope = scope.kind == Scope.CLASS_SCOPE; + TypeReference keep = null; + if (isClassScope) { + keep = ((ClassScope) scope).superTypeReference; + ((ClassScope) scope).superTypeReference = null; + } int argLength = this.typeArguments.length; TypeBinding[] argTypes = new TypeBinding[argLength]; boolean argHasError = false; ReferenceBinding currentOriginal = (ReferenceBinding)currentType.original(); for (int i = 0; i < argLength; i++) { - TypeReference typeArgument = this.typeArguments[i]; - TypeBinding argType = isClassScope - ? typeArgument.resolveTypeArgument((ClassScope) scope, currentOriginal, i) - : typeArgument.resolveTypeArgument((BlockScope) scope, currentOriginal, i); - if (argType == null) { - argHasError = true; - } else { - argTypes[i] = argType; - } + TypeReference typeArgument = this.typeArguments[i]; + TypeBinding argType = isClassScope + ? typeArgument.resolveTypeArgument((ClassScope) scope, currentOriginal, i) + : typeArgument.resolveTypeArgument((BlockScope) scope, currentOriginal, i); + if (argType == null) { + argHasError = true; + } else { + argTypes[i] = argType; + } } if (argHasError) { + createArrayType(scope); return null; } if (isClassScope) { - ((ClassScope) scope).superTypeReference = keep; - if (((ClassScope) scope).detectHierarchyCycle(currentOriginal, this)) + ((ClassScope) scope).superTypeReference = keep; + if (((ClassScope) scope).detectHierarchyCycle(currentOriginal, this)) { + createArrayType(scope); return null; + } } TypeVariableBinding[] typeVariables = currentOriginal.typeVariables(); @@ -200,6 +202,7 @@ if (isCompliant15) { // below 1.5, already reported as syntax error this.resolvedType = currentType; scope.problemReporter().nonGenericTypeCannotBeParameterized(0, this, currentType, argTypes); + createArrayType(scope); return null; } } @@ -212,31 +215,33 @@ scope.problemReporter().tooManyDimensions(this); type = scope.createArrayType(type, this.dimensions); } - if (hasGenericError) - return type; return this.resolvedType = type; } // if missing generic type, and compliance >= 1.5, then will rebuild a parameterized binding } else if (argLength != typeVariables.length) { // check arity scope.problemReporter().incorrectArityForParameterizedType(this, currentType, argTypes); + createArrayType(scope); return null; } else if (!currentType.isStatic()) { ReferenceBinding actualEnclosing = currentType.enclosingType(); if (actualEnclosing != null && actualEnclosing.isRawType()){ scope.problemReporter().rawMemberTypeCannotBeParameterized( this, scope.environment().createRawType(currentOriginal, actualEnclosing), argTypes); + createArrayType(scope); return null; } } ParameterizedTypeBinding parameterizedType = scope.environment().createParameterizedType(currentOriginal, argTypes, enclosingType); // check argument type compatibility - if (checkBounds) // otherwise will do it in Scope.connectTypeVariables() or generic method resolution + if (checkBounds) {// otherwise will do it in Scope.connectTypeVariables() or generic method resolution parameterizedType.boundCheck(scope, this.typeArguments); - else + } else { scope.deferBoundCheck(this); - if (isTypeUseDeprecated(parameterizedType, scope)) + } + if (isTypeUseDeprecated(parameterizedType, scope)) { reportDeprecatedType(parameterizedType, scope); + } TypeBinding type = parameterizedType; // array type ? @@ -245,11 +250,16 @@ scope.problemReporter().tooManyDimensions(this); type = scope.createArrayType(type, this.dimensions); } - if (hasGenericError) { - return type; - } return this.resolvedType = type; } + private void createArrayType(Scope scope) { + if (this.dimensions > 0) { + if (this.dimensions > 255) { + scope.problemReporter().tooManyDimensions(this); + } + this.resolvedType = scope.createArrayType(this.resolvedType, this.dimensions); + } + } public StringBuffer printExpression(int indent, StringBuffer output){ output.append(this.token); Index: dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java,v retrieving revision 1.173 diff -u -r1.173 DefaultBindingResolver.java --- dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java 13 Apr 2011 14:10:29 -0000 1.173 +++ dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java 14 Apr 2011 15:55:49 -0000 @@ -1523,11 +1523,8 @@ return null; } ArrayType arrayType = (ArrayType) type; - if (typeBinding.isArrayType()) { - ArrayBinding arrayBinding = (ArrayBinding) typeBinding; - return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, arrayType.getDimensions())); - } - return getTypeBinding(this.scope.createArrayType(typeBinding, arrayType.getDimensions())); + ArrayBinding arrayBinding = (ArrayBinding) typeBinding; + return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, arrayType.getDimensions())); } if (typeBinding.isArrayType()) { typeBinding = ((ArrayBinding) typeBinding).leafComponentType; @@ -1567,11 +1564,8 @@ if (this.scope == null) { return null; } - if (binding.isArrayType()) { - ArrayBinding arrayBinding = (ArrayBinding) binding; - return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, arrayType.getDimensions())); - } - return getTypeBinding(this.scope.createArrayType(binding, arrayType.getDimensions())); + ArrayBinding arrayBinding = (ArrayBinding) binding; + return getTypeBinding(this.scope.createArrayType(arrayBinding.leafComponentType, arrayType.getDimensions())); } else if (binding.isArrayType()) { ArrayBinding arrayBinding = (ArrayBinding) binding; return getTypeBinding(arrayBinding.leafComponentType);