sviperll / adt4j

adt4j - Algebraic Data Types for Java
BSD 3-Clause "New" or "Revised" License
143 stars 8 forks source link

Using a class that contains a Map in a value object fails under java 8 #24

Closed talios closed 9 years ago

talios commented 9 years ago

Using a simple visitor class of:

@GenerateValueClassForVisitor
@Visitor(resultVariableName="R")
public interface RelVisitor<R> {
  R singleton(String rel);
  R sorted(String rel, Comparator<Representation> comparator);
}

where my Representation class contains methods that return Map's, ADT4j finds the Map<K,V> returned from one of it's methods, and then finds the Java 8 default method getOrDefault(), and then dies because default isn't a valid modifier as far as com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter#toJMod(javax.lang.model.element.Modifier) is concerned.

[ERROR] /Users/amrk/Dropbox/halbuilder/halbuilder-api/src/main/java/com/theoryinpractise/halbuilder/api/RelVisitor.java:[10,8] java.lang.UnsupportedOperationException: Unsupported modifier: default:
  java.lang.UnsupportedOperationException: Unsupported modifier: default
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.toJMod(DecidedErrorTypesModelsAdapter.java:91)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.toJMod(DecidedErrorTypesModelsAdapter.java:63)
    at com.github.sviperll.meta.java.model.ClassFiller.fillClass(ClassFiller.java:89)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineTopLevelClass(DecidedErrorTypesModelsAdapter.java:179)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineClass(DecidedErrorTypesModelsAdapter.java:150)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.getClass(DecidedErrorTypesModelsAdapter.java:129)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.getClass(DecidedErrorTypesModelsAdapter.java:134)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.ref(DecidedErrorTypesModelsAdapter.java:223)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:111)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:55)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:936)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.toJType(DecidedErrorTypesModelsAdapter.java:229)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:113)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:55)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:936)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.toJType(DecidedErrorTypesModelsAdapter.java:229)
    at com.github.sviperll.meta.java.model.ClassFiller.fillClass(ClassFiller.java:101)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineTopLevelClass(DecidedErrorTypesModelsAdapter.java:179)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineClass(DecidedErrorTypesModelsAdapter.java:150)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.getClass(DecidedErrorTypesModelsAdapter.java:129)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.ref(DecidedErrorTypesModelsAdapter.java:223)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:111)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:55)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:936)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.toJType(DecidedErrorTypesModelsAdapter.java:229)
    at com.github.sviperll.meta.java.model.ClassFiller.fillClass(ClassFiller.java:81)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineTopLevelClass(DecidedErrorTypesModelsAdapter.java:179)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineClass(DecidedErrorTypesModelsAdapter.java:150)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.getClass(DecidedErrorTypesModelsAdapter.java:129)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.ref(DecidedErrorTypesModelsAdapter.java:223)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:111)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:55)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:936)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.toJType(DecidedErrorTypesModelsAdapter.java:229)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:113)
    at com.github.sviperll.meta.java.model.TypeMirrorToJTypeVisitor.visitDeclared(TypeMirrorToJTypeVisitor.java:55)
    at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:936)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.toJType(DecidedErrorTypesModelsAdapter.java:229)
    at com.github.sviperll.meta.java.model.ClassFiller.fillClass(ClassFiller.java:111)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineTopLevelClass(DecidedErrorTypesModelsAdapter.java:179)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.defineClass(DecidedErrorTypesModelsAdapter.java:150)
    at com.github.sviperll.meta.java.model.DecidedErrorTypesModelsAdapter.getClass(DecidedErrorTypesModelsAdapter.java:129)
    at com.github.sviperll.meta.java.model.JCodeModelJavaxLangModelAdapter.getClassWithErrorTypes(JCodeModelJavaxLangModelAdapter.java:77)
    at com.github.sviperll.adt4j.GenerateValueClassForVisitorProcessor.processElements(GenerateValueClassForVisitorProcessor.java:100)
    at com.github.sviperll.adt4j.GenerateValueClassForVisitorProcessor.process(GenerateValueClassForVisitorProcessor.java:84)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
    at com.sun.tools.javac.main.Main.compile(Main.java:523)
    at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
    at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
    at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:125)
    at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:169)
    at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:825)
    at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

javax.lang.model.element.Modifier#DEFAULT now exists in Java 8 altho not sure what the equivalent com.helger.jcodemodel.JMod constant would be.

sviperll commented 9 years ago

It seems that the right way is to ignore unknown modifiers for now. This will retain old Java's versions compatibility. Besides, I'll try to promote DEFAULT to jcodemodel. Thank you for report.

sviperll commented 9 years ago

I've pushed fix to this issue to master. Can you confirm that this bug is fixed in master? Alternatively, I can release a beta version for you to test changes.

talios commented 9 years ago

I'll pull the code and test it later today/this evening - work is... hectic to say the least today :)