mirror of
https://github.com/JetBrains/intellij-sdk-code-samples.git
synced 2025-07-28 01:07:49 +08:00
* [webhelp] Fixes for TXP00152, TXP00002, test build 27 Jul 22:26 * [webhelp] Fixes for Part #4 TXP00010, EXCEPT decimal numbers in section titles * [webhelp] Fixes for Part #5 TXP00017 * [webhelp] Fixes for Part #4 TXP00010 - removed numbers from page section titles in "Custom Language Support Tutorial" and "Testing a Custom Language Plugin". * [webhelp] Removed numbers from page section titles in rest of project *.md files. * [new webhelp] Build #44 changes * [new webhelp] Maintenance merge from master * [new webhelp] Add placeholder file for webhelp import. * [webhelp] Correct redirects for file name changes * [webhelp] TOC not needed in webhelp * [format] {:toc} not needed for webhelp * add {:disable-links} to ensure demo links are not interpreted as real links. * Put all badges on the same line to simplify composition. * formatter.md: fix upsource link * fix some links * api_changes_list.md: remove note * migrate to webhelp - initial * fix GH edit URL * remove sdkdocs-template setup in VCS config * remove recently_updated.md * restore COC/CONTRIBUTING.md * api_changes_list.md: remove note * useful_links.md: IPE Co-authored-by: JohnHake <john.hake@jetbrains.com> Co-authored-by: Yann Cébron <yann.cebron@jetbrains.com>
165 lines
6.9 KiB
Markdown
165 lines
6.9 KiB
Markdown
[//]: # (title: Kotlin for Plugin Developers)
|
|
|
|
<!-- Copyright 2000-2020 JetBrains s.r.o. and other contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -->
|
|
|
|
## Why Kotlin?
|
|
|
|
Using Kotlin to write plugins for the IntelliJ Platform is very similar to writing plugins in Java.
|
|
Existing plugin developers can get started by converting boilerplate Java classes to their Kotlin equivalents by using the [J2K compiler](https://kotlinlang.org/docs/tutorials/mixing-java-kotlin-intellij.html#converting-an-existing-java-file-to-kotlin-with-j2k) bundled with the IntelliJ Platform (versions 143.+), and developers can easily mix and match Kotlin classes with their existing Java code.
|
|
|
|
In addition to [null safety](https://kotlinlang.org/docs/reference/null-safety.html) and [type-safe builders](https://kotlinlang.org/docs/reference/type-safe-builders.html), the Kotlin language offers many convenient features for plugin development, which make plugins easier to read and simpler to maintain.
|
|
Much like [Kotlin for Android](https://kotlinlang.org/docs/tutorials/kotlin-android.html), the IntelliJ Platform makes extensive use of callbacks, which are easy to express as [lambdas](https://kotlinlang.org/docs/reference/lambdas.html) in Kotlin.
|
|
|
|
Likewise, it is easy to customize the behavior of internal classes in IntelliJ IDEA, with [extensions](https://kotlinlang.org/docs/reference/extensions.html).
|
|
For example, it is common practice to [guard logging statements](https://www.slf4j.org/faq.html#logging_performance) to avoid the cost of parameter construction, leading to the following ceremony when using the log:
|
|
|
|
```java
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("...");
|
|
}
|
|
```
|
|
|
|
We can achieve the same result more succinctly in Kotlin, by declaring the following extension method:
|
|
|
|
```kotlin
|
|
inline fun Logger.debug(lazyMessage: () -> String) {
|
|
if (isDebugEnabled) {
|
|
debug(lazyMessage())
|
|
}
|
|
}
|
|
```
|
|
|
|
Now we can directly write `logger.debug { "..." }` to receive all the benefits of lightweight logging, with none of the verbosity.
|
|
With practice, you will be able to recognize many idioms in the IntelliJ Platform that can be simplified with Kotlin.
|
|
To learn more about building IntelliJ Platform plugins with Kotlin, this tutorial will help you get started.
|
|
|
|
## Adding Kotlin Support
|
|
|
|
> The [GitHub Template](github_template.md) provides a preconfigured project using Kotlin.
|
|
>
|
|
{type="tip"}
|
|
|
|
Plugins targeting the IntelliJ Platform versions 143 and above are easy to migrate: just start writing Kotlin.
|
|
The IDE already bundles the necessary Kotlin plugins and libraries, requiring no further configuration.
|
|
For detailed instructions, please refer to the [Kotlin documentation](https://kotlinlang.org/docs/tutorials/getting-started.html).
|
|
|
|
## Kotlin Gradle Plugin
|
|
|
|
For plugins already using the [Gradle Build System](gradle_build_system.md), or those that require precise control over the Kotlin build process, we recommend using the [kotlin-gradle-plugin](https://kotlinlang.org/docs/reference/using-gradle.html#configuring-dependencies).
|
|
This [Gradle plugin](https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-gradle-plugin-core) greatly simplifies building Kotlin projects in a controlled and reproducible manner.
|
|
|
|
Your `build.gradle` file may look like so:
|
|
|
|
```groovy
|
|
plugins {
|
|
id "java"
|
|
id "org.jetbrains.kotlin.jvm" version "1.4.10"
|
|
id "org.jetbrains.intellij" version "0.6.5"
|
|
}
|
|
|
|
apply plugin: "kotlin"
|
|
apply plugin: "org.jetbrains.intellij"
|
|
|
|
group "com.example"
|
|
version "0.0.1"
|
|
|
|
sourceCompatibility = 1.8
|
|
targetCompatibility = 1.8
|
|
|
|
compileKotlin {
|
|
kotlinOptions.jvmTarget = "1.8"
|
|
}
|
|
compileTestKotlin {
|
|
kotlinOptions.jvmTarget = "1.8"
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
dependencies {
|
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10")
|
|
}
|
|
|
|
intellij {
|
|
version = "2020.1"
|
|
pluginName = "Example"
|
|
updateSinceUntilBuild = false
|
|
}
|
|
```
|
|
|
|
### Use Kotlin to Write Gradle Script
|
|
|
|
Starting with 4.4, Gradle supports `build.gradle.kts`, an alternative to `build.gradle` written in Kotlin.
|
|
|
|
There are many good resources for learning how to write build scripts for an IntelliJ plugin with Kotlin script, like
|
|
[intellij-rust](https://github.com/intellij-rust/intellij-rust/blob/master/build.gradle.kts),
|
|
[julia-intellij](https://github.com/ice1000/julia-intellij/blob/master/build.gradle.kts),
|
|
[covscript-intellij](https://github.com/covscript/covscript-intellij/blob/master/build.gradle.kts) or
|
|
[zig-intellij](https://github.com/ice1000/zig-intellij/blob/master/build.gradle.kts).
|
|
|
|
`build.gradle.kts` basically looks like:
|
|
|
|
```kotlin
|
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
|
|
|
plugins {
|
|
id("java")
|
|
id("org.jetbrains.kotlin.jvm") version "1.4.10"
|
|
id("org.jetbrains.intellij") version "0.6.3"
|
|
}
|
|
|
|
group = "com.your.company.name"
|
|
version = "0.1-SNAPSHOT"
|
|
|
|
tasks.withType<JavaCompile> {
|
|
sourceCompatibility = "1.8"
|
|
targetCompatibility = "1.8"
|
|
}
|
|
listOf("compileKotlin", "compileTestKotlin").forEach {
|
|
tasks.getByName<KotlinCompile>(it) {
|
|
kotlinOptions.jvmTarget = "1.8"
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
dependencies {
|
|
implementation(kotlin("stdlib-jdk8"))
|
|
}
|
|
|
|
intellij {
|
|
version = "2020.1"
|
|
pluginName = 'Example'
|
|
updateSinceUntilBuild = false
|
|
}
|
|
```
|
|
|
|
## UI in Kotlin
|
|
|
|
The best way to create user interfaces with Kotlin is to use a [type safe DSL](kotlin_ui_dsl.md) for building forms.
|
|
Using a GUI designer with Kotlin is currently [not supported](https://youtrack.jetbrains.com/issue/KT-6660).
|
|
|
|
## Handling Kotlin Code
|
|
|
|
If a plugin processes Kotlin code (e.g., providing inspections), it needs to add a dependency on the Kotlin plugin (Plugin ID `org.jetbrains.kotlin`) itself.
|
|
Please refer to [Plugin Dependencies](plugin_dependencies.md) for more information.
|
|
|
|
## Caution
|
|
|
|
Plugins *must* use Kotlin classes to implement declarations in the [plugin configuration file](plugin_configuration_file.md).
|
|
When registering an extension, the platform uses a dependency injection framework to instantiate these classes.
|
|
For this reason, plugins *must not* use [Kotlin objects](https://kotlinlang.org/docs/reference/object-declarations.html) to implement any `plugin.xml` declarations.
|
|
|
|
## Examples
|
|
|
|
There are many [open-source Kotlin projects](https://github.com/search?l=Kotlin&q=+intellij&ref=searchresults&type=Repositories) built on the IntelliJ Platform.
|
|
For a readily available source of up to date examples and applications of the Kotlin language for building developer tools with the IntelliJ Platform, developers may look to these projects for inspiration:
|
|
|
|
* [IntelliJ-presentation-assistant](https://github.com/chashnikov/IntelliJ-presentation-assistant)
|
|
* [Rust](https://github.com/intellij-rust/intellij-rust)
|
|
* [HashiCorp Terraform / HCL language support](https://github.com/VladRassokhin/intellij-hcl)
|
|
* [TeXiFy IDEA](https://github.com/Hannah-Sten/TeXiFy-IDEA)
|
|
* [Makefile support](https://github.com/kropp/intellij-makefile) |