From e041e950c8d5f7eec614925b979b14860c74957a Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 1 Nov 2013 16:43:54 +0400 Subject: [PATCH] Extracted OutputDirector and output utils to common place --- .../CodegenTestsOnAndroidGenerator.java | 4 +- compiler/backend-common/backend-common.iml | 1 + .../src/{ => output}/OutputFileFactory.kt | 0 .../src/output/outputDirectors.kt | 27 ++++++++++ .../backend-common/src/output/outputUtils.kt | 38 ++++++++++++++ .../common/messages/OutputMessageUtil.java | 1 + .../jetbrains/jet/cli/common/outputUtils.kt | 31 +++++++++++ .../jvm/compiler/CompileEnvironmentUtil.java | 51 ++----------------- .../compiler/KotlinToJVMBytecodeCompiler.java | 10 ++-- .../GenerateNotNullAssertionsTest.java | 4 +- .../jetbrains/jet/codegen/LineNumberTest.java | 4 +- ...bstractCompileKotlinAgainstKotlinTest.java | 4 +- .../compiler/AbstractWriteSignatureTest.java | 4 +- .../jet/jvm/compiler/LoadDescriptorUtil.java | 4 +- 14 files changed, 121 insertions(+), 62 deletions(-) rename compiler/backend-common/src/{ => output}/OutputFileFactory.kt (100%) create mode 100644 compiler/backend-common/src/output/outputDirectors.kt create mode 100644 compiler/backend-common/src/output/outputUtils.kt create mode 100644 compiler/cli/src/org/jetbrains/jet/cli/common/outputUtils.kt 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 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(); }