Utilities to resolve Java methods and fields

This commit is contained in:
Pavel V. Talanov
2014-05-20 14:31:53 +04:00
parent 1488584acf
commit b02d4b0669
3 changed files with 47 additions and 7 deletions
@@ -19,10 +19,17 @@ package org.jetbrains.jet.lang.resolve.java
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.lang.resolve.java.structure.JavaField
import org.jetbrains.jet.lang.resolve.java.structure.JavaMember
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
import org.jetbrains.jet.lang.resolve.java.sources.JavaSourceElement
import org.jetbrains.jet.lang.resolve.java.structure.JavaElement
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithSource
public class JavaDescriptorResolver(public val packageFragmentProvider: LazyJavaPackageFragmentProvider, private val module: ModuleDescriptor) {
public fun resolveClass(javaClass: JavaClass): ClassDescriptor? {
@@ -37,3 +44,31 @@ public class JavaDescriptorResolver(public val packageFragmentProvider: LazyJava
public val JAVA_ROOT: Name = Name.special("<java_root>")
}
}
public fun JavaDescriptorResolver.resolveMethod(method: JavaMethod): FunctionDescriptor? {
val functions = if (method.isConstructor())
resolveClass(method.getContainingClass())?.getConstructors()
else
getContainingScope(method)?.getFunctions(method.getName())
return functions?.findByJavaElement(method)
}
public fun JavaDescriptorResolver.resolveField(field: JavaField): PropertyDescriptor? {
return getContainingScope(field)?.getProperties(field.getName())?.findByJavaElement(field) as? PropertyDescriptor
}
private fun JavaDescriptorResolver.getContainingScope(method: JavaMember): JetScope? {
val containingClass = method.getContainingClass()
return if (method.isStatic())
getPackageFragment(containingClass)?.getMemberScope()
else
resolveClass(containingClass)?.getDefaultType()?.getMemberScope()
}
private fun <T : DeclarationDescriptorWithSource> Collection<T>.findByJavaElement(javaElement: JavaElement): T? {
return firstOrNull {
member ->
(member.getSource() as? JavaSourceElement)?.javaElement == javaElement
}
}
@@ -19,6 +19,10 @@ package org.jetbrains.jet.lang.resolve.java.sources
import org.jetbrains.jet.lang.resolve.java.structure.JavaElement
import org.jetbrains.jet.lang.descriptors.SourceElement
trait JavaSourceElementFactory {
fun source(javaElement: JavaElement): SourceElement
public trait JavaSourceElementFactory {
public fun source(javaElement: JavaElement): JavaSourceElement
}
public trait JavaSourceElement: SourceElement {
public val javaElement: JavaElement
}