Use both target name and target type to get incremental cache from backend

This commit is contained in:
Alexey Tsvetkov
2015-08-11 16:25:54 +03:00
parent 18dc752c21
commit 0988b21e9c
16 changed files with 81 additions and 39 deletions
@@ -143,7 +143,7 @@ public class PackageCodegen {
// TODO rewrite it to something more robust when module system is implemented
for (PackageFragmentDescriptor fragment : state.getModule().getPackage(fqName).getFragments()) {
if (fragment instanceof IncrementalPackageFragmentProvider.IncrementalPackageFragment &&
((IncrementalPackageFragmentProvider.IncrementalPackageFragment) fragment).getModuleId().equals(state.getModuleId())) {
((IncrementalPackageFragmentProvider.IncrementalPackageFragment) fragment).getTarget().equals(state.getTarget())) {
return fragment;
}
}
@@ -33,9 +33,9 @@ fun List<PackageParts>.addCompiledPartsAndSort(state: GenerationState): List<Pac
addCompiledParts(state).sortedBy { it.packageFqName }
private fun List<PackageParts>.addCompiledParts(state: GenerationState): List<PackageParts> {
if (state.incrementalCompilationComponents == null || state.moduleId == null) return this
if (state.incrementalCompilationComponents == null || state.target == null) return this
val incrementalCache = state.incrementalCompilationComponents.getIncrementalCache(state.moduleId)
val incrementalCache = state.incrementalCompilationComponents.getIncrementalCache(state.target)
val moduleMappingData = incrementalCache.getModuleMappingData() ?: return this
val mapping = ModuleMapping.create(moduleMappingData)
@@ -30,10 +30,14 @@ import org.jetbrains.kotlin.codegen.context.PackageContext;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.load.kotlin.*;
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass;
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement;
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils;
import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
import org.jetbrains.kotlin.load.kotlin.incremental.components.InlineRegistering;
import org.jetbrains.kotlin.modules.Module;
import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.*;
@@ -746,9 +750,9 @@ public class InlineCodegen extends CallGenerator {
@NotNull FunctionDescriptor targetDescriptor
) {
IncrementalCompilationComponents incrementalCompilationComponents = state.getIncrementalCompilationComponents();
String moduleId = state.getModuleId();
Module target = state.getTarget();
if (incrementalCompilationComponents == null || moduleId == null) return;
if (incrementalCompilationComponents == null || target == null) return;
String sourceFile = getFilePath(sourceDescriptor);
String targetFile = getFilePath(targetDescriptor);
@@ -765,7 +769,7 @@ public class InlineCodegen extends CallGenerator {
assert sourceFile != null: "No source file for inline fun: " + jvmSignature;
assert targetFile != null: "No target file for inline fun: " + jvmSignature;
IncrementalCache incrementalCache = incrementalCompilationComponents.getIncrementalCache(moduleId);
IncrementalCache incrementalCache = incrementalCompilationComponents.getIncrementalCache(target);
InlineRegistering inlineRegistering = incrementalCache.getInlineRegistering();
inlineRegistering.registerInline(sourceFile, jvmSignature.toString(), targetFile);
}
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.modules.Module
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.JetClassOrObject
import org.jetbrains.kotlin.psi.JetFile
@@ -51,7 +52,7 @@ public class GenerationState jvmOverloads constructor(
public val diagnostics: DiagnosticSink = DiagnosticSink.DO_NOTHING,
public val packagesWithObsoleteParts: Collection<FqName> = emptySet(),
// for PackageCodegen in incremental compilation mode
public val moduleId: String? = null,
public val target: Module? = null,
moduleName: String? = null,
// TODO: temporary hack, see JetTypeMapperWithOutDirectory state for details
public val outDirectory: File? = null,
+1
View File
@@ -11,5 +11,6 @@
<orderEntry type="library" name="kotlin-runtime" level="project" />
<orderEntry type="library" exported="" name="cli-parser" level="project" />
<orderEntry type="library" name="jps" level="project" />
<orderEntry type="module" module-name="util" />
</component>
</module>
@@ -16,13 +16,14 @@
package org.jetbrains.kotlin.cli.common.modules
import org.jetbrains.kotlin.modules.Module
import java.util.ArrayList
public class ModuleBuilder(
private val name: String,
private val outputDir: String,
private val type: String
) : org.jetbrains.kotlin.modules.Module {
) : Module {
private val sourceFiles = ArrayList<String>()
private val classpathRoots = ArrayList<String>()
private val javaSourceRoots = ArrayList<String>()
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.cli.common.modules;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.modules.Module;
import java.util.Collections;
import java.util.List;
@@ -23,6 +23,7 @@ import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType;
import org.jetbrains.kotlin.cli.common.messages.MessageCollector;
import org.jetbrains.kotlin.cli.common.messages.MessageCollectorUtil;
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil;
import org.jetbrains.kotlin.modules.Module;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
@@ -122,10 +122,10 @@ public class KotlinToJVMBytecodeCompiler {
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled();
String targetDescription = "in modules [" + Joiner.on(", ").join(Collections2.transform(chunk, new Function<Module, String>() {
String targetDescription = "in targets [" + Joiner.on(", ").join(Collections2.transform(chunk, new Function<Module, String>() {
@Override
public String apply(@Nullable Module input) {
return input != null ? input.getModuleName() : "<null>";
return input != null ? input.getModuleName() + "-" + input.getModuleType() : "<null>";
}
})) + "] ";
AnalysisResult result = analyze(environment, targetDescription);
@@ -148,7 +148,7 @@ public class KotlinToJVMBytecodeCompiler {
}
);
GenerationState generationState =
generate(environment, result, jetFiles, module.getModuleName(), new File(module.getOutputDirectory()),
generate(environment, result, jetFiles, module, new File(module.getOutputDirectory()),
module.getModuleName());
outputFiles.put(module, generationState.getFactory());
}
@@ -189,7 +189,7 @@ public class KotlinToJVMBytecodeCompiler {
configuration.add(JVMConfigurationKeys.ANNOTATIONS_PATH_KEY, new File(annotationsRoot));
}
configuration.add(JVMConfigurationKeys.MODULE_IDS, module.getModuleName());
configuration.add(JVMConfigurationKeys.MODULES, module);
}
return configuration;
@@ -326,7 +326,7 @@ public class KotlinToJVMBytecodeCompiler {
moduleContext,
environment.getSourceFiles(),
sharedTrace,
environment.getConfiguration().get(JVMConfigurationKeys.MODULE_IDS),
environment.getConfiguration().get(JVMConfigurationKeys.MODULES),
environment.getConfiguration().get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS),
new JvmPackagePartProvider(environment)
);
@@ -357,7 +357,7 @@ public class KotlinToJVMBytecodeCompiler {
@NotNull KotlinCoreEnvironment environment,
@NotNull AnalysisResult result,
@NotNull List<JetFile> sourceFiles,
@Nullable String moduleId,
@Nullable Module target,
File outputDirectory,
String moduleName
) {
@@ -365,11 +365,11 @@ public class KotlinToJVMBytecodeCompiler {
IncrementalCompilationComponents incrementalCompilationComponents = configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS);
Collection<FqName> packagesWithObsoleteParts;
if (moduleId == null || incrementalCompilationComponents == null) {
if (target == null || incrementalCompilationComponents == null) {
packagesWithObsoleteParts = Collections.emptySet();
}
else {
IncrementalCache incrementalCache = incrementalCompilationComponents.getIncrementalCache(moduleId);
IncrementalCache incrementalCache = incrementalCompilationComponents.getIncrementalCache(target);
packagesWithObsoleteParts = new HashSet<FqName>();
for (String internalName : incrementalCache.getObsoletePackageParts()) {
packagesWithObsoleteParts.add(JvmClassName.byInternalName(internalName).getPackageFqName());
@@ -389,7 +389,7 @@ public class KotlinToJVMBytecodeCompiler {
configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false),
diagnosticHolder,
packagesWithObsoleteParts,
moduleId,
target,
moduleName,
outputDirectory,
incrementalCompilationComponents
@@ -401,7 +401,7 @@ public class KotlinToJVMBytecodeCompiler {
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION);
long generationNanos = PerformanceCounter.Companion.currentTime() - generationStart;
String desc = moduleId != null ? "module " + moduleId + " " : "";
String desc = target != null ? "target " + target.getModuleName() + "-" + target.getModuleType() + " " : "";
String message = "GENERATE: " + sourceFiles.size() + " files (" +
environment.countLinesOfCode(sourceFiles) + " lines) " + desc + "in " + TimeUnit.NANOSECONDS.toMillis(generationNanos) + " ms";
K2JVMCompiler.Companion.reportPerf(environment.getConfiguration(), message);
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.cli.jvm.config;
import org.jetbrains.kotlin.modules.Module;
import org.jetbrains.kotlin.cli.jvm.compiler.CompilerJarLocator;
import org.jetbrains.kotlin.config.CompilerConfigurationKey;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
@@ -48,8 +49,8 @@ public class JVMConfigurationKeys {
public static final CompilerConfigurationKey<CompilerJarLocator> COMPILER_JAR_LOCATOR =
CompilerConfigurationKey.create("Compiler jar locator");
public static final CompilerConfigurationKey<List<String>> MODULE_IDS =
CompilerConfigurationKey.create("module id strings");
public static final CompilerConfigurationKey<List<Module>> MODULES =
CompilerConfigurationKey.create("module data");
public static final CompilerConfigurationKey<String> MODULE_NAME =
CompilerConfigurationKey.create("module name");
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.modules.Module
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetFile
@@ -49,7 +50,7 @@ public class IncrementalPackageFragmentProvider(
val storageManager: StorageManager,
val deserializationComponents: DeserializationComponents,
val incrementalCache: IncrementalCache,
val moduleId: String
val target: Module
) : PackageFragmentProvider {
companion object {
@@ -93,8 +94,8 @@ public class IncrementalPackageFragmentProvider(
public inner class IncrementalPackageFragment(fqName: FqName) : PackageFragmentDescriptorImpl(module, fqName) {
public val moduleId: String
get() = this@IncrementalPackageFragmentProvider.moduleId
public val target: Module
get() = this@IncrementalPackageFragmentProvider.target
val memberScope: NotNullLazyValue<JetScope> = storageManager.createLazyValue {
if (fqName !in fqNamesToLoad) {
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.modules.Module
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.storage.StorageManager
@@ -46,14 +47,13 @@ internal class IncrementalPackagePartProvider private constructor(
public fun create(
parent: PackagePartProvider,
sourceFiles: Collection<JetFile>,
moduleIds: List<String>?,
modules: List<Module>?,
incrementalCompilationComponents: IncrementalCompilationComponents?,
storageManager: StorageManager
): PackagePartProvider {
if (moduleIds == null || incrementalCompilationComponents == null) return parent
val incrementalCaches = moduleIds.map { incrementalCompilationComponents.getIncrementalCache(it) }
if (modules == null || incrementalCompilationComponents == null) return parent
val incrementalCaches = modules.map { incrementalCompilationComponents.getIncrementalCache(it) }
return IncrementalPackagePartProvider(parent, sourceFiles, incrementalCaches, storageManager)
}
}
@@ -17,8 +17,9 @@
package org.jetbrains.kotlin.load.kotlin.incremental.components
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.modules.Module
public interface IncrementalCompilationComponents {
public fun getIncrementalCache(moduleId: String): IncrementalCache
public fun getIncrementalCache(target: Module): IncrementalCache
public fun getLookupTracker(): LookupTracker
}
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentPr
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
import org.jetbrains.kotlin.modules.Module;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap;
import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap;
@@ -100,12 +101,12 @@ public enum TopDownAnalyzerFacadeForJVM {
@NotNull ModuleContext moduleContext,
@NotNull Collection<JetFile> files,
@NotNull BindingTrace trace,
@Nullable List<String> moduleIds,
@Nullable List<Module> targets,
@Nullable IncrementalCompilationComponents incrementalCompilationComponents,
@NotNull PackagePartProvider packagePartProvider
) {
return analyzeFilesWithJavaIntegration(
moduleContext, files, trace, TopDownAnalysisMode.TopLevelDeclarations, moduleIds, incrementalCompilationComponents,
moduleContext, files, trace, TopDownAnalysisMode.TopLevelDeclarations, targets, incrementalCompilationComponents,
packagePartProvider);
}
@@ -115,7 +116,7 @@ public enum TopDownAnalyzerFacadeForJVM {
@NotNull Collection<JetFile> files,
@NotNull BindingTrace trace,
@NotNull TopDownAnalysisMode topDownAnalysisMode,
@Nullable List<String> moduleIds,
@Nullable List<Module> targets,
@Nullable IncrementalCompilationComponents incrementalCompilationComponents,
@NotNull PackagePartProvider packagePartProvider
) {
@@ -128,7 +129,7 @@ public enum TopDownAnalyzerFacadeForJVM {
LookupTracker lookupTracker =
incrementalCompilationComponents != null ? incrementalCompilationComponents.getLookupTracker() : LookupTracker.DO_NOTHING;
packagePartProvider = IncrementalPackagePartProvider.create(packagePartProvider, files, moduleIds, incrementalCompilationComponents, moduleContext.getStorageManager());
packagePartProvider = IncrementalPackagePartProvider.create(packagePartProvider, files, targets, incrementalCompilationComponents, moduleContext.getStorageManager());
ContainerForTopDownAnalyzerForJvm container = DiPackage.createContainerForTopDownAnalyzerForJvm(
moduleContext,
@@ -141,15 +142,15 @@ public enum TopDownAnalyzerFacadeForJVM {
List<PackageFragmentProvider> additionalProviders = new ArrayList<PackageFragmentProvider>();
if (moduleIds != null && incrementalCompilationComponents != null) {
for (String moduleId : moduleIds) {
IncrementalCache incrementalCache = incrementalCompilationComponents.getIncrementalCache(moduleId);
if (targets != null && incrementalCompilationComponents != null) {
for (Module target : targets) {
IncrementalCache incrementalCache = incrementalCompilationComponents.getIncrementalCache(target);
additionalProviders.add(
new IncrementalPackageFragmentProvider(
files, moduleContext.getModule(), moduleContext.getStorageManager(),
container.getDeserializationComponentsForJava().getComponents(),
incrementalCache, moduleId
incrementalCache, target
)
);
}
@@ -321,6 +321,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR
|| className.startsWith("org.apache.log4j.") // For logging from compiler
|| className == "org.jetbrains.kotlin.progress.CompilationCanceledStatus"
|| className == "org.jetbrains.kotlin.progress.CompilationCanceledException"
|| className == "org.jetbrains.kotlin.modules.Module"
},
compilerServices
)
@@ -20,14 +20,42 @@ import org.jetbrains.jps.incremental.ModuleBuildTarget
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.modules.Module
public class IncrementalCompilationComponentsImpl(
caches: Map<ModuleBuildTarget, IncrementalCache>,
private val lookupTracker: LookupTracker
): IncrementalCompilationComponents {
private val idToCache = caches.mapKeys { it.key.id!! }
private val caches = caches.mapKeys { ModuleToModuleBuildTargetAdapter(it.key) }
override fun getIncrementalCache(moduleId: String): IncrementalCache = idToCache[moduleId]!!
override fun getIncrementalCache(target: Module): IncrementalCache =
caches[target]!!
override fun getLookupTracker(): LookupTracker = lookupTracker
}
private class ModuleToModuleBuildTargetAdapter(
private val moduleBuildTarget: ModuleBuildTarget
) : Module {
override fun getModuleName(): String =
moduleBuildTarget.id
override fun getModuleType(): String =
moduleBuildTarget.targetType.typeId
override fun getAnnotationsRoots(): List<String> =
throw UnsupportedOperationException()
override fun getClasspathRoots(): List<String> =
throw UnsupportedOperationException()
override fun getJavaSourceRoots(): List<String> =
throw UnsupportedOperationException()
override fun getOutputDirectory(): String =
throw UnsupportedOperationException()
override fun getSourceFiles(): List<String> =
throw UnsupportedOperationException()
}