Incremental compilation support for multifile classes.
Original commit: 3dfe9951ef
This commit is contained in:
@@ -17,10 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.jps.incremental
|
package org.jetbrains.kotlin.jps.incremental
|
||||||
|
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
import com.intellij.util.io.BooleanDataDescriptor
|
import com.intellij.util.io.*
|
||||||
import com.intellij.util.io.DataExternalizer
|
|
||||||
import com.intellij.util.io.IOUtil
|
|
||||||
import com.intellij.util.io.KeyDescriptor
|
|
||||||
import gnu.trove.THashSet
|
import gnu.trove.THashSet
|
||||||
import org.jetbrains.annotations.TestOnly
|
import org.jetbrains.annotations.TestOnly
|
||||||
import org.jetbrains.jps.builders.BuildTarget
|
import org.jetbrains.jps.builders.BuildTarget
|
||||||
@@ -35,12 +32,12 @@ import org.jetbrains.kotlin.jps.build.KotlinBuilder
|
|||||||
import org.jetbrains.kotlin.jps.incremental.storage.BasicMap
|
import org.jetbrains.kotlin.jps.incremental.storage.BasicMap
|
||||||
import org.jetbrains.kotlin.jps.incremental.storage.BasicStringMap
|
import org.jetbrains.kotlin.jps.incremental.storage.BasicStringMap
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||||
|
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
|
||||||
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
|
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
|
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind
|
import org.jetbrains.kotlin.load.kotlin.header.*
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleFileFacadeKind
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatiblePackageFacadeKind
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
|
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto
|
import org.jetbrains.kotlin.load.kotlin.incremental.components.JvmPackagePartProto
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName.byInternalName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName.byInternalName
|
||||||
@@ -68,14 +65,17 @@ public class IncrementalCacheImpl(
|
|||||||
companion object {
|
companion object {
|
||||||
val CACHE_EXTENSION = "tab"
|
val CACHE_EXTENSION = "tab"
|
||||||
|
|
||||||
private val PROTO_MAP = "proto"
|
val PROTO_MAP = "proto"
|
||||||
private val CONSTANTS_MAP = "constants"
|
val CONSTANTS_MAP = "constants"
|
||||||
private val INLINE_FUNCTIONS = "inline-functions"
|
val INLINE_FUNCTIONS = "inline-functions"
|
||||||
private val PACKAGE_PARTS = "package-parts"
|
val PACKAGE_PARTS = "package-parts"
|
||||||
private val SOURCE_TO_CLASSES = "source-to-classes"
|
val MULTIFILE_CLASS_FACADES = "multifile-class-facades"
|
||||||
private val DIRTY_OUTPUT_CLASSES = "dirty-output-classes"
|
val MULTIFILE_CLASS_PARTS = "multifile-class-parts"
|
||||||
private val DIRTY_INLINE_FUNCTIONS = "dirty-inline-functions"
|
val SOURCE_TO_CLASSES = "source-to-classes"
|
||||||
private val INLINED_TO = "inlined-to"
|
val CLASS_TO_SOURCES = "class-to-sources"
|
||||||
|
val DIRTY_OUTPUT_CLASSES = "dirty-output-classes"
|
||||||
|
val DIRTY_INLINE_FUNCTIONS = "dirty-inline-functions"
|
||||||
|
val INLINED_TO = "inlined-to"
|
||||||
|
|
||||||
private val MODULE_MAPPING_FILE_NAME = "." + ModuleMapping.MAPPING_FILE_EXT
|
private val MODULE_MAPPING_FILE_NAME = "." + ModuleMapping.MAPPING_FILE_EXT
|
||||||
}
|
}
|
||||||
@@ -95,6 +95,8 @@ public class IncrementalCacheImpl(
|
|||||||
private val constantsMap = registerMap(ConstantsMap(CONSTANTS_MAP.storageFile))
|
private val constantsMap = registerMap(ConstantsMap(CONSTANTS_MAP.storageFile))
|
||||||
private val inlineFunctionsMap = registerMap(InlineFunctionsMap(INLINE_FUNCTIONS.storageFile))
|
private val inlineFunctionsMap = registerMap(InlineFunctionsMap(INLINE_FUNCTIONS.storageFile))
|
||||||
private val packagePartMap = registerMap(PackagePartMap(PACKAGE_PARTS.storageFile))
|
private val packagePartMap = registerMap(PackagePartMap(PACKAGE_PARTS.storageFile))
|
||||||
|
private val multifileClassFacadeMap = registerMap(MultifileClassFacadeMap(MULTIFILE_CLASS_FACADES.storageFile))
|
||||||
|
private val multifileClassPartMap = registerMap(MultifileClassPartMap(MULTIFILE_CLASS_PARTS.storageFile))
|
||||||
private val sourceToClassesMap = registerMap(SourceToClassesMap(SOURCE_TO_CLASSES.storageFile))
|
private val sourceToClassesMap = registerMap(SourceToClassesMap(SOURCE_TO_CLASSES.storageFile))
|
||||||
private val dirtyOutputClassesMap = registerMap(DirtyOutputClassesMap(DIRTY_OUTPUT_CLASSES.storageFile))
|
private val dirtyOutputClassesMap = registerMap(DirtyOutputClassesMap(DIRTY_OUTPUT_CLASSES.storageFile))
|
||||||
// TODO: can be removed?
|
// TODO: can be removed?
|
||||||
@@ -196,6 +198,24 @@ public class IncrementalCacheImpl(
|
|||||||
constantsMap.process(kotlinClass) +
|
constantsMap.process(kotlinClass) +
|
||||||
inlineFunctionsMap.process(kotlinClass)
|
inlineFunctionsMap.process(kotlinClass)
|
||||||
}
|
}
|
||||||
|
header.isCompatibleMultifileClassKind() -> {
|
||||||
|
val partNames = getFullNamesOfMultifileClassParts(kotlinClass)
|
||||||
|
multifileClassFacadeMap.add(className, partNames)
|
||||||
|
|
||||||
|
// TODO NO_CHANGES? (delegates only, see package facade)
|
||||||
|
constantsMap.process(kotlinClass) +
|
||||||
|
inlineFunctionsMap.process(kotlinClass)
|
||||||
|
}
|
||||||
|
header.isCompatibleMultifileClassPartKind() -> {
|
||||||
|
assert(sourceFiles.size() == 1) { "Multifile class part from several source files: $sourceFiles" }
|
||||||
|
packagePartMap.addPackagePart(className)
|
||||||
|
val facadeClassName = getInternalNameOfTopLevelClassInTheSamePackage(kotlinClass, header.multifileClassName!!)
|
||||||
|
multifileClassPartMap.add(className.internalName, facadeClassName)
|
||||||
|
|
||||||
|
protoMap.process(kotlinClass, isPackage = true) +
|
||||||
|
constantsMap.process(kotlinClass) +
|
||||||
|
inlineFunctionsMap.process(kotlinClass)
|
||||||
|
}
|
||||||
header.isCompatibleClassKind() && JvmAnnotationNames.KotlinClass.Kind.CLASS == header.classKind ->
|
header.isCompatibleClassKind() && JvmAnnotationNames.KotlinClass.Kind.CLASS == header.classKind ->
|
||||||
protoMap.process(kotlinClass, isPackage = false) +
|
protoMap.process(kotlinClass, isPackage = false) +
|
||||||
constantsMap.process(kotlinClass) +
|
constantsMap.process(kotlinClass) +
|
||||||
@@ -236,6 +256,8 @@ public class IncrementalCacheImpl(
|
|||||||
dirtyClasses.forEach {
|
dirtyClasses.forEach {
|
||||||
protoMap.remove(it)
|
protoMap.remove(it)
|
||||||
packagePartMap.remove(it)
|
packagePartMap.remove(it)
|
||||||
|
multifileClassFacadeMap.remove(it)
|
||||||
|
multifileClassPartMap.remove(it)
|
||||||
constantsMap.remove(it)
|
constantsMap.remove(it)
|
||||||
inlineFunctionsMap.remove(it)
|
inlineFunctionsMap.remove(it)
|
||||||
}
|
}
|
||||||
@@ -256,6 +278,25 @@ public class IncrementalCacheImpl(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getObsoleteMultifileClasses(): Collection<String> {
|
||||||
|
val obsoleteMultifileClasses = linkedSetOf<String>()
|
||||||
|
for (dirtyClass in dirtyOutputClassesMap.getDirtyOutputClasses()) {
|
||||||
|
val dirtyFacade = multifileClassPartMap.getFacadeName(dirtyClass) ?: continue
|
||||||
|
obsoleteMultifileClasses.add(dirtyFacade)
|
||||||
|
}
|
||||||
|
KotlinBuilder.LOG.debug("Obsolete multifile class facades: $obsoleteMultifileClasses")
|
||||||
|
return obsoleteMultifileClasses
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getStableMultifileFacadeParts(facadeInternalName: String): Collection<String>? {
|
||||||
|
val partNames = multifileClassFacadeMap.getMultifileClassParts(facadeInternalName) ?: return null
|
||||||
|
return partNames.filter { !dirtyOutputClassesMap.isDirty(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getMultifileFacade(partInternalName: String): String? {
|
||||||
|
return multifileClassPartMap.getFacadeName(partInternalName)
|
||||||
|
}
|
||||||
|
|
||||||
override fun getModuleMappingData(): ByteArray? {
|
override fun getModuleMappingData(): ByteArray? {
|
||||||
return protoMap[JvmClassName.byInternalName(MODULE_MAPPING_FILE_NAME)]?.bytes
|
return protoMap[JvmClassName.byInternalName(MODULE_MAPPING_FILE_NAME)]?.bytes
|
||||||
}
|
}
|
||||||
@@ -516,6 +557,36 @@ public class IncrementalCacheImpl(
|
|||||||
override fun dumpValue(value: Boolean) = ""
|
override fun dumpValue(value: Boolean) = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private inner class MultifileClassFacadeMap(storageFile: File) : BasicStringMap<List<String>>(storageFile, StringListExternalizer) {
|
||||||
|
public fun add(facadeName: JvmClassName, partNames: List<String>) {
|
||||||
|
storage.put(facadeName.internalName, partNames)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun getMultifileClassParts(facadeName: String): List<String>? = storage[facadeName]
|
||||||
|
|
||||||
|
public fun remove(className: JvmClassName) {
|
||||||
|
storage.remove(className.internalName)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun dumpValue(value: List<String>): String = value.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class MultifileClassPartMap(storageFile: File) : BasicStringMap<String>(storageFile, EnumeratorStringDescriptor.INSTANCE) {
|
||||||
|
public fun add(partName: String, facadeName: String) {
|
||||||
|
storage.put(partName, facadeName)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun getFacadeName(partName: String): String? {
|
||||||
|
return storage.get(partName)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun remove(className: JvmClassName) {
|
||||||
|
storage.remove(className.internalName)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun dumpValue(value: String): String = value
|
||||||
|
}
|
||||||
|
|
||||||
private inner class SourceToClassesMap(storageFile: File) : BasicStringMap<List<String>>(storageFile, PathStringDescriptor.INSTANCE, StringListExternalizer) {
|
private inner class SourceToClassesMap(storageFile: File) : BasicStringMap<List<String>>(storageFile, PathStringDescriptor.INSTANCE, StringListExternalizer) {
|
||||||
public fun clearOutputsForSource(sourceFile: File) {
|
public fun clearOutputsForSource(sourceFile: File) {
|
||||||
storage.remove(sourceFile.absolutePath)
|
storage.remove(sourceFile.absolutePath)
|
||||||
@@ -543,6 +614,8 @@ public class IncrementalCacheImpl(
|
|||||||
public fun getDirtyOutputClasses(): Collection<String> =
|
public fun getDirtyOutputClasses(): Collection<String> =
|
||||||
storage.keys
|
storage.keys
|
||||||
|
|
||||||
|
public fun isDirty(className: String): Boolean = storage.containsMapping(className)
|
||||||
|
|
||||||
override fun dumpValue(value: Boolean) = ""
|
override fun dumpValue(value: Boolean) = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -631,6 +704,21 @@ private fun ByteArray.md5(): Long {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getInternalNameOfTopLevelClassInTheSamePackage(kotlinClass: KotlinJvmBinaryClass, simpleName: String): String {
|
||||||
|
val classFqName = kotlinClass.classId.packageFqName.child(Name.identifier(simpleName))
|
||||||
|
return JvmClassName.byFqNameWithoutInnerClasses(classFqName).internalName
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getFullNamesOfMultifileClassParts(kotlinClass: LocalFileKotlinClass): List<String> {
|
||||||
|
val classHeader = kotlinClass.classHeader
|
||||||
|
val partClassNames = classHeader.filePartClassNames ?: throw AssertionError("Multifile class has no parts: ${kotlinClass.className}")
|
||||||
|
val fullNames = arrayListOf<String>()
|
||||||
|
for (shortName in partClassNames) {
|
||||||
|
fullNames.add(getInternalNameOfTopLevelClassInTheSamePackage(kotlinClass, shortName))
|
||||||
|
}
|
||||||
|
return fullNames
|
||||||
|
}
|
||||||
|
|
||||||
private abstract class StringMapExternalizer<T> : DataExternalizer<Map<String, T>> {
|
private abstract class StringMapExternalizer<T> : DataExternalizer<Map<String, T>> {
|
||||||
override fun save(out: DataOutput, map: Map<String, T>?) {
|
override fun save(out: DataOutput, map: Map<String, T>?) {
|
||||||
out.writeInt(map!!.size())
|
out.writeInt(map!!.size())
|
||||||
@@ -698,6 +786,9 @@ private object PathCollectionExternalizer : DataExternalizer<Collection<String>>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val File.normalizedPath: String
|
||||||
|
get() = FileUtil.toSystemIndependentName(canonicalPath)
|
||||||
|
|
||||||
@TestOnly
|
@TestOnly
|
||||||
private fun <K : Comparable<K>, V> Map<K, V>.dumpMap(dumpValue: (V)->String): String =
|
private fun <K : Comparable<K>, V> Map<K, V>.dumpMap(dumpValue: (V)->String): String =
|
||||||
StringBuilder {
|
StringBuilder {
|
||||||
|
|||||||
@@ -347,6 +347,54 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassFileAdded")
|
||||||
|
public void testMultifileClassFileAdded() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassFileChanged")
|
||||||
|
public void testMultifileClassFileChanged() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassFileChanged/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassFileMovedToAnotherMultifileClass")
|
||||||
|
public void testMultifileClassFileMovedToAnotherMultifileClass() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassFileMovedToAnotherMultifileClass/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassInlineFunction")
|
||||||
|
public void testMultifileClassInlineFunction() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassInlineFunction/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassInlineFunctionAccessingField")
|
||||||
|
public void testMultifileClassInlineFunctionAccessingField() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassInlineFunctionAccessingField/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassRecreated")
|
||||||
|
public void testMultifileClassRecreated() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassRecreated/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassRecreatedAfterRenaming")
|
||||||
|
public void testMultifileClassRecreatedAfterRenaming() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassRecreatedAfterRenaming/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multifileClassRemoved")
|
||||||
|
public void testMultifileClassRemoved() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassRemoved/");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("multiplePackagesModified")
|
@TestMetadata("multiplePackagesModified")
|
||||||
public void testMultiplePackagesModified() throws Exception {
|
public void testMultiplePackagesModified() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multiplePackagesModified/");
|
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multiplePackagesModified/");
|
||||||
|
|||||||
+3
-3
@@ -22,9 +22,7 @@ import com.google.common.io.Files
|
|||||||
import com.google.protobuf.ExtensionRegistry
|
import com.google.protobuf.ExtensionRegistry
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
import org.jetbrains.kotlin.jps.incremental.LocalFileKotlinClass
|
import org.jetbrains.kotlin.jps.incremental.LocalFileKotlinClass
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind
|
import org.jetbrains.kotlin.load.kotlin.header.*
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleFileFacadeKind
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatiblePackageFacadeKind
|
|
||||||
import org.jetbrains.kotlin.serialization.DebugProtoBuf
|
import org.jetbrains.kotlin.serialization.DebugProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.jvm.BitEncoding
|
import org.jetbrains.kotlin.serialization.jvm.BitEncoding
|
||||||
import org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf
|
import org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf
|
||||||
@@ -148,6 +146,8 @@ fun classFileToString(classFile: File): String {
|
|||||||
out.write("\n------ file facade proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}")
|
out.write("\n------ file facade proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}")
|
||||||
classHeader.isCompatibleClassKind() ->
|
classHeader.isCompatibleClassKind() ->
|
||||||
out.write("\n------ class proto -----\n${DebugProtoBuf.Class.parseFrom(input, getExtensionRegistry())}")
|
out.write("\n------ class proto -----\n${DebugProtoBuf.Class.parseFrom(input, getExtensionRegistry())}")
|
||||||
|
classHeader.isCompatibleMultifileClassPartKind() ->
|
||||||
|
out.write("\n------ multi-file part proto -----\n${DebugProtoBuf.Package.parseFrom(input, getExtensionRegistry())}")
|
||||||
|
|
||||||
else -> throw IllegalStateException()
|
else -> throw IllegalStateException()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun a() = "a"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "b"
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
Compiling files:
|
||||||
|
src/b.kt
|
||||||
|
End of files
|
||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__AKt.class
|
||||||
|
out/production/module/test/Test__BKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/a.kt
|
||||||
|
src/b.kt
|
||||||
|
End of files
|
||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__AKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/a.kt
|
||||||
|
End of files
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun a() = "a"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "b"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "bcd"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__BKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/b.kt
|
||||||
|
End of files
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun a() = "a"
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "b"
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test1") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "b"
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__BKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/b.kt
|
||||||
|
End of files
|
||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__AKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/a.kt
|
||||||
|
End of files
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/UsageKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/usage.kt
|
||||||
|
End of files
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
inline fun f(body: () -> Unit) {
|
||||||
|
println("i'm inline function")
|
||||||
|
body()
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package other
|
||||||
|
|
||||||
|
inline fun f(body: () -> Unit) {
|
||||||
|
println("i'm other inline function")
|
||||||
|
body()
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
f { println("to be inlined") }
|
||||||
|
other.f { println("to be inlined") }
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
f { println("to be inlined") }
|
||||||
|
other.f { println("to be inlined") }
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/UsageKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/usage.kt
|
||||||
|
End of files
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
val property = ":)"
|
||||||
|
|
||||||
|
inline fun f(body: () -> Unit) {
|
||||||
|
println("i'm inline function" + property)
|
||||||
|
body()
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package other
|
||||||
|
|
||||||
|
val property = ":)"
|
||||||
|
|
||||||
|
inline fun f(body: () -> Unit) {
|
||||||
|
println("i'm inline function" + property)
|
||||||
|
body()
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
f { println("to be inlined") }
|
||||||
|
other.f { println("to be inlined") }
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
f { println("to be inlined") }
|
||||||
|
other.f { println("to be inlined") }
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun a() = "a"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "b"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__AKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
End of files
|
||||||
|
|
||||||
|
|
||||||
|
Compiling files:
|
||||||
|
src/b.kt
|
||||||
|
End of files
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun a() = "a"
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test2") JvmMultifileClass]
|
||||||
|
package test2
|
||||||
|
|
||||||
|
fun a() = "a"
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "b"
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__AKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/a.kt
|
||||||
|
End of files
|
||||||
|
|
||||||
|
|
||||||
|
Compiling files:
|
||||||
|
src/b.kt
|
||||||
|
End of files
|
||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test2/Test2.class
|
||||||
|
out/production/module/test2/Test2Package.class
|
||||||
|
out/production/module/test2/Test2__AKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
src/a.kt
|
||||||
|
End of files
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun a() = "a"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
@file:[JvmName("Test") JvmMultifileClass]
|
||||||
|
package test
|
||||||
|
|
||||||
|
fun b() = "b"
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Cleaning output files:
|
||||||
|
out/production/module/META-INF/module.kotlin_module
|
||||||
|
out/production/module/test/Test.class
|
||||||
|
out/production/module/test/TestPackage.class
|
||||||
|
out/production/module/test/Test__AKt.class
|
||||||
|
End of files
|
||||||
|
Cleaning output files:
|
||||||
|
out/production/module/test/Test__BKt.class
|
||||||
|
End of files
|
||||||
|
Compiling files:
|
||||||
|
End of files
|
||||||
Reference in New Issue
Block a user