Added incremental compilation flag. For publishing intermediate implementation.

This commit is contained in:
Evgeny Gerashchenko
2014-03-11 23:56:50 +04:00
parent 3553f0701c
commit a502374a62
8 changed files with 68 additions and 16 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.MethodContext; import org.jetbrains.jet.codegen.context.MethodContext;
import org.jetbrains.jet.codegen.context.PackageContext; import org.jetbrains.jet.codegen.context.PackageContext;
import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotated; import org.jetbrains.jet.lang.descriptors.annotations.Annotated;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
@@ -168,6 +169,10 @@ public class CodegenUtil {
PackageFragmentDescriptor fragment1 = (PackageFragmentDescriptor) owner1; PackageFragmentDescriptor fragment1 = (PackageFragmentDescriptor) owner1;
PackageFragmentDescriptor fragment2 = (PackageFragmentDescriptor) owner2; PackageFragmentDescriptor fragment2 = (PackageFragmentDescriptor) owner2;
if (!IncrementalCompilation.ENABLED) {
return fragment1 == fragment2;
}
// backing field should be used directly within same module of same package // backing field should be used directly within same module of same package
// TODO calls from other modules/libraries should use facade: KT-4590 // TODO calls from other modules/libraries should use facade: KT-4590
return fragment1.getFqName().equals(fragment2.getFqName()) && DescriptorUtils.areInSameModule(fragment1, fragment2); return fragment1.getFqName().equals(fragment2.getFqName()) && DescriptorUtils.areInSameModule(fragment1, fragment2);
@@ -37,6 +37,7 @@ import org.jetbrains.jet.codegen.context.MethodContext;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.codegen.context.PackageContext; import org.jetbrains.jet.codegen.context.PackageContext;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.descriptors.serialization.*; import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPropertyDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPropertyDescriptor;
@@ -113,6 +114,10 @@ public class PackageCodegen extends GenerationStateAware {
@Nullable @Nullable
private PackageFragmentDescriptor getCompiledPackageFragment() { private PackageFragmentDescriptor getCompiledPackageFragment() {
if (!IncrementalCompilation.ENABLED) {
return null;
}
// TODO rewrite it to something more robust when module system is implemented // TODO rewrite it to something more robust when module system is implemented
for (PackageFragmentDescriptor anotherFragment : packageFragment.getContainingDeclaration().getPackageFragmentProvider() for (PackageFragmentDescriptor anotherFragment : packageFragment.getContainingDeclaration().getPackageFragmentProvider()
.getPackageFragments(packageFragment.getFqName())) { .getPackageFragments(packageFragment.getFqName())) {
@@ -29,6 +29,7 @@ import org.jetbrains.jet.codegen.signature.BothSignatureWriter;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind; import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterSignature; import org.jetbrains.jet.codegen.signature.JvmMethodParameterSignature;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor;
@@ -132,7 +133,7 @@ public class JetTypeMapper extends BindingTraceAware {
if (file != null) { if (file != null) {
return PackageCodegen.getPackagePartInternalName(file); return PackageCodegen.getPackagePartInternalName(file);
} }
if (descriptor instanceof DeserializedCallableMemberDescriptor) { if (descriptor instanceof DeserializedCallableMemberDescriptor && IncrementalCompilation.ENABLED) {
// //
// TODO calls from other modules/libraries should use facade: KT-4590 // TODO calls from other modules/libraries should use facade: KT-4590
return PackageCodegen.getPackagePartInternalName((DeserializedCallableMemberDescriptor) descriptor); return PackageCodegen.getPackagePartInternalName((DeserializedCallableMemberDescriptor) descriptor);
@@ -0,0 +1,21 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.config;
public class IncrementalCompilation {
public static final boolean ENABLED = "true".equals(System.getProperty("kotlin.incremental.compilation"));
}
@@ -17,6 +17,7 @@
package org.jetbrains.jet.compiler.runner; package org.jetbrains.jet.compiler.runner;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.utils.Printer; import org.jetbrains.jet.utils.Printer;
import java.io.File; import java.io.File;
@@ -85,13 +86,13 @@ public class KotlinModuleXmlBuilderFactory implements KotlinModuleDescriptionBui
public void processClassPathSection(@NotNull String sectionDescription, @NotNull Collection<File> files) { public void processClassPathSection(@NotNull String sectionDescription, @NotNull Collection<File> files) {
p.println("<!-- ", sectionDescription, " -->"); p.println("<!-- ", sectionDescription, " -->");
for (File file : files) { for (File file : files) {
boolean isOutput = directoriesToFilterOut.contains(file); // TODO make it optional boolean isOutput = directoriesToFilterOut.contains(file) && !IncrementalCompilation.ENABLED;
if (isOutput) { if (isOutput) {
// For IDEA's make (incremental compilation) purposes, output directories of the current module and its dependencies // For IDEA's make (incremental compilation) purposes, output directories of the current module and its dependencies
// appear on the class path, so we are at risk of seeing the results of the previous build, i.e. if some class was // appear on the class path, so we are at risk of seeing the results of the previous build, i.e. if some class was
// removed in the sources, it may still be there in binaries. Thus, we delete these entries from the classpath. // removed in the sources, it may still be there in binaries. Thus, we delete these entries from the classpath.
p.println("<!-- Output directory, commented out -->"); p.println("<!-- Output directory, commented out -->");
//p.println("<!-- "); p.println("<!-- ");
p.pushIndent(); p.pushIndent();
} }
@@ -99,7 +100,7 @@ public class KotlinModuleXmlBuilderFactory implements KotlinModuleDescriptionBui
if (isOutput) { if (isOutput) {
p.popIndent(); p.popIndent();
//p.println("-->"); p.println("-->");
} }
} }
} }
@@ -16,6 +16,7 @@
package org.jetbrains.jet.jps.build; package org.jetbrains.jet.jps.build;
import com.google.common.collect.Maps;
import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.StringUtil;
@@ -35,6 +36,7 @@ import org.jetbrains.jet.compiler.runner.CompilerEnvironment;
import org.jetbrains.jet.compiler.runner.CompilerRunnerConstants; import org.jetbrains.jet.compiler.runner.CompilerRunnerConstants;
import org.jetbrains.jet.compiler.runner.OutputItemsCollectorImpl; import org.jetbrains.jet.compiler.runner.OutputItemsCollectorImpl;
import org.jetbrains.jet.compiler.runner.SimpleOutputItem; import org.jetbrains.jet.compiler.runner.SimpleOutputItem;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.jps.JpsKotlinCompilerSettings; import org.jetbrains.jet.jps.JpsKotlinCompilerSettings;
import org.jetbrains.jet.utils.PathUtil; import org.jetbrains.jet.utils.PathUtil;
import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.ModuleChunk;
@@ -191,9 +193,11 @@ public class KotlinBuilder extends ModuleLevelBuilder {
} }
for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) { for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) {
// TODO this is a hack: we don't remove if (IncrementalCompilation.ENABLED) {
if (outputItem.getOutputFile().getName().endsWith("Package.class")) { // TODO this is a hack: we don't remove
continue; if (outputItem.getOutputFile().getName().endsWith("Package.class")) {
continue;
}
} }
BuildTarget<?> target = null; BuildTarget<?> target = null;
Collection<File> sourceFiles = outputItem.getSourceFiles(); Collection<File> sourceFiles = outputItem.getSourceFiles();
@@ -208,14 +212,19 @@ public class KotlinBuilder extends ModuleLevelBuilder {
paths(sourceFiles)); paths(sourceFiles));
} }
// TODO should mark dependencies as dirty, as well if (IncrementalCompilation.ENABLED) {
FSOperations.markDirty(context, chunk, new FileFilter() { // TODO should mark dependencies as dirty, as well
@Override FSOperations.markDirty(context, chunk, new FileFilter() {
public boolean accept(@NotNull File file) { @Override
return !allCompiledFiles.contains(file); public boolean accept(@NotNull File file) {
} return !allCompiledFiles.contains(file);
}); }
return ExitCode.ADDITIONAL_PASS_REQUIRED; });
return ExitCode.ADDITIONAL_PASS_REQUIRED;
}
else {
return ExitCode.OK;
}
} }
private static Set<File> getAllCompiledFilesContainer(CompileContext context) { private static Set<File> getAllCompiledFilesContainer(CompileContext context) {
@@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder; import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder;
import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilderFactory; import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilderFactory;
import org.jetbrains.jet.compiler.runner.KotlinModuleXmlBuilderFactory; import org.jetbrains.jet.compiler.runner.KotlinModuleXmlBuilderFactory;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jps.ModuleChunk; import org.jetbrains.jps.ModuleChunk;
import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor; import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor;
import org.jetbrains.jps.builders.logging.ProjectBuilderLogger; import org.jetbrains.jps.builders.logging.ProjectBuilderLogger;
@@ -56,7 +57,7 @@ public class KotlinBuilderModuleScriptGenerator {
public static File generateModuleDescription( public static File generateModuleDescription(
CompileContext context, CompileContext context,
ModuleChunk chunk, ModuleChunk chunk,
List<File> sourceFiles List<File> sourceFiles // ignored for non-incremental compilation
) )
throws IOException throws IOException
{ {
@@ -72,6 +73,10 @@ public class KotlinBuilderModuleScriptGenerator {
for (ModuleBuildTarget target : chunk.getTargets()) { for (ModuleBuildTarget target : chunk.getTargets()) {
File outputDir = getOutputDir(target); File outputDir = getOutputDir(target);
if (!IncrementalCompilation.ENABLED) {
sourceFiles = new ArrayList<File>(KotlinSourceFileCollector.getAllKotlinSourceFiles(target));
}
if (sourceFiles.size() > 0) { if (sourceFiles.size() > 0) {
noSources = false; noSources = false;
@@ -28,6 +28,7 @@ import org.jetbrains.jps.builders.logging.BuildLoggingManager
import org.jetbrains.jps.model.java.JpsJavaExtensionService import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.jps.util.JpsPathUtil
import com.intellij.testFramework.UsefulTestCase import com.intellij.testFramework.UsefulTestCase
import org.jetbrains.jet.config.IncrementalCompilation
public class IncrementalJpsTest : JpsBuildTestCase() { public class IncrementalJpsTest : JpsBuildTestCase() {
private val testDataDir: File private val testDataDir: File
@@ -64,6 +65,10 @@ public class IncrementalJpsTest : JpsBuildTestCase() {
} }
private fun doTest() { private fun doTest() {
if (!IncrementalCompilation.ENABLED) {
return
}
addModule("module", array<String>(getAbsolutePath("src")), null, null, addJdk("my jdk")) addModule("module", array<String>(getAbsolutePath("src")), null, null, addJdk("my jdk"))
AbstractKotlinJpsBuildTestCase.addKotlinRuntimeDependency(myProject!!) AbstractKotlinJpsBuildTestCase.addKotlinRuntimeDependency(myProject!!)