Extract reusable functionality from K2JVMCompiler, K2JVMCompilerArguments, CompilerEnvironmentConfiguration.
This commit is contained in:
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 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;
|
||||||
|
|
||||||
|
import com.sampullara.cli.Args;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.cli.jvm.K2JVMCompilerArguments;
|
||||||
|
|
||||||
|
import java.io.PrintStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Pavel Talanov
|
||||||
|
*/
|
||||||
|
public final class ArgsUtil {
|
||||||
|
|
||||||
|
private ArgsUtil() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void printUsage(@NotNull PrintStream target, @NotNull CompilerArguments exampleInstance) {
|
||||||
|
// We should say something like
|
||||||
|
// Args.usage(target, K2JVMCompilerArguments.class);
|
||||||
|
// but currently cli-parser we are using does not support that
|
||||||
|
// a corresponding patch has been sent to the authors
|
||||||
|
// For now, we are using this:
|
||||||
|
PrintStream oldErr = System.err;
|
||||||
|
System.setErr(target);
|
||||||
|
try {
|
||||||
|
// TODO: use proper argv0
|
||||||
|
Args.usage(exampleInstance);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
System.setErr(oldErr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 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;
|
||||||
|
|
||||||
|
import com.sampullara.cli.Args;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.cli.common.messages.MessageRenderer;
|
||||||
|
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.jetbrains.jet.cli.common.ExitCode.INTERNAL_ERROR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Pavel Talanov
|
||||||
|
*/
|
||||||
|
public abstract class CLICompiler<CLArgs extends CompilerArguments, CEConf extends CompileEnvironmentConfig> {
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public ExitCode exec(@NotNull PrintStream errStream, @NotNull String... args) {
|
||||||
|
CLArgs arguments = createArguments();
|
||||||
|
if (!parseArguments(errStream, arguments, args)) {
|
||||||
|
return INTERNAL_ERROR;
|
||||||
|
}
|
||||||
|
return exec(errStream, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the arguments can be parsed correctly
|
||||||
|
*/
|
||||||
|
protected boolean parseArguments(@NotNull PrintStream errStream, @NotNull CLArgs arguments, @NotNull String[] args) {
|
||||||
|
try {
|
||||||
|
Args.parse(arguments, args);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (IllegalArgumentException e) {
|
||||||
|
usage(errStream);
|
||||||
|
}
|
||||||
|
catch (Throwable t) {
|
||||||
|
// Always use tags
|
||||||
|
errStream.println(MessageRenderer.TAGS.renderException(t));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow derived classes to add additional command line arguments
|
||||||
|
*/
|
||||||
|
protected void usage(@NotNull PrintStream target) {
|
||||||
|
ArgsUtil.printUsage(target, createArguments());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strategy method to configure the environment, allowing compiler
|
||||||
|
* based tools to customise their own plugins
|
||||||
|
*/
|
||||||
|
protected void configureEnvironment(@NotNull CEConf configuration, @NotNull CLArgs arguments) {
|
||||||
|
List<CompilerPlugin> plugins = arguments.getCompilerPlugins();
|
||||||
|
configuration.getCompilerPlugins().addAll(plugins);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
protected abstract CLArgs createArguments();
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public abstract ExitCode exec(final PrintStream errStream, CLArgs arguments);
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 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;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.intellij.openapi.util.Disposer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Pavel Talanov
|
||||||
|
*/
|
||||||
|
public abstract class CompileEnvironmentConfig {
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final MessageCollector messageCollector;
|
||||||
|
@NotNull
|
||||||
|
private List<CompilerPlugin> compilerPlugins = Lists.newArrayList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOTE: It's very important to call dispose for every object of this class or there will be memory leaks.
|
||||||
|
*
|
||||||
|
* @see Disposer
|
||||||
|
*/
|
||||||
|
public CompileEnvironmentConfig(@NotNull MessageCollector messageCollector) {
|
||||||
|
this.messageCollector = messageCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public MessageCollector getMessageCollector() {
|
||||||
|
return messageCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public List<CompilerPlugin> getCompilerPlugins() {
|
||||||
|
return compilerPlugins;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 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;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Pavel Talanov
|
||||||
|
*/
|
||||||
|
public abstract class CompilerArguments {
|
||||||
|
@NotNull
|
||||||
|
private List<CompilerPlugin> compilerPlugins = Lists.newArrayList();
|
||||||
|
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public List<CompilerPlugin> getCompilerPlugins() {
|
||||||
|
return compilerPlugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the compiler plugins to be used when working with the {@link org.jetbrains.jet.cli.CLICompiler}
|
||||||
|
*/
|
||||||
|
public void setCompilerPlugins(@NotNull List<CompilerPlugin> compilerPlugins) {
|
||||||
|
this.compilerPlugins = compilerPlugins;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,10 +16,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.cli.common;
|
package org.jetbrains.jet.cli.common;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple interface for compiler plugins to run after the compiler has finished such as for things like
|
* A simple interface for compiler plugins to run after the compiler has finished such as for things like
|
||||||
* generating documentation or code generation etc
|
* generating documentation or code generation etc
|
||||||
*/
|
*/
|
||||||
public interface CompilerPlugin {
|
public interface CompilerPlugin {
|
||||||
void processFiles(CompilerPluginContext context);
|
void processFiles(@NotNull CompilerPluginContext context);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.jet.cli.common;
|
package org.jetbrains.jet.cli.common;
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
|
|
||||||
@@ -27,8 +28,12 @@ import java.util.List;
|
|||||||
* the {@link Project}, the {@link BindingContext} and the underlying {@link JetFile} files.
|
* the {@link Project}, the {@link BindingContext} and the underlying {@link JetFile} files.
|
||||||
*/
|
*/
|
||||||
public class CompilerPluginContext {
|
public class CompilerPluginContext {
|
||||||
|
@NotNull
|
||||||
private final Project project;
|
private final Project project;
|
||||||
|
//TODO: should we in fact store AnalyzeExhaust here?
|
||||||
|
@NotNull
|
||||||
private final BindingContext context;
|
private final BindingContext context;
|
||||||
|
@NotNull
|
||||||
private final List<JetFile> files;
|
private final List<JetFile> files;
|
||||||
|
|
||||||
public CompilerPluginContext(Project project, BindingContext context, List<JetFile> files) {
|
public CompilerPluginContext(Project project, BindingContext context, List<JetFile> files) {
|
||||||
@@ -37,14 +42,17 @@ public class CompilerPluginContext {
|
|||||||
this.files = files;
|
this.files = files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
public BindingContext getContext() {
|
public BindingContext getContext() {
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
public List<JetFile> getFiles() {
|
public List<JetFile> getFiles() {
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
public Project getProject() {
|
public Project getProject() {
|
||||||
return project;
|
return project;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,15 +20,13 @@ import com.google.common.base.Splitter;
|
|||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.intellij.openapi.Disposable;
|
import com.intellij.openapi.Disposable;
|
||||||
import com.intellij.openapi.util.Disposer;
|
import com.intellij.openapi.util.Disposer;
|
||||||
import com.sampullara.cli.Args;
|
|
||||||
import jet.modules.Module;
|
import jet.modules.Module;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.cli.common.CompilerPlugin;
|
import org.jetbrains.jet.cli.common.CLICompiler;
|
||||||
import org.jetbrains.jet.cli.common.ExitCode;
|
import org.jetbrains.jet.cli.common.ExitCode;
|
||||||
import org.jetbrains.jet.cli.common.messages.PrintingMessageCollector;
|
|
||||||
import org.jetbrains.jet.codegen.CompilationException;
|
|
||||||
import org.jetbrains.jet.cli.jvm.compiler.*;
|
|
||||||
import org.jetbrains.jet.cli.common.messages.*;
|
import org.jetbrains.jet.cli.common.messages.*;
|
||||||
|
import org.jetbrains.jet.cli.jvm.compiler.*;
|
||||||
|
import org.jetbrains.jet.codegen.CompilationException;
|
||||||
import org.jetbrains.jet.lang.resolve.java.CompilerDependencies;
|
import org.jetbrains.jet.lang.resolve.java.CompilerDependencies;
|
||||||
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
|
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
|
||||||
import org.jetbrains.jet.utils.PathUtil;
|
import org.jetbrains.jet.utils.PathUtil;
|
||||||
@@ -44,7 +42,7 @@ import static org.jetbrains.jet.cli.common.ExitCode.*;
|
|||||||
* @author alex.tkachman
|
* @author alex.tkachman
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("UseOfSystemOutOrSystemErr")
|
@SuppressWarnings("UseOfSystemOutOrSystemErr")
|
||||||
public class K2JVMCompiler {
|
public class K2JVMCompiler extends CLICompiler<K2JVMCompilerArguments, CompileEnvironmentConfiguration> {
|
||||||
|
|
||||||
public static void main(String... args) {
|
public static void main(String... args) {
|
||||||
doMain(new K2JVMCompiler(), args);
|
doMain(new K2JVMCompiler(), args);
|
||||||
@@ -67,17 +65,12 @@ public class K2JVMCompiler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExitCode exec(PrintStream errStream, String... args) {
|
|
||||||
K2JVMCompilerArguments arguments = createArguments();
|
|
||||||
if (!parseArguments(errStream, arguments, args)) {
|
|
||||||
return INTERNAL_ERROR;
|
|
||||||
}
|
|
||||||
return exec(errStream, arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the compiler on the parsed arguments
|
* Executes the compiler on the parsed arguments
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
public ExitCode exec(final PrintStream errStream, K2JVMCompilerArguments arguments) {
|
public ExitCode exec(final PrintStream errStream, K2JVMCompilerArguments arguments) {
|
||||||
if (arguments.help) {
|
if (arguments.help) {
|
||||||
usage(errStream);
|
usage(errStream);
|
||||||
@@ -91,7 +84,9 @@ public class K2JVMCompiler {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (arguments.version) {
|
if (arguments.version) {
|
||||||
errStream.println(messageRenderer.render(CompilerMessageSeverity.INFO, "Kotlin Compiler version " + K2JVMCompilerVersion.VERSION, CompilerMessageLocation.NO_LOCATION));
|
errStream.println(messageRenderer
|
||||||
|
.render(CompilerMessageSeverity.INFO, "Kotlin Compiler version " + K2JVMCompilerVersion.VERSION,
|
||||||
|
CompilerMessageLocation.NO_LOCATION));
|
||||||
}
|
}
|
||||||
|
|
||||||
CompilerSpecialMode mode = parseCompilerSpecialMode(arguments);
|
CompilerSpecialMode mode = parseCompilerSpecialMode(arguments);
|
||||||
@@ -127,7 +122,8 @@ public class K2JVMCompiler {
|
|||||||
Disposable rootDisposable = CompileEnvironmentUtil.createMockDisposable();
|
Disposable rootDisposable = CompileEnvironmentUtil.createMockDisposable();
|
||||||
|
|
||||||
JetCoreEnvironment environment = new JetCoreEnvironment(rootDisposable, dependencies);
|
JetCoreEnvironment environment = new JetCoreEnvironment(rootDisposable, dependencies);
|
||||||
CompileEnvironmentConfiguration configuration = new CompileEnvironmentConfiguration(environment, dependencies, messageCollector);
|
CompileEnvironmentConfiguration configuration =
|
||||||
|
new CompileEnvironmentConfiguration(environment, dependencies, messageCollector);
|
||||||
|
|
||||||
messageCollector.report(CompilerMessageSeverity.LOGGING, "Configuring the compilation environment",
|
messageCollector.report(CompilerMessageSeverity.LOGGING, "Configuring the compilation environment",
|
||||||
CompilerMessageLocation.NO_LOCATION);
|
CompilerMessageLocation.NO_LOCATION);
|
||||||
@@ -136,7 +132,8 @@ public class K2JVMCompiler {
|
|||||||
|
|
||||||
boolean noErrors;
|
boolean noErrors;
|
||||||
if (arguments.module != null) {
|
if (arguments.module != null) {
|
||||||
List<Module> modules = CompileEnvironmentUtil.loadModuleScript(arguments.module, new PrintingMessageCollector(errStream, messageRenderer, false));
|
List<Module> modules = CompileEnvironmentUtil
|
||||||
|
.loadModuleScript(arguments.module, new PrintingMessageCollector(errStream, messageRenderer, false));
|
||||||
File directory = new File(arguments.module).getParentFile();
|
File directory = new File(arguments.module).getParentFile();
|
||||||
noErrors = KotlinToJVMBytecodeCompiler.compileModules(configuration, modules,
|
noErrors = KotlinToJVMBytecodeCompiler.compileModules(configuration, modules,
|
||||||
directory, arguments.jar, arguments.outputDir,
|
directory, arguments.jar, arguments.outputDir,
|
||||||
@@ -146,11 +143,14 @@ public class K2JVMCompiler {
|
|||||||
// TODO ideally we'd unify to just having a single field that supports multiple files/dirs
|
// TODO ideally we'd unify to just having a single field that supports multiple files/dirs
|
||||||
if (arguments.getSourceDirs() != null) {
|
if (arguments.getSourceDirs() != null) {
|
||||||
noErrors = KotlinToJVMBytecodeCompiler.compileBunchOfSourceDirectories(configuration,
|
noErrors = KotlinToJVMBytecodeCompiler.compileBunchOfSourceDirectories(configuration,
|
||||||
arguments.getSourceDirs(), arguments.jar, arguments.outputDir, arguments.includeRuntime);
|
arguments.getSourceDirs(), arguments.jar,
|
||||||
|
arguments.outputDir,
|
||||||
|
arguments.includeRuntime);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
noErrors = KotlinToJVMBytecodeCompiler.compileBunchOfSources(configuration,
|
noErrors = KotlinToJVMBytecodeCompiler.compileBunchOfSources(configuration,
|
||||||
arguments.src, arguments.jar, arguments.outputDir, arguments.includeRuntime);
|
arguments.src, arguments.jar, arguments.outputDir,
|
||||||
|
arguments.includeRuntime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return noErrors ? OK : COMPILATION_ERROR;
|
return noErrors ? OK : COMPILATION_ERROR;
|
||||||
@@ -161,7 +161,8 @@ public class K2JVMCompiler {
|
|||||||
return INTERNAL_ERROR;
|
return INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
catch (Throwable t) {
|
catch (Throwable t) {
|
||||||
messageCollector.report(CompilerMessageSeverity.EXCEPTION, MessageRenderer.PLAIN.renderException(t), CompilerMessageLocation.NO_LOCATION);
|
messageCollector.report(CompilerMessageSeverity.EXCEPTION, MessageRenderer.PLAIN.renderException(t),
|
||||||
|
CompilerMessageLocation.NO_LOCATION);
|
||||||
return INTERNAL_ERROR;
|
return INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
@@ -170,12 +171,12 @@ public class K2JVMCompiler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
errStream.print(messageRenderer.renderConclusion());
|
errStream.print(messageRenderer.renderConclusion());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private CompilerSpecialMode parseCompilerSpecialMode(@NotNull K2JVMCompilerArguments arguments) {
|
private static CompilerSpecialMode parseCompilerSpecialMode(@NotNull K2JVMCompilerArguments arguments) {
|
||||||
if (arguments.mode == null) {
|
if (arguments.mode == null) {
|
||||||
return CompilerSpecialMode.REGULAR;
|
return CompilerSpecialMode.REGULAR;
|
||||||
}
|
}
|
||||||
@@ -190,58 +191,21 @@ public class K2JVMCompiler {
|
|||||||
throw new IllegalArgumentException("unknown compiler mode: " + arguments.mode);
|
throw new IllegalArgumentException("unknown compiler mode: " + arguments.mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the arguments can be parsed correctly
|
|
||||||
*/
|
|
||||||
protected boolean parseArguments(PrintStream errStream, K2JVMCompilerArguments arguments, String[] args) {
|
|
||||||
try {
|
|
||||||
Args.parse(arguments, args);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (IllegalArgumentException e) {
|
|
||||||
usage(errStream);
|
|
||||||
}
|
|
||||||
catch (Throwable t) {
|
|
||||||
// Always use tags
|
|
||||||
errStream.println(MessageRenderer.TAGS.renderException(t));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void usage(PrintStream target) {
|
|
||||||
// We should say something like
|
|
||||||
// Args.usage(target, K2JVMCompilerArguments.class);
|
|
||||||
// but currently cli-parser we are using does not support that
|
|
||||||
// a corresponding patch has been sent to the authors
|
|
||||||
// For now, we are using this:
|
|
||||||
|
|
||||||
PrintStream oldErr = System.err;
|
|
||||||
System.setErr(target);
|
|
||||||
try {
|
|
||||||
// TODO: use proper argv0
|
|
||||||
Args.usage(new K2JVMCompilerArguments());
|
|
||||||
} finally {
|
|
||||||
System.setErr(oldErr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow derived classes to add additional command line arguments
|
* Allow derived classes to add additional command line arguments
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
protected K2JVMCompilerArguments createArguments() {
|
protected K2JVMCompilerArguments createArguments() {
|
||||||
return new K2JVMCompilerArguments();
|
return new K2JVMCompilerArguments();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Strategy method to configure the environment, allowing compiler
|
@Override
|
||||||
* based tools to customise their own plugins
|
protected void configureEnvironment(@NotNull CompileEnvironmentConfiguration configuration,
|
||||||
*/
|
@NotNull K2JVMCompilerArguments arguments) {
|
||||||
protected void configureEnvironment(CompileEnvironmentConfiguration configuration, K2JVMCompilerArguments arguments) {
|
super.configureEnvironment(configuration, arguments);
|
||||||
// install any compiler plugins
|
|
||||||
List<CompilerPlugin> plugins = arguments.getCompilerPlugins();
|
|
||||||
if (plugins != null) {
|
|
||||||
configuration.getCompilerPlugins().addAll(plugins);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configuration.getCompilerDependencies().getRuntimeJar() != null) {
|
if (configuration.getCompilerDependencies().getRuntimeJar() != null) {
|
||||||
CompileEnvironmentUtil.addToClasspath(configuration.getEnvironment(), configuration.getCompilerDependencies().getRuntimeJar());
|
CompileEnvironmentUtil.addToClasspath(configuration.getEnvironment(), configuration.getCompilerDependencies().getRuntimeJar());
|
||||||
|
|||||||
@@ -18,16 +18,15 @@
|
|||||||
package org.jetbrains.jet.cli.jvm;
|
package org.jetbrains.jet.cli.jvm;
|
||||||
|
|
||||||
import com.sampullara.cli.Argument;
|
import com.sampullara.cli.Argument;
|
||||||
import org.jetbrains.jet.cli.common.CompilerPlugin;
|
import org.jetbrains.jet.cli.common.CompilerArguments;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Command line arguments for the {@link K2JVMCompiler}
|
* Command line arguments for the {@link K2JVMCompiler}
|
||||||
*/
|
*/
|
||||||
public class K2JVMCompilerArguments {
|
public class K2JVMCompilerArguments extends CompilerArguments {
|
||||||
private List<CompilerPlugin> compilerPlugins = new ArrayList<CompilerPlugin>();
|
|
||||||
|
|
||||||
// TODO ideally we'd unify this with 'src' to just having a single field that supports multiple files/dirs
|
// TODO ideally we'd unify this with 'src' to just having a single field that supports multiple files/dirs
|
||||||
private List<String> sourceDirs;
|
private List<String> sourceDirs;
|
||||||
@@ -151,15 +150,4 @@ public class K2JVMCompilerArguments {
|
|||||||
public void setTags(boolean tags) {
|
public void setTags(boolean tags) {
|
||||||
this.tags = tags;
|
this.tags = tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<CompilerPlugin> getCompilerPlugins() {
|
|
||||||
return compilerPlugins;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the compiler plugins to be used when working with the {@link K2JVMCompiler}
|
|
||||||
*/
|
|
||||||
public void setCompilerPlugins(List<CompilerPlugin> compilerPlugins) {
|
|
||||||
this.compilerPlugins = compilerPlugins;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-19
@@ -16,32 +16,28 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.cli.jvm.compiler;
|
package org.jetbrains.jet.cli.jvm.compiler;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.intellij.openapi.util.Disposer;
|
import com.intellij.openapi.util.Disposer;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.cli.common.CompilerPlugin;
|
import org.jetbrains.jet.cli.common.CompileEnvironmentConfig;
|
||||||
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
||||||
import org.jetbrains.jet.lang.resolve.java.CompilerDependencies;
|
import org.jetbrains.jet.lang.resolve.java.CompilerDependencies;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class CompileEnvironmentConfiguration {
|
public class CompileEnvironmentConfiguration extends CompileEnvironmentConfig {
|
||||||
private final JetCoreEnvironment environment;
|
private final JetCoreEnvironment environment;
|
||||||
private final CompilerDependencies compilerDependencies;
|
private final CompilerDependencies compilerDependencies;
|
||||||
private final MessageCollector messageCollector;
|
|
||||||
|
|
||||||
private List<CompilerPlugin> compilerPlugins = Lists.newArrayList();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NOTE: It's very important to call dispose for every object of this class or there will be memory leaks.
|
* NOTE: It's very important to call dispose for every object of this class or there will be memory leaks.
|
||||||
|
*
|
||||||
* @see Disposer
|
* @see Disposer
|
||||||
*/
|
*/
|
||||||
public CompileEnvironmentConfiguration(@NotNull JetCoreEnvironment environment,
|
public CompileEnvironmentConfiguration(@NotNull JetCoreEnvironment environment,
|
||||||
@NotNull CompilerDependencies compilerDependencies, @NotNull MessageCollector messageCollector) {
|
@NotNull CompilerDependencies compilerDependencies,
|
||||||
this.messageCollector = messageCollector;
|
@NotNull MessageCollector messageCollector) {
|
||||||
|
super(messageCollector);
|
||||||
this.compilerDependencies = compilerDependencies;
|
this.compilerDependencies = compilerDependencies;
|
||||||
this.environment = environment;
|
this.environment = environment;
|
||||||
}
|
}
|
||||||
@@ -54,13 +50,4 @@ public class CompileEnvironmentConfiguration {
|
|||||||
public CompilerDependencies getCompilerDependencies() {
|
public CompilerDependencies getCompilerDependencies() {
|
||||||
return compilerDependencies;
|
return compilerDependencies;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public MessageCollector getMessageCollector() {
|
|
||||||
return messageCollector;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<CompilerPlugin> getCompilerPlugins() {
|
|
||||||
return compilerPlugins;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ fun main(args: Array<String?>): Unit {
|
|||||||
*/
|
*/
|
||||||
class KDocCompiler() : K2JVMCompiler() {
|
class KDocCompiler() : K2JVMCompiler() {
|
||||||
|
|
||||||
protected override fun configureEnvironment(configuration : CompileEnvironmentConfiguration?, arguments : K2JVMCompilerArguments?) {
|
protected override fun configureEnvironment(configuration : CompileEnvironmentConfiguration, arguments : K2JVMCompilerArguments) {
|
||||||
super.configureEnvironment(configuration, arguments)
|
super.configureEnvironment(configuration, arguments)
|
||||||
val coreEnvironment = configuration?.getEnvironment()
|
val coreEnvironment = configuration?.getEnvironment()
|
||||||
if (coreEnvironment != null) {
|
if (coreEnvironment != null) {
|
||||||
@@ -38,11 +38,11 @@ class KDocCompiler() : K2JVMCompiler() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override fun createArguments() : K2JVMCompilerArguments? {
|
protected override fun createArguments() : K2JVMCompilerArguments {
|
||||||
return KDocArguments()
|
return KDocArguments()
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override fun usage(target : PrintStream?) {
|
protected override fun usage(target : PrintStream) {
|
||||||
target?.println("Usage: KDocCompiler -docOutput <docOutputDir> [-output <outputDir>|-jar <jarFileName>] [-stdlib <path to runtime.jar>] [-src <filename or dirname>|-module <module file>] [-includeRuntime]");
|
target?.println("Usage: KDocCompiler -docOutput <docOutputDir> [-output <outputDir>|-jar <jarFileName>] [-stdlib <path to runtime.jar>] [-src <filename or dirname>|-module <module file>] [-includeRuntime]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-15
@@ -7,20 +7,18 @@ import org.jetbrains.jet.cli.common.CompilerPluginContext
|
|||||||
*/
|
*/
|
||||||
class HtmlCompilerPlugin: CompilerPlugin {
|
class HtmlCompilerPlugin: CompilerPlugin {
|
||||||
|
|
||||||
public override fun processFiles(context: CompilerPluginContext?) {
|
public override fun processFiles(context: CompilerPluginContext) {
|
||||||
if (context != null) {
|
val bindingContext = context.getContext()
|
||||||
val bindingContext = context.getContext()
|
val files = context.getFiles()
|
||||||
val files = context.getFiles()
|
if (bindingContext != null && files != null) {
|
||||||
if (bindingContext != null && files != null) {
|
if (files != null && bindingContext != null) {
|
||||||
if (files != null && bindingContext != null) {
|
for (file in files) {
|
||||||
for (file in files) {
|
if (file != null) {
|
||||||
if (file != null) {
|
val visitor = HtmlKotlinVisitor()
|
||||||
val visitor = HtmlKotlinVisitor()
|
file.accept(visitor)
|
||||||
file.accept(visitor)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+7
-9
@@ -10,16 +10,14 @@ abstract class KModelCompilerPlugin: CompilerPlugin {
|
|||||||
public open var config: KDocConfig = KDocConfig()
|
public open var config: KDocConfig = KDocConfig()
|
||||||
|
|
||||||
|
|
||||||
public override fun processFiles(context: CompilerPluginContext?) {
|
public override fun processFiles(context: CompilerPluginContext) {
|
||||||
if (context != null) {
|
val bindingContext = context.getContext()
|
||||||
val bindingContext = context.getContext()
|
val sources = context.getFiles()
|
||||||
val sources = context.getFiles()
|
if (bindingContext != null && sources != null) {
|
||||||
if (bindingContext != null && sources != null) {
|
val model = KModel(bindingContext, config)
|
||||||
val model = KModel(bindingContext, config)
|
model.load(sources)
|
||||||
model.load(sources)
|
|
||||||
|
|
||||||
processModel(model)
|
processModel(model)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+24
-24
@@ -28,6 +28,7 @@ import org.jetbrains.k2js.facade.K2JSTranslator;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.Override;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -38,32 +39,31 @@ import java.util.List;
|
|||||||
public class K2JSCompilerPlugin implements CompilerPlugin {
|
public class K2JSCompilerPlugin implements CompilerPlugin {
|
||||||
private String outFile = "target/js/program.js";
|
private String outFile = "target/js/program.js";
|
||||||
|
|
||||||
public void processFiles(CompilerPluginContext context) {
|
@Override
|
||||||
if (context != null) {
|
public void processFiles(@NotNull CompilerPluginContext context) {
|
||||||
Project project = context.getProject();
|
Project project = context.getProject();
|
||||||
BindingContext bindingContext = context.getContext();
|
BindingContext bindingContext = context.getContext();
|
||||||
List<JetFile> sources = context.getFiles();
|
List<JetFile> sources = context.getFiles();
|
||||||
|
|
||||||
if (bindingContext != null && sources != null && project != null) {
|
if (bindingContext != null && sources != null && project != null) {
|
||||||
Config config = new Config(project) {
|
Config config = new Config(project) {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
protected List<JetFile> generateLibFiles() {
|
protected List<JetFile> generateLibFiles() {
|
||||||
return new ArrayList<JetFile>();
|
return new ArrayList<JetFile>();
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
K2JSTranslator translator = new K2JSTranslator(config);
|
|
||||||
final String code = translator.generateProgramCode(sources);
|
|
||||||
|
|
||||||
File file = new File(outFile);
|
|
||||||
|
|
||||||
try {
|
|
||||||
Files.createParentDirs(file);
|
|
||||||
Files.write(code, file, Charset.forName("UTF-8"));
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
K2JSTranslator translator = new K2JSTranslator(config);
|
||||||
|
final String code = translator.generateProgramCode(sources);
|
||||||
|
|
||||||
|
File file = new File(outFile);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Files.createParentDirs(file);
|
||||||
|
Files.write(code, file, Charset.forName("UTF-8"));
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user