Skip to content

Commit 9489f63

Browse files
committed
charting
1 parent ccbe088 commit 9489f63

File tree

7 files changed

+76
-18
lines changed

7 files changed

+76
-18
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# KdbInsideBrains Changelog
22

3+
## 6.3.0
4+
5+
### Added
6+
7+
- Semantic highlighting added: colouring local variable and lambda parameters
8+
39
## 6.2.0
410

511
### Added
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.kdb.inside.brains.lang;
2+
3+
import com.intellij.codeInsight.daemon.RainbowVisitor;
4+
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
5+
import com.intellij.codeInsight.daemon.impl.HighlightVisitor;
6+
import com.intellij.psi.PsiElement;
7+
import com.intellij.psi.PsiFile;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.kdb.inside.brains.QFileType;
10+
import org.kdb.inside.brains.psi.*;
11+
12+
public class QRainbowVisitor extends RainbowVisitor {
13+
@Override
14+
public boolean suitableForFile(@NotNull PsiFile psiFile) {
15+
return QFileType.is(psiFile);
16+
}
17+
18+
@Override
19+
public void visit(@NotNull PsiElement psiElement) {
20+
if (psiElement instanceof @NotNull QVariable var && !var.isGlobal()) {
21+
addInfo(createVariableInfo(var));
22+
}
23+
}
24+
25+
private HighlightInfo createVariableInfo(@NotNull QVariable var) {
26+
final String name = var.getName();
27+
final ElementContext context = ElementContext.of(var);
28+
final ElementScope scope = context.getScope();
29+
30+
if (scope == ElementScope.PARAMETERS) {
31+
return getInfo(context.parameters(), var, name, QSyntaxHighlighter.VARIABLE);
32+
} else if (scope == ElementScope.LAMBDA) {
33+
final QLambdaExpr lambda = context.lambda();
34+
if (QPsiUtil.isInnerDeclaration(lambda, name)) {
35+
return getInfo(context.getElement(), var, var.getName(), QSyntaxHighlighter.VARIABLE);
36+
}
37+
}
38+
return null;
39+
}
40+
41+
@Override
42+
public @NotNull HighlightVisitor clone() {
43+
return new QRainbowVisitor();
44+
}
45+
}

src/main/java/org/kdb/inside/brains/psi/QPsiUtil.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.kdb.inside.brains.QFileType;
1515

1616
import java.util.ArrayList;
17+
import java.util.Collection;
1718
import java.util.List;
1819
import java.util.function.Predicate;
1920

@@ -100,6 +101,22 @@ public static boolean isGlobalDeclaration(@NotNull QVarDeclaration declaration)
100101
};
101102
}
102103

104+
public static boolean isInnerDeclaration(QLambda lambda, String name) {
105+
// implicit variable or in parameters list - ignore namespace
106+
if (lambda.getParameters() == null && QPsiUtil.isImplicitName(name)) {
107+
return true;
108+
}
109+
110+
final Collection<QVarDeclaration> declarations = PsiTreeUtil.findChildrenOfType(lambda, QVarDeclaration.class);
111+
for (QVarDeclaration declaration : declarations) {
112+
// Same name and same lambda - internal variable
113+
if (name.equals(declaration.getName()) && !QPsiUtil.isGlobalDeclaration(declaration)) {
114+
return true;
115+
}
116+
}
117+
return false;
118+
}
119+
103120
/**
104121
* Checks is the specified element colon or not.
105122
*

src/main/java/org/kdb/inside/brains/psi/mixin/QVariableBase.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.kdb.inside.brains.psi.*;
1111

1212
import javax.swing.*;
13-
import java.util.Collection;
1413

1514
public class QVariableBase extends QPsiElementImpl implements QVariable, ItemPresentation {
1615
private String name = null;
@@ -90,21 +89,9 @@ private String calculateQualifiedName() {
9089

9190
// no lambda - return full name
9291
final QLambdaExpr lambda = getContext(QLambdaExpr.class);
93-
if (lambda != null) {
94-
// implicit variable or in parameters list - ignore namespace
95-
if (lambda.getParameters() == null && QPsiUtil.isImplicitName(name)) {
96-
return name;
97-
}
98-
99-
final Collection<QVarDeclaration> declarations = PsiTreeUtil.findChildrenOfType(lambda, QVarDeclaration.class);
100-
for (QVarDeclaration declaration : declarations) {
101-
// Same name and same lambda - internal variable
102-
if (name.equals(declaration.getName()) && !QPsiUtil.isGlobalDeclaration(declaration)) {
103-
return name;
104-
}
105-
}
92+
if (lambda != null && QPsiUtil.isInnerDeclaration(lambda, name)) {
93+
return name;
10694
}
107-
10895
return QPsiUtil.createQualifiedName(namespaceName, name);
10996
}
11097

src/main/java/org/kdb/inside/brains/settings/KdbColorSettingsPage.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,12 @@ public Language getLanguage() {
6666
"`a`b`c\n" +
6767
"variable\n" +
6868
"(+;*;<;>;~=)\n" +
69-
"count\n" +
69+
"count;\n" +
7070
"`int$()\n" +
7171
"a ,/:\\\\: b\n" +
7272
"(if[];?[];$[])\n" +
73-
"\\d .some.dir";
73+
"\\d .some.dir\n" +
74+
"{[param1;param2;param2] localV:10; :param1+param2+param3+localV+globalE; }\n";
7475
// @formatter:on
7576
}
7677

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,8 @@
499499
<codeInsight.lineMarkerProvider language="q"
500500
implementationClass="org.kdb.inside.brains.lang.marker.SystemFunctionsMarkerProvider"/>
501501

502+
<highlightVisitor implementation="org.kdb.inside.brains.lang.QRainbowVisitor"/>
503+
502504
<!-- Indexes -->
503505
<fileBasedIndex implementation="org.kdb.inside.brains.psi.index.QIdentifiersIndex"/>
504506
<projectService serviceImplementation="org.kdb.inside.brains.psi.index.QIndexService"/>

version.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pluginVersion=6.2.0
1+
pluginVersion=6.3.0

0 commit comments

Comments
 (0)