From 7213d43f2234f77c7eb1931dca7324db85427048 Mon Sep 17 00:00:00 2001 From: svtk Date: Thu, 8 Dec 2011 13:42:32 +0400 Subject: [PATCH] added util methods 'getParentOfType', 'isAncestor' for descriptors --- .../jet/lang/resolve/DescriptorUtils.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java index b76f5efa4b6..ffdccd62a25 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.*; @@ -164,4 +165,35 @@ public class DescriptorUtils { return descriptor.getName(); } + + @Nullable + public static D getParentOfType(@Nullable DeclarationDescriptor descriptor, @NotNull Class aClass) { + return getParentOfType(descriptor, aClass, true); + } + + @Nullable + public static D getParentOfType(@Nullable DeclarationDescriptor descriptor, @NotNull Class aClass, boolean strict) { + if (descriptor == null) return null; + if (strict) { + descriptor = descriptor.getContainingDeclaration(); + } + while (descriptor != null) { + if (aClass.isInstance(descriptor)) { + //noinspection unchecked + return (D) descriptor; + } + descriptor = descriptor.getContainingDeclaration(); + } + return null; + } + + public static boolean isAncestor(@Nullable DeclarationDescriptor ancestor, @NotNull DeclarationDescriptor declarationDescriptor, boolean strict) { + if (ancestor == null) return false; + DeclarationDescriptor descriptor = strict ? declarationDescriptor.getContainingDeclaration() : declarationDescriptor; + while (descriptor != null) { + if (ancestor == descriptor) return true; + descriptor = descriptor.getContainingDeclaration(); + } + return false; + } }