Extracted OutputDirector and output utils to common place

This commit is contained in:
Zalim Bashorov
2013-11-01 16:43:54 +04:00
parent 5dd4eb780e
commit e041e950c8
14 changed files with 121 additions and 62 deletions
@@ -23,7 +23,7 @@ import com.intellij.testFramework.UsefulTestCase;
import junit.framework.Assert; import junit.framework.Assert;
import org.jetbrains.jet.ConfigurationKind; import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils; 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.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils; 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()); Assert.assertTrue("Cannot create directory for compiled files", outputDir.exists());
CompileEnvironmentUtil.writeToOutputDirectory(factory, outputDir); OutputUtilsPackage.writeAllTo(factory, outputDir);
} }
} }
} }
@@ -8,6 +8,7 @@
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="kotlin-runtime" level="project" /> <orderEntry type="library" name="kotlin-runtime" level="project" />
<orderEntry type="library" name="intellij-core" level="project" />
</component> </component>
</module> </module>
@@ -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>): File
}
public class SingleDirectoryDirector(private val dir: File): OutputDirector {
override public fun getOutputDirectory(sourceFiles : Collection<File>) : File = dir
}
@@ -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<File>, 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<File>, output: File) -> }
public inline fun OutputFileFactory.writeAllTo(outputDir: File) {
writeAll(SingleDirectoryDirector(outputDir), REPORT_NOTHING)
}
@@ -28,6 +28,7 @@ public class OutputMessageUtil {
private static final String SOURCE_FILES_PREFIX = "Sources:"; private static final String SOURCE_FILES_PREFIX = "Sources:";
private static final String OUTPUT_FILES_PREFIX = "Output:"; private static final String OUTPUT_FILES_PREFIX = "Output:";
@NotNull
public static String formatOutputMessage(Collection<File> sourceFiles, File outputFile) { public static String formatOutputMessage(Collection<File> sourceFiles, File outputFile) {
return OUTPUT_FILES_PREFIX + "\n" + outputFile.getPath() + "\n" + return OUTPUT_FILES_PREFIX + "\n" + outputFile.getPath() + "\n" +
SOURCE_FILES_PREFIX + "\n" + StringUtil.join(sourceFiles, "\n"); SOURCE_FILES_PREFIX + "\n" + StringUtil.join(sourceFiles, "\n");
@@ -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)
}
}
@@ -26,11 +26,13 @@ import jet.modules.AllModules;
import jet.modules.Module; import jet.modules.Module;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.OutputFileFactory;
import org.jetbrains.jet.cli.common.CLIConfigurationKeys; 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.ModuleDescription;
import org.jetbrains.jet.cli.common.modules.ModuleXmlParser; 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.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GeneratedClassLoader; import org.jetbrains.jet.codegen.GeneratedClassLoader;
@@ -49,7 +51,6 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.jar.*; import java.util.jar.*;
@@ -236,48 +237,6 @@ public class CompileEnvironmentUtil {
} }
} }
public interface OutputDirector {
@NotNull
File getOutputDirectory(@NotNull Collection<File> sourceFiles);
}
public static OutputDirector singleDirectory(@Nullable final File file) {
if (file == null) return null;
return new OutputDirector() {
@NotNull
@Override
public File getOutputDirectory(@NotNull Collection<File> sourceFiles) {
return file;
}
};
}
public static void writeToOutputWithDirector(
OutputFileFactory factory,
@NotNull OutputDirector outputDirector,
@NotNull MessageCollector messageCollector
) {
List<String> files = factory.getOutputFiles();
for (String file : files) {
List<File> 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 // Used for debug output only
private static String loadModuleScriptText(String moduleScriptFile) { private static String loadModuleScriptText(String moduleScriptFile) {
String moduleScriptText; String moduleScriptText;
@@ -302,7 +261,7 @@ public class CompileEnvironmentUtil {
writeToJar(jar, includeRuntime, mainClass, factory); writeToJar(jar, includeRuntime, mainClass, factory);
} }
else if (outputDir != null) { else if (outputDir != null) {
writeToOutputWithDirector(factory, outputDir, messageCollector); OutputUtilsPackage.writeAll(factory, outputDir, messageCollector);
} }
else { else {
throw new CompileEnvironmentException("Output directory or jar file is not specified - no files will be saved to the disk"); throw new CompileEnvironmentException("Output directory or jar file is not specified - no files will be saved to the disk");
@@ -32,6 +32,8 @@ import org.jetbrains.jet.cli.common.CompilerPlugin;
import org.jetbrains.jet.cli.common.CompilerPluginContext; import org.jetbrains.jet.cli.common.CompilerPluginContext;
import org.jetbrains.jet.cli.common.messages.AnalyzerWithCompilerReport; import org.jetbrains.jet.cli.common.messages.AnalyzerWithCompilerReport;
import org.jetbrains.jet.cli.common.messages.MessageCollector; 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.cli.jvm.JVMConfigurationKeys;
import org.jetbrains.jet.codegen.*; import org.jetbrains.jet.codegen.*;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
@@ -112,7 +114,7 @@ public class KotlinToJVMBytecodeCompiler {
private static void writeOutput( private static void writeOutput(
CompilerConfiguration configuration, CompilerConfiguration configuration,
ClassFileFactory moduleFactory, ClassFileFactory moduleFactory,
CompileEnvironmentUtil.OutputDirector outputDir, OutputDirector outputDir,
File jarPath, File jarPath,
boolean jarRuntime, boolean jarRuntime,
FqName mainClass FqName mainClass
@@ -137,10 +139,10 @@ public class KotlinToJVMBytecodeCompiler {
if (moduleFactory == null) { if (moduleFactory == null) {
return false; return false;
} }
CompileEnvironmentUtil.OutputDirector outputDir = new CompileEnvironmentUtil.OutputDirector() { OutputDirector outputDir = new OutputDirector() {
@NotNull @NotNull
@Override @Override
public File getOutputDirectory(@NotNull Collection<File> sourceFiles) { public File getOutputDirectory(@NotNull Collection<? extends File> sourceFiles) {
for (File sourceFile : sourceFiles) { for (File sourceFile : sourceFiles) {
// Note that here we track original modules: // Note that here we track original modules:
Module module = chunk.findModuleBySourceFile(sourceFile); Module module = chunk.findModuleBySourceFile(sourceFile);
@@ -188,7 +190,7 @@ public class KotlinToJVMBytecodeCompiler {
} }
try { try {
CompileEnvironmentUtil.OutputDirector outputDirector = CompileEnvironmentUtil.singleDirectory(outputDir); OutputDirector outputDirector = outputDir != null ? new SingleDirectoryDirector(outputDir) : null;
writeOutput(environment.getConfiguration(), generationState.getFactory(), outputDirector, jar, includeRuntime, mainClass); writeOutput(environment.getConfiguration(), generationState.getFactory(), outputDirector, jar, includeRuntime, mainClass);
return true; return true;
} }
@@ -26,8 +26,8 @@ import org.jetbrains.asm4.Opcodes;
import org.jetbrains.jet.ConfigurationKind; import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind; import org.jetbrains.jet.TestJdkKind;
import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys; 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.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmClassName;
@@ -84,7 +84,7 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
loadFile("notNullAssertions/noAssertionsForKotlin.kt"); loadFile("notNullAssertions/noAssertionsForKotlin.kt");
ClassFileFactory factory = generateClassesInFile(); ClassFileFactory factory = generateClassesInFile();
File compiledDirectory = new File(FileUtil.getTempDirectory(), "kotlin-classes"); File compiledDirectory = new File(FileUtil.getTempDirectory(), "kotlin-classes");
CompileEnvironmentUtil.writeToOutputDirectory(factory, compiledDirectory); OutputUtilsPackage.writeAllTo(factory, compiledDirectory);
setUpEnvironment(true, false, compiledDirectory); setUpEnvironment(true, false, compiledDirectory);
loadFile("notNullAssertions/noAssertionsForKotlinMain.kt"); loadFile("notNullAssertions/noAssertionsForKotlinMain.kt");
@@ -26,7 +26,7 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestCaseBuilder; import org.jetbrains.jet.JetTestCaseBuilder;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind; 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.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
@@ -70,7 +70,7 @@ public class LineNumberTest extends TestCaseWithTmpdir {
environment.getProject()); environment.getProject());
ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile); ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile);
CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, tmpdir); OutputUtilsPackage.writeAllTo(classFileFactory, tmpdir);
} }
@NotNull @NotNull
@@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.ConfigurationKind; import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind; 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.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils; import org.jetbrains.jet.codegen.GenerationUtils;
@@ -93,7 +93,7 @@ public abstract class AbstractCompileKotlinAgainstKotlinTest extends TestCaseWit
ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile); ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile);
CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, outputDir); OutputUtilsPackage.writeAllTo(classFileFactory, outputDir);
Disposer.dispose(disposable); Disposer.dispose(disposable);
} }
@@ -27,7 +27,7 @@ import org.jetbrains.asm4.ClassVisitor;
import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Opcodes; import org.jetbrains.asm4.Opcodes;
import org.jetbrains.jet.JetTestUtils; 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.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils; import org.jetbrains.jet.codegen.GenerationUtils;
@@ -72,7 +72,7 @@ public abstract class AbstractWriteSignatureTest extends TestCaseWithTmpdir {
ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile); ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile);
CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, tmpdir); OutputUtilsPackage.writeAllTo(classFileFactory, tmpdir);
Disposer.dispose(myTestRootDisposable); Disposer.dispose(myTestRootDisposable);
@@ -24,7 +24,6 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind; import org.jetbrains.jet.TestJdkKind;
import org.jetbrains.jet.analyzer.AnalyzeExhaust; 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.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationUtils; 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.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.outputUtils.OutputUtilsPackage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -80,7 +80,7 @@ public final class LoadDescriptorUtil {
GenerationState state = GenerationUtils.compileFilesGetGenerationState(fileAndExhaust.getJetFile().getProject(), fileAndExhaust.getExhaust(), Collections.singletonList( GenerationState state = GenerationUtils.compileFilesGetGenerationState(fileAndExhaust.getJetFile().getProject(), fileAndExhaust.getExhaust(), Collections.singletonList(
fileAndExhaust.getJetFile())); fileAndExhaust.getJetFile()));
ClassFileFactory classFileFactory = state.getFactory(); ClassFileFactory classFileFactory = state.getFactory();
CompileEnvironmentUtil.writeToOutputDirectory(classFileFactory, outDir); OutputUtilsPackage.writeAllTo(classFileFactory, outDir);
return fileAndExhaust.getExhaust(); return fileAndExhaust.getExhaust();
} }