From b02d4b06699854acadbd869e8c1b0c782174fbb2 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 20 May 2014 14:31:53 +0400 Subject: [PATCH] Utilities to resolve Java methods and fields --- .../resolver/JavaSourceElementFactoryImpl.kt | 7 ++-- .../resolve/java/JavaDescriptorResolver.kt | 39 ++++++++++++++++++- .../java/sources/JavaSourceElementFactory.kt | 8 +++- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSourceElementFactoryImpl.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSourceElementFactoryImpl.kt index 608533c4a17..13407ca2b2b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSourceElementFactoryImpl.kt +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSourceElementFactoryImpl.kt @@ -22,12 +22,13 @@ import org.jetbrains.jet.lang.resolve.java.structure.JavaElement import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaElementImpl import org.jetbrains.jet.lang.resolve.java.sources.JavaSourceElementFactory import org.jetbrains.jet.lang.descriptors.SourceElement +import org.jetbrains.jet.lang.resolve.java.sources.JavaSourceElement -private class JavaSourceElementImpl(val element: JavaElement) : PsiSourceElement { +private class JavaSourceElementImpl(override val javaElement: JavaElement) : PsiSourceElement, JavaSourceElement { override val psi: PsiElement? - get() = (element as JavaElementImpl<*>).getPsi() + get() = (javaElement as JavaElementImpl<*>).getPsi() } public class JavaSourceElementFactoryImpl : JavaSourceElementFactory { - override fun source(javaElement: JavaElement): SourceElement = JavaSourceElementImpl(javaElement) + override fun source(javaElement: JavaElement): JavaSourceElement = JavaSourceElementImpl(javaElement) } \ No newline at end of file diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.kt index fd52febd6a4..e845d340df5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.kt @@ -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("") } } + +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 Collection.findByJavaElement(javaElement: JavaElement): T? { + return firstOrNull { + member -> + (member.getSource() as? JavaSourceElement)?.javaElement == javaElement + } +} diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sources/JavaSourceElementFactory.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sources/JavaSourceElementFactory.kt index 55cebc2f45d..6d975b2f9eb 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sources/JavaSourceElementFactory.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/sources/JavaSourceElementFactory.kt @@ -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 } \ No newline at end of file