Make DescriptorRenderer escape names with dollars and other characters
#KT-5791 Fixed
This commit is contained in:
@@ -21,9 +21,9 @@ ERROR: compiler/testData/cli/jvm/signatureClash.kt: (20, 5) Platform declaration
|
||||
fun <get-tr>(): kotlin.Int
|
||||
fun getTr(): kotlin.Int
|
||||
ERROR: compiler/testData/cli/jvm/signatureClash.kt: (24, 7) Platform declaration clash: The following declarations have the same JVM signature (f$b$0(LC;)V):
|
||||
fun f$b$0(c: C): kotlin.Unit
|
||||
fun `f$b$0`(c: C): kotlin.Unit
|
||||
fun f(): kotlin.Unit
|
||||
ERROR: compiler/testData/cli/jvm/signatureClash.kt: (26, 5) Platform declaration clash: The following declarations have the same JVM signature (f$b$0(LC;)V):
|
||||
fun f$b$0(c: C): kotlin.Unit
|
||||
fun `f$b$0`(c: C): kotlin.Unit
|
||||
fun f(): kotlin.Unit
|
||||
COMPILATION_ERROR
|
||||
@@ -1,20 +1,20 @@
|
||||
WARNING: compiler/testData/cli/jvm/syntheticAccessorSignatureClash.kt: (34, 17) Variable 's' is never used
|
||||
ERROR: compiler/testData/cli/jvm/syntheticAccessorSignatureClash.kt: (15, 5) Accidental override: The following declarations have the same JVM signature (foo$b$0(LDerived;)V):
|
||||
fun foo$b$0(d: Derived): kotlin.Unit
|
||||
fun `foo$b$0`(d: Derived): kotlin.Unit
|
||||
fun foo(): kotlin.Unit
|
||||
ERROR: compiler/testData/cli/jvm/syntheticAccessorSignatureClash.kt: (18, 9) Accidental override: The following declarations have the same JVM signature (getBar$b$1(LDerived;)I):
|
||||
fun getBar$b$1(d: Derived): kotlin.Int
|
||||
fun `getBar$b$1`(d: Derived): kotlin.Int
|
||||
fun <get-bar>(): kotlin.Int
|
||||
ERROR: compiler/testData/cli/jvm/syntheticAccessorSignatureClash.kt: (19, 9) Accidental override: The following declarations have the same JVM signature (setBar$b$1(LDerived;I)V):
|
||||
fun setBar$b$1(d: Derived, i: kotlin.Int): kotlin.Unit
|
||||
fun `setBar$b$1`(d: Derived, i: kotlin.Int): kotlin.Unit
|
||||
fun <set-bar>(<set-?>: kotlin.Int): kotlin.Unit
|
||||
ERROR: compiler/testData/cli/jvm/syntheticAccessorSignatureClash.kt: (21, 5) Accidental override: The following declarations have the same JVM signature (getBaz$b$2(LDerived;)I):
|
||||
fun getBaz$b$2(d: Derived): kotlin.Int
|
||||
fun `getBaz$b$2`(d: Derived): kotlin.Int
|
||||
fun <get-baz>(): kotlin.Int
|
||||
ERROR: compiler/testData/cli/jvm/syntheticAccessorSignatureClash.kt: (23, 5) Accidental override: The following declarations have the same JVM signature (getBoo$b$3(LDerived;)I):
|
||||
fun getBoo$b$3(d: Derived): kotlin.Int
|
||||
fun `getBoo$b$3`(d: Derived): kotlin.Int
|
||||
fun <get-boo>(): kotlin.Int
|
||||
ERROR: compiler/testData/cli/jvm/syntheticAccessorSignatureClash.kt: (27, 9) Accidental override: The following declarations have the same JVM signature (setBar1$b$4(LDerived;I)V):
|
||||
fun setBar1$b$4(d: Derived, i: kotlin.Int): kotlin.Unit
|
||||
fun `setBar1$b$4`(d: Derived, i: kotlin.Int): kotlin.Unit
|
||||
fun <set-bar1>(<set-?>: kotlin.Int): kotlin.Unit
|
||||
COMPILATION_ERROR
|
||||
+7
-7
@@ -1,17 +1,17 @@
|
||||
package test
|
||||
|
||||
internal final annotation class $$$$$$ : kotlin.Annotation {
|
||||
/*primary*/ public constructor $$$$$$()
|
||||
internal final annotation class `$$$$$$` : kotlin.Annotation {
|
||||
/*primary*/ public constructor `$$$$$$`()
|
||||
}
|
||||
|
||||
test.$$$$$$() internal final class A {
|
||||
test.`$$$$$$`() internal final class A {
|
||||
/*primary*/ public constructor A()
|
||||
}
|
||||
|
||||
internal final annotation class Anno$tation : kotlin.Annotation {
|
||||
/*primary*/ public constructor Anno$tation()
|
||||
internal final annotation class `Anno$tation` : kotlin.Annotation {
|
||||
/*primary*/ public constructor `Anno$tation`()
|
||||
}
|
||||
|
||||
test.Anno$tation() internal final class Cla$s {
|
||||
/*primary*/ public constructor Cla$s()
|
||||
test.`Anno$tation`() internal final class `Cla$s` {
|
||||
/*primary*/ public constructor `Cla$s`()
|
||||
}
|
||||
|
||||
@@ -201,8 +201,23 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
|
||||
@Override
|
||||
@NotNull
|
||||
public String renderName(@NotNull Name identifier) {
|
||||
String asString = identifier.toString();
|
||||
return escape(KeywordStringsGenerated.KEYWORDS.contains(asString) ? '`' + asString + '`' : asString);
|
||||
String asString = identifier.asString();
|
||||
return escape(nameShouldBeEscaped(identifier) ? '`' + asString + '`' : asString);
|
||||
}
|
||||
|
||||
private static boolean nameShouldBeEscaped(@NotNull Name identifier) {
|
||||
if (identifier.isSpecial()) return false;
|
||||
|
||||
String name = identifier.asString();
|
||||
|
||||
if (KeywordStringsGenerated.KEYWORDS.contains(name)) return true;
|
||||
|
||||
for (int i = 0; i < name.length(); i++) {
|
||||
char c = name.charAt(i);
|
||||
if (!Character.isLetterOrDigit(c) && c != '_') return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void renderName(@NotNull DeclarationDescriptor descriptor, @NotNull StringBuilder builder) {
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fun `$$$$`() {}
|
||||
|
||||
fun foo() {
|
||||
<caret>
|
||||
}
|
||||
|
||||
// EXIST: $$$$
|
||||
// INVOCATION_COUNT: 2
|
||||
@@ -390,6 +390,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NameWithDollars.kt")
|
||||
public void testNameWithDollars() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NameWithDollars.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NamedObject.kt")
|
||||
public void testNamedObject() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NamedObject.kt");
|
||||
|
||||
@@ -390,6 +390,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NameWithDollars.kt")
|
||||
public void testNameWithDollars() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NameWithDollars.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NamedObject.kt")
|
||||
public void testNamedObject() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NamedObject.kt");
|
||||
|
||||
Reference in New Issue
Block a user