From 613279632158c8cafd120b0e8404dcbfcbe59963 Mon Sep 17 00:00:00 2001 From: Filippova Maria Date: Mon, 22 Aug 2022 16:11:44 +0200 Subject: [PATCH] WI-60369 make support of pcre numbered group calling a part of RegExpBackRefImpl GitOrigin-RevId: e4369e5e8c60c2a061152c9df82434d5ad4ede84 --- .../org/intellij/lang/regexp/_RegExLexer.java | 365 +++++++++--------- .../lang/regexp/RegExpBraceMatcher.java | 1 - .../lang/regexp/RegExpHighlighter.java | 1 - .../intellij/lang/regexp/RegExpParser.java | 10 +- .../inspection/RegExpEquivalenceChecker.java | 3 +- .../lang/regexp/psi/RegExpNamedGroupRef.java | 1 - .../regexp/psi/impl/RegExpBackrefImpl.java | 12 +- .../psi/impl/RegExpNamedGroupRefImpl.java | 30 -- .../intellij/lang/regexp/regexp-lexer.flex | 10 +- .../regexp/validation/RegExpAnnotator.java | 9 +- .../testData/lexer/numberedGroupRef.txt | 4 +- 11 files changed, 202 insertions(+), 244 deletions(-) diff --git a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java index 669df65a7559..066191afbade 100644 --- a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java +++ b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java @@ -217,20 +217,20 @@ class _RegExLexer implements FlexLexer { "\1\66\1\65\1\71\1\73\2\12\1\75\2\76\1\77"+ "\1\100\1\101\1\102\1\103\1\104\1\105\1\106\1\107"+ "\2\26\1\126\1\127\1\130\1\131\1\132\1\133\1\134"+ - "\1\0\1\135\1\136\1\0\1\137\1\140\1\141\1\142"+ - "\1\143\1\144\1\0\1\145\1\146\1\147\2\0\1\150"+ - "\6\0\1\151\1\152\1\153\1\154\2\155\1\103\1\156"+ - "\1\157\1\160\1\161\1\162\1\163\1\164\1\165\1\166"+ - "\1\0\1\167\1\151\1\154\2\155\1\103\1\157\1\161"+ - "\2\26\1\170\1\171\1\172\1\173\1\0\1\174\1\175"+ - "\1\176\1\0\1\177\1\0\1\200\4\0\1\151\2\155"+ - "\1\103\1\201\1\161\1\202\1\203\1\151\2\155\1\103"+ - "\1\201\1\161\2\26\1\204\1\205\1\206\1\151\1\0"+ - "\1\207\1\161\1\151\1\207\1\161\2\26\1\0\2\210"+ - "\1\211\2\26\1\0\4\212"; + "\1\0\1\135\1\0\1\136\1\137\1\0\1\140\1\141"+ + "\1\142\1\143\1\0\1\144\1\145\1\146\2\0\1\147"+ + "\6\0\1\150\1\151\1\152\1\153\2\154\1\103\1\155"+ + "\1\156\1\157\1\160\1\161\1\162\1\163\1\164\1\165"+ + "\1\0\1\166\1\150\1\153\2\154\1\103\1\156\1\160"+ + "\2\26\1\167\1\170\1\171\1\0\1\172\1\173\1\0"+ + "\1\174\1\175\1\176\1\0\1\177\1\0\1\200\4\0"+ + "\1\150\2\154\1\103\1\201\1\160\1\202\1\203\1\150"+ + "\2\154\1\103\1\201\1\160\2\26\1\0\1\204\1\205"+ + "\1\206\1\150\1\0\1\207\1\160\1\150\1\207\1\160"+ + "\2\26\1\0\2\210\1\211\2\26\1\0\4\212"; private static int [] zzUnpackAction() { - int [] result = new int[275]; + int [] result = new int[278]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -276,23 +276,23 @@ class _RegExLexer implements FlexLexer { "\0\u096c\0\u096c\0\u096c\0\u096c\0\u131b\0\u096c\0\u135e\0\u096c"+ "\0\u096c\0\u096c\0\u13a1\0\u096c\0\u13e4\0\u096c\0\u1427\0\u146a"+ "\0\u096c\0\u14ad\0\u14f0\0\u0605\0\u0605\0\u0605\0\u0605\0\u0605"+ - "\0\u0605\0\u0605\0\u1533\0\u0605\0\u0605\0\u1576\0\u0605\0\u0605"+ - "\0\u15b9\0\u0605\0\u0605\0\u0605\0\u15fc\0\u0605\0\u0605\0\u0605"+ - "\0\u163f\0\u1682\0\u0605\0\u16c5\0\u1708\0\u174b\0\u178e\0\u17d1"+ - "\0\u1814\0\u1857\0\u0605\0\u0605\0\u0605\0\u189a\0\u18dd\0\u1920"+ - "\0\u0605\0\u1963\0\u0605\0\u19a6\0\u0605\0\u0605\0\u0605\0\u0605"+ - "\0\u0605\0\u19e9\0\u0605\0\u1a2c\0\u096c\0\u1a6f\0\u1ab2\0\u1af5"+ - "\0\u1b38\0\u1b7b\0\u1bbe\0\u1c01\0\u0605\0\u0605\0\u0605\0\u0605"+ - "\0\u1c44\0\u0605\0\u0605\0\u0605\0\u1c87\0\u0605\0\u1cca\0\u0605"+ - "\0\u1d0d\0\u1d50\0\u1d93\0\u1dd6\0\u1e19\0\u1e5c\0\u0605\0\u0605"+ - "\0\u0605\0\u1e9f\0\u0605\0\u0605\0\u1ee2\0\u1f25\0\u096c\0\u096c"+ - "\0\u096c\0\u1f68\0\u1fab\0\u1fee\0\u0605\0\u0605\0\u0605\0\u0605"+ - "\0\u2031\0\u0605\0\u2074\0\u096c\0\u096c\0\u20b7\0\u20fa\0\u213d"+ - "\0\u2180\0\u0605\0\u096c\0\u096c\0\u21c3\0\u2206\0\u2249\0\u228c"+ - "\0\u22cf\0\u2312\0\u0605"; + "\0\u0605\0\u0605\0\u1533\0\u0605\0\u1576\0\u0605\0\u0605\0\u15b9"+ + "\0\u15fc\0\u0605\0\u0605\0\u0605\0\u163f\0\u0605\0\u0605\0\u0605"+ + "\0\u1682\0\u16c5\0\u0605\0\u1708\0\u174b\0\u178e\0\u17d1\0\u1814"+ + "\0\u1857\0\u189a\0\u0605\0\u0605\0\u0605\0\u18dd\0\u1920\0\u1963"+ + "\0\u0605\0\u19a6\0\u0605\0\u19e9\0\u0605\0\u0605\0\u0605\0\u0605"+ + "\0\u0605\0\u1a2c\0\u0605\0\u1a6f\0\u096c\0\u1ab2\0\u1af5\0\u1b38"+ + "\0\u1b7b\0\u1bbe\0\u1c01\0\u1c44\0\u0605\0\u0605\0\u0605\0\u1c87"+ + "\0\u0605\0\u0605\0\u1cca\0\u0605\0\u0605\0\u0605\0\u1d0d\0\u0605"+ + "\0\u1d50\0\u0605\0\u1d93\0\u1dd6\0\u1e19\0\u1e5c\0\u1e9f\0\u1ee2"+ + "\0\u0605\0\u0605\0\u0605\0\u1f25\0\u0605\0\u0605\0\u1f68\0\u1fab"+ + "\0\u096c\0\u096c\0\u096c\0\u1fee\0\u2031\0\u2074\0\u20b7\0\u0605"+ + "\0\u0605\0\u0605\0\u0605\0\u20fa\0\u0605\0\u213d\0\u096c\0\u096c"+ + "\0\u2180\0\u21c3\0\u2206\0\u2249\0\u0605\0\u096c\0\u096c\0\u228c"+ + "\0\u22cf\0\u2312\0\u2355\0\u2398\0\u23db\0\u0605"; private static int [] zzUnpackRowMap() { - int [] result = new int[275]; + int [] result = new int[278]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -402,124 +402,125 @@ class _RegExLexer implements FlexLexer { "\3\157\2\160\3\161\1\162\1\163\1\164\2\162\2\143"+ "\1\165\1\166\1\167\1\170\2\165\1\143\1\171\1\250"+ "\1\162\2\143\1\162\2\143\1\173\1\162\1\143\1\250"+ - "\76\0\1\251\6\0\1\252\10\0\1\253\1\0\1\254"+ - "\3\0\1\253\1\255\22\0\1\256\4\0\1\254\3\0"+ - "\1\257\1\260\1\254\3\0\2\254\4\0\1\261\1\262"+ - "\1\0\1\263\1\264\1\265\1\0\1\266\6\0\1\267"+ - "\102\0\1\270\2\0\1\271\4\0\1\140\34\0\1\140"+ - "\5\0\1\140\3\0\2\140\1\272\21\0\1\273\2\0"+ - "\1\274\4\0\1\275\34\0\1\275\5\0\1\275\3\0"+ - "\2\275\32\0\1\276\34\0\1\276\5\0\1\276\3\0"+ - "\2\276\1\277\20\0\1\300\102\0\1\301\53\0\1\302"+ - "\3\0\2\302\4\0\1\303\1\304\7\0\103\305\52\0"+ - "\1\306\11\0\1\307\1\306\67\0\1\310\5\0\1\310"+ - "\3\0\2\310\21\0\1\311\20\0\2\312\1\0\1\312"+ - "\4\0\2\312\1\0\2\312\6\0\3\312\5\0\1\312"+ - "\3\0\2\312\21\0\1\313\20\0\2\314\1\0\1\314"+ - "\4\0\2\314\1\0\2\314\6\0\3\314\5\0\1\314"+ - "\3\0\2\314\107\0\1\315\1\316\16\0\1\317\104\0"+ - "\1\207\1\0\1\207\1\0\1\210\6\0\26\207\1\210"+ - "\3\207\2\0\1\210\3\207\2\210\1\0\1\207\1\0"+ - "\1\207\2\0\1\207\3\0\1\207\7\0\1\320\17\0"+ - "\2\213\1\0\1\213\4\0\2\213\1\0\2\213\6\0"+ - "\3\213\5\0\1\213\3\0\2\213\74\0\1\321\12\0"+ - "\1\322\6\0\1\323\5\0\1\301\53\0\1\302\3\0"+ - "\2\302\21\0\1\301\3\0\7\77\5\0\32\77\2\0"+ - "\1\324\3\77\2\324\1\0\1\77\1\0\1\77\2\0"+ - "\1\77\3\0\1\77\2\0\10\305\7\325\5\305\32\325"+ - "\2\305\6\325\1\305\1\325\1\305\1\325\2\305\1\325"+ - "\3\305\1\325\2\305\10\0\7\77\5\0\26\77\1\326"+ - "\3\77\2\0\4\77\1\327\1\326\1\0\1\77\1\0"+ - "\1\77\2\0\1\77\3\0\1\77\12\0\7\77\5\0"+ - "\26\77\1\330\3\77\2\0\1\330\3\77\2\330\1\0"+ + "\76\0\1\251\6\0\1\252\10\0\1\253\5\0\1\253"+ + "\1\254\22\0\1\255\10\0\1\256\1\257\1\260\3\0"+ + "\2\260\4\0\1\261\1\262\1\0\1\263\1\264\1\265"+ + "\1\0\1\266\6\0\1\267\102\0\1\270\2\0\1\271"+ + "\4\0\1\140\34\0\1\140\5\0\1\140\3\0\2\140"+ + "\1\272\21\0\1\273\2\0\1\274\4\0\1\275\34\0"+ + "\1\275\5\0\1\275\3\0\2\275\32\0\1\276\34\0"+ + "\1\276\5\0\1\276\3\0\2\276\1\277\20\0\1\300"+ + "\102\0\1\301\53\0\1\302\3\0\2\302\4\0\1\303"+ + "\1\304\7\0\103\305\52\0\1\306\11\0\1\307\1\306"+ + "\67\0\1\310\5\0\1\310\3\0\2\310\21\0\1\311"+ + "\20\0\2\312\1\0\1\312\4\0\2\312\1\0\2\312"+ + "\6\0\3\312\5\0\1\312\3\0\2\312\21\0\1\313"+ + "\20\0\2\314\1\0\1\314\4\0\2\314\1\0\2\314"+ + "\6\0\3\314\5\0\1\314\3\0\2\314\107\0\1\315"+ + "\1\316\16\0\1\317\104\0\1\207\1\0\1\207\1\0"+ + "\1\210\6\0\26\207\1\210\3\207\2\0\1\210\3\207"+ + "\2\210\1\0\1\207\1\0\1\207\2\0\1\207\3\0"+ + "\1\207\7\0\1\320\17\0\2\213\1\0\1\213\4\0"+ + "\2\213\1\0\2\213\6\0\3\213\5\0\1\213\3\0"+ + "\2\213\74\0\1\321\12\0\1\322\6\0\1\323\5\0"+ + "\1\301\53\0\1\302\3\0\2\302\21\0\1\301\3\0"+ + "\7\77\5\0\32\77\2\0\1\324\3\77\2\324\1\0"+ + "\1\77\1\0\1\77\2\0\1\77\3\0\1\77\2\0"+ + "\10\305\7\325\5\305\32\325\2\305\6\325\1\305\1\325"+ + "\1\305\1\325\2\305\1\325\3\305\1\325\2\305\10\0"+ + "\7\77\5\0\26\77\1\326\3\77\2\0\4\77\1\327"+ + "\1\326\1\0\1\77\1\0\1\77\2\0\1\77\3\0"+ + "\1\77\12\0\7\77\5\0\26\77\1\330\3\77\2\0"+ + "\1\330\3\77\2\330\1\0\1\77\1\0\1\77\2\0"+ + "\1\77\3\0\1\77\6\0\1\311\3\0\7\77\5\0"+ + "\1\77\2\331\1\77\1\331\4\77\2\331\1\77\2\331"+ + "\6\77\3\331\3\77\2\0\1\331\3\77\2\331\1\0"+ "\1\77\1\0\1\77\2\0\1\77\3\0\1\77\6\0"+ - "\1\311\3\0\7\77\5\0\1\77\2\331\1\77\1\331"+ - "\4\77\2\331\1\77\2\331\6\77\3\331\3\77\2\0"+ - "\1\331\3\77\2\331\1\0\1\77\1\0\1\77\2\0"+ - "\1\77\3\0\1\77\6\0\1\313\3\0\7\77\5\0"+ - "\1\77\2\332\1\77\1\332\4\77\2\332\1\77\2\332"+ - "\6\77\3\332\3\77\2\0\1\332\3\77\2\332\1\0"+ - "\1\77\1\0\1\77\2\0\1\77\3\0\1\77\12\0"+ - "\7\77\5\0\25\77\1\333\4\77\2\0\6\77\1\0"+ - "\1\77\1\0\1\77\2\0\1\77\3\0\1\77\12\0"+ - "\7\77\5\0\30\77\1\334\1\77\2\0\6\77\1\0"+ - "\1\77\1\0\1\77\2\0\1\77\3\0\1\77\17\0"+ - "\1\254\34\0\1\254\5\0\1\254\3\0\2\254\73\0"+ - "\1\264\1\335\12\0\1\336\67\0\1\337\21\0\1\340"+ - "\1\0\3\341\1\0\77\341\5\0\1\342\102\0\1\270"+ + "\1\313\3\0\7\77\5\0\1\77\2\332\1\77\1\332"+ + "\4\77\2\332\1\77\2\332\6\77\3\332\3\77\2\0"+ + "\1\332\3\77\2\332\1\0\1\77\1\0\1\77\2\0"+ + "\1\77\3\0\1\77\12\0\7\77\5\0\25\77\1\333"+ + "\4\77\2\0\6\77\1\0\1\77\1\0\1\77\2\0"+ + "\1\77\3\0\1\77\12\0\7\77\5\0\30\77\1\334"+ + "\1\77\2\0\6\77\1\0\1\77\1\0\1\77\2\0"+ + "\1\77\3\0\1\77\62\0\1\260\3\0\2\260\73\0"+ + "\1\264\1\335\12\0\1\336\13\0\1\337\46\0\1\340"+ + "\5\0\1\340\3\0\2\340\74\0\1\341\21\0\1\342"+ + "\1\0\3\343\1\0\77\343\5\0\1\344\102\0\1\270"+ "\2\0\1\271\4\0\1\272\34\0\1\272\5\0\1\272"+ - "\3\0\2\272\22\0\1\343\102\0\1\344\2\0\1\345"+ + "\3\0\2\272\22\0\1\345\102\0\1\346\2\0\1\347"+ "\4\0\1\275\34\0\1\275\5\0\1\275\3\0\2\275"+ - "\22\0\1\346\7\0\1\276\34\0\1\276\5\0\1\276"+ - "\3\0\2\276\1\347\21\0\1\350\7\0\1\351\34\0"+ - "\1\351\5\0\1\351\3\0\2\351\44\0\1\352\66\0"+ - "\1\353\44\0\1\354\3\0\2\354\67\0\1\355\5\0"+ - "\1\355\3\0\2\355\67\0\1\356\11\0\2\356\67\0"+ - "\1\357\11\0\2\357\67\0\1\360\5\0\1\360\3\0"+ - "\2\360\42\0\2\361\1\0\1\361\4\0\2\361\1\0"+ - "\2\361\6\0\3\361\5\0\1\361\3\0\2\361\42\0"+ - "\2\362\1\0\1\362\4\0\2\362\1\0\2\362\6\0"+ - "\3\362\5\0\1\362\3\0\2\362\74\0\1\363\21\0"+ - "\1\364\11\0\7\77\5\0\26\77\1\365\3\77\2\0"+ - "\1\365\3\77\2\365\1\0\1\77\1\0\1\77\2\0"+ - "\1\77\3\0\1\77\12\0\7\77\5\0\26\77\1\366"+ - "\3\77\2\0\4\77\2\366\1\0\1\77\1\0\1\77"+ + "\22\0\1\350\7\0\1\276\34\0\1\276\5\0\1\276"+ + "\3\0\2\276\1\351\21\0\1\352\7\0\1\353\34\0"+ + "\1\353\5\0\1\353\3\0\2\353\44\0\1\354\66\0"+ + "\1\355\44\0\1\356\3\0\2\356\67\0\1\357\5\0"+ + "\1\357\3\0\2\357\67\0\1\360\11\0\2\360\67\0"+ + "\1\361\11\0\2\361\67\0\1\362\5\0\1\362\3\0"+ + "\2\362\42\0\2\363\1\0\1\363\4\0\2\363\1\0"+ + "\2\363\6\0\3\363\5\0\1\363\3\0\2\363\42\0"+ + "\2\364\1\0\1\364\4\0\2\364\1\0\2\364\6\0"+ + "\3\364\5\0\1\364\3\0\2\364\74\0\1\365\21\0"+ + "\1\366\11\0\7\77\5\0\26\77\1\367\3\77\2\0"+ + "\1\367\3\77\2\367\1\0\1\77\1\0\1\77\2\0"+ + "\1\77\3\0\1\77\12\0\7\77\5\0\26\77\1\370"+ + "\3\77\2\0\4\77\2\370\1\0\1\77\1\0\1\77"+ "\2\0\1\77\3\0\1\77\12\0\7\77\5\0\26\77"+ - "\1\367\3\77\2\0\4\77\2\367\1\0\1\77\1\0"+ + "\1\371\3\77\2\0\4\77\2\371\1\0\1\77\1\0"+ "\1\77\2\0\1\77\3\0\1\77\12\0\7\77\5\0"+ - "\26\77\1\370\3\77\2\0\1\370\3\77\2\370\1\0"+ + "\26\77\1\372\3\77\2\0\1\372\3\77\2\372\1\0"+ "\1\77\1\0\1\77\2\0\1\77\3\0\1\77\12\0"+ - "\7\77\5\0\1\77\2\371\1\77\1\371\4\77\2\371"+ - "\1\77\2\371\6\77\3\371\3\77\2\0\1\371\3\77"+ - "\2\371\1\0\1\77\1\0\1\77\2\0\1\77\3\0"+ - "\1\77\12\0\7\77\5\0\1\77\2\372\1\77\1\372"+ - "\4\77\2\372\1\77\2\372\6\77\3\372\3\77\2\0"+ - "\1\372\3\77\2\372\1\0\1\77\1\0\1\77\2\0"+ - "\1\77\3\0\1\77\12\0\7\77\5\0\17\77\1\373"+ + "\7\77\5\0\1\77\2\373\1\77\1\373\4\77\2\373"+ + "\1\77\2\373\6\77\3\373\3\77\2\0\1\373\3\77"+ + "\2\373\1\0\1\77\1\0\1\77\2\0\1\77\3\0"+ + "\1\77\12\0\7\77\5\0\1\77\2\374\1\77\1\374"+ + "\4\77\2\374\1\77\2\374\6\77\3\374\3\77\2\0"+ + "\1\374\3\77\2\374\1\0\1\77\1\0\1\77\2\0"+ + "\1\77\3\0\1\77\12\0\7\77\5\0\17\77\1\375"+ "\12\77\2\0\6\77\1\0\1\77\1\0\1\77\2\0"+ - "\1\77\3\0\1\77\12\0\7\77\5\0\10\77\1\374"+ + "\1\77\3\0\1\77\12\0\7\77\5\0\10\77\1\376"+ "\21\77\2\0\6\77\1\0\1\77\1\0\1\77\2\0"+ - "\1\77\3\0\1\77\2\0\3\341\1\375\77\341\5\0"+ - "\1\376\102\0\1\346\7\0\1\347\34\0\1\347\5\0"+ - "\1\347\3\0\2\347\22\0\1\377\7\0\1\351\34\0"+ - "\1\351\5\0\1\351\3\0\2\351\22\0\1\154\155\0"+ - "\1\354\3\0\2\354\22\0\1\u0100\44\0\1\u0101\5\0"+ - "\1\u0101\3\0\2\u0101\67\0\1\u0100\5\0\1\u0100\3\0"+ - "\2\u0100\67\0\1\u0102\11\0\2\u0102\42\0\2\u0103\1\0"+ - "\1\u0103\4\0\2\u0103\1\0\2\u0103\6\0\3\u0103\5\0"+ - "\1\u0103\3\0\2\u0103\25\0\7\77\5\0\26\77\1\u0104"+ - "\3\77\2\0\1\u0104\3\77\2\u0104\1\0\1\77\1\0"+ + "\1\77\3\0\1\77\5\0\1\337\46\0\1\377\5\0"+ + "\1\377\3\0\2\377\15\0\3\343\1\u0100\77\343\5\0"+ + "\1\u0101\102\0\1\350\7\0\1\351\34\0\1\351\5\0"+ + "\1\351\3\0\2\351\22\0\1\u0102\7\0\1\353\34\0"+ + "\1\353\5\0\1\353\3\0\2\353\22\0\1\154\155\0"+ + "\1\356\3\0\2\356\22\0\1\u0103\44\0\1\u0104\5\0"+ + "\1\u0104\3\0\2\u0104\67\0\1\u0103\5\0\1\u0103\3\0"+ + "\2\u0103\67\0\1\u0105\11\0\2\u0105\42\0\2\u0106\1\0"+ + "\1\u0106\4\0\2\u0106\1\0\2\u0106\6\0\3\u0106\5\0"+ + "\1\u0106\3\0\2\u0106\25\0\7\77\5\0\26\77\1\u0107"+ + "\3\77\2\0\1\u0107\3\77\2\u0107\1\0\1\77\1\0"+ "\1\77\2\0\1\77\3\0\1\77\12\0\7\77\5\0"+ - "\26\77\1\u0105\3\77\2\0\4\77\2\u0105\1\0\1\77"+ + "\26\77\1\u0108\3\77\2\0\4\77\2\u0108\1\0\1\77"+ "\1\0\1\77\2\0\1\77\3\0\1\77\12\0\7\77"+ - "\5\0\1\77\2\u0106\1\77\1\u0106\4\77\2\u0106\1\77"+ - "\2\u0106\6\77\3\u0106\3\77\2\0\1\u0106\3\77\2\u0106"+ + "\5\0\1\77\2\u0109\1\77\1\u0109\4\77\2\u0109\1\77"+ + "\2\u0109\6\77\3\u0109\3\77\2\0\1\u0109\3\77\2\u0109"+ "\1\0\1\77\1\0\1\77\2\0\1\77\3\0\1\77"+ - "\12\0\7\77\5\0\27\77\1\u0107\2\77\2\0\6\77"+ + "\12\0\7\77\5\0\27\77\1\u010a\2\77\2\0\6\77"+ "\1\0\1\77\1\0\1\77\2\0\1\77\3\0\1\77"+ - "\12\0\7\77\5\0\17\77\1\u0108\12\77\2\0\6\77"+ + "\12\0\7\77\5\0\17\77\1\u010b\12\77\2\0\6\77"+ "\1\0\1\77\1\0\1\77\2\0\1\77\3\0\1\77"+ - "\7\0\1\u0100\44\0\1\u0109\5\0\1\u0109\3\0\2\u0109"+ - "\42\0\2\u010a\1\0\1\u010a\4\0\2\u010a\1\0\2\u010a"+ - "\6\0\3\u010a\5\0\1\u010a\3\0\2\u010a\25\0\7\77"+ - "\5\0\1\77\2\u010b\1\77\1\u010b\4\77\2\u010b\1\77"+ - "\2\u010b\6\77\3\u010b\3\77\2\0\1\u010b\3\77\2\u010b"+ - "\1\0\1\77\1\0\1\77\2\0\1\77\3\0\1\77"+ - "\12\0\7\77\5\0\24\77\1\u010c\5\77\2\0\6\77"+ - "\1\0\1\77\1\0\1\77\2\0\1\77\3\0\1\77"+ - "\12\0\7\77\5\0\31\77\1\u010d\2\0\6\77\1\0"+ - "\1\77\1\0\1\77\2\0\1\77\3\0\1\77\7\0"+ - "\1\u0100\105\0\7\77\5\0\27\77\1\u010e\2\77\2\0"+ + "\5\0\1\337\104\0\1\u0103\44\0\1\u010c\5\0\1\u010c"+ + "\3\0\2\u010c\42\0\2\u010d\1\0\1\u010d\4\0\2\u010d"+ + "\1\0\2\u010d\6\0\3\u010d\5\0\1\u010d\3\0\2\u010d"+ + "\25\0\7\77\5\0\1\77\2\u010e\1\77\1\u010e\4\77"+ + "\2\u010e\1\77\2\u010e\6\77\3\u010e\3\77\2\0\1\u010e"+ + "\3\77\2\u010e\1\0\1\77\1\0\1\77\2\0\1\77"+ + "\3\0\1\77\12\0\7\77\5\0\24\77\1\u010f\5\77"+ + "\2\0\6\77\1\0\1\77\1\0\1\77\2\0\1\77"+ + "\3\0\1\77\12\0\7\77\5\0\31\77\1\u0110\2\0"+ "\6\77\1\0\1\77\1\0\1\77\2\0\1\77\3\0"+ - "\1\77\12\0\7\77\5\0\32\77\1\u010f\1\u0110\6\77"+ - "\1\0\1\77\1\0\1\77\2\0\1\77\3\0\1\77"+ - "\61\0\1\u0110\24\0\1\u0111\13\0\1\u0110\34\0\1\u0110"+ - "\5\0\1\u0110\3\0\2\u0110\32\0\1\u0112\34\0\1\u0112"+ - "\5\0\1\u0112\3\0\2\u0112\32\0\1\u0113\34\0\1\u0113"+ - "\5\0\1\u0113\3\0\2\u0113\15\0"; + "\1\77\7\0\1\u0103\105\0\7\77\5\0\27\77\1\u0111"+ + "\2\77\2\0\6\77\1\0\1\77\1\0\1\77\2\0"+ + "\1\77\3\0\1\77\12\0\7\77\5\0\32\77\1\u0112"+ + "\1\u0113\6\77\1\0\1\77\1\0\1\77\2\0\1\77"+ + "\3\0\1\77\61\0\1\u0113\24\0\1\u0114\13\0\1\u0113"+ + "\34\0\1\u0113\5\0\1\u0113\3\0\2\u0113\32\0\1\u0115"+ + "\34\0\1\u0115\5\0\1\u0115\3\0\2\u0115\32\0\1\u0116"+ + "\34\0\1\u0116\5\0\1\u0116\3\0\2\u0116\15\0"; private static int [] zzUnpackTrans() { - int [] result = new int[9045]; + int [] result = new int[9246]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -565,15 +566,16 @@ class _RegExLexer implements FlexLexer { "\3\11\1\1\4\11\2\1\2\11\1\1\4\11\1\1"+ "\1\11\1\1\1\11\2\1\1\11\1\1\12\11\1\0"+ "\1\11\1\1\3\11\1\1\1\0\2\11\25\1\7\11"+ - "\1\0\2\11\1\0\2\11\1\1\3\11\1\0\3\11"+ - "\2\0\1\11\6\0\1\1\3\11\3\1\1\11\1\1"+ - "\1\11\1\1\5\11\1\0\1\11\11\1\4\11\1\0"+ - "\3\11\1\0\1\11\1\0\1\11\4\0\2\1\3\11"+ - "\1\1\2\11\10\1\4\11\1\0\1\11\6\1\1\0"+ - "\1\11\4\1\1\0\3\1\1\11"; + "\1\0\1\11\1\0\2\11\1\0\1\1\3\11\1\0"+ + "\3\11\2\0\1\11\6\0\1\1\3\11\3\1\1\11"+ + "\1\1\1\11\1\1\5\11\1\0\1\11\11\1\3\11"+ + "\1\0\2\11\1\0\3\11\1\0\1\11\1\0\1\11"+ + "\4\0\2\1\3\11\1\1\2\11\10\1\1\0\4\11"+ + "\1\0\1\11\6\1\1\0\1\11\4\1\1\0\3\1"+ + "\1\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[275]; + int [] result = new int[278]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -1496,54 +1498,50 @@ class _RegExLexer implements FlexLexer { // fall through case 230: break; case 93: - // lookahead expression with fixed lookahead length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzMarkedPos, -1); - { if (allowPcreNumberedGroupRef) { - yybegin(PCRE_NUMBERED_GROUP); - return RegExpTT.PCRE_NUMBERED_GROUP_REF; - } - else { yypushback(yylength() - 2); yybegin(OPTIONS); return RegExpTT.SET_OPTIONS; } + { return RegExpTT.PCRE_BRANCH_RESET; } // fall through case 231: break; case 94: - { return RegExpTT.PCRE_BRANCH_RESET; + { return RegExpTT.ATOMIC_GROUP; } // fall through case 232: break; case 95: - { return RegExpTT.ATOMIC_GROUP; + { return RegExpTT.POS_LOOKAHEAD; } // fall through case 233: break; case 96: - { return RegExpTT.POS_LOOKAHEAD; + { yybegin(NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_NAMED_GROUP; } // fall through case 234: break; case 97: - { yybegin(NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_NAMED_GROUP; + { yybegin(QUOTED_NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_QUOTED_NAMED_GROUP; } // fall through case 235: break; case 98: - { yybegin(QUOTED_NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_QUOTED_NAMED_GROUP; + { return RegExpTT.NON_CAPT_GROUP; } // fall through case 236: break; case 99: - { return RegExpTT.NON_CAPT_GROUP; + { yybegin(NAMED_GROUP); return RegExpTT.PCRE_RECURSIVE_NAMED_GROUP_REF; } // fall through case 237: break; case 100: - { yybegin(NAMED_GROUP); return RegExpTT.PCRE_RECURSIVE_NAMED_GROUP_REF; + { return RegExpTT.NEG_LOOKAHEAD; } // fall through case 238: break; case 101: - { return RegExpTT.NEG_LOOKAHEAD; + // lookahead expression with fixed base length + zzMarkedPos = Character.offsetByCodePoints + (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); + { return (allowDanglingMetacharacters != TRUE) ? RegExpTT.LBRACE : RegExpTT.CHARACTER; } // fall through case 239: break; @@ -1551,7 +1549,7 @@ class _RegExLexer implements FlexLexer { // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); - { return (allowDanglingMetacharacters != TRUE) ? RegExpTT.LBRACE : RegExpTT.CHARACTER; + { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; } // fall through case 240: break; @@ -1559,109 +1557,110 @@ class _RegExLexer implements FlexLexer { // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); - { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; + { if (allowOmitBothNumbersInQuantifiers || allowDanglingMetacharacters != TRUE) { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; } else return RegExpTT.CHARACTER; } // fall through case 241: break; case 104: - // lookahead expression with fixed base length - zzMarkedPos = Character.offsetByCodePoints - (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); - { if (allowOmitBothNumbersInQuantifiers || allowDanglingMetacharacters != TRUE) { yypushstate(QUANTIFIER); return RegExpTT.LBRACE; } else return RegExpTT.CHARACTER; + { return allowPcreBackReferences ? RegExpTT.BACKREF : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN; } // fall through case 242: break; case 105: - { return allowPcreBackReferences ? RegExpTT.BACKREF : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN; + { yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP_CALL; } // fall through case 243: break; case 106: - { yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP_CALL; + { yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP_CALL; } // fall through case 244: break; case 107: - { yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP_CALL; + { if (xmlSchemaMode) { yypushback(1); return RegExpTT.CHAR_CLASS; } else return RegExpTT.CTRL; } // fall through case 245: break; case 108: - { if (xmlSchemaMode) { yypushback(1); return RegExpTT.CHAR_CLASS; } else return RegExpTT.CTRL; + { return RegExpTT.OCT_CHAR; } // fall through case 246: break; case 109: - { return RegExpTT.OCT_CHAR; - } - // fall through - case 247: break; - case 110: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 2); { if (allowExtendedUnicodeCharacter) yypushstate(EMBRACED_HEX); else return RegExpTT.BAD_HEX_VALUE; } // fall through - case 248: break; - case 111: + case 247: break; + case 110: { if (allowOneHexCharEscape) { return RegExpTT.HEX_CHAR; } else { yypushback(1); return RegExpTT.BAD_HEX_VALUE; } } // fall through - case 249: break; - case 112: + case 248: break; + case 111: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 2); { if (allowExtendedUnicodeCharacter) yypushstate(EMBRACED_HEX); else return StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN; } // fall through + case 249: break; + case 112: + { yypushback(yylength() - 2); return StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN; + } + // fall through case 250: break; case 113: - { yypushback(yylength() - 2); return StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN; + { yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP_REF; } // fall through case 251: break; case 114: - { yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP_REF; + { yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP_REF; } // fall through case 252: break; case 115: - { yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP_REF; - } - // fall through - case 253: break; - case 116: // lookahead expression with fixed base length zzMarkedPos = Character.offsetByCodePoints (zzBufferL/*, zzStartRead, zzEndRead - zzStartRead*/, zzStartRead, 1); { return RegExpTT.CHARACTER; } // fall through + case 253: break; + case 116: + { yypopstate(); return (yycharat(-1) == 'u') ? RegExpTT.UNICODE_CHAR : RegExpTT.HEX_CHAR; + } + // fall through case 254: break; case 117: - { yypopstate(); return (yycharat(-1) == 'u') ? RegExpTT.UNICODE_CHAR : RegExpTT.HEX_CHAR; + { yybegin(YYINITIAL); return RegExpTT.POS_LOOKAHEAD; } // fall through case 255: break; case 118: - { yybegin(YYINITIAL); return RegExpTT.POS_LOOKAHEAD; + { yybegin(YYINITIAL); return RegExpTT.NEG_LOOKAHEAD; } // fall through case 256: break; case 119: - { yybegin(YYINITIAL); return RegExpTT.NEG_LOOKAHEAD; + { yybegin(PY_NAMED_GROUP_REF); return RegExpTT.PYTHON_NAMED_GROUP_REF; } // fall through case 257: break; case 120: - { yybegin(PY_NAMED_GROUP_REF); return RegExpTT.PYTHON_NAMED_GROUP_REF; + { yybegin(NAMED_GROUP); capturingGroupCount++; return RegExpTT.PYTHON_NAMED_GROUP; } // fall through case 258: break; case 121: - { yybegin(NAMED_GROUP); capturingGroupCount++; return RegExpTT.PYTHON_NAMED_GROUP; + { if (allowPcreNumberedGroupRef) { + yybegin(PCRE_NUMBERED_GROUP); + return RegExpTT.PCRE_NUMBERED_GROUP_REF; + } + else { yypushback(yylength() - 2); yybegin(OPTIONS); return RegExpTT.SET_OPTIONS; } } // fall through case 259: break; diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java index 881a212c03c5..3ca0b091b1f1 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java @@ -21,7 +21,6 @@ public class RegExpBraceMatcher implements PairedBraceMatcher { new BracePair(RegExpTT.PYTHON_NAMED_GROUP_REF, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.PCRE_RECURSIVE_NAMED_GROUP_REF, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.CONDITIONAL, RegExpTT.GROUP_END, true), - new BracePair(RegExpTT.PCRE_NUMBERED_GROUP_REF, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.PCRE_BRANCH_RESET, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.RUBY_NAMED_GROUP, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.RUBY_QUOTED_NAMED_GROUP, RegExpTT.GROUP_END, true), diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java index ec1b38a3fd37..44e73365a216 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java @@ -117,7 +117,6 @@ public class RegExpHighlighter extends SyntaxHighlighterBase { ourMap.put(RegExpTT.PYTHON_NAMED_GROUP_REF, PARENTHS); ourMap.put(RegExpTT.PCRE_RECURSIVE_NAMED_GROUP_REF, PARENTHS); ourMap.put(RegExpTT.CONDITIONAL, PARENTHS); - ourMap.put(RegExpTT.PCRE_NUMBERED_GROUP_REF, PARENTHS); ourMap.put(RegExpTT.RUBY_NAMED_GROUP, PARENTHS); ourMap.put(RegExpTT.RUBY_QUOTED_NAMED_GROUP, PARENTHS); ourMap.put(RegExpTT.GROUP_BEGIN, PARENTHS); diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpParser.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpParser.java index 36b49da6c113..ebe670882222 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpParser.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpParser.java @@ -409,7 +409,8 @@ public class RegExpParser implements PsiParser, LightPsiParser { parseNamedGroupRef(builder, marker, RegExpTT.GROUP_END); } else if (type == RegExpTT.PCRE_NUMBERED_GROUP_REF) { - parseNumberedGroupRef(builder, marker); + builder.advanceLexer(); + marker.done(RegExpElementTypes.BACKREF); } else if (type == RegExpTT.RUBY_NAMED_GROUP_REF || type == RegExpTT.RUBY_NAMED_GROUP_CALL) { parseNamedGroupRef(builder, marker, RegExpTT.GT); @@ -526,13 +527,6 @@ public class RegExpParser implements PsiParser, LightPsiParser { marker.done(RegExpElementTypes.NAMED_GROUP_REF); } - private static void parseNumberedGroupRef(PsiBuilder builder, PsiBuilder.Marker marker) { - builder.advanceLexer(); - checkMatches(builder, RegExpTT.NUMBER, RegExpBundle.message("parse.error.group.number.expected")); - checkMatches(builder, RegExpTT.GROUP_END, RegExpBundle.message("parse.error.unclosed.group.reference")); - marker.done(RegExpElementTypes.NAMED_GROUP_REF); - } - private static boolean isLetter(CharSequence text) { if (text == null) return false; assert text.length() == 1; diff --git a/RegExpSupport/src/org/intellij/lang/regexp/inspection/RegExpEquivalenceChecker.java b/RegExpSupport/src/org/intellij/lang/regexp/inspection/RegExpEquivalenceChecker.java index 2d97d8c6d870..810bc0c56eaa 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/inspection/RegExpEquivalenceChecker.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/inspection/RegExpEquivalenceChecker.java @@ -74,8 +74,7 @@ final class RegExpEquivalenceChecker { private static boolean areNamedGroupRefsEquivalent(RegExpNamedGroupRef namedGroupRef1, RegExpNamedGroupRef namedGroupRef2) { final String name = namedGroupRef1.getGroupName(); - if (name != null) return name.equals(namedGroupRef2.getGroupName()); - return namedGroupRef1.getText().equals(namedGroupRef2.getText()); + return name != null && name.equals(namedGroupRef2.getGroupName()); } private static boolean areIntersectionsEquivalent(RegExpIntersection intersection1, RegExpIntersection intersection2) { diff --git a/RegExpSupport/src/org/intellij/lang/regexp/psi/RegExpNamedGroupRef.java b/RegExpSupport/src/org/intellij/lang/regexp/psi/RegExpNamedGroupRef.java index 168f16fed900..b2469619a727 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/psi/RegExpNamedGroupRef.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/psi/RegExpNamedGroupRef.java @@ -12,6 +12,5 @@ public interface RegExpNamedGroupRef extends RegExpAtom { boolean isPythonNamedGroupRef(); boolean isRubyNamedGroupRef(); - boolean isPcreNumberedGroupRef(); boolean isNamedGroupRef(); } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java index e0fae1e9d88e..7219638d1d02 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java @@ -52,9 +52,17 @@ public class RegExpBackrefImpl extends RegExpElementImpl implements RegExpBackre return node.getText(); } final String s = getUnescapedText(); - assert s.charAt(0) == '\\'; boolean pcreBackReference = s.charAt(1) == 'g'; - return pcreBackReference ? getPcreBackrefIndexNumberText(s.substring(2)) : s.substring(1); + boolean pcreNumberedGroup = s.startsWith("(?"); + assert s.charAt(0) == '\\' || pcreNumberedGroup; + return pcreBackReference ? getPcreBackrefIndexNumberText(s.substring(2)) : + pcreNumberedGroup ? getPcreNumberedGroupIndexNumberText(s.substring(2)) : + s.substring(1); + } + + @NotNull + private static String getPcreNumberedGroupIndexNumberText(String s) { + return trimEnd(s, ")"); } @NotNull diff --git a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java index 66520e408d06..b930f944c249 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java @@ -36,18 +36,6 @@ public class RegExpNamedGroupRefImpl extends RegExpElementImpl implements RegExp @Override @Nullable public RegExpGroup resolve() { - if (isPcreNumberedGroupRef()) { - Integer groupNumber; - ASTNode node = getNode().findChildByType(RegExpTT.NUMBER); - if (node == null) return null; - try { - groupNumber = Integer.parseInt(node.getText()); - } - catch (NumberFormatException e) { - groupNumber = null; - } - return groupNumber == null ? null : resolveNumberedGroupRef(groupNumber, getContainingFile()); - } final String groupName = getGroupName(); return groupName == null ? null : resolve(groupName, getContainingFile()); } @@ -59,19 +47,6 @@ public class RegExpNamedGroupRefImpl extends RegExpElementImpl implements RegExp .first(); } - @Nullable - static RegExpGroup resolveNumberedGroupRef(int groupNumber, PsiFile file) { - if (groupNumber < 1) return null; - List groups = SyntaxTraverser.psiTraverser(file) - .filter(RegExpGroup.class) - .filter(RegExpGroup::isCapturing) - .toList(); - if (groups.size() < groupNumber) { - return null; - } - return groups.get(groupNumber - 1); - } - @Override @Nullable public String getGroupName() { @@ -90,11 +65,6 @@ public class RegExpNamedGroupRefImpl extends RegExpElementImpl implements RegExp return node.findChildByType(RUBY_GROUP_REF_TOKENS) != null; } - @Override - public boolean isPcreNumberedGroupRef() { - return getNode().findChildByType(RegExpTT.PCRE_NUMBERED_GROUP_REF) != null; - } - @Override public boolean isNamedGroupRef() { return getNode().findChildByType(RegExpTT.RUBY_NAMED_GROUP_REF) != null; diff --git a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex index a9c03f31acb6..2bafc7aa3f8a 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex +++ b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex @@ -452,11 +452,11 @@ BACK_REFERENCES_GROUP = [1-9][0-9]{0,2} "(?<" { yybegin(NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_NAMED_GROUP; } "(?'" { yybegin(QUOTED_NAMED_GROUP); capturingGroupCount++; return RegExpTT.RUBY_QUOTED_NAMED_GROUP; } - "(?"[+-]? / [:digit:] { if (allowPcreNumberedGroupRef) { - yybegin(PCRE_NUMBERED_GROUP); - return RegExpTT.PCRE_NUMBERED_GROUP_REF; - } - else { yypushback(yylength() - 2); yybegin(OPTIONS); return RegExpTT.SET_OPTIONS; }} + "(?"[+-]?{BACK_REFERENCES_GROUP}")" { if (allowPcreNumberedGroupRef) { + yybegin(PCRE_NUMBERED_GROUP); + return RegExpTT.PCRE_NUMBERED_GROUP_REF; + } + else { yypushback(yylength() - 2); yybegin(OPTIONS); return RegExpTT.SET_OPTIONS; }} "(?" { yybegin(OPTIONS); return RegExpTT.SET_OPTIONS; } } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java b/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java index d8c826815f57..25df82f2d5a9 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java @@ -308,7 +308,7 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot .create(); return; } - if (!groupRef.isPcreNumberedGroupRef() && groupRef.getGroupName() == null) { + if (groupRef.getGroupName() == null) { return; } final RegExpGroup group = groupRef.resolve(); @@ -318,13 +318,6 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot myHolder.newAnnotation(HighlightSeverity.ERROR, RegExpBundle.message("error.unresolved.named.group.reference")).range(node) .highlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL).create(); } - else { - final ASTNode number = groupRef.getNode().findChildByType(RegExpTT.NUMBER); - if (number != null) { - myHolder.newAnnotation(HighlightSeverity.ERROR, RegExpBundle.message("error.unresolved.numbered.group.reference")).range(number) - .highlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL).create(); - } - } } else if (PsiTreeUtil.isAncestor(group, groupRef, true)) { myHolder.newAnnotation(HighlightSeverity.WARNING, diff --git a/RegExpSupport/testData/lexer/numberedGroupRef.txt b/RegExpSupport/testData/lexer/numberedGroupRef.txt index 1ca4c39852c4..c344899509c1 100644 --- a/RegExpSupport/testData/lexer/numberedGroupRef.txt +++ b/RegExpSupport/testData/lexer/numberedGroupRef.txt @@ -4,6 +4,4 @@ CHARACTER ('b') CHARACTER ('c') CHARACTER ('d') GROUP_END (')') -PCRE_NUMBERED_GROUP_REF ('(?') -NUMBER ('1') -GROUP_END (')') \ No newline at end of file +PCRE_NUMBERED_GROUP_REF ('(?1)') \ No newline at end of file