Skip to content

Commit 9853417

Browse files
committed
refactor: update pure context for design
1 parent d321afe commit 9853417

File tree

2 files changed

+108
-4
lines changed

2 files changed

+108
-4
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package cc.unitmesh.idea.service
2+
3+
import com.intellij.openapi.roots.ProjectFileIndex
4+
import com.intellij.psi.*
5+
import com.intellij.psi.util.PsiTreeUtil
6+
import com.intellij.psi.util.PsiUtil
7+
import org.jetbrains.annotations.NotNull
8+
import org.jetbrains.annotations.Nullable
9+
10+
object JavaRelatedContext {
11+
fun findRelatedClassesAndCleanUp(method: PsiMethod): List<PsiClass> {
12+
val relatedClasses = findRelatedClasses(method)
13+
val cleanedUpClasses = relatedClasses.flatMap { findSuperClasses(it) }.map { cleanUp(it) }
14+
return cleanedUpClasses.toList()
15+
}
16+
17+
fun createDescription(psiClass: PsiClass?): String {
18+
if (psiClass == null) {
19+
return ""
20+
}
21+
22+
val containingFile = psiClass.containingFile
23+
val fileHeader = if (containingFile is PsiJavaFile) {
24+
val packageStatement = containingFile.packageStatement?.text ?: ""
25+
val importList = containingFile.importList?.text ?: ""
26+
"$packageStatement\n \n$importList\n\n"
27+
} else {
28+
""
29+
}
30+
31+
val name = containingFile.name
32+
val classDescription = "File: $name\n```Java\n$fileHeader${psiClass.text}\n```\n"
33+
return classDescription
34+
}
35+
36+
fun prepareContainingClassContext(@NotNull method: PsiMethod): PsiClass? {
37+
val file = method.containingFile.copy() as PsiFile
38+
val containingClass = method.containingClass ?: return null
39+
val psiElement = PsiTreeUtil.findSameElementInCopy(method, file)
40+
val createCommentFromText = PsiElementFactory.getInstance(method.project)
41+
.createCommentFromText("// TODO: write unit tests", null)
42+
psiElement.parent?.addBefore(createCommentFromText, psiElement)
43+
return containingClass
44+
}
45+
46+
private fun cleanUp(psiClass: PsiClass): PsiClass {
47+
val psiElement = psiClass.copy() as PsiClass
48+
psiElement.containingFile.setName(psiClass.containingFile.name)
49+
val members = PsiTreeUtil.findChildrenOfType(psiElement, PsiMember::class.java)
50+
51+
for (element in members) {
52+
if (element is PsiMethod) {
53+
element.body?.delete()
54+
element.docComment?.delete()
55+
}
56+
}
57+
58+
val removableMembers = members.filter { canBeRemoved(it) }
59+
removableMembers.forEach { it.delete() }
60+
61+
psiElement.docComment?.delete()
62+
return psiElement
63+
}
64+
65+
private fun findSuperClasses(psiClass: PsiClass): List<PsiClass> {
66+
return generateSequence(psiClass) { it.superClass }.toList()
67+
}
68+
69+
private fun canBeRemoved(member: PsiMember): Boolean {
70+
val modifierList = member.modifierList
71+
if (modifierList?.hasModifierProperty("public") != true) {
72+
val annotations = member.annotations
73+
if (annotations.isEmpty()) {
74+
return true
75+
}
76+
}
77+
78+
return false
79+
}
80+
81+
private fun findRelatedClasses(method: PsiMethod): List<PsiClass> {
82+
val parameters = method.parameterList.parameters
83+
val parameterTypes = parameters.map { it.type }
84+
val genericTypes = parameters.flatMap { (it.type as? PsiClassType)?.parameters?.toList() ?: emptyList() }
85+
val mentionedTypes = parameterTypes + method.returnType + genericTypes
86+
val relatedTypes = mentionedTypes.filterIsInstance<PsiClassType>()
87+
val resolvedClasses = relatedTypes.mapNotNull { it.resolve() }
88+
val projectContentClasses = resolvedClasses.filter { isProjectContent(it) }
89+
return projectContentClasses.toList()
90+
}
91+
92+
private fun isProjectContent(element: PsiElement): Boolean {
93+
val virtualFile = PsiUtil.getVirtualFile(element)
94+
return virtualFile == null || ProjectFileIndex.getInstance(element.project).isInContent(virtualFile)
95+
}
96+
}

java/src/main/kotlin/cc/unitmesh/idea/service/JavaWriteTestService.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,12 +94,20 @@ class JavaWriteTestService : WriteTestService() {
9494
val elements = mutableListOf<ClassContext>()
9595
val projectPath = project.guessProjectDir()?.path
9696

97-
val resolvedClasses = JavaTypeUtil.resolveByMethod(element)
97+
val resolvedClasses: MutableMap<String, PsiClass?> = mutableMapOf()
9898
resolvedClasses.putAll(JavaTypeUtil.resolveByField(element))
9999

100-
if (element is PsiClass) {
101-
element.methods.forEach { method ->
102-
resolvedClasses.putAll(JavaTypeUtil.resolveByMethod(method))
100+
when (element) {
101+
is PsiClass -> {
102+
element.methods.forEach { method ->
103+
resolvedClasses.putAll(JavaTypeUtil.resolveByMethod(method))
104+
}
105+
}
106+
107+
is PsiMethod -> {
108+
JavaRelatedContext.findRelatedClassesAndCleanUp(element).forEach { psiClass ->
109+
resolvedClasses[psiClass.name!!] = psiClass
110+
}
103111
}
104112
}
105113

0 commit comments

Comments
 (0)