Make DescriptorRenderer escape names with dollars and other characters

#KT-5791 Fixed
This commit is contained in:
Alexander Udalov
2014-09-17 19:55:04 +04:00
parent 483232a3e5
commit 9434114c45
7 changed files with 52 additions and 17 deletions
+2 -2
View File
@@ -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
@@ -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");