Example usage for org.eclipse.jdt.internal.compiler.ast TypeReference dimensions

List of usage examples for org.eclipse.jdt.internal.compiler.ast TypeReference dimensions

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.ast TypeReference dimensions.

Prototype

public int dimensions() 

Source Link

Usage

From source file:com.codenvy.ide.ext.java.server.internal.core.search.matching.MatchLocator.java

License:Open Source License

/**
 * Creates an IMethod from the given method declaration and type.
 *///from ww  w .j  a v a  2s  .c o  m
protected IJavaElement createHandle(AbstractMethodDeclaration method, IJavaElement parent) {
    if (!(parent instanceof IType))
        return parent;

    IType type = (IType) parent;
    Argument[] arguments = method.arguments;
    int argCount = arguments == null ? 0 : arguments.length;
    if (type.isBinary()) {
        // don't cache the methods of the binary type
        // fall thru if its a constructor with a synthetic argument... find it the slower way
        ClassFileReader reader = classFileReader(type);
        if (reader != null) {
            // build arguments names
            boolean firstIsSynthetic = false;
            if (reader.isMember() && method.isConstructor() && !Flags.isStatic(reader.getModifiers())) { // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=48261
                firstIsSynthetic = true;
                argCount++;
            }
            char[][] argumentTypeNames = new char[argCount][];
            for (int i = 0; i < argCount; i++) {
                char[] typeName = null;
                if (i == 0 && firstIsSynthetic) {
                    typeName = type.getDeclaringType().getFullyQualifiedName().toCharArray();
                } else if (arguments != null) {
                    TypeReference typeRef = arguments[firstIsSynthetic ? i - 1 : i].type;
                    typeName = CharOperation.concatWith(typeRef.getTypeName(), '.');
                    for (int k = 0, dim = typeRef.dimensions(); k < dim; k++)
                        typeName = CharOperation.concat(typeName, new char[] { '[', ']' });
                }
                if (typeName == null) {
                    // invalid type name
                    return null;
                }
                argumentTypeNames[i] = typeName;
            }
            // return binary method
            IMethod binaryMethod = createBinaryMethodHandle(type, method.selector, argumentTypeNames);
            if (binaryMethod == null) {
                // when first attempt fails, try with similar matches if any...
                PossibleMatch similarMatch = this.currentPossibleMatch.getSimilarMatch();
                while (similarMatch != null) {
                    type = ((ClassFile) similarMatch.openable).getType();
                    binaryMethod = createBinaryMethodHandle(type, method.selector, argumentTypeNames);
                    if (binaryMethod != null) {
                        return binaryMethod;
                    }
                    similarMatch = similarMatch.getSimilarMatch();
                }
            }
            return binaryMethod;
        }
        if (BasicSearchEngine.VERBOSE) {
            System.out.println("Not able to createHandle for the method " + //$NON-NLS-1$
                    CharOperation.charToString(method.selector) + " May miss some results"); //$NON-NLS-1$
        }
        return null;
    }

    String[] parameterTypeSignatures = new String[argCount];
    if (arguments != null) {
        for (int i = 0; i < argCount; i++) {
            TypeReference typeRef = arguments[i].type;
            char[] typeName = CharOperation.concatWith(typeRef.getParameterizedTypeName(), '.');
            parameterTypeSignatures[i] = Signature.createTypeSignature(typeName, false);
        }
    }

    return createMethodHandle(type, new String(method.selector), parameterTypeSignatures);
}

From source file:com.codenvy.ide.ext.java.server.internal.core.search.matching.PatternLocator.java

License:Open Source License

/**
 * Returns whether the given type reference matches the given pattern.
 *//*from   w  w  w . j a  v  a2s . c  o  m*/
protected boolean matchesTypeReference(char[] pattern, TypeReference type) {
    if (pattern == null)
        return true; // null is as if it was "*"
    if (type == null)
        return true; // treat as an inexact match

    char[][] compoundName = type.getTypeName();
    char[] simpleName = compoundName[compoundName.length - 1];
    int dimensions = type.dimensions() * 2;
    if (dimensions > 0) {
        int length = simpleName.length;
        char[] result = new char[length + dimensions];
        System.arraycopy(simpleName, 0, result, 0, length);
        for (int i = length, l = result.length; i < l;) {
            result[i++] = '[';
            result[i++] = ']';
        }
        simpleName = result;
    }

    return matchesName(pattern, simpleName);
}

From source file:lombok.ast.ecj.EcjTreeConverter.java

License:Open Source License

private lombok.ast.VariableDefinition createVariableDefinition(List<AbstractVariableDeclaration> decls,
        Map<FlagKey, Object> params) {
    int dims = Integer.MAX_VALUE;
    TypeReference winner = null;/*from   ww  w.java 2 s.c  o m*/
    for (AbstractVariableDeclaration decl : decls) {
        TypeReference tr = decl.type;
        int newDims = tr.dimensions();
        if (newDims < dims) {
            dims = newDims;
            winner = tr;
        }
        if (dims == 0)
            break;
    }

    AbstractVariableDeclaration first = decls.get(0);
    lombok.ast.VariableDefinition varDef = new lombok.ast.VariableDefinition();
    varDef.astModifiers(toModifiers(first.modifiers, first.annotations, first.modifiersSourceStart,
            first.declarationSourceStart));
    varDef.astTypeReference((lombok.ast.TypeReference) toTree(winner));
    if ((first.type.bits & ASTNode.IsVarArgs) != 0) {
        varDef.astVarargs(true);
        setConversionPositionInfo(varDef, "typeref", toPosition(first.type.sourceStart, first.type.sourceEnd));
    }

    for (AbstractVariableDeclaration decl : decls) {
        lombok.ast.VariableDefinitionEntry varDefEntry = new lombok.ast.VariableDefinitionEntry();
        varDefEntry.setNativeNode(decl);
        if (first instanceof FieldDeclaration) {
            setConversionPositionInfo(varDefEntry, "varDeclPart1",
                    toPosition(decl.sourceStart, ((FieldDeclaration) decl).endPart1Position));
            setConversionPositionInfo(varDefEntry, "varDeclPart2",
                    toPosition(decl.sourceStart, ((FieldDeclaration) decl).endPart2Position));
        }
        setConversionPositionInfo(varDefEntry, "declarationSource",
                toPosition(decl.declarationSourceStart, decl.declarationSourceEnd));
        setConversionPositionInfo(varDefEntry, "typeSourcePos",
                toPosition(decl.type.sourceStart, decl.type.sourceEnd));
        varDefEntry.astInitializer((lombok.ast.Expression) toTree(decl.initialization));
        varDefEntry.astName(toIdentifier(decl.name, decl.sourceStart, decl.sourceEnd));
        int delta = decl.type.dimensions() - winner.dimensions();
        varDefEntry.astArrayDimensions(delta);
        varDef.astVariables().addToEnd(varDefEntry);
    }
    return varDef;
}

From source file:lombok.eclipse.Eclipse.java

License:Open Source License

/**
 * Checks if the given type reference represents a primitive type.
 */// ww w.  ja  v a  2 s .  co  m
public static boolean isPrimitive(TypeReference ref) {
    if (ref.dimensions() > 0)
        return false;
    return PRIMITIVE_TYPE_NAME_PATTERN.matcher(toQualifiedName(ref.getTypeName())).matches();
}

From source file:lombok.eclipse.handlers.EclipseHandlerUtil.java

License:Open Source License

public static boolean isBoolean(TypeReference typeReference) {
    return nameEquals(typeReference.getTypeName(), "boolean") && typeReference.dimensions() == 0;
}

From source file:lombok.eclipse.handlers.HandleEqualsAndHashCode.java

License:Open Source License

public MethodDeclaration createHashCode(EclipseNode type, Collection<EclipseNode> fields, boolean callSuper,
        ASTNode source, FieldAccess fieldAccess) {
    int pS = source.sourceStart, pE = source.sourceEnd;
    long p = (long) pS << 32 | pE;

    MethodDeclaration method = new MethodDeclaration(
            ((CompilationUnitDeclaration) type.top().get()).compilationResult);
    setGeneratedBy(method, source);//  w  w w  . j  av  a 2  s . c o m

    method.modifiers = toEclipseModifier(AccessLevel.PUBLIC);
    method.returnType = TypeReference.baseTypeReference(TypeIds.T_int, 0);
    setGeneratedBy(method.returnType, source);
    method.annotations = new Annotation[] { makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source) };
    method.selector = "hashCode".toCharArray();
    method.thrownExceptions = null;
    method.typeParameters = null;
    method.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;
    method.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;
    method.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;
    method.arguments = null;

    List<Statement> statements = new ArrayList<Statement>();

    final boolean isEmpty = fields.isEmpty();

    /* final int PRIME = X; */ {
        /* Without fields, PRIME isn't used, and that would trigger a 'local variable not used' warning. */
        if (!isEmpty || callSuper) {
            LocalDeclaration primeDecl = new LocalDeclaration(PRIME, pS, pE);
            setGeneratedBy(primeDecl, source);
            primeDecl.modifiers |= Modifier.FINAL;
            primeDecl.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);
            primeDecl.type.sourceStart = pS;
            primeDecl.type.sourceEnd = pE;
            setGeneratedBy(primeDecl.type, source);
            primeDecl.initialization = makeIntLiteral(
                    String.valueOf(HandlerUtil.primeForHashcode()).toCharArray(), source);
            statements.add(primeDecl);
        }
    }

    /* int result = 1; */ {
        LocalDeclaration resultDecl = new LocalDeclaration(RESULT, pS, pE);
        setGeneratedBy(resultDecl, source);
        resultDecl.initialization = makeIntLiteral("1".toCharArray(), source);
        resultDecl.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);
        resultDecl.type.sourceStart = pS;
        resultDecl.type.sourceEnd = pE;
        setGeneratedBy(resultDecl.type, source);
        statements.add(resultDecl);
    }

    if (callSuper) {
        MessageSend callToSuper = new MessageSend();
        setGeneratedBy(callToSuper, source);
        callToSuper.sourceStart = pS;
        callToSuper.sourceEnd = pE;
        callToSuper.receiver = new SuperReference(pS, pE);
        setGeneratedBy(callToSuper.receiver, source);
        callToSuper.selector = "hashCode".toCharArray();
        statements.add(createResultCalculation(source, callToSuper));
    }

    for (EclipseNode field : fields) {
        TypeReference fType = getFieldType(field, fieldAccess);
        char[] dollarFieldName = ("$" + field.getName()).toCharArray();
        char[] token = fType.getLastToken();
        Expression fieldAccessor = createFieldAccessor(field, fieldAccess, source);
        if (fType.dimensions() == 0 && token != null) {
            if (Arrays.equals(TypeConstants.BOOLEAN, token)) {
                /* booleanField ? X : Y */
                IntLiteral intTrue = makeIntLiteral(String.valueOf(HandlerUtil.primeForTrue()).toCharArray(),
                        source);
                IntLiteral intFalse = makeIntLiteral(String.valueOf(HandlerUtil.primeForFalse()).toCharArray(),
                        source);
                ConditionalExpression intForBool = new ConditionalExpression(fieldAccessor, intTrue, intFalse);
                setGeneratedBy(intForBool, source);
                statements.add(createResultCalculation(source, intForBool));
            } else if (Arrays.equals(TypeConstants.LONG, token)) {
                statements.add(createLocalDeclaration(source, dollarFieldName,
                        TypeReference.baseTypeReference(TypeIds.T_long, 0), fieldAccessor));
                SingleNameReference copy1 = new SingleNameReference(dollarFieldName, p);
                setGeneratedBy(copy1, source);
                SingleNameReference copy2 = new SingleNameReference(dollarFieldName, p);
                setGeneratedBy(copy2, source);
                statements.add(createResultCalculation(source, longToIntForHashCode(copy1, copy2, source)));
            } else if (Arrays.equals(TypeConstants.FLOAT, token)) {
                /* Float.floatToIntBits(fieldName) */
                MessageSend floatToIntBits = new MessageSend();
                floatToIntBits.sourceStart = pS;
                floatToIntBits.sourceEnd = pE;
                setGeneratedBy(floatToIntBits, source);
                floatToIntBits.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA_LANG_FLOAT);
                floatToIntBits.selector = "floatToIntBits".toCharArray();
                floatToIntBits.arguments = new Expression[] { fieldAccessor };
                statements.add(createResultCalculation(source, floatToIntBits));
            } else if (Arrays.equals(TypeConstants.DOUBLE, token)) {
                /* longToIntForHashCode(Double.doubleToLongBits(fieldName)) */
                MessageSend doubleToLongBits = new MessageSend();
                doubleToLongBits.sourceStart = pS;
                doubleToLongBits.sourceEnd = pE;
                setGeneratedBy(doubleToLongBits, source);
                doubleToLongBits.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA_LANG_DOUBLE);
                doubleToLongBits.selector = "doubleToLongBits".toCharArray();
                doubleToLongBits.arguments = new Expression[] { fieldAccessor };
                statements.add(createLocalDeclaration(source, dollarFieldName,
                        TypeReference.baseTypeReference(TypeIds.T_long, 0), doubleToLongBits));
                SingleNameReference copy1 = new SingleNameReference(dollarFieldName, p);
                setGeneratedBy(copy1, source);
                SingleNameReference copy2 = new SingleNameReference(dollarFieldName, p);
                setGeneratedBy(copy2, source);
                statements.add(createResultCalculation(source, longToIntForHashCode(copy1, copy2, source)));
            } else if (BUILT_IN_TYPES.contains(new String(token))) {
                statements.add(createResultCalculation(source, fieldAccessor));
            } else /* objects */ {
                /* final java.lang.Object $fieldName = this.fieldName; */
                /* $fieldName == null ? NULL_PRIME : $fieldName.hashCode() */
                statements.add(createLocalDeclaration(source, dollarFieldName,
                        generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), fieldAccessor));

                SingleNameReference copy1 = new SingleNameReference(dollarFieldName, p);
                setGeneratedBy(copy1, source);
                SingleNameReference copy2 = new SingleNameReference(dollarFieldName, p);
                setGeneratedBy(copy2, source);

                MessageSend hashCodeCall = new MessageSend();
                hashCodeCall.sourceStart = pS;
                hashCodeCall.sourceEnd = pE;
                setGeneratedBy(hashCodeCall, source);
                hashCodeCall.receiver = copy1;
                hashCodeCall.selector = "hashCode".toCharArray();
                NullLiteral nullLiteral = new NullLiteral(pS, pE);
                setGeneratedBy(nullLiteral, source);
                EqualExpression objIsNull = new EqualExpression(copy2, nullLiteral, OperatorIds.EQUAL_EQUAL);
                setGeneratedBy(objIsNull, source);
                IntLiteral intMagic = makeIntLiteral(String.valueOf(HandlerUtil.primeForNull()).toCharArray(),
                        source);
                ConditionalExpression nullOrHashCode = new ConditionalExpression(objIsNull, intMagic,
                        hashCodeCall);
                nullOrHashCode.sourceStart = pS;
                nullOrHashCode.sourceEnd = pE;
                setGeneratedBy(nullOrHashCode, source);
                statements.add(createResultCalculation(source, nullOrHashCode));
            }
        } else if (fType.dimensions() > 0 && token != null) {
            /* Arrays.deepHashCode(array)  //just hashCode for simple arrays */
            MessageSend arraysHashCodeCall = new MessageSend();
            arraysHashCodeCall.sourceStart = pS;
            arraysHashCodeCall.sourceEnd = pE;
            setGeneratedBy(arraysHashCodeCall, source);
            arraysHashCodeCall.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA,
                    TypeConstants.UTIL, "Arrays".toCharArray());
            if (fType.dimensions() > 1 || !BUILT_IN_TYPES.contains(new String(token))) {
                arraysHashCodeCall.selector = "deepHashCode".toCharArray();
            } else {
                arraysHashCodeCall.selector = "hashCode".toCharArray();
            }
            arraysHashCodeCall.arguments = new Expression[] { fieldAccessor };
            statements.add(createResultCalculation(source, arraysHashCodeCall));
        }
    }

    /* return result; */ {
        SingleNameReference resultRef = new SingleNameReference(RESULT, p);
        setGeneratedBy(resultRef, source);
        ReturnStatement returnStatement = new ReturnStatement(resultRef, pS, pE);
        setGeneratedBy(returnStatement, source);
        statements.add(returnStatement);
    }
    method.statements = statements.toArray(new Statement[statements.size()]);
    return method;
}

From source file:lombok.eclipse.handlers.HandleEqualsAndHashCode.java

License:Open Source License

public MethodDeclaration createEquals(EclipseNode type, Collection<EclipseNode> fields, boolean callSuper,
        ASTNode source, FieldAccess fieldAccess, boolean needsCanEqual, List<Annotation> onParam) {
    int pS = source.sourceStart;
    int pE = source.sourceEnd;
    long p = (long) pS << 32 | pE;
    TypeDeclaration typeDecl = (TypeDeclaration) type.get();

    MethodDeclaration method = new MethodDeclaration(
            ((CompilationUnitDeclaration) type.top().get()).compilationResult);
    setGeneratedBy(method, source);//from   w ww . jav  a2s  . c  o  m
    method.modifiers = toEclipseModifier(AccessLevel.PUBLIC);
    method.returnType = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);
    method.returnType.sourceStart = pS;
    method.returnType.sourceEnd = pE;
    setGeneratedBy(method.returnType, source);
    method.annotations = new Annotation[] { makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source) };
    method.selector = "equals".toCharArray();
    method.thrownExceptions = null;
    method.typeParameters = null;
    method.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;
    method.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;
    method.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;
    TypeReference objectRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT,
            new long[] { p, p, p });
    setGeneratedBy(objectRef, source);
    method.arguments = new Argument[] { new Argument(new char[] { 'o' }, 0, objectRef, Modifier.FINAL) };
    method.arguments[0].sourceStart = pS;
    method.arguments[0].sourceEnd = pE;
    if (!onParam.isEmpty())
        method.arguments[0].annotations = onParam.toArray(new Annotation[0]);
    setGeneratedBy(method.arguments[0], source);

    List<Statement> statements = new ArrayList<Statement>();

    /* if (o == this) return true; */ {
        SingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
        setGeneratedBy(oRef, source);
        ThisReference thisRef = new ThisReference(pS, pE);
        setGeneratedBy(thisRef, source);
        EqualExpression otherEqualsThis = new EqualExpression(oRef, thisRef, OperatorIds.EQUAL_EQUAL);
        setGeneratedBy(otherEqualsThis, source);

        TrueLiteral trueLiteral = new TrueLiteral(pS, pE);
        setGeneratedBy(trueLiteral, source);
        ReturnStatement returnTrue = new ReturnStatement(trueLiteral, pS, pE);
        setGeneratedBy(returnTrue, source);
        IfStatement ifOtherEqualsThis = new IfStatement(otherEqualsThis, returnTrue, pS, pE);
        setGeneratedBy(ifOtherEqualsThis, source);
        statements.add(ifOtherEqualsThis);
    }

    /* if (!(o instanceof Outer.Inner.MyType) return false; */ {
        SingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
        setGeneratedBy(oRef, source);

        TypeReference typeReference = createTypeReference(type, p);
        setGeneratedBy(typeReference, source);

        InstanceOfExpression instanceOf = new InstanceOfExpression(oRef, typeReference);
        instanceOf.sourceStart = pS;
        instanceOf.sourceEnd = pE;
        setGeneratedBy(instanceOf, source);

        Expression notInstanceOf = new UnaryExpression(instanceOf, OperatorIds.NOT);
        setGeneratedBy(notInstanceOf, source);

        FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
        setGeneratedBy(falseLiteral, source);

        ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
        setGeneratedBy(returnFalse, source);

        IfStatement ifNotInstanceOf = new IfStatement(notInstanceOf, returnFalse, pS, pE);
        setGeneratedBy(ifNotInstanceOf, source);
        statements.add(ifNotInstanceOf);
    }

    char[] otherName = "other".toCharArray();

    /* MyType<?> other = (MyType<?>) o; */ {
        if (!fields.isEmpty() || needsCanEqual) {
            LocalDeclaration other = new LocalDeclaration(otherName, pS, pE);
            other.modifiers |= ClassFileConstants.AccFinal;
            setGeneratedBy(other, source);
            char[] typeName = typeDecl.name;
            TypeReference targetType;
            if (typeDecl.typeParameters == null || typeDecl.typeParameters.length == 0) {
                targetType = new SingleTypeReference(typeName, p);
                setGeneratedBy(targetType, source);
                other.type = new SingleTypeReference(typeName, p);
                setGeneratedBy(other.type, source);
            } else {
                TypeReference[] typeArgs = new TypeReference[typeDecl.typeParameters.length];
                for (int i = 0; i < typeArgs.length; i++) {
                    typeArgs[i] = new Wildcard(Wildcard.UNBOUND);
                    typeArgs[i].sourceStart = pS;
                    typeArgs[i].sourceEnd = pE;
                    setGeneratedBy(typeArgs[i], source);
                }
                targetType = new ParameterizedSingleTypeReference(typeName, typeArgs, 0, p);
                setGeneratedBy(targetType, source);
                other.type = new ParameterizedSingleTypeReference(typeName, copyTypes(typeArgs, source), 0, p);
                setGeneratedBy(other.type, source);
            }
            NameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
            setGeneratedBy(oRef, source);
            other.initialization = makeCastExpression(oRef, targetType, source);
            statements.add(other);
        }
    }

    /* if (!other.canEqual((java.lang.Object) this)) return false; */ {
        if (needsCanEqual) {
            MessageSend otherCanEqual = new MessageSend();
            otherCanEqual.sourceStart = pS;
            otherCanEqual.sourceEnd = pE;
            setGeneratedBy(otherCanEqual, source);
            otherCanEqual.receiver = new SingleNameReference(otherName, p);
            setGeneratedBy(otherCanEqual.receiver, source);
            otherCanEqual.selector = "canEqual".toCharArray();

            ThisReference thisReference = new ThisReference(pS, pE);
            setGeneratedBy(thisReference, source);
            CastExpression castThisRef = makeCastExpression(thisReference,
                    generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), source);
            castThisRef.sourceStart = pS;
            castThisRef.sourceEnd = pE;

            otherCanEqual.arguments = new Expression[] { castThisRef };

            Expression notOtherCanEqual = new UnaryExpression(otherCanEqual, OperatorIds.NOT);
            setGeneratedBy(notOtherCanEqual, source);

            FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
            setGeneratedBy(falseLiteral, source);

            ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
            setGeneratedBy(returnFalse, source);

            IfStatement ifNotCanEqual = new IfStatement(notOtherCanEqual, returnFalse, pS, pE);
            setGeneratedBy(ifNotCanEqual, source);

            statements.add(ifNotCanEqual);
        }
    }

    /* if (!super.equals(o)) return false; */
    if (callSuper) {
        MessageSend callToSuper = new MessageSend();
        callToSuper.sourceStart = pS;
        callToSuper.sourceEnd = pE;
        setGeneratedBy(callToSuper, source);
        callToSuper.receiver = new SuperReference(pS, pE);
        setGeneratedBy(callToSuper.receiver, source);
        callToSuper.selector = "equals".toCharArray();
        SingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
        setGeneratedBy(oRef, source);
        callToSuper.arguments = new Expression[] { oRef };
        Expression superNotEqual = new UnaryExpression(callToSuper, OperatorIds.NOT);
        setGeneratedBy(superNotEqual, source);
        FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
        setGeneratedBy(falseLiteral, source);
        ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
        setGeneratedBy(returnFalse, source);
        IfStatement ifSuperEquals = new IfStatement(superNotEqual, returnFalse, pS, pE);
        setGeneratedBy(ifSuperEquals, source);
        statements.add(ifSuperEquals);
    }

    for (EclipseNode field : fields) {
        TypeReference fType = getFieldType(field, fieldAccess);
        char[] token = fType.getLastToken();
        Expression thisFieldAccessor = createFieldAccessor(field, fieldAccess, source);
        Expression otherFieldAccessor = createFieldAccessor(field, fieldAccess, source, otherName);

        if (fType.dimensions() == 0 && token != null) {
            if (Arrays.equals(TypeConstants.FLOAT, token)) {
                statements.add(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor,
                        "Float".toCharArray(), source));
            } else if (Arrays.equals(TypeConstants.DOUBLE, token)) {
                statements.add(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor,
                        "Double".toCharArray(), source));
            } else if (BUILT_IN_TYPES.contains(new String(token))) {
                EqualExpression fieldsNotEqual = new EqualExpression(thisFieldAccessor, otherFieldAccessor,
                        OperatorIds.NOT_EQUAL);
                setGeneratedBy(fieldsNotEqual, source);
                FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
                setGeneratedBy(falseLiteral, source);
                ReturnStatement returnStatement = new ReturnStatement(falseLiteral, pS, pE);
                setGeneratedBy(returnStatement, source);
                IfStatement ifStatement = new IfStatement(fieldsNotEqual, returnStatement, pS, pE);
                setGeneratedBy(ifStatement, source);
                statements.add(ifStatement);
            } else /* objects */ {
                /* final java.lang.Object this$fieldName = this.fieldName; */
                /* final java.lang.Object other$fieldName = other.fieldName; */
                /* if (this$fieldName == null ? other$fieldName != null : !this$fieldName.equals(other$fieldName)) return false;; */
                char[] thisDollarFieldName = ("this$" + field.getName()).toCharArray();
                char[] otherDollarFieldName = ("other$" + field.getName()).toCharArray();

                statements.add(createLocalDeclaration(source, thisDollarFieldName,
                        generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), thisFieldAccessor));
                statements.add(createLocalDeclaration(source, otherDollarFieldName,
                        generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), otherFieldAccessor));

                SingleNameReference this1 = new SingleNameReference(thisDollarFieldName, p);
                setGeneratedBy(this1, source);
                SingleNameReference this2 = new SingleNameReference(thisDollarFieldName, p);
                setGeneratedBy(this2, source);
                SingleNameReference other1 = new SingleNameReference(otherDollarFieldName, p);
                setGeneratedBy(other1, source);
                SingleNameReference other2 = new SingleNameReference(otherDollarFieldName, p);
                setGeneratedBy(other2, source);

                NullLiteral nullLiteral = new NullLiteral(pS, pE);
                setGeneratedBy(nullLiteral, source);
                EqualExpression fieldIsNull = new EqualExpression(this1, nullLiteral, OperatorIds.EQUAL_EQUAL);
                nullLiteral = new NullLiteral(pS, pE);
                setGeneratedBy(nullLiteral, source);
                EqualExpression otherFieldIsntNull = new EqualExpression(other1, nullLiteral,
                        OperatorIds.NOT_EQUAL);
                MessageSend equalsCall = new MessageSend();
                equalsCall.sourceStart = pS;
                equalsCall.sourceEnd = pE;
                setGeneratedBy(equalsCall, source);
                equalsCall.receiver = this2;
                equalsCall.selector = "equals".toCharArray();
                equalsCall.arguments = new Expression[] { other2 };
                UnaryExpression fieldsNotEqual = new UnaryExpression(equalsCall, OperatorIds.NOT);
                fieldsNotEqual.sourceStart = pS;
                fieldsNotEqual.sourceEnd = pE;
                setGeneratedBy(fieldsNotEqual, source);
                ConditionalExpression fullEquals = new ConditionalExpression(fieldIsNull, otherFieldIsntNull,
                        fieldsNotEqual);
                fullEquals.sourceStart = pS;
                fullEquals.sourceEnd = pE;
                setGeneratedBy(fullEquals, source);
                FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
                setGeneratedBy(falseLiteral, source);
                ReturnStatement returnStatement = new ReturnStatement(falseLiteral, pS, pE);
                setGeneratedBy(returnStatement, source);
                IfStatement ifStatement = new IfStatement(fullEquals, returnStatement, pS, pE);
                setGeneratedBy(ifStatement, source);
                statements.add(ifStatement);
            }
        } else if (fType.dimensions() > 0 && token != null) {
            MessageSend arraysEqualCall = new MessageSend();
            arraysEqualCall.sourceStart = pS;
            arraysEqualCall.sourceEnd = pE;
            setGeneratedBy(arraysEqualCall, source);
            arraysEqualCall.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA, TypeConstants.UTIL,
                    "Arrays".toCharArray());
            if (fType.dimensions() > 1 || !BUILT_IN_TYPES.contains(new String(token))) {
                arraysEqualCall.selector = "deepEquals".toCharArray();
            } else {
                arraysEqualCall.selector = "equals".toCharArray();
            }
            arraysEqualCall.arguments = new Expression[] { thisFieldAccessor, otherFieldAccessor };
            UnaryExpression arraysNotEqual = new UnaryExpression(arraysEqualCall, OperatorIds.NOT);
            arraysNotEqual.sourceStart = pS;
            arraysNotEqual.sourceEnd = pE;
            setGeneratedBy(arraysNotEqual, source);
            FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
            setGeneratedBy(falseLiteral, source);
            ReturnStatement returnStatement = new ReturnStatement(falseLiteral, pS, pE);
            setGeneratedBy(returnStatement, source);
            IfStatement ifStatement = new IfStatement(arraysNotEqual, returnStatement, pS, pE);
            setGeneratedBy(ifStatement, source);
            statements.add(ifStatement);
        }
    }

    /* return true; */ {
        TrueLiteral trueLiteral = new TrueLiteral(pS, pE);
        setGeneratedBy(trueLiteral, source);
        ReturnStatement returnStatement = new ReturnStatement(trueLiteral, pS, pE);
        setGeneratedBy(returnStatement, source);
        statements.add(returnStatement);
    }
    method.statements = statements.toArray(new Statement[statements.size()]);
    return method;
}

From source file:lombok.eclipse.handlers.HandleToString.java

License:Open Source License

public static MethodDeclaration createToString(EclipseNode type, Collection<EclipseNode> fields,
        boolean includeFieldNames, boolean callSuper, ASTNode source, FieldAccess fieldAccess) {
    String typeName = getTypeName(type);
    char[] suffix = ")".toCharArray();
    String infixS = ", ";
    char[] infix = infixS.toCharArray();
    int pS = source.sourceStart, pE = source.sourceEnd;
    long p = (long) pS << 32 | pE;
    final int PLUS = OperatorIds.PLUS;

    char[] prefix;

    if (callSuper) {
        prefix = (typeName + "(super=").toCharArray();
    } else if (fields.isEmpty()) {
        prefix = (typeName + "()").toCharArray();
    } else if (includeFieldNames) {
        prefix = (typeName + "(" + new String(((FieldDeclaration) fields.iterator().next().get()).name) + "=")
                .toCharArray();//from   www  . j  ava2 s.  c  o  m
    } else {
        prefix = (typeName + "(").toCharArray();
    }

    boolean first = true;
    Expression current = new StringLiteral(prefix, pS, pE, 0);
    setGeneratedBy(current, source);

    if (callSuper) {
        MessageSend callToSuper = new MessageSend();
        callToSuper.sourceStart = pS;
        callToSuper.sourceEnd = pE;
        setGeneratedBy(callToSuper, source);
        callToSuper.receiver = new SuperReference(pS, pE);
        setGeneratedBy(callToSuper, source);
        callToSuper.selector = "toString".toCharArray();
        current = new BinaryExpression(current, callToSuper, PLUS);
        setGeneratedBy(current, source);
        first = false;
    }

    for (EclipseNode field : fields) {
        TypeReference fieldType = getFieldType(field, fieldAccess);
        Expression fieldAccessor = createFieldAccessor(field, fieldAccess, source);

        // The distinction between primitive and object will be useful if we ever add a 'hideNulls' option.
        boolean fieldBaseTypeIsPrimitive = BUILT_IN_TYPES.contains(new String(fieldType.getLastToken()));
        boolean fieldIsPrimitive = fieldType.dimensions() == 0 && fieldBaseTypeIsPrimitive;
        boolean fieldIsPrimitiveArray = fieldType.dimensions() == 1 && fieldBaseTypeIsPrimitive;
        boolean fieldIsObjectArray = fieldType.dimensions() > 0 && !fieldIsPrimitiveArray;
        @SuppressWarnings("unused")
        boolean fieldIsObject = !fieldIsPrimitive && !fieldIsPrimitiveArray && !fieldIsObjectArray;

        Expression ex;
        if (fieldIsPrimitiveArray || fieldIsObjectArray) {
            MessageSend arrayToString = new MessageSend();
            arrayToString.sourceStart = pS;
            arrayToString.sourceEnd = pE;
            arrayToString.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA, TypeConstants.UTIL,
                    "Arrays".toCharArray());
            arrayToString.arguments = new Expression[] { fieldAccessor };
            setGeneratedBy(arrayToString.arguments[0], source);
            arrayToString.selector = (fieldIsObjectArray ? "deepToString" : "toString").toCharArray();
            ex = arrayToString;
        } else {
            ex = fieldAccessor;
        }
        setGeneratedBy(ex, source);

        if (first) {
            current = new BinaryExpression(current, ex, PLUS);
            current.sourceStart = pS;
            current.sourceEnd = pE;
            setGeneratedBy(current, source);
            first = false;
            continue;
        }

        StringLiteral fieldNameLiteral;
        if (includeFieldNames) {
            char[] namePlusEqualsSign = (infixS + field.getName() + "=").toCharArray();
            fieldNameLiteral = new StringLiteral(namePlusEqualsSign, pS, pE, 0);
        } else {
            fieldNameLiteral = new StringLiteral(infix, pS, pE, 0);
        }
        setGeneratedBy(fieldNameLiteral, source);
        current = new BinaryExpression(current, fieldNameLiteral, PLUS);
        setGeneratedBy(current, source);
        current = new BinaryExpression(current, ex, PLUS);
        setGeneratedBy(current, source);
    }
    if (!first) {
        StringLiteral suffixLiteral = new StringLiteral(suffix, pS, pE, 0);
        setGeneratedBy(suffixLiteral, source);
        current = new BinaryExpression(current, suffixLiteral, PLUS);
        setGeneratedBy(current, source);
    }

    ReturnStatement returnStatement = new ReturnStatement(current, pS, pE);
    setGeneratedBy(returnStatement, source);

    MethodDeclaration method = new MethodDeclaration(
            ((CompilationUnitDeclaration) type.top().get()).compilationResult);
    setGeneratedBy(method, source);
    method.modifiers = toEclipseModifier(AccessLevel.PUBLIC);
    method.returnType = new QualifiedTypeReference(TypeConstants.JAVA_LANG_STRING, new long[] { p, p, p });
    setGeneratedBy(method.returnType, source);
    method.annotations = new Annotation[] { makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source) };
    method.arguments = null;
    method.selector = "toString".toCharArray();
    method.thrownExceptions = null;
    method.typeParameters = null;
    method.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;
    method.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;
    method.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;
    method.statements = new Statement[] { returnStatement };
    return method;
}

From source file:lombok.eclipse.handlers.PKG.java

License:Open Source License

static boolean isPrimitive(TypeReference ref) {
    if (ref.dimensions() > 0)
        return false;
    return TransformationsUtil.PRIMITIVE_TYPE_NAME_PATTERN.matcher(Eclipse.toQualifiedName(ref.getTypeName()))
            .matches();/*  w w  w . j a v  a 2  s .  c  o  m*/
}

From source file:org.eclipse.jdt.core.dom.ASTConverter.java

License:Open Source License

public Type convertType(TypeReference typeReference) {
    if (typeReference instanceof Wildcard) {
        final Wildcard wildcard = (Wildcard) typeReference;
        final WildcardType wildcardType = new WildcardType(this.ast);
        if (wildcard.bound != null) {
            final Type bound = convertType(wildcard.bound);
            wildcardType.setBound(bound, wildcard.kind == Wildcard.EXTENDS);
            int start = wildcard.sourceStart;
            wildcardType.setSourceRange(start, bound.getStartPosition() + bound.getLength() - start);
        } else {// w  w w .  j a  v  a  2 s. c o  m
            final int start = wildcard.sourceStart;
            final int end = wildcard.sourceEnd;
            wildcardType.setSourceRange(start, end - start + 1);
        }
        if (this.resolveBindings) {
            recordNodes(wildcardType, typeReference);
        }
        return wildcardType;
    }
    Type type = null;
    int sourceStart = -1;
    int length = 0;
    int dimensions = typeReference.dimensions();
    if (typeReference instanceof org.eclipse.jdt.internal.compiler.ast.SingleTypeReference) {
        // this is either an ArrayTypeReference or a SingleTypeReference
        char[] name = ((org.eclipse.jdt.internal.compiler.ast.SingleTypeReference) typeReference)
                .getTypeName()[0];
        sourceStart = typeReference.sourceStart;
        length = typeReference.sourceEnd - typeReference.sourceStart + 1;
        // need to find out if this is an array type of primitive types or not
        if (isPrimitiveType(name)) {
            int end = retrieveEndOfElementTypeNamePosition(sourceStart, sourceStart + length);
            if (end == -1) {
                end = sourceStart + length - 1;
            }
            final PrimitiveType primitiveType = new PrimitiveType(this.ast);
            primitiveType.setPrimitiveTypeCode(getPrimitiveTypeCode(name));
            primitiveType.setSourceRange(sourceStart, end - sourceStart + 1);
            type = primitiveType;
        } else if (typeReference instanceof ParameterizedSingleTypeReference) {
            ParameterizedSingleTypeReference parameterizedSingleTypeReference = (ParameterizedSingleTypeReference) typeReference;
            final SimpleName simpleName = new SimpleName(this.ast);
            simpleName.internalSetIdentifier(new String(name));
            int end = retrieveEndOfElementTypeNamePosition(sourceStart, sourceStart + length);
            if (end == -1) {
                end = sourceStart + length - 1;
            }
            simpleName.setSourceRange(sourceStart, end - sourceStart + 1);
            switch (this.ast.apiLevel) {
            case AST.JLS2_INTERNAL:
                SimpleType simpleType = new SimpleType(this.ast);
                simpleType.setName(simpleName);
                simpleType.setFlags(simpleType.getFlags() | ASTNode.MALFORMED);
                simpleType.setSourceRange(sourceStart, end - sourceStart + 1);
                type = simpleType;
                if (this.resolveBindings) {
                    this.recordNodes(simpleName, typeReference);
                }
                break;
            default:
                simpleType = new SimpleType(this.ast);
                simpleType.setName(simpleName);
                simpleType.setSourceRange(simpleName.getStartPosition(), simpleName.getLength());
                final ParameterizedType parameterizedType = new ParameterizedType(this.ast);
                parameterizedType.setType(simpleType);
                type = parameterizedType;
                TypeReference[] typeArguments = parameterizedSingleTypeReference.typeArguments;
                if (typeArguments != null) {
                    Type type2 = null;
                    for (int i = 0, max = typeArguments.length; i < max; i++) {
                        type2 = convertType(typeArguments[i]);
                        ((ParameterizedType) type).typeArguments().add(type2);
                        end = type2.getStartPosition() + type2.getLength() - 1;
                    }
                    end = retrieveClosingAngleBracketPosition(end + 1);
                    type.setSourceRange(sourceStart, end - sourceStart + 1);
                } else {
                    type.setSourceRange(sourceStart, end - sourceStart + 1);
                }
                if (this.resolveBindings) {
                    this.recordNodes(simpleName, typeReference);
                    this.recordNodes(simpleType, typeReference);
                }
            }
        } else {
            final SimpleName simpleName = new SimpleName(this.ast);
            simpleName.internalSetIdentifier(new String(name));
            // we need to search for the starting position of the first brace in order to set the proper length
            // PR http://dev.eclipse.org/bugs/show_bug.cgi?id=10759
            int end = retrieveEndOfElementTypeNamePosition(sourceStart, sourceStart + length);
            if (end == -1) {
                end = sourceStart + length - 1;
            }
            simpleName.setSourceRange(sourceStart, end - sourceStart + 1);
            final SimpleType simpleType = new SimpleType(this.ast);
            simpleType.setName(simpleName);
            type = simpleType;
            type.setSourceRange(sourceStart, end - sourceStart + 1);
            type = simpleType;
            if (this.resolveBindings) {
                this.recordNodes(simpleName, typeReference);
            }
        }
        if (dimensions != 0) {
            type = this.ast.newArrayType(type, dimensions);
            type.setSourceRange(sourceStart, length);
            ArrayType subarrayType = (ArrayType) type;
            int index = dimensions - 1;
            while (index > 0) {
                subarrayType = (ArrayType) subarrayType.getComponentType();
                int end = retrieveProperRightBracketPosition(index, sourceStart);
                subarrayType.setSourceRange(sourceStart, end - sourceStart + 1);
                index--;
            }
            if (this.resolveBindings) {
                // store keys for inner types
                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;
            }
        }
    }
    if (sawDiamond) {
        switch (this.ast.apiLevel) {
        case AST.JLS2_INTERNAL:
        case AST.JLS3:
            type.setFlags(type.getFlags() | ASTNode.MALFORMED);
        }
    }
    return type;
}