IntelliJ Platform Plugin SDK Help

Code Completion

Two types of code completion can be provided by custom language plugins: reference completion and contributor-based completion.

Reference completion is easier to implement but supports only the basic completion action.

Contributor-based completion provides more features, supports all completion types (Code | Code Completion | Basic and Type Matching), and can be used, for example, to implement keyword completion.

Reference Completion

To fill the completion list, the IDE calls PsiReference.getVariants() either on the reference at the caret location or on a dummy reference that would be placed at the caret. This method needs to return an array of objects containing either strings, PsiElement instances or instances of the LookupElement class (see Lookup Items below). If a PsiElement instance is returned in the array, the completion list shows the icon for the element.

A common way to implement getVariants() is to use the same function for walking up the tree as in PsiReference.resolve() using a PsiScopeProcessor which collects all declarations passed to its execute() method and returns them as an array for filling the completion list.

Symbol Reference Completion

To provide completion variants by a PsiSymbolReference implement PsiCompletableReference.

Contributor-Based Completion

Implementing CompletionContributor gives the greatest control over the operation of code completion. Register in com.intellij.completion.contributor extension point and specify the language attribute (unless it works on any supported language).

The core scenario of using CompletionContributor consists of calling the extend() method and passing in the Element Pattern specifying the context in which this completion variant is applicable. The CompletionProvider then adds the items to show in the completion list.

Keep in mind that the pattern is checked against the leaf PSI element. If you want to match a composite element, use withParent() or withSuperParent() methods.

If completion items do not depend on indexes (e.g., keywords), it can be marked as dumb aware.

Examples:

Lookup Items

Items shown in the completion list are represented by instances of the LookupElement interface. These instances are typically created through the LookupElementBuilder class.

If there's only one lookup item to be shown, the behavior can be customized via AutoCompletionPolicy.

Lookup Item Attributes

Text

Shown left-aligned.

Text attributes

Text color/grayed text, Bold, Italic, Underlined, Strikeout

Tail text

Shown next to the main item text (not used for prefix matching). Can be grayed text. Example: parameter list of a method

Type text

Shown right-aligned in the lookup list. Can be grayed text. Example: containing class of a method

Icon/Type icon

See Working with Icons.

Insert handler

The InsertHandler is called when the item is selected and performs additional modifications of the inserted text. It can also show the completion popup after insertion. Example: add parentheses for a method call (ParenthesesInsertHandler)

Runtime Presentation

The item presentation can also be performed via (re-usable) LookupElementRenderer.

For expensive calculations (for example, the presentation of an item to be shown depends on other items), use LookupElementBuilder.withExpensiveRenderer() to invoke the renderer in the background while the completion list is already populating.

Sorting

Use PrioritizedLookupElement to control item sorting if all lookup items are guaranteed to be provided by this CompletionContributor.

Code Completion FAQ

Skipping Completion Popup

To skip the completion popup in the current context (for example, inside comments), implement CompletionConfidence registered in com.intellij.completion.confidence extension point.

This can also be used to prevent skipping provided by other plugins by returning ThreeState.NO and registering the extension with order="first".

Showing Completion Popup Programmatically

To trigger completion upon typing a specific character in the editor, override TypedHandlerDelegate.checkAutoPopup() registered in com.intellij.typedHandler extension point.

If all conditions match, invoke AutoPopupController.scheduleAutoPopup() and return Result.STOP.

Completion Popup Events

Use LookupListener to receive notifications about completion popup lifecycle events.

19 May 2025