Fixed resolving references to packages in plugin.

This commit is contained in:
Evgeny Gerashchenko
2013-11-25 20:52:17 +04:00
parent fbdc31790b
commit ad7044cc6c
3 changed files with 19 additions and 7 deletions
@@ -185,7 +185,7 @@ public object JetUsageTypeProvider : UsageTypeProviderEx {
} else { } else {
getClassUsageType() getClassUsageType()
} }
is JavaPackageFragmentDescriptor -> getClassUsageType() is PackageViewDescriptor -> getClassUsageType()
is VariableDescriptor -> getVariableUsageType() is VariableDescriptor -> getVariableUsageType()
is FunctionDescriptor -> getFunctionUsageType(descriptor) is FunctionDescriptor -> getFunctionUsageType(descriptor)
else -> null else -> null
@@ -18,14 +18,15 @@ package org.jetbrains.jet.plugin.references;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiElement; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElementResolveResult; import com.intellij.psi.*;
import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.ResolveResult;
import com.intellij.util.IncorrectOperationException; import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.psi.JetReferenceExpression; import org.jetbrains.jet.lang.psi.JetReferenceExpression;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingContextUtils;
@@ -119,9 +120,17 @@ public abstract class JetPsiReference implements PsiPolyVariantReference {
if (targetDescriptors != null) { if (targetDescriptors != null) {
assert !(targetDescriptors.isEmpty()) : "targetDescriptors is not null, but empty, for " + myExpression.getText(); assert !(targetDescriptors.isEmpty()) : "targetDescriptors is not null, but empty, for " + myExpression.getText();
Set<PsiElement> result = Sets.newHashSet(); Set<PsiElement> result = Sets.newHashSet();
Project project = myExpression.getProject();
for (DeclarationDescriptor target : targetDescriptors) { for (DeclarationDescriptor target : targetDescriptors) {
result.addAll(BindingContextUtils.descriptorToDeclarations(context, target)); result.addAll(BindingContextUtils.descriptorToDeclarations(context, target));
result.addAll(findDeclarationsForDescriptorWithoutTrace(myExpression.getProject(), target)); result.addAll(findDeclarationsForDescriptorWithoutTrace(project, target));
if (target instanceof PackageViewDescriptor) {
JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project);
String fqName = ((PackageViewDescriptor) target).getFqName().asString();
ContainerUtil.addIfNotNull(result, psiFacade.findPackage(fqName));
ContainerUtil.addIfNotNull(result, psiFacade.findClass(fqName, GlobalSearchScope.allScope(project)));
}
} }
return result; return result;
} }
@@ -19,6 +19,7 @@ package org.jetbrains.jet.testing;
import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem; import com.intellij.navigation.NavigationItem;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPackage;
import junit.framework.Assert; import junit.framework.Assert;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.asJava.KotlinLightClass; import org.jetbrains.jet.asJava.KotlinLightClass;
@@ -46,6 +47,8 @@ public final class ReferenceUtils {
String presentableText = presentation.getPresentableText(); String presentableText = presentation.getPresentableText();
String locationString = presentation.getLocationString(); String locationString = presentation.getLocationString();
return locationString != null ? (locationString + "." + presentableText) : presentableText; return locationString == null || element instanceof PsiPackage // for PsiPackage, presentableText is FQ name of current package
? presentableText
: locationString + "." + presentableText;
} }
} }