No synthetic properties with incorrect names

This commit is contained in:
Valentin Kipyatkov
2015-07-08 22:56:43 +03:00
parent fa02a15212
commit a014f5c8db
4 changed files with 23 additions and 3 deletions
@@ -52,6 +52,10 @@ class SyntheticExtensionsScope(storageManager: StorageManager) : JetScope by Jet
}
private fun syntheticPropertyInClassNotCached(javaClass: JavaClassDescriptor, type: JetType, name: Name): PropertyDescriptor? {
if (name.isSpecial()) return null
val firstChar = name.getIdentifier()[0]
if (!firstChar.isJavaIdentifierStart() || firstChar.isUpperCase()) return null
val memberScope = javaClass.getMemberScope(type.getArguments())
val getMethod = memberScope.getFunctions(toGetMethodName(name)).singleOrNull { isGoodGetMethod(it) } ?: return null
@@ -75,8 +79,6 @@ class SyntheticExtensionsScope(storageManager: StorageManager) : JetScope by Jet
}
override fun getSyntheticExtensionProperties(receiverType: JetType, name: Name): Collection<VariableDescriptor> {
if (name.isSpecial()) return emptyList()
if (name.getIdentifier()[0].isUpperCase()) return emptyList()
return collectSyntheticPropertiesByName(null, receiverType.makeNotNullable(), name) ?: emptyList()
}
@@ -138,7 +140,9 @@ class SyntheticExtensionsScope(storageManager: StorageManager) : JetScope by Jet
if (methodName.isSpecial()) return null
val identifier = methodName.getIdentifier()
if (!identifier.startsWith("get")) return null
return Name.identifier(identifier.removePrefix("get").decapitalize())
val name = identifier.removePrefix("get").decapitalize()
if (!Name.isValidIdentifier(name)) return null
return Name.identifier(name)
}
private class MyPropertyDescriptor(
@@ -0,0 +1,4 @@
class JavaClass {
public int get() { return 1; }
public int get1() { return 1; }
}
@@ -0,0 +1,6 @@
fun foo(javaClass: JavaClass) {
javaClass.<caret>
}
// ABSENT: ""
// ABSENT: "1"
@@ -131,6 +131,12 @@ public class MultiFileJvmBasicCompletionTestGenerated extends AbstractMultiFileJ
doTest(fileName);
}
@TestMetadata("IncorrectGetters")
public void testIncorrectGetters() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/IncorrectGetters/");
doTest(fileName);
}
@TestMetadata("JavaInnerClasses")
public void testJavaInnerClasses() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/multifile/JavaInnerClasses/");