Skip to content

Commit 9e812a7

Browse files
committed
It suddenly occurred to me, type should be layered
, to handle TS types that are in the format as Java types
1 parent 9244fb3 commit 9e812a7

File tree

5 files changed

+142
-18
lines changed

5 files changed

+142
-18
lines changed

src/main/java/com/probejs/rewrite/doc/DocClazz.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class DocClazz implements CommentHolder {
2424
private final DocComment comment;
2525
private final ClazzPath path;
2626
private final List<DocType> assignables;
27+
private final ClassInfo info;
2728

2829
private DocClazz(Class<?> clazz) {
2930
//doc properties
@@ -33,6 +34,7 @@ private DocClazz(Class<?> clazz) {
3334
this.assignables = new ArrayList<>();
3435
this.comment = new DocComment();
3536
//properties from ClassInfo
37+
this.info = cInfo;
3638
this.fields = cInfo.getFields().stream().map(DocField::new).collect(Collectors.toList());
3739
this.methods = cInfo.getMethods().stream().map(DocMethod::new).collect(Collectors.toList());
3840
}
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
package com.probejs.rewrite.doc.type;
22

3-
import com.probejs.info.type.IType;
4-
import com.probejs.info.type.TypeArray;
5-
import com.probejs.info.type.TypeClass;
3+
import com.probejs.rewrite.doc.type.java.JavaType;
4+
import com.probejs.rewrite.doc.type.java.TypeArray;
65
import com.probejs.rewrite.doc.type.java.TypeClazz;
76

7+
import java.lang.reflect.GenericArrayType;
8+
import java.lang.reflect.Type;
89
import java.util.HashMap;
910
import java.util.Map;
1011
import java.util.function.Function;
1112

1213
public abstract class DocTypeResolver {
1314

14-
private static final Map<Class<? extends IType>, Function<IType, DocType>> REGISTRIES;
15+
private static final Map<Class<? extends Type>, Function<Type, JavaType>> JAVA;
1516

1617
static {
17-
REGISTRIES = new HashMap<>();
18-
REGISTRIES.put(TypeClass.class, TypeClazz::new);
19-
REGISTRIES.put(TypeArray.class, com.probejs.rewrite.doc.type.java.TypeArray::new);
18+
JAVA = new HashMap<>();
19+
JAVA.put(Class.class, TypeClazz::new);
20+
JAVA.put(GenericArrayType.class, TypeArray::new);
2021
}
2122

22-
public static DocType of(IType type) {
23-
return REGISTRIES.get(type.getClass()).apply(type);
23+
public static JavaType ofJava(Type type) {
24+
return JAVA.get(type.getClass()).apply(type);
2425
}
2526
}
Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,65 @@
11
package com.probejs.rewrite.doc.type.java;
22

3-
import com.probejs.info.type.IType;
4-
import com.probejs.rewrite.doc.type.DocType;
53
import com.probejs.rewrite.doc.type.DocTypeResolver;
64
import lombok.Getter;
75

6+
import java.lang.reflect.GenericArrayType;
7+
import java.lang.reflect.Type;
8+
import java.util.Collection;
9+
810
@Getter
9-
public class TypeArray implements DocType {
11+
public class TypeArray implements JavaType {
12+
13+
private final JavaType base;
14+
private final boolean isGenericArray;
15+
16+
/**
17+
* @return {@code type instanceof GenericArrayType}
18+
*/
19+
public static boolean isGenericArray(Type type) {
20+
return type instanceof GenericArrayType;
21+
}
1022

11-
private final DocType base;
23+
/**
24+
* @return true if it can be cast into {@code Class<?>} and {@code ((Class<?>) type).isArray()}
25+
* is true, otherwise false
26+
*/
27+
public static boolean isClassArray(Type type) {
28+
if (type instanceof Class<?> clazz) {
29+
return clazz.isArray();
30+
}
31+
return false;
32+
}
33+
34+
public static boolean test(Type type) {
35+
return isGenericArray(type) || isClassArray(type);
36+
}
37+
38+
public TypeArray(Type type) {
39+
if (isGenericArray(type)) {
40+
this.base = DocTypeResolver.ofJava(((GenericArrayType) type).getGenericComponentType());
41+
isGenericArray = true;
42+
} else if (isClassArray(type)) {
43+
assert type instanceof Class<?>;
44+
this.base = DocTypeResolver.ofJava(((Class<?>) type).getComponentType());
45+
isGenericArray = false;
46+
} else {
47+
throw new IllegalArgumentException("Argument 'type' is not array");
48+
}
49+
}
50+
51+
@Override
52+
public Type raw() {
53+
return base.raw();
54+
}
55+
56+
@Override
57+
public JavaType base() {
58+
return base;
59+
}
1260

13-
public TypeArray(IType type) {
14-
this.base = DocTypeResolver.of(type.getBase());
61+
@Override
62+
public Collection<Class<?>> relatedClasses() {
63+
return base.relatedClasses();
1564
}
1665
}

src/main/java/com/probejs/rewrite/doc/type/java/TypeClazz.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@
88
import com.probejs.rewrite.doc.type.DocType;
99
import lombok.Getter;
1010

11+
import java.lang.reflect.Type;
12+
import java.util.Collection;
13+
import java.util.List;
14+
1115
@Getter
12-
public class TypeClazz implements DocType {
16+
public class TypeClazz implements JavaType {
1317

1418
private final ClazzPath path;
1519
private final DocClazz doc;
@@ -25,7 +29,24 @@ public class TypeClazz implements DocType {
2529
this(clazz.getRaw());
2630
}
2731

28-
public TypeClazz(IType iType) {
29-
this(((TypeClass) iType).getRaw());
32+
public TypeClazz(Type type) {
33+
34+
this(ClassInfo.ofCache((Class<?>) type));
35+
}
36+
37+
@Override
38+
public Type raw() {
39+
return doc.getInfo().getRaw();
40+
}
41+
42+
@Override
43+
public JavaType base() {
44+
return this;
45+
}
46+
47+
@Override
48+
public Collection<Class<?>> relatedClasses() {
49+
//TODO: could be related to ClassWalker
50+
return List.of();
3051
}
3152
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.probejs.rewrite.doc.type.java;
2+
3+
import com.probejs.rewrite.doc.type.DocTypeResolver;
4+
import lombok.val;
5+
6+
import java.lang.reflect.ParameterizedType;
7+
import java.lang.reflect.Type;
8+
import java.util.ArrayList;
9+
import java.util.Arrays;
10+
import java.util.Collection;
11+
import java.util.List;
12+
import java.util.stream.Collectors;
13+
14+
/**
15+
* "List<String>"
16+
* @author ZZZank
17+
*/
18+
public class TypeParameterized implements JavaType {
19+
20+
private final JavaType base;
21+
private final List<JavaType> params;
22+
23+
public TypeParameterized(Type parameterized) {
24+
assert parameterized instanceof ParameterizedType;
25+
val type = (ParameterizedType) parameterized;
26+
this.base = DocTypeResolver.ofJava(type.getRawType());
27+
this.params = Arrays.stream(type.getActualTypeArguments())
28+
.map(DocTypeResolver::ofJava)
29+
.collect(Collectors.toList());
30+
}
31+
32+
@Override
33+
public Type raw() {
34+
return null;
35+
}
36+
37+
@Override
38+
public JavaType base() {
39+
return base;
40+
}
41+
42+
@Override
43+
public Collection<Class<?>> relatedClasses() {
44+
val related = new ArrayList<Class<?>>(1+params.size()+1);
45+
related.addAll(base.relatedClasses());
46+
for (val param : params) {
47+
related.addAll(param.relatedClasses());
48+
}
49+
return related;
50+
}
51+
}

0 commit comments

Comments
 (0)