Generate kotlin_module incrementally and report source files

This commit is contained in:
Zalim Bashorov
2015-09-04 18:34:42 +03:00
committed by Michael Bogdanov
parent 879b1a8abb
commit b8db33722c
3 changed files with 53 additions and 8 deletions
@@ -21,12 +21,14 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.kotlin.backend.common.output.OutputFile;
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
import org.jetbrains.kotlin.load.kotlin.PackageParts;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.JetFile;
@@ -92,14 +94,23 @@ public class ClassFileFactory implements OutputFileCollection {
final JvmPackageTable.PackageTable.Builder builder = JvmPackageTable.PackageTable.newBuilder();
String outputFilePath = getMappingFileName(state.getModuleName());
List<PackageParts> parts = ContainerUtil.newArrayList();
Set<File> sourceFiles = new HashSet<File>();
for (PackageCodegen codegen : values) {
PackageParts.Companion.serialize(codegen.getPackageParts(), builder);
parts.add(codegen.getPackageParts());
// TODO extract common logic
sourceFiles.addAll(toIoFilesIgnoringNonPhysical(PackagePartClassUtils.getFilesWithCallables(codegen.getFiles())));
}
for (PackageParts part : CodegenPackage.addCompiledPartsAndSort(parts, state)) {
PackageParts.Companion.serialize(part, builder);
}
if (builder.getPackagePartsCount() != 0) {
state.getProgress().reportOutput(Collections.<File>emptyList(), new File(outputFilePath));
//TODO: source files?
generators.put(outputFilePath, new OutAndSourceFileList(Collections.<File>emptyList()) {
state.getProgress().reportOutput(sourceFiles, new File(outputFilePath));
generators.put(outputFilePath, new OutAndSourceFileList(KotlinPackage.toList(sourceFiles)) {
@Override
public byte[] asBytes(ClassBuilderFactory factory) {
try {
@@ -35,9 +35,6 @@ import org.jetbrains.kotlin.codegen.context.MethodContext;
import org.jetbrains.kotlin.codegen.context.PackageContext;
import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.config.IncrementalCompilation;
import org.jetbrains.kotlin.load.kotlin.KotlinPackage;
import org.jetbrains.kotlin.load.kotlin.PackageParts;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor;
@@ -45,8 +42,10 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils;
import org.jetbrains.kotlin.load.java.JvmAbi;
import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
import org.jetbrains.kotlin.load.kotlin.PackageParts;
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.MemberComparator;
@@ -427,4 +426,8 @@ public class PackageCodegen {
public PackageParts getPackageParts() {
return packageParts;
}
public Collection<JetFile> getFiles() {
return files;
}
}
@@ -17,6 +17,9 @@
package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
import org.jetbrains.kotlin.load.kotlin.PackageParts
fun ClassFileFactory.getClassFiles(): Iterable<OutputFile> {
return asList().filterClassFiles()
@@ -24,4 +27,32 @@ fun ClassFileFactory.getClassFiles(): Iterable<OutputFile> {
fun List<OutputFile>.filterClassFiles(): Iterable<OutputFile> {
return filter { it.relativePath.endsWith(".class") }
}
}
fun List<PackageParts>.addCompiledPartsAndSort(state: GenerationState): List<PackageParts> =
addCompiledParts(state).sortedBy { it.packageFqName }
private fun List<PackageParts>.addCompiledParts(state: GenerationState): List<PackageParts> {
if (state.incrementalCompilationComponents == null || state.moduleId == null) return this
val incrementalCache = state.incrementalCompilationComponents.getIncrementalCache(state.moduleId)
val moduleMappingData = incrementalCache.getModuleMappingData() ?: return this
val mapping = ModuleMapping(moduleMappingData)
incrementalCache.getObsoletePackageParts().forEach {
val i = it.lastIndexOf('/')
val qualifier = if (i == -1) "" else it.substring(0, i).replace('/', '.')
val name = it.substring(i + 1)
mapping.findPackageParts(qualifier)?.run { parts.remove(name) }
}
return (this + mapping.packageFqName2Parts.values())
.groupBy { it.packageFqName }
.map {
val (packageFqName, packageParts) = it
val newPackageParts = PackageParts(packageFqName)
packageParts.forEach { newPackageParts.parts.addAll(it.parts) }
newPackageParts
}
}