Utility methods moved to a separate class

This commit is contained in:
Andrey Breslav
2013-01-21 16:00:29 -08:00
parent 5e1e6c2595
commit 95f84459c9
2 changed files with 62 additions and 35 deletions
@@ -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<JetSimpleNameExpression>
@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<JetSimpleNameExpression>
});
}
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()) {
@@ -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();
}
}