aboutsummaryrefslogtreecommitdiff
path: root/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/AstTypeAnalysis.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/AstTypeAnalysis.java')
-rw-r--r--javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/AstTypeAnalysis.java56
1 files changed, 56 insertions, 0 deletions
diff --git a/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/AstTypeAnalysis.java b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/AstTypeAnalysis.java
new file mode 100644
index 000000000..1801f2d71
--- /dev/null
+++ b/javaparser-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/AstTypeAnalysis.java
@@ -0,0 +1,56 @@
+package com.github.javaparser.generator.metamodel;
+
+import com.github.javaparser.ast.NodeList;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+import java.util.EnumSet;
+import java.util.Optional;
+
+import static java.lang.reflect.Modifier.isAbstract;
+
+/**
+ * A hacky thing that collects flags we need from AST types to generate the metamodel.
+ */
+public class AstTypeAnalysis {
+ public final boolean isAbstract;
+ public boolean isOptional = false;
+ public boolean isEnumSet = false;
+ public boolean isNodeList = false;
+ public boolean isSelfType = false;
+ public Class<?> innerType;
+
+ AstTypeAnalysis(Type type) {
+ if (type instanceof Class<?>) {
+ TypeVariable<? extends Class<?>>[] typeParameters = ((Class<?>) type).getTypeParameters();
+ if (typeParameters.length > 0) {
+ isSelfType = true;
+ }
+ } else {
+ while (type instanceof ParameterizedType) {
+ ParameterizedType t = (ParameterizedType) type;
+ Type currentOuterType = t.getRawType();
+ if (currentOuterType == NodeList.class) {
+ isNodeList = true;
+ }
+ if (currentOuterType == Optional.class) {
+ isOptional = true;
+ }
+ if (currentOuterType == EnumSet.class) {
+ isEnumSet = true;
+ }
+
+ if (t.getActualTypeArguments()[0] instanceof WildcardType) {
+ type = t.getRawType();
+ isSelfType = true;
+ break;
+ }
+ type = t.getActualTypeArguments()[0];
+ }
+ }
+ innerType = (Class<?>) type;
+ isAbstract = isAbstract(innerType.getModifiers());
+ }
+}