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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $USER_HOME$/.subversion_IDEA
+ false
+
+
+
+
+ 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