Kapt3: Ignore packages with Java keywords inside (KT-17184)

This commit is contained in:
Yan Zhulanow
2017-04-06 22:05:46 +03:00
committed by Yan Zhulanow
parent 1c5765628e
commit 1a342faf38
6 changed files with 51 additions and 25 deletions
@@ -189,6 +189,7 @@ class ClassFileToSourceStubConverter(
*/
private fun convertClass(clazz: ClassNode, packageFqName: String, isTopLevel: Boolean): JCClassDecl? {
if (isSynthetic(clazz.access)) return null
if (checkIfShouldBeIgnored(Type.getObjectType(clazz.name))) return null
val descriptor = kaptContext.origins[clazz]?.descriptor as? DeclarationDescriptor ?: return null
val isNested = (descriptor as? ClassDescriptor)?.isNested ?: false
@@ -281,11 +282,6 @@ class ClassFileToSourceStubConverter(
if (enumValuesData.any { it.innerClass == innerClass }) return@mapJList null
if (innerClass.outerName != clazz.name) return@mapJList null
val innerClassNode = kaptContext.compiledClasses.firstOrNull { it.name == innerClass.name } ?: return@mapJList null
if (checkIfInnerClassNameConflictsWithOuter(innerClassNode, clazz)) {
kaptContext.logger.warn(innerClassNode.name.replace('/', '.').replace('$', '.')
+ " will be ignored (name is clashing with the outer class name)")
return@mapJList null
}
convertClass(innerClassNode, packageFqName, false)
}
@@ -306,6 +302,11 @@ class ClassFileToSourceStubConverter(
if (type.sort != Type.OBJECT) return false
val internalName = type.internalName
// Ignore type names with Java keywords in it
if (internalName.split('/', '.').any { it in JAVA_KEYWORDS }) {
return true
}
val clazz = kaptContext.compiledClasses.firstOrNull { it.name == internalName } ?: return false
return checkIfInnerClassNameConflictsWithOuter(clazz)
}
@@ -557,8 +558,7 @@ class ClassFileToSourceStubConverter(
return name
}
// In theory, this could lead to member/parameter name clashes, though it's supposed to be extremely rare.
if (name in JAVA_KEYWORDS) return '_' + name + '_'
if (name in JAVA_KEYWORDS) return null
if (name.isEmpty()
|| !Character.isJavaIdentifierStart(name[0])
@@ -126,6 +126,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi
doTest(fileName);
}
@TestMetadata("javaKeywordsInPackageNames.kt")
public void testJavaKeywordsInPackageNames() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/javaKeywordsInPackageNames.kt");
doTest(fileName);
}
@TestMetadata("jvmOverloads.kt")
public void testJvmOverloads() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/jvmOverloads.kt");
-15
View File
@@ -1,16 +1 @@
public final class _default_ {
@org.jetbrains.annotations.NotNull()
public java.lang.String _extends_;
@org.jetbrains.annotations.NotNull()
public final java.lang.String getExtends() {
return null;
}
public final void _implements_(int _instanceof_) {
}
public _default_() {
super();
}
}
@@ -0,0 +1,19 @@
// FILE: a.kt
package a.b.c
class A
// FILE: b.kt
package a.`do`.c
class B
// FILE: c.kt
package case.a
class C
// FILE: d.kt
package a.b.c.d.e.`for`
class D
// FILE: e.kt
package a.b.`typealias`.c
class E
@@ -0,0 +1,19 @@
package a.b.c;
public final class A {
public A() {
super();
}
}
////////////////////
package a.b.typealias.c;
public final class E {
public E() {
super();
}
}
-3
View File
@@ -4,9 +4,6 @@ public final class Outer {
java.lang.String s, int i) {
}
public abstract void _abstract_(@org.jetbrains.annotations.NotNull()
java.lang.String p0, int p1);
public Outer() {
super();
}