Example usage for org.eclipse.jdt.internal.compiler.ast QualifiedNameReference fieldBinding

List of usage examples for org.eclipse.jdt.internal.compiler.ast QualifiedNameReference fieldBinding

Introduction

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

Prototype

@Override
public FieldBinding fieldBinding() 

Source Link

Document

Use this method only when sure that the current reference is not a chain of several fields (QualifiedNameReference with more than one field).

Usage

From source file:com.google.gwt.dev.jdt.TypeRefVisitor.java

License:Open Source License

@Override
public void endVisit(QualifiedNameReference x, BlockScope scope) {
    if (x.binding instanceof FieldBinding) {
        maybeDispatch(x, x.fieldBinding().declaringClass);
    }/* w  ww.  j  av a 2  s  . com*/
}

From source file:spoon.support.builder.JDTTreeBuilder.java

License:Open Source License

@SuppressWarnings("unchecked")
@Override// www .j  a  va  2  s .com
public boolean visit(QualifiedNameReference qualifiedNameReference, BlockScope scope) {
    if (qualifiedNameReference.binding instanceof FieldBinding) {
        CtFieldAccess<?> fa = factory.Core().createFieldAccess();
        fa.setVariable(references.getVariableReference(qualifiedNameReference.fieldBinding()));

        if (qualifiedNameReference.otherBindings != null)
            for (FieldBinding b : qualifiedNameReference.otherBindings) {
                if (b != null) {
                    CtFieldAccess other = factory.Core().createFieldAccess();
                    other.setVariable(references.getVariableReference(b));
                    other.setTarget(fa);
                    fa.setParent(other);
                    fa = other;
                }
            }
        context.enter(fa, qualifiedNameReference);
        return true;
    } else if (qualifiedNameReference.binding instanceof VariableBinding) {
        CtVariableAccess va = factory.Core().createVariableAccess();
        va.setVariable(references.getVariableReference((VariableBinding) qualifiedNameReference.binding));
        va.setType(va.getVariable().getType());
        if (qualifiedNameReference.otherBindings != null) {
            for (FieldBinding b : qualifiedNameReference.otherBindings) {
                CtFieldAccess fa = factory.Core().createFieldAccess();
                fa.setTarget(va);
                fa.setVariable(references.getVariableReference(b));
                fa.setType(references.getTypeReference(qualifiedNameReference.resolvedType));
                va.setParent(fa);
                va = fa;
            }
        }
        context.enter(va, qualifiedNameReference);
        return false;
    }
    return false;
}

From source file:spoon.support.compiler.jdt.JDTTreeBuilder.java

License:Open Source License

@Override
public boolean visit(QualifiedNameReference qualifiedNameReference, BlockScope scope) {
    long[] positions = qualifiedNameReference.sourcePositions;
    if (qualifiedNameReference.binding instanceof FieldBinding) {
        CtFieldAccess<Object> fa;
        if (context.stack.peek().element instanceof CtAssignment
                && (qualifiedNameReference.otherBindings == null
                        || qualifiedNameReference.otherBindings.length == 0)
                && context.assigned) {
            fa = factory.Core().createFieldWrite();
        } else {/*from  w  ww. ja  v a  2 s.com*/
            fa = factory.Core().createFieldRead();
        }

        CtFieldReference<Object> ref = references.getVariableReference(qualifiedNameReference.fieldBinding());
        // Only set the declaring type if we are in a static context. See
        // StaticAccessTest#testReferences test to have an example about that.
        if (ref.isStatic()) {
            ref.setDeclaringType(references.getTypeReference(qualifiedNameReference.actualReceiverType));
        }
        fa.setVariable(ref);

        if (qualifiedNameReference.binding != null && qualifiedNameReference.tokens.length
                - 1 == ((FieldBinding) qualifiedNameReference.binding).declaringClass.compoundName.length) {
            // We get the binding information when we specify the complete fully qualified name of the delcaring class.
            final ReferenceBinding declaringClass = ((FieldBinding) qualifiedNameReference.binding).declaringClass;
            final CtTypeReference<Object> typeReference = references.getTypeReference(declaringClass);
            fa.setTarget(factory.Code().createCodeSnippetExpression(typeReference.toString()));
        }

        if (qualifiedNameReference.otherBindings != null) {
            int i = 0; //positions index;
            int sourceStart = (int) (positions[0] >>> 32);
            for (FieldBinding b : qualifiedNameReference.otherBindings) {
                CtFieldAccess<Object> other;
                if (qualifiedNameReference.otherBindings.length == i + 1
                        && context.stack.peek().element instanceof CtAssignment) {
                    other = factory.Core().createFieldWrite();
                } else {
                    other = factory.Core().createFieldRead();
                }
                other.setVariable(references.getVariableReference(b));
                other.setTarget(fa);

                if (b != null) {
                    other.setType(references.getTypeReference(b.type));
                } else {
                    // case with no complete classpath
                    CtTypeReference<Object> ref2 = factory.Core().createTypeReference();
                    ref2.setSimpleName(new String(
                            qualifiedNameReference.tokens[qualifiedNameReference.tokens.length - 1]));
                    other.setType(ref2);
                }

                //set source position of fa;
                CompilationUnit cu = factory.CompilationUnit()
                        .create(new String(context.compilationunitdeclaration.getFileName()));
                int sourceEnd = (int) (positions[i]);
                final int[] lineSeparatorPositions = context.compilationunitdeclaration.compilationResult.lineSeparatorPositions;
                fa.setPosition(factory.Core().createSourcePosition(cu, sourceStart, sourceEnd,
                        lineSeparatorPositions));
                fa = other;
                i++;
            }
        }
        context.enter(fa, qualifiedNameReference);
        return true;
    } else if (qualifiedNameReference.binding instanceof VariableBinding) {
        CtVariableAccess<Object> va;
        if (context.stack.peek().element instanceof CtAssignment
                && (qualifiedNameReference.otherBindings == null
                        || qualifiedNameReference.otherBindings.length == 0 && context.assigned)) {
            va = factory.Core().createVariableWrite();
        } else {
            va = factory.Core().createVariableRead();
        }
        va.setVariable(references.getVariableReference((VariableBinding) qualifiedNameReference.binding));
        va.setType(va.getVariable().getType());
        if (qualifiedNameReference.otherBindings != null) {
            int i = 0; //positions index;
            int sourceStart = (int) (positions[0] >>> 32);
            for (FieldBinding b : qualifiedNameReference.otherBindings) {
                CtFieldAccess<Object> other;
                if (qualifiedNameReference.otherBindings.length == i + 1
                        && context.stack.peek().element instanceof CtAssignment) {
                    other = factory.Core().createFieldWrite();
                } else {
                    other = factory.Core().createFieldRead();
                }
                other.setVariable(references.getVariableReference(b));
                other.setTarget(va);
                if (b != null) {
                    other.setType(references.getTypeReference(b.type));
                } else {
                    // case with no complete classpath
                    CtTypeReference<Object> ref = factory.Core().createTypeReference();
                    ref.setSimpleName(new String(
                            qualifiedNameReference.tokens[qualifiedNameReference.tokens.length - 1]));
                    other.setType(ref);
                }
                //set source position of va;
                CompilationUnit cu = factory.CompilationUnit()
                        .create(new String(context.compilationunitdeclaration.getFileName()));
                int sourceEnd = (int) (positions[i]);
                final int[] lineSeparatorPositions = context.compilationunitdeclaration.compilationResult.lineSeparatorPositions;
                va.setPosition(factory.Core().createSourcePosition(cu, sourceStart, sourceEnd,
                        lineSeparatorPositions));
                va = other;
                i++;
            }
        }
        context.enter(va, qualifiedNameReference);
        return false;
    } else if (qualifiedNameReference.binding instanceof TypeBinding) {
        CtTypeAccess<Object> ta = factory.Core().createTypeAccess();
        ta.setType(references.getTypeReference((TypeBinding) qualifiedNameReference.binding));
        context.enter(ta, qualifiedNameReference);
        return false;
    } else if (qualifiedNameReference.binding instanceof ProblemBinding) {
        if (context.stack.peek().element instanceof CtInvocation) {
            final CtTypeAccess<Object> ta = factory.Core().createTypeAccess();
            final CtTypeReference<Object> typeReference = factory.Core().createTypeReference();
            typeReference.setSimpleName(qualifiedNameReference.toString());
            ta.setType(typeReference);
            context.enter(ta, qualifiedNameReference);
        }
        return false;
    } else {
        CtVariableAccess<Object> va = null;
        if (context.stack.peek().element instanceof CtAssignment && context.assigned) {
            va = factory.Core().createVariableWrite();
        } else {
            va = factory.Core().createVariableRead();
        }
        CtVariableReference<Object> varRef = new CtUnboundVariableReferenceImpl<Object>();
        varRef.setSimpleName(qualifiedNameReference.toString());
        va.setVariable(varRef);
        context.enter(va, qualifiedNameReference);
        return false;
    }
}

From source file:spoon.support.compiler.jdt.JDTTreeBuilderHelper.java

License:Open Source License

/**
 * Creates a variable or a field access from its qualified name.
 *
 * @param qualifiedNameReference//from  w w w . ja v  a  2 s.  c o  m
 *       Used to build the variable access. See all sub methods of this class to understand its usage.
 * @return a variable access.
 */
<T> CtVariableAccess<T> createVariableAccess(QualifiedNameReference qualifiedNameReference) {
    long[] positions = qualifiedNameReference.sourcePositions;
    int sourceStart = qualifiedNameReference.sourceStart();
    int sourceEnd = qualifiedNameReference.sourceEnd();
    if (qualifiedNameReference.indexOfFirstFieldBinding < positions.length) {
        sourceEnd = (int) (positions[qualifiedNameReference.indexOfFirstFieldBinding] >>> 32) - 2;
    }
    CtVariableAccess<T> va;
    CtVariableReference<T> ref;
    boolean fromAssignment = isLhsAssignment(jdtTreeBuilder.getContextBuilder(), qualifiedNameReference);
    boolean isOtherBinding = qualifiedNameReference.otherBindings == null
            || qualifiedNameReference.otherBindings.length == 0;
    if (qualifiedNameReference.binding instanceof FieldBinding) {
        ref = jdtTreeBuilder.getReferencesBuilder().getVariableReference(qualifiedNameReference.fieldBinding());
        ref.setPosition(jdtTreeBuilder.getPositionBuilder()
                .buildPosition(getVariableReferenceSourceStart(sourceStart, sourceEnd), sourceEnd));

        va = createFieldAccess(ref,
                createTargetFieldAccess(qualifiedNameReference, (CtFieldReference<Object>) ref),
                isOtherBinding && fromAssignment);
    } else {
        ref = jdtTreeBuilder.getReferencesBuilder()
                .getVariableReference((VariableBinding) qualifiedNameReference.binding);
        ref.setPosition(jdtTreeBuilder.getPositionBuilder()
                .buildPosition(getVariableReferenceSourceStart(sourceStart, sourceEnd), sourceEnd));

        va = createVariableAccess(ref, isOtherBinding && fromAssignment);
    }

    if (qualifiedNameReference.otherBindings != null) {
        int i = 0; //positions index;
        va.setPosition(jdtTreeBuilder.getPositionBuilder().buildPosition(sourceStart, sourceEnd));
        sourceStart = (int) (positions[qualifiedNameReference.indexOfFirstFieldBinding - 1] >>> 32);
        for (FieldBinding b : qualifiedNameReference.otherBindings) {
            isOtherBinding = qualifiedNameReference.otherBindings.length == i + 1;
            CtFieldAccess<T> other = createFieldAccess(jdtTreeBuilder.getReferencesBuilder()
                    .<T>getVariableReference(b, qualifiedNameReference.tokens[i + 1]), va,
                    isOtherBinding && fromAssignment);
            //set source position of fa
            if (i + qualifiedNameReference.indexOfFirstFieldBinding >= qualifiedNameReference.otherBindings.length) {
                sourceEnd = qualifiedNameReference.sourceEnd();
            } else {
                sourceEnd = (int) (positions[qualifiedNameReference.indexOfFirstFieldBinding + i + 1] >>> 32)
                        - 2;
            }
            other.setPosition(jdtTreeBuilder.getPositionBuilder().buildPosition(sourceStart, sourceEnd));
            va = other;
            i++;
        }
    } else if (!(qualifiedNameReference.binding instanceof FieldBinding)
            && qualifiedNameReference.tokens.length > 1) {
        sourceStart = (int) (positions[0] >>> 32);
        for (int i = 1; i < qualifiedNameReference.tokens.length; i++) {
            isOtherBinding = qualifiedNameReference.tokens.length == i + 1;
            CtFieldAccess<T> other = createFieldAccess(//
                    jdtTreeBuilder.getReferencesBuilder().<T>getVariableReference(null,
                            qualifiedNameReference.tokens[i]),
                    va, isOtherBinding && fromAssignment);
            //set source position of va;
            sourceEnd = (int) (positions[i]);
            va.setPosition(jdtTreeBuilder.getPositionBuilder().buildPosition(sourceStart, sourceEnd));
            va = other;
        }
    }
    va.setPosition(jdtTreeBuilder.getPositionBuilder().buildPosition(qualifiedNameReference.sourceStart(),
            qualifiedNameReference.sourceEnd()));
    return va;
}

From source file:spoon.support.compiler.jdt.JDTTreeBuilderHelper.java

License:Open Source License

/**
 * Creates a type access from its qualified name and with a field reference.
 *
 * @param qualifiedNameReference/*from w  w  w.  j a  va2s  .  c o  m*/
 *       Used to update the field reference if necessary.
 * @param fieldReference
 *       Used to get its declaring class and to put it in the type access.
 * @return a type access.
 */
CtTypeAccess<?> createTypeAccess(QualifiedNameReference qualifiedNameReference,
        CtFieldReference<?> fieldReference) {
    final TypeBinding receiverType = qualifiedNameReference.actualReceiverType;
    if (receiverType != null) {
        final CtTypeReference<Object> qualifiedRef = jdtTreeBuilder.getReferencesBuilder()
                .getQualifiedTypeReference(qualifiedNameReference.tokens, receiverType,
                        qualifiedNameReference.fieldBinding().declaringClass.enclosingType(),
                        new JDTTreeBuilder.OnAccessListener() {
                            @Override
                            public boolean onAccess(char[][] tokens, int index) {
                                return !CharOperation.equals(tokens[index + 1], tokens[tokens.length - 1]);
                            }
                        });
        if (qualifiedRef != null) {
            fieldReference.setDeclaringType(qualifiedRef);
        } else {
            fieldReference
                    .setDeclaringType(jdtTreeBuilder.getReferencesBuilder().getTypeReference(receiverType));
        }
    }
    CtTypeAccess<?> typeAccess = jdtTreeBuilder.getFactory().Code()
            .createTypeAccess(fieldReference.getDeclaringType());
    if (qualifiedNameReference.indexOfFirstFieldBinding > 1) {
        // the array sourcePositions contains the position of each element of the qualifiedNameReference
        // the last element contains the position of the field
        long[] positions = qualifiedNameReference.sourcePositions;
        typeAccess.setPosition(
                jdtTreeBuilder.getPositionBuilder().buildPosition(qualifiedNameReference.sourceStart(),
                        (int) (positions[qualifiedNameReference.indexOfFirstFieldBinding - 1] >>> 32) - 2));
        handleImplicit(qualifiedNameReference.actualReceiverType.getPackage(), qualifiedNameReference,
                fieldReference.getSimpleName(), typeAccess.getAccessedType());
    } else {
        typeAccess.setImplicit(qualifiedNameReference.isImplicitThis());
    }
    return typeAccess;
}