diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index e5c847adf50..2eb0b929041 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -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 diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt index 4d104d936d4..b1fe40439c4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt @@ -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 } diff --git a/compiler/testData/diagnostics/tests/extensions/variableInvoke.kt b/compiler/testData/diagnostics/tests/extensions/variableInvoke.kt index b503b6cb3ea..40c84b89314 100644 --- a/compiler/testData/diagnostics/tests/extensions/variableInvoke.kt +++ b/compiler/testData/diagnostics/tests/extensions/variableInvoke.kt @@ -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(p1 = "") + 4.foo(p2 = "") } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/extensions/variableInvoke.txt b/compiler/testData/diagnostics/tests/extensions/variableInvoke.txt index 78cf142ba81..be0d7a1d2e8 100644 --- a/compiler/testData/diagnostics/tests/extensions/variableInvoke.txt +++ b/compiler/testData/diagnostics/tests/extensions/variableInvoke.txt @@ -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) diff --git a/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.kt b/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.kt index faba565b15b..8ab8ab3fa25 100644 --- a/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.kt +++ b/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.kt @@ -22,6 +22,6 @@ fun test2(f: (String) -> Unit) { fun test3(f: String.(String) -> Unit) { "".f("") - "".f(p0 = "") - "".f(zzz = "") + "".f(p0 = "") + "".f(zzz = "") } diff --git a/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt b/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt index dd16c9fa987..932d572885c 100644 --- a/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt +++ b/compiler/testData/resolvedCalls/functionTypes/valOfFunctionTypeInvoke.txt @@ -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} diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java index 5747d2940eb..82bdbc3b45c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java @@ -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); diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt index b4113095009..ed9fa85e3c2 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/functions/FunctionInvokeDescriptor.kt @@ -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?, diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index 4851d7379d8..aec239db003 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -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 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); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java index 565c0e7fd2c..89f6ee7cb6a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java @@ -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); } diff --git a/idea/testData/parameterInfo/functionCall/FunctionalValue1.kt b/idea/testData/parameterInfo/functionCall/FunctionalValue1.kt index 8e9bafc5438..80176adec69 100644 --- a/idea/testData/parameterInfo/functionCall/FunctionalValue1.kt +++ b/idea/testData/parameterInfo/functionCall/FunctionalValue1.kt @@ -4,5 +4,5 @@ fun x(name: String, next: (name: String) -> String): String { //TODO: use parameter names from functional type /* -Text: (p1: String), Disabled: false, Strikeout: false, Green: true +Text: (String), Disabled: false, Strikeout: false, Green: true */ diff --git a/idea/testData/parameterInfo/functionCall/FunctionalValue2.kt b/idea/testData/parameterInfo/functionCall/FunctionalValue2.kt index 5bac95ac4d4..9bc7eb2de70 100644 --- a/idea/testData/parameterInfo/functionCall/FunctionalValue2.kt +++ b/idea/testData/parameterInfo/functionCall/FunctionalValue2.kt @@ -7,6 +7,6 @@ fun call() { //TODO: use parameter names from functional type /* +Text: (String, String), Disabled: false, Strikeout: false, Green: true Text: (name: String, value: Int), Disabled: false, Strikeout: false, Green: false -Text: (p1: String, p2: String), Disabled: false, Strikeout: false, Green: true */