Skip to content

Commit 6e15cdc

Browse files
authored
Merge pull request #129 from kdbinsidebrains/fixes
fixes
2 parents cdb9669 + 3b27765 commit 6e15cdc

File tree

10 files changed

+89
-71
lines changed

10 files changed

+89
-71
lines changed

CHANGELOG.md

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

3+
## 6.3.2
4+
5+
### Fixed
6+
7+
- Implicit variables (x,y,z) are not highlighted in Rainbow
8+
- Implicit variables (x,y,z) shown as undefined if lambda defined in a context (\d)
9+
- Global variable assignment marked by rainbow as local
10+
311
## 6.3.1
412

513
### Added

src/main/java/org/kdb/inside/brains/lang/QRainbowVisitor.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
import com.intellij.psi.PsiFile;
88
import com.intellij.psi.PsiReference;
99
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
1011
import org.kdb.inside.brains.QFileType;
11-
import org.kdb.inside.brains.psi.ElementScope;
12-
import org.kdb.inside.brains.psi.QLambda;
13-
import org.kdb.inside.brains.psi.QVarDeclaration;
14-
import org.kdb.inside.brains.psi.QVariable;
12+
import org.kdb.inside.brains.psi.*;
1513

1614
public class QRainbowVisitor extends RainbowVisitor {
1715
@Override
@@ -21,12 +19,15 @@ public boolean suitableForFile(@NotNull PsiFile psiFile) {
2119

2220
@Override
2321
public void visit(@NotNull PsiElement psiElement) {
24-
if (psiElement instanceof @NotNull QVariable var && !var.isGlobal()) {
25-
addInfo(createVariableInfo(var));
22+
if (psiElement instanceof @NotNull QVariable var) {
23+
final HighlightInfo info = createVariableInfo(var);
24+
if (info != null) {
25+
addInfo(info);
26+
}
2627
}
2728
}
2829

29-
private HighlightInfo createVariableInfo(@NotNull QVariable var) {
30+
private @Nullable HighlightInfo createVariableInfo(@NotNull QVariable var) {
3031
final QLambda lambda = var.getContext(QLambda.class);
3132
if (lambda == null) {
3233
return null;
@@ -36,6 +37,10 @@ private HighlightInfo createVariableInfo(@NotNull QVariable var) {
3637
return getInfo(var, d, lambda);
3738
}
3839

40+
if (lambda.isImplicitDeclaration(var)) {
41+
return createInfo(lambda, var);
42+
}
43+
3944
final PsiReference[] references = var.getReferences();
4045
for (PsiReference reference : references) {
4146
final PsiElement resolve = reference.resolve();
@@ -49,15 +54,15 @@ private HighlightInfo createVariableInfo(@NotNull QVariable var) {
4954
return null;
5055
}
5156

52-
private HighlightInfo getInfo(QVariable v, QVarDeclaration d, QLambda lambda) {
53-
if (d.isGlobal()) {
57+
private @Nullable HighlightInfo getInfo(@NotNull QVariable var, @NotNull QVarDeclaration dec, @NotNull QLambda lambda) {
58+
if (QPsiUtil.isGlobalDeclaration(dec)) {
5459
return null;
5560
}
5661

57-
final ElementScope scope = d.getVariableContext().getScope();
62+
final ElementScope scope = dec.getVariableContext().getScope();
5863
// only root variables, no tables, dicts and so on
5964
if (scope == ElementScope.PARAMETERS || scope == ElementScope.LAMBDA) {
60-
return getInfo(lambda, v, v.getName(), QSyntaxHighlighter.VARIABLE);
65+
return createInfo(lambda, var);
6166
}
6267
return null;
6368
}
@@ -66,4 +71,8 @@ private HighlightInfo getInfo(QVariable v, QVarDeclaration d, QLambda lambda) {
6671
public @NotNull HighlightVisitor clone() {
6772
return new QRainbowVisitor();
6873
}
74+
75+
private @NotNull HighlightInfo createInfo(@NotNull QLambda lambda, @NotNull QVariable var) {
76+
return getInfo(lambda, var, var.getName(), QSyntaxHighlighter.VARIABLE);
77+
}
6978
}

src/main/java/org/kdb/inside/brains/lang/inspection/UndefinedVariableInspection.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@ protected void validate(@NotNull QVarReference variable, @NotNull ProblemsHolder
3232
return;
3333
}
3434

35-
if (QPsiUtil.isImplicitVariable(variable)) {
35+
if (UndefinedExclusion.isExcluded(qualifiedName)) {
3636
return;
3737
}
3838

39-
if (UndefinedExclusion.isExcluded(qualifiedName)) {
39+
final QLambda lambda = variable.getContext(QLambda.class);
40+
if (lambda != null && lambda.isImplicitDeclaration(variable)) {
4041
return;
4142
}
4243

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
package org.kdb.inside.brains.psi;
22

3+
import org.jetbrains.annotations.NotNull;
34
import org.jetbrains.annotations.Nullable;
45

56
public interface QLambda extends QPsiElement {
7+
String getVariables();
8+
9+
String getParametersInfo();
10+
611
@Nullable
712
QParameters getParameters();
813

9-
String getVariables();
1014

11-
String getParametersInfo();
15+
// boolean isImplicitVariable(String name);
16+
17+
boolean isImplicitDeclaration(@NotNull QVariable variable);
18+
19+
20+
@Nullable
21+
QVarDeclaration getLocalDeclaration(@NotNull QVariable variable);
1222
}

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

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,6 @@ public static boolean isImplicitName(@NotNull String name) {
7070
return 'x' == c || 'y' == c || 'z' == c;
7171
}
7272

73-
public static boolean isImplicitVariable(@NotNull QVariable variable) {
74-
if (isImplicitName(variable.getQualifiedName())) {
75-
final QLambdaExpr enclosingLambda = variable.getContext(QLambdaExpr.class);
76-
return enclosingLambda != null && enclosingLambda.getParameters() == null;
77-
}
78-
return false;
79-
}
80-
8173
public static boolean isGlobalDeclaration(@NotNull QVarDeclaration declaration) {
8274
final ElementContext ctx = ElementContext.of(declaration);
8375
return switch (ctx.getScope()) {
@@ -175,39 +167,6 @@ public static PsiElement getNextNotWhitespace(PsiElement e) {
175167
return sibling;
176168
}
177169

178-
179-
public static @Nullable QVarDeclaration getLocalDeclaration(@NotNull QLambda lambda, @NotNull QVariable variable) {
180-
final String name = variable.getName();
181-
// implicit variable or in parameters list - ignore namespace
182-
if (lambda.getParameters() == null && QPsiUtil.isImplicitName(name)) {
183-
return null;
184-
}
185-
186-
final QVarDeclaration[] res = new QVarDeclaration[1];
187-
lambda.acceptChildren(new PsiRecursiveElementWalkingVisitor() {
188-
@Override
189-
public void visitElement(@NotNull PsiElement element) {
190-
// we don't search inside others lambda, query, table or dict
191-
if (QPsiUtil.isLocalContextElement(element)) {
192-
return;
193-
}
194-
195-
// no reason to search after the definition.// In a lambda it can't be below.
196-
if (element.equals(variable)) {
197-
stopWalking();
198-
} else if (element instanceof QVarDeclaration d) {
199-
if (name.equals(d.getName()) && !QPsiUtil.isGlobalDeclaration(d)) {
200-
res[0] = d;
201-
stopWalking();
202-
}
203-
} else {
204-
super.visitElement(element);
205-
}
206-
}
207-
});
208-
return res[0];
209-
}
210-
211170
public static PsiElement findRootExpression(PsiElement element, PsiElement context) {
212171
if (element == null) {
213172
return null;

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,6 @@ public interface QVariable extends QPsiElement {
1717
@NotNull
1818
String getQualifiedName();
1919

20-
/**
21-
* Returns true of the qualified name starts with dot: <code>.asd.qwe</code>.
22-
*
23-
* @return true if it's global definition or false otherwise.
24-
*/
25-
default boolean isGlobal() {
26-
return QPsiUtil.hasNamespace(getQualifiedName());
27-
}
28-
2920
/**
3021
* Returns last tone of the name or the full name.
3122
*/

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

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.kdb.inside.brains.psi.mixin;
22

33
import com.intellij.lang.ASTNode;
4+
import com.intellij.psi.PsiElement;
5+
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
46
import icons.KdbIcons;
7+
import org.jetbrains.annotations.NotNull;
58
import org.jetbrains.annotations.Nullable;
6-
import org.kdb.inside.brains.psi.QLambda;
7-
import org.kdb.inside.brains.psi.QParameters;
9+
import org.kdb.inside.brains.psi.*;
810
import org.kdb.inside.brains.psi.impl.QExpressionImpl;
911

1012
import javax.swing.*;
@@ -33,4 +35,42 @@ public String getParametersInfo() {
3335
}
3436
return parameters.getParametersInfo();
3537
}
38+
39+
@Override
40+
public boolean isImplicitDeclaration(@NotNull QVariable variable) {
41+
return getParameters() == null && QPsiUtil.isImplicitName(variable.getName());
42+
}
43+
44+
@Override
45+
public @Nullable QVarDeclaration getLocalDeclaration(@NotNull QVariable variable) {
46+
// implicit variable or in parameters list - ignore namespace
47+
if (isImplicitDeclaration(variable)) {
48+
return null;
49+
}
50+
51+
final String name = variable.getName();
52+
final QVarDeclaration[] res = new QVarDeclaration[1];
53+
acceptChildren(new PsiRecursiveElementWalkingVisitor() {
54+
@Override
55+
public void visitElement(@NotNull PsiElement element) {
56+
// we don't search inside others lambda, query, table or dict
57+
if (QPsiUtil.isLocalContextElement(element)) {
58+
return;
59+
}
60+
61+
// no reason to search after the definition.// In a lambda it can't be below.
62+
if (element.equals(variable)) {
63+
stopWalking();
64+
} else if (element instanceof QVarDeclaration d) {
65+
if (name.equals(d.getName()) && !QPsiUtil.isGlobalDeclaration(d)) {
66+
res[0] = d;
67+
stopWalking();
68+
}
69+
} else {
70+
super.visitElement(element);
71+
}
72+
}
73+
});
74+
return res[0];
75+
}
3676
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private String calculateQualifiedName() {
8989

9090
// no lambda - return full name
9191
final QLambdaExpr lambda = getContext(QLambdaExpr.class);
92-
if (lambda != null && QPsiUtil.getLocalDeclaration(lambda, this) != null) {
92+
if (lambda != null && (lambda.isImplicitDeclaration(this) || lambda.getLocalDeclaration(this) != null)) {
9393
return name;
9494
}
9595
return QPsiUtil.createQualifiedName(namespaceName, name);

src/main/java/org/kdb/inside/brains/psi/refs/QVariableReferenceProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ private ResolveResult[] resolveVariable(QVariable variable, ElementContext conte
6161
}
6262

6363
private ResolveResult[] resolveLambda(QLambdaExpr lambda, QVariable var) {
64-
if (QPsiUtil.isImplicitVariable(var) && lambda.getParameters() == null) {
64+
if (lambda.isImplicitDeclaration(var)) {
6565
return ResolveResult.EMPTY_ARRAY;
6666
}
6767

68-
final QVarDeclaration declaration = QPsiUtil.getLocalDeclaration(lambda, var);
68+
final QVarDeclaration declaration = lambda.getLocalDeclaration(var);
6969
if (declaration != null) {
7070
return single(DeclarationRef.of(declaration));
7171
}

version.properties

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

0 commit comments

Comments
 (0)