Container of value parameter is always a callable

This commit is contained in:
Alexander Udalov
2015-07-07 16:31:56 +03:00
parent 636b63a8c5
commit 9b832d4b87
9 changed files with 39 additions and 40 deletions
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
import org.jetbrains.kotlin.codegen.when.SwitchCodegen;
import org.jetbrains.kotlin.codegen.when.SwitchCodegenUtil;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.ScriptCodeDescriptor;
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils;
import org.jetbrains.kotlin.diagnostics.Errors;
import org.jetbrains.kotlin.lexer.JetTokens;
@@ -2036,11 +2037,14 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return localOrCaptured;
}
if (descriptor instanceof ValueParameterDescriptor && descriptor.getContainingDeclaration() instanceof ScriptDescriptor) {
ScriptDescriptor scriptDescriptor = (ScriptDescriptor) descriptor.getContainingDeclaration();
DeclarationDescriptor container = descriptor.getContainingDeclaration();
if (descriptor instanceof ValueParameterDescriptor && container instanceof ScriptCodeDescriptor) {
ScriptCodeDescriptor scriptCodeDescriptor = (ScriptCodeDescriptor) container;
ScriptDescriptor scriptDescriptor = (ScriptDescriptor) scriptCodeDescriptor.getContainingDeclaration();
Type scriptClassType = asmTypeForScriptDescriptor(bindingContext, scriptDescriptor);
ValueParameterDescriptor valueParameterDescriptor = (ValueParameterDescriptor) descriptor;
ClassDescriptor scriptClass = bindingContext.get(CLASS_FOR_SCRIPT, scriptDescriptor);
//noinspection ConstantConditions
StackValue script = StackValue.thisOrOuter(this, scriptClass, false, false);
Type fieldType = typeMapper.mapType(valueParameterDescriptor);
return StackValue.field(fieldType, scriptClassType, valueParameterDescriptor.getName().getIdentifier(), false, script,
@@ -345,18 +345,7 @@ public class DescriptorResolver {
@NotNull
public ValueParameterDescriptorImpl resolveValueParameterDescriptor(
JetScope scope, DeclarationDescriptor declarationDescriptor,
JetParameter valueParameter, int index, JetType type, BindingTrace trace
) {
return resolveValueParameterDescriptor(declarationDescriptor, valueParameter, index, type, trace,
annotationResolver.resolveAnnotationsWithoutArguments(scope, valueParameter.getModifierList(), trace));
}
@NotNull
private ValueParameterDescriptorImpl resolveValueParameterDescriptor(
DeclarationDescriptor declarationDescriptor,
JetParameter valueParameter, int index, JetType type, BindingTrace trace,
Annotations annotations
JetScope scope, FunctionDescriptor owner, JetParameter valueParameter, int index, JetType type, BindingTrace trace
) {
JetType varargElementType = null;
JetType variableType = type;
@@ -365,10 +354,10 @@ public class DescriptorResolver {
variableType = getVarargParameterType(type);
}
ValueParameterDescriptorImpl valueParameterDescriptor = new ValueParameterDescriptorImpl(
declarationDescriptor,
owner,
null,
index,
annotations,
annotationResolver.resolveAnnotationsWithoutArguments(scope, valueParameter.getModifierList(), trace),
JetPsiUtil.safeName(valueParameter.getName()),
variableType,
valueParameter.hasDefaultValue(),
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.ScriptDescriptor;
import org.jetbrains.kotlin.descriptors.SourceElement;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.descriptors.impl.ScriptCodeDescriptor;
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.kotlin.parsing.JetScriptDefinition;
import org.jetbrains.kotlin.parsing.JetScriptDefinitionProvider;
@@ -35,7 +36,7 @@ public final class ScriptParameterResolver {
@NotNull
public static List<ValueParameterDescriptor> resolveScriptParameters(
@NotNull JetScript declaration,
@NotNull ScriptDescriptor scriptDescriptor
@NotNull ScriptCodeDescriptor scriptCodeDescriptor
) {
List<ValueParameterDescriptor> valueParameters = Lists.newArrayList();
@@ -44,23 +45,16 @@ public final class ScriptParameterResolver {
int index = 0;
for (AnalyzerScriptParameter scriptParameter : scriptDefinition.getScriptParameters()) {
ValueParameterDescriptor parameter = resolveScriptParameter(scriptParameter, index, scriptDescriptor);
ValueParameterDescriptor parameter = new ValueParameterDescriptorImpl(
scriptCodeDescriptor, null, index, Annotations.EMPTY, scriptParameter.getName(),
scriptParameter.getType(), false, null, SourceElement.NO_SOURCE
);
valueParameters.add(parameter);
++index;
}
return valueParameters;
}
@NotNull
private static ValueParameterDescriptor resolveScriptParameter(
@NotNull AnalyzerScriptParameter scriptParameter,
int index,
@NotNull ScriptDescriptor script
) {
return new ValueParameterDescriptorImpl(script, null, index, Annotations.EMPTY, scriptParameter.getName(),
scriptParameter.getType(), false, null, SourceElement.NO_SOURCE);
}
private ScriptParameterResolver() {
}
}
@@ -148,8 +148,7 @@ object DynamicCallableDescriptors {
)
}
private fun createValueParameters(owner: DeclarationDescriptor, call: Call): List<ValueParameterDescriptor> {
private fun createValueParameters(owner: FunctionDescriptor, call: Call): List<ValueParameterDescriptor> {
val parameters = ArrayList<ValueParameterDescriptor>()
fun addParameter(arg : ValueArgument, outType: JetType, varargElementType: JetType?) {
@@ -69,7 +69,7 @@ public class LazyScriptDescriptor(
val result = ScriptCodeDescriptor(this)
result.initialize(
implicitReceiver,
ScriptParameterResolver.resolveScriptParameters(jetScript, this),
ScriptParameterResolver.resolveScriptParameters(jetScript, result),
DeferredType.create(resolveSession.getStorageManager(), resolveSession.getTrace()) {
scriptBodyResolver.resolveScriptReturnType(jetScript, this, resolveSession.getTrace())
}