@@ -3,19 +3,17 @@ package org.tabooproject.development
3
3
import com.intellij.openapi.module.ModuleUtilCore
4
4
import com.intellij.openapi.roots.OrderEnumerator
5
5
import com.intellij.psi.*
6
+ import com.intellij.psi.search.GlobalSearchScope
6
7
import com.intellij.psi.util.PsiTreeUtil
7
8
import okhttp3.OkHttpClient
8
9
import okhttp3.Request
9
10
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.*
15
13
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
17
16
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
18
- import org.jetbrains.kotlin.utils.IDEAPluginsCompatibilityAPI
19
17
import java.io.IOException
20
18
import java.net.InetSocketAddress
21
19
import java.net.Proxy
@@ -105,8 +103,50 @@ fun PsiClass.getContainingPackageName(): String? {
105
103
return containingPackage?.qualifiedName
106
104
}
107
105
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
+
108
118
private fun isPackageInProject (file : PsiFile , packageName : String ): Boolean {
109
119
val module = ModuleUtilCore .findModuleForPsiElement(file) ? : return false
110
120
val orderEnumerator = OrderEnumerator .orderEntries(module).recursively().librariesOnly().classes()
111
121
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
+ }
112
152
}
0 commit comments