KT-2499 If Java class is imported, it is visible in completion three times: as Java class, Kotlin class and package

- Add java trace into delegation for lazy resolve session
 #KT-2499 Fixed
This commit is contained in:
Nikolay Krasko
2012-11-08 14:45:35 +04:00
parent b88336d663
commit c081ced616
8 changed files with 93 additions and 14 deletions
@@ -139,7 +139,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("<lazy module>"));
return new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory);
return new ResolveSession(fileProject, lazyModule, moduleConfiguration, declarationProviderFactory, javaResolverTrace);
}
public static AnalyzeExhaust analyzeOneFileWithJavaIntegrationAndCheckForErrors(
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -53,7 +54,7 @@ public class ResolveSession {
private final ModuleDescriptor module;
private final LazyPackageDescriptor rootPackage;
private final BindingTrace trace = new BindingTraceContext();
private final BindingTrace trace;
private final DeclarationProviderFactory declarationProviderFactory;
private final Predicate<FqNameUnsafe> specialClasses;
@@ -70,7 +71,25 @@ public class ResolveSession {
@NotNull ModuleConfiguration moduleConfiguration,
@NotNull DeclarationProviderFactory declarationProviderFactory
) {
this(project, rootDescriptor, moduleConfiguration, declarationProviderFactory, NO_ALIASES, Predicates.<FqNameUnsafe>alwaysFalse());
this(project, rootDescriptor, moduleConfiguration, declarationProviderFactory, NO_ALIASES,
Predicates.<FqNameUnsafe>alwaysFalse(),
new BindingTraceContext());
}
public ResolveSession(
@NotNull Project project,
@NotNull ModuleDescriptor rootDescriptor,
@NotNull ModuleConfiguration moduleConfiguration,
@NotNull DeclarationProviderFactory declarationProviderFactory,
@NotNull BindingTrace delegationTrace
) {
this(project,
rootDescriptor,
moduleConfiguration,
declarationProviderFactory,
NO_ALIASES,
Predicates.<FqNameUnsafe>alwaysFalse(),
delegationTrace);
}
@Deprecated // Internal use only
@@ -80,10 +99,12 @@ public class ResolveSession {
@NotNull ModuleConfiguration moduleConfiguration,
@NotNull DeclarationProviderFactory declarationProviderFactory,
@NotNull Function<FqName, Name> classifierAliases,
@NotNull Predicate<FqNameUnsafe> specialClasses
@NotNull Predicate<FqNameUnsafe> specialClasses,
@NotNull BindingTrace delegationTrace
) {
this.classifierAliases = classifierAliases;
this.specialClasses = specialClasses;
this.trace = new ObservableBindingTrace(delegationTrace);
this.injector = new InjectorForLazyResolve(project, this, trace, moduleConfiguration);
this.module = rootDescriptor;
this.moduleConfiguration = moduleConfiguration;
@@ -17,7 +17,10 @@
package org.jetbrains.jet.lang.types.lang;
import com.google.common.base.Predicates;
import com.google.common.collect.*;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
@@ -35,6 +38,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.lazy.FileBasedDeclarationProviderFactory;
@@ -230,7 +234,8 @@ public class KotlinBuiltIns {
return ALIASES.get(name);
}
},
Predicates.in(Sets.newHashSet(new FqNameUnsafe("jet.Any"), new FqNameUnsafe("jet.Nothing"))));
Predicates.in(Sets.newHashSet(new FqNameUnsafe("jet.Any"), new FqNameUnsafe("jet.Nothing"))),
new BindingTraceContext());
}
@NotNull
@@ -25,23 +25,24 @@ import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.java.JavaToKotlinClassMap;
import org.jetbrains.jet.test.util.NamespaceComparator;
import org.jetbrains.jet.lang.DefaultModuleConfiguration;
import org.jetbrains.jet.lang.ModuleConfiguration;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.java.JavaToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.test.util.NamespaceComparator;
import org.junit.Test;
import java.io.File;
@@ -80,7 +81,8 @@ public class LazyResolveBuiltinClassesTest extends KotlinTestWithEnvironment {
return aliases.get(name);
}
},
Predicates.in(Sets.newHashSet(new FqNameUnsafe("jet.Any"), new FqNameUnsafe("jet.Nothing"))));
Predicates.in(Sets.newHashSet(new FqNameUnsafe("jet.Any"), new FqNameUnsafe("jet.Nothing"))),
new BindingTraceContext());
NamespaceDescriptor jetNamespaceFromJSL =
(NamespaceDescriptor) KotlinBuiltIns.getInstance().getInt().getContainingDeclaration();
@@ -17,10 +17,13 @@
package org.jetbrains.jet.plugin.completion;
import com.google.common.collect.Lists;
import com.intellij.codeInsight.completion.JavaMethodCallElement;
import com.intellij.codeInsight.completion.JavaPsiClassReferenceElement;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.lookup.VariableLookupItem;
import com.intellij.openapi.util.Iconable;
import com.intellij.psi.PsiElement;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
@@ -33,6 +36,8 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.plugin.JetDescriptorIconProvider;
import org.jetbrains.jet.plugin.completion.handlers.JetClassInsertHandler;
import org.jetbrains.jet.plugin.completion.handlers.JetFunctionInsertHandler;
import org.jetbrains.jet.plugin.completion.handlers.JetJavaClassInsertHandler;
import org.jetbrains.jet.plugin.libraries.DecompiledDataFactory;
import org.jetbrains.jet.resolve.DescriptorRenderer;
import java.util.List;
@@ -56,6 +61,12 @@ public final class DescriptorLookupConverter {
@NotNull
public static LookupElement createLookupElement(@NotNull ResolveSession resolveSession,
@NotNull DeclarationDescriptor descriptor, @Nullable PsiElement declaration) {
if (declaration != null) {
LookupElement javaLookupElement = createJavaLookupElementIfPossible(declaration);
if (javaLookupElement != null) {
return javaLookupElement;
}
}
LookupElementBuilder element = LookupElementBuilder.create(
new JetLookupObject(descriptor, resolveSession, declaration), descriptor.getName().getName());
@@ -113,6 +124,31 @@ public final class DescriptorLookupConverter {
return element;
}
@Nullable
private static LookupElement createJavaLookupElementIfPossible(@NotNull PsiElement declaration) {
if (declaration instanceof PsiClass) {
PsiClass psiClass = (PsiClass) declaration;
if (!DecompiledDataFactory.isCompiledFromKotlin(psiClass)) {
return new JavaPsiClassReferenceElement(psiClass).setInsertHandler(JetJavaClassInsertHandler.JAVA_CLASS_INSERT_HANDLER);
}
}
if (declaration instanceof PsiMember) {
PsiClass containingClass = ((PsiMember) declaration).getContainingClass();
if (containingClass != null && !DecompiledDataFactory.isCompiledFromKotlin(containingClass)) {
if (declaration instanceof PsiMethod) {
return new JavaMethodCallElement((PsiMethod) declaration);
}
if (declaration instanceof PsiField) {
return new VariableLookupItem((PsiField) declaration);
}
}
}
return null;
}
@NotNull
public static LookupElement createLookupElement(
@NotNull ResolveSession resolveSession,
@@ -44,7 +44,7 @@ import java.util.*;
* @author Evgeny Gerashchenko
* @since 3/11/12
*/
class DecompiledDataFactory {
public class DecompiledDataFactory {
private static final String JET_CLASS = JetClass.class.getName();
private static final String JET_METHOD = JetMethod.class.getName();
private static final String DECOMPILED_COMMENT = "/* compiled code */";
@@ -196,11 +196,11 @@ class DecompiledDataFactory {
return false;
}
static boolean isKotlinClass(PsiClass psiClass) {
public static boolean isKotlinClass(@NotNull PsiClass psiClass) {
return hasAnnotation(psiClass, JET_CLASS);
}
static boolean isKotlinNamespaceClass(PsiClass psiClass) {
public static boolean isKotlinNamespaceClass(@NotNull PsiClass psiClass) {
if (JvmAbi.PACKAGE_CLASS.equals(psiClass.getName()) && !isKotlinClass(psiClass)) {
for (PsiMethod method : psiClass.getMethods()) {
if (hasAnnotation(method, JET_METHOD)) {
@@ -210,4 +210,8 @@ class DecompiledDataFactory {
}
return false;
}
public static boolean isCompiledFromKotlin(@NotNull PsiClass psiClass) {
return isKotlinClass(psiClass) || isKotlinNamespaceClass(psiClass);
}
}
@@ -0,0 +1,7 @@
import java.io.InputStreamReader
val x = InputStreamReader<caret>
// TIME: 1
// EXIST: InputStreamReader
// NUMBER: 1
@@ -201,6 +201,10 @@ public class JetBasicCompletionTest extends JetCompletionTestBase {
doTest();
}
public void testNoImportedJavaClassDuplication() {
doTest();
}
public void testNoTopLevelCompletionInQualifiedUserTypes() {
doTest();
}