Move utilities using annotations to determine whether PsiClass is kotlin class or package class to DescriptorResolverUtils
Fix some of the usages PackageClassUtils uses more precise method name
This commit is contained in:
+27
-6
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.jet.lang.resolve.java;
|
||||
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.compiled.ClsClassImpl;
|
||||
import com.intellij.psi.util.PsiFormatUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -37,19 +38,39 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassObjectName;
|
||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumClassObject;
|
||||
|
||||
public final class DescriptorResolverUtils {
|
||||
|
||||
public static final FqName OBJECT_FQ_NAME = new FqName("java.lang.Object");
|
||||
|
||||
private DescriptorResolverUtils() {
|
||||
}
|
||||
|
||||
//TODO: check that method is used properly
|
||||
public static boolean isKotlinClass(@NotNull PsiClass psiClass) {
|
||||
PsiModifierList modifierList = psiClass.getModifierList();
|
||||
if (modifierList == null) {
|
||||
public static boolean isCompiledKotlinPackageClass(@NotNull PsiClass psiClass) {
|
||||
if (!(psiClass instanceof ClsClassImpl)) {
|
||||
return false;
|
||||
}
|
||||
PsiAnnotation kotlinClassAnnotation = modifierList.findAnnotation(JvmStdlibNames.KOTLIN_CLASS.getFqName().asString());
|
||||
return kotlinClassAnnotation != null;
|
||||
if (!PackageClassUtils.isPackageClassFqName(new FqName(psiClass.getQualifiedName()))) {
|
||||
return false;
|
||||
}
|
||||
return hasAnnotation(psiClass, JvmStdlibNames.KOTLIN_PACKAGE.getFqName());
|
||||
}
|
||||
|
||||
public static boolean isCompiledKotlinClass(@NotNull PsiClass psiClass) {
|
||||
if (!(psiClass instanceof ClsClassImpl)) {
|
||||
return false;
|
||||
}
|
||||
return hasAnnotation(psiClass, JvmStdlibNames.KOTLIN_CLASS.getFqName());
|
||||
}
|
||||
|
||||
public static boolean hasAnnotation(@NotNull PsiClass psiClass, @NotNull FqName annotationFqName) {
|
||||
PsiModifierList list = psiClass.getModifierList();
|
||||
if (list != null) {
|
||||
return list.findAnnotation(annotationFqName.asString()) != null;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isCompiledKotlinClassOrPackageClass(@NotNull PsiClass psiClass) {
|
||||
return isCompiledKotlinClass(psiClass) || isCompiledKotlinPackageClass(psiClass);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+6
-9
@@ -17,15 +17,17 @@
|
||||
package org.jetbrains.jet.lang.resolve.java;
|
||||
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
|
||||
public class PackageClassUtils {
|
||||
public final class PackageClassUtils {
|
||||
|
||||
private static final String DEFAULT_PACKAGE = "_DefaultPackage";
|
||||
|
||||
private PackageClassUtils() {
|
||||
}
|
||||
|
||||
// ex. <root> -> _DefaultPackage, a -> APackage, a.b -> BPackage
|
||||
public static String getPackageClassName(@NotNull FqName packageFQN) {
|
||||
if (packageFQN.isRoot()) {
|
||||
@@ -38,15 +40,10 @@ public class PackageClassUtils {
|
||||
return packageFQN.child(Name.identifier(getPackageClassName(packageFQN)));
|
||||
}
|
||||
|
||||
public static boolean isPackageClass(@NotNull PsiClass psiClass) {
|
||||
//TODO: read kotlin info
|
||||
return psiClass.getName().endsWith("Package");
|
||||
}
|
||||
|
||||
public static boolean isPackageClass(@NotNull FqName fqName) {
|
||||
public static boolean isPackageClassFqName(@NotNull FqName fqName) {
|
||||
if (fqName.isRoot()) {
|
||||
return false;
|
||||
}
|
||||
return PackageClassUtils.getPackageClassFqName(fqName.parent()).equals(fqName);
|
||||
return getPackageClassFqName(fqName.parent()).equals(fqName);
|
||||
}
|
||||
}
|
||||
|
||||
+10
-26
@@ -18,8 +18,10 @@ package org.jetbrains.jet.lang.resolve.java.resolver;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.compiled.ClsClassImpl;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiMember;
|
||||
import com.intellij.psi.PsiModifier;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -164,12 +166,12 @@ public final class JavaNamespaceResolver {
|
||||
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER);
|
||||
|
||||
if (psiClass != null) {
|
||||
boolean hasKotlinPackageAnnotation = hasKotlinPackageAnnotation(psiClass);
|
||||
if (isOldKotlinPackageClass(psiClass) && !hasKotlinPackageAnnotation) {
|
||||
boolean isCompiledKotlinPackageClass = DescriptorResolverUtils.isCompiledKotlinPackageClass(psiClass);
|
||||
if (isOldKotlinPackageClass(psiClass) && !isCompiledKotlinPackageClass) {
|
||||
// If psiClass has old annotations (@JetPackage) but doesn't have @KotlinPackage, report ABI version error
|
||||
AbiVersionUtil.checkAbiVersion(psiClass, INVALID_VERSION, trace);
|
||||
}
|
||||
if (hasKotlinPackageAnnotation) {
|
||||
if (isCompiledKotlinPackageClass) {
|
||||
// If psiClass has @KotlinPackage (regardless of whether it has @JetPackage or not), deserialize it to Kotlin descriptor.
|
||||
// Note that @KotlinPackage may still have an old ABI version, in which case null is returned by createKotlinPackageScope
|
||||
JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(psiClass, namespaceDescriptor);
|
||||
@@ -186,7 +188,7 @@ public final class JavaNamespaceResolver {
|
||||
if (psiClass == null) {
|
||||
return null;
|
||||
}
|
||||
if (DescriptorResolverUtils.isKotlinClass(psiClass)) {
|
||||
if (DescriptorResolverUtils.isCompiledKotlinClassOrPackageClass(psiClass)) {
|
||||
return null;
|
||||
}
|
||||
if (!hasStaticMembers(psiClass)) {
|
||||
@@ -200,25 +202,7 @@ public final class JavaNamespaceResolver {
|
||||
}
|
||||
|
||||
private static boolean isOldKotlinPackageClass(@NotNull PsiClass psiClass) {
|
||||
return hasAnnotation(psiClass, JvmStdlibNames.JET_PACKAGE_CLASS.getFqName());
|
||||
}
|
||||
|
||||
private static boolean hasKotlinPackageAnnotation(@NotNull PsiClass psiClass) {
|
||||
// TODO: merge this method with DescriptorResolverUtils#isKotlinClass
|
||||
// NOTE: we need to check against ClsClassImpl because it can be a Java source, pretending to be a Kotlin class.
|
||||
// In that case we can't really read the annotation from psiClass's virtual file
|
||||
if (!(psiClass instanceof ClsClassImpl)) {
|
||||
return false;
|
||||
}
|
||||
return hasAnnotation(psiClass, JvmStdlibNames.KOTLIN_PACKAGE.getFqName());
|
||||
}
|
||||
|
||||
private static boolean hasAnnotation(@NotNull PsiClass psiClass, @NotNull FqName annotationFqName) {
|
||||
PsiModifierList list = psiClass.getModifierList();
|
||||
if (list != null) {
|
||||
return list.findAnnotation(annotationFqName.asString()) != null;
|
||||
}
|
||||
return false;
|
||||
return DescriptorResolverUtils.hasAnnotation(psiClass, JvmStdlibNames.JET_PACKAGE_CLASS.getFqName());
|
||||
}
|
||||
|
||||
private void cache(@NotNull FqName fqName, @Nullable JetScope packageScope) {
|
||||
@@ -280,7 +264,7 @@ public final class JavaNamespaceResolver {
|
||||
PsiClass[] classes = psiPackage.getClasses();
|
||||
List<Name> result = new ArrayList<Name>(classes.length);
|
||||
for (PsiClass psiClass : classes) {
|
||||
if (DescriptorResolverUtils.isKotlinClass(psiClass)) {
|
||||
if (DescriptorResolverUtils.isCompiledKotlinClass(psiClass)) {
|
||||
result.add(Name.identifier(psiClass.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -51,7 +51,7 @@ public final class ScopeUtils {
|
||||
}
|
||||
|
||||
for (PsiClass psiClass : javaSemanticServices.getPsiClassFinder().findPsiClasses(psiPackage)) {
|
||||
if (PackageClassUtils.isPackageClass(psiClass)) {
|
||||
if (DescriptorResolverUtils.isCompiledKotlinPackageClass(psiClass)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user