From 47072d4132014beb1314c1387c96d95e9e34cd72 Mon Sep 17 00:00:00 2001 From: xonix Date: Tue, 16 Apr 2024 02:00:20 +0300 Subject: [PATCH] False positive warning "Function ... is never used" #214 : adjust grammar to introduce string mixin --- src/main/java/intellij_awk/Awk.bnf | 10 ++++-- .../AwkCompletionContributorBase.java | 8 ++--- .../AwkInspectionUnresolvedFunction.java | 2 +- .../intellij_awk/AwkParserDefinition.java | 2 +- .../java/intellij_awk/psi/AwkStringMixin.java | 32 +++++++++++++++++++ src/test/testData/parser/BuiltInFuncSpace.txt | 3 +- src/test/testData/parser/UserFuncSpace.txt | 3 +- 7 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 src/main/java/intellij_awk/psi/AwkStringMixin.java diff --git a/src/main/java/intellij_awk/Awk.bnf b/src/main/java/intellij_awk/Awk.bnf index 8a0b5bc..ac2c3d7 100644 --- a/src/main/java/intellij_awk/Awk.bnf +++ b/src/main/java/intellij_awk/Awk.bnf @@ -348,7 +348,7 @@ non_unary_expr ::= ( | NOT expr | simple_get (LT expr)? | NUMBER - | STRING + | str | ERE | INCR lvalue | DECR lvalue @@ -391,6 +391,12 @@ function_call_name ::= FUNC_NAME implements="intellij_awk.psi.AwkNamedElement" } +str ::= STRING // we need this as PSI to enable GAWK's function references `f="fname"; @f()` +{ + mixin="intellij_awk.psi.AwkStringMixin" + implements="intellij_awk.psi.AwkNamedElement" +} + private non_unary_expr1 ::= [ ( POW expr | MUL expr @@ -449,7 +455,7 @@ private non_unary_print_expr ::= ( | LPAREN expr_lst RPAREN IN gawk_var_name | simple_get | NUMBER - | STRING + | str | ERE | INCR lvalue | DECR lvalue diff --git a/src/main/java/intellij_awk/AwkCompletionContributorBase.java b/src/main/java/intellij_awk/AwkCompletionContributorBase.java index 7de50c1..9319154 100644 --- a/src/main/java/intellij_awk/AwkCompletionContributorBase.java +++ b/src/main/java/intellij_awk/AwkCompletionContributorBase.java @@ -15,18 +15,18 @@ abstract class AwkCompletionContributorBase extends CompletionContributor { static final PsiElementPattern.Capture INSIDE_STRING = psiElement(AwkTypes.STRING); private static final ElementPattern notInsideERE = - not(or(psiElement(AwkTypes.ERE), psiElement(AwkTypes.TYPED_ERE))); + not(or(psiElement(AwkTypes.ERE), psiElement(AwkTypes.TYPED_ERE))); private static final ObjectPattern.Capture notInsideStringEre = - not(INSIDE_STRING).and(notInsideERE); + not(INSIDE_STRING).and(notInsideERE); static ElementPattern notInsideStringERE( - ElementPattern pattern) { + ElementPattern pattern) { return and(notInsideStringEre, pattern); } static ElementPattern notInsideERE( - ElementPattern pattern) { + ElementPattern pattern) { return and(notInsideERE, pattern); } diff --git a/src/main/java/intellij_awk/AwkInspectionUnresolvedFunction.java b/src/main/java/intellij_awk/AwkInspectionUnresolvedFunction.java index 47a1348..8232b15 100644 --- a/src/main/java/intellij_awk/AwkInspectionUnresolvedFunction.java +++ b/src/main/java/intellij_awk/AwkInspectionUnresolvedFunction.java @@ -124,7 +124,7 @@ public void invoke(@NotNull Project project, Editor editor, PsiFile file) } } if (name == null) { - PsiElement string = nonUnaryExpr.getString(); + PsiElement string = nonUnaryExpr.getStr(); if (string != null && string.getText().equals(nonUnaryExpr.getText())) { String text = string.getText(); name = text.substring(1, text.length() - 1); diff --git a/src/main/java/intellij_awk/AwkParserDefinition.java b/src/main/java/intellij_awk/AwkParserDefinition.java index 1fc956c..7511144 100644 --- a/src/main/java/intellij_awk/AwkParserDefinition.java +++ b/src/main/java/intellij_awk/AwkParserDefinition.java @@ -26,7 +26,7 @@ public class AwkParserDefinition implements ParserDefinition { new IStubFileElementType<>(AwkLanguage.INSTANCE) { @Override public int getStubVersion() { - return 15; + return 16; } @Override diff --git a/src/main/java/intellij_awk/psi/AwkStringMixin.java b/src/main/java/intellij_awk/psi/AwkStringMixin.java new file mode 100644 index 0000000..beed79d --- /dev/null +++ b/src/main/java/intellij_awk/psi/AwkStringMixin.java @@ -0,0 +1,32 @@ +package intellij_awk.psi; + +import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import intellij_awk.AwkReferenceFunction; +import javax.swing.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class AwkStringMixin extends AwkNamedElementImpl { + public AwkStringMixin(@NotNull ASTNode node) { + super(node); + } + + public PsiElement setName(String newName) { + return replaceNameNode(AwkElementFactory.createFunctionCallName(getProject(), newName)); + } + + @Override + public PsiReference getReference() { +// return new AwkReferenceFunction(this, getNameTextRange()); + return new AwkReferenceFunction(this, TextRange.from(1, getTextLength()-2)); +// return null; + } + + @Override + public @Nullable Icon getIcon(int flags) { + return null; + } +} diff --git a/src/test/testData/parser/BuiltInFuncSpace.txt b/src/test/testData/parser/BuiltInFuncSpace.txt index 30dc5ea..6e72da6 100644 --- a/src/test/testData/parser/BuiltInFuncSpace.txt +++ b/src/test/testData/parser/BuiltInFuncSpace.txt @@ -21,7 +21,8 @@ AWK File PsiElement(AwkTokenType.()('(') AwkGawkFuncCallListImpl(GAWK_FUNC_CALL_LIST) AwkNonUnaryExprImpl(NON_UNARY_EXPR) - PsiElement(AwkTokenType.STRING)('"abc"') + AwkStrImpl(STR) + PsiElement(AwkTokenType.STRING)('"abc"') PsiElement(AwkTokenType.,)(',') AwkNonUnaryExprImpl(NON_UNARY_EXPR) PsiElement(AwkTokenType.NUMBER)('2') diff --git a/src/test/testData/parser/UserFuncSpace.txt b/src/test/testData/parser/UserFuncSpace.txt index be97b55..2aad2d4 100644 --- a/src/test/testData/parser/UserFuncSpace.txt +++ b/src/test/testData/parser/UserFuncSpace.txt @@ -46,7 +46,8 @@ AWK File AwkNonUnaryExprImpl(NON_UNARY_EXPR) PsiElement(AwkTokenType.()('(') AwkNonUnaryExprImpl(NON_UNARY_EXPR) - PsiElement(AwkTokenType.STRING)('"A"') + AwkStrImpl(STR) + PsiElement(AwkTokenType.STRING)('"A"') PsiElement(AwkTokenType.))(')') PsiWhiteSpace(' ') PsiElement(AwkTokenType.})('}') \ No newline at end of file