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 ( and ), 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:
- CompletionContributorfor completing keywords in MANIFEST.MF files.
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 - InsertHandleris 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.