diff options
author | Sven Gothel <[email protected]> | 2014-05-11 03:03:36 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-05-11 03:03:36 +0200 |
commit | 1e53a38eb06aa8ff50660fdf7bd8570b27f27c56 (patch) | |
tree | f061dfb77af5b4c1f27da78b4dbd1881b400abc3 /src/java/com/jogamp/gluegen/structgen/CStruct.java | |
parent | 598da96b3d2ffc3e0915f73749cbafa5fa5cea90 (diff) |
Bug 923: Remove dependency of CStruct annotation processor _generation_ and generated_class_user due to Java8 issues.
Java8's annotation processor as embedded within javac does not allow
referencing not-yet existing generated classes in a class source code
which will produce these generated classes via the annotation process.
Example:
+++
import com.jogamp.gluegen.structgen.CStruct;
public class Lala {
@CStruct(name="RenderingConfig", header="TestStruct01.h")
public RenderingConfig config;
}
+++
Above example illustrates that the type 'RenderingConfig'
does not exist at time of processing the annotation.
The type will be created via the annotation process itself.
Even though we pass '-proc:only', i.e. skip java compilation,
Java8's annotation processing via javac fails in such case.
We see this as a bug within javac's annotation processing itself!
+++
This workaround splits the annotation process and using the class as
generated by the former.
To allow this to work, CStruct receives a new field 'jname'
allowing to enforce the java-name of the structure
using a dummy field type like boolean.
@CStruct(name="RenderingConfig", jname="RenderingConfig", header="TestStruct01.h")
public boolean dummy;
Further more CStruct can be annotated on the package, i.e. 'package-info.java',
avoiding the dependency problem altogether.
To support multiple header files and types,
'CStructs' has been introduced using an array of 'CStruct'.
@CStructs({@CStruct(name="RenderingConfig", header="TestStruct01.h"), @CStruct(name="Pixel", header="TestStruct02.h")})
package com.jogamp.gluegen.test.junit.structgen;
Tests:
- Build w/ Java7 and Java8
- Validated 'major version 50' (Java 6) class files (OK)
Diffstat (limited to 'src/java/com/jogamp/gluegen/structgen/CStruct.java')
-rw-r--r-- | src/java/com/jogamp/gluegen/structgen/CStruct.java | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/java/com/jogamp/gluegen/structgen/CStruct.java b/src/java/com/jogamp/gluegen/structgen/CStruct.java index 9d57196..be72cd8 100644 --- a/src/java/com/jogamp/gluegen/structgen/CStruct.java +++ b/src/java/com/jogamp/gluegen/structgen/CStruct.java @@ -33,21 +33,32 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * - * @author Michael Bien - * @author Sven Gothel, et.al. + * @author Michael Bien, et al. */ -@Target(value = {ElementType.FIELD, ElementType.LOCAL_VARIABLE}) +@Target(value = {ElementType.TYPE, ElementType.PACKAGE, ElementType.FIELD, ElementType.LOCAL_VARIABLE}) @Retention(value = RetentionPolicy.SOURCE) public @interface CStruct { /** * Relative path to the header file. + * <p> + * Mandatory. + * </p> */ String header(); /** * The name of the struct. + * <p> + * Mandatory for {@link ElementType.TYPE} and {@link ElementType.PACKAGE} annotations + * otherwise optional. + * </p> */ String name() default "_default_"; + + /** + * The optional java name of the struct. + */ + String jname() default "_default_"; + } |