Search in sources :

Example 11 with JavaFile

use of com.squareup.javapoet.JavaFile in project mvp4g2 by mvp4g.

the class EventBusGenerator method generate.

public void generate(EventBusMetaModel eventBusMetaMetaModel, HandlerMetaModel handlerMetaModel, PresenterMetaModel presenterMetaModel, HistoryMetaModel historyMetaModel) throws ProcessorException {
    // check if element is existing (to avoid generating code for deleted items)
    if (!this.processorUtils.doesExist(eventBusMetaMetaModel.getEventBus())) {
        return;
    }
    ClassName abstractEventBusClassName = ClassName.get(AbstractEventBus.class);
    TypeSpec.Builder typeSpec = TypeSpec.classBuilder(eventBusMetaMetaModel.getEventBus().getSimpleName() + EventBusGenerator.IMPL_NAME).superclass(ParameterizedTypeName.get(abstractEventBusClassName, eventBusMetaMetaModel.getEventBus().getTypeName())).addModifiers(Modifier.PUBLIC, Modifier.FINAL).addSuperinterface(eventBusMetaMetaModel.getEventBus().getTypeName());
    MethodSpec constructor = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).addStatement("super($S)", eventBusMetaMetaModel.getShell().getClassName()).build();
    typeSpec.addMethod(constructor);
    DebugGenerator.builder().eventBusMetaModel(eventBusMetaMetaModel).typeSpec(typeSpec).build().generate();
    FilterGenerator.builder().eventBusMetaModel(eventBusMetaMetaModel).typeSpec(typeSpec).build().generate();
    EventLoadMetaDataGenerator.builder().processingEnvironment(this.processingEnvironment).eventBusMetaModel(eventBusMetaMetaModel).typeSpec(typeSpec).build().generate();
    EventMetaDataGenerator.builder().processingEnvironment(this.processingEnvironment).eventBusMetaModel(eventBusMetaMetaModel).build().generate();
    EventHandlingMethodGenerator.builder().processorUtils(this.processorUtils).typeSpec(typeSpec).eventBusMetaModel(eventBusMetaMetaModel).historyMetaModel(historyMetaModel).presenterMetaModel(presenterMetaModel).handlerMetaModel(handlerMetaModel).build().generate();
    AddPresenterGenerator.builder().typeSpec(typeSpec).processingEnvironment(this.processingEnvironment).presenterMetaModel(presenterMetaModel).build().generate();
    HandlerAndPresenterRegristrationGenerator.builder().processingEnvironment(this.processingEnvironment).typeSpec(typeSpec).eventBusMetaModel(eventBusMetaMetaModel).presenterMetaModel(presenterMetaModel).handlerMetaModel(handlerMetaModel).build().generate();
    JavaFile javaFile = JavaFile.builder(eventBusMetaMetaModel.getEventBus().getPackage(), typeSpec.build()).build();
    // System.out.println(javaFile.toString());
    try {
        javaFile.writeTo(this.processingEnvironment.getFiler());
    } catch (IOException e) {
        throw new ProcessorException("Unable to write generated file: >>" + eventBusMetaMetaModel.getEventBus().getSimpleName() + EventBusGenerator.IMPL_NAME + "<< -> exception: " + e.getMessage());
    }
}
Also used : ProcessorException(com.github.mvp4g.mvp4g2.processor.ProcessorException) MethodSpec(com.squareup.javapoet.MethodSpec) ClassName(com.squareup.javapoet.ClassName) JavaFile(com.squareup.javapoet.JavaFile) IOException(java.io.IOException) TypeSpec(com.squareup.javapoet.TypeSpec)

Example 12 with JavaFile

use of com.squareup.javapoet.JavaFile in project mvp4g2 by mvp4g.

the class EventMetaDataGenerator method generate.

public void generate() throws ProcessorException {
    for (EventMetaModel eventMetaModel : this.eventBusMetaModel.getEventMetaModels()) {
        TypeSpec.Builder typeSpec = TypeSpec.classBuilder(this.createEventMetaDataClassName(this.eventBusMetaModel.getEventBus().getClassName(), eventMetaModel.getEventName())).superclass(ParameterizedTypeName.get(ClassName.get(EventMetaData.class), this.eventBusMetaModel.getEventBus().getTypeName())).addModifiers(Modifier.PUBLIC, Modifier.FINAL);
        // constructor ...
        MethodSpec.Builder constructor = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).addCode("super($S, $S, ", eventMetaModel.getEventInternalName(), eventMetaModel.getEventName());
        if (Event.DEFAULT_HISTORY_NAME.equals(eventMetaModel.getHistoryEventName())) {
            constructor.addCode("null, ");
        } else {
            constructor.addCode("$S, ", eventMetaModel.getHistoryEventName());
        }
        if (Event.NoHistoryConverter.class.getCanonicalName().equals(eventMetaModel.getHistoryConverter().getClassName())) {
            constructor.addCode("null, null, ");
        } else {
            constructor.addCode("new $L(), new $T(), ", eventMetaModel.getHistoryConverter().getPackage() + "." + this.processorUtils.createHistoryMetaDataClassName(eventMetaModel.getHistoryConverter().getClassName()), eventMetaModel.getHistoryConverter().getTypeName());
        }
        constructor.addCode("$L, $L);\n", eventMetaModel.getPassive(), eventMetaModel.getNavigationEvent());
        eventMetaModel.getBindings().forEach(s -> constructor.addStatement("super.addBindHandler($S)", s.getClassName()));
        eventMetaModel.getHandlers().forEach(s -> constructor.addStatement("super.addHandler($S)", s.getClassName()));
        eventMetaModel.getActivateHandlers().forEach(s -> constructor.addStatement("super.addActivateHandler($S)", s.getClassName()));
        eventMetaModel.getDeactivateHandlers().forEach(s -> constructor.addStatement("super.addDeactivateHandler($S)", s.getClassName()));
        typeSpec.addMethod(constructor.build());
        JavaFile javaFile = JavaFile.builder(eventBusMetaModel.getEventBus().getPackage(), typeSpec.build()).build();
        try {
            javaFile.writeTo(this.processingEnvironment.getFiler());
        } catch (IOException e) {
            throw new ProcessorException("Unable to write generated file: >>" + eventBusMetaModel.getEventBus().getPackage() + "." + this.createEventMetaDataClassName(this.eventBusMetaModel.getEventBus().getClassName(), eventMetaModel.getEventName()) + "<< -> exception: " + e.getMessage());
        }
    }
}
Also used : ProcessorException(com.github.mvp4g.mvp4g2.processor.ProcessorException) MethodSpec(com.squareup.javapoet.MethodSpec) JavaFile(com.squareup.javapoet.JavaFile) IOException(java.io.IOException) EventMetaModel(com.github.mvp4g.mvp4g2.processor.model.EventMetaModel) EventMetaData(com.github.mvp4g.mvp4g2.core.internal.eventbus.EventMetaData) TypeSpec(com.squareup.javapoet.TypeSpec)

Example 13 with JavaFile

use of com.squareup.javapoet.JavaFile in project mvp4g2 by mvp4g.

the class HandlerGenerator method generate.

public void generate(HandlerMetaModel metaModel) throws ProcessorException {
    ClassName eventHandlerMetaDataClassName = ClassName.get(HandlerMetaData.class);
    ClassName eventHandlerMetaDataKindClassName = ClassName.get(HandlerMetaData.Kind.class);
    for (String eventHandler : metaModel.getHandlerKeys()) {
        // check if element is existing (to avoid generating code for deleted items)
        if (this.processorUtils.doesExist(new ClassNameModel(eventHandler))) {
            HandlerMetaModel.HandlerData data = metaModel.getHandlerData(eventHandler);
            String className = this.processorUtils.createFullClassName(data.getHandler().getPackage(), data.getHandler().getSimpleName() + ProcessorConstants.META_DATA);
            TypeSpec.Builder typeSpec = TypeSpec.classBuilder(this.processorUtils.setFirstCharacterToUpperCase(className)).superclass(ParameterizedTypeName.get(eventHandlerMetaDataClassName, data.getHandler().getTypeName())).addModifiers(Modifier.PUBLIC, Modifier.FINAL);
            // constructor ...
            MethodSpec.Builder constructor = MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).addStatement("super($S, $T.EVENT_HANDLER, new $T())", data.getHandler().getClassName(), eventHandlerMetaDataKindClassName, data.getHandler().getTypeName());
            typeSpec.addMethod(constructor.build());
            JavaFile javaFile = JavaFile.builder(data.getHandler().getPackage(), typeSpec.build()).build();
            try {
                javaFile.writeTo(this.processingEnvironment.getFiler());
            } catch (IOException e) {
                throw new ProcessorException("Unable to write generated file: >>" + data.getHandler().getSimpleName() + ProcessorConstants.META_DATA + "<< -> exception: " + e.getMessage());
            }
        }
    }
}
Also used : HandlerMetaData(com.github.mvp4g.mvp4g2.core.internal.ui.HandlerMetaData) HandlerMetaModel(com.github.mvp4g.mvp4g2.processor.model.HandlerMetaModel) ProcessorException(com.github.mvp4g.mvp4g2.processor.ProcessorException) MethodSpec(com.squareup.javapoet.MethodSpec) IOException(java.io.IOException) ClassName(com.squareup.javapoet.ClassName) JavaFile(com.squareup.javapoet.JavaFile) ClassNameModel(com.github.mvp4g.mvp4g2.processor.model.intern.ClassNameModel) TypeSpec(com.squareup.javapoet.TypeSpec)

Example 14 with JavaFile

use of com.squareup.javapoet.JavaFile in project pixel-dungeon-remix by NYRDS.

the class PdAnnotationProcessor method process.

@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
    Map<Element, Set<Element>> fieldsByClass = new HashMap<>();
    Map<Element, String> defaultValues = new HashMap<>();
    // for each javax.lang.model.element.Element annotated with the CustomAnnotation
    for (Element element : roundEnvironment.getElementsAnnotatedWith(Packable.class)) {
        Element parent = element.getEnclosingElement();
        String defaultValue = element.getAnnotation(Packable.class).defaultValue();
        if (!defaultValue.isEmpty()) {
            defaultValues.put(element, defaultValue);
        }
        if (fieldsByClass.get(parent) == null) {
            fieldsByClass.put(parent, new HashSet<Element>());
        }
        fieldsByClass.get(parent).add(element);
    }
    TypeSpec BundleHelper = TypeSpec.classBuilder("BundleHelper").addModifiers(Modifier.PUBLIC, Modifier.FINAL).build();
    MethodSpec pack = MethodSpec.methodBuilder("Pack").addModifiers(Modifier.PUBLIC, Modifier.STATIC).returns(void.class).addParameter(ClassName.get("com.watabou.utils", "Bundlable"), "arg").addParameter(ClassName.get("com.watabou.utils", "Bundle"), "bundle").beginControlFlow("try").build();
    MethodSpec unpack = MethodSpec.methodBuilder("UnPack").addModifiers(Modifier.PUBLIC, Modifier.STATIC).returns(void.class).addParameter(ClassName.get("com.watabou.utils", "Bundlable"), "arg").addParameter(ClassName.get("com.watabou.utils", "Bundle"), "bundle").beginControlFlow("try").build();
    for (Element clazz : fieldsByClass.keySet()) {
        CodeBlock packerBlock = CodeBlock.builder().beginControlFlow("if(arg instanceof $T)", TypeName.get(clazz.asType())).build();
        CodeBlock unpackerBlock = CodeBlock.builder().beginControlFlow("if(arg instanceof $T)", TypeName.get(clazz.asType())).build();
        for (Element field : fieldsByClass.get(clazz)) {
            String fieldName = field.getSimpleName().toString();
            packerBlock = packerBlock.toBuilder().addStatement("$T $L = $T.class.getDeclaredField($S)", Field.class, fieldName, TypeName.get(clazz.asType()), fieldName).addStatement("$L.setAccessible(true)", fieldName).addStatement("bundle.put($S,($T)$L.get(arg))", fieldName, TypeName.get(field.asType()), fieldName).build();
            unpackerBlock = unpackerBlock.toBuilder().addStatement("$T $L = $T.class.getDeclaredField($S)", Field.class, fieldName, TypeName.get(clazz.asType()), fieldName).addStatement("$L.setAccessible(true)", fieldName).build();
            String fieldType = TypeName.get(field.asType()).toString();
            String defaultValue = defaultValues.get(field);
            if (fieldType.equals("int")) {
                if (defaultValue == null || defaultValue.isEmpty()) {
                    defaultValue = "0";
                }
                unpackerBlock = unpackerBlock.toBuilder().addStatement("$L.setInt(arg,bundle.optInt($S,$L))", fieldName, fieldName, defaultValue).build();
                continue;
            }
            if (fieldType.equals("boolean")) {
                if (defaultValue == null || defaultValue.isEmpty()) {
                    defaultValue = "false";
                }
                unpackerBlock = unpackerBlock.toBuilder().addStatement("$L.setBoolean(arg,bundle.optBoolean($S,$L))", fieldName, fieldName, defaultValue).build();
                continue;
            }
            if (fieldType.equals("float")) {
                if (defaultValue == null || defaultValue.isEmpty()) {
                    defaultValue = "0.0f";
                }
                unpackerBlock = unpackerBlock.toBuilder().addStatement("$L.setFloat(arg,bundle.optFloat($S,$L))", fieldName, fieldName, defaultValue).build();
                continue;
            }
            if (fieldType.equals("java.lang.String")) {
                if (defaultValue == null || defaultValue.isEmpty()) {
                    defaultValue = "Unknown";
                }
                unpackerBlock = unpackerBlock.toBuilder().addStatement("$L.set(arg,bundle.optString($S,$S))", fieldName, fieldName, defaultValue).build();
                continue;
            }
            Set<Class<?>> fieldInterfaces = new HashSet<>();
            Collections.addAll(fieldInterfaces, field.getClass().getInterfaces());
            Set<String> fieldInterfaceNames = new HashSet<>();
            for (Class<?> clazzz : fieldInterfaces) {
                fieldInterfaceNames.add(clazzz.getSimpleName());
            }
            /*
				if(fieldType.equals("Collection")) {
					unpackerBlock = unpackerBlock.toBuilder()
							.addStatement("$L.set(arg,bundle.getCollection($S,$S))", fieldName,fieldName,fieldType+".class")
							.build();
					continue;
				}
*/
            if (fieldType.equals("Bundlable")) {
                unpackerBlock = unpackerBlock.toBuilder().addStatement("($S)$L.set(arg,bundle.get($S))", fieldType + ".class", fieldName, fieldName).build();
                continue;
            }
        }
        packerBlock = packerBlock.toBuilder().endControlFlow().build();
        unpackerBlock = unpackerBlock.toBuilder().endControlFlow().build();
        pack = pack.toBuilder().addCode(packerBlock).build();
        unpack = unpack.toBuilder().addCode(unpackerBlock).build();
    }
    pack = pack.toBuilder().nextControlFlow("catch ($T e)", NoSuchFieldException.class).addStatement("throw new $T(e)", ClassName.get("com.nyrds.android.util", "TrackedRuntimeException")).nextControlFlow("catch ($T e)", IllegalAccessException.class).addStatement("throw new $T(e)", ClassName.get("com.nyrds.android.util", "TrackedRuntimeException")).endControlFlow().build();
    unpack = unpack.toBuilder().nextControlFlow("catch ($T e)", NoSuchFieldException.class).addStatement("throw new $T(e)", ClassName.get("com.nyrds.android.util", "TrackedRuntimeException")).nextControlFlow("catch ($T e)", IllegalAccessException.class).addStatement("throw new $T(e)", ClassName.get("com.nyrds.android.util", "TrackedRuntimeException")).endControlFlow().build();
    BundleHelper = BundleHelper.toBuilder().addMethod(pack).addMethod(unpack).build();
    JavaFile javaFile = JavaFile.builder("com.nyrds.generated", BundleHelper).build();
    try {
        // write the file
        JavaFileObject source = processingEnv.getFiler().createSourceFile("com.nyrds.generated.BundleHelper");
        Writer writer = source.openWriter();
        javaFile.writeTo(writer);
        writer.flush();
        writer.close();
    } catch (IOException e) {
    // Note: calling e.printStackTrace() will print IO errors
    // that occur from the file already existing after its first run, this is normal
    }
    return true;
}
Also used : ImmutableSet(com.google.common.collect.ImmutableSet) Set(java.util.Set) HashSet(java.util.HashSet) HashMap(java.util.HashMap) MethodSpec(com.squareup.javapoet.MethodSpec) Element(javax.lang.model.element.Element) TypeElement(javax.lang.model.element.TypeElement) CodeBlock(com.squareup.javapoet.CodeBlock) IOException(java.io.IOException) Field(java.lang.reflect.Field) JavaFileObject(javax.tools.JavaFileObject) JavaFile(com.squareup.javapoet.JavaFile) Writer(java.io.Writer) TypeSpec(com.squareup.javapoet.TypeSpec) HashSet(java.util.HashSet)

Example 15 with JavaFile

use of com.squareup.javapoet.JavaFile in project ucsFramework by cjsoftware-lib.

the class PreserveUiStateProcessor method completeProcessing.

@Override
protected void completeProcessing() {
    super.completeProcessing();
    if (isFatalErrorEncountered()) {
        // If we hit a fatal error, bail.
        return;
    }
    for (TypeElement preservedFieldContainer : preservedFieldGroups.keySet()) {
        PackageElement packageElement = getProcessorModel().getElementUtils().getPackageOf(preservedFieldContainer);
        ClassName generatedFieldListClassName = ClassName.get(packageElement.getQualifiedName().toString(), String.format(GENERATED_PRESERVED_FIELD_LIST_CLASS_NAME_TEMPLATE, sanitiseClassName(preservedFieldContainer.getSimpleName().toString())));
        TypeSpec.Builder preserveStateClass = TypeSpec.classBuilder(generatedFieldListClassName).addSuperinterface(ParameterizedTypeName.get(ClassName.get(StatePreservationManager.class), ClassName.get(preservedFieldContainer.asType()))).addField(FieldSpec.builder(TypeName.BOOLEAN, FIELD_HAVE_STATE).initializer("false").build());
        List<DoPreservedField> preservedFieldList = preservedFieldGroups.get(preservedFieldContainer);
        addStrategyFields(preserveStateClass, preservedFieldList, preservedFieldContainer.asType());
        preserveStateClass.addMethod(addSaveMethod(TypeName.get(preservedFieldContainer.asType()), preservedFieldList));
        for (DoPreservedField field : preservedFieldList) {
            preserveStateClass.addMethod(addSaveFieldMethod(TypeName.get(preservedFieldContainer.asType()), field));
        }
        preserveStateClass.addMethod(addRestoreMethod(TypeName.get(preservedFieldContainer.asType()), preservedFieldList));
        for (DoPreservedField field : preservedFieldList) {
            preserveStateClass.addMethod(addRestoreFieldMethod(TypeName.get(preservedFieldContainer.asType()), field));
        }
        try {
            JavaFile javaFile = JavaFile.builder(packageElement.getQualifiedName().toString(), preserveStateClass.build()).addFileComment("Generated Code, do not modify.").build();
            javaFile.writeTo(getProcessorModel().getFiler());
        } catch (IOException e) {
            fatalErrorMessage("Exception writing java file: " + e.toString(), preservedFieldContainer);
        }
    }
}
Also used : DoPreservedField(com.cjsoftware.processor.uistatepreservation.model.DoPreservedField) TypeElement(javax.lang.model.element.TypeElement) ClassName(com.squareup.javapoet.ClassName) StatePreservationManager(com.cjsoftware.library.uistatepreservation.StatePreservationManager) JavaFile(com.squareup.javapoet.JavaFile) PackageElement(javax.lang.model.element.PackageElement) IOException(java.io.IOException) TypeSpec(com.squareup.javapoet.TypeSpec)

Aggregations

JavaFile (com.squareup.javapoet.JavaFile)68 TypeSpec (com.squareup.javapoet.TypeSpec)43 IOException (java.io.IOException)42 TypeElement (javax.lang.model.element.TypeElement)25 MethodSpec (com.squareup.javapoet.MethodSpec)21 ClassName (com.squareup.javapoet.ClassName)19 Element (javax.lang.model.element.Element)15 ExecutableElement (javax.lang.model.element.ExecutableElement)12 HashMap (java.util.HashMap)10 File (java.io.File)9 HashSet (java.util.HashSet)9 Map (java.util.Map)9 VariableElement (javax.lang.model.element.VariableElement)9 Builder (com.squareup.javapoet.TypeSpec.Builder)8 ArrayList (java.util.ArrayList)8 ProcessorException (com.github.mvp4g.mvp4g2.processor.ProcessorException)6 PackageElement (javax.lang.model.element.PackageElement)6 DeclaredType (javax.lang.model.type.DeclaredType)6 TypeMirror (javax.lang.model.type.TypeMirror)6 CodeBlock (com.squareup.javapoet.CodeBlock)5