From c7645bcf032e526c16a73ce21db3ec0f34bbae4e Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 20 Nov 2017 23:03:52 +0900 Subject: [PATCH] Kapt: Replace error.NonExistentClass usages to Object (as it does not break class hierarchies) --- .../stubs/ClassFileToSourceStubConverter.kt | 21 ++++++++++++++++--- .../nonExistentClassTypesConversion.txt | 6 +++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 395daecd38b..5df1d43970d 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -80,6 +80,8 @@ class ClassFileToSourceStubConverter( "kotlin.jvm." // Kotlin annotations from runtime ) + private val NON_EXISTENT_CLASS_NAME = FqName("error.NonExistentClass") + private val JAVA_KEYWORD_FILTER_REGEX = "[a-z]+".toRegex() private val JAVA_KEYWORDS = Tokens.TokenKind.values() @@ -121,13 +123,13 @@ class ClassFileToSourceStubConverter( private fun generateNonExistentClass(): JCCompilationUnit { val nonExistentClass = treeMaker.ClassDef( treeMaker.Modifiers((Flags.PUBLIC or Flags.FINAL).toLong()), - treeMaker.name("NonExistentClass"), + treeMaker.name(NON_EXISTENT_CLASS_NAME.shortName().asString()), JavacList.nil(), null, JavacList.nil(), JavacList.nil()) - val topLevel = treeMaker.TopLevelJava9Aware(treeMaker.SimpleName("error"), JavacList.of(nonExistentClass)) + val topLevel = treeMaker.TopLevelJava9Aware(treeMaker.FqName(NON_EXISTENT_CLASS_NAME.parent()), JavacList.of(nonExistentClass)) topLevel.sourcefile = KaptJavaFileObject(topLevel, nonExistentClass) @@ -641,7 +643,20 @@ class ClassFileToSourceStubConverter( } } - return ifNonError() + val nonErrorType = ifNonError() + + if (nonErrorType is JCFieldAccess) { + val qualifier = nonErrorType.selected + if (nonErrorType.name.toString() == NON_EXISTENT_CLASS_NAME.shortName().asString() + && qualifier is JCIdent + && qualifier.name.toString() == NON_EXISTENT_CLASS_NAME.parent().asString() + ) { + @Suppress("UNCHECKED_CAST") + return treeMaker.FqName("java.lang.Object") as T + } + } + + return nonErrorType } private fun isValidQualifiedName(name: FqName) = name.pathSegments().all { isValidIdentifier(it.asString()) } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/nonExistentClassTypesConversion.txt b/plugins/kapt3/kapt3-compiler/testData/converter/nonExistentClassTypesConversion.txt index cf7fc8d25e9..b87d4d086b7 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/nonExistentClassTypesConversion.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/nonExistentClassTypesConversion.txt @@ -94,7 +94,7 @@ public final class Test { @org.jetbrains.annotations.NotNull() public ABC nested; @org.jetbrains.annotations.NotNull() - private final error.NonExistentClass m = null; + private final java.lang.Object m = null; @org.jetbrains.annotations.NotNull() private final java.lang.String n = ""; @org.jetbrains.annotations.NotNull() @@ -289,7 +289,7 @@ public final class Test { @org.jetbrains.annotations.NotNull() @kapt.internal.KaptSignature("getM()Lerror/NonExistentClass;") - public final error.NonExistentClass getM() { + public final java.lang.Object getM() { return null; } @@ -352,7 +352,7 @@ public final class Test { @org.jetbrains.annotations.NotNull() @kapt.internal.KaptSignature("f4()Lerror/NonExistentClass;") - public final error.NonExistentClass f4() { + public final java.lang.Object f4() { return null; }