From ccb80c7a31372b8ea25e20e1405b9d00f6f443ff Mon Sep 17 00:00:00 2001
From: Pavel Vojtechovsky
Date: Mon, 3 Apr 2017 19:48:51 +0200
Subject: [PATCH 1/2] feature: CtTypeInformation#getTypeErasure()
---
.../declaration/CtTypeInformation.java | 7 +
.../reflect/declaration/CtTypeImpl.java | 5 +
.../declaration/CtTypeParameterImpl.java | 14 ++
.../CtIntersectionTypeReferenceImpl.java | 8 ++
.../CtTypeParameterReferenceImpl.java | 5 +
.../reference/CtTypeReferenceImpl.java | 10 ++
.../test/ctType/CtTypeParameterTest.java | 127 ++++++++++++++++++
.../ctType/testclasses/ErasureModelA.java | 52 +++++++
8 files changed, 228 insertions(+)
create mode 100644 src/test/java/spoon/test/ctType/CtTypeParameterTest.java
create mode 100644 src/test/java/spoon/test/ctType/testclasses/ErasureModelA.java
diff --git a/src/main/java/spoon/reflect/declaration/CtTypeInformation.java b/src/main/java/spoon/reflect/declaration/CtTypeInformation.java
index 9e82f234d20..341398724fe 100644
--- a/src/main/java/spoon/reflect/declaration/CtTypeInformation.java
+++ b/src/main/java/spoon/reflect/declaration/CtTypeInformation.java
@@ -160,4 +160,11 @@ public interface CtTypeInformation {
@DerivedProperty
Collection> getAllExecutables();
+ /**
+ * @return type (not generic one), which is used by java compiler to ensure that no new classes are created for parameterized types;
+ * consequently, generics incur no runtime overhead.
+ * See https://docs.oracle.com/javase/tutorial/java/generics/erasure.html
+ */
+ @DerivedProperty
+ CtTypeReference> getTypeErasure();
}
diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java
index 14588555ae3..297b2dd5050 100644
--- a/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java
+++ b/src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java
@@ -880,6 +880,11 @@ public void accept(CtMethod> method) {
return Collections.unmodifiableSet(l);
}
+ @Override
+ public CtTypeReference> getTypeErasure() {
+ return getReference();
+ }
+
boolean isShadow;
@Override
diff --git a/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java b/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java
index af54b4c9cf1..decc3995c61 100644
--- a/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java
+++ b/src/main/java/spoon/support/reflect/declaration/CtTypeParameterImpl.java
@@ -248,6 +248,20 @@ public boolean isSubtypeOf(CtTypeReference> type) {
return getReference().isSubtypeOf(type);
}
+ @Override
+ public CtTypeReference> getTypeErasure() {
+ CtTypeReference> boundType = getBound(this);
+ return boundType.getTypeErasure();
+ }
+
+ private static CtTypeReference> getBound(CtTypeParameter typeParam) {
+ CtTypeReference> bound = typeParam.getSuperclass();
+ if (bound == null) {
+ bound = typeParam.getFactory().Type().OBJECT;
+ }
+ return bound;
+ }
+
@Override
@UnsettableProperty
public > C addMethod(CtMethod method) {
diff --git a/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java
index adb2a9f6344..2a7fe2ee989 100644
--- a/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java
+++ b/src/main/java/spoon/support/reflect/reference/CtIntersectionTypeReferenceImpl.java
@@ -73,6 +73,14 @@ public boolean removeBound(CtTypeReference> bound) {
return bounds != CtElementImpl.>emptyList() && bounds.remove(bound);
}
+ @Override
+ public CtTypeReference> getTypeErasure() {
+ if (bounds == null || bounds.isEmpty()) {
+ return getFactory().Type().OBJECT;
+ }
+ return bounds.get(0).getTypeErasure();
+ }
+
@Override
public CtIntersectionTypeReference clone() {
return (CtIntersectionTypeReference) super.clone();
diff --git a/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java b/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java
index 8eb41eca8a1..42627c0552c 100644
--- a/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java
+++ b/src/main/java/spoon/support/reflect/reference/CtTypeParameterReferenceImpl.java
@@ -199,6 +199,11 @@ public CtType