From 95f84459c91486508ed05b0bab7a1109bea32837 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 21 Jan 2013 16:00:29 -0800 Subject: [PATCH] Utility methods moved to a separate class --- .../plugin/quickfix/ImportClassAndFunFix.java | 37 +----------- .../jet/plugin/util/JetPsiHeuristicsUtil.java | 60 +++++++++++++++++++ 2 files changed, 62 insertions(+), 35 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/util/JetPsiHeuristicsUtil.java diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java index d6344f75923..0ed0c1724b1 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ImportClassAndFunFix.java @@ -32,20 +32,15 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiMember; -import com.intellij.psi.PsiModifier; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration; -import org.jetbrains.jet.asJava.KotlinLightClassForPackage; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; -import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; @@ -53,13 +48,12 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.name.FqName; -import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.actions.JetAddImportAction; import org.jetbrains.jet.plugin.caches.JetShortNamesCache; import org.jetbrains.jet.plugin.project.JsModuleDetector; import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade; -import org.jetbrains.jet.util.QualifiedNamesUtil; +import org.jetbrains.jet.plugin.util.JetPsiHeuristicsUtil; import java.util.Collection; import java.util.Collections; @@ -187,7 +181,7 @@ public class ImportClassAndFunFix extends JetHintAction @Override public boolean apply(PsiClass psiClass) { assert psiClass != null; - return isAccessible(psiClass, file); + return JetPsiHeuristicsUtil.isAccessible(psiClass, file); } }); @@ -228,33 +222,6 @@ public class ImportClassAndFunFix extends JetHintAction }); } - private static boolean isAccessible(PsiMember member, JetFile fromFile) { - if (member instanceof KotlinLightClassForPackage) { - // Package classes are only available from Java, so they should not be visisble from Kotlin - return false; - } - if (member instanceof KotlinLightClassForExplicitDeclaration) { - KotlinLightClassForExplicitDeclaration lightClass = (KotlinLightClassForExplicitDeclaration) member; - - // It is a Kotlin class already, we need to properly check visibility? - JetClassOrObject classOrObject = lightClass.getJetClassOrObject(); - - if (isTopLevelDeclaration(classOrObject) && classOrObject.hasModifier(JetTokens.PRIVATE_KEYWORD)) { - // The class is declared private in the targetPackage - // It is visible in this package and all of its subpackages - JetFile targetFile = (JetFile) classOrObject.getContainingFile(); - FqName targetPackage = JetPsiUtil.getFQName(targetFile); - FqName fromPackage = JetPsiUtil.getFQName(fromFile); - return QualifiedNamesUtil.isSubpackageOf(fromPackage, targetPackage); - } - } - return member.hasModifierProperty(PsiModifier.PUBLIC) || member.hasModifierProperty(PsiModifier.PROTECTED); - } - - private static boolean isTopLevelDeclaration(JetClassOrObject classOrObject) { - return classOrObject.getContainingFile() == classOrObject.getParent(); - } - @Override public boolean showHint(@NotNull Editor editor) { if (suggestions.isEmpty()) { diff --git a/idea/src/org/jetbrains/jet/plugin/util/JetPsiHeuristicsUtil.java b/idea/src/org/jetbrains/jet/plugin/util/JetPsiHeuristicsUtil.java new file mode 100644 index 00000000000..d852efc253f --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/util/JetPsiHeuristicsUtil.java @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.util; + +import com.intellij.psi.PsiMember; +import com.intellij.psi.PsiModifier; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration; +import org.jetbrains.jet.asJava.KotlinLightClassForPackage; +import org.jetbrains.jet.lang.psi.JetClassOrObject; +import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetPsiUtil; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.util.QualifiedNamesUtil; + +public class JetPsiHeuristicsUtil { + private JetPsiHeuristicsUtil() {} + + public static boolean isAccessible(@NotNull PsiMember member, @NotNull JetFile fromFile) { + if (member instanceof KotlinLightClassForPackage) { + // Package classes are only available from Java, so they should not be visible from Kotlin + return false; + } + if (member instanceof KotlinLightClassForExplicitDeclaration) { + KotlinLightClassForExplicitDeclaration lightClass = (KotlinLightClassForExplicitDeclaration) member; + + // It is a Kotlin class already, we need to properly check visibility? + JetClassOrObject classOrObject = lightClass.getJetClassOrObject(); + + if (isTopLevelDeclaration(classOrObject) && classOrObject.hasModifier(JetTokens.PRIVATE_KEYWORD)) { + // The class is declared private in the targetPackage + // It is visible in this package and all of its subpackages + JetFile targetFile = (JetFile) classOrObject.getContainingFile(); + FqName targetPackage = JetPsiUtil.getFQName(targetFile); + FqName fromPackage = JetPsiUtil.getFQName(fromFile); + return QualifiedNamesUtil.isSubpackageOf(fromPackage, targetPackage); + } + } + return member.hasModifierProperty(PsiModifier.PUBLIC) || member.hasModifierProperty(PsiModifier.PROTECTED); + } + + public static boolean isTopLevelDeclaration(@NotNull JetClassOrObject classOrObject) { + return classOrObject.getContainingFile() == classOrObject.getParent(); + } +}