Change resolution scope for componentX in lambda parameters

Component-functions are resolved in the same scope as the first statement of the lambda, but lambda receiver was not available

 #KT-14692 Fixed
This commit is contained in:
Denis Zharkov
2016-11-09 18:10:17 +03:00
parent 6656bf835f
commit 24819a079b
5 changed files with 53 additions and 20 deletions
@@ -263,9 +263,9 @@ public class DescriptorResolver {
@NotNull
public ValueParameterDescriptorImpl resolveValueParameterDescriptor(
@NotNull LexicalScope scope, @NotNull FunctionDescriptor owner,
@NotNull final LexicalScope scope, @NotNull final FunctionDescriptor owner,
@NotNull KtParameter valueParameter, int index,
@NotNull KotlinType type, @NotNull BindingTrace trace
@NotNull final KotlinType type, @NotNull final BindingTrace trace
) {
KotlinType varargElementType = null;
KotlinType variableType = type;
@@ -291,20 +291,35 @@ public class DescriptorResolver {
}
}
KtDestructuringDeclaration destructuringDeclaration = valueParameter.getDestructuringDeclaration();
final KtDestructuringDeclaration destructuringDeclaration = valueParameter.getDestructuringDeclaration();
List<VariableDescriptor> destructuringVariables;
Function0<List<VariableDescriptor>> destructuringVariables;
if (destructuringDeclaration != null) {
if (!languageVersionSettings.supportsFeature(LanguageFeature.DestructuringLambdaParameters)) {
trace.report(Errors.UNSUPPORTED_FEATURE.on(valueParameter, LanguageFeature.DestructuringLambdaParameters));
}
destructuringVariables = destructuringDeclarationResolver.resolveLocalVariablesFromDestructuringDeclaration(
scope, destructuringDeclaration, new TransientReceiver(type), /* initializer = */ null,
ExpressionTypingContext.newContext(trace, scope, DataFlowInfoFactory.EMPTY, TypeUtils.NO_EXPECTED_TYPE)
);
destructuringVariables = new Function0<List<VariableDescriptor>>() {
@Override
public List<VariableDescriptor> invoke() {
assert owner.getDispatchReceiverParameter() == null
: "Destructuring declarations are only be parsed for lambdas, and they must not have a dispatch receiver";
LexicalScope scopeWithReceiver =
ScopeUtilsKt.addImplicitReceiver(scope, owner.getExtensionReceiverParameter());
modifiersChecker.withTrace(trace).checkModifiersForDestructuringDeclaration(destructuringDeclaration);
List<VariableDescriptor> result =
destructuringDeclarationResolver.resolveLocalVariablesFromDestructuringDeclaration(
scope,
destructuringDeclaration, new TransientReceiver(type), /* initializer = */ null,
ExpressionTypingContext.newContext(
trace, scopeWithReceiver, DataFlowInfoFactory.EMPTY, TypeUtils.NO_EXPECTED_TYPE
)
);
modifiersChecker.withTrace(trace).checkModifiersForDestructuringDeclaration(destructuringDeclaration);
return result;
}
};
}
else {
destructuringVariables = null;
@@ -22,10 +22,13 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.serialization.ProtoBuf;
import org.jetbrains.kotlin.types.*;
import org.jetbrains.kotlin.types.FlexibleTypesKt;
import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.TypeConstructor;
import org.jetbrains.kotlin.types.TypeProjection;
import java.util.Collection;
@@ -71,6 +74,9 @@ public class ForceResolveUtil {
LazyEntity lazyEntity = (LazyEntity) object;
lazyEntity.forceResolveAllContents();
}
else if (object instanceof ValueParameterDescriptorImpl.WithDestructuringDeclaration) {
((ValueParameterDescriptorImpl.WithDestructuringDeclaration) object).getDestructuringVariables();
}
else if (object instanceof CallableDescriptor) {
CallableDescriptor callableDescriptor = (CallableDescriptor) object;
ReceiverParameterDescriptor parameter = callableDescriptor.getExtensionReceiverParameter();