Kapt: Enums inside enum values should be forbidden (KT-22582)

This commit is contained in:
Yan Zhulanow
2018-02-07 23:57:14 +03:00
parent 510d5ece0f
commit 6c4a2db34b
3 changed files with 57 additions and 0 deletions
@@ -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<JCTree> {
val imports = mutableListOf<JCTree.JCImport>()
val importedShortNames = mutableSetOf<String>()
@@ -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 }
}
}
};
}
@@ -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() {
}
}