From 03cb977b2ac5020c84da0be9e187435d88c0b5eb Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 23 Oct 2013 18:14:12 +0400 Subject: [PATCH] Support overrides in Java classes --- .../java/lazy/descriptors/LazyJavaMemberScope.kt | 14 ++++++++++++-- .../resolve/java/lazy/descriptors/MemberIndex.kt | 16 +++++++++++++--- .../java/resolver/JavaFunctionResolver.java | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) 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 98a53971b4e..c8afdb40516 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 @@ -25,6 +25,10 @@ import org.jetbrains.jet.lang.resolve.java.lazy.hasMutableAnnotation import org.jetbrains.kotlin.util.iif import org.jetbrains.jet.lang.resolve.java.lazy.hasReadOnlyAnnotation import org.jetbrains.jet.lang.resolve.java.structure.JavaValueParameter +import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver +import java.util.ArrayList +import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils +import java.util.LinkedHashSet import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext import org.jetbrains.annotations.TestOnly import org.jetbrains.jet.utils.Printer @@ -47,7 +51,7 @@ public abstract class LazyJavaMemberScope( (name: Name): Collection -> val methods = memberIndex().findMethodsByName(name) - val functions = methods.map { + val functions = LinkedHashSet(methods.map { method -> val function = JavaMethodDescriptor( _containingDeclaration, @@ -74,6 +78,12 @@ public abstract class LazyJavaMemberScope( false ) function + }) + + if (_containingDeclaration is ClassDescriptor) { + val functionsFromSupertypes = JavaFunctionResolver.getFunctionsFromSupertypes(name, _containingDeclaration); + + functions.addAll(DescriptorResolverUtils.resolveOverrides(name, functionsFromSupertypes, functions, _containingDeclaration, c.errorReporter)); } // Make sure that lazy things are computed before we release the lock @@ -141,7 +151,7 @@ public abstract class LazyJavaMemberScope( override fun getAllDescriptors() = allDescriptors() private fun computeAllDescriptors(): MutableCollection { - val result = arrayListOf() + val result = LinkedHashSet() for (name in getAllPackageNames()) { val descriptor = getNamespace(name) 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 1d0ec762d12..bb1a1b5f07b 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 @@ -19,6 +19,8 @@ package org.jetbrains.jet.lang.resolve.java.lazy.descriptors import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod import org.jetbrains.jet.lang.resolve.java.structure.JavaClass +import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils +import org.jetbrains.jet.lang.descriptors.Visibilities trait MemberIndex { fun findMethodsByName(name: Name): Collection @@ -30,12 +32,20 @@ object EMPTY_MEMBER_INDEX : MemberIndex { override fun getAllMetodNames() = listOf() } -class ClassMemberIndex(jClass: JavaClass, mustBeStatic: Boolean) : MemberIndex { - private val methods = jClass.getMethods().iterator().filter { m -> m.isStatic() == mustBeStatic && !m.isConstructor() }.groupBy { m -> m.getName() } +class ClassMemberIndex(val jClass: JavaClass, mustBeStatic: Boolean) : MemberIndex { + private val methodFilter = { + (m: JavaMethod) -> + m.isStatic() == mustBeStatic && + !m.isConstructor() && + !DescriptorResolverUtils.isObjectMethodInInterface(m) && + m.getVisibility() != Visibilities.PRIVATE + } + + private val methods = jClass.getMethods().iterator().filter(methodFilter).groupBy { m -> m.getName() } override fun findMethodsByName(name: Name): Collection { return methods[name] ?: listOf() } - override fun getAllMetodNames(): Collection = methods.keySet() + override fun getAllMetodNames(): Collection = jClass.getAllMethods().iterator().filter(methodFilter).map { m -> m.getName() }.toList() } \ No newline at end of file diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index 6fc8649fc48..30446e77e87 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -261,7 +261,7 @@ public final class JavaFunctionResolver { } @NotNull - private static Set getFunctionsFromSupertypes(@NotNull Name name, @NotNull ClassDescriptor descriptor) { + public static Set getFunctionsFromSupertypes(@NotNull Name name, @NotNull ClassDescriptor descriptor) { Set result = new LinkedHashSet(); for (JetType supertype : descriptor.getTypeConstructor().getSupertypes()) { for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(name)) {