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.psi.PsiFile;
import com.intellij.util.Function; import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly; import org.jetbrains.annotations.TestOnly;
import org.jetbrains.kotlin.backend.common.output.OutputFile; import org.jetbrains.kotlin.backend.common.output.OutputFile;
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection; import org.jetbrains.kotlin.backend.common.output.OutputFileCollection;
import org.jetbrains.kotlin.codegen.state.GenerationState; 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.load.kotlin.PackageParts;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetFile;
@@ -92,14 +94,23 @@ public class ClassFileFactory implements OutputFileCollection {
final JvmPackageTable.PackageTable.Builder builder = JvmPackageTable.PackageTable.newBuilder(); final JvmPackageTable.PackageTable.Builder builder = JvmPackageTable.PackageTable.newBuilder();
String outputFilePath = getMappingFileName(state.getModuleName()); String outputFilePath = getMappingFileName(state.getModuleName());
List<PackageParts> parts = ContainerUtil.newArrayList();
Set<File> sourceFiles = new HashSet<File>();
for (PackageCodegen codegen : values) { 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) { if (builder.getPackagePartsCount() != 0) {
state.getProgress().reportOutput(Collections.<File>emptyList(), new File(outputFilePath)); state.getProgress().reportOutput(sourceFiles, new File(outputFilePath));
//TODO: source files? generators.put(outputFilePath, new OutAndSourceFileList(KotlinPackage.toList(sourceFiles)) {
generators.put(outputFilePath, new OutAndSourceFileList(Collections.<File>emptyList()) {
@Override @Override
public byte[] asBytes(ClassBuilderFactory factory) { public byte[] asBytes(ClassBuilderFactory factory) {
try { try {
@@ -35,9 +35,6 @@ import org.jetbrains.kotlin.codegen.context.MethodContext;
import org.jetbrains.kotlin.codegen.context.PackageContext; import org.jetbrains.kotlin.codegen.context.PackageContext;
import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.config.IncrementalCompilation; 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.CallableMemberDescriptor;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; 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.JvmAbi;
import org.jetbrains.kotlin.load.java.JvmAnnotationNames; import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils; 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.load.kotlin.incremental.IncrementalPackageFragmentProvider;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.MemberComparator; import org.jetbrains.kotlin.resolve.MemberComparator;
@@ -427,4 +426,8 @@ public class PackageCodegen {
public PackageParts getPackageParts() { public PackageParts getPackageParts() {
return packageParts; return packageParts;
} }
public Collection<JetFile> getFiles() {
return files;
}
} }
@@ -17,6 +17,9 @@
package org.jetbrains.kotlin.codegen package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.backend.common.output.OutputFile 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> { fun ClassFileFactory.getClassFiles(): Iterable<OutputFile> {
return asList().filterClassFiles() return asList().filterClassFiles()
@@ -24,4 +27,32 @@ fun ClassFileFactory.getClassFiles(): Iterable<OutputFile> {
fun List<OutputFile>.filterClassFiles(): Iterable<OutputFile> { fun List<OutputFile>.filterClassFiles(): Iterable<OutputFile> {
return filter { it.relativePath.endsWith(".class") } 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
}
}