Skip to content

Commit 5f6448c

Browse files
committed
反射getProperty和invokeMethod补全
1 parent 14916c1 commit 5f6448c

File tree

7 files changed

+311
-130
lines changed

7 files changed

+311
-130
lines changed

src/main/kotlin/org/tabooproject/development/Utils.kt

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,17 @@ package org.tabooproject.development
33
import com.intellij.openapi.module.ModuleUtilCore
44
import com.intellij.openapi.roots.OrderEnumerator
55
import com.intellij.psi.*
6+
import com.intellij.psi.search.GlobalSearchScope
67
import com.intellij.psi.util.PsiTreeUtil
78
import okhttp3.OkHttpClient
89
import okhttp3.Request
910
import org.jetbrains.kotlin.descriptors.ClassDescriptor
10-
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
11-
import org.jetbrains.kotlin.psi.KtAnnotated
12-
import org.jetbrains.kotlin.psi.KtCallExpression
13-
import org.jetbrains.kotlin.psi.KtFile
14-
import org.jetbrains.kotlin.psi.KtImportDirective
11+
import org.jetbrains.kotlin.idea.caches.resolve.analyze
12+
import org.jetbrains.kotlin.psi.*
1513
import org.jetbrains.kotlin.resolve.BindingContext
16-
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
14+
import org.jetbrains.kotlin.resolve.ImportPath
15+
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
1716
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
18-
import org.jetbrains.kotlin.utils.IDEAPluginsCompatibilityAPI
1917
import java.io.IOException
2018
import java.net.InetSocketAddress
2119
import java.net.Proxy
@@ -105,8 +103,50 @@ fun PsiClass.getContainingPackageName(): String? {
105103
return containingPackage?.qualifiedName
106104
}
107105

106+
fun isReflectContext(context: PsiElement): Boolean {
107+
val expression = PsiTreeUtil.findFirstParent(context) {
108+
it is KtCallExpression
109+
} as? KtCallExpression ?: return false
110+
val name = expression.calleeExpression?.text ?: return false
111+
if (name == "invokeMethod" || name == "getProperty" || name == "setProperty") {
112+
return true
113+
}
114+
115+
return false
116+
}
117+
108118
private fun isPackageInProject(file: PsiFile, packageName: String): Boolean {
109119
val module = ModuleUtilCore.findModuleForPsiElement(file) ?: return false
110120
val orderEnumerator = OrderEnumerator.orderEntries(module).recursively().librariesOnly().classes()
111121
return orderEnumerator.urls.any { it.contains(packageName.replace('.', '/')) }
122+
}
123+
124+
fun KtFile.checkAndImportPackage(path: String) {
125+
// 检查和引入info包
126+
val import =
127+
PsiTreeUtil.findChildrenOfType(this, KtImportDirective::class.java)
128+
val hasImport =
129+
import.any { it.importPath?.pathStr == path }
130+
if (!hasImport) {
131+
val factory = KtPsiFactory(project)
132+
val importDirective =
133+
factory.createImportDirective(ImportPath.fromString(path))
134+
importList?.add(importDirective)
135+
}
136+
}
137+
138+
val KtDotQualifiedExpression.fqName: String?
139+
get() {
140+
val receiverExpression = receiverExpression
141+
val bindingContext = receiverExpression.analyze(BodyResolveMode.PARTIAL)
142+
val type = bindingContext.get(BindingContext.EXPRESSION_TYPE_INFO, receiverExpression)?.type
143+
val classDescriptor = type?.constructor?.declarationDescriptor as? ClassDescriptor
144+
return classDescriptor?.fqNameSafe?.asString() ?: return null
145+
}
146+
147+
fun KtDotQualifiedExpression.getPsiClass(): PsiClass? {
148+
return JavaPsiFacade.getInstance(project)
149+
.findClass(fqName ?: return null, GlobalSearchScope.allScope(project)) ?: run {
150+
return null
151+
}
112152
}

src/main/kotlin/org/tabooproject/development/completion/InvokeMethodReflectCompletion.kt

Lines changed: 0 additions & 93 deletions
This file was deleted.

src/main/kotlin/org/tabooproject/development/completion/LogFuncCompletion.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,13 @@ package org.tabooproject.development.completion
22

33
import com.intellij.codeInsight.completion.*
44
import com.intellij.codeInsight.lookup.LookupElementBuilder
5-
import com.intellij.lang.java.JavaLanguage
65
import com.intellij.psi.PsiDocumentManager
7-
import com.intellij.psi.util.PsiTreeUtil
86
import com.intellij.psi.util.PsiUtilCore
97
import com.intellij.util.PlatformIcons
108
import org.jetbrains.kotlin.idea.KotlinLanguage
119
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
1210
import org.jetbrains.kotlin.psi.KtFile
13-
import org.jetbrains.kotlin.psi.KtImportDirective
14-
import org.jetbrains.kotlin.psi.KtPsiFactory
15-
import org.jetbrains.kotlin.resolve.ImportPath
11+
import org.tabooproject.development.checkAndImportPackage
1612

1713

1814
class LogFuncCompletion: CompletionContributor() {
@@ -85,17 +81,7 @@ class LogFuncCompletion: CompletionContributor() {
8581
e.printStackTrace()
8682
}
8783

88-
// 检查和引入info包
89-
val import =
90-
PsiTreeUtil.findChildrenOfType(ktFile, KtImportDirective::class.java)
91-
val hasImport =
92-
import.any { it.importPath?.pathStr == "taboolib.common.platform.function.${name}" }
93-
if (!hasImport) {
94-
val factory = KtPsiFactory(context.project)
95-
val importDirective =
96-
factory.createImportDirective(ImportPath.fromString("taboolib.common.platform.function.${name}"))
97-
ktFile.importList?.add(importDirective)
98-
}
84+
ktFile.checkAndImportPackage("taboolib.common.platform.function.${name}")
9985
}
10086
}
10187
}

0 commit comments

Comments
 (0)