From eacb73130846fdaf391296d6f7a2fa925ff2b7c7 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 29 Oct 2013 16:21:41 +0400 Subject: [PATCH] Support SAM constructors --- .../descriptors/LazyJavaClassMemberScope.kt | 5 ++++- .../lazy/descriptors/LazyJavaMemberScope.kt | 8 ++++++++ .../LazyJavaPackageFragmentScope.kt | 20 ++++++++++++++----- .../java/lazy/descriptors/MemberIndex.kt | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 0972fe8b5b2..955b05e9904 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -57,7 +57,10 @@ public class LazyJavaClassMemberScope( private val jClass: JavaClass ) : LazyJavaMemberScope(c, containingDeclaration) { - override fun computeMemberIndex(): MemberIndex = ClassMemberIndex(jClass, mustBeStatic = false) + override fun computeMemberIndex(): MemberIndex = object : ClassMemberIndex(jClass, mustBeStatic = false) { + // For SAM-constructors + override fun getAllMetodNames(): Collection = super.getAllMetodNames() + getAllClassNames() + } internal val _constructors = c.storageManager.createLazyValue { jClass.getConstructors().flatMap { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt index 7a93dd4a210..ff210235253 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -40,6 +40,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext import org.jetbrains.annotations.TestOnly import org.jetbrains.jet.utils.Printer import org.jetbrains.jet.lang.resolve.java.resolver.ExternalSignatureResolver +import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils public abstract class LazyJavaMemberScope( protected val c: LazyJavaResolverContextWithTypes, @@ -76,6 +77,13 @@ public abstract class LazyJavaMemberScope( listOf(function) }) + if (_containingDeclaration is NamespaceDescriptor) { + val klass = JavaFunctionResolver.findClassInNamespace(_containingDeclaration, name); + if (klass != null && klass.getFunctionTypeForSamInterface() != null) { + functions.add(SingleAbstractMethodUtils.createSamConstructorFunction(_containingDeclaration, klass)) + } + } + if (_containingDeclaration is ClassDescriptor) { val functionsFromSupertypes = JavaFunctionResolver.getFunctionsFromSupertypes(name, _containingDeclaration); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt index 1253503e4c2..d8409d70b7f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt @@ -12,6 +12,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.utils.flatten import org.jetbrains.jet.lang.resolve.java.structure.JavaClass import org.jetbrains.jet.lang.resolve.java.resolver.JavaNamespaceResolver +import org.jetbrains.kotlin.util.inn public abstract class LazyJavaPackageFragmentScope( c: LazyJavaResolverContext, @@ -29,6 +30,16 @@ public abstract class LazyJavaPackageFragmentScope( LazyJavaClassDescriptor(c.withTypes(TypeParameterResolver.EMPTY), packageFragment, fqName, javaClass) } + protected fun computeMemberIndexForSamConstructors(delegate: MemberIndex): MemberIndex = object : MemberIndex by delegate { + override fun getAllMetodNames(): Collection { + val jClass = c.finder.findClass(fqName) + return delegate.getAllMetodNames() + + // For SAM-constructors + getAllClassNames() + + jClass.inn({ jC -> jC.getInnerClasses().map { c -> c.getName() }}, listOf()) + } + } + override fun addExtraDescriptors(result: MutableCollection) { // no extra descriptors } @@ -48,12 +59,10 @@ public class LazyPackageFragmentScopeForJavaPackage( packageFragment: LazyJavaPackageFragment ) : LazyJavaPackageFragmentScope(c, packageFragment) { - override fun computeMemberIndex(): MemberIndex = EMPTY_MEMBER_INDEX + override fun computeMemberIndex(): MemberIndex = computeMemberIndexForSamConstructors(EMPTY_MEMBER_INDEX) override fun getAllClassNames(): Collection { - val javaPackage = c.finder.findPackage(fqName) - assert(javaPackage != null) { "Package not found: $fqName" } - return javaPackage!!.getClasses().map { c -> c.getName() } + return jPackage.getClasses().map { c -> c.getName() } } override fun getAllPackageNames(): Collection = @@ -73,7 +82,8 @@ public class LazyPackageFragmentScopeForJavaClass( packageFragment: LazyJavaPackageFragment ) : LazyJavaPackageFragmentScope(c, packageFragment) { - override fun computeMemberIndex(): MemberIndex = ClassMemberIndex(jClass, mustBeStatic = true) + override fun computeMemberIndex(): MemberIndex = computeMemberIndexForSamConstructors(ClassMemberIndex(jClass, mustBeStatic = true)) + // nested classes are loaded as members of their outer classes, not packages override fun getAllClassNames(): Collection = listOf() override fun getClassifier(name: Name): ClassifierDescriptor? = null diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt index 8253dd60deb..43eb5ae7ad3 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt @@ -41,7 +41,7 @@ object EMPTY_MEMBER_INDEX : MemberIndex { override fun getAllFieldNames() = listOf() } -class ClassMemberIndex(val jClass: JavaClass, mustBeStatic: Boolean) : MemberIndex { +open class ClassMemberIndex(val jClass: JavaClass, mustBeStatic: Boolean) : MemberIndex { private val memberFilter = { (m: JavaMember) -> m.isStatic() == mustBeStatic &&