From e1cf8889628d2d31cf7067b8c002f229fc22007d Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 3 Aug 2013 18:00:10 +0200 Subject: wip --- .../trygvis/container/compiler/model/ClassG.java | 63 +++++++++------------- .../container/compiler/model/Constructor.java | 2 +- .../trygvis/container/compiler/model/TypeRef.java | 56 ++++++++++++++----- 3 files changed, 68 insertions(+), 53 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 9befa36..857311d 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 @@ -12,58 +12,46 @@ import static java.lang.reflect.Modifier.*; import static org.springframework.util.StringUtils.collectionToDelimitedString; public class ClassG { - private final String packageName; - public final String className; - private final String extendsClass; + public final TypeRef type; + private final TypeRef extendsClass; private final Set imports = new TreeSet<>(); private final Set fields = new TreeSet<>(); private final List methods = new ArrayList<>(); private final List constructors = new ArrayList<>(); - public ClassG(String packageName, String className) { - this(packageName, className, null); + public ClassG(TypeRef type) { + this(type, null); } - public ClassG(String packageName, String className, String extendsClass) { - this.packageName = packageName; - this.className = className; + public ClassG(TypeRef type, TypeRef extendsClass) { + this.type = type; this.extendsClass = extendsClass; } public TypeRef addImport(final TypeMirror type) { - if (type.getKind().isPrimitive()) { - return TypeRef.find(type.getKind()); - } - - String canonicalName = type.toString(); - - for (TypeRef i : imports) { - if (i.canonicalName().equals(canonicalName)) { - return i; - } - } + return addImport(new TypeRef(type)); + } - TypeRef ref = new TypeRef(canonicalName, canonicalName); - imports.add(ref); - return ref; + public TypeRef addImport(Class c) { + return addImport(new TypeRef(c)); } - public TypeRef addImport(Class klass) { - String canonicalName = klass.getCanonicalName(); - String simpleName = klass.getSimpleName(); - String name = simpleName; + public TypeRef addImport(TypeRef klass) { + String fqName = klass.fqName; + String name = klass.name; for (TypeRef i : imports) { - if (i.canonicalName().equals(canonicalName)) { + if (i.fqName.equals(fqName)) { return i; } - if (i.name.equals(simpleName)) { - name = canonicalName; + // If we've already found an import with the same name, use the fq version + if (i.name.equals(name)) { + name = fqName; break; } } - TypeRef ref = new TypeRef(name, canonicalName); + TypeRef ref = new TypeRef(name, fqName); imports.add(ref); return ref; @@ -114,26 +102,23 @@ public class ClassG { } public void write(PrintWriter writer) { - if (packageName.length() > 0) { - writer.println("package " + packageName + ";"); + if (!type.inUnnamedPackage()) { + writer.println("package " + type.packageName() + ";"); writer.println(); } for (TypeRef i : imports) { - if (i.isPrimitive()) { - continue; - } - if (i.canonicalName().indexOf('.') == -1) { + if (i.isPrimitive() || i.inUnnamedPackage()) { continue; } - writer.println("import " + i.canonicalName() + ";"); + writer.println("import " + i.fqName + ";"); } if (!imports.isEmpty()) { writer.println(); } - String extendsString = extendsClass == null ? "" : " extends " + extendsClass; + String extendsString = extendsClass == null ? "" : " extends " + extendsClass.name; - writer.println("public class " + className + extendsString + " {"); + writer.println("public class " + type.className + extendsString + " {"); for (FieldRef field : fields) { writer.println(); writer.println(" " + field.toJava() + ";"); diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Constructor.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Constructor.java index 43800ce..f669273 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Constructor.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/Constructor.java @@ -27,7 +27,7 @@ public class Constructor { String params = collectionToDelimitedString(ps, ", "); - body.add(" public " + g.className + "(" + params + ") {"); + body.add(" public " + g.type.className + "(" + params + ") {"); for (String s : this.body) { body.add(" " + s); } diff --git a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/TypeRef.java b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/TypeRef.java index aabfb45..c6f958a 100644 --- a/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/TypeRef.java +++ b/container-compiler-plugin/src/main/java/io/trygvis/container/compiler/model/TypeRef.java @@ -1,6 +1,7 @@ package io.trygvis.container.compiler.model; import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; public class TypeRef implements Comparable { @@ -15,27 +16,56 @@ public class TypeRef implements Comparable { public static final TypeRef DOUBLE = new TypeRef("double", null); /** - * The name of a class used within a class file. Is either the simple name or the canonical name. + * The name of a class used within a class file. Is either the just the name or the fully qualified name. */ public final String name; - private final String canonicalName; + public final String className; - public String canonicalName() { - if (canonicalName == null) { - throw new RuntimeException("This type doesn't have a canonical name"); + public final String fqName; + private final boolean primitive; + + public TypeRef(String name, String fqName) { + this.name = name; + this.primitive = fqName == null; + this.fqName = fqName == null ? name : fqName; + + int i = this.fqName.lastIndexOf('.'); + if (i == -1) { + this.className = this.fqName; + } else { + this.className = this.fqName.substring(i + 1, this.fqName.length()); } + } + + public TypeRef(TypeMirror type) { + this(type.toString()); + } + + public TypeRef(Class klass) { + this(klass.getCanonicalName(), klass.getCanonicalName()); + } - return canonicalName; + public TypeRef(String fqName) { + this(fqName, fqName); } public boolean isPrimitive() { - return canonicalName == null; + return primitive; } - public TypeRef(String name, String canonicalName) { - this.name = name; - this.canonicalName = canonicalName; + public boolean inUnnamedPackage() { + return fqName.indexOf('.') == -1; + } + + public String packageName() { + int i = fqName.lastIndexOf('.'); + + if (i == -1) { + throw new RuntimeException("This type is in the unnamed package: " + name); + } + + return fqName.substring(0, i); } @Override @@ -45,17 +75,17 @@ public class TypeRef implements Comparable { TypeRef classRef = (TypeRef) o; - return canonicalName.equals(classRef.canonicalName); + return fqName.equals(classRef.fqName); } @Override public int hashCode() { - return canonicalName.hashCode(); + return fqName.hashCode(); } @Override public int compareTo(TypeRef o) { - return canonicalName.compareTo(o.canonicalName); + return fqName.compareTo(o.fqName); } public static TypeRef find(TypeKind kind) { -- cgit v1.2.3