Drop several more parameters of GenerationState's constructor

INCREMENTAL_COMPILATION_COMPONENTS and DECLARATIONS_JSON_PATH are already in
the configuration, and Progress was unused
This commit is contained in:
Alexander Udalov
2016-05-20 14:08:39 +03:00
parent f8816b5d67
commit 29c5e655ab
7 changed files with 33 additions and 59 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.codegen; package org.jetbrains.kotlin.codegen;
import com.google.common.collect.Lists;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import com.intellij.util.Function; import com.intellij.util.Function;
@@ -76,12 +75,13 @@ public class ClassFileFactory implements OutputFileCollection {
public ClassBuilder newVisitor( public ClassBuilder newVisitor(
@NotNull JvmDeclarationOrigin origin, @NotNull JvmDeclarationOrigin origin,
@NotNull Type asmType, @NotNull Type asmType,
@NotNull Collection<? extends PsiFile> sourceFiles) { @NotNull Collection<? extends PsiFile> sourceFiles
String outputFilePath = asmType.getInternalName() + ".class"; ) {
List<File> ioSourceFiles = toIoFilesIgnoringNonPhysical(sourceFiles);
state.getProgress().reportOutput(ioSourceFiles, new File(outputFilePath));
ClassBuilder answer = builderFactory.newClassBuilder(origin); ClassBuilder answer = builderFactory.newClassBuilder(origin);
generators.put(outputFilePath, new ClassBuilderAndSourceFileList(answer, ioSourceFiles)); generators.put(
asmType.getInternalName() + ".class",
new ClassBuilderAndSourceFileList(answer, toIoFilesIgnoringNonPhysical(sourceFiles))
);
return answer; return answer;
} }
@@ -107,7 +107,6 @@ public class ClassFileFactory implements OutputFileCollection {
} }
if (builder.getPackagePartsCount() != 0) { if (builder.getPackagePartsCount() != 0) {
state.getProgress().reportOutput(packagePartSourceFiles, new File(outputFilePath));
generators.put(outputFilePath, new OutAndSourceFileList(CollectionsKt.toList(packagePartSourceFiles)) { generators.put(outputFilePath, new OutAndSourceFileList(CollectionsKt.toList(packagePartSourceFiles)) {
@Override @Override
public byte[] asBytes(ClassBuilderFactory factory) { public byte[] asBytes(ClassBuilderFactory factory) {
@@ -225,7 +224,7 @@ public class ClassFileFactory implements OutputFileCollection {
@NotNull @NotNull
private static List<File> toIoFilesIgnoringNonPhysical(@NotNull Collection<? extends PsiFile> psiFiles) { private static List<File> toIoFilesIgnoringNonPhysical(@NotNull Collection<? extends PsiFile> psiFiles) {
List<File> result = Lists.newArrayList(); List<File> result = new ArrayList<File>(psiFiles.size());
for (PsiFile psiFile : psiFiles) { for (PsiFile psiFile : psiFiles) {
VirtualFile virtualFile = psiFile.getVirtualFile(); VirtualFile virtualFile = psiFile.getVirtualFile();
// We ignore non-physical files here, because this code is needed to tell the make what inputs affect which outputs // We ignore non-physical files here, because this code is needed to tell the make what inputs affect which outputs
@@ -33,9 +33,7 @@ fun List<PackageParts>.addCompiledPartsAndSort(state: GenerationState): List<Pac
addCompiledParts(state).sortedBy { it.packageFqName } addCompiledParts(state).sortedBy { it.packageFqName }
private fun List<PackageParts>.addCompiledParts(state: GenerationState): List<PackageParts> { private fun List<PackageParts>.addCompiledParts(state: GenerationState): List<PackageParts> {
if (state.incrementalCompilationComponents == null || state.targetId == null) return this val incrementalCache = state.getIncrementalCacheForThisTarget() ?: return this
val incrementalCache = state.incrementalCompilationComponents.getIncrementalCache(state.targetId)
val moduleMappingData = incrementalCache.getModuleMappingData() ?: return this val moduleMappingData = incrementalCache.getModuleMappingData() ?: return this
val mapping = ModuleMapping.create(moduleMappingData) val mapping = ModuleMapping.create(moduleMappingData)
@@ -32,8 +32,6 @@ import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper; import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache; import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
import org.jetbrains.kotlin.modules.TargetId;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
@@ -910,12 +908,8 @@ public class InlineCodegen extends CallGenerator {
@NotNull JvmMethodSignature jvmSignature, @NotNull JvmMethodSignature jvmSignature,
@NotNull GenerationState state @NotNull GenerationState state
) { ) {
IncrementalCompilationComponents incrementalCompilationComponents = state.getIncrementalCompilationComponents(); IncrementalCache incrementalCache = state.getIncrementalCacheForThisTarget();
TargetId targetId = state.getTargetId(); if (incrementalCache == null) return;
if (incrementalCompilationComponents == null || targetId == null) return;
IncrementalCache incrementalCache = incrementalCompilationComponents.getIncrementalCache(targetId);
String classFilePath = InlineCodegenUtilsKt.getClassFilePath(sourceDescriptor, state.getTypeMapper(), incrementalCache); String classFilePath = InlineCodegenUtilsKt.getClassFilePath(sourceDescriptor, state.getTypeMapper(), incrementalCache);
String sourceFilePath = InlineCodegenUtilsKt.getSourceFilePath(targetDescriptor); String sourceFilePath = InlineCodegenUtilsKt.getSourceFilePath(targetDescriptor);
incrementalCache.registerInline(classFilePath, jvmSignature.toString(), sourceFilePath); incrementalCache.registerInline(classFilePath, jvmSignature.toString(), sourceFilePath);
@@ -925,6 +919,5 @@ public class InlineCodegen extends CallGenerator {
public void reorderArgumentsIfNeeded( public void reorderArgumentsIfNeeded(
@NotNull List<ArgumentAndDeclIndex> actualArgsWithDeclIndex, @NotNull List<? extends Type> valueParameterTypes @NotNull List<ArgumentAndDeclIndex> actualArgsWithDeclIndex, @NotNull List<? extends Type> valueParameterTypes
) { ) {
} }
} }
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.descriptors.ScriptDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -59,15 +59,12 @@ class GenerationState @JvmOverloads constructor(
val obsoleteMultifileClasses: Collection<FqName> = emptySet(), val obsoleteMultifileClasses: Collection<FqName> = emptySet(),
// for PackageCodegen in incremental compilation mode // for PackageCodegen in incremental compilation mode
val targetId: TargetId? = null, val targetId: TargetId? = null,
moduleName: String? = null, moduleName: String? = configuration.get(JVMConfigurationKeys.MODULE_NAME),
// 'outDirectory' is a hack to correctly determine if a compiled class is from the same module as the callee during // 'outDirectory' is a hack to correctly determine if a compiled class is from the same module as the callee during
// partial compilation. Module chunks are treated as a single module. // partial compilation. Module chunks are treated as a single module.
// TODO: get rid of it with the proper module infrastructure // TODO: get rid of it with the proper module infrastructure
val outDirectory: File? = null, val outDirectory: File? = null,
val incrementalCompilationComponents: IncrementalCompilationComponents? = null, private val onIndependentPartCompilationEnd: GenerationStateEventCallback = GenerationStateEventCallback.DO_NOTHING
val progress: Progress = Progress.DEAF,
private val onIndependentPartCompilationEnd: GenerationStateEventCallback = GenerationStateEventCallback.DO_NOTHING,
dumpBinarySignatureMappingTo: File? = null
) { ) {
abstract class GenerateClassFilter { abstract class GenerateClassFilter {
abstract fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject): Boolean abstract fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject): Boolean
@@ -91,10 +88,10 @@ class GenerationState @JvmOverloads constructor(
val fileClassesProvider: CodegenFileClassesProvider = CodegenFileClassesProvider() val fileClassesProvider: CodegenFileClassesProvider = CodegenFileClassesProvider()
val inlineCache: InlineCache = InlineCache() val inlineCache: InlineCache = InlineCache()
private fun getIncrementalCacheForThisTarget() = fun getIncrementalCacheForThisTarget(): IncrementalCache? =
if (incrementalCompilationComponents != null && targetId != null) configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)?.let { components ->
incrementalCompilationComponents.getIncrementalCache(targetId) targetId?.let { components.getIncrementalCache(it) }
else null }
val extraJvmDiagnosticsTrace: BindingTrace = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}") val extraJvmDiagnosticsTrace: BindingTrace = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}")
private val interceptedBuilderFactory: ClassBuilderFactory private val interceptedBuilderFactory: ClassBuilderFactory
@@ -150,7 +147,8 @@ class GenerationState @JvmOverloads constructor(
getIncrementalCacheForThisTarget(), getIncrementalCacheForThisTarget(),
this.moduleName).apply { duplicateSignatureFactory = this } }, this.moduleName).apply { duplicateSignatureFactory = this } },
{ BuilderFactoryForDuplicateClassNameDiagnostics(it, diagnostics) }, { BuilderFactoryForDuplicateClassNameDiagnostics(it, diagnostics) },
{ dumpBinarySignatureMappingTo?.let { destination -> SignatureDumpingBuilderFactory(it, destination) } ?: it } { configuration.get(JVMConfigurationKeys.DECLARATIONS_JSON_PATH)
?.let { destination -> SignatureDumpingBuilderFactory(it, File(destination)) } ?: it }
) )
.wrapWith(ClassBuilderInterceptorExtension.getInstances(project)) { builderFactory, extension -> .wrapWith(ClassBuilderInterceptorExtension.getInstances(project)) { builderFactory, extension ->
extension.interceptClassBuilderFactory(builderFactory, bindingContext, diagnostics) extension.interceptClassBuilderFactory(builderFactory, bindingContext, diagnostics)
@@ -404,9 +404,7 @@ object KotlinToJVMBytecodeCompiler {
targetId, targetId,
moduleName, moduleName,
outputDirectory, outputDirectory,
incrementalCompilationComponents, onIndependentPartCompilationEnd
onIndependentPartCompilationEnd = onIndependentPartCompilationEnd,
dumpBinarySignatureMappingTo = configuration.get(JVMConfigurationKeys.DECLARATIONS_JSON_PATH)?.let { File(it) }
) )
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
import org.jetbrains.kotlin.test.ConfigurationKind import org.jetbrains.kotlin.test.ConfigurationKind
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.test.TestJdkKind
import java.io.File import java.io.File
abstract class AbstractDumpDeclarationsTest : CodegenTestCase() { abstract class AbstractDumpDeclarationsTest : CodegenTestCase() {
override fun doMultiFileTest(wholeFile: File, files: List<TestFile>, javaFilesDir: File?) { override fun doMultiFileTest(wholeFile: File, files: List<TestFile>, javaFilesDir: File?) {
val expectedResult = KotlinTestUtils.replaceExtension(wholeFile, "json") val expectedResult = KotlinTestUtils.replaceExtension(wholeFile, "json")
compileAndCompareDump(files, expectedResult) compileAndCompareDump(files, expectedResult)
@@ -38,32 +37,29 @@ abstract class AbstractDumpDeclarationsTest : CodegenTestCase() {
private fun compileAndCompareDump(files: List<TestFile>, expectedResult: File) { private fun compileAndCompareDump(files: List<TestFile>, expectedResult: File) {
configurationKind = ConfigurationKind.NO_KOTLIN_REFLECT configurationKind = ConfigurationKind.NO_KOTLIN_REFLECT
val configuration = KotlinTestUtils.compilerConfigurationForTests( val dumpToFile = KotlinTestUtils.tmpDirForTest(this).resolve(this.name + ".json")
configurationKind, TestJdkKind.MOCK_JDK, listOf(KotlinTestUtils.getAnnotationsJar()), emptyList())
myEnvironment = KotlinCoreEnvironment.createForTests( val configuration =
testRootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) KotlinTestUtils.compilerConfigurationForTests(configurationKind, TestJdkKind.MOCK_JDK, KotlinTestUtils.getAnnotationsJar())
configuration.put(JVMConfigurationKeys.DECLARATIONS_JSON_PATH, dumpToFile.path)
myEnvironment = KotlinCoreEnvironment.createForTests(testRootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
loadMultiFiles(files) loadMultiFiles(files)
val declarationsFile = compileManyFilesGetDeclarationsDump(myFiles.psiFiles) compileManyFilesGetDeclarationsDump(myFiles.psiFiles)
KotlinTestUtils.assertEqualsToFile(expectedResult, declarationsFile.readText()) KotlinTestUtils.assertEqualsToFile(expectedResult, dumpToFile.readText())
} }
private fun compileManyFilesGetDeclarationsDump(files: List<KtFile>): File { private fun compileManyFilesGetDeclarationsDump(files: List<KtFile>) {
val (bindingContext, moduleDescriptor) = val (bindingContext, moduleDescriptor) =
JvmResolveUtil.analyzeAndCheckForErrors(files, myEnvironment).apply(AnalysisResult::throwIfError) JvmResolveUtil.analyzeAndCheckForErrors(files, myEnvironment).apply(AnalysisResult::throwIfError)
val dumpToFile = KotlinTestUtils.tmpDirForTest(this).resolve(this.name + ".json")
val state = GenerationState( val state = GenerationState(
myEnvironment.project, ClassBuilderFactories.TEST, moduleDescriptor, bindingContext, files, CompilerConfiguration.EMPTY, myEnvironment.project, ClassBuilderFactories.TEST, moduleDescriptor, bindingContext, files, myEnvironment.configuration
dumpBinarySignatureMappingTo = dumpToFile
) )
KotlinCodegenFacade.compileCorrectFiles(state, org.jetbrains.kotlin.codegen.CompilationErrorHandler.THROW_EXCEPTION) KotlinCodegenFacade.compileCorrectFiles(state, org.jetbrains.kotlin.codegen.CompilationErrorHandler.THROW_EXCEPTION)
state.destroy() state.destroy()
return dumpToFile
} }
} }
@@ -25,9 +25,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.config.JVMConfigurationKeys;
import org.jetbrains.kotlin.descriptors.PackagePartProvider; import org.jetbrains.kotlin.descriptors.PackagePartProvider;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil; import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil;
@@ -65,13 +63,7 @@ public class GenerationUtils {
GenerationState state = new GenerationState( GenerationState state = new GenerationState(
CollectionsKt.first(files).getProject(), ClassBuilderFactories.TEST, CollectionsKt.first(files).getProject(), ClassBuilderFactories.TEST,
analysisResult.getModuleDescriptor(), analysisResult.getBindingContext(), analysisResult.getModuleDescriptor(), analysisResult.getBindingContext(),
files, files, configuration
configuration,
GenerationState.GenerateClassFilter.GENERATE_ALL,
Collections.<FqName>emptySet(),
Collections.<FqName>emptySet(),
null,
configuration.get(JVMConfigurationKeys.MODULE_NAME)
); );
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION); KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION);
return state; return state;