@@ -16,6 +16,9 @@ fun fromJavaFile(file: PsiJavaFileImpl?): DtClass {
16
16
}
17
17
}
18
18
19
+ private val classCache = mutableMapOf<String , DtClass >()
20
+
21
+
19
22
fun DtClass.Companion.formatPsi (psiClass : PsiClass ): String {
20
23
return fromPsi(psiClass).commentFormat()
21
24
}
@@ -24,39 +27,46 @@ fun DtClass.Companion.fromJavaFile(file: PsiFile): DtClass {
24
27
return fromJavaFile(file as ? PsiJavaFileImpl )
25
28
}
26
29
27
- fun DtClass.Companion.fromPsi (psiClass : PsiClass ): DtClass {
28
- return runReadAction {
29
- val fields = psiClass.fields.map { field ->
30
- DtField (
31
- name = field.name,
32
- type = field.type.canonicalText
33
- )
34
- }
30
+ fun DtClass.Companion.fromPsi (originClass : PsiClass ): DtClass {
31
+ classCache[originClass.qualifiedName ? : " " ]?.let {
32
+ return it
33
+ }
35
34
36
- val methods = psiClass.methods.map { method ->
37
- // if method is getter or setter, skip
38
- if (method.name.startsWith(" get" ) || method.name.startsWith(" set" )) {
39
- return @map null
40
- }
35
+ val psiClass = runReadAction { originClass.copy() as PsiClass }
41
36
42
- DtMethod (
43
- name = method.name,
44
- returnType = method.returnType?.presentableText ? : " " ,
45
- parameters = method.parameters.map { parameter ->
46
- DtParameter (
47
- name = parameter.name ? : " " ,
48
- type = parameter.type.toString().replace(" PsiType:" , " " )
49
- )
50
- }
51
- )
52
- }.filterNotNull()
53
-
54
- return @runReadAction DtClass (
55
- packageName = psiClass.qualifiedName ? : " " ,
56
- path = psiClass.containingFile?.virtualFile?.path ? : " " ,
57
- name = psiClass.name ? : " " ,
58
- methods = methods,
59
- fields = fields
37
+ val fields = psiClass.fields.map { field ->
38
+ DtField (
39
+ name = field.name,
40
+ type = field.type.toString().replace(" PsiType:" , " " )
60
41
)
61
42
}
43
+
44
+ val methods = psiClass.methods.map { method ->
45
+ // if method is getter or setter, skip
46
+ if (method.name.startsWith(" get" ) || method.name.startsWith(" set" )) {
47
+ return @map null
48
+ }
49
+
50
+ DtMethod (
51
+ name = method.name,
52
+ returnType = method.returnType?.presentableText ? : " " ,
53
+ parameters = method.parameters.map { parameter ->
54
+ DtParameter (
55
+ name = parameter.name ? : " " ,
56
+ type = parameter.type.toString().replace(" PsiType:" , " " )
57
+ )
58
+ }
59
+ )
60
+ }.filterNotNull()
61
+
62
+ val dtClass = DtClass (
63
+ packageName = psiClass.qualifiedName ? : " " ,
64
+ path = psiClass.containingFile?.virtualFile?.path ? : " " ,
65
+ name = psiClass.name ? : " " ,
66
+ methods = methods,
67
+ fields = fields
68
+ )
69
+
70
+ classCache[psiClass.qualifiedName ? : " " ] = dtClass
71
+ return dtClass
62
72
}
0 commit comments