Create from usage: Support extension members for Java classes
This commit is contained in:
+34
-2
@@ -29,6 +29,15 @@ import org.jetbrains.kotlin.resolve.jvm.resolveMethod
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaMethodImpl
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaConstructorImpl
|
||||
import org.jetbrains.kotlin.resolve.jvm.resolveConstructor
|
||||
import com.intellij.psi.PsiClass
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
|
||||
import com.intellij.psi.PsiField
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.resolve.jvm.resolveField
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaFieldImpl
|
||||
import com.intellij.psi.PsiMember
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
|
||||
public object JavaResolveExtension : CacheExtension<(PsiElement) -> Pair<JavaDescriptorResolver, BindingContext>> {
|
||||
override val platform: TargetPlatform = TargetPlatform.JVM
|
||||
@@ -48,8 +57,6 @@ public object JavaResolveExtension : CacheExtension<(PsiElement) -> Pair<JavaDes
|
||||
}
|
||||
|
||||
fun PsiMethod.getJavaMethodDescriptor(): FunctionDescriptor {
|
||||
if (this is KotlinLightMethod) throw AssertionError("Light methods are not allowed here: ${getOrigin()?.getText()}")
|
||||
|
||||
val resolver = JavaResolveExtension.getResolver(getProject(), this)
|
||||
val methodDescriptor = when {
|
||||
this.isConstructor() -> resolver.resolveConstructor(JavaConstructorImpl(this))
|
||||
@@ -59,3 +66,28 @@ fun PsiMethod.getJavaMethodDescriptor(): FunctionDescriptor {
|
||||
|
||||
return methodDescriptor!!
|
||||
}
|
||||
|
||||
fun PsiClass.getJavaClassDescriptor(): ClassDescriptor {
|
||||
val resolver = JavaResolveExtension.getResolver(getProject(), this)
|
||||
val classDescriptor = resolver.resolveClass(JavaClassImpl(this))
|
||||
assert(classDescriptor != null) { "No descriptor found for " + getText() }
|
||||
|
||||
return classDescriptor!!
|
||||
}
|
||||
|
||||
fun PsiField.getJavaFieldDescriptor(): PropertyDescriptor {
|
||||
val resolver = JavaResolveExtension.getResolver(getProject(), this)
|
||||
val fieldDescriptor = resolver.resolveField(JavaFieldImpl(this))
|
||||
assert(fieldDescriptor != null) { "No descriptor found for " + getText() }
|
||||
|
||||
return fieldDescriptor!!
|
||||
}
|
||||
|
||||
fun PsiMember.getJavaMemberDescriptor(): DeclarationDescriptor? {
|
||||
return when (this) {
|
||||
is PsiClass -> getJavaClassDescriptor()
|
||||
is PsiMethod -> getJavaMethodDescriptor()
|
||||
is PsiField -> getJavaFieldDescriptor()
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user