diff --git a/compiler/backend-common/src/org/jetbrains/jet/backend/common/CodegenUtilKt.kt b/compiler/backend-common/src/org/jetbrains/jet/backend/common/CodegenUtilKt.kt index b4ede0887b5..326bcc7dfd9 100644 --- a/compiler/backend-common/src/org/jetbrains/jet/backend/common/CodegenUtilKt.kt +++ b/compiler/backend-common/src/org/jetbrains/jet/backend/common/CodegenUtilKt.kt @@ -21,8 +21,8 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.types.JetType import kotlin.platform.platformStatic import org.jetbrains.jet.lang.descriptors.CallableDescriptor -import org.jetbrains.jet.lang.resolve.OverrideResolver import org.jetbrains.jet.utils.keysToMapExceptNulls +import org.jetbrains.jet.lang.resolve.DescriptorUtils public object CodegenUtilKt { @@ -43,7 +43,7 @@ public object CodegenUtilKt { .keysToMapExceptNulls { delegatingMember -> - val actualDelegates = OverrideResolver.getAllOverriddenDescriptors(delegatingMember) + val actualDelegates = DescriptorUtils.getAllOverriddenDescriptors(delegatingMember) .filter { it.getContainingDeclaration() == toTrait } .map { overriddenDescriptor -> @@ -53,7 +53,7 @@ public object CodegenUtilKt { // this is the actual member of delegateExpressionType that we are delegating to (scope.getFunctions(name) + scope.getProperties(name)) .first { - (listOf(it) + OverrideResolver.getAllOverriddenDescriptors(it)).map {it.getOriginal()}.contains(overriddenDescriptor.getOriginal()) + (listOf(it) + DescriptorUtils.getAllOverriddenDescriptors(it)).map { it.getOriginal() }.contains(overriddenDescriptor.getOriginal()) } } assert(actualDelegates.size <= 1) { "Meny delegates found for $delegatingMember: $actualDelegates" } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index c5c11d03ab3..bacc65d3568 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -685,7 +685,7 @@ public class JetTypeMapper { //noinspection ConstantConditions if (!KotlinBuiltIns.getInstance().isPrimitiveType(descriptor.getReturnType())) return false; - for (FunctionDescriptor overridden : OverrideResolver.getAllOverriddenDescriptors(descriptor)) { + for (FunctionDescriptor overridden : getAllOverriddenDescriptors(descriptor)) { //noinspection ConstantConditions if (!KotlinBuiltIns.getInstance().isPrimitiveType(overridden.getOriginal().getReturnType())) return true; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 0cf8e855062..b3007ff8ba6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -298,30 +298,12 @@ public class OverrideResolver { // As other code relies on no equal descriptors passed here, we guard against f == g, but this may not be necessary if (!f.equals(g) && DescriptorEquivalenceForOverrides.INSTANCE$.areEquivalent(f.getOriginal(), g.getOriginal())) return true; CallableDescriptor originalG = g.getOriginal(); - for (D overriddenFunction : getAllOverriddenDescriptors(f)) { + for (D overriddenFunction : DescriptorUtils.getAllOverriddenDescriptors(f)) { if (DescriptorEquivalenceForOverrides.INSTANCE$.areEquivalent(originalG, overriddenFunction.getOriginal())) return true; } return false; } - @NotNull - @SuppressWarnings("unchecked") - public static Set getAllOverriddenDescriptors(@NotNull D f) { - Set result = new LinkedHashSet(); - collectAllOverriddenDescriptors((D) f.getOriginal(), result); - return result; - } - - private static void collectAllOverriddenDescriptors(@NotNull D current, @NotNull Set result) { - if (result.contains(current)) return; - for (CallableDescriptor callableDescriptor : current.getOriginal().getOverriddenDescriptors()) { - @SuppressWarnings("unchecked") - D descriptor = (D) callableDescriptor; - collectAllOverriddenDescriptors(descriptor, result); - result.add(descriptor); - } - } - private static MultiMap groupDescriptorsByName(Collection properties) { MultiMap r = new LinkedMultiMap(); for (T property : properties) { @@ -999,31 +981,10 @@ public class OverrideResolver { return filterOutOverridden(result); } - @NotNull - public static Set getAllOverriddenDeclarations(@NotNull D memberDescriptor) { - Set result = Sets.newHashSet(); - for (CallableMemberDescriptor overriddenDeclaration : memberDescriptor.getOverriddenDescriptors()) { - CallableMemberDescriptor.Kind kind = overriddenDeclaration.getKind(); - if (kind == DECLARATION) { - //noinspection unchecked - result.add((D) overriddenDeclaration); - } - else if (kind == DELEGATION || kind == FAKE_OVERRIDE || kind == SYNTHESIZED) { - //do nothing - } - else { - throw new AssertionError("Unexpected callable kind " + kind); - } - //noinspection unchecked - result.addAll(getAllOverriddenDeclarations((D) overriddenDeclaration)); - } - return result; - } - @NotNull @ReadOnly public static Set getDeepestSuperDeclarations(@NotNull D functionDescriptor) { - Set overriddenDeclarations = getAllOverriddenDeclarations(functionDescriptor); + Set overriddenDeclarations = DescriptorUtils.getAllOverriddenDeclarations(functionDescriptor); if (overriddenDeclarations.isEmpty()) { return Collections.singleton(functionDescriptor); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java index 03de287ab8a..b0a09d0f18f 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -34,11 +34,9 @@ import org.jetbrains.jet.lang.types.TypeConstructor; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import java.util.*; +import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.*; import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER; public class DescriptorUtils { @@ -410,4 +408,43 @@ public class DescriptorUtils { public static boolean classCanHaveOpenMembers(@NotNull ClassDescriptor classDescriptor) { return classDescriptor.getModality() != Modality.FINAL || classDescriptor.getKind() == ClassKind.ENUM_CLASS; } + + @NotNull + @SuppressWarnings("unchecked") + public static Set getAllOverriddenDescriptors(@NotNull D f) { + Set result = new LinkedHashSet(); + collectAllOverriddenDescriptors((D) f.getOriginal(), result); + return result; + } + + private static void collectAllOverriddenDescriptors(@NotNull D current, @NotNull Set result) { + if (result.contains(current)) return; + for (CallableDescriptor callableDescriptor : current.getOriginal().getOverriddenDescriptors()) { + @SuppressWarnings("unchecked") + D descriptor = (D) callableDescriptor; + collectAllOverriddenDescriptors(descriptor, result); + result.add(descriptor); + } + } + + @NotNull + public static Set getAllOverriddenDeclarations(@NotNull D memberDescriptor) { + Set result = new HashSet(); + for (CallableMemberDescriptor overriddenDeclaration : memberDescriptor.getOverriddenDescriptors()) { + CallableMemberDescriptor.Kind kind = overriddenDeclaration.getKind(); + if (kind == DECLARATION) { + //noinspection unchecked + result.add((D) overriddenDeclaration); + } + else if (kind == DELEGATION || kind == FAKE_OVERRIDE || kind == SYNTHESIZED) { + //do nothing + } + else { + throw new AssertionError("Unexpected callable kind " + kind); + } + //noinspection unchecked + result.addAll(getAllOverriddenDeclarations((D) overriddenDeclaration)); + } + return result; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java b/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java index 5e04a0dd33c..66e1739adc6 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/JetRefactoringUtil.java @@ -45,7 +45,7 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils; -import org.jetbrains.jet.lang.resolve.OverrideResolver; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetModifierKeywordToken; @@ -55,7 +55,6 @@ import org.jetbrains.jet.plugin.codeInsight.CodeInsightUtils; import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers; -import org.jetbrains.jet.plugin.util.UtilPackage; import org.jetbrains.jet.plugin.util.string.StringPackage; import org.jetbrains.jet.renderer.DescriptorRenderer; @@ -139,7 +138,7 @@ public class JetRefactoringUtil { Project project = declaration.getProject(); Map overriddenElementsToDescriptor = new HashMap(); - for (CallableDescriptor overriddenDescriptor : OverrideResolver.getAllOverriddenDescriptors(declarationDescriptor)) { + for (CallableDescriptor overriddenDescriptor : DescriptorUtils.getAllOverriddenDescriptors(declarationDescriptor)) { PsiElement overriddenDeclaration = DescriptorToDeclarationUtil.INSTANCE$.getDeclaration(project, overriddenDescriptor); if (PsiTreeUtil.instanceOf(overriddenDeclaration, JetNamedFunction.class, JetProperty.class, PsiMethod.class)) { overriddenElementsToDescriptor.put(overriddenDeclaration, overriddenDescriptor); diff --git a/idea/src/org/jetbrains/jet/plugin/structureView/KotlinStructureElementPresentation.java b/idea/src/org/jetbrains/jet/plugin/structureView/KotlinStructureElementPresentation.java index ba3c83fe861..d8e961177fc 100644 --- a/idea/src/org/jetbrains/jet/plugin/structureView/KotlinStructureElementPresentation.java +++ b/idea/src/org/jetbrains/jet/plugin/structureView/KotlinStructureElementPresentation.java @@ -39,7 +39,7 @@ import javax.swing.*; import java.util.Set; import static org.jetbrains.jet.lang.resolve.OverrideResolver.filterOutOverridden; -import static org.jetbrains.jet.lang.resolve.OverrideResolver.getAllOverriddenDeclarations; +import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getAllOverriddenDeclarations; import static org.jetbrains.jet.renderer.DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES; class KotlinStructureElementPresentation implements ColoredItemPresentation, LocationPresentation { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java index d7a2a9c55eb..7568bf3c697 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/PatternBuilder.java @@ -257,7 +257,7 @@ public final class PatternBuilder { } if (checkOverridden) { - for (CallableDescriptor overridden : OverrideResolver.getAllOverriddenDescriptors(functionDescriptor)) { + for (CallableDescriptor overridden : DescriptorUtils.getAllOverriddenDescriptors(functionDescriptor)) { if (matches(overridden)) { return true; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java index 273cc2d082f..80dcf98747a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java @@ -24,7 +24,7 @@ import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.OverrideResolver; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -80,7 +80,7 @@ public final class AnnotationsUtils { isOverride((CallableMemberDescriptor) declarationDescriptor)) { Set overriddenDeclarations = - OverrideResolver.getAllOverriddenDeclarations((CallableMemberDescriptor) declarationDescriptor); + DescriptorUtils.getAllOverriddenDeclarations((CallableMemberDescriptor) declarationDescriptor); descriptors = ContainerUtil.mapNotNull(overriddenDeclarations, new Function() { @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java index 9daea5d053f..f086dda5108 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/ManglingUtils.java @@ -22,7 +22,7 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.backend.common.CodegenUtil; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.OverrideResolver; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -240,7 +240,7 @@ public class ManglingUtils { private static boolean isNativeOrOverrideNative(CallableMemberDescriptor descriptor) { if (AnnotationsUtils.isNativeObject(descriptor)) return true; - Set declarations = OverrideResolver.getAllOverriddenDeclarations(descriptor); + Set declarations = DescriptorUtils.getAllOverriddenDeclarations(descriptor); for (CallableMemberDescriptor memberDescriptor : declarations) { if (AnnotationsUtils.isNativeObject(memberDescriptor)) return true; }