From 751d7b6aafd93df67071568ae2c9f6930ed1875d Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 5 Jun 2017 17:29:42 +0200 Subject: [PATCH] RegExp: report already defined group name --- .../lang/regexp/validation/RegExpAnnotator.java | 12 ++++++++++++ .../java/codeInsight/RegExpHighlightingTest.java | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java b/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java index c4f04f7213b5..aff8abcc2673 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java @@ -20,7 +20,9 @@ import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.lang.ASTNode; import com.intellij.lang.annotation.Annotation; import com.intellij.lang.annotation.AnnotationHolder; +import com.intellij.lang.annotation.AnnotationSession; import com.intellij.lang.annotation.Annotator; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; @@ -35,7 +37,9 @@ import org.intellij.lang.regexp.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; public final class RegExpAnnotator extends RegExpElementVisitor implements Annotator { @@ -43,6 +47,7 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot "alnum", "alpha", "ascii", "blank", "cntrl", "digit", "graph", "lower", "print", "punct", "space", "upper", "word", "xdigit"); private AnnotationHolder myHolder; private final RegExpLanguageHosts myLanguageHosts; + private final Key> NAMED_GROUP_MAP = new Key<>("REG_EXP_NAMED_GROUP_MAP"); public RegExpAnnotator() { myLanguageHosts = RegExpLanguageHosts.getInstance(); @@ -288,6 +293,13 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot final ASTNode node = group.getNode().findChildByType(RegExpTT.NAME); if (node != null) myHolder.createErrorAnnotation(node, "Invalid group name"); } + final AnnotationSession session = myHolder.getCurrentAnnotationSession(); + final Map namedGroups = NAMED_GROUP_MAP.get(session, new HashMap<>()); + if (namedGroups.isEmpty()) session.putUserData(NAMED_GROUP_MAP, namedGroups); + if (namedGroups.put(name, group) != null) { + final ASTNode node = group.getNode().findChildByType(RegExpTT.NAME); + if (node != null) myHolder.createErrorAnnotation(node, "Group with name '" + name + "' already defined"); + } final RegExpGroup.Type groupType = group.getType(); if (groupType == RegExpGroup.Type.POSITIVE_LOOKBEHIND || groupType == RegExpGroup.Type.NEGATIVE_LOOKBEHIND) { final RegExpLanguageHost.Lookbehind support = myLanguageHosts.supportsLookbehind(group); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/RegExpHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/RegExpHighlightingTest.java index 137b1c9c6b2c..a6165474f638 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/RegExpHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/RegExpHighlightingTest.java @@ -31,6 +31,10 @@ import org.jetbrains.annotations.NotNull; @SuppressWarnings("Annotator") public class RegExpHighlightingTest extends LightCodeInsightFixtureTestCase { + public void testDuplicateNamedGroup() { + doTest("(?abc)(?<name>xyz)"); + } + public void testAnonymousCapturingGroupInspection() { myFixture.enableInspections(new AnonymousGroupInspection()); doTest("(moo)\\1");