Don't reuse other descriptor's value parameters
This resulted in a rewrite at INDEX_FOR_VALUE_PARAMETER slice, since some value parameters were found twice in different function descriptors
This commit is contained in:
@@ -16,31 +16,46 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.codegen;
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER;
|
import static org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor.NO_RECEIVER_PARAMETER;
|
||||||
|
|
||||||
public class AccessorForFunctionDescriptor extends SimpleFunctionDescriptorImpl {
|
public class AccessorForFunctionDescriptor extends SimpleFunctionDescriptorImpl {
|
||||||
public AccessorForFunctionDescriptor(DeclarationDescriptor descriptor, DeclarationDescriptor containingDeclaration, int index) {
|
public AccessorForFunctionDescriptor(
|
||||||
|
@NotNull FunctionDescriptor descriptor,
|
||||||
|
@NotNull DeclarationDescriptor containingDeclaration,
|
||||||
|
int index
|
||||||
|
) {
|
||||||
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(),
|
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(),
|
||||||
Name.identifier((descriptor instanceof ConstructorDescriptor ? "$init" : descriptor.getName())+ "$b$" + index),
|
Name.identifier((descriptor instanceof ConstructorDescriptor ? "$init" : descriptor.getName()) + "$b$" + index),
|
||||||
Kind.DECLARATION);
|
Kind.DECLARATION);
|
||||||
|
|
||||||
FunctionDescriptor fd = (FunctionDescriptor) descriptor;
|
initialize(DescriptorUtils.getReceiverParameterType(descriptor.getReceiverParameter()),
|
||||||
|
descriptor instanceof ConstructorDescriptor ? NO_RECEIVER_PARAMETER : descriptor.getExpectedThisObject(),
|
||||||
initialize(DescriptorUtils.getReceiverParameterType(fd.getReceiverParameter()),
|
Collections.<TypeParameterDescriptor>emptyList(),
|
||||||
descriptor instanceof ConstructorDescriptor ? NO_RECEIVER_PARAMETER : fd.getExpectedThisObject(),
|
copyValueParameters(descriptor),
|
||||||
Collections.<TypeParameterDescriptor>emptyList(),
|
descriptor.getReturnType(),
|
||||||
fd.getValueParameters(),
|
Modality.FINAL,
|
||||||
fd.getReturnType(),
|
Visibilities.INTERNAL,
|
||||||
Modality.FINAL,
|
|
||||||
Visibilities.INTERNAL,
|
|
||||||
/*isInline = */ false);
|
/*isInline = */ false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private List<ValueParameterDescriptor> copyValueParameters(@NotNull FunctionDescriptor descriptor) {
|
||||||
|
List<ValueParameterDescriptor> valueParameters = descriptor.getValueParameters();
|
||||||
|
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>(valueParameters.size());
|
||||||
|
for (ValueParameterDescriptor valueParameter : valueParameters) {
|
||||||
|
result.add(valueParameter.copy(this, valueParameter.getName()));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor instanceof SimpleFunctionDescriptor || descriptor instanceof ConstructorDescriptor) {
|
if (descriptor instanceof SimpleFunctionDescriptor || descriptor instanceof ConstructorDescriptor) {
|
||||||
accessor = new AccessorForFunctionDescriptor(descriptor, contextDescriptor, accessors.size());
|
accessor = new AccessorForFunctionDescriptor((FunctionDescriptor) descriptor, contextDescriptor, accessors.size());
|
||||||
}
|
}
|
||||||
else if (descriptor instanceof PropertyDescriptor) {
|
else if (descriptor instanceof PropertyDescriptor) {
|
||||||
accessor = new AccessorForPropertyDescriptor((PropertyDescriptor) descriptor, contextDescriptor, accessors.size());
|
accessor = new AccessorForPropertyDescriptor((PropertyDescriptor) descriptor, contextDescriptor, accessors.size());
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ public interface ValueParameterDescriptor extends VariableDescriptor {
|
|||||||
ValueParameterDescriptor getOriginal();
|
ValueParameterDescriptor getOriginal();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
ValueParameterDescriptor copy(DeclarationDescriptor newOwner, Name newName);
|
ValueParameterDescriptor copy(@NotNull DeclarationDescriptor newOwner, @NotNull Name newName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parameter p1 overrides p2 iff
|
* Parameter p1 overrides p2 iff
|
||||||
|
|||||||
Reference in New Issue
Block a user