KT-1151 Code completion for not imported extension functions - refactorings:

- Don't touch call resolver
- Check only newly imported descriptors
- Use Stepa's wrapper for getting boolean attribute from annotation
This commit is contained in:
Nikolay Krasko
2012-02-29 15:43:56 +04:00
parent a086e3985e
commit 8d1c3dc759
10 changed files with 132 additions and 278 deletions
@@ -30,13 +30,13 @@ import org.jetbrains.jet.lang.psi.JetImportDirective;
import org.jetbrains.jet.lang.psi.JetNamespaceHeader;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.JetScopeUtils;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.NamespaceType;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils;
import java.util.*;
@@ -138,7 +138,7 @@ public final class TipsManager {
return false;
}
for (ReceiverDescriptor receiverDescriptor : result) {
if (CallResolver.checkIsExtensionCallable(receiverDescriptor, callableDescriptor)) {
if (ExpressionTypingUtils.checkIsExtensionCallable(receiverDescriptor, callableDescriptor)) {
return false;
}
}
@@ -177,51 +177,10 @@ public final class TipsManager {
new Predicate<CallableDescriptor>() {
@Override
public boolean apply(CallableDescriptor callableDescriptor) {
return CallResolver.checkIsExtensionCallable(receiverDescriptor, callableDescriptor);
return ExpressionTypingUtils.checkIsExtensionCallable(receiverDescriptor, callableDescriptor);
}
}));
return descriptorsSet;
}
// /*
// * Checks if receiver declaration could be resolved to call expected receiver.
// */
// private static boolean checkReceiverResolution (
// @NotNull ReceiverDescriptor expectedReceiver,
// @NotNull CallableDescriptor receiverArgument
// ) {
// JetType type = expectedReceiver.getType();
// if (checkReceiverResolution(expectedReceiver, type, receiverArgument)) return true;
// if (type.isNullable()) {
// JetType notNullableType = TypeUtils.makeNotNullable(type);
// if (checkReceiverResolution(expectedReceiver, notNullableType, receiverArgument)) return true;
// }
// return false;
// }
//
// private static boolean checkReceiverResolution (
// @NotNull ReceiverDescriptor expectedReceiver,
// @NotNull JetType receiverType,
// @NotNull CallableDescriptor receiverArgument
// ) {
// ConstraintSystem constraintSystem = new ConstraintSystemImpl(ConstraintResolutionListener.DO_NOTHING);
// for (TypeParameterDescriptor typeParameterDescriptor : receiverArgument.getTypeParameters()) {
// constraintSystem.registerTypeVariable(typeParameterDescriptor, Variance.INVARIANT);
// }
//
// ReceiverDescriptor receiverParameter = receiverArgument.getReceiverParameter();
// if (expectedReceiver.exists() && receiverParameter.exists()) {
// constraintSystem.addSubtypingConstraint(
// RECEIVER.assertSubtyping(receiverType, receiverParameter.getType()));
// }
// else if (expectedReceiver.exists() || receiverParameter.exists()) {
// // Only one of receivers exist
// return false;
// }
//
// ConstraintSystemSolution solution = constraintSystem.solve();
// return solution.getStatus().isSuccessful();
// }
}