highlight names: do not highlight in huge chunks because there maybe whitespaces or comments between tokens; instead, highlight identifiers only

This commit is contained in:
Alexey Kudravtsev
2016-08-23 14:54:58 +03:00
parent 6b15153548
commit 11a4ede7a5
5 changed files with 60 additions and 54 deletions
@@ -111,21 +111,12 @@ public class HighlightNamesUtil {
@NotNull
static HighlightInfo highlightClassName(@Nullable PsiClass aClass, @NotNull PsiElement elementToHighlight, @NotNull TextAttributesScheme colorsScheme) {
HighlightInfoType type = getClassNameHighlightType(aClass, elementToHighlight);
TextAttributes attributes = mergeWithScopeAttributes(aClass, type, colorsScheme);
TextRange range = elementToHighlight.getTextRange();
if (elementToHighlight instanceof PsiJavaCodeReferenceElement) {
final PsiJavaCodeReferenceElement referenceElement = (PsiJavaCodeReferenceElement)elementToHighlight;
PsiReferenceParameterList parameterList = referenceElement.getParameterList();
if (parameterList != null) {
TextRange paramListRange = parameterList.getTextRange();
PsiElement identifier = PsiTreeUtil.skipSiblingsBackward(parameterList, PsiWhiteSpace.class, PsiComment.class); // e.g. " List <String>";
if (identifier != null) {
paramListRange = new TextRange(identifier.getTextRange().getEndOffset(), paramListRange.getEndOffset());
}
if (!paramListRange.isEmpty()) {
range = new TextRange(range.getStartOffset(), paramListRange.getStartOffset());
}
PsiElement identifier = referenceElement.getReferenceNameElement();
if (identifier != null) {
range = identifier.getTextRange();
}
}
@@ -136,12 +127,13 @@ public class HighlightNamesUtil {
range = new TextRange(psiAnnotation.getTextRange().getStartOffset(), range.getEndOffset());
}
HighlightInfoType type = getClassNameHighlightType(aClass, elementToHighlight);
TextAttributes attributes = mergeWithScopeAttributes(aClass, type, colorsScheme);
HighlightInfo.Builder builder = HighlightInfo.newHighlightInfo(type).range(range);
if (attributes != null) {
builder.textAttributes(attributes);
}
HighlightInfo info = builder.createUnconditionally();
return info;
return builder.createUnconditionally();
}
@Nullable
@@ -316,4 +308,32 @@ public class HighlightNamesUtil {
if (node != null) return node.getTextRange().getStartOffset();
return textRange.getStartOffset();
}
static HighlightInfo highlightPackage(@NotNull PsiElement resolved, @NotNull PsiJavaCodeReferenceElement elementToHighlight, @NotNull TextAttributesScheme scheme) {
PsiElement referenceNameElement = elementToHighlight.getReferenceNameElement();
TextRange range;
if (referenceNameElement == null) {
range = elementToHighlight.getTextRange();
}
else {
PsiElement nextSibling = PsiTreeUtil.nextLeaf(referenceNameElement);
if (nextSibling != null && nextSibling.getTextRange().isEmpty()) {
// empty PsiReferenceParameterList
nextSibling = PsiTreeUtil.nextLeaf(nextSibling);
}
if (nextSibling instanceof PsiJavaToken && ((PsiJavaToken)nextSibling).getTokenType() == JavaTokenType.DOT) {
range = new TextRange(referenceNameElement.getTextRange().getStartOffset(), nextSibling.getTextRange().getEndOffset());
}
else {
range = referenceNameElement.getTextRange();
}
}
HighlightInfoType type = JavaHighlightInfoTypes.CLASS_NAME;
TextAttributes attributes = mergeWithScopeAttributes(resolved, type, scheme);
HighlightInfo.Builder builder = HighlightInfo.newHighlightInfo(type).range(range);
if (attributes != null) {
builder.textAttributes(attributes);
}
return builder.createUnconditionally();
}
}
@@ -53,7 +53,10 @@ import gnu.trove.TObjectIntHashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class HighlightVisitorImpl extends JavaElementVisitor implements HighlightVisitor {
@NotNull
@@ -819,9 +822,6 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
private void highlightReferencedMethodOrClassName(@NotNull PsiJavaCodeReferenceElement element, PsiElement resolved) {
PsiElement parent = element.getParent();
if (parent instanceof PsiReferenceExpression || parent instanceof PsiJavaCodeReferenceElement) {
return;
}
final TextAttributesScheme colorsScheme = myHolder.getColorsScheme();
if (parent instanceof PsiMethodCallExpression) {
PsiMethod method = ((PsiMethodCallExpression)parent).resolveMethod();
@@ -839,33 +839,19 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
final PsiElement referenceNameElement = element.getReferenceNameElement();
if(referenceNameElement != null) {
// exclude type parameters from the highlighted text range
TextRange range = new TextRange(element.getTextRange().getStartOffset(), referenceNameElement.getTextRange().getEndOffset());
TextRange range = referenceNameElement.getTextRange();
myHolder.add(HighlightNamesUtil.highlightMethodName(methodOrClass, referenceNameElement, range, colorsScheme, false));
}
}
}
catch (IndexNotReadyException ignored) { }
}
else if (parent instanceof PsiImportStatement && ((PsiImportStatement)parent).isOnDemand()) {
// highlight on demand import as class
myHolder.add(HighlightNamesUtil.highlightClassName(null, element, colorsScheme));
else if (resolved instanceof PsiPackage) {
// highlight package (and following dot) as a class
myHolder.add(HighlightNamesUtil.highlightPackage(resolved, element, colorsScheme));
}
else if (resolved instanceof PsiClass) {
final PsiElement qualifier = element.getQualifier();
boolean highlightByItem = qualifier instanceof PsiJavaCodeReferenceElement && ((PsiJavaCodeReferenceElement)qualifier).getTypeParameters().length > 0 ||
PsiTreeUtil.findChildOfType(element, PsiComment.class) != null;
final PsiElement referenceNameElement = element.getReferenceNameElement();
final List<PsiElement> toHighlight = new ArrayList<>();
if (highlightByItem && referenceNameElement != null) {
toHighlight.add(referenceNameElement);
toHighlight.addAll(PsiTreeUtil.findChildrenOfType(element, PsiJavaCodeReferenceElement.class));
}
else {
toHighlight.add(element);
}
for (PsiElement psiElement : toHighlight) {
myHolder.add(HighlightNamesUtil.highlightClassName((PsiClass)resolved, psiElement, colorsScheme));
}
myHolder.add(HighlightNamesUtil.highlightClassName((PsiClass)resolved, element, colorsScheme));
}
}
@@ -1,15 +1,15 @@
import <symbolName descr="null" type="CLASS_NAME">java.io</symbolName>.*; // highlight on demand import as class name
import <symbolName descr="null" type="CLASS_NAME">java.util</symbolName>.*; // highlight on demand import as class name
import <symbolName descr="null" type="CLASS_NAME"><symbolName descr="null" type="CLASS_NAME">java</symbolName>.lang</symbolName>/*comment*/.<symbolName descr="null" type="CLASS_NAME">String</symbolName>;
import static <symbolName descr="null" type="CLASS_NAME">java.io.File</symbolName>.<symbolName descr="null" type="STATIC_FINAL_FIELD">pathSeparator</symbolName>;
import static <symbolName descr="null" type="CLASS_NAME">java.io.File</symbolName>.*;
import <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">io.</symbolName>*; // highlight on demand import as class name
import <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">util.</symbolName>*; // highlight on demand import as class name
import <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">lang</symbolName>/*comment*/.<symbolName descr="null" type="CLASS_NAME">String</symbolName>;
import static <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">io.</symbolName><symbolName descr="null" type="CLASS_NAME">File</symbolName>.<symbolName descr="null" type="STATIC_FINAL_FIELD">pathSeparator</symbolName>;
import static <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">io.</symbolName><symbolName descr="null" type="CLASS_NAME">File</symbolName>.*;
class <symbolName descr="null" type="CLASS_NAME">a</symbolName> {
void <symbolName descr="null" type="METHOD_DECLARATION">method</symbolName>() {
<symbolName descr="null" type="METHOD_CALL">method</symbolName>();
new <symbolName descr="null" type="CONSTRUCTOR_CALL">Exception</symbolName>();
new <symbolName descr="null" type="CONSTRUCTOR_CALL">java.lang.Exception</symbolName>();
new <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">lang.</symbolName><symbolName descr="null" type="CONSTRUCTOR_CALL">Exception</symbolName>();
}
<symbolName descr="null" type="CONSTRUCTOR_DECLARATION">a</symbolName>() {
@@ -21,7 +21,7 @@ class <symbolName descr="null" type="CLASS_NAME">a</symbolName> {
*/
static void <symbolName descr="null" type="METHOD_DECLARATION">f</symbolName>() {
<symbolName descr="null" type="CLASS_NAME">Integer</symbolName>.<symbolName descr="null" type="STATIC_METHOD">parseInt</symbolName>("");
<symbolName descr="null" type="CLASS_NAME">java.lang.Integer</symbolName>.<symbolName descr="null" type="STATIC_METHOD">parseInt</symbolName>("");
<symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">lang.</symbolName><symbolName descr="null" type="CLASS_NAME">Integer</symbolName>.<symbolName descr="null" type="STATIC_METHOD">parseInt</symbolName>("");
<symbolName descr="null" type="STATIC_METHOD">f</symbolName>();
}
@@ -36,13 +36,13 @@ class <symbolName descr="null" type="CLASS_NAME">a</symbolName> {
void <symbolName descr="null" type="METHOD_DECLARATION">ff</symbolName>(<symbolName descr="null" type="INTERFACE_NAME">Runnable</symbolName> <symbolName descr="null" type="PARAMETER">r</symbolName>) {
<symbolName descr="null" type="METHOD_CALL">ff</symbolName>(
new <symbolName descr="null" type="ANONYMOUS_CLASS_NAME">java.lang.Runnable</symbolName>() {
new <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">lang.</symbolName><symbolName descr="null" type="ANONYMOUS_CLASS_NAME">Runnable</symbolName>() {
public void <symbolName descr="null" type="METHOD_DECLARATION">run</symbolName>() {}
int <symbolName descr="null" type="INSTANCE_FIELD">instance</symbolName> = 0;
}
);
int <symbolName descr="null" type="LOCAL_VARIABLE">i</symbolName> = <symbolName descr="null" type="CLASS_NAME">java.lang.Integer</symbolName>.<symbolName descr="null" type="STATIC_FINAL_FIELD">MIN_VALUE</symbolName>;
int <symbolName descr="null" type="LOCAL_VARIABLE">i</symbolName> = <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">lang.</symbolName><symbolName descr="null" type="CLASS_NAME">Integer</symbolName>.<symbolName descr="null" type="STATIC_FINAL_FIELD">MIN_VALUE</symbolName>;
int <symbolName descr="null" type="LOCAL_VARIABLE">j</symbolName> = <symbolName descr="null" type="INTERFACE_NAME">itf</symbolName>.<symbolName descr="null" type="STATIC_FINAL_FIELD">CONST</symbolName>;
}
}
@@ -74,7 +74,7 @@ class <symbolName descr="null" type="CLASS_NAME">InheritedSymbolNames</symbolNam
private static class <symbolName descr="null" type="CLASS_NAME">B</symbolName> extends <symbolName descr="null" type="CLASS_NAME">A</symbolName> {
{
new <symbolName descr="null" type="ANONYMOUS_CLASS_NAME">java.lang.Runnable</symbolName>() {
new <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">lang.</symbolName><symbolName descr="null" type="ANONYMOUS_CLASS_NAME">Runnable</symbolName>() {
public void <symbolName descr="null" type="METHOD_DECLARATION">run</symbolName>() {
<symbolName descr="null" type="INHERITED_METHOD">getName</symbolName>();
}
@@ -85,7 +85,7 @@ class <symbolName descr="null" type="CLASS_NAME">InheritedSymbolNames</symbolNam
private static class <symbolName descr="null" type="CLASS_NAME">C</symbolName> extends <symbolName descr="null" type="CLASS_NAME">A</symbolName> {
{
new <symbolName descr="null" type="ANONYMOUS_CLASS_NAME">java.lang.Runnable</symbolName>() {
new <symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">lang.</symbolName><symbolName descr="null" type="ANONYMOUS_CLASS_NAME">Runnable</symbolName>() {
public void <symbolName descr="null" type="METHOD_DECLARATION">run</symbolName>() {
<symbolName descr="null" type="METHOD_CALL">getName</symbolName>();
}
@@ -1,9 +1,9 @@
package x;
package <symbolName descr="null" type="CLASS_NAME">x</symbolName>;
class <symbolName descr="null" type="CLASS_NAME" foreground="0x000000" background="0x404040" effectcolor="0x0000ff" effecttype="BOXED" fonttype="2">Shared</symbolName> {
<symbolName descr="null" type="CLASS_NAME" foreground="0x000000" background="0x404040" effectcolor="0x0000ff" effecttype="BOXED" fonttype="2">Shared</symbolName> <symbolName descr="null" type="INSTANCE_FIELD">x</symbolName> = new <symbolName descr="null" type="CONSTRUCTOR_CALL" foreground="0x000000" background="0x404040" effectcolor="0x0000ff" effecttype="BOXED" fonttype="2">Shared</symbolName>();
<symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">java.util.List</symbolName>
<symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">util.</symbolName><symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">List</symbolName>
<symbolName descr="null" type="METHOD_DECLARATION">list</symbolName>(
<symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">java.util.Map</symbolName> <symbolName descr="null" type="PARAMETER">map</symbolName>
<symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">util.</symbolName><symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">Map</symbolName> <symbolName descr="null" type="PARAMETER">map</symbolName>
) {
return null;
}
@@ -1,9 +1,9 @@
package x;
package <symbolName descr="null" type="CLASS_NAME">x</symbolName>;
class <symbolName descr="null" type="CLASS_NAME" foreground="0x000000" background="0x404040" effectcolor="0x0000ff" effecttype="BOXED" fonttype="2">X</symbolName> {
<symbolName descr="null" type="CLASS_NAME" foreground="0x000000" background="0x404040" effectcolor="0x0000ff" effecttype="BOXED" fonttype="2">X</symbolName> <symbolName descr="null" type="INSTANCE_FIELD">x</symbolName> = new <symbolName descr="null" type="CONSTRUCTOR_CALL" foreground="0x000000" background="0x404040" effectcolor="0x0000ff" effecttype="BOXED" fonttype="2">X</symbolName>();
<symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">java.util.List</symbolName>
<symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">util.</symbolName><symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">List</symbolName>
<symbolName descr="null" type="METHOD_DECLARATION">list</symbolName>(
<symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">java.util.Map</symbolName> <symbolName descr="null" type="PARAMETER">map</symbolName>
<symbolName descr="null" type="CLASS_NAME">java.</symbolName><symbolName descr="null" type="CLASS_NAME">util.</symbolName><symbolName descr="null" type="INTERFACE_NAME" foreground="0x000000" background="0xff00ff" effectcolor="0xffc800" effecttype="STRIKEOUT" fonttype="1">Map</symbolName> <symbolName descr="null" type="PARAMETER">map</symbolName>
) {
return null;
}