"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 org.jetbrains.kotlin.descriptors.*
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.incremental.components.LookupLocation
import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils
@@ -161,11 +160,13 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : BaseImportingSc
newOwner: DeclarationDescriptor,
newModality: Modality,
newVisibility: Visibility,
newIsOperator: Boolean,
newIsInfix: Boolean,
newIsExternal: Boolean,
newIsInline: Boolean,
newIsTailrec: Boolean,
isOperator: Boolean,
isInfix: Boolean,
isExternal: Boolean,
isInline: Boolean,
isTailrec: Boolean,
hasStableParameterNames: Boolean,
hasSynthesizedParameterNames: Boolean,
original: FunctionDescriptor?,
copyOverrides: Boolean,
kind: CallableMemberDescriptor.Kind,
@@ -178,7 +179,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : BaseImportingSc
): FunctionDescriptor? {
val descriptor = super.doSubstitute(
originalSubstitutor, newOwner, newModality, newVisibility,
newIsOperator, newIsInfix, newIsExternal, newIsInline, newIsTailrec, original,
isOperator, isInfix, isExternal, isInline, isTailrec, hasStableParameterNames, hasSynthesizedParameterNames, original,
copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType, name,
preserveSource, signatureChange)
as MyFunctionDescriptor? ?: return null
@@ -87,6 +87,8 @@ private fun createSynthesizedFunctionWithFirstParameterAsReceiver(descriptor: Fu
result.isExternal = original.isExternal
result.isInline = original.isInline
result.isTailrec = original.isTailrec
result.setHasStableParameterNames(false);
result.setHasSynthesizedParameterNames(true);
return result
}
@@ -4,6 +4,8 @@ class A(foo: Int.() -> Unit) {
}
}
fun test(foo: Int.() -> Unit) {
4.foo()
fun test(foo: Int.(String) -> Unit) {
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
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 constructor A(/*0*/ foo: kotlin.Int.() -> kotlin.Unit)
@@ -22,6 +22,6 @@ fun test2(f: (String) -> Unit) {
fun test3(f: String.(String) -> Unit) {
"".f("")
"".f(<!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!>p0<!> = ""<!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:
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
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.
JavaMethodDescriptor enhancedMethod = (JavaMethodDescriptor) doSubstitute(
TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(),
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), getOriginal(),
/* copyOverrides = */ true, getKind(),
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), hasStableParameterNames(), hasSynthesizedParameterNames(),
getOriginal(), /* copyOverrides = */ true, getKind(),
enhancedValueParameters, enhancedReceiverType, enhancedReturnType,
null, /* preserveSource */false, /* signatureChange = */ false);
@@ -39,6 +39,8 @@ public class FunctionInvokeDescriptor private constructor(
// "p0", "p1", etc. should not be baked into the language
override fun hasStableParameterNames(): Boolean = false
override fun hasSynthesizedParameterNames(): Boolean = true
override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor,
original: FunctionDescriptor?,
@@ -47,6 +47,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private boolean isExternal = false;
private boolean isInline = false;
private boolean isTailrec = false;
private boolean hasStableParameterNames = true;
private boolean hasSynthesizedParameterNames = false;
private final Set<FunctionDescriptor> overriddenFunctions = SmartSet.create();
private final FunctionDescriptor original;
private final Kind kind;
@@ -83,7 +85,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
this.visibility = visibility;
this.extensionReceiverParameter = DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverParameterType);
this.dispatchReceiverParameter = dispatchReceiverParameter;
for (int i = 0; i < typeParameters.size(); ++i) {
TypeParameterDescriptor typeParameterDescriptor = typeParameters.get(i);
if (typeParameterDescriptor.getIndex() != i) {
@@ -135,6 +137,14 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
this.unsubstitutedReturnType = unsubstitutedReturnType;
}
public void setHasStableParameterNames(boolean hasStableParameterNames) {
this.hasStableParameterNames = hasStableParameterNames;
}
public void setHasSynthesizedParameterNames(boolean hasSynthesizedParameterNames) {
this.hasSynthesizedParameterNames = hasSynthesizedParameterNames;
}
@Nullable
@Override
public ReceiverParameterDescriptor getExtensionReceiverParameter() {
@@ -221,12 +231,12 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@Override
public boolean hasStableParameterNames() {
return true;
return hasStableParameterNames;
}
@Override
public boolean hasSynthesizedParameterNames() {
return false;
return hasSynthesizedParameterNames;
}
@Override
@@ -253,6 +263,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
}
return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, visibility,
isOperator, isInfix, isExternal, isInline, isTailrec,
hasStableParameterNames, hasSynthesizedParameterNames,
getOriginal(), true, getKind());
}
@@ -266,12 +277,16 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
boolean isExternal,
boolean isInline,
boolean isTailrec,
boolean hasStableParameterNames,
boolean hasSynthesizedParameterNames,
@Nullable FunctionDescriptor original,
boolean copyOverrides,
@NotNull Kind kind
) {
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(),
null, /* preserveSource = */ false, /* signatureChange */ false);
}
@@ -294,6 +309,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
boolean isExternal,
boolean isInline,
boolean isTailrec,
boolean hasStableParameterNames,
boolean hasSynthesizedParameterNames,
@Nullable FunctionDescriptor original,
boolean copyOverrides,
@NotNull Kind kind,
@@ -364,6 +381,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
substitutedDescriptor.setExternal(isExternal);
substitutedDescriptor.setInline(isInline);
substitutedDescriptor.setTailrec(isTailrec);
substitutedDescriptor.setHasStableParameterNames(hasStableParameterNames);
substitutedDescriptor.setHasSynthesizedParameterNames(hasSynthesizedParameterNames);
if (signatureChange || getInitialSignatureDescriptor() != null) {
FunctionDescriptor initialSignature = (getInitialSignatureDescriptor() != null ? getInitialSignatureDescriptor() : this);
@@ -103,6 +103,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
return (SimpleFunctionDescriptorImpl) doSubstitute(
TypeSubstitutor.EMPTY, newOwner, modality, visibility,
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(),
hasStableParameterNames(), hasSynthesizedParameterNames(),
null, copyOverrides, kind
);
}
@@ -113,7 +114,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
//noinspection ConstantConditions
return (SimpleFunctionDescriptorImpl) doSubstitute(
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,
/* preserveSource = */ true, /* signatureChange = */ true);
}
@@ -124,7 +125,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
//noinspection ConstantConditions
return (SimpleFunctionDescriptorImpl) doSubstitute(
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,
/* preserveSource = */ true, /* signatureChange = */ true);
}
@@ -4,5 +4,5 @@ fun x(name: String, next: (name: String) -> String): String {
//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
/*
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>p1: String</highlight>, p2: String), Disabled: false, Strikeout: false, Green: true
*/