or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

call-types.mdcompletion-config.mdindex.mdrepl-compiler.mdresolution.mdutilities.md
tile.json

tessl/maven-org-jetbrains-kotlin--kotlin-scripting-ide-services

Kotlin Scripting Compiler extension providing code completion and static analysis for IDE integration

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
mavenpkg:maven/org.jetbrains.kotlin/kotlin-scripting-ide-services@2.2.x

To install, run

npx @tessl/cli install tessl/maven-org-jetbrains-kotlin--kotlin-scripting-ide-services@2.2.0

index.mddocs/

Kotlin Scripting IDE Services

Kotlin Scripting IDE Services is a compiler extension that provides intelligent code completion and static analysis capabilities for Kotlin scripting environments. It extends the Kotlin compiler with specialized functionality for interactive development environments, enabling features like intelligent code completion, static analysis, and error detection in Kotlin script files.

Package Information

  • Package Name: kotlin-scripting-ide-services
  • Package Type: Maven (Gradle)
  • Language: Kotlin
  • Installation: implementation("org.jetbrains.kotlin:kotlin-scripting-ide-services:2.2.0")

Core Imports

import org.jetbrains.kotlin.scripting.ide_services.compiler.KJvmReplCompilerWithIdeServices
import org.jetbrains.kotlin.scripting.ide_services.compiler.ReplCompletionOptionsBuilder
import org.jetbrains.kotlin.scripting.ide_services.compiler.filterOutShadowedDescriptors
import org.jetbrains.kotlin.scripting.ide_services.compiler.nameFilter
import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration

Basic Usage

import org.jetbrains.kotlin.scripting.ide_services.compiler.KJvmReplCompilerWithIdeServices
import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration

// Create a REPL compiler with IDE services
val compiler = KJvmReplCompilerWithIdeServices(defaultJvmScriptingHostConfiguration)

// Prepare script code and cursor position
val sourceCode = """
    val x = 10
    val y = 20
    x + y.
""".trimIndent()

val cursor = SourceCode.Position(2, 6) // After the dot

// Get code completions
val completionResult = compiler.complete(
    sourceCode.toScriptSource(),
    cursor,
    ScriptCompilationConfiguration()
)

// Analyze code for errors and type information
val analysisResult = compiler.analyze(
    sourceCode.toScriptSource(),
    cursor,
    ScriptCompilationConfiguration()
)

Architecture

Kotlin Scripting IDE Services is built around several key components:

  • Embeddable Package: The main package (scripting-ide-services-embeddable) that includes all dependencies for standalone use
  • Core IDE Services: Primary completion and analysis functionality (scripting-ide-services)
  • Common Utilities: Shared IDE utilities and resolution helpers (scripting-ide-common)
  • REPL Integration: Specialized compiler integration for REPL environments with stateless analysis
  • Resolution System: Kotlin compiler integration for symbol resolution and type inference

Capabilities

REPL Compiler with IDE Services

Main compiler class that provides both code completion and static analysis for Kotlin scripts in REPL environments. Supports embeddable usage and advanced completion configuration.

class KJvmReplCompilerWithIdeServices(
    hostConfiguration: ScriptingHostConfiguration = defaultJvmScriptingHostConfiguration
) : ReplCompleter, ReplCodeAnalyzer

interface ReplCompleter {
    suspend fun complete(
        snippet: SourceCode,
        cursor: SourceCode.Position,
        configuration: ScriptCompilationConfiguration
    ): ResultWithDiagnostics<ReplCompletionResult>
}

interface ReplCodeAnalyzer {
    suspend fun analyze(
        snippet: SourceCode,
        cursor: SourceCode.Position,
        configuration: ScriptCompilationConfiguration
    ): ResultWithDiagnostics<ReplAnalyzerResult>
}

REPL Compiler Services

Completion Configuration

Configuration system for customizing code completion behavior including shadowed descriptor filtering and name filtering options.

interface ReplCompletionOptionsKeys

open class ReplCompletionOptionsBuilder : PropertiesCollection.Builder(), ReplCompletionOptionsKeys

fun ReplCompletionOptionsBuilder.filterOutShadowedDescriptors(value: Boolean)
fun ReplCompletionOptionsBuilder.nameFilter(value: (String, String) -> Boolean)

val ReplCompletionOptionsKeys.filterOutShadowedDescriptors: Boolean
val ReplCompletionOptionsKeys.nameFilter: (String, String) -> Boolean

Completion Configuration

Resolution and Reference Services

Core resolution services providing symbol resolution, reference finding, and IDE-like analysis capabilities for Kotlin scripts.

interface ResolutionFacade {
    val project: Project
    val moduleDescriptor: ModuleDescriptor
    
    fun analyzeWithAllCompilerChecks(
        elements: Collection<KtElement>,
        callback: DiagnosticSink.DiagnosticsCallback? = null
    ): AnalysisResult
}

class ReferenceVariantsHelper(
    bindingContext: BindingContext,
    resolutionFacade: ResolutionFacade,
    moduleDescriptor: ModuleDescriptor,
    visibilityFilter: (DeclarationDescriptor) -> Boolean
) {
    fun getReferenceVariants(
        expression: KtSimpleNameExpression,
        kindFilter: DescriptorKindFilter,
        nameFilter: (Name) -> Boolean
    ): Collection<DeclarationDescriptor>
}

Resolution Services

Call Type Detection

Advanced call context analysis for determining the type of call being made and appropriate completion suggestions.

sealed class CallType<TReceiver : KtElement?>

sealed class CallTypeAndReceiver<TReceiver : KtElement?, out TCallType : CallType<TReceiver>> {
    companion object {
        fun detect(expression: KtSimpleNameExpression): CallTypeAndReceiver<*, *>
    }
}

data class ReceiverType(
    val type: KotlinType,
    val receiverIndex: Int,
    val implicitValue: ReceiverValue?
)

Call Type Detection

Utility Classes and Extensions

Various utility classes for filtering, type handling, and descriptor management in IDE contexts.

class ShadowedDeclarationsFilter(
    bindingContext: BindingContext,
    resolutionFacade: ResolutionFacade,
    context: PsiElement,
    explicitReceiverValue: ReceiverValue?
) {
    fun <TDescriptor : DeclarationDescriptor> filter(
        declarations: Collection<TDescriptor>
    ): Collection<TDescriptor>
}

class FuzzyType(
    type: KotlinType,
    freeParameters: Collection<TypeParameterDescriptor>
)

object IdeDescriptorRenderersScripting

Utilities

Types

Core Result Types

typealias ReplCompletionResult = Sequence<SourceCodeCompletionVariant>

class ReplAnalyzerResult(baseConfigurations: Iterable<ReplAnalyzerResult>, body: Builder.() -> Unit = {}) :
    PropertiesCollection(Builder(baseConfigurations).apply(body).data) {

    constructor(body: Builder.() -> Unit = {}) : this(emptyList(), body)

    class Builder internal constructor(baseConfigurations: Iterable<ReplAnalyzerResult>) :
        ReplAnalyzerResultKeys,
        PropertiesCollection.Builder(baseConfigurations)

    companion object : ReplAnalyzerResultKeys
}

interface ReplAnalyzerResultKeys

val ReplAnalyzerResultKeys.analysisDiagnostics: Sequence<ScriptDiagnostic>
val ReplAnalyzerResultKeys.renderedResultType: String?

data class SourceCodeCompletionVariant(
    val text: String,
    val displayText: String,
    val tail: String,
    val icon: String,
    val deprecationLevel: DeprecationLevel? = null
)

Analysis Results

data class AnalyzeWithCursorResult(
    val ktScript: KtFile,
    val bindingContext: BindingContext,
    val resolutionFacade: KotlinResolutionFacadeForRepl,
    val moduleDescriptor: ModuleDescriptor,
    val cursorAbs: Int,
    val resultProperty: PropertyDescriptor?
)

interface ReplLineAnalysisResultWithStateless {
    data class Stateless(
        val bindingContext: BindingContext,
        val resolutionFacade: KotlinResolutionFacadeForRepl,
        val moduleDescriptor: ModuleDescriptor,
        val resultProperty: PropertyDescriptor?
    ) : ReplLineAnalysisResultWithStateless
}

Configuration Types

interface PropertiesCollection {
    interface Key<T>
    
    abstract class Builder(baseConfigurations: Iterable<PropertiesCollection>) {
        protected val data: MutableMap<Key<*>, Any?>
        
        constructor() : this(emptyList())
        
        operator fun <T> set(key: Key<T>, value: T)
        operator fun <T> get(key: Key<T>): T?
    }
}

interface ScriptingHostConfiguration : PropertiesCollection
interface ScriptCompilationConfiguration : PropertiesCollection
interface SourceCode {
    val text: String
    val name: String?
    val locationId: String?
    
    data class Position(val line: Int, val col: Int)
}

interface ResultWithDiagnostics<out T> {
    val value: T?
    val diagnostics: List<ScriptDiagnostic>
}