Skip to content

Commit e471ebe

Browse files
committed
Control whether a variable is captured in a closure
1 parent cd531d8 commit e471ebe

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
import org.jetbrains.kotlin.JetNodeTypes;
2323
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
2424
import org.jetbrains.kotlin.descriptors.*;
25+
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor;
2526
import org.jetbrains.kotlin.psi.*;
2627
import org.jetbrains.kotlin.resolve.BindingContext;
28+
import org.jetbrains.kotlin.resolve.BindingContextUtils;
2729
import org.jetbrains.kotlin.resolve.DescriptorUtils;
2830
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilPackage;
2931
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext;
@@ -122,12 +124,13 @@ else if (receiverValue == ReceiverValue.NO_RECEIVER) {
122124
@NotNull
123125
public static DataFlowValue createDataFlowValue(
124126
@NotNull VariableDescriptor variableDescriptor,
127+
@NotNull BindingContext bindingContext,
125128
@Nullable ModuleDescriptor usageContainingModule
126129
) {
127130
JetType type = variableDescriptor.getType();
128131
return new DataFlowValue(variableDescriptor, type,
129132
isStableVariable(variableDescriptor, usageContainingModule),
130-
isLocalVariable(variableDescriptor),
133+
isLocalVariable(variableDescriptor, bindingContext),
131134
getImmanentNullability(type));
132135
}
133136

@@ -237,7 +240,7 @@ private static IdentifierInfo getIdForSimpleNameExpression(
237240
VariableDescriptor variableDescriptor = (VariableDescriptor) declarationDescriptor;
238241
return combineInfo(receiverInfo, createInfo(variableDescriptor,
239242
isStableVariable(variableDescriptor, usageModuleDescriptor),
240-
isLocalVariable(variableDescriptor)));
243+
isLocalVariable(variableDescriptor, bindingContext)));
241244
}
242245
if (declarationDescriptor instanceof PackageViewDescriptor) {
243246
return createPackageInfo(declarationDescriptor);
@@ -272,12 +275,10 @@ private static IdentifierInfo getIdForThisReceiver(@Nullable DeclarationDescript
272275
return NO_IDENTIFIER_INFO;
273276
}
274277

275-
public static boolean isLocalVariable(@NotNull VariableDescriptor variableDescriptor) {
276-
if (variableDescriptor instanceof PropertyDescriptor) {
277-
return false;
278-
}
279-
DeclarationDescriptor declaration = variableDescriptor.getContainingDeclaration();
280-
if (declaration instanceof FunctionDescriptor) {
278+
public static boolean isLocalVariable(@NotNull VariableDescriptor variableDescriptor, @NotNull BindingContext bindingContext) {
279+
if (variableDescriptor instanceof LocalVariableDescriptor) {
280+
if (BindingContextUtils.isVarCapturedInClosure(bindingContext, variableDescriptor))
281+
return false;
281282
return true;
282283
}
283284
return false;

compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ public JetTypeInfo visitProperty(@NotNull JetProperty property, ExpressionTyping
146146
// In this case s will be not-nullable until it is changed
147147
if (property.getTypeReference() == null && type != null) {
148148
DataFlowValue variableDataFlowValue = DataFlowValueFactory.createDataFlowValue(
149-
propertyDescriptor, DescriptorUtils.getContainingModuleOrNull(scope.getContainingDeclaration()));
149+
propertyDescriptor, context.trace.getBindingContext(),
150+
DescriptorUtils.getContainingModuleOrNull(scope.getContainingDeclaration()));
150151
DataFlowValue initializerDataFlowValue = DataFlowValueFactory.createDataFlowValue(initializer, type, context);
151152
dataFlowInfo = dataFlowInfo.assign(variableDataFlowValue, initializerDataFlowValue);
152153
}

0 commit comments

Comments
 (0)