Line markers help to annotate any code with icons on the gutter. These icons may provide navigation to related code.
8.1. Define a line marker provider
Let's annotate usages of our properties within Java code and provide navigation to the definition of these properties.
{% include /code_samples/simple_language_plugin/src/com/simpleplugin/SimpleLineMarkerProvider.java %}
More technical details for implementers
Please return line marker info for exact element you were asked for. For example, do not return class marker info if
getLineMarkerInfo()was called for a method.Please return relevant line marker info for as small element as possible. For example, do not return method marker for
PsiMethod. Instead, return it for thePsiIdentifierwhich is a name of this method.
Even more technical details:
What happens when LineMarkerProvider returns something for too big PsiElement?
public class MyLineMarkerProvider implements LineMarkerProvider {
public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
if (element instanceof PsiMethod) return new LineMarkerInfo(element, ...);
return null;
}
}
Inspection (specifically, LineMarkersPass) for performance reasons queries all LineMarkerProviders in two passes:
first pass for all elements in visible area
second pass for all the rest elements
If providers return nothing for either area, its line markers are cleared.
So if e.g. a method is half-visible (its name is visible but part of its body isn't) and
some poorly written LineMarkerProvider returned info for the PsiMethod instead of PsiIdentifier then:
the first pass removes line marker info because whole
PsiMethodis not visible.the second pass tries to add line marker info back because
LineMarkerProvideris called for thePsiMethodat last.
As a result, line marker icon would blink annoyingly.
To fix this, rewrite LineMarkerProvider to return info for PsiIdentifier instead of PsiMethod:
public class MyLineMarkerProvider implements LineMarkerProvider {
public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
if (element instanceof PsiIdentifier && element.getParent() instanceof PsiMethod) return new LineMarkerInfo(element, ...);
return null;
}
}
8.2. Register the line marker provider
<codeInsight.lineMarkerProvider language="JAVA" implementationClass="com.simpleplugin.SimpleLineMarkerProvider"/>
8.3. Run the project
Now you see the icon on the gutter and can navigate to the property definition.
