"invoke" from function types do not have any meaningful parameter names

This commit is contained in:
Valentin Kipyatkov
2015-11-13 17:32:20 +03:00
parent 5b668cb6a6
commit 2e2dfcb4a0
12 changed files with 50 additions and 23 deletions
@@ -19,7 +19,6 @@ 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
@@ -161,11 +160,13 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : BaseImportingSc
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
newModality: Modality, newModality: Modality,
newVisibility: Visibility, newVisibility: Visibility,
newIsOperator: Boolean, isOperator: Boolean,
newIsInfix: Boolean, isInfix: Boolean,
newIsExternal: Boolean, isExternal: Boolean,
newIsInline: Boolean, isInline: Boolean,
newIsTailrec: Boolean, isTailrec: Boolean,
hasStableParameterNames: Boolean,
hasSynthesizedParameterNames: Boolean,
original: FunctionDescriptor?, original: FunctionDescriptor?,
copyOverrides: Boolean, copyOverrides: Boolean,
kind: CallableMemberDescriptor.Kind, kind: CallableMemberDescriptor.Kind,
@@ -178,7 +179,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : BaseImportingSc
): FunctionDescriptor? { ): FunctionDescriptor? {
val descriptor = super.doSubstitute( val descriptor = super.doSubstitute(
originalSubstitutor, newOwner, newModality, newVisibility, originalSubstitutor, newOwner, newModality, newVisibility,
newIsOperator, newIsInfix, newIsExternal, newIsInline, newIsTailrec, original, isOperator, isInfix, isExternal, isInline, isTailrec, hasStableParameterNames, hasSynthesizedParameterNames, original,
copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType, name, copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType, name,
preserveSource, signatureChange) preserveSource, signatureChange)
as MyFunctionDescriptor? ?: return null as MyFunctionDescriptor? ?: return null
@@ -87,6 +87,8 @@ private fun createSynthesizedFunctionWithFirstParameterAsReceiver(descriptor: Fu
result.isExternal = original.isExternal result.isExternal = original.isExternal
result.isInline = original.isInline result.isInline = original.isInline
result.isTailrec = original.isTailrec result.isTailrec = original.isTailrec
result.setHasStableParameterNames(false);
result.setHasSynthesizedParameterNames(true);
return result return result
} }
@@ -4,6 +4,8 @@ class A(foo: Int.() -> Unit) {
} }
} }
fun test(foo: Int.() -> Unit) { fun test(foo: Int.(String) -> Unit) {
4.foo() 4.foo("")
4.foo(<!NAMED_ARGUMENTS_NOT_ALLOWED, NAMED_PARAMETER_NOT_FOUND!>p1<!> = ""<!NO_VALUE_FOR_PARAMETER!>)<!>
4.foo(<!NAMED_ARGUMENTS_NOT_ALLOWED!>p2<!> = "")
} }
@@ -1,6 +1,6 @@
package package
public fun test(/*0*/ foo: kotlin.Int.() -> kotlin.Unit): kotlin.Unit public fun test(/*0*/ foo: kotlin.Int.(kotlin.String) -> kotlin.Unit): kotlin.Unit
public final class A { public final class A {
public constructor A(/*0*/ foo: kotlin.Int.() -> kotlin.Unit) public constructor A(/*0*/ foo: kotlin.Int.() -> kotlin.Unit)
@@ -22,6 +22,6 @@ fun test2(f: (String) -> Unit) {
fun test3(f: String.(String) -> Unit) { fun test3(f: String.(String) -> Unit) {
"".f("") "".f("")
"".f(<!NAMED_PARAMETER_NOT_FOUND!>p0<!> = ""<!NO_VALUE_FOR_PARAMETER!>)<!> "".f(<!NAMED_ARGUMENTS_NOT_ALLOWED, NAMED_PARAMETER_NOT_FOUND!>p0<!> = ""<!NO_VALUE_FOR_PARAMETER!>)<!>
"".f(<!NAMED_PARAMETER_NOT_FOUND!>zzz<!> = ""<!NO_VALUE_FOR_PARAMETER!>)<!> "".f(<!NAMED_ARGUMENTS_NOT_ALLOWED, NAMED_PARAMETER_NOT_FOUND!>zzz<!> = ""<!NO_VALUE_FOR_PARAMETER!>)<!>
} }
@@ -9,7 +9,7 @@ fun test(a: A) {
Resolved call: Resolved call:
Resulting descriptor: operator fun invoke(p1: Int): Int defined in kotlin.Function1 Resulting descriptor: operator fun invoke(Int): Int defined in kotlin.Function1
Explicit receiver kind = DISPATCH_RECEIVER Explicit receiver kind = DISPATCH_RECEIVER
Dispatch receiver = foo {Function1<Int, Int>} Dispatch receiver = foo {Function1<Int, Int>}
@@ -144,8 +144,8 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
// 2. copies method's type parameters (with new containing declaration) and properly substitute to them in value parameters, return type and etc. // 2. copies method's type parameters (with new containing declaration) and properly substitute to them in value parameters, return type and etc.
JavaMethodDescriptor enhancedMethod = (JavaMethodDescriptor) doSubstitute( JavaMethodDescriptor enhancedMethod = (JavaMethodDescriptor) doSubstitute(
TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(), TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(),
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), getOriginal(), isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), hasStableParameterNames(), hasSynthesizedParameterNames(),
/* copyOverrides = */ true, getKind(), getOriginal(), /* copyOverrides = */ true, getKind(),
enhancedValueParameters, enhancedReceiverType, enhancedReturnType, enhancedValueParameters, enhancedReceiverType, enhancedReturnType,
null, /* preserveSource */false, /* signatureChange = */ false); null, /* preserveSource */false, /* signatureChange = */ false);
@@ -39,6 +39,8 @@ public class FunctionInvokeDescriptor private constructor(
// "p0", "p1", etc. should not be baked into the language // "p0", "p1", etc. should not be baked into the language
override fun hasStableParameterNames(): Boolean = false override fun hasStableParameterNames(): Boolean = false
override fun hasSynthesizedParameterNames(): Boolean = true
override fun createSubstitutedCopy( override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor, newOwner: DeclarationDescriptor,
original: FunctionDescriptor?, original: FunctionDescriptor?,
@@ -47,6 +47,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private boolean isExternal = false; private boolean isExternal = false;
private boolean isInline = false; private boolean isInline = false;
private boolean isTailrec = false; private boolean isTailrec = false;
private boolean hasStableParameterNames = true;
private boolean hasSynthesizedParameterNames = false;
private final Set<FunctionDescriptor> overriddenFunctions = SmartSet.create(); private final Set<FunctionDescriptor> overriddenFunctions = SmartSet.create();
private final FunctionDescriptor original; private final FunctionDescriptor original;
private final Kind kind; private final Kind kind;
@@ -135,6 +137,14 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
this.unsubstitutedReturnType = unsubstitutedReturnType; this.unsubstitutedReturnType = unsubstitutedReturnType;
} }
public void setHasStableParameterNames(boolean hasStableParameterNames) {
this.hasStableParameterNames = hasStableParameterNames;
}
public void setHasSynthesizedParameterNames(boolean hasSynthesizedParameterNames) {
this.hasSynthesizedParameterNames = hasSynthesizedParameterNames;
}
@Nullable @Nullable
@Override @Override
public ReceiverParameterDescriptor getExtensionReceiverParameter() { public ReceiverParameterDescriptor getExtensionReceiverParameter() {
@@ -221,12 +231,12 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@Override @Override
public boolean hasStableParameterNames() { public boolean hasStableParameterNames() {
return true; return hasStableParameterNames;
} }
@Override @Override
public boolean hasSynthesizedParameterNames() { public boolean hasSynthesizedParameterNames() {
return false; return hasSynthesizedParameterNames;
} }
@Override @Override
@@ -253,6 +263,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
} }
return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, visibility, return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, visibility,
isOperator, isInfix, isExternal, isInline, isTailrec, isOperator, isInfix, isExternal, isInline, isTailrec,
hasStableParameterNames, hasSynthesizedParameterNames,
getOriginal(), true, getKind()); getOriginal(), true, getKind());
} }
@@ -266,12 +277,16 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
boolean isExternal, boolean isExternal,
boolean isInline, boolean isInline,
boolean isTailrec, boolean isTailrec,
boolean hasStableParameterNames,
boolean hasSynthesizedParameterNames,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
boolean copyOverrides, boolean copyOverrides,
@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,
hasStableParameterNames, hasSynthesizedParameterNames,
original, copyOverrides, kind,
getValueParameters(), getExtensionReceiverParameterType(), getReturnType(), getValueParameters(), getExtensionReceiverParameterType(), getReturnType(),
null, /* preserveSource = */ false, /* signatureChange */ false); null, /* preserveSource = */ false, /* signatureChange */ false);
} }
@@ -294,6 +309,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
boolean isExternal, boolean isExternal,
boolean isInline, boolean isInline,
boolean isTailrec, boolean isTailrec,
boolean hasStableParameterNames,
boolean hasSynthesizedParameterNames,
@Nullable FunctionDescriptor original, @Nullable FunctionDescriptor original,
boolean copyOverrides, boolean copyOverrides,
@NotNull Kind kind, @NotNull Kind kind,
@@ -364,6 +381,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
substitutedDescriptor.setExternal(isExternal); substitutedDescriptor.setExternal(isExternal);
substitutedDescriptor.setInline(isInline); substitutedDescriptor.setInline(isInline);
substitutedDescriptor.setTailrec(isTailrec); substitutedDescriptor.setTailrec(isTailrec);
substitutedDescriptor.setHasStableParameterNames(hasStableParameterNames);
substitutedDescriptor.setHasSynthesizedParameterNames(hasSynthesizedParameterNames);
if (signatureChange || getInitialSignatureDescriptor() != null) { if (signatureChange || getInitialSignatureDescriptor() != null) {
FunctionDescriptor initialSignature = (getInitialSignatureDescriptor() != null ? getInitialSignatureDescriptor() : this); FunctionDescriptor initialSignature = (getInitialSignatureDescriptor() != null ? getInitialSignatureDescriptor() : this);
@@ -103,6 +103,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
return (SimpleFunctionDescriptorImpl) doSubstitute( return (SimpleFunctionDescriptorImpl) doSubstitute(
TypeSubstitutor.EMPTY, newOwner, modality, visibility, TypeSubstitutor.EMPTY, newOwner, modality, visibility,
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), isOperator(), isInfix(), isExternal(), isInline(), isTailrec(),
hasStableParameterNames(), hasSynthesizedParameterNames(),
null, copyOverrides, kind null, copyOverrides, kind
); );
} }
@@ -113,7 +114,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
//noinspection ConstantConditions //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(), hasStableParameterNames(), hasSynthesizedParameterNames(),
null, /* copyOverrides = */ true, getKind(), getValueParameters(), getExtensionReceiverParameterType(), getReturnType(), name, null, /* copyOverrides = */ true, getKind(), getValueParameters(), getExtensionReceiverParameterType(), getReturnType(), name,
/* preserveSource = */ true, /* signatureChange = */ true); /* preserveSource = */ true, /* signatureChange = */ true);
} }
@@ -124,7 +125,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
//noinspection ConstantConditions //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(), hasStableParameterNames(), hasSynthesizedParameterNames(),
null, /* copyOverrides = */ true, getKind(), valueParameters, getExtensionReceiverParameterType(), getReturnType(), null, null, /* copyOverrides = */ true, getKind(), valueParameters, getExtensionReceiverParameterType(), getReturnType(), null,
/* preserveSource = */ true, /* signatureChange = */ true); /* preserveSource = */ true, /* signatureChange = */ true);
} }
@@ -4,5 +4,5 @@ fun x(name: String, next: (name: String) -> String): String {
//TODO: use parameter names from functional type //TODO: use parameter names from functional type
/* /*
Text: (<highlight>p1: String</highlight>), Disabled: false, Strikeout: false, Green: true Text: (<highlight>String</highlight>), Disabled: false, Strikeout: false, Green: true
*/ */
@@ -7,6 +7,6 @@ fun call() {
//TODO: use parameter names from functional type //TODO: use parameter names from functional type
/* /*
Text: (<highlight>String</highlight>, String), Disabled: false, Strikeout: false, Green: true
Text: (<highlight>name: String</highlight>, value: Int), Disabled: false, Strikeout: false, Green: false Text: (<highlight>name: String</highlight>, value: Int), Disabled: false, Strikeout: false, Green: false
Text: (<highlight>p1: String</highlight>, p2: String), Disabled: false, Strikeout: false, Green: true
*/ */