IntelliJ Platform SDK DevGuide

Edit page

13. Go To Symbol Contributor

A go to symbol contributor helps user to navigate to any PSI element by its name.

13.1. Define helper method for generated PSI elements

To specify how a PSI element looks like in the Go To Symbol popup window, Structure tool window or another components, it should implement getPresentation method.

This means we need to define this method in our utility com.simpleplugin.psi.impl.SimplePsiImplUtil and regenerate the parser and PSI classes.

public static ItemPresentation getPresentation(final SimpleProperty element) { return new ItemPresentation() { @Nullable @Override public String getPresentableText() { return element.getKey(); } @Nullable @Override public String getLocationString() { return element.getContainingFile().getName(); } @Nullable @Override public Icon getIcon(boolean unused) { return SimpleIcons.FILE; } }; }

13.2. Update grammar and regenerate the parser

property ::= (KEY? SEPARATOR VALUE?) | KEY {mixin="com.simpleplugin.psi.impl.SimpleNamedElementImpl" implements="com.simpleplugin.psi.SimpleNamedElement" methods=[getKey getValue getName setName getNameIdentifier getPresentation]}

Regenerate the parser by right clicking on the Simple.bnf file and selecting Generate Parser Code.

13.3. Define a go to symbol contributor

package com.simpleplugin; import com.intellij.navigation.*; import com.intellij.openapi.project.Project; import com.simpleplugin.psi.SimpleProperty; import org.jetbrains.annotations.NotNull; import java.util.*; public class SimpleChooseByNameContributor implements ChooseByNameContributor { @NotNull @Override public String[] getNames(Project project, boolean includeNonProjectItems) { List<SimpleProperty> properties = SimpleUtil.findProperties(project); List<String> names = new ArrayList<String>(properties.size()); for (SimpleProperty property : properties) { if (property.getKey() != null && property.getKey().length() > 0) { names.add(property.getKey()); } } return names.toArray(new String[names.size()]); } @NotNull @Override public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) { // todo include non project items List<SimpleProperty> properties = SimpleUtil.findProperties(project, name); return properties.toArray(new NavigationItem[properties.size()]); } }

13.4. Register the go to symbol contributor

<gotoSymbolContributor implementation="com.simpleplugin.SimpleChooseByNameContributor"/>

13.5. Run the project

Now we can navigate to a property definition by name pattern via Navigate | Symbol action.

Go To Symbol

Last modified: 18 November 2017