Skip to content

Commit

Permalink
Merge pull request #193 from xonixx/remove_trailing_semicolon
Browse files Browse the repository at this point in the history
Remove trailing semicolon
  • Loading branch information
xonixx committed May 15, 2023
2 parents 04525d1 + 278cc0e commit 385e891
Show file tree
Hide file tree
Showing 15 changed files with 124 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/main/java/intellij_awk/Awk.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,9 @@ private statement_for ::=

statement_for_conditions ::= simple_statement_opt SEMICOLON newlines_opt expr_opt SEMICOLON newlines_opt simple_statement_opt

private terminator ::= (NEWLINE|SEMICOLON) newlines_opt
semicolonPsi ::= SEMICOLON

private terminator ::= (NEWLINE|semicolonPsi) newlines_opt

gawk_statement_switch ::= SWITCH LPAREN expr RPAREN newlines_opt switch_action
{ pin=1 }
Expand Down
52 changes: 52 additions & 0 deletions src/main/java/intellij_awk/AwkInspectionUnnecessarySemicolon.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package intellij_awk;

import com.intellij.codeInspection.*;
import com.intellij.codeInspection.util.IntentionFamilyName;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import intellij_awk.psi.AwkSemicolonPsi;
import intellij_awk.psi.AwkTypes;
import intellij_awk.psi.AwkVisitor;
import org.jetbrains.annotations.NotNull;

public class AwkInspectionUnnecessarySemicolon extends LocalInspectionTool {

private static final DeleteUnnecessarySemicolonQuickFix deleteUnnecessarySemicolonQuickFix =
new DeleteUnnecessarySemicolonQuickFix();
public static final String QUICK_FIX_NAME = "Remove unnecessary semicolon";

@Override
public @NotNull PsiElementVisitor buildVisitor(
@NotNull ProblemsHolder holder, boolean isOnTheFly) {

return new AwkVisitor() {
@Override
public void visitSemicolonPsi(@NotNull AwkSemicolonPsi semicolonPsi) {
PsiElement nextSibling = AwkUtil.getNextNotWhitespace(semicolonPsi);
if (nextSibling instanceof AwkSemicolonPsi
|| AwkUtil.isType(nextSibling, AwkTypes.NEWLINE)
|| AwkUtil.isType(nextSibling, AwkTypes.RBRACE)) {
holder.registerProblem(
semicolonPsi,
"Unnecessary semicolon ';'",
ProblemHighlightType.LIKE_UNUSED_SYMBOL,
deleteUnnecessarySemicolonQuickFix);
}
}
};
}

private static class DeleteUnnecessarySemicolonQuickFix implements LocalQuickFix {

@Override
public @IntentionFamilyName @NotNull String getFamilyName() {
return QUICK_FIX_NAME;
}

@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
descriptor.getPsiElement().delete();
}
}
}
7 changes: 6 additions & 1 deletion src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@
level="ERROR"
implementationClass="intellij_awk.AwkInspectionUnresolvedFunction"/>
<localInspection language="AWK" groupName="AWK"
displayName="Unresolved import"
displayName="Unresolved include"
enabledByDefault="true"
level="ERROR"
implementationClass="intellij_awk.AwkInspectionUnresolvedInclude"/>
Expand All @@ -99,6 +99,11 @@
enabledByDefault="true"
level="WARNING"
implementationClass="intellij_awk.AwkInspectionEnforceGlobalVariableNaming"/>
<localInspection language="AWK" groupName="AWK"
displayName="Unneeded semicolon"
enabledByDefault="true"
level="WARNING"
implementationClass="intellij_awk.AwkInspectionUnnecessarySemicolon"/>

<codeInsight.parameterInfo language="AWK"
implementationClass="intellij_awk.AwkParameterInfoHandler"/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<html>
<body>
Reports on unnecessary semicolon.
<!-- tooltip end -->
</body>
</html>
33 changes: 33 additions & 0 deletions src/test/java/intellij_awk/AwkInspectionTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ public class AwkInspectionTests extends BasePlatformTestCase {
new AwkInspectionEnforceGlobalVariableNaming(),
AwkInspectionEnforceGlobalVariableNaming.QUICK_FIX_NAME);

private final Inspection unnecessarySemicolon =
new Inspection(
new AwkInspectionUnnecessarySemicolon(),
AwkInspectionUnnecessarySemicolon.QUICK_FIX_NAME);

public void testDuplicateFunctionParam1() {
checkByFile(duplicateFunctionParam);
}
Expand Down Expand Up @@ -247,6 +252,34 @@ public void testEnforceGlobalVarNaming3() {
checkByFile(enforceGlobalVarNaming);
}

public void testUnnecessarySemicolon1() {
checkByFile(unnecessarySemicolon);
}

public void testUnnecessarySemicolon2() {
checkByFile(unnecessarySemicolon);
}

public void testUnnecessarySemicolon3() {
checkByFile(unnecessarySemicolon);
}

public void testUnnecessarySemicolonNecessary1() {
checkByFileNoProblemAtCaret(unnecessarySemicolon);
}

public void testUnnecessarySemicolonNecessary2() {
checkByFileNoProblemAtCaret(unnecessarySemicolon);
}

public void testUnnecessarySemicolonNecessary3() {
checkByFileNoProblemAtCaret(unnecessarySemicolon);
}

public void testUnnecessarySemicolonNecessary4() {
checkByFileNoProblemAtCaret(unnecessarySemicolon);
}

@Override
protected String getTestDataPath() {
return "src/test/testData/inspection";
Expand Down
3 changes: 3 additions & 0 deletions src/test/testData/inspection/unnecessarySemicolon1.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BEGIN {
print 123;<caret>
}
3 changes: 3 additions & 0 deletions src/test/testData/inspection/unnecessarySemicolon1After.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BEGIN {
print 123<caret>
}
1 change: 1 addition & 0 deletions src/test/testData/inspection/unnecessarySemicolon2.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ print 123;<caret> }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ print 123<caret> }
3 changes: 3 additions & 0 deletions src/test/testData/inspection/unnecessarySemicolon3.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BEGIN {
print 123<caret>;;
}
3 changes: 3 additions & 0 deletions src/test/testData/inspection/unnecessarySemicolon3After.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BEGIN {
print 123<caret>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
function f() { while(1);<caret> }
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
function f() {
for(;;);<caret>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
if(1) ;<caret>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
BEGIN {
;<caret>
}

0 comments on commit 385e891

Please sign in to comment.