From 5b6bcd325b8a30a199275915236e09d2251b0586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 25 Sep 2015 20:42:01 +0300 Subject: [PATCH] Provide access to enclosing type --- .../java/com/mysema/codegen/model/ClassType.java | 13 ++++++++++++- .../com/mysema/codegen/model/SimpleType.java | 16 +++++++++++++++- src/main/java/com/mysema/codegen/model/Type.java | 2 ++ .../com/mysema/codegen/model/TypeAdapter.java | 5 +++++ .../com/mysema/codegen/model/ClassTypeTest.java | 10 +++++++--- .../com/mysema/codegen/model/SimpleTypeTest.java | 8 ++++++++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/mysema/codegen/model/ClassType.java b/src/main/java/com/mysema/codegen/model/ClassType.java index d74c9d2d9..a98b6f9f5 100644 --- a/src/main/java/com/mysema/codegen/model/ClassType.java +++ b/src/main/java/com/mysema/codegen/model/ClassType.java @@ -35,7 +35,7 @@ public class ClassType implements Type { private final List parameters; - private Type arrayType, componentType; + private Type arrayType, componentType, enclosingType; public ClassType(Class javaClass, Type... parameters) { this(TypeCategory.SIMPLE, javaClass, Arrays.asList(parameters)); @@ -98,6 +98,17 @@ public class ClassType implements Type { return componentType; } + @Override + public Type getEnclosingType() { + if (enclosingType == null) { + Class enclosingClass = javaClass.getEnclosingClass(); + if (enclosingClass != null) { + enclosingType = new ClassType(enclosingClass); + } + } + return enclosingType; + } + @Override public String getFullName() { return className; diff --git a/src/main/java/com/mysema/codegen/model/SimpleType.java b/src/main/java/com/mysema/codegen/model/SimpleType.java index 797965731..a09f42961 100644 --- a/src/main/java/com/mysema/codegen/model/SimpleType.java +++ b/src/main/java/com/mysema/codegen/model/SimpleType.java @@ -43,7 +43,7 @@ public class SimpleType implements Type { private final boolean primitiveClass, finalClass; - private Type arrayType, componentType; + private Type arrayType, componentType, enclosingType; private transient Class javaClass; @@ -144,6 +144,20 @@ public class SimpleType implements Type { } } + @Override + public Type getEnclosingType() { + if (enclosingType == null && localName.contains(".")) { + String newLocalName = localName.substring(0, localName.lastIndexOf('.')); + String newSimpleName = newLocalName.substring(newLocalName.lastIndexOf('.') + 1); + String newFullName = newLocalName; + if (packageName.length() > 0) { + newFullName = packageName + "." + newLocalName; + } + enclosingType = new SimpleType(newFullName, packageName, newSimpleName); + } + return enclosingType; + } + @Override public String getFullName() { return fullName; diff --git a/src/main/java/com/mysema/codegen/model/Type.java b/src/main/java/com/mysema/codegen/model/Type.java index cd76872ca..6ac040645 100644 --- a/src/main/java/com/mysema/codegen/model/Type.java +++ b/src/main/java/com/mysema/codegen/model/Type.java @@ -27,6 +27,8 @@ public interface Type { Type getComponentType(); + Type getEnclosingType(); + TypeCategory getCategory(); String getFullName(); diff --git a/src/main/java/com/mysema/codegen/model/TypeAdapter.java b/src/main/java/com/mysema/codegen/model/TypeAdapter.java index a81218d5c..fa3e43fc9 100644 --- a/src/main/java/com/mysema/codegen/model/TypeAdapter.java +++ b/src/main/java/com/mysema/codegen/model/TypeAdapter.java @@ -45,6 +45,11 @@ public class TypeAdapter implements Type { return type.getComponentType(); } + @Override + public Type getEnclosingType() { + return type.getEnclosingType(); + } + @Override public boolean equals(Object o) { return type.equals(o); diff --git a/src/test/java/com/mysema/codegen/model/ClassTypeTest.java b/src/test/java/com/mysema/codegen/model/ClassTypeTest.java index 05b275909..944e815d2 100644 --- a/src/test/java/com/mysema/codegen/model/ClassTypeTest.java +++ b/src/test/java/com/mysema/codegen/model/ClassTypeTest.java @@ -5,9 +5,7 @@ */ package com.mysema.codegen.model; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import java.util.Collections; import java.util.Map; @@ -110,4 +108,10 @@ public class ClassTypeTest { // assertEquals("long", Types.LONG.getPrimitiveName()); // assertEquals("short", Types.SHORT.getPrimitiveName()); // } + + @Test + public void getEnclosingType() { + assertEquals(new ClassType(ClassTypeTest.class), new ClassType(Inner.class).getEnclosingType()); + assertNull(new ClassType(ClassTypeTest.class).getEnclosingType()); + } } diff --git a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java index eebe1e9fd..92c3a2115 100644 --- a/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java +++ b/src/test/java/com/mysema/codegen/model/SimpleTypeTest.java @@ -1,6 +1,7 @@ package com.mysema.codegen.model; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import java.util.Collections; @@ -66,4 +67,11 @@ public class SimpleTypeTest { // assertEquals("int", new SimpleType(Types.INTEGER).getPrimitiveName()); // } + @Test + public void GetEnclosingType() { + assertEquals(new SimpleType(new ClassType(SimpleTypeTest.class)), + new SimpleType(new ClassType(Inner.class)).getEnclosingType()); + assertNull(new SimpleType(new ClassType(SimpleTypeTest.class)).getEnclosingType()); + } + }