Create from usage: Support extension members for Java classes

This commit is contained in:
Alexey Sedunov
2015-02-10 15:16:35 +03:00
parent 9f3ba50dc5
commit e75bd1b41b
4 changed files with 58 additions and 21 deletions
@@ -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
}
}