JS: cache metadata, grouped by package FQN
This commit is contained in:
@@ -65,6 +65,7 @@ import org.jetbrains.kotlin.js.facade.TranslationUnit;
|
||||
import org.jetbrains.kotlin.js.facade.exceptions.TranslationException;
|
||||
import org.jetbrains.kotlin.js.sourceMap.SourceFilePathResolver;
|
||||
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion;
|
||||
import org.jetbrains.kotlin.name.FqName;
|
||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
|
||||
import org.jetbrains.kotlin.psi.KtFile;
|
||||
import org.jetbrains.kotlin.serialization.js.ModuleKind;
|
||||
@@ -73,6 +74,7 @@ import org.jetbrains.kotlin.utils.*;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR;
|
||||
import static org.jetbrains.kotlin.cli.common.ExitCode.OK;
|
||||
@@ -144,6 +146,15 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
||||
}
|
||||
Arrays.sort(allSources);
|
||||
|
||||
Set<FqName> dirtyPackages = nonCompiledSources.values().stream().map(KtFile::getPackageFqName).collect(Collectors.toSet());
|
||||
Map<FqName, byte[]> packageMetadata = new HashMap<>();
|
||||
for (Map.Entry<String, byte[]> e : incrementalDataProvider.getPackageMetadata().entrySet()) {
|
||||
FqName name = new FqName(e.getKey());
|
||||
if (!dirtyPackages.contains(name)) {
|
||||
packageMetadata.put(name, e.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
List<TranslationUnit> translationUnits = new ArrayList<>();
|
||||
for (i = 0; i < allSources.length; i++) {
|
||||
KtFile nonCompiled = nonCompiledSources.get(allSources[i]);
|
||||
@@ -155,7 +166,7 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
||||
translationUnits.add(new TranslationUnit.BinaryAst(translatedValue.getBinaryAst(), translatedValue.getInlineData()));
|
||||
}
|
||||
}
|
||||
return translator.translateUnits(reporter, translationUnits, mainCallParameters, jsAnalysisResult);
|
||||
return translator.translateUnits(reporter, translationUnits, mainCallParameters, jsAnalysisResult, packageMetadata);
|
||||
}
|
||||
|
||||
CollectionsKt.sortBy(allKotlinFiles, ktFile -> VfsUtilCore.virtualToIoFile(ktFile.getVirtualFile()));
|
||||
|
||||
+9
@@ -134,6 +134,10 @@ open class CompilerCallbackServicesFacadeServer(
|
||||
incrementalResultsConsumer!!.processInlineFunctions(functions)
|
||||
}
|
||||
|
||||
override fun incrementalResultsConsumer_processPackageMetadata(packageName: String, metadata: ByteArray) {
|
||||
incrementalResultsConsumer!!.processPackageMetadata(packageName, metadata)
|
||||
}
|
||||
|
||||
override fun incrementalDataProvider_getHeaderMetadata(): ByteArray = incrementalDataProvider!!.headerMetadata
|
||||
|
||||
override fun incrementalDataProvider_getMetadataVersion(): IntArray = incrementalDataProvider!!.metadataVersion
|
||||
@@ -142,4 +146,9 @@ open class CompilerCallbackServicesFacadeServer(
|
||||
incrementalDataProvider!!.compiledPackageParts.entries.map {
|
||||
CompiledPackagePart(it.key.path, it.value.metadata, it.value.binaryAst, it.value.inlineData)
|
||||
}
|
||||
|
||||
override fun incrementalDataProvider_getPackageMetadata(): Collection<PackageMetadata> =
|
||||
incrementalDataProvider!!.packageMetadata.entries.map { (fqName, metadata) ->
|
||||
PackageMetadata(fqName, metadata)
|
||||
}
|
||||
}
|
||||
|
||||
+17
@@ -112,6 +112,9 @@ interface CompilerCallbackServicesFacade : Remote {
|
||||
@Throws(RemoteException::class)
|
||||
fun incrementalResultsConsumer_processInlineFunctions(functions: Collection<JsInlineFunctionHash>)
|
||||
|
||||
@Throws(RemoteException::class)
|
||||
fun incrementalResultsConsumer_processPackageMetadata(packageName: String, metadata: ByteArray)
|
||||
|
||||
// ---------------------------------------------------
|
||||
// IncrementalDataProvider (js)
|
||||
@Throws(RemoteException::class)
|
||||
@@ -122,6 +125,9 @@ interface CompilerCallbackServicesFacade : Remote {
|
||||
|
||||
@Throws(RemoteException::class)
|
||||
fun incrementalDataProvider_getMetadataVersion(): IntArray
|
||||
|
||||
@Throws(RemoteException::class)
|
||||
fun incrementalDataProvider_getPackageMetadata(): Collection<PackageMetadata>
|
||||
}
|
||||
|
||||
class CompiledPackagePart(
|
||||
@@ -129,6 +135,17 @@ class CompiledPackagePart(
|
||||
val metadata: ByteArray, val binaryAst: ByteArray, val inlineData: ByteArray
|
||||
) : Serializable
|
||||
|
||||
class PackageMetadata(
|
||||
val packageName: String,
|
||||
val metadata: ByteArray
|
||||
) : Serializable {
|
||||
companion object {
|
||||
// just a random number, but should never be changed to avoid deserialization problems
|
||||
private val serialVersionUID: Long = 54021986502349756L
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class RmiFriendlyCompilationCanceledException : Exception(), Serializable {
|
||||
companion object {
|
||||
// just a random number, but should never be changed to avoid deserialization problems
|
||||
|
||||
@@ -33,4 +33,14 @@ class RemoteIncrementalDataProvider(val facade: CompilerCallbackServicesFacade,
|
||||
get() = rpcProfiler.withMeasure(this) {
|
||||
facade.incrementalDataProvider_getMetadataVersion()
|
||||
}
|
||||
|
||||
override val packageMetadata: Map<String, ByteArray>
|
||||
get() = rpcProfiler.withMeasure(this) {
|
||||
val result = mutableMapOf<String, ByteArray>()
|
||||
facade.incrementalDataProvider_getPackageMetadata().forEach {
|
||||
val prev = result.put(it.packageName, it.metadata)
|
||||
check(prev == null) { "packageMetadata: duplicated entry for package `${it.packageName}`" }
|
||||
}
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import java.io.File
|
||||
|
||||
class RemoteIncrementalResultsConsumer(val facade: CompilerCallbackServicesFacade, eventManager: EventManager, val rpcProfiler: Profiler) :
|
||||
IncrementalResultsConsumer {
|
||||
|
||||
init {
|
||||
eventManager.
|
||||
onCompilationFinished(this::flush)
|
||||
@@ -42,6 +43,12 @@ class RemoteIncrementalResultsConsumer(val facade: CompilerCallbackServicesFacad
|
||||
|
||||
override fun processInlineFunctions(functions: Collection<JsInlineFunctionHash>) = error("Should not be called in Daemon Server")
|
||||
|
||||
override fun processPackageMetadata(packageName: String, metadata: ByteArray) {
|
||||
rpcProfiler.withMeasure(this) {
|
||||
facade.incrementalResultsConsumer_processPackageMetadata(packageName, metadata)
|
||||
}
|
||||
}
|
||||
|
||||
fun flush() {
|
||||
rpcProfiler.withMeasure(this) {
|
||||
facade.incrementalResultsConsumer_processInlineFunctions(deferInlineFuncs.map {
|
||||
|
||||
Reference in New Issue
Block a user