Add 'preserveSource' parameter to methods making substitution copies

This commit is contained in:
Denis Zharkov
2015-10-26 10:50:59 +03:00
parent dd46056784
commit 80bf7316c7
12 changed files with 55 additions and 30 deletions
@@ -55,7 +55,8 @@ import org.jetbrains.kotlin.name.Name;
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
return new SamAdapterFunctionDescriptor(newOwner, (SimpleFunctionDescriptor) original, kind, declaration); return new SamAdapterFunctionDescriptor(newOwner, (SimpleFunctionDescriptor) original, kind, declaration);
} }
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.synthetic
import com.intellij.util.SmartList import com.intellij.util.SmartList
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils
@@ -145,7 +146,8 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : BaseImportingSc
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
original: FunctionDescriptor?, original: FunctionDescriptor?,
kind: CallableMemberDescriptor.Kind, kind: CallableMemberDescriptor.Kind,
newName: Name? newName: Name?,
preserveSource: Boolean
): MyFunctionDescriptor { ): MyFunctionDescriptor {
return MyFunctionDescriptor( return MyFunctionDescriptor(
containingDeclaration, original as SimpleFunctionDescriptor?, annotations, newName ?: name, kind, source containingDeclaration, original as SimpleFunctionDescriptor?, annotations, newName ?: name, kind, source
@@ -170,12 +172,13 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : BaseImportingSc
newValueParameterDescriptors: MutableList<ValueParameterDescriptor>, newValueParameterDescriptors: MutableList<ValueParameterDescriptor>,
newExtensionReceiverParameterType: KotlinType?, newExtensionReceiverParameterType: KotlinType?,
newReturnType: KotlinType, newReturnType: KotlinType,
name: Name? name: Name?,
preserveSource: Boolean
): FunctionDescriptor? { ): FunctionDescriptor? {
val descriptor = super.doSubstitute( val descriptor = super.doSubstitute(
originalSubstitutor, newOwner, newModality, newVisibility, originalSubstitutor, newOwner, newModality, newVisibility,
newIsOperator, newIsInfix, newIsExternal, newIsInline, newIsTailrec, original, newIsOperator, newIsInfix, newIsExternal, newIsInline, newIsTailrec, original,
copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType, name) copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType, name, preserveSource)
as MyFunctionDescriptor? ?: return null as MyFunctionDescriptor? ?: return null
if (original == null) { if (original == null) {
@@ -77,7 +77,8 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
if (kind != Kind.DECLARATION && kind != Kind.SYNTHESIZED) { if (kind != Kind.DECLARATION && kind != Kind.SYNTHESIZED) {
throw new IllegalStateException( throw new IllegalStateException(
@@ -91,7 +92,7 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme
assert newName == null : "Attempt to rename constructor: " + this; assert newName == null : "Attempt to rename constructor: " + this;
JavaConstructorDescriptor result = new JavaConstructorDescriptor( JavaConstructorDescriptor result = new JavaConstructorDescriptor(
(ClassDescriptor) newOwner, this, getAnnotations(), isPrimary, kind, SourceElement.NO_SOURCE (ClassDescriptor) newOwner, this, getAnnotations(), isPrimary, kind, getSourceToUseForCopy(preserveSource, original)
); );
result.setHasStableParameterNames(hasStableParameterNames()); result.setHasStableParameterNames(hasStableParameterNames());
result.setHasSynthesizedParameterNames(hasSynthesizedParameterNames()); result.setHasSynthesizedParameterNames(hasSynthesizedParameterNames());
@@ -105,7 +106,7 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme
@NotNull List<KotlinType> enhancedValueParametersTypes, @NotNull List<KotlinType> enhancedValueParametersTypes,
@NotNull KotlinType enhancedReturnType @NotNull KotlinType enhancedReturnType
) { ) {
JavaConstructorDescriptor enhanced = createSubstitutedCopy(getContainingDeclaration(), getOriginal(), getKind(), null); JavaConstructorDescriptor enhanced = createSubstitutedCopy(getContainingDeclaration(), getOriginal(), getKind(), null, false);
// We do not use doSubstitute here as in JavaMethodDescriptor.enhance because type parameters of constructor belongs to class // We do not use doSubstitute here as in JavaMethodDescriptor.enhance because type parameters of constructor belongs to class
enhanced.initialize( enhanced.initialize(
enhancedReceiverType, enhancedReceiverType,
@@ -114,7 +114,8 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
JavaMethodDescriptor result = new JavaMethodDescriptor( JavaMethodDescriptor result = new JavaMethodDescriptor(
newOwner, newOwner,
@@ -122,7 +123,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
getAnnotations(), getAnnotations(),
newName != null ? newName : getName(), newName != null ? newName : getName(),
kind, kind,
original != null ? original.getSource() : SourceElement.NO_SOURCE getSourceToUseForCopy(preserveSource, original)
); );
result.setParameterNamesStatus(hasStableParameterNames(), hasSynthesizedParameterNames()); result.setParameterNamesStatus(hasStableParameterNames(), hasSynthesizedParameterNames());
return result; return result;
@@ -146,7 +147,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), getOriginal(), isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), getOriginal(),
/* copyOverrides = */ true, getKind(), /* copyOverrides = */ true, getKind(),
enhancedValueParameters, enhancedReceiverType, enhancedReturnType, enhancedValueParameters, enhancedReceiverType, enhancedReturnType,
null); null, false);
assert enhancedMethod != null : "null after substitution while enhancing " + toString(); assert enhancedMethod != null : "null after substitution while enhancing " + toString();
return enhancedMethod; return enhancedMethod;
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.builtins.functions
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -42,8 +43,8 @@ public class FunctionInvokeDescriptor private constructor(
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
original: FunctionDescriptor?, original: FunctionDescriptor?,
kind: CallableMemberDescriptor.Kind, kind: CallableMemberDescriptor.Kind,
newName: Name? newName: Name?, preserveSource: Boolean
): FunctionInvokeDescriptor { ): FunctionDescriptorImpl {
return FunctionInvokeDescriptor(newOwner, original as FunctionInvokeDescriptor?, kind) return FunctionInvokeDescriptor(newOwner, original as FunctionInvokeDescriptor?, kind)
} }
@@ -115,7 +115,8 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
if (kind != Kind.DECLARATION && kind != Kind.SYNTHESIZED) { if (kind != Kind.DECLARATION && kind != Kind.SYNTHESIZED) {
throw new IllegalStateException("Attempt at creating a constructor that is not a declaration: \n" + throw new IllegalStateException("Attempt at creating a constructor that is not a declaration: \n" +
@@ -131,7 +132,7 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements
getAnnotations(), getAnnotations(),
isPrimary, isPrimary,
Kind.DECLARATION, Kind.DECLARATION,
SourceElement.NO_SOURCE getSourceToUseForCopy(preserveSource, original)
); );
} }
@@ -269,9 +269,9 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@NotNull Kind kind @NotNull Kind kind
) { ) {
return doSubstitute(originalSubstitutor, return doSubstitute(originalSubstitutor,
newOwner, newModality, newVisibility, isOperator, isInfix, isExternal, isInline, isTailrec, original, copyOverrides, kind, newOwner, newModality, newVisibility, isOperator, isInfix, isExternal, isInline, isTailrec, original, copyOverrides, kind,
getValueParameters(), getExtensionReceiverParameterType(), getReturnType(), getValueParameters(), getExtensionReceiverParameterType(), getReturnType(),
null); null, false);
} }
@Nullable @Nullable
@@ -298,9 +298,10 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@NotNull List<ValueParameterDescriptor> newValueParameterDescriptors, @NotNull List<ValueParameterDescriptor> newValueParameterDescriptors,
@Nullable KotlinType newExtensionReceiverParameterType, @Nullable KotlinType newExtensionReceiverParameterType,
@NotNull KotlinType newReturnType, @NotNull KotlinType newReturnType,
@Nullable Name name @Nullable Name name,
boolean preserveSource
) { ) {
FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(newOwner, original, kind, name); FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(newOwner, original, kind, name, preserveSource);
List<TypeParameterDescriptor> originalTypeParameters = getTypeParameters(); List<TypeParameterDescriptor> originalTypeParameters = getTypeParameters();
List<TypeParameterDescriptor> substitutedTypeParameters = new ArrayList<TypeParameterDescriptor>(originalTypeParameters.size()); List<TypeParameterDescriptor> substitutedTypeParameters = new ArrayList<TypeParameterDescriptor>(originalTypeParameters.size());
@@ -375,9 +376,17 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
); );
@NotNull
protected SourceElement getSourceToUseForCopy(boolean preserveSource, @Nullable FunctionDescriptor original) {
return preserveSource
? (original != null ? original.getSource() : getOriginal().getSource())
: SourceElement.NO_SOURCE;
}
@Override @Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) { public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitFunctionDescriptor(this, data); return visitor.visitFunctionDescriptor(this, data);
@@ -46,7 +46,8 @@ public class ScriptCodeDescriptor extends FunctionDescriptorImpl {
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
throw new IllegalStateException("no need to copy script code descriptor"); throw new IllegalStateException("no need to copy script code descriptor");
} }
@@ -77,7 +77,8 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
return new SimpleFunctionDescriptorImpl( return new SimpleFunctionDescriptorImpl(
newOwner, newOwner,
@@ -86,7 +87,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
getAnnotations(), getAnnotations(),
newName != null ? newName : getName(), newName != null ? newName : getName(),
kind, kind,
SourceElement.NO_SOURCE getSourceToUseForCopy(preserveSource, original)
); );
} }
@@ -109,20 +110,22 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@NotNull @NotNull
@Override @Override
public SimpleFunctionDescriptor createRenamedCopy(@NotNull Name name) { public SimpleFunctionDescriptor createRenamedCopy(@NotNull Name name) {
//noinspection ConstantConditions
return (SimpleFunctionDescriptorImpl) doSubstitute( return (SimpleFunctionDescriptorImpl) doSubstitute(
TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(), TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(),
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), isOperator(), isInfix(), isExternal(), isInline(), isTailrec(),
null, /* copyOverrides = */ true, getKind(), getValueParameters(), getExtensionReceiverParameterType(), getReturnType(), name null, /* copyOverrides = */ true, getKind(), getValueParameters(), getExtensionReceiverParameterType(), getReturnType(), name,
); /* preserveSource = */ true);
} }
@NotNull @NotNull
@Override @Override
public SimpleFunctionDescriptor createCopyWithNewValueParameters(@NotNull List<ValueParameterDescriptor> valueParameters) { public SimpleFunctionDescriptor createCopyWithNewValueParameters(@NotNull List<ValueParameterDescriptor> valueParameters) {
//noinspection ConstantConditions
return (SimpleFunctionDescriptorImpl) doSubstitute( return (SimpleFunctionDescriptorImpl) doSubstitute(
TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(), TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(),
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), isOperator(), isInfix(), isExternal(), isInline(), isTailrec(),
null, /* copyOverrides = */ true, getKind(), valueParameters, getExtensionReceiverParameterType(), getReturnType(), null null, /* copyOverrides = */ true, getKind(), valueParameters, getExtensionReceiverParameterType(), getReturnType(), null,
); /* preserveSource = */ true);
} }
} }
@@ -43,7 +43,8 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
return this; return this;
} }
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.serialization.deserialization.descriptors
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.NameResolver import org.jetbrains.kotlin.serialization.deserialization.NameResolver
@@ -40,7 +41,8 @@ public class DeserializedConstructorDescriptor(
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
original: FunctionDescriptor?, original: FunctionDescriptor?,
kind: CallableMemberDescriptor.Kind, kind: CallableMemberDescriptor.Kind,
newName: Name? newName: Name?,
preserveSource: Boolean
): DeserializedConstructorDescriptor { ): DeserializedConstructorDescriptor {
return DeserializedConstructorDescriptor( return DeserializedConstructorDescriptor(
newOwner as ClassDescriptor, original as ConstructorDescriptor?, newOwner as ClassDescriptor, original as ConstructorDescriptor?,
@@ -60,7 +60,8 @@ public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescript
@NotNull DeclarationDescriptor newOwner, @NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
@NotNull Kind kind, @NotNull Kind kind,
@Nullable Name newName @Nullable Name newName,
boolean preserveSource
) { ) {
return new DeserializedSimpleFunctionDescriptor( return new DeserializedSimpleFunctionDescriptor(
newOwner, newOwner,