completeRecord((ArrayType) type, typeReference);
}
}
} else {
if (typeReference instanceof ParameterizedQualifiedTypeReference) {
ParameterizedQualifiedTypeReference parameterizedQualifiedTypeReference = (ParameterizedQualifiedTypeReference) typeReference;
char[][] tokens = parameterizedQualifiedTypeReference.tokens;
TypeReference[][] typeArguments = parameterizedQualifiedTypeReference.typeArguments;
long[] positions = parameterizedQualifiedTypeReference.sourcePositions;
sourceStart = (int)(positions[0]>>>32);
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);
type = simpleType;
}
break;
default :
if (typeArguments != null) {
int numberOfEnclosingType = 0;
int startingIndex = 0;
int endingIndex = 0;
for (int i = 0, max = typeArguments.length; i < max; i++) {
if (typeArguments[i] != null) {
numberOfEnclosingType++;
} else if (numberOfEnclosingType == 0) {
endingIndex++;
}
}
Name name = null;
if (endingIndex - startingIndex == 0) {
final SimpleName simpleName = new SimpleName(this.ast);
simpleName.internalSetIdentifier(new String(tokens[startingIndex]));
recordPendingNameScopeResolution(simpleName);
int start = (int)(positions[startingIndex]>>>32);
int end = (int) positions[startingIndex];
simpleName.setSourceRange(start, end - start + 1);
simpleName.index = 1;
name = simpleName;
if (this.resolveBindings) {
recordNodes(simpleName, typeReference);
}
} else {
name = this.setQualifiedNameNameAndSourceRanges(tokens, positions, endingIndex, typeReference);
}
SimpleType simpleType = new SimpleType(this.ast);
simpleType.setName(name);
int start = (int)(positions[startingIndex]>>>32);
int end = (int) positions[endingIndex];
simpleType.setSourceRange(start, end - start + 1);
ParameterizedType parameterizedType = new ParameterizedType(this.ast);
parameterizedType.setType(simpleType);
if (this.resolveBindings) {
recordNodes(simpleType, typeReference);
recordNodes(parameterizedType, typeReference);
}
start = simpleType.getStartPosition();
end = start + simpleType.getLength() - 1;
for (int i = 0, max = typeArguments[endingIndex].length; i < max; i++) {
final Type type2 = convertType(typeArguments[endingIndex][i]);
parameterizedType.typeArguments().add(type2);
end = type2.getStartPosition() + type2.getLength() - 1;
}
int indexOfEnclosingType = 1;
parameterizedType.index = indexOfEnclosingType;
end = retrieveClosingAngleBracketPosition(end + 1);
length = end + 1;
parameterizedType.setSourceRange(start, end - start + 1);
startingIndex = endingIndex + 1;
Type currentType = parameterizedType;
while(startingIndex < typeArguments.length) {
SimpleName simpleName = new SimpleName(this.ast);
simpleName.internalSetIdentifier(new String(tokens[startingIndex]));
simpleName.index = startingIndex + 1;
start = (int)(positions[startingIndex]>>>32);
end = (int) positions[startingIndex];
simpleName.setSourceRange(start, end - start + 1);
recordPendingNameScopeResolution(simpleName);
QualifiedType qualifiedType = new QualifiedType(this.ast);
qualifiedType.setQualifier(currentType);
qualifiedType.setName(simpleName);
if (this.resolveBindings) {
recordNodes(simpleName, typeReference);
recordNodes(qualifiedType, typeReference);
}
start = currentType.getStartPosition();
end = simpleName.getStartPosition() + simpleName.getLength() - 1;
qualifiedType.setSourceRange(start, end - start + 1);
indexOfEnclosingType++;
if (typeArguments[startingIndex] != null) {
qualifiedType.index = indexOfEnclosingType;
ParameterizedType parameterizedType2 = new ParameterizedType(this.ast);
parameterizedType2.setType(qualifiedType);
parameterizedType2.index = indexOfEnclosingType;
if (this.resolveBindings) {
recordNodes(parameterizedType2, typeReference);
}
for (int i = 0, max = typeArguments[startingIndex].length; i < max; i++) {
final Type type2 = convertType(typeArguments[startingIndex][i]);
parameterizedType2.typeArguments().add(type2);
end = type2.getStartPosition() + type2.getLength() - 1;
}
end = retrieveClosingAngleBracketPosition(end + 1);
length = end + 1;
parameterizedType2.setSourceRange(start, end - start + 1);
currentType = parameterizedType2;
} else {
currentType = qualifiedType;
qualifiedType.index = indexOfEnclosingType;
}
startingIndex++;
}
if (this.resolveBindings) {
this.recordNodes(currentType, typeReference);
}
type = currentType;
length -= sourceStart;
}
}
} else if (typeReference instanceof org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference) {
char[][] name = ((org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference) typeReference).getTypeName();
int nameLength = name.length;
long[] positions = ((org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference) typeReference).sourcePositions;
sourceStart = (int)(positions[0]>>>32);
length = (int)(positions[nameLength - 1] & 0xFFFFFFFF) - sourceStart + 1;
final Name qualifiedName = this.setQualifiedNameNameAndSourceRanges(name, positions, typeReference);
final SimpleType simpleType = new SimpleType(this.ast);
simpleType.setName(qualifiedName);
type = simpleType;
type.setSourceRange(sourceStart, length);
} else {
TypeReference[] typeReferences = ((org.eclipse.jdt.internal.compiler.ast.UnionTypeReference) typeReference).typeReferences;
switch(this.ast.apiLevel) {
case AST.JLS2_INTERNAL :
case AST.JLS3 :
// 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);
}
}
length = typeReference.sourceEnd - sourceStart + 1;
if (dimensions != 0) {
type = this.ast.newArrayType(type, dimensions);
if (this.resolveBindings) {
completeRecord((ArrayType) type, typeReference);
}
int end = retrieveEndOfDimensionsPosition(sourceStart+length, this.compilationUnitSourceLength);
if (end != -1) {
type.setSourceRange(sourceStart, end - sourceStart + 1);
} else {
type.setSourceRange(sourceStart, length);
}
ArrayType subarrayType = (ArrayType) type;
int index = dimensions - 1;
while (index > 0) {
subarrayType = (ArrayType) subarrayType.getComponentType();
end = retrieveProperRightBracketPosition(index, sourceStart);
subarrayType.setSourceRange(sourceStart, end - sourceStart + 1);
index--;
}
}
}
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;
}