Skip to content


Structure view


For an opened file, an outline of the symbols defined in it can be obtained using View | Tool Windows | Structure. It shows a tree of all protocols, permissions, obligations, functions, structures in the currently opened file. The list can be filtered using the icons in the window's toolbar. All entities can be navigated to using double-clicking its name.

Go to declaration

The plugin lets you quickly navigate to the declaration of a symbol.

To quickly find the definition of an entity, position the caret on it and select Navigate | Declaration. This resolution works across files, respecting the require command.

The Go to declaration also works for builtin functions and methods. For this purpose, a set of read-only files containing the definitions is generated.

Find usages

The plugin lets you find all the usage sites of a symbol.

Right-click an identifier and select Find Usages. Alternatively, place caret on an identifier and press the Find Usages shortcut. You will be presented with a tool window listing all the usages. The display can be heavily customised in regard to grouping and filtering. By default, the items are grouped by the usage type (Value read, Struct field, Function call argument ...) and then by the source filename.

The Find usages window also shows you all places where the variable/type would be renamed using the Rename function.

Note: Report any irregularities in the list of usages (false positives, false negatives), as correctly working Find Usages is central to more advanced features not breaking the code.

Go to class/symbol

If you know the name of the symbol you want to navigate to, you can quickly do so using IntelliJ's "navigate to symbol" action.

All NPL files are indexed for definitions of various entities. This index happens on the background automatically - typically for the whole project during the project start, and for a file when it is edited. During construction of the indices, the IDE works in so-called "dumb mode", and various features are limited. Nevertheless, the indexing should normally take only couple seconds.

To make use of the index, you can invoke Navigate | Class or Navigate | Symbol and type prefix or a part of a name to list the top symbols. The distinction between Class and Symbol is that Class only navigates to structs, identifiers, symbols, and protocols, whereas symbol also includes permissions, obligations and functions.


If the index doesn't work correctly, you may try File | Invalidate Caches and Restart.