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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user