resolve default values for parameters for local functions

moved method 'resolveValueParameters'

#KT-3978 In progress
This commit is contained in:
Svetlana Isakova
2013-09-12 21:11:05 +04:00
parent 4b023742c6
commit f0bb41ba50
5 changed files with 76 additions and 38 deletions
@@ -392,8 +392,8 @@ public class BodyResolver {
parameterScope.addVariableDescriptor(valueParameterDescriptor);
}
parameterScope.changeLockLevel(WritableScope.LockLevel.READING);
resolveValueParameter(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
parameterScope);
expressionTypingServices.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
parameterScope, context.getOuterDataFlowInfo(), trace);
}
}
}
@@ -682,46 +682,11 @@ public class BodyResolver {
List<JetParameter> valueParameters = function.getValueParameters();
List<ValueParameterDescriptor> valueParameterDescriptors = functionDescriptor.getValueParameters();
resolveValueParameter(valueParameters, valueParameterDescriptors, functionInnerScope);
expressionTypingServices.resolveValueParameters(valueParameters, valueParameterDescriptors, functionInnerScope, context.getOuterDataFlowInfo(), trace);
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) {
annotationResolver.resolveAnnotationsArguments(scope, owner.getModifierList(), trace);
}
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
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.psi.*;
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.ExpressionPosition;
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.WritableScope;
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);
}
}
}
}
}
}
@@ -171,6 +171,10 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
scope.addFunctionDescriptor(functionDescriptor);
JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(context.scope, functionDescriptor, 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);
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");
}
@TestMetadata("DefaultParamsOfLocalFunctions.resolve")
public void testDefaultParamsOfLocalFunctions() throws Exception {
doTest("compiler/testData/resolve/DefaultParamsOfLocalFunctions.resolve");
}
@TestMetadata("ErrorSupertype.resolve")
public void testErrorSupertype() throws Exception {
doTest("compiler/testData/resolve/ErrorSupertype.resolve");