| # Analysis API – Platform Interface | |
| The **platform interface** is an interface which Standalone, IntelliJ, and any additional platforms need to implement for the Analysis API | |
| to work in their respective environment. | |
| Note: The platform interface has not been stabilized together with the user-facing Analysis API surface. In fact, since both platform | |
| implementations are currently maintained by JetBrains, we will keep the platform interface in an experimental state for a while. Ultimately, | |
| it is our goal to stabilize the platform interface as well so that third-party developers can support their own environments. | |
| ## Definitions | |
| - **Environment** – A setting in which the Analysis API is used, such as an IDE or a CLI environment. | |
| - **Platform** – A set of component implementations required for analysis to be performed in a specific environment. | |
| - **Engine** – An implementation of the Analysis API performing code analysis, relying on the information provided by the platform. | |
| - **Platform Interface** – A specification of abstract components which need to be implemented by a concrete platform, as well as engine | |
| services which can be used by the platform implementation. The platform interface is used by the engine to retrieve declarations and | |
| project structure, react to code modifications, etc., to perform code analysis in accordance with the idiosyncrasies of the environment. | |
| - **User** – A person or software which analyzes source code using the API available via the `analysis-api` module. A user typically invokes | |
| the [`analyze`](../analysis-api/src/org/jetbrains/kotlin/analysis/api/analyze.kt) entry point to work with symbols, types, calls, and | |
| other concepts. We explicitly differentiate users and platforms, especially in the context of *user-facing* vs. *platform* APIs. The | |
| platform interface is normally hidden from users, as they should not need to access nor be aware of the inner workings of the Analysis | |
| API. | |
| ## Platform | |
| From the view of the Analysis API, a platform has the following responsibilities: | |
| - Provide declarations, packages, direct inheritors, and other information about the code from an appropriate source, such as an index. | |
| - Provide the project structure in the form of [`KaModule`s](../analysis-api/src/org/jetbrains/kotlin/analysis/api/projectStructure/KaModule.kt) | |
| and related concepts. | |
| - Monitor modifications to project files and binary roots, and publish modification events so that the Analysis API engine can invalidate | |
| its caches. | |
| - Define symbol lifetime with a specific implementation for [`KaLifetimeToken`s](../analysis-api/src/org/jetbrains/kotlin/analysis/api/lifetime/KaLifetimeToken.kt). | |
| Even if modifications are not possible, the platform must provide a notion of “static” lifetime. | |
| A specific platform may have additional features, such as providing a DSL for project structure creation to users like Standalone, but this | |
| is up to the platform. | |
| Additional responsibilities may be added in the future as the Analysis API (and especially LL FIR) evolves. Platforms need to be evolved | |
| with the rest of the Analysis API. | |
| ### Combining platform implementation and usage | |
| Some platforms like the IntelliJ Kotlin plugin are both an Analysis API user and a platform implementation. This is perfectly legal, but | |
| care should be taken to properly separate modules which use the Analysis API and modules which additionally provide implementations for | |
| platform components. | |
| ### Information about the code | |
| Platforms need to provide information about project and library content to the Analysis API engine, because the Analysis API itself has no | |
| direct way of knowing the content of all source files, and neither does it include an out-of-the-box indexing solution. | |
| For example, if we're analyzing a class, and it references another class `org.example.Foo`, the Analysis API will need to look up the | |
| declaration of `org.example.Foo`. It is the responsibility of the platform to implement a | |
| [`KotlinDeclarationProvider`](src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinDeclarationProvider.kt) which returns a PSI | |
| declaration for that class, in any way which works for the platform. | |
| ### Modification and Lifetime | |
| Platforms are responsible for modification and lifetime because they control the location and content of their projects. It is not an | |
| Analysis API user's responsibility to define lifetime when they have no control over the content from inside an | |
| [`analyze`](../analysis-api/src/org/jetbrains/kotlin/analysis/api/analyze.kt) block. | |
| Of course, when a platform implementation is also a user, the lines get blurred again. However, even if, for example, an IDE intention | |
| modifies the code, the code modification itself should still be published as a modification event via the platform interface, and hence the | |
| IDE acts in its capacity as a platform. Inside an `analyze` block where content should be read-only, the IDE is purely an Analysis API user | |
| and exerts no control over modification. | |
| ### Current Platforms | |
| The IntelliJ Kotlin plugin and the Standalone Analysis API are the two currently existing platforms, both maintained by JetBrains. There are | |
| no plans to support additional platforms, but third-party developers are welcome to incorporate the Analysis API into their own | |
| environments. | |
| ## Platform Interface | |
| The platform interface is defined in this module, `analysis-api-platform-interface`. It consists of two parts: | |
| - **Platform components:** Interfaces which need to be implemented by the concrete platform, as they are required by the Analysis API | |
| implementation to perform analysis. | |
| - **Engine services**: Functionality provided by an Analysis API engine to support platform implementations. These services do not need to | |
| be implemented by the platform, but can rather be used as needed. | |
| Platform components and engine services may occur in the same packages, but they can be distinguished by their prefixes: Platform components | |
| use the `Kotlin` prefix (e.g. [`KotlinDeclarationProvider`](src/org/jetbrains/kotlin/analysis/api/platform/declarations/KotlinDeclarationProvider.kt)), | |
| while engine services use the `Ka` prefix (e.g. [`KaLifetimeTracker`](src/org/jetbrains/kotlin/analysis/api/platform/lifetime/KaLifetimeTracker.kt)). | |
| To ease discovery, platform components extend the [`KotlinPlatformComponent`](src/org/jetbrains/kotlin/analysis/api/platform/KotlinPlatformComponent.kt) | |
| marker interface, while engine services extend [`KaEngineService`](src/org/jetbrains/kotlin/analysis/api/platform/KaEngineService.kt). This | |
| makes it easy to identify which components needs to be implemented, i.e. all `KotlinPlatformComponent`s (with an exception for optional | |
| platform components, marked with `KotlinOptionalPlatformComponent`). | |
| In addition to these abstract interfaces, the platform interface also contains additional abstract concepts which aren't strictly platform | |
| components (e.g. `KotlinDeclarationProvider`), as well as base implementations for a few platform components. All these declarations are | |
| usually placed in the same package as the related platform component. | |
| ### Structure | |
| The platform interface has the following important subpackages: | |
| - `declarations`: Platform components which provide declarations or information about declarations, see "information about the code" above. | |
| - `lifetime`: Services for lifetime handling. Notably, there are already two standard implementations for lifetime tokens: | |
| [`KotlinAlwaysAccessibleLifetimeToken`](src/org/jetbrains/kotlin/analysis/api/platform/lifetime/KotlinAlwaysAccessibleLifetimeToken.kt) | |
| for static code (used by Standalone) and [`KotlinReadActionConfinementLifetimeToken`](src/org/jetbrains/kotlin/analysis/api/platform/lifetime/KotlinReadActionConfinementLifetimeToken.kt) | |
| for modifiable code (used by IntelliJ). | |
| - `modification`: Message topics and services for publishing modification events. See | |
| [`KotlinModificationEvent`](src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationEvent.kt). | |
| - `packages`: Platform components which provide information about packages, see "information about the code" above. | |
| - `permissions`: Services for permission handling. [`KaAnalysisPermissionChecker`](src/org/jetbrains/kotlin/analysis/api/platform/permissions/KaAnalysisPermissionChecker.kt) | |
| can be used by lifetime tokens to implement `isAccessible`, but is also used internally to check permissions when | |
| [`analyze`](../analysis-api/src/org/jetbrains/kotlin/analysis/api/analyze.kt) is called. | |
| - `projectStructure`: Platform components which provide information about the project's structure, such as | |
| [`KaModule`s](../analysis-api/src/org/jetbrains/kotlin/analysis/api/projectStructure/KaModule.kt) which are the Analysis API's conception | |
| of modules. The core component to implement is [`KotlinProjectStructureProvider`](src/org/jetbrains/kotlin/analysis/api/platform/projectStructure/KotlinProjectStructureProvider.kt), | |
| but there are various other components which cover other important aspects of project information. | |
| ### Service registration | |
| In general, it is the responsibility of the platform to initialize the Analysis API. Even Standalone does the bulk of the initialization | |
| work itself, albeit triggered by the Analysis API user. | |
| Initialization mostly takes the form of registration of internal and public services. The Analysis API has its own service registration | |
| mechanism via plugin XMLs. These XML files especially register internal engine services, which would be cumbersome for a platform to | |
| enumerate. Standalone currently implements its own handler for applying these plugin XMLs, and no such support is currently available via | |
| the platform interface out of the box. | |
| You can track the following issue: [KT-69385](https://youtrack.jetbrains.com/issue/KT-69385). Please leave a comment if it affects you. |