diff --git a/examples/src/guice-kotlin/guice-kotlin.iml b/examples/src/guice-kotlin/guice-kotlin.iml new file mode 100644 index 00000000000..252e4bdc816 --- /dev/null +++ b/examples/src/guice-kotlin/guice-kotlin.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/examples/src/guice-kotlin/guice-kotlin.ipr b/examples/src/guice-kotlin/guice-kotlin.ipr new file mode 100644 index 00000000000..d6fde5afd1a --- /dev/null +++ b/examples/src/guice-kotlin/guice-kotlin.ipr @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://www.w3.org/1999/xhtml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/src/guice-kotlin/guice-kotlin.iws b/examples/src/guice-kotlin/guice-kotlin.iws new file mode 100644 index 00000000000..7803ff96873 --- /dev/null +++ b/examples/src/guice-kotlin/guice-kotlin.iws @@ -0,0 +1,792 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + 1328297603532 + 1328297603532 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Detection + + + + + + + + + + + + + + + 1.6 + + + + + + + + guice-kotlin + + + + + + + + 1.6 + + + + + + + + com.google.inject:guice:3.0 + + + + + + + + + diff --git a/examples/src/guice-kotlin/lib/aopalliance-1.0-sources.jar b/examples/src/guice-kotlin/lib/aopalliance-1.0-sources.jar new file mode 100644 index 00000000000..07c51d09746 Binary files /dev/null and b/examples/src/guice-kotlin/lib/aopalliance-1.0-sources.jar differ diff --git a/examples/src/guice-kotlin/lib/aopalliance-1.0.jar b/examples/src/guice-kotlin/lib/aopalliance-1.0.jar new file mode 100644 index 00000000000..578b1a0c359 Binary files /dev/null and b/examples/src/guice-kotlin/lib/aopalliance-1.0.jar differ diff --git a/examples/src/guice-kotlin/lib/guice-3.0-sources.jar b/examples/src/guice-kotlin/lib/guice-3.0-sources.jar new file mode 100644 index 00000000000..e24db11b88b Binary files /dev/null and b/examples/src/guice-kotlin/lib/guice-3.0-sources.jar differ diff --git a/examples/src/guice-kotlin/lib/guice-3.0.jar b/examples/src/guice-kotlin/lib/guice-3.0.jar new file mode 100644 index 00000000000..f313e2b089d Binary files /dev/null and b/examples/src/guice-kotlin/lib/guice-3.0.jar differ diff --git a/examples/src/guice-kotlin/lib/javax.inject-1-sources.jar b/examples/src/guice-kotlin/lib/javax.inject-1-sources.jar new file mode 100644 index 00000000000..0c980535ddf Binary files /dev/null and b/examples/src/guice-kotlin/lib/javax.inject-1-sources.jar differ diff --git a/examples/src/guice-kotlin/lib/javax.inject-1.jar b/examples/src/guice-kotlin/lib/javax.inject-1.jar new file mode 100644 index 00000000000..b2a9d0bf7bd Binary files /dev/null and b/examples/src/guice-kotlin/lib/javax.inject-1.jar differ diff --git a/examples/src/guice-kotlin/src/GuiceDsl.kt b/examples/src/guice-kotlin/src/GuiceDsl.kt new file mode 100644 index 00000000000..1e285e275c3 --- /dev/null +++ b/examples/src/guice-kotlin/src/GuiceDsl.kt @@ -0,0 +1,50 @@ +package org.jetbrains.kotlin.examples.guice + +import com.google.inject.* +import com.google.inject.binder.* +import java.util.logging.Logger +import java.util.ArrayList + +class GuiceInjectorBuilder() { + private val collected = ArrayList () + + fun module (config: Binder.()->Any?) : Module = object: Module { + override fun configure(binder: Binder?) { + binder.sure().config() + } + } + + fun Module.plus() { + collected.add(this) + } + + class object { + fun injector(config: GuiceInjectorBuilder.() -> Any?) : Injector { + val collector = GuiceInjectorBuilder() + collector.config() + return Guice.createInjector(collector.collected).sure() + } + } +} + +inline fun Binder.bind() = bind(javaClass()).sure() + +inline fun ScopedBindingBuilder.asSingleton() = `in`(javaClass()) + +inline fun AnnotatedBindingBuilder.to() = to(javaClass()).sure() + +inline fun AnnotatedBindingBuilder.toSingleton() = to(javaClass()).sure().asSingleton() + +inline fun Injector.getInstance() = getInstance(javaClass()).sure() + +inline fun Injector.getProvider() = getProvider(javaClass()).sure() + +inline fun > LinkedBindingBuilder.toProvider() = toProvider(javaClass()) + +fun AnnotatedBindingBuilder.toProvider(provider: Injector.()->T) = toProvider(object: Provider { + [Inject] val injector : Injector? = null + + override fun get(): T = injector.sure().provider() +}).sure() + +fun AnnotatedBindingBuilder.toSingletonProvider(provider: Injector.()->T) = toProvider(provider).asSingleton() diff --git a/examples/src/guice-kotlin/src/GuiceExample.kt b/examples/src/guice-kotlin/src/GuiceExample.kt new file mode 100644 index 00000000000..90307c1d4df --- /dev/null +++ b/examples/src/guice-kotlin/src/GuiceExample.kt @@ -0,0 +1,57 @@ +package org.jetbrains.kotlin.examples.guice + +import java.util.logging.Logger +import java.util.ArrayList + +import com.google.inject.* +import com.google.inject.binder.* + +abstract class LoggingService() { + abstract fun info(message: String) +} + +class StdoutLoggingService() : LoggingService(){ + override fun info(message: String) = println("INFO: $message") +} + +class JdkLoggingService () : LoggingService() { + protected [Inject] var jdkLogger: Logger? = null + + override fun info(message: String) = jdkLogger.sure().info(message) +} + +abstract class AppService(protected val mode: String) { + protected abstract val logger: LoggingService + + fun run() { + logger.info("Application started in '$mode' mode with ${logger.javaClass.getName()} logger") + logger.info("Hello, World!") + } +} + +class RealAppService [Inject] (override val logger: LoggingService) : AppService("real") + +class TestAppService (private val loggerProvider : Provider) : AppService("test") { + protected override val logger: LoggingService + get() = loggerProvider.get() +} + +fun main(args: Array) { + fun configureInjections(test: Boolean) = GuiceInjectorBuilder.injector { + +module { + if(test) { + bind().toInstance(StdoutLoggingService()) + bind().toSingletonProvider{ // Injector as receiver for ext.function + TestAppService(getProvider()) + } + } + else { + bind().to().asSingleton() + bind().toSingleton() + } + } + } + + configureInjections(test = false).getInstance().run() + configureInjections(test = true ).getInstance().run() +} \ No newline at end of file