Extracted OutputDirector and output utils to common place
This commit is contained in:
+1
@@ -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<File> sourceFiles, File outputFile) {
|
||||
return OUTPUT_FILES_PREFIX + "\n" + outputFile.getPath() + "\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 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<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
|
||||
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");
|
||||
|
||||
+6
-4
@@ -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<File> 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user