Don't load Java's "FooPackage" class as a Kotlin package

Before creating a Kotlin package scope for a classfile, first check if it
contains KotlinInfo annotation
This commit is contained in:
Alexander Udalov
2013-07-09 16:39:58 +04:00
parent b44bc620e0
commit c14e324e85
@@ -18,10 +18,7 @@ package org.jetbrains.jet.lang.resolve.java.resolver;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.*;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -163,12 +160,9 @@ public final class JavaNamespaceResolver {
if (psiPackage != null) {
PsiClass psiClass = getPsiClassForJavaPackageScope(fqName);
trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER);
if (psiClass == null) {
return new JavaPackageScopeWithoutMembers(
namespaceDescriptor,
javaSemanticServices.getPsiDeclarationProviderFactory()
.createDeclarationProviderForNamespaceWithoutMembers(psiPackage),
fqName, javaSemanticServices);
if (psiClass == null || !isCompiledKotlinClass(psiClass)) {
return new JavaPackageScopeWithoutMembers(namespaceDescriptor, javaSemanticServices.getPsiDeclarationProviderFactory()
.createDeclarationProviderForNamespaceWithoutMembers(psiPackage), fqName, javaSemanticServices);
}
return createScopeForKotlinPackageClass(fqName, namespaceDescriptor, psiClass);
@@ -191,6 +185,11 @@ public final class JavaNamespaceResolver {
fqName, javaSemanticServices);
}
private static boolean isCompiledKotlinClass(@NotNull PsiClass psiClass) {
PsiModifierList list = psiClass.getModifierList();
return list != null && list.findAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getFqName().asString()) != null;
}
@NotNull
private JetScope createScopeForKotlinPackageClass(
@NotNull FqName fqName,