completeRecord((ArrayType) type, typeReference);
}
}
} else {
if (typeReference instanceof ParameterizedQualifiedTypeReference) {
ParameterizedQualifiedTypeReference parameterizedQualifiedTypeReference = (ParameterizedQualifiedTypeReference) typeReference;
char[][] tokens = parameterizedQualifiedTypeReference.tokens;
TypeReference[][] typeArguments = parameterizedQualifiedTypeReference.typeArguments;
org.eclipse.jdt.internal.compiler.ast.Annotation[][] typeAnnotations = parameterizedQualifiedTypeReference.annotations;
TypeReference[] arguments = null;
int lenth = tokens.length;
int firstTypeIndex = lenth - 1;
long[] positions = parameterizedQualifiedTypeReference.sourcePositions;
switch(this.ast.apiLevel) {
case AST.JLS2_INTERNAL : {
char[][] name = ((org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference) typeReference).getTypeName();
int nameLength = name.length;
sourceStart = (int)(positions[0]>>>32);
length = (int)(positions[nameLength - 1] & 0xFFFFFFFF) - sourceStart + 1;
Name qualifiedName = this.setQualifiedNameNameAndSourceRanges(name, positions, typeReference);
final SimpleType simpleType = new SimpleType(this.ast);
simpleType.setName(qualifiedName);
simpleType.setSourceRange(sourceStart, length);
simpleType.setFlags(simpleType.getFlags() | ASTNode.MALFORMED);
type = simpleType;
}
break;
default :
boolean isTypeArgumentBased = false;
for (int i = 0; i < lenth; ++i) {
if (typeArguments != null && typeArguments[i] != null) {
firstTypeIndex = i;
isTypeArgumentBased = true;
break;
}
if (typeAnnotations != null && typeAnnotations[i] != null) {
firstTypeIndex = i;
isTypeArgumentBased = false;
break;
}
}
int start = (int) (positions[0] >>> 32);
int end = (int) positions[firstTypeIndex];
Type currentType = createBaseType(typeReference, positions, typeAnnotations, tokens, lenth, firstTypeIndex, isTypeArgumentBased);
int indexOfEnclosingType = 1;
if (typeArguments != null && (arguments = typeArguments[firstTypeIndex]) != null) {
int arglen = arguments.length;
ParameterizedType parameterizedType = new ParameterizedType(this.ast);
parameterizedType.index = indexOfEnclosingType;
parameterizedType.setType(currentType);
if (this.resolveBindings) {
recordNodes(parameterizedType, typeReference);
}
Type type2 = null;
for (int i = 0; i < arglen; ++i ) {
type2 = convertType(arguments[i]);
parameterizedType.typeArguments().add(type2);
}
end = type2 != null ? type2.getStartPosition() + type2.getLength() - 1 : end;
end = retrieveClosingAngleBracketPosition(end + 1);
int baseStart = currentType.getStartPosition();
start = start <= baseStart ? start : baseStart;
parameterizedType.setSourceRange(start, end - start + 1);
currentType = parameterizedType;
}
for (int i = firstTypeIndex + 1; i < lenth; ++i) {
SimpleName simpleName = new SimpleName(this.ast);
simpleName.setIdentifier(new String(tokens[i]));
simpleName.index = i + 1;
start = (int) (positions[i] >>> 32);
end = (int) positions[i];
simpleName.setSourceRange(start, end - start + 1);
recordPendingNameScopeResolution(simpleName);
QualifiedType qualifiedType = new QualifiedType(this.ast);
qualifiedType.setQualifier(currentType);
qualifiedType.setName(simpleName);
start = currentType.getStartPosition();
end = simpleName.getStartPosition() + simpleName.getLength() - 1;
qualifiedType.setSourceRange(start, end - start + 1);
if (typeAnnotations != null && (annotations = typeAnnotations[i]) != null) {
int nextPosition = annotateType(qualifiedType, annotations);
if (simpleName.getStartPosition() < nextPosition && nextPosition <= end) {
simpleName.setSourceRange(nextPosition, end - nextPosition + 1);
trimWhiteSpacesAndComments(simpleName);
}
}
if (this.resolveBindings) {
recordNodes(simpleName, typeReference);
recordNodes(qualifiedType, typeReference);
}
currentType = qualifiedType;
indexOfEnclosingType++;
if (typeArguments != null && (arguments = typeArguments[i]) != null) {
int arglen = arguments.length;
qualifiedType.index = indexOfEnclosingType;
ParameterizedType parameterizedType = new ParameterizedType(this.ast);
parameterizedType.index = indexOfEnclosingType;
parameterizedType.setType(currentType);
if (this.resolveBindings) {
recordNodes(parameterizedType, typeReference);
}
Type type2 = null;
for (int j = 0; j < arglen; ++j ) {
type2 = convertType(arguments[j]);
parameterizedType.typeArguments().add(type2);
}
end = type2 != null ? type2.getStartPosition() + type2.getLength() - 1 : end;
end = retrieveClosingAngleBracketPosition(end + 1);
parameterizedType.setSourceRange(start, end - start + 1);
currentType = parameterizedType;
} else {
qualifiedType.index = indexOfEnclosingType;
}
}
type = currentType;
}
} else if (typeReference instanceof org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference) {
QualifiedTypeReference qualifiedTypeReference = (QualifiedTypeReference) typeReference;
long[] positions = ((org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference) typeReference).sourcePositions;
org.eclipse.jdt.internal.compiler.ast.Annotation [][] typeAnnotations = typeReference.annotations;
char [][] tokens = qualifiedTypeReference.tokens;
int lenth = tokens.length;
int firstTypeIndex = lenth;
if (typeAnnotations != null) {
for (int i = 0; i < lenth; ++i) {
if (typeAnnotations[i] != null) {
firstTypeIndex = i;
break;
}
}
}
Type currentType = createBaseType(typeReference, positions, typeAnnotations, tokens, lenth, firstTypeIndex, false);
for (int i = firstTypeIndex + 1; i < lenth; ++i) {
currentType = createQualifiedType(typeReference, positions, typeAnnotations, tokens, i, currentType);
}
type = currentType;
} else if (typeReference instanceof UnionTypeReference){
TypeReference[] typeReferences = ((org.eclipse.jdt.internal.compiler.ast.UnionTypeReference) typeReference).typeReferences;
switch(this.ast.apiLevel) {
case AST.JLS2_INTERNAL :
case AST.JLS3_INTERNAL :
// recovery
type = this.convertType(typeReferences[0]);
int start = typeReference.sourceStart;
int endPosition = typeReference.sourceEnd;
length = endPosition - start + 1;
type.setSourceRange(start, length);
type.setFlags(type.getFlags() | ASTNode.MALFORMED);
break;
default:
// union type reference
final UnionType unionType = new UnionType(this.ast);
for (int i = 0, max = typeReferences.length; i < max; i++) {
unionType.types().add(this.convertType(typeReferences[i]));
}
type = unionType;
List types = unionType.types();
int size = types.size();
start = ((Type) types.get(0)).getStartPosition();
Type lastType = (Type) types.get(size - 1);
endPosition = lastType.getStartPosition() + lastType.getLength();
length = endPosition - start; /* + 1 - 1 == 0 */
type.setSourceRange(start, length);
}
} else if (typeReference instanceof IntersectionCastTypeReference) {
TypeReference[] typeReferences = ((IntersectionCastTypeReference) typeReference).typeReferences;
switch(this.ast.apiLevel) {
case AST.JLS2_INTERNAL :
case AST.JLS3_INTERNAL :
case AST.JLS4_INTERNAL :
type = this.convertType(typeReferences[0]);
int start = typeReference.sourceStart;
int endPosition = typeReference.sourceEnd;
length = endPosition - start + 1;
type.setSourceRange(start, length);
type.setFlags(type.getFlags() | ASTNode.MALFORMED);
break;
default:
// intersection type reference
final IntersectionType castType = new IntersectionType(this.ast);
for (int i = 0, max = typeReferences.length; i < max; i++) {
castType.types().add(this.convertType(typeReferences[i]));
}
type = castType;
List types = castType.types();
int size = types.size();
start = ((Type) types.get(0)).getStartPosition();
Type lastType = (Type) types.get(size - 1);
endPosition = lastType.getStartPosition() + lastType.getLength();
length = endPosition - start;
type.setSourceRange(start, length);
}
}
length = typeReference.sourceEnd - sourceStart + 1;
if (dimensions != 0) {
type = convertToArray(type, sourceStart, length, dimensions, typeReference.getAnnotationsOnDimensions(true));
if (this.resolveBindings) {
completeRecord((ArrayType) type, typeReference);
}
}
}
if (this.resolveBindings) {
this.recordNodes(type, typeReference);
}
boolean sawDiamond = false;
if (typeReference instanceof ParameterizedSingleTypeReference) {
ParameterizedSingleTypeReference pstr = (ParameterizedSingleTypeReference) typeReference;
if (pstr.typeArguments == TypeReference.NO_TYPE_ARGUMENTS) {
sawDiamond = true;
}
} else if (typeReference instanceof ParameterizedQualifiedTypeReference) {
ParameterizedQualifiedTypeReference pqtr = (ParameterizedQualifiedTypeReference) typeReference;
for (int i = 0, len = pqtr.typeArguments.length; i < len; i++) {
if (pqtr.typeArguments[i] == TypeReference.NO_TYPE_ARGUMENTS) {
sawDiamond = true;
break;
}