protected void searchForProtectedField(CtField<?> field, CtConsumer<Object> outputConsumer) { //protected field can be referred from the scope of current top level type only and children field.getFactory().getModel() //search for all types which inherits from declaring type of this field .filterChildren(new SubtypeFilter(field.getDeclaringType().getReference())) //visit all elements in scope of these inherited types .filterChildren(null) .forEach(outputConsumer); } protected void searchForPublicField(CtField<?> field, CtConsumer<Object> outputConsumer) {
/** * Creates a field reference from an existing field. */ public <T> CtFieldReference<T> createReference(CtField<T> field) { final CtFieldReference<T> reference = createReference(factory.Type().createReference(field.getDeclaringType()), field.getType().clone(), field.getSimpleName()); reference.setFinal(field.hasModifier(ModifierKind.FINAL)); reference.setStatic(field.hasModifier(ModifierKind.STATIC)); return reference; }
protected String nameForField(CtField<?> field, String fieldOwner) { String fieldName = field.getSimpleName(); CtType<?> declaringType = field.getDeclaringType(); String declaringClass = declaringType.getQualifiedName().replace('$', '.'); if (hasStaticModifier(field)) { fieldName = declaringClass + "." + fieldName; } else if (declaringType.getSimpleName().isEmpty()) { /* only when 'variable' is a field of an Anonymous Class */ fieldName = "this." + fieldName; } else if (fieldOwner == null) { fieldName = declaringClass + ".this." + fieldName; } else { fieldName = fieldOwner + "." + fieldName; } return fieldName; }
/** * Creates a field reference from an existing field. */ public <T> CtFieldReference<T> createReference(CtField<T> field) { return createReference(factory.Type().createReference(field.getDeclaringType()), field.getType(), field.getSimpleName()); }
CtExpression fieldInit = field.getDefaultExpression(); if (fieldInit != null && !field.hasModifier(STATIC)) { CtType<?> declaringType = field.getDeclaringType(); if (declaringType instanceof CtClass) { CtClass<?> declaringClass = (CtClass) declaringType;
private void generateFinalAccessors() { List<CtField<?>> finalFields = root.getMergedClass() .getElements((CtField<?> field) -> field.hasModifier(FINAL)); finalFields.forEach(f -> { CtType<?> declaringType = f.getDeclaringType(); if (declaringType.getMethodsByName(f.getSimpleName()).isEmpty()) { Factory factory = f.getFactory(); CtMethod access = factory.Method().create( declaringType, EnumSet.of(PUBLIC), f.getType(), f.getSimpleName(), emptyList(), emptySet()); access.setParent(declaringType); access.setBody((CtBlock) factory.Core().createBlock()); CtReturn fReturn = factory.Core().createReturn(); fReturn.setReturnedExpression( factory.Code().createVariableRead(f.getReference(), false)); access.getBody().addStatement(fReturn); access.setPosition(new LinedSourcePosition( ((LinedSourcePosition) f.getPosition()).delegate, ((LinedSourcePosition) f.getPosition()).line)); } }); }