From 6c4a2db34be0ba607f88ae8738ff2111adb2545d Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 7 Feb 2018 23:57:14 +0300 Subject: [PATCH] Kapt: Enums inside enum values should be forbidden (KT-22582) --- .../stubs/ClassFileToSourceStubConverter.kt | 34 +++++++++++++++++++ .../testData/converter/enums.kt | 10 ++++++ .../testData/converter/enums.txt | 13 +++++++ 3 files changed, 57 insertions(+) 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 c8f9fa1b920..2c077a5979e 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 @@ -22,6 +22,7 @@ import com.sun.tools.javac.parser.Tokens import com.sun.tools.javac.tree.JCTree import com.sun.tools.javac.tree.JCTree.* import com.sun.tools.javac.tree.TreeMaker +import com.sun.tools.javac.tree.TreeScanner import kotlinx.kapt.KaptIgnored import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.* @@ -182,9 +183,42 @@ class ClassFileToSourceStubConverter( _bindings[clazz.name] = this } + postProcess(topLevel) + return KaptStub(topLevel, lineMappings.serialize()) } + private fun postProcess(topLevel: JCCompilationUnit) { + topLevel.accept(object : TreeScanner() { + override fun visitClassDef(clazz: JCClassDecl) { + // Delete enums inside enum values + if (clazz.isEnum()) { + for (child in clazz.defs) { + if (child is JCVariableDecl) { + deleteAllEnumsInside(child) + } + } + } + + super.visitClassDef(clazz) + } + + private fun JCClassDecl.isEnum() = mods.flags and Opcodes.ACC_ENUM.toLong() != 0L + + private fun deleteAllEnumsInside(def: JCTree) { + def.accept(object : TreeScanner() { + override fun visitClassDef(clazz: JCClassDecl) { + clazz.defs = mapJList(clazz.defs) { child -> + if (child is JCClassDecl && child.isEnum()) null else child + } + + super.visitClassDef(clazz) + } + }) + } + }) + } + private fun convertImports(file: KtFile, classDeclaration: JCClassDecl): JavacList { val imports = mutableListOf() val importedShortNames = mutableSetOf() diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/enums.kt b/plugins/kapt3/kapt3-compiler/testData/converter/enums.kt index b2d01fe8eee..5fe5fbed9ed 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/enums.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/enums.kt @@ -10,4 +10,14 @@ enum class Enum2(@Anno1("first") val col: String, @Anno1("second") val col2: Int private fun privateEnumFun() {} public fun publicEnumFun() {} +} + +enum class Nested1 { + WHITE { + enum class Nested2 { + BLACK { + enum class Nested3 { RED } + } + } + }; } \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/enums.txt b/plugins/kapt3/kapt3-compiler/testData/converter/enums.txt index c077635ecb6..cfcca04c9bb 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/enums.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/enums.txt @@ -60,3 +60,16 @@ public enum Enum2 { int col2) { } } + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public enum Nested1 { + /*public static final*/ WHITE /* = new Nested1() */; + + Nested1() { + } +}