Refactored TipsManager to filter by visibility

This commit is contained in:
Valentin Kipyatkov
2014-10-20 14:45:07 +04:00
parent 13d9fd083c
commit 042e446694
3 changed files with 20 additions and 12 deletions
@@ -33,7 +33,11 @@ import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension
public object TipsManager{
public fun getReferenceVariants(expression: JetSimpleNameExpression, context: BindingContext): Collection<DeclarationDescriptor> {
public fun getReferenceVariants(expression: JetSimpleNameExpression, context: BindingContext, visibilityFilter: (DeclarationDescriptor) -> Boolean): Collection<DeclarationDescriptor> {
return getReferenceVariants(expression, context).filter(visibilityFilter)
}
private fun getReferenceVariants(expression: JetSimpleNameExpression, context: BindingContext): Collection<DeclarationDescriptor> {
val receiverExpression = expression.getReceiverExpression()
val parent = expression.getParent()
val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression] ?: return listOf()
@@ -194,7 +194,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
}
private fun addReferenceVariants(filterCondition: (DeclarationDescriptor) -> Boolean = { true }) {
val descriptors = TipsManager.getReferenceVariants(jetReference!!.expression, bindingContext!!)
val descriptors = TipsManager.getReferenceVariants(jetReference!!.expression, bindingContext!!) { isVisibleDescriptor(it) }
collector.addDescriptorElements(descriptors.filter { filterCondition(it) }, suppressAutoInsertion = false)
}
}
@@ -211,8 +211,8 @@ class SmartCompletionSession(configuration: CompletionSessionConfiguration, para
val filter = result.declarationFilter
if (filter != null) {
TipsManager.getReferenceVariants(jetReference.expression, bindingContext!!)
.forEach { if (prefixMatcher.prefixMatches(it.getName().asString()) && isVisibleDescriptor(it)) collector.addElements(filter(it)) }
TipsManager.getReferenceVariants(jetReference.expression, bindingContext!!) { isVisibleDescriptor(it) }
.forEach { if (prefixMatcher.prefixMatches(it.getName().asString())) collector.addElements(filter(it)) }
flushToResultSet()
@@ -30,6 +30,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.ui.Gray;
import com.intellij.ui.JBColor;
import com.intellij.util.ArrayUtil;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
@@ -384,12 +385,21 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith
BindingContext bindingContext = resolveSession.resolveToElement(callNameExpression);
JetScope scope = bindingContext.get(BindingContext.RESOLUTION_SCOPE, callNameExpression);
DeclarationDescriptor placeDescriptor = null;
final DeclarationDescriptor placeDescriptor;
if (scope != null) {
placeDescriptor = scope.getContainingDeclaration();
}
else {
placeDescriptor = null;
}
Function1<DeclarationDescriptor, Boolean> visibilityFilter = new Function1<DeclarationDescriptor, Boolean>() {
@Override
public Boolean invoke(DeclarationDescriptor descriptor) {
return placeDescriptor == null || JetVisibilityChecker.isVisible(placeDescriptor, descriptor);
}
};
Collection<DeclarationDescriptor> variants = TipsManager.INSTANCE$.getReferenceVariants(callNameExpression, bindingContext);
Collection<DeclarationDescriptor> variants = TipsManager.INSTANCE$.getReferenceVariants(callNameExpression, bindingContext, visibilityFilter);
Name refName = callNameExpression.getReferencedNameAsName();
@@ -399,9 +409,6 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith
FunctionDescriptor functionDescriptor = (FunctionDescriptor) variant;
if (functionDescriptor.getName().equals(refName)) {
//todo: renamed functions?
if (placeDescriptor != null && !JetVisibilityChecker.isVisible(placeDescriptor, functionDescriptor)) {
continue;
}
itemsToShow.add(Pair.create(functionDescriptor, resolveSession));
}
}
@@ -410,9 +417,6 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith
if (classDescriptor.getName().equals(refName)) {
//todo: renamed classes?
for (ConstructorDescriptor constructorDescriptor : classDescriptor.getConstructors()) {
if (placeDescriptor != null && !JetVisibilityChecker.isVisible(placeDescriptor, constructorDescriptor)) {
continue;
}
itemsToShow.add(Pair.create(constructorDescriptor, resolveSession));
}
}