Skip to content

Commit

Permalink
refactor(java): refactor Java toolchain provider and related classes #14
Browse files Browse the repository at this point in the history


Refactor Java toolchain provider and related classes to improve structure and readability.
  • Loading branch information
phodal committed Jun 16, 2024
1 parent 576629a commit 8b0cc75
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.phodal.shirelang.java.impl
package com.phodal.shirelang.java.variable

import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
Expand All @@ -10,6 +10,7 @@ import com.phodal.shirecore.provider.PsiContextVariableProvider
import com.phodal.shirecore.provider.ToolchainPrepareContext
import com.phodal.shirecore.provider.ToolchainProvider
import com.phodal.shirelang.java.toolchain.getContainingClass
import com.phodal.shirelang.java.variable.provider.JavaRelatedClassesProvider
import kotlinx.coroutines.runBlocking

class JavaPsiContextVariableProvider : PsiContextVariableProvider {
Expand All @@ -32,7 +33,12 @@ class JavaPsiContextVariableProvider : PsiContextVariableProvider {
}

PsiVariable.RELATED_CLASSES -> {
return listOf<String>()
return when(psiElement.parent) {
is PsiMethod -> {
JavaRelatedClassesProvider().lookup(psiElement.parent!! as PsiMethod).joinToString("\n") { it.text }
}
else -> ""
}
}

PsiVariable.SIMILAR_TEST_CASE -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.phodal.shirelang.java.impl
package com.phodal.shirelang.java.variable

import com.intellij.lang.java.JavaLanguage
import com.intellij.openapi.module.Module
Expand Down Expand Up @@ -35,7 +35,6 @@ class JavaToolchainProvider : ToolchainProvider {
return collectJavaVersion(context, project)?.let { listOf(it) } ?: emptyList()
}


private fun collectJavaVersion(
context: ToolchainPrepareContext,
project: Project,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.phodal.shirelang.java.variable.provider

import com.intellij.openapi.roots.ProjectFileIndex
import com.intellij.psi.*
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.util.PsiUtil

class JavaRelatedClassesProvider {
fun lookup(method: PsiMethod): List<PsiClass> {
val relatedClasses = findRelatedClasses(method)
val cleanedUpClasses = relatedClasses.flatMap { findSuperClasses(it) }.map { cleanUp(it) }
return cleanedUpClasses.toList()
}

fun cleanUp(psiClass: PsiClass): PsiClass {
val psiElement = psiClass.copy() as PsiClass
psiElement.containingFile.setName(psiClass.containingFile.name)
val members = PsiTreeUtil.findChildrenOfType(psiElement, PsiMember::class.java)

for (element in members) {
if (element is PsiMethod) {
element.body?.delete()
element.docComment?.delete()
}
}

val removableMembers = members.filter { canBeRemoved(it) }
removableMembers.forEach { it.delete() }

psiElement.docComment?.delete()
return psiElement
}

private fun findSuperClasses(psiClass: PsiClass): List<PsiClass> {
val superClass = psiClass.superClass ?: return emptyList()
if (isProjectContent(superClass)) {
return listOf(psiClass.superClass!!, psiClass)
}

if (isProjectContent(psiClass)) {
return listOf(psiClass)
}

return emptyList()
}

private fun canBeRemoved(member: PsiMember): Boolean {
val modifierList = member.modifierList
if (modifierList?.hasModifierProperty("public") != true) {
val annotations = member.annotations
if (annotations.isEmpty()) {
return true
}
}

return false
}

private fun findRelatedClasses(method: PsiMethod): List<PsiClass> {
val parameters = method.parameterList.parameters
val parameterTypes = parameters.map { it.type }
val genericTypes = parameters.flatMap { (it.type as? PsiClassType)?.parameters?.toList() ?: emptyList() }
val mentionedTypes = parameterTypes + method.returnType + genericTypes
val relatedTypes = mentionedTypes.filterIsInstance<PsiClassType>()
val resolvedClasses = relatedTypes.mapNotNull { it.resolve() }
val projectContentClasses = resolvedClasses.filter { isProjectContent(it) }
return projectContentClasses.toList()
}

fun isProjectContent(element: PsiElement): Boolean {
val virtualFile = PsiUtil.getVirtualFile(element)
return virtualFile == null || ProjectFileIndex.getInstance(element.project).isInContent(virtualFile)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

<shireToolchainProvider
language="JAVA"
implementationClass="com.phodal.shirelang.java.impl.JavaToolchainProvider"/>
implementationClass="com.phodal.shirelang.java.variable.JavaToolchainProvider"/>

<shireRunProjectService
implementation="com.phodal.shirelang.java.impl.JavaRunProjectService"/>
Expand All @@ -27,7 +27,7 @@

<shirePsiVariableProvider
language="JAVA"
implementationClass="com.phodal.shirelang.java.impl.JavaPsiContextVariableProvider"/>
implementationClass="com.phodal.shirelang.java.variable.JavaPsiContextVariableProvider"/>

<shireElementStrategyBuilder implementation="com.phodal.shirelang.java.impl.JavaElementStrategyBuilder"/>
</extensions>
Expand Down

0 comments on commit 8b0cc75

Please sign in to comment.