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:
Pavel V. Talanov
2013-07-16 17:55:56 +04:00
parent 7c49374dab
commit 4fe78e4e7b
11 changed files with 61 additions and 59 deletions
@@ -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
@@ -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);
}
}
@@ -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()));
}
}
@@ -51,7 +51,7 @@ public final class ScopeUtils {
}
for (PsiClass psiClass : javaSemanticServices.getPsiClassFinder().findPsiClasses(psiPackage)) {
if (PackageClassUtils.isPackageClass(psiClass)) {
if (DescriptorResolverUtils.isCompiledKotlinPackageClass(psiClass)) {
continue;
}