Skip to content

Commit 2897dd7

Browse files
committed
feat: try to handle for basic class issues
1 parent 687b04a commit 2897dd7

File tree

3 files changed

+55
-38
lines changed

3 files changed

+55
-38
lines changed

java/src/main/kotlin/cc/unitmesh/idea/DtModelExt.kt

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ fun fromJavaFile(file: PsiJavaFileImpl?): DtClass {
1616
}
1717
}
1818

19+
private val classCache = mutableMapOf<String, DtClass>()
20+
21+
1922
fun DtClass.Companion.formatPsi(psiClass: PsiClass): String {
2023
return fromPsi(psiClass).commentFormat()
2124
}
@@ -24,39 +27,46 @@ fun DtClass.Companion.fromJavaFile(file: PsiFile): DtClass {
2427
return fromJavaFile(file as? PsiJavaFileImpl)
2528
}
2629

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+
}
3534

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 }
4136

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:", "")
6041
)
6142
}
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
6272
}

java/src/main/kotlin/cc/unitmesh/idea/flow/MvcContextService.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,17 @@ class MvcContextService(private val project: Project) {
3232
}
3333
}
3434

35-
private fun filterImportByRegex(allImportStatements: Array<out PsiImportStatementBase>?, regex: Regex) =
36-
allImportStatements?.filter {
35+
private val importCache = mutableMapOf<String, List<PsiClass>>()
36+
private fun filterImportByRegex(allImportStatements: Array<out PsiImportStatementBase>?, regex: Regex): List<PsiClass> {
37+
return allImportStatements?.filter {
3738
it.importReference?.text?.lowercase()?.matches(regex) ?: false
3839
}?.mapNotNull {
3940
val importText = it.importReference?.text ?: return@mapNotNull null
40-
javaPsiFacade.findClass(importText, searchScope)
41-
} ?: emptyList()
41+
importCache.getOrPut(importText) {
42+
javaPsiFacade.findClasses(importText, searchScope).toList()
43+
}
44+
}?.flatten() ?: emptyList()
45+
}
4246

4347
fun servicePrompt(psiFile: PsiFile?): String {
4448
val file = psiFile as? PsiJavaFileImpl
@@ -63,8 +67,8 @@ ${relevantModel?.joinToString("\n")}
6367
fun controllerPrompt(psiFile: PsiFile?): String {
6468
val file = psiFile as? PsiJavaFileImpl
6569
val context = prepareControllerContext(file)
66-
val services = context?.services?.map(DtClass.Companion::formatPsi)
67-
val models = context?.models?.map(DtClass.Companion::formatPsi)
70+
val services = context?.services?.distinctBy { it.qualifiedName }?.map(DtClass.Companion::formatPsi)
71+
val models = context?.models?.distinctBy { it.qualifiedName }?.map(DtClass.Companion::formatPsi)
6872

6973
val relevantModel = (services ?: emptyList()) + (models ?: emptyList())
7074

src/main/kotlin/cc/unitmesh/devti/context/model/DtClass.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@ class DtClass(
3838
var getterSetter: List<String> = listOf()
3939
val methodsWithoutGetterSetter = methods
4040
.filter { method ->
41-
val isGetter = method.name.startsWith("get") && method.parameters.isEmpty()
41+
val isGetter = method.name.startsWith("get")
42+
&& method.parameters.isEmpty()
43+
&& !(method.name.contains("By") || method.name.contains("With") || method.name.contains("And"))
44+
4245
val isSetter = method.name.startsWith("set") && method.parameters.size == 1
4346
if (isGetter || isSetter) {
4447
getterSetter = listOf(method.name)

0 commit comments

Comments
 (0)