Generate kotlin_module incrementally and report source files
This commit is contained in:
committed by
Michael Bogdanov
parent
879b1a8abb
commit
b8db33722c
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user