From b5d6f23d8ac3d4bedb139fdaecc2e9dc621f385a Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 3 Aug 2013 15:06:46 +0200 Subject: wip --- .../trygvis/container/compiler/model/ClassG.java | 51 ++++++++++++++++------ .../trygvis/container/compiler/model/FieldRef.java | 11 ++++- .../container/compiler/model/MethodRef.java | 9 +++- .../container/compiler/model/Parameters.java | 2 + 4 files changed, 57 insertions(+), 16 deletions(-) (limited to 'container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model') diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java index 8ff91a0..6bfd0be 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/ClassG.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; +import static java.lang.reflect.Modifier.*; import static org.springframework.util.StringUtils.collectionToDelimitedString; public class ClassG { @@ -19,6 +20,10 @@ public class ClassG { private final List methods = new ArrayList<>(); private final List constructors = new ArrayList<>(); + public ClassG(String packageName, String className) { + this(packageName, className, null); + } + public ClassG(String packageName, String className, String extendsClass) { this.packageName = packageName; this.className = className; @@ -64,20 +69,32 @@ public class ClassG { return ref; } - public FieldRef addField(Class klass, String name) { + public FieldRef addField(TypeMirror klass, String name) { TypeRef type = addImport(klass); - FieldRef ref = new FieldRef(Modifier.PRIVATE | Modifier.FINAL, type, name); + FieldRef ref = new FieldRef(PRIVATE | FINAL, type, name); fields.add(ref); return ref; } - public FieldRef addPublicFinalField(Class klass, String name) { + public FieldRef addField(int modifiers, Class klass, String name) { TypeRef type = addImport(klass); - FieldRef ref = new FieldRef(Modifier.PUBLIC | Modifier.FINAL, type, name); + FieldRef ref = new FieldRef(modifiers, type, name); fields.add(ref); return ref; } + public FieldRef addField(Class klass, String name) { + return addField(PRIVATE | FINAL, klass, name); + } + + public FieldRef addPublicFinalField(Class klass, String name) { + return addField(PUBLIC | FINAL, klass, name); + } + + public FieldRef addPublicStaticFinalField(Class klass, String name) { + return addField(PUBLIC | STATIC | FINAL, klass, name); + } + public Constructor addConstructor(Parameters parameters, List body) { Constructor constructor = new Constructor(this, parameters, body); constructors.add(constructor); @@ -85,13 +102,19 @@ public class ClassG { } public MethodRef addMethod(List body, TypeRef returnType, String name, ParameterRef... parameters) { - MethodRef ref = new MethodRef(returnType, name, parameters, body); + MethodRef ref = new MethodRef(PUBLIC, returnType, name, parameters, body); + methods.add(ref); + return ref; + } + + public MethodRef addStaticMethod(List body, TypeRef returnType, String name, ParameterRef... parameters) { + MethodRef ref = new MethodRef(PUBLIC | STATIC, returnType, name, parameters, body); methods.add(ref); return ref; } public void write(PrintWriter writer) { - if(packageName.length() > 0) { + if (packageName.length() > 0) { writer.println("package " + packageName + ";"); writer.println(); } @@ -99,12 +122,14 @@ public class ClassG { if (i.isPrimitive()) { continue; } - if(i.canonicalName().indexOf('.') == -1) { + if (i.canonicalName().indexOf('.') == -1) { continue; } writer.println("import " + i.canonicalName() + ";"); } - writer.println(); + if (!imports.isEmpty()) { + writer.println(); + } String extendsString = extendsClass == null ? "" : " extends " + extendsClass; @@ -143,19 +168,17 @@ public class ClassG { } writer.print(" public " + returnString + " " + method.name + "(" + collectionToDelimitedString(parameters, ", ") + ")"); - if(method.exceptions.isEmpty()) { + if (method.exceptions.isEmpty()) { writer.println(" {"); - } - else { + } else { writer.println(" throws"); ArrayList typeRefs = new ArrayList<>(method.exceptions); for (int i = 0; i < typeRefs.size(); i++) { TypeRef e = typeRefs.get(i); writer.print(" " + e.name); - if(i < typeRefs.size() - 1) { + if (i < typeRefs.size() - 1) { writer.println(","); - } - else { + } else { writer.println(" {"); } } diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/FieldRef.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/FieldRef.java index c6b81a0..64bf032 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/FieldRef.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/FieldRef.java @@ -6,6 +6,7 @@ public class FieldRef implements Comparable { public final int modifiers; public final TypeRef klass; public final String name; + public String value; public FieldRef(int modifiers, TypeRef klass, String name) { this.modifiers = modifiers; @@ -14,7 +15,11 @@ public class FieldRef implements Comparable { } public String toJava() { - return Modifier.toString(modifiers) + " " + klass.name + " " + name; + String s = Modifier.toString(modifiers) + " " + klass.name + " " + name; + if (value != null) { + s += " = " + value; + } + return s; } @Override @@ -36,4 +41,8 @@ public class FieldRef implements Comparable { public int compareTo(FieldRef o) { return name.compareTo(o.name); } + + public void value(String value) { + this.value = value; + } } diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/MethodRef.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/MethodRef.java index a59e9a6..ee83fa9 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/MethodRef.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/MethodRef.java @@ -1,5 +1,6 @@ package io.trygvis.container.compiler.model; +import java.lang.reflect.Modifier; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -9,15 +10,21 @@ import static java.util.Collections.addAll; public class MethodRef { public final TypeRef returnType; public final String name; + public final int modifiers; public final ParameterRef[] parameters; public final Set exceptions = new TreeSet<>(); public final List body; - public MethodRef(TypeRef returnType, String name, ParameterRef[] parameters, List body) { + public MethodRef(int modifiers, TypeRef returnType, String name, ParameterRef[] parameters, List body) { + this.modifiers = modifiers; this.returnType = returnType; this.name = name; this.parameters = parameters; this.body = body; + + if ((Modifier.methodModifiers() & modifiers) != modifiers) { + throw new RuntimeException("Invalid modifiers for method: " + Modifier.toString(modifiers)); + } } public MethodRef exception(TypeRef... exceptions) { diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Parameters.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Parameters.java index 7c1ab5b..cfd29f9 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Parameters.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Parameters.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.ListIterator; public class Parameters implements Iterable { + public static final Parameters noParameters = new Parameters(); + private final List parameters = new ArrayList<>(); public ParameterRef addParameter(TypeRef klass, String name) { -- cgit v1.2.3