resolve default values for parameters for local functions
moved method 'resolveValueParameters' #KT-3978 In progress
This commit is contained in:
@@ -392,8 +392,8 @@ public class BodyResolver {
|
|||||||
parameterScope.addVariableDescriptor(valueParameterDescriptor);
|
parameterScope.addVariableDescriptor(valueParameterDescriptor);
|
||||||
}
|
}
|
||||||
parameterScope.changeLockLevel(WritableScope.LockLevel.READING);
|
parameterScope.changeLockLevel(WritableScope.LockLevel.READING);
|
||||||
resolveValueParameter(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
|
expressionTypingServices.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
|
||||||
parameterScope);
|
parameterScope, context.getOuterDataFlowInfo(), trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -682,46 +682,11 @@ public class BodyResolver {
|
|||||||
List<JetParameter> valueParameters = function.getValueParameters();
|
List<JetParameter> valueParameters = function.getValueParameters();
|
||||||
List<ValueParameterDescriptor> valueParameterDescriptors = functionDescriptor.getValueParameters();
|
List<ValueParameterDescriptor> valueParameterDescriptors = functionDescriptor.getValueParameters();
|
||||||
|
|
||||||
resolveValueParameter(valueParameters, valueParameterDescriptors, functionInnerScope);
|
expressionTypingServices.resolveValueParameters(valueParameters, valueParameterDescriptors, functionInnerScope, context.getOuterDataFlowInfo(), trace);
|
||||||
|
|
||||||
assert functionDescriptor.getReturnType() != null;
|
assert functionDescriptor.getReturnType() != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resolveValueParameter(
|
|
||||||
@NotNull List<JetParameter> valueParameters,
|
|
||||||
@NotNull List<ValueParameterDescriptor> valueParameterDescriptors,
|
|
||||||
@NotNull JetScope declaringScope
|
|
||||||
) {
|
|
||||||
for (int i = 0; i < valueParameters.size(); i++) {
|
|
||||||
ValueParameterDescriptor valueParameterDescriptor = valueParameterDescriptors.get(i);
|
|
||||||
JetParameter jetParameter = valueParameters.get(i);
|
|
||||||
|
|
||||||
resolveAnnotationArguments(declaringScope, jetParameter);
|
|
||||||
|
|
||||||
resolveDefaultValue(declaringScope, valueParameterDescriptor, jetParameter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resolveDefaultValue(
|
|
||||||
@NotNull JetScope declaringScope,
|
|
||||||
@NotNull ValueParameterDescriptor valueParameterDescriptor,
|
|
||||||
@NotNull JetParameter jetParameter
|
|
||||||
) {
|
|
||||||
if (valueParameterDescriptor.hasDefaultValue()) {
|
|
||||||
JetExpression defaultValue = jetParameter.getDefaultValue();
|
|
||||||
if (defaultValue != null) {
|
|
||||||
expressionTypingServices.getType(declaringScope, defaultValue, valueParameterDescriptor.getType(), context.getOuterDataFlowInfo(), trace);
|
|
||||||
if (DescriptorUtils.isAnnotationClass(DescriptorUtils.getContainingClass(declaringScope))) {
|
|
||||||
CompileTimeConstant<?> constant =
|
|
||||||
annotationResolver.resolveExpressionToCompileTimeValue(defaultValue, valueParameterDescriptor.getType(), trace);
|
|
||||||
if (constant != null) {
|
|
||||||
trace.record(BindingContext.COMPILE_TIME_VALUE, defaultValue, constant);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resolveAnnotationArguments(@NotNull JetScope scope, @NotNull JetModifierListOwner owner) {
|
private void resolveAnnotationArguments(@NotNull JetScope scope, @NotNull JetModifierListOwner owner) {
|
||||||
annotationResolver.resolveAnnotationsArguments(scope, owner.getModifierList(), trace);
|
annotationResolver.resolveAnnotationsArguments(scope, owner.getModifierList(), trace);
|
||||||
}
|
}
|
||||||
|
|||||||
+41
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
|
|||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorUtil;
|
import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorUtil;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.*;
|
import org.jetbrains.jet.lang.resolve.*;
|
||||||
@@ -34,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
|||||||
import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
|
import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
|
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext;
|
import org.jetbrains.jet.lang.resolve.calls.context.ResolutionContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
||||||
@@ -360,4 +362,43 @@ public class ExpressionTypingServices {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resolveValueParameters(
|
||||||
|
@NotNull List<JetParameter> valueParameters,
|
||||||
|
@NotNull List<ValueParameterDescriptor> valueParameterDescriptors,
|
||||||
|
@NotNull JetScope declaringScope,
|
||||||
|
@NotNull DataFlowInfo dataFlowInfo,
|
||||||
|
@NotNull BindingTrace trace
|
||||||
|
) {
|
||||||
|
for (int i = 0; i < valueParameters.size(); i++) {
|
||||||
|
ValueParameterDescriptor valueParameterDescriptor = valueParameterDescriptors.get(i);
|
||||||
|
JetParameter jetParameter = valueParameters.get(i);
|
||||||
|
|
||||||
|
annotationResolver.resolveAnnotationsArguments(declaringScope, jetParameter.getModifierList(), trace);
|
||||||
|
|
||||||
|
resolveDefaultValue(declaringScope, valueParameterDescriptor, jetParameter, dataFlowInfo, trace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resolveDefaultValue(
|
||||||
|
@NotNull JetScope declaringScope,
|
||||||
|
@NotNull ValueParameterDescriptor valueParameterDescriptor,
|
||||||
|
@NotNull JetParameter jetParameter,
|
||||||
|
@NotNull DataFlowInfo dataFlowInfo,
|
||||||
|
@NotNull BindingTrace trace
|
||||||
|
) {
|
||||||
|
if (valueParameterDescriptor.hasDefaultValue()) {
|
||||||
|
JetExpression defaultValue = jetParameter.getDefaultValue();
|
||||||
|
if (defaultValue != null) {
|
||||||
|
getType(declaringScope, defaultValue, valueParameterDescriptor.getType(), dataFlowInfo, trace);
|
||||||
|
if (DescriptorUtils.isAnnotationClass(DescriptorUtils.getContainingClass(declaringScope))) {
|
||||||
|
CompileTimeConstant<?> constant =
|
||||||
|
annotationResolver.resolveExpressionToCompileTimeValue(defaultValue, valueParameterDescriptor.getType(), trace);
|
||||||
|
if (constant != null) {
|
||||||
|
trace.record(BindingContext.COMPILE_TIME_VALUE, defaultValue, constant);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -171,6 +171,10 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
|
|||||||
scope.addFunctionDescriptor(functionDescriptor);
|
scope.addFunctionDescriptor(functionDescriptor);
|
||||||
JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(context.scope, functionDescriptor, context.trace);
|
JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(context.scope, functionDescriptor, context.trace);
|
||||||
context.expressionTypingServices.checkFunctionReturnType(functionInnerScope, function, functionDescriptor, context.dataFlowInfo, null, context.trace);
|
context.expressionTypingServices.checkFunctionReturnType(functionInnerScope, function, functionDescriptor, context.dataFlowInfo, null, context.trace);
|
||||||
|
|
||||||
|
context.expressionTypingServices.resolveValueParameters(
|
||||||
|
function.getValueParameters(), functionDescriptor.getValueParameters(), scope, context.dataFlowInfo, context.trace);
|
||||||
|
|
||||||
ModifiersChecker.create(context.trace).checkModifiersForLocalDeclaration(function);
|
ModifiersChecker.create(context.trace).checkModifiersForLocalDeclaration(function);
|
||||||
return DataFlowUtils.checkStatementType(function, context, context.dataFlowInfo);
|
return DataFlowUtils.checkStatementType(function, context, context.dataFlowInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package m
|
||||||
|
|
||||||
|
~zzz~annotation class zzz
|
||||||
|
|
||||||
|
~y~val y = 23
|
||||||
|
|
||||||
|
~bar~fun bar() = 354
|
||||||
|
~baz~fun baz(i: Int) = i
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
~x~val x = 2
|
||||||
|
|
||||||
|
[`zzz`zzz] fun local(
|
||||||
|
`zzz`zzz i: Int = `x`x,
|
||||||
|
j: Int = 3,
|
||||||
|
s: String = "$`x`x",
|
||||||
|
k: Int = `y`y,
|
||||||
|
l: Int = `bar`bar(),
|
||||||
|
m: Int = `baz`baz(`x`x)
|
||||||
|
) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -52,6 +52,11 @@ public class JetResolveTestGenerated extends AbstractResolveTest {
|
|||||||
doTest("compiler/testData/resolve/Classifiers.resolve");
|
doTest("compiler/testData/resolve/Classifiers.resolve");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("DefaultParamsOfLocalFunctions.resolve")
|
||||||
|
public void testDefaultParamsOfLocalFunctions() throws Exception {
|
||||||
|
doTest("compiler/testData/resolve/DefaultParamsOfLocalFunctions.resolve");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ErrorSupertype.resolve")
|
@TestMetadata("ErrorSupertype.resolve")
|
||||||
public void testErrorSupertype() throws Exception {
|
public void testErrorSupertype() throws Exception {
|
||||||
doTest("compiler/testData/resolve/ErrorSupertype.resolve");
|
doTest("compiler/testData/resolve/ErrorSupertype.resolve");
|
||||||
|
|||||||
Reference in New Issue
Block a user