Passing services via type-safe container instead of map.
This commit is contained in:
@@ -26,6 +26,7 @@ import org.jetbrains.jet.cli.js.K2JSCompiler
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import org.apache.tools.ant.BuildException
|
import org.apache.tools.ant.BuildException
|
||||||
import org.jetbrains.jet.cli.common.ExitCode
|
import org.jetbrains.jet.cli.common.ExitCode
|
||||||
|
import org.jetbrains.jet.config.CompilerServices
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kotlin JavaScript compiler Ant task.
|
* Kotlin JavaScript compiler Ant task.
|
||||||
@@ -89,7 +90,7 @@ public class Kotlin2JsCompilerTask : Task() {
|
|||||||
log("Compiling ${arguments.freeArgs} => [${arguments.outputFile}]");
|
log("Compiling ${arguments.freeArgs} => [${arguments.outputFile}]");
|
||||||
|
|
||||||
val compiler = K2JSCompiler()
|
val compiler = K2JSCompiler()
|
||||||
val exitCode = compiler.exec(MessageCollectorPlainTextToStream.PLAIN_TEXT_TO_SYSTEM_ERR, mapOf(), arguments)
|
val exitCode = compiler.exec(MessageCollectorPlainTextToStream.PLAIN_TEXT_TO_SYSTEM_ERR, CompilerServices.empty, arguments)
|
||||||
|
|
||||||
if (exitCode != ExitCode.OK) {
|
if (exitCode != ExitCode.OK) {
|
||||||
throw BuildException("Compilation finished with exit code $exitCode")
|
throw BuildException("Compilation finished with exit code $exitCode")
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.jetbrains.jet.cli.common.arguments.CommonCompilerArguments;
|
|||||||
import org.jetbrains.jet.cli.common.messages.*;
|
import org.jetbrains.jet.cli.common.messages.*;
|
||||||
import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentException;
|
import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentException;
|
||||||
import org.jetbrains.jet.config.CompilerConfiguration;
|
import org.jetbrains.jet.config.CompilerConfiguration;
|
||||||
|
import org.jetbrains.jet.config.CompilerServices;
|
||||||
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -50,12 +51,12 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public ExitCode exec(@NotNull PrintStream errStream, @NotNull String... args) {
|
public ExitCode exec(@NotNull PrintStream errStream, @NotNull String... args) {
|
||||||
return exec(errStream, Collections.<Class, Object>emptyMap(), MessageRenderer.PLAIN_WITH_RELATIVE_PATH, args);
|
return exec(errStream, new CompilerServices.Builder().build(), MessageRenderer.PLAIN_WITH_RELATIVE_PATH, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("UnusedDeclaration") // Used via reflection in CompilerRunnerUtil#invokeExecMethod
|
@SuppressWarnings("UnusedDeclaration") // Used via reflection in CompilerRunnerUtil#invokeExecMethod
|
||||||
@NotNull
|
@NotNull
|
||||||
public ExitCode execAndOutputHtml(@NotNull PrintStream errStream, @NotNull Map<Class, Object> services, @NotNull String... args) {
|
public ExitCode execAndOutputHtml(@NotNull PrintStream errStream, @NotNull CompilerServices services, @NotNull String... args) {
|
||||||
return exec(errStream, services, MessageRenderer.TAGS, args);
|
return exec(errStream, services, MessageRenderer.TAGS, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,7 +102,7 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private ExitCode exec(
|
private ExitCode exec(
|
||||||
@NotNull PrintStream errStream,
|
@NotNull PrintStream errStream,
|
||||||
@NotNull Map<Class, Object> services,
|
@NotNull CompilerServices services,
|
||||||
@NotNull MessageRenderer messageRenderer,
|
@NotNull MessageRenderer messageRenderer,
|
||||||
@NotNull String[] args
|
@NotNull String[] args
|
||||||
) {
|
) {
|
||||||
@@ -134,7 +135,7 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public ExitCode exec(@NotNull MessageCollector messageCollector, @NotNull Map<Class, Object> services, @NotNull A arguments) {
|
public ExitCode exec(@NotNull MessageCollector messageCollector, @NotNull CompilerServices services, @NotNull A arguments) {
|
||||||
GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector);
|
GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector);
|
||||||
try {
|
try {
|
||||||
Disposable rootDisposable = Disposer.newDisposable();
|
Disposable rootDisposable = Disposer.newDisposable();
|
||||||
@@ -160,7 +161,7 @@ public abstract class CLICompiler<A extends CommonCompilerArguments> {
|
|||||||
@NotNull
|
@NotNull
|
||||||
protected abstract ExitCode doExecute(
|
protected abstract ExitCode doExecute(
|
||||||
@NotNull A arguments,
|
@NotNull A arguments,
|
||||||
@NotNull Map<Class, Object> services,
|
@NotNull CompilerServices services,
|
||||||
@NotNull MessageCollector messageCollector,
|
@NotNull MessageCollector messageCollector,
|
||||||
@NotNull Disposable rootDisposable
|
@NotNull Disposable rootDisposable
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import org.jetbrains.jet.cli.common.output.outputUtils.OutputUtilsPackage;
|
|||||||
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
|
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
|
||||||
import org.jetbrains.jet.config.CommonConfigurationKeys;
|
import org.jetbrains.jet.config.CommonConfigurationKeys;
|
||||||
import org.jetbrains.jet.config.CompilerConfiguration;
|
import org.jetbrains.jet.config.CompilerConfiguration;
|
||||||
|
import org.jetbrains.jet.config.CompilerServices;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS;
|
import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS;
|
||||||
import org.jetbrains.k2js.config.*;
|
import org.jetbrains.k2js.config.*;
|
||||||
@@ -51,7 +52,6 @@ import org.jetbrains.k2js.facade.MainCallParameters;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.jetbrains.jet.cli.common.ExitCode.COMPILATION_ERROR;
|
import static org.jetbrains.jet.cli.common.ExitCode.COMPILATION_ERROR;
|
||||||
import static org.jetbrains.jet.cli.common.ExitCode.OK;
|
import static org.jetbrains.jet.cli.common.ExitCode.OK;
|
||||||
@@ -74,7 +74,7 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
|
|||||||
@Override
|
@Override
|
||||||
protected ExitCode doExecute(
|
protected ExitCode doExecute(
|
||||||
@NotNull K2JSCompilerArguments arguments,
|
@NotNull K2JSCompilerArguments arguments,
|
||||||
@NotNull Map<Class, Object> services,
|
@NotNull CompilerServices services,
|
||||||
@NotNull MessageCollector messageCollector,
|
@NotNull MessageCollector messageCollector,
|
||||||
@NotNull Disposable rootDisposable
|
@NotNull Disposable rootDisposable
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import org.jetbrains.jet.cli.jvm.repl.ReplFromTerminal;
|
|||||||
import org.jetbrains.jet.codegen.CompilationException;
|
import org.jetbrains.jet.codegen.CompilationException;
|
||||||
import org.jetbrains.jet.config.CommonConfigurationKeys;
|
import org.jetbrains.jet.config.CommonConfigurationKeys;
|
||||||
import org.jetbrains.jet.config.CompilerConfiguration;
|
import org.jetbrains.jet.config.CompilerConfiguration;
|
||||||
|
import org.jetbrains.jet.config.CompilerServices;
|
||||||
import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter;
|
import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter;
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.incremental.cache.IncrementalCacheProvider;
|
import org.jetbrains.jet.lang.resolve.kotlin.incremental.cache.IncrementalCacheProvider;
|
||||||
import org.jetbrains.jet.utils.KotlinPaths;
|
import org.jetbrains.jet.utils.KotlinPaths;
|
||||||
@@ -43,7 +44,6 @@ import org.jetbrains.jet.utils.PathUtil;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static com.google.common.base.Predicates.in;
|
import static com.google.common.base.Predicates.in;
|
||||||
import static org.jetbrains.jet.cli.common.ExitCode.*;
|
import static org.jetbrains.jet.cli.common.ExitCode.*;
|
||||||
@@ -59,7 +59,7 @@ public class K2JVMCompiler extends CLICompiler<K2JVMCompilerArguments> {
|
|||||||
@NotNull
|
@NotNull
|
||||||
protected ExitCode doExecute(
|
protected ExitCode doExecute(
|
||||||
@NotNull K2JVMCompilerArguments arguments,
|
@NotNull K2JVMCompilerArguments arguments,
|
||||||
@NotNull Map<Class, Object> services,
|
@NotNull CompilerServices services,
|
||||||
@NotNull MessageCollector messageCollector,
|
@NotNull MessageCollector messageCollector,
|
||||||
@NotNull Disposable rootDisposable
|
@NotNull Disposable rootDisposable
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -77,7 +77,8 @@ public class ClassPreloadingUtils {
|
|||||||
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
||||||
// When compiler is invoked from JPS, we should use loaded incremental cache interface from its class loader,
|
// When compiler is invoked from JPS, we should use loaded incremental cache interface from its class loader,
|
||||||
// because implementation is loaded from it, as well
|
// because implementation is loaded from it, as well
|
||||||
if (name.startsWith("org.jetbrains.jet.lang.resolve.kotlin.incremental.cache.")) {
|
if (name.startsWith("org.jetbrains.jet.lang.resolve.kotlin.incremental.cache.") ||
|
||||||
|
name.equals("org.jetbrains.jet.config.CompilerServices")) {
|
||||||
if (parent == null) {
|
if (parent == null) {
|
||||||
return super.loadClass(name);
|
return super.loadClass(name);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 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.config
|
||||||
|
|
||||||
|
import java.util.HashMap
|
||||||
|
|
||||||
|
public class CompilerServices private(private val map: Map<Class<*>, Any>) {
|
||||||
|
|
||||||
|
public fun <T> get(interfaceClass: Class<T>): T {
|
||||||
|
return map.get(interfaceClass) as T
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Builder {
|
||||||
|
private val map = HashMap<Class<*>, Any>()
|
||||||
|
|
||||||
|
public fun <T> register(interfaceClass: Class<T>, implementation: T): Builder {
|
||||||
|
map.put(interfaceClass, implementation)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun build(): CompilerServices {
|
||||||
|
return CompilerServices(map)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class object {
|
||||||
|
public val empty: CompilerServices
|
||||||
|
get() = Builder().build()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,12 +19,11 @@ package org.jetbrains.jet.compiler.runner;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
||||||
|
import org.jetbrains.jet.config.CompilerServices;
|
||||||
import org.jetbrains.jet.utils.KotlinPaths;
|
import org.jetbrains.jet.utils.KotlinPaths;
|
||||||
import org.jetbrains.jet.utils.PathUtil;
|
import org.jetbrains.jet.utils.PathUtil;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.jetbrains.jet.cli.common.messages.CompilerMessageLocation.NO_LOCATION;
|
import static org.jetbrains.jet.cli.common.messages.CompilerMessageLocation.NO_LOCATION;
|
||||||
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.ERROR;
|
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.ERROR;
|
||||||
@@ -35,15 +34,9 @@ public final class CompilerEnvironment {
|
|||||||
@NotNull KotlinPaths kotlinPaths,
|
@NotNull KotlinPaths kotlinPaths,
|
||||||
@Nullable File outputDir,
|
@Nullable File outputDir,
|
||||||
@Nullable ClassLoader parentClassLoader,
|
@Nullable ClassLoader parentClassLoader,
|
||||||
@NotNull Object... serviceImplementations
|
@NotNull CompilerServices compilerServices
|
||||||
) {
|
) {
|
||||||
Map<Class, Object> servicesMap = new HashMap<Class, Object>();
|
return new CompilerEnvironment(kotlinPaths, outputDir, parentClassLoader, compilerServices);
|
||||||
for (Object serviceImplementation : serviceImplementations) {
|
|
||||||
for (Class<?> serviceInterface : serviceImplementation.getClass().getInterfaces()) {
|
|
||||||
servicesMap.put(serviceInterface, serviceImplementation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new CompilerEnvironment(kotlinPaths, outputDir, parentClassLoader, servicesMap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -53,13 +46,13 @@ public final class CompilerEnvironment {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private final ClassLoader parentClassLoader;
|
private final ClassLoader parentClassLoader;
|
||||||
@NotNull
|
@NotNull
|
||||||
private final Map<Class, Object> services;
|
private final CompilerServices services;
|
||||||
|
|
||||||
private CompilerEnvironment(
|
private CompilerEnvironment(
|
||||||
@NotNull KotlinPaths kotlinPaths,
|
@NotNull KotlinPaths kotlinPaths,
|
||||||
@Nullable File output,
|
@Nullable File output,
|
||||||
@Nullable ClassLoader parentClassLoader,
|
@Nullable ClassLoader parentClassLoader,
|
||||||
@NotNull Map<Class, Object> services
|
@NotNull CompilerServices services
|
||||||
) {
|
) {
|
||||||
this.kotlinPaths = kotlinPaths;
|
this.kotlinPaths = kotlinPaths;
|
||||||
this.output = output;
|
this.output = output;
|
||||||
@@ -98,7 +91,7 @@ public final class CompilerEnvironment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Map<Class, Object> getServices() {
|
public CompilerServices getServices() {
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import com.intellij.util.Function;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
import org.jetbrains.jet.cli.common.messages.MessageCollector;
|
||||||
|
import org.jetbrains.jet.config.CompilerServices;
|
||||||
import org.jetbrains.jet.preloading.ClassPreloadingUtils;
|
import org.jetbrains.jet.preloading.ClassPreloadingUtils;
|
||||||
import org.jetbrains.jet.utils.KotlinPaths;
|
import org.jetbrains.jet.utils.KotlinPaths;
|
||||||
|
|
||||||
@@ -33,7 +34,6 @@ import java.net.URLClassLoader;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.jetbrains.jet.cli.common.messages.CompilerMessageLocation.NO_LOCATION;
|
import static org.jetbrains.jet.cli.common.messages.CompilerMessageLocation.NO_LOCATION;
|
||||||
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.ERROR;
|
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.ERROR;
|
||||||
@@ -123,7 +123,10 @@ public class CompilerRunnerUtil {
|
|||||||
: getOrCreateClassLoader(environment.getKotlinPaths(), messageCollector);
|
: getOrCreateClassLoader(environment.getKotlinPaths(), messageCollector);
|
||||||
|
|
||||||
Class<?> kompiler = Class.forName(compilerClassName, true, loader);
|
Class<?> kompiler = Class.forName(compilerClassName, true, loader);
|
||||||
Method exec = kompiler.getMethod("execAndOutputHtml", PrintStream.class, Map.class, String[].class);
|
Method exec = kompiler.getMethod(
|
||||||
|
"execAndOutputHtml",
|
||||||
|
PrintStream.class,
|
||||||
|
Class.forName("org.jetbrains.jet.config.CompilerServices", true, loader), String[].class);
|
||||||
|
|
||||||
return exec.invoke(kompiler.newInstance(), out, environment.getServices(), arguments);
|
return exec.invoke(kompiler.newInstance(), out, environment.getServices(), arguments);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,9 +37,11 @@ import org.jetbrains.jet.compiler.runner.CompilerEnvironment;
|
|||||||
import org.jetbrains.jet.compiler.runner.CompilerRunnerConstants;
|
import org.jetbrains.jet.compiler.runner.CompilerRunnerConstants;
|
||||||
import org.jetbrains.jet.compiler.runner.OutputItemsCollectorImpl;
|
import org.jetbrains.jet.compiler.runner.OutputItemsCollectorImpl;
|
||||||
import org.jetbrains.jet.compiler.runner.SimpleOutputItem;
|
import org.jetbrains.jet.compiler.runner.SimpleOutputItem;
|
||||||
|
import org.jetbrains.jet.config.CompilerServices;
|
||||||
import org.jetbrains.jet.config.IncrementalCompilation;
|
import org.jetbrains.jet.config.IncrementalCompilation;
|
||||||
import org.jetbrains.jet.jps.JpsKotlinCompilerSettings;
|
import org.jetbrains.jet.jps.JpsKotlinCompilerSettings;
|
||||||
import org.jetbrains.jet.jps.incremental.*;
|
import org.jetbrains.jet.jps.incremental.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.kotlin.incremental.cache.IncrementalCacheProvider;
|
||||||
import org.jetbrains.jet.utils.PathUtil;
|
import org.jetbrains.jet.utils.PathUtil;
|
||||||
import org.jetbrains.jps.ModuleChunk;
|
import org.jetbrains.jps.ModuleChunk;
|
||||||
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
import org.jetbrains.jps.builders.DirtyFilesHolder;
|
||||||
@@ -125,10 +127,12 @@ public class KotlinBuilder extends ModuleLevelBuilder {
|
|||||||
incrementalCaches.put(target, dataManager.getStorage(target, IncrementalCacheStorageProvider.INSTANCE$));
|
incrementalCaches.put(target, dataManager.getStorage(target, IncrementalCacheStorageProvider.INSTANCE$));
|
||||||
}
|
}
|
||||||
|
|
||||||
IncrementalCacheProviderImpl cacheProvider = new IncrementalCacheProviderImpl(incrementalCaches);
|
CompilerServices compilerServices = new CompilerServices.Builder()
|
||||||
|
.register(IncrementalCacheProvider.class, new IncrementalCacheProviderImpl(incrementalCaches))
|
||||||
|
.build();
|
||||||
|
|
||||||
CompilerEnvironment environment = CompilerEnvironment.getEnvironmentFor(
|
CompilerEnvironment environment = CompilerEnvironment.getEnvironmentFor(
|
||||||
PathUtil.getKotlinPathsForJpsPluginOrJpsTests(), outputDir, getClass().getClassLoader(), cacheProvider);
|
PathUtil.getKotlinPathsForJpsPluginOrJpsTests(), outputDir, getClass().getClassLoader(), compilerServices);
|
||||||
if (!environment.success()) {
|
if (!environment.success()) {
|
||||||
environment.reportErrorsTo(messageCollector);
|
environment.reportErrorsTo(messageCollector);
|
||||||
return ExitCode.ABORT;
|
return ExitCode.ABORT;
|
||||||
|
|||||||
Reference in New Issue
Block a user