Fix compilation
diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractAsmLikeInstructionListingTest.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractAsmLikeInstructionListingTest.kt deleted file mode 100644 index c038943..0000000 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractAsmLikeInstructionListingTest.kt +++ /dev/null
@@ -1,173 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.android.parcel - -import org.jetbrains.kotlin.codegen.CodegenTestCase -import org.jetbrains.kotlin.codegen.getClassFiles -import org.jetbrains.kotlin.test.KotlinTestUtils -import org.jetbrains.org.objectweb.asm.ClassReader -import org.jetbrains.org.objectweb.asm.Label -import org.jetbrains.org.objectweb.asm.Opcodes.* -import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.tree.* -import org.jetbrains.org.objectweb.asm.util.Printer -import java.io.File - -private val LINE_SEPARATOR = System.getProperty("line.separator") - -abstract class AbstractAsmLikeInstructionListingTest : CodegenTestCase() { - private companion object { - val CURIOUS_ABOUT_DIRECTIVE = "// CURIOUS_ABOUT " - } - - override fun doMultiFileTest(wholeFile: File, files: List<TestFile>, javaFilesDir: File?) { - val txtFile = File(wholeFile.parentFile, wholeFile.nameWithoutExtension + ".txt") - compile(files, javaFilesDir) - - val classes = classFileFactory - .getClassFiles() - .sortedBy { it.relativePath } - .map { file -> ClassNode().also { ClassReader(file.asByteArray()).accept(it, ClassReader.EXPAND_FRAMES) } } - - val printBytecodeForTheseMethods = wholeFile.readLines() - .filter { it.startsWith(CURIOUS_ABOUT_DIRECTIVE) } - .map { it.substring(CURIOUS_ABOUT_DIRECTIVE.length) } - .flatMap { it.split(',').map { it.trim() } } - - KotlinTestUtils.assertEqualsToFile(txtFile, classes.joinToString(LINE_SEPARATOR.repeat(2)) { - renderClassNode(it, printBytecodeForTheseMethods) - }) - } - - private fun renderClassNode(clazz: ClassNode, printBytecodeForTheseMethods: List<String>): String { - val fields = (clazz.fields ?: emptyList()).sortedBy { it.name } - val methods = (clazz.methods ?: emptyList()).sortedBy { it.name } - - val superTypes = (listOf(clazz.superName) + clazz.interfaces).filterNotNull() - - return buildString { - renderVisibilityModifiers(clazz.access) - renderModalityModifiers(clazz.access) - append(if ((clazz.access and ACC_INTERFACE) != 0) "interface " else "class ") - append(clazz.name) - - if (superTypes.isNotEmpty()) { - append(" : " + superTypes.joinToString()) - } - - appendln(" {") - - fields.joinTo(this, LINE_SEPARATOR.repeat(2)) { renderField(it).withMargin() } - - if (fields.isNotEmpty()) { - appendln().appendln() - } - - methods.joinTo(this, LINE_SEPARATOR.repeat(2)) { - val printBytecode = printBytecodeForTheseMethods.contains(it.name) - renderMethod(it, printBytecode).withMargin() - } - - appendln().append("}") - } - } - - private fun renderField(field: FieldNode) = buildString { - renderVisibilityModifiers(field.access) - renderModalityModifiers(field.access) - append(Type.getType(field.desc).className).append(' ') - append(field.name) - } - - private fun renderMethod(method: MethodNode, printBytecode: Boolean) = buildString { - renderVisibilityModifiers(method.access) - renderModalityModifiers(method.access) - val (returnType, parameterTypes) = with(Type.getMethodType(method.desc)) { returnType to argumentTypes } - append(returnType.className).append(' ') - append(method.name) - parameterTypes.mapIndexed { index, type -> "${type.className} p$index" }.joinTo(this, prefix = "(", postfix = ")") - - if (printBytecode && (method.access and ACC_ABSTRACT) == 0) { - appendln(" {") - append(renderBytecodeInstructions(method.instructions).trimEnd().withMargin()) - appendln().append("}") - } - } - - private fun renderBytecodeInstructions(instructions: InsnList) = buildString { - val labelMappings = LabelMappings() - - var currentInsn = instructions.first - while (currentInsn != null) { - renderInstruction(currentInsn, labelMappings) - currentInsn = currentInsn.next - } - } - - private fun StringBuilder.renderInstruction(node: AbstractInsnNode, labelMappings: LabelMappings) { - if (node is LabelNode) { - appendln("LABEL (L" + labelMappings[node.label] + ")") - return - } - - if (node is LineNumberNode) { - appendln("LINENUMBER (" + node.line + ")") - return - } - - if (node is FrameNode) return - - append(" ").append(Printer.OPCODES[node.opcode] ?: error("Invalid opcode ${node.opcode}")) - - when (node) { - is FieldInsnNode -> append(" (" + node.name + ", " + node.desc + ")") - is JumpInsnNode -> append(" (L" + labelMappings[node.label.label] + ")") - is IntInsnNode -> append(" (" + node.operand + ")") - is MethodInsnNode -> append(" (" + node.owner + ", "+ node.name + ", " + node.desc + ")") - is VarInsnNode -> append(" (" + node.`var` + ")") - is LdcInsnNode -> append(" (" + node.cst + ")") - } - - appendln() - } - - private fun String.withMargin(margin: String = " "): String { - return lineSequence().map { margin + it }.joinToString(LINE_SEPARATOR) - } - - private fun StringBuilder.renderVisibilityModifiers(access: Int) { - if ((access and ACC_PUBLIC) != 0) append("public ") - if ((access and ACC_PRIVATE) != 0) append("private ") - if ((access and ACC_PROTECTED) != 0) append("protected ") - } - - private fun StringBuilder.renderModalityModifiers(access: Int) { - if ((access and ACC_FINAL) != 0) append("final ") - if ((access and ACC_ABSTRACT) != 0) append("abstract ") - if ((access and ACC_STATIC) != 0) append("static ") - } - - private class LabelMappings { - private var mappings = hashMapOf<Int, Int>() - private var currentIndex = 0 - - operator fun get(label: Label): Int { - val hashCode = System.identityHashCode(label) - return mappings.getOrPut(hashCode) { currentIndex++ } - } - } -} \ No newline at end of file
diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractParcelBoxTest.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractParcelBoxTest.kt deleted file mode 100644 index 0fa236e..0000000 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/AbstractParcelBoxTest.kt +++ /dev/null
@@ -1,74 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.android.parcel - -import org.jetbrains.kotlin.android.synthetic.AndroidComponentRegistrar -import org.jetbrains.kotlin.android.synthetic.test.addAndroidExtensionsRuntimeLibrary -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot -import org.jetbrains.kotlin.codegen.CodegenTestCase -import org.jetbrains.kotlin.codegen.getClassFiles -import org.jetbrains.org.objectweb.asm.ClassReader -import org.jetbrains.org.objectweb.asm.tree.ClassNode -import java.io.File -import java.net.URLClassLoader -import java.nio.ByteBuffer -import java.security.ProtectionDomain - - -abstract class AbstractParcelBoxTest : CodegenTestCase() { - protected companion object { - val BASE_DIR = "plugins/android-extensions/android-extensions-compiler/testData/parcel/box" - val LIBRARY_KT = File(File(BASE_DIR).parentFile, "boxLib.kt") - } - - override fun doTest(filePath: String) { - super.doTest(File(BASE_DIR, filePath + ".kt").absolutePath) - } - - open protected fun getClassLoaderWithGeneratedFiles(): ClassLoader { - return object : URLClassLoader(arrayOf(), this::class.java.classLoader) { - init { - for (classFile in classFileFactory.getClassFiles().sortedBy { it.relativePath }) { - val bytes = classFile.asByteArray() - val className = ClassNode().also { ClassReader(bytes).accept(it, ClassReader.EXPAND_FRAMES) }.name - try { - defineClass(className.replace('/', '.'), ByteBuffer.wrap(bytes), null as ProtectionDomain?) - } catch (e: Throwable) { - throw RuntimeException("Can't load class $className", e) - } - } - } - } - } - - override fun doMultiFileTest(wholeFile: File, files: List<TestFile>, javaFilesDir: File?) { - compile(files + TestFile(LIBRARY_KT.name, LIBRARY_KT.readText()), javaFilesDir) - - val testClass = Class.forName("test.TestKt", false, getClassLoaderWithGeneratedFiles()) - try { - testClass.getDeclaredMethod("box").invoke(testClass) - } catch (e: Throwable) { - throw AssertionError(classFileFactory.createText(), e) - } - } - - override fun setupEnvironment(environment: KotlinCoreEnvironment) { - addAndroidExtensionsRuntimeLibrary(environment) - environment.updateClasspath(listOf(JvmClasspathRoot(File("ideaSDK/plugins/android/lib/layoutlib.jar")))) - } -} \ No newline at end of file
diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBoxTest.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBoxTest.kt deleted file mode 100644 index c4c5373..0000000 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBoxTest.kt +++ /dev/null
@@ -1,49 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.android.parcel - -import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner -import org.robolectric.annotation.Config - -// This class is not generated because it uses the custom test runner -@RunWith(RobolectricTestRunner::class) -@Config(manifest = Config.NONE) -class ParcelBoxTest : AbstractParcelBoxTest() { - @Test fun simple() = doTest("simple") - @Test fun primitiveTypes() = doTest("primitiveTypes") - @Test fun boxedTypes() = doTest("boxedTypes") - @Test fun nullableTypesSimple() = doTest("nullableTypesSimple") - @Test fun nullableTypes() = doTest("nullableTypes") - @Test fun listSimple() = doTest("listSimple") - @Test fun lists() = doTest("lists") - @Test fun listKinds() = doTest("listKinds") - @Test fun arraySimple() = doTest("arraySimple") - @Test fun arrays() = doTest("arrays") - @Test fun mapSimple() = doTest("mapSimple") - @Test fun maps() = doTest("maps") - @Test fun mapKinds() = doTest("mapKinds") - @Test fun sparseBooleanArray() = doTest("sparseBooleanArray") - @Test fun bundle() = doTest("bundle") - @Test fun sparseArrays() = doTest("sparseArrays") - @Test fun customSimple() = doTest("customSimple") - @Test fun charSequence() = doTest("charSequence") - @Test fun enums() = doTest("enums") - @Test fun objects() = doTest("objects") - @Test fun nestedParcelable() = doTest("nestedParcelable") -} \ No newline at end of file