/** * Creates variable access from a {@link CtVariableReference}. Think to move this method * in the {@link spoon.reflect.factory.CodeFactory} if you think that is a good idea. */ public <T> CtFieldAccess<T> createFieldAccess(CtVariableReference<T> variableReference, CtExpression<?> target, boolean isReadAccess) { CtFieldAccess<T> fieldAccess; if (isReadAccess) { fieldAccess = jdtTreeBuilder.getFactory().Core().createFieldWrite(); } else { fieldAccess = jdtTreeBuilder.getFactory().Core().createFieldRead(); } fieldAccess.setVariable(variableReference); fieldAccess.setTarget(target); return fieldAccess; }
/** * Creates a field access from a field reference. * * @param fieldReference * Used to build the spoon variable reference and the type of the field access. * @return a field access. */ <T> CtFieldAccess<T> createFieldAccess(FieldReference fieldReference) { CtFieldAccess<T> fieldAccess; if (isLhsAssignment(jdtTreeBuilder.getContextBuilder(), fieldReference)) { fieldAccess = jdtTreeBuilder.getFactory().Core().createFieldWrite(); } else { fieldAccess = jdtTreeBuilder.getFactory().Core().createFieldRead(); } fieldAccess.setVariable(jdtTreeBuilder.getReferencesBuilder().<T>getVariableReference(fieldReference.binding, fieldReference.token)); fieldAccess.setType(jdtTreeBuilder.getReferencesBuilder().<T>getTypeReference(fieldReference.resolvedType)); return fieldAccess; }
/** * In no classpath mode, when we build a field access, we have a binding typed by ProblemBinding. * This binding doesn't contain all information but we can get some of them. * * @param singleNameReference * Used to get the problem binding of the field access and the name of the declaring type. * @return a field access. */ <T> CtFieldAccess<T> createFieldAccessNoClasspath(SingleNameReference singleNameReference) { CtFieldAccess<T> va; if (isLhsAssignment(jdtTreeBuilder.getContextBuilder(), singleNameReference)) { va = jdtTreeBuilder.getFactory().Core().createFieldWrite(); } else { va = jdtTreeBuilder.getFactory().Core().createFieldRead(); } va.setVariable(jdtTreeBuilder.getReferencesBuilder().<T>getVariableReference((ProblemBinding) singleNameReference.binding)); final CtReference declaring = jdtTreeBuilder.getReferencesBuilder().getDeclaringReferenceFromImports(singleNameReference.token); if (declaring instanceof CtTypeReference && va.getVariable() != null) { final CtTypeReference<Object> declaringRef = (CtTypeReference<Object>) declaring; va.setTarget(jdtTreeBuilder.getFactory().Code().createTypeAccess(declaringRef)); va.getVariable().setDeclaringType(declaringRef); va.getVariable().setStatic(true); } return va; }
/** * Creates a field access from its single name. * * @param singleNameReference * Used to build a variable reference and a target which will be contained in the field access. * @return a field access. */ <T> CtFieldAccess<T> createFieldAccess(SingleNameReference singleNameReference) { CtFieldAccess<T> va; if (isLhsAssignment(jdtTreeBuilder.getContextBuilder(), singleNameReference)) { va = jdtTreeBuilder.getFactory().Core().createFieldWrite(); } else { va = jdtTreeBuilder.getFactory().Core().createFieldRead(); } va.setVariable(jdtTreeBuilder.getReferencesBuilder().<T>getVariableReference(singleNameReference.fieldBinding().original())); if (va.getVariable() != null) { final CtFieldReference<T> ref = va.getVariable(); if (ref.isStatic() && !ref.getDeclaringType().isAnonymous()) { va.setTarget(jdtTreeBuilder.getFactory().Code().createTypeAccess(ref.getDeclaringType())); } else if (!ref.isStatic()) { va.setTarget(jdtTreeBuilder.getFactory().Code().createThisAccess(jdtTreeBuilder.getReferencesBuilder().getTypeReference(singleNameReference.actualReceiverType), true)); } } return va; }
@SuppressWarnings("unchecked") public static CtFieldAccess<?> chainToAccess(List<CtField<?>> chain, AccessType accessType) { CtFieldAccess<?> access = null; for (int i = chain.size() - 1; i >= 0; i--) { CtField<?> field = chain.get(i); CoreFactory coreFactory = field.getFactory().Core(); CtFieldAccess acc = accessType == AccessType.Read ? coreFactory.createFieldRead() : coreFactory.createFieldWrite(); acc.setVariable(field.getReference()); acc.setType(field.getType()); acc.setTarget(access); access = acc; } return access; }
variableReference.setSimpleName(new String(fieldReference.token)); fieldAccess.setVariable(variableReference); fieldAccess.setType(references.getTypeReference(fieldReference.resolvedType));
ref.setDeclaringType(references.getTypeReference(qualifiedNameReference.actualReceiverType)); fa.setVariable(ref); other = factory.Core().createFieldRead(); other.setVariable(references.getVariableReference(b)); other.setTarget(fa); other = factory.Core().createFieldRead(); other.setVariable(references.getVariableReference(b)); other.setTarget(va); if (b != null) {