diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 5b3177aaba0..668214003d4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -313,7 +313,11 @@ public class DescriptorResolver { Name parameterName; if (destructuringDeclaration == null) { - parameterName = UnderscoreUtilKt.isSingleUnderscore(valueParameter) + // NB: val/var for parameter is only allowed in primary constructors where single underscore names are still prohibited. + // The problem with val/var is that when lazy resolve try to find their descriptor, it searches through the member scope + // of containing class where, it can not find a descriptor with special name. + // Thus, to preserve behavior, we don't use a special name for val/var. + parameterName = !valueParameter.hasValOrVar() && UnderscoreUtilKt.isSingleUnderscore(valueParameter) ? Name.special("") : KtPsiUtil.safeName(valueParameter.getName()); } diff --git a/compiler/testData/diagnostics/tests/Underscore.kt b/compiler/testData/diagnostics/tests/Underscore.kt index d8fafd4f730..57628b74cdd 100644 --- a/compiler/testData/diagnostics/tests/Underscore.kt +++ b/compiler/testData/diagnostics/tests/Underscore.kt @@ -19,9 +19,24 @@ fun __(___: Int, y: _< val _ = 56 + fun localFun(_: String) = 1 + __@ return if (y != null) __(____, y) else __(`_`, ______) } + +class A1(val _: String) +class A2(_: String) { + class B { + typealias _ = CharSequence + } + val _: Int = 1 + + fun _() {} + + fun foo(_: Double) {} +} + // one underscore parameters for named function are still prohibited fun oneUnderscore(_: Int) {} diff --git a/compiler/testData/diagnostics/tests/Underscore.txt b/compiler/testData/diagnostics/tests/Underscore.txt index 93899cfef8b..a2647a6e5f1 100644 --- a/compiler/testData/diagnostics/tests/Underscore.txt +++ b/compiler/testData/diagnostics/tests/Underscore.txt @@ -7,6 +7,32 @@ public fun __(/*0*/ ___: kotlin.Int, /*1*/ y: _?): kotlin.Int public fun doIt(/*0*/ f: (kotlin.Any?) -> kotlin.Any?): kotlin.Any? public fun oneUnderscore(/*0*/ : kotlin.Int): kotlin.Unit +public final class A1 { + public constructor A1(/*0*/ _: kotlin.String) + public final val _: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class A2 { + public constructor A2(/*0*/ : kotlin.String) + public final val _: kotlin.Int = 1 + public final fun _(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(/*0*/ : kotlin.Double): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class B { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public typealias _ = kotlin.CharSequence + } +} + @kotlin.Deprecated(message = "") public final data class Pair { public constructor Pair(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int) public final val x: kotlin.Int