diff --git a/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/CodegenTestsOnAndroidGenerator.java b/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/CodegenTestsOnAndroidGenerator.java
index f9649a4c643..4e60b7ab31d 100644
--- a/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/CodegenTestsOnAndroidGenerator.java
+++ b/compiler/android-tests/tests/org/jetbrains/jet/compiler/android/CodegenTestsOnAndroidGenerator.java
@@ -23,7 +23,7 @@ import com.intellij.testFramework.UsefulTestCase;
import junit.framework.Assert;
import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils;
-import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
+import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils;
@@ -147,7 +147,7 @@ public class CodegenTestsOnAndroidGenerator extends UsefulTestCase {
}
Assert.assertTrue("Cannot create directory for compiled files", outputDir.exists());
- CompileEnvironmentUtil.writeToOutputDirectory(factory, outputDir);
+ OutputUtilsPackage.writeAllTo(factory, outputDir);
}
}
}
diff --git a/compiler/backend-common/backend-common.iml b/compiler/backend-common/backend-common.iml
index 3ff6ea7672e..4184658ad62 100644
--- a/compiler/backend-common/backend-common.iml
+++ b/compiler/backend-common/backend-common.iml
@@ -8,6 +8,7 @@
+
diff --git a/compiler/backend-common/src/OutputFileFactory.kt b/compiler/backend-common/src/output/OutputFileFactory.kt
similarity index 100%
rename from compiler/backend-common/src/OutputFileFactory.kt
rename to compiler/backend-common/src/output/OutputFileFactory.kt
diff --git a/compiler/backend-common/src/output/outputDirectors.kt b/compiler/backend-common/src/output/outputDirectors.kt
new file mode 100644
index 00000000000..a2a81b3605f
--- /dev/null
+++ b/compiler/backend-common/src/output/outputDirectors.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2010-2013 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
+
+import java.io.File
+
+public trait OutputDirector {
+ public fun getOutputDirectory(sourceFiles: Collection): File
+}
+
+public class SingleDirectoryDirector(private val dir: File): OutputDirector {
+ override public fun getOutputDirectory(sourceFiles : Collection) : File = dir
+}
\ No newline at end of file
diff --git a/compiler/backend-common/src/output/outputUtils.kt b/compiler/backend-common/src/output/outputUtils.kt
new file mode 100644
index 00000000000..080f6ac0b0f
--- /dev/null
+++ b/compiler/backend-common/src/output/outputUtils.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2010-2013 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.outputUtils
+
+import java.io.File
+import com.intellij.openapi.util.io.FileUtil
+import org.jetbrains.jet.OutputFileFactory
+import org.jetbrains.jet.SingleDirectoryDirector
+import org.jetbrains.jet.OutputDirector
+
+public fun OutputFileFactory.writeAll(outputDirector: OutputDirector, report: (sources: List, output: File) -> Unit) {
+ for (file in outputFiles) {
+ val sources = getSourceFiles(file)
+ val output = File(outputDirector.getOutputDirectory(sources), file)
+ report(sources, output)
+ FileUtil.writeToFile(output, this.asBytes(file))
+ }
+}
+
+private val REPORT_NOTHING = { (sources: List, output: File) -> }
+
+public inline fun OutputFileFactory.writeAllTo(outputDir: File) {
+ writeAll(SingleDirectoryDirector(outputDir), REPORT_NOTHING)
+}
\ No newline at end of file
diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/OutputMessageUtil.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/OutputMessageUtil.java
index 244cf87b0a0..580f2e00932 100644
--- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/OutputMessageUtil.java
+++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/messages/OutputMessageUtil.java
@@ -28,6 +28,7 @@ public class OutputMessageUtil {
private static final String SOURCE_FILES_PREFIX = "Sources:";
private static final String OUTPUT_FILES_PREFIX = "Output:";
+ @NotNull
public static String formatOutputMessage(Collection sourceFiles, File outputFile) {
return OUTPUT_FILES_PREFIX + "\n" + outputFile.getPath() + "\n" +
SOURCE_FILES_PREFIX + "\n" + StringUtil.join(sourceFiles, "\n");
diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/outputUtils.kt b/compiler/cli/src/org/jetbrains/jet/cli/common/outputUtils.kt
new file mode 100644
index 00000000000..2bf9054e5a3
--- /dev/null
+++ b/compiler/cli/src/org/jetbrains/jet/cli/common/outputUtils.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2010-2013 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.cli.common.outputUtils
+
+import org.jetbrains.jet.OutputFileFactory
+import org.jetbrains.jet.OutputDirector
+import org.jetbrains.jet.outputUtils.writeAll
+import org.jetbrains.jet.cli.common.messages.CompilerMessageLocation
+import org.jetbrains.jet.cli.common.messages.OutputMessageUtil
+import org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity
+import org.jetbrains.jet.cli.common.messages.MessageCollector
+
+public inline fun OutputFileFactory.writeAll(outputDirector: OutputDirector, messageCollector: MessageCollector) {
+ writeAll(outputDirector) { sources, output ->
+ messageCollector.report(CompilerMessageSeverity.OUTPUT, OutputMessageUtil.formatOutputMessage(sources, output), CompilerMessageLocation.NO_LOCATION)
+ }
+}
\ No newline at end of file
diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java
index 2bc1c887153..7be6291ef5d 100644
--- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java
+++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java
@@ -26,11 +26,13 @@ import jet.modules.AllModules;
import jet.modules.Module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jet.OutputFileFactory;
import org.jetbrains.jet.cli.common.CLIConfigurationKeys;
-import org.jetbrains.jet.cli.common.messages.*;
+import org.jetbrains.jet.cli.common.messages.MessageCollector;
+import org.jetbrains.jet.cli.common.messages.MessageRenderer;
import org.jetbrains.jet.cli.common.modules.ModuleDescription;
import org.jetbrains.jet.cli.common.modules.ModuleXmlParser;
+import org.jetbrains.jet.OutputDirector;
+import org.jetbrains.jet.cli.common.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GeneratedClassLoader;
@@ -49,7 +51,6 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
import java.util.jar.*;
@@ -236,48 +237,6 @@ public class CompileEnvironmentUtil {
}
}
- public interface OutputDirector {
- @NotNull
- File getOutputDirectory(@NotNull Collection sourceFiles);
- }
-
- public static OutputDirector singleDirectory(@Nullable final File file) {
- if (file == null) return null;
- return new OutputDirector() {
- @NotNull
- @Override
- public File getOutputDirectory(@NotNull Collection sourceFiles) {
- return file;
- }
- };
- }
-
- public static void writeToOutputWithDirector(
- OutputFileFactory factory,
- @NotNull OutputDirector outputDirector,
- @NotNull MessageCollector messageCollector
- ) {
- List files = factory.getOutputFiles();
- for (String file : files) {
- List sourceFiles = factory.getSourceFiles(file);
- File target = new File(outputDirector.getOutputDirectory(sourceFiles), file);
- messageCollector.report(
- CompilerMessageSeverity.OUTPUT,
- OutputMessageUtil.formatOutputMessage(sourceFiles, target),
- CompilerMessageLocation.NO_LOCATION);
- try {
- FileUtil.writeToFile(target, factory.asBytes(file));
- }
- catch (IOException e) {
- throw new CompileEnvironmentException(e);
- }
- }
- }
-
- public static void writeToOutputDirectory(ClassFileFactory factory, @NotNull File outputDir) {
- writeToOutputWithDirector(factory, singleDirectory(outputDir), MessageCollector.NONE);
- }
-
// Used for debug output only
private static String loadModuleScriptText(String moduleScriptFile) {
String moduleScriptText;
@@ -302,7 +261,7 @@ public class CompileEnvironmentUtil {
writeToJar(jar, includeRuntime, mainClass, factory);
}
else if (outputDir != null) {
- writeToOutputWithDirector(factory, outputDir, messageCollector);
+ OutputUtilsPackage.writeAll(factory, outputDir, messageCollector);
}
else {
throw new CompileEnvironmentException("Output directory or jar file is not specified - no files will be saved to the disk");
diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java
index 4f0bab2e07a..1e06ff18a5d 100644
--- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java
+++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java
@@ -32,6 +32,8 @@ import org.jetbrains.jet.cli.common.CompilerPlugin;
import org.jetbrains.jet.cli.common.CompilerPluginContext;
import org.jetbrains.jet.cli.common.messages.AnalyzerWithCompilerReport;
import org.jetbrains.jet.cli.common.messages.MessageCollector;
+import org.jetbrains.jet.OutputDirector;
+import org.jetbrains.jet.SingleDirectoryDirector;
import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.jet.codegen.*;
import org.jetbrains.jet.codegen.state.GenerationState;
@@ -112,7 +114,7 @@ public class KotlinToJVMBytecodeCompiler {
private static void writeOutput(
CompilerConfiguration configuration,
ClassFileFactory moduleFactory,
- CompileEnvironmentUtil.OutputDirector outputDir,
+ OutputDirector outputDir,
File jarPath,
boolean jarRuntime,
FqName mainClass
@@ -137,10 +139,10 @@ public class KotlinToJVMBytecodeCompiler {
if (moduleFactory == null) {
return false;
}
- CompileEnvironmentUtil.OutputDirector outputDir = new CompileEnvironmentUtil.OutputDirector() {
+ OutputDirector outputDir = new OutputDirector() {
@NotNull
@Override
- public File getOutputDirectory(@NotNull Collection sourceFiles) {
+ public File getOutputDirectory(@NotNull Collection extends File> sourceFiles) {
for (File sourceFile : sourceFiles) {
// Note that here we track original modules:
Module module = chunk.findModuleBySourceFile(sourceFile);
@@ -188,7 +190,7 @@ public class KotlinToJVMBytecodeCompiler {
}
try {
- CompileEnvironmentUtil.OutputDirector outputDirector = CompileEnvironmentUtil.singleDirectory(outputDir);
+ OutputDirector outputDirector = outputDir != null ? new SingleDirectoryDirector(outputDir) : null;
writeOutput(environment.getConfiguration(), generationState.getFactory(), outputDirector, jar, includeRuntime, mainClass);
return true;
}
diff --git a/compiler/tests/org/jetbrains/jet/codegen/GenerateNotNullAssertionsTest.java b/compiler/tests/org/jetbrains/jet/codegen/GenerateNotNullAssertionsTest.java
index f2eeeaa40a5..49cd3f8afcb 100644
--- a/compiler/tests/org/jetbrains/jet/codegen/GenerateNotNullAssertionsTest.java
+++ b/compiler/tests/org/jetbrains/jet/codegen/GenerateNotNullAssertionsTest.java
@@ -26,8 +26,8 @@ import org.jetbrains.asm4.Opcodes;
import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind;
+import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys;
-import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
@@ -84,7 +84,7 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
loadFile("notNullAssertions/noAssertionsForKotlin.kt");
ClassFileFactory factory = generateClassesInFile();
File compiledDirectory = new File(FileUtil.getTempDirectory(), "kotlin-classes");
- CompileEnvironmentUtil.writeToOutputDirectory(factory, compiledDirectory);
+ OutputUtilsPackage.writeAllTo(factory, compiledDirectory);
setUpEnvironment(true, false, compiledDirectory);
loadFile("notNullAssertions/noAssertionsForKotlinMain.kt");
diff --git a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java
index dd1f59edd48..a9af70602e6 100644
--- a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java
+++ b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java
@@ -26,7 +26,7 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestCaseBuilder;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind;
-import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
+import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.JetFile;
@@ -70,7 +70,7 @@ public class LineNumberTest extends TestCaseWithTmpdir {
environment.getProject());
ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile);
- CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, tmpdir);
+ OutputUtilsPackage.writeAllTo(classFileFactory, tmpdir);
}
@NotNull
diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractCompileKotlinAgainstKotlinTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractCompileKotlinAgainstKotlinTest.java
index 583f86287e4..1b2b64cad46 100644
--- a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractCompileKotlinAgainstKotlinTest.java
+++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractCompileKotlinAgainstKotlinTest.java
@@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind;
-import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
+import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils;
@@ -93,7 +93,7 @@ public abstract class AbstractCompileKotlinAgainstKotlinTest extends TestCaseWit
ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile);
- CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, outputDir);
+ OutputUtilsPackage.writeAllTo(classFileFactory, outputDir);
Disposer.dispose(disposable);
}
diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractWriteSignatureTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractWriteSignatureTest.java
index fc318e65dfe..52bf3f95c2a 100644
--- a/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractWriteSignatureTest.java
+++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/AbstractWriteSignatureTest.java
@@ -27,7 +27,7 @@ import org.jetbrains.asm4.ClassVisitor;
import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Opcodes;
import org.jetbrains.jet.JetTestUtils;
-import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
+import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils;
@@ -72,7 +72,7 @@ public abstract class AbstractWriteSignatureTest extends TestCaseWithTmpdir {
ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile);
- CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, tmpdir);
+ OutputUtilsPackage.writeAllTo(classFileFactory, tmpdir);
Disposer.dispose(myTestRootDisposable);
diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadDescriptorUtil.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadDescriptorUtil.java
index 5249631ba3c..766deed08cc 100644
--- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadDescriptorUtil.java
+++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadDescriptorUtil.java
@@ -24,7 +24,6 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind;
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
-import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils;
@@ -39,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
+import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import java.io.File;
import java.io.IOException;
@@ -80,7 +80,7 @@ public final class LoadDescriptorUtil {
GenerationState state = GenerationUtils.compileFilesGetGenerationState(fileAndExhaust.getJetFile().getProject(), fileAndExhaust.getExhaust(), Collections.singletonList(
fileAndExhaust.getJetFile()));
ClassFileFactory classFileFactory = state.getFactory();
- CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, outDir);
+ OutputUtilsPackage.writeAllTo(classFileFactory, outDir);
return fileAndExhaust.getExhaust();
}