diff --git a/_SUMMARY.md b/_SUMMARY.md index bd2cdd8a0..e881ddee1 100644 --- a/_SUMMARY.md +++ b/_SUMMARY.md @@ -53,7 +53,7 @@ * [Reference Contributor](reference_contributor.html) * [Find Usages Provider](find_usages_provider.html) * [Folding Builder](folding_builder.html) - * [Go To Symbol Contributor](TODO) + * [Go To Symbol Contributor](go_to_symbol_contributor.html) * [Structure View Factory](TODO) * [Formatter](TODO) * [Code Style Settings](TODO) diff --git a/go_to_symbol_contributor.md b/go_to_symbol_contributor.md new file mode 100644 index 000000000..88de387af --- /dev/null +++ b/go_to_symbol_contributor.md @@ -0,0 +1,100 @@ +--- +title: Go To Symbol Contributor +--- + + + +*A go to symbol contributor helps user to navigate to any PSI element by it's name.* + +### 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.parser.SimplePsiImplUtil* and regenerate the parser and PSI classes. + +```java +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; + } + }; +} +``` + +### 2. Update grammar and regenerate the parser + +```java +property ::= (KEY? SEPARATOR VALUE?) | KEY {mixin="com.simpleplugin.psi.impl.SimpleNamedElementImpl" + implements="com.simpleplugin.psi.SimpleNamedElement" methods=[getKey getValue getName setName getNameIdentifier getPresentation]} +``` + +### 3. Define a go to symbol contributor + +```java +package com.simpleplugin; + +import com.intellij.navigation.ChooseByNameContributor; +import com.intellij.navigation.NavigationItem; +import com.intellij.openapi.project.Project; +import com.simpleplugin.psi.SimpleProperty; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class SimpleChooseByNameContributor implements ChooseByNameContributor { + @NotNull + @Override + public String[] getNames(Project project, boolean includeNonProjectItems) { + List properties = SimpleUtil.findProperties(project); + List names = new ArrayList(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 properties = SimpleUtil.findProperties(project, name); + return properties.toArray(new NavigationItem[properties.size()]); + } +} +``` + +### 4. Register the go to symbol contributor + +```xml + +``` + +### 5. Run the project + +Now we can navigate to a property definition by name pattern via *⌥⌘⇧N* shortcut. + +![Go To Symbol](img/cls_tutorial/go_to_symbol.png) + +[Previous](folding_builder.html) +[Top](cls_tutorial.html) +[Next](structure_view_factory) diff --git a/img/cls_tutorial/go_to_symbol.png b/img/cls_tutorial/go_to_symbol.png new file mode 100644 index 000000000..29e2fe596 Binary files /dev/null and b/img/cls_tutorial/go_to_symbol.png differ