mirror of
https://github.com/JetBrains/intellij-sdk-code-samples.git
synced 2025-07-28 01:07:49 +08:00
add new topic parameter_info.md
This commit is contained in:
parent
7dbb19fd78
commit
da69b97f34
2
ijs.tree
2
ijs.tree
@ -246,7 +246,7 @@
|
||||
<toc-element id="go_to_class_and_go_to_symbol.md"/>
|
||||
<toc-element id="documentation.md"/>
|
||||
<toc-element id="additional_minor_features.md"/>
|
||||
<toc-element toc-title="Parameter Info"/>
|
||||
<toc-element id="parameter_info.md"/>
|
||||
<toc-element toc-title="Parameter Hints"/>
|
||||
</toc-element>
|
||||
<toc-element id="custom_language_support_tutorial.md">
|
||||
|
@ -9,13 +9,18 @@ See [GitHub Changelog](https://github.com/JetBrains/intellij-sdk-docs/commits/ma
|
||||
|
||||
## 2022
|
||||
|
||||
### February-22
|
||||
|
||||
Parameter Info
|
||||
: Add [](parameter_info.md) section explaining how information about function parameters can be shown in the IDE.
|
||||
|
||||
### January-22
|
||||
|
||||
Highlighting
|
||||
: Add [](syntax_errors.md) and [](controlling_highlighting.md) sections explaining syntax highlighting basics and filtering highlighting information.
|
||||
|
||||
IDE Infrastructure
|
||||
: Added sections [](ide_infrastructure.md#application-events) and [](ide_infrastructure.md#plugin-management).
|
||||
: Add sections [](ide_infrastructure.md#application-events) and [](ide_infrastructure.md#plugin-management).
|
||||
|
||||
## 2021
|
||||
|
||||
|
108
topics/reference_guide/custom_language_support/parameter_info.md
Normal file
108
topics/reference_guide/custom_language_support/parameter_info.md
Normal file
@ -0,0 +1,108 @@
|
||||
[//]: # (title: Parameter Info)
|
||||
|
||||
<!-- Copyright 2000-2022 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. -->
|
||||
|
||||
Custom languages can use the `com.intellij.lang.parameterInfo.ParameterInfoHandler` extension point (EP) to show information about parameters in method and function calls.
|
||||
This is a convenient way to display type signatures directly as a popup in the editor without having to consult the documentation.
|
||||
If it is available, the IDE can show this popup automatically after a short delay, or it can be invoked explicitly via
|
||||
<menupath>[View | Parameter Info](https://www.jetbrains.com/help/idea/viewing-reference-information.html#view-parameter-info)</menupath>.
|
||||
|
||||
Parameter info is dynamic and can update the displayed information when the caret is moved or additional code is typed.
|
||||
This allows for highlighting entries or marking the current parameter at the caret position.
|
||||
Therefore, the interface of the
|
||||
[`ParameterInfoHandler`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/ParameterInfoHandler.java)
|
||||
EP consists of methods for initially collecting the required information
|
||||
to display parameter information at the caret position as well as methods to update what should be displayed during edits.
|
||||
|
||||
## Implementation
|
||||
|
||||
Language authors implement
|
||||
[`ParameterInfoHandler`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/ParameterInfoHandler.java)
|
||||
which takes two type parameters: `ParameterOwner` and `ParameterType`.
|
||||
For the explanations that follow, we assume that `ParameterOwner` is a PSI element that represents a function call in a language,
|
||||
and `ParameterType` represents (possibly several) function definitions.
|
||||
|
||||
Additionally, `ParameterInfoHandler` uses several context types that are mutable and used to adjust what and how parameter information is displayed.
|
||||
These contexts are, e.g.,
|
||||
[`CreateParameterInfoContext`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/CreateParameterInfoContext.java),
|
||||
[`UpdateParameterInfoContext`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/UpdateParameterInfoContext.java)
|
||||
and
|
||||
[`ParameterInfoUIContext`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/ParameterInfoUIContext.java)
|
||||
and they all derive from
|
||||
[`ParameterInfoContext`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/ParameterInfoContext.java).
|
||||
|
||||
### Initial Phase
|
||||
|
||||
The initial phase describes what happens when no parameter info is currently displayed and it is invoked either automatically or by the user.
|
||||
|
||||
1. The `findElementForParameterInfo()` method is called.
|
||||
When overriding this method, language authors use the provided `CreateParameterInfoContext` to access, e.g., the file and offset of the current editor.
|
||||
The goal is to identify the `ParameterOwner` i.e. a function call at the current offset if it exists.
|
||||
It is advised to extract the actual search for the function call into a separate method since it can be re-used later.
|
||||
The `findElementForParameterInfo()` implementation should find all matching function definitions and store them using `setItemsToShow()` of the context parameter.
|
||||
2. If the returned function call element is valid, the `showParameterInfo()` method is invoked.
|
||||
Implementations of this method usually just call `showHint()` of the `CreateParameterInfoContext` providing the offset at which the popup should appear.
|
||||
3. For each item to show from step 1, the `updateUI()` method is called.
|
||||
No heavy work is allowed in this method since it runs on the UI thread and it should only update the UI representation using, e.g.,
|
||||
`setUIComponentEnabled()` or `setupUIComponentPresentation()` of the provided `ParameterInfoUIContext`.
|
||||
4. After that the following methods are called which will be explained in the next phase: `findElementForUpdatingParameterInfo()`,
|
||||
`updateParameterInfo()`, `updateUI()`.
|
||||
|
||||
### Update Phase
|
||||
|
||||
When a parameter info popup is displayed and the user types something or moves the caret, the displayed information is updated.
|
||||
This allows for, e.g., highlighting a function usage with different arguments or simply moving the parameter info box closer to the caret.
|
||||
Therefore, when the user moves the caret or types something, the following happens:
|
||||
|
||||
1. The `syncUpdateOnCaretMove()` method is called.
|
||||
2. The `findElementForUpdatingParameterInfo()` method is called and it should find the correct function call (`ParameterOwner`) for the changed caret position.
|
||||
Implementations return `null` if an appropriate element could not be found or if it is different from `getParameterOwner()` of the provided `UpdateParameterInfoContext`.
|
||||
If `null` is returned, the `dispose()` method is called.
|
||||
3. The `processFoundElementForUpdatingParameterInfo()` method is called which allows for additional adjustments of the `UpdateParameterInfoContext`.
|
||||
By default, this method does nothing and it’s usually not necessary to implement it.
|
||||
4. The `updateParameterInfo()` is called. Many implementations only invoke `setParameterOwner()` of the `UpdateParameterInfoContext` here.
|
||||
5. The `updateUI()` method is called for each item in the `getItemsToShow()` array of the context which were collected in the initial phase.
|
||||
|
||||
## Further Tips
|
||||
|
||||
Language authors can implement
|
||||
[`ParameterInfoHandlerWithTabActionSupport`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/ParameterInfoHandlerWithTabActionSupport.java)
|
||||
to extend the parameter info functionality with the ability to jump between parameter positions by pressing the tab key.
|
||||
For recurring tasks like finding the index of the current parameter in a function call,
|
||||
[`ParameterInfoUtils`](upsource:///platform/lang-api/src/com/intellij/lang/parameterInfo/ParameterInfoUtils.java) provides a collection of useful functions.
|
||||
|
||||
It is further helpful to inspect all the context-interfaces that extend from `ParameterInfoContext` and can be found in the `com.intellij.lang.parameterInfo` package
|
||||
as they provide insight into what data of the parameter info can be accessed and changed in the different stages.
|
||||
|
||||
Methods of the `ParameterInfoHandler` that have a default implementation can usually be ignored.
|
||||
`syncUpdateOnCaretMove()` and `supportsOverloadSwitching()` are used internally by the IntelliJ Platform and are not required to be implemented by plugins.
|
||||
The `dispose()` method is called when the currently displayed parameter info is invalidated and destroyed.
|
||||
Only `isWhitespaceSensitive()` which is used in the `getCurrentOffset()` method of
|
||||
[`ParameterInfoControllerBase`](upsource:///platform/lang-impl/src/com/intellij/codeInsight/hint/ParameterInfoControllerBase.java)
|
||||
should be implemented when whitespace matters in a language.
|
||||
|
||||
Note that parameter info works during indexing (using incomplete indices) when the implementations also extend
|
||||
[`DumbAware`](upsource:///platform/core-api/src/com/intellij/openapi/project/DumbAware.java).
|
||||
It is recommended to adapt tests for dumb-mode since the results might be surprising,
|
||||
and more changes to the handler might be required for better results.
|
||||
|
||||
Finally, language authors should be aware of the global
|
||||
[`CodeInsightSettings#SHOW_FULL_SIGNATURES_IN_PARAMETER_INFO`](upsource:///platform/analysis-impl/src/com/intellij/codeInsight/CodeInsightSettings.java)
|
||||
setting that can be used to present results that are consistent with the default IDE behavior.
|
||||
For Java, for instance, the IDE shows the full signature of the method/function on parameter info if this setting is enabled.
|
||||
|
||||
## Examples
|
||||
|
||||
Existing, moderately complex, implementations of `ParameterInfoHandler` in the IntelliJ Platform that can serve as a reference are:
|
||||
|
||||
* [`XPathParameterInfoHandler`](upsource:///plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathParameterInfoHandler.java)
|
||||
* [`XmlParameterInfoHandler`](upsource:///xml/impl/src/com/intellij/codeInsight/hint/api/impls/XmlParameterInfoHandler.java)
|
||||
|
||||
Implementations of 3rd party plugins can be discovered using the
|
||||
[IntelliJ Platform Explorer](https://plugins.jetbrains.com/intellij-platform-explorer?extensions=com.intellij.codeInsight.parameterInfo).
|
||||
Two examples are:
|
||||
|
||||
* [RsParameterInfoHandler](https://github.com/intellij-rust/intellij-rust/blob/93853e33261174399babb10e43a3aff133f0a5ef/src/main/kotlin/org/rust/ide/hints/parameter/RsParameterInfoHandler.kt)
|
||||
of the Rust plugin.
|
||||
* [LatexParameterInfoHandler](https://github.com/Hannah-Sten/TeXiFy-IDEA/blob/655644b217e3954ae1286d7070a9357f2748f6a6/src/nl/hannahsten/texifyidea/documentation/LatexParameterInfoHandler.kt)
|
||||
of the TeXiFy plugin.
|
Loading…
x
Reference in New Issue
Block a user