From 31cf0ce736692a36586f22ed2a841ded99015fda Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 3 Apr 2012 16:31:30 +0400 Subject: [PATCH] added name, order to visibilities --- .../jet/lang/descriptors/Visibilities.java | 61 +++++++++++++++---- .../jet/lang/descriptors/Visibility.java | 22 ++++++- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java index 510d4caabbc..624743ac81c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibilities.java @@ -16,19 +16,25 @@ package org.jetbrains.jet.lang.descriptors; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.Set; /** * @author svtk */ public class Visibilities { - public static final Visibility PRIVATE = new Visibility(false) { + public static final Visibility PRIVATE = new Visibility("private", false) { @Override - protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) { + protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { DeclarationDescriptor parent = what; while (parent != null) { parent = parent.getContainingDeclaration(); @@ -51,9 +57,9 @@ public class Visibilities { } }; - public static final Visibility PROTECTED = new Visibility(true) { + public static final Visibility PROTECTED = new Visibility("protected", true) { @Override - protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) { + protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { ClassDescriptor classDescriptor = DescriptorUtils.getParentOfType(what, ClassDescriptor.class); if (classDescriptor == null) return false; @@ -66,32 +72,32 @@ public class Visibilities { } }; - public static final Visibility INTERNAL = new Visibility(false) { + public static final Visibility INTERNAL = new Visibility("internal", false) { @Override - protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) { + protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { ModuleDescriptor parentModule = DescriptorUtils.getParentOfType(what, ModuleDescriptor.class, false); ModuleDescriptor fromModule = DescriptorUtils.getParentOfType(from, ModuleDescriptor.class, false); return parentModule == fromModule; } }; - public static final Visibility PUBLIC = new Visibility(true) { + public static final Visibility PUBLIC = new Visibility("public", true) { @Override - protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) { + protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { return true; } }; - public static final Visibility INTERNAL_PROTECTED = new Visibility(false) { + public static final Visibility INTERNAL_PROTECTED = new Visibility("internal protected", false) { @Override - protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) { + protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { return PROTECTED.isVisible(what, from) && INTERNAL.isVisible(what, from); } }; - public static final Visibility LOCAL = new Visibility(false) { + public static final Visibility LOCAL = new Visibility("local", false) { @Override - protected boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from) { + protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { return true; } }; @@ -108,4 +114,35 @@ public class Visibilities { } return true; } + + private static final Map ORDERED_VISIBILITIES = Maps.newHashMap(); + static { + ORDERED_VISIBILITIES.put(PRIVATE, 0); + ORDERED_VISIBILITIES.put(INTERNAL_PROTECTED, 1); + ORDERED_VISIBILITIES.put(INTERNAL, 2); + ORDERED_VISIBILITIES.put(PROTECTED, 2); + ORDERED_VISIBILITIES.put(PUBLIC, 3); + } + + /*package*/ static Integer compareLocal(@NotNull Visibility first, @NotNull Visibility second) { + if (first == second) return 0; + Integer firstIndex = ORDERED_VISIBILITIES.get(first); + Integer secondIndex = ORDERED_VISIBILITIES.get(second); + if (firstIndex == null || secondIndex == null || firstIndex.equals(secondIndex)) { + return null; + } + return firstIndex - secondIndex; + } + + public static Integer compare(@NotNull Visibility first, @NotNull Visibility second) { + Integer result = first.compareTo(second); + if (result != null) { + return result; + } + Integer oppositeResult = second.compareTo(first); + if (oppositeResult != null) { + return -oppositeResult; + } + return null; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java index 13a75de556e..15bb8d7bbdc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/Visibility.java @@ -16,19 +16,35 @@ package org.jetbrains.jet.lang.descriptors; +import org.jetbrains.annotations.NotNull; + /** * @author svtk */ public abstract class Visibility { private final boolean isPublicAPI; + private final String name; - protected Visibility(boolean api) { - isPublicAPI = api; + protected Visibility(@NotNull String name, boolean isPublicAPI) { + this.isPublicAPI = isPublicAPI; + this.name = name; } public boolean isPublicAPI() { return isPublicAPI; } - protected abstract boolean isVisible(DeclarationDescriptorWithVisibility what, DeclarationDescriptor from); + /** + * @return null if the answer is unknown + */ + protected Integer compareTo(@NotNull Visibility visibility) { + return Visibilities.compareLocal(this, visibility); + } + + @Override + public String toString() { + return name; + } + + protected abstract boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from); }