diff --git a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java index e2afe5aa8493..531087761da2 100644 --- a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java +++ b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java @@ -1,22 +1,22 @@ -/* The following code was generated by JFlex 1.4.3 on 4/29/14 2:27 PM */ +/* The following code was generated by JFlex 1.4.3 on 10/24/14 4:28 PM */ /* It's an automatically generated code. Do not modify it. */ package org.intellij.lang.regexp; import com.intellij.lexer.FlexLexer; -import com.intellij.psi.tree.IElementType; -import java.util.LinkedList; -import java.util.EnumSet; import com.intellij.psi.StringEscapesTokenTypes; +import com.intellij.psi.tree.IElementType; -// IDEADEV-11055 -@SuppressWarnings({ "ALL", "SameParameterValue", "WeakerAccess", "SameReturnValue", "RedundantThrows", "UnusedDeclaration", "UnusedDeclaration" }) +import java.util.ArrayList; +import java.util.EnumSet; + +@SuppressWarnings("ALL") /** * This class is a scanner generated by * JFlex 1.4.3 - * on 4/29/14 2:27 PM from the specification file - * C:/idea_src/ultimate/tools/lexer/../../community/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex + * on 10/24/14 4:28 PM from the specification file + * /Users/bas/Projects/IntelliJ IDEA Ultimate/tools/lexer/../../community/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex */ class _RegExLexer implements FlexLexer { /** initial size of the lookahead buffer */ @@ -52,73 +52,94 @@ class _RegExLexer implements FlexLexer { * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = - "\10\0\2\53\1\13\1\0\1\53\1\63\22\0\1\46\1\57\1\0"+ - "\1\61\1\15\1\0\1\52\1\62\1\4\1\5\1\17\1\20\1\51"+ - "\1\43\1\3\1\0\1\2\7\42\2\1\1\54\1\0\1\60\1\56"+ - "\1\55\1\16\1\0\1\24\1\24\1\30\1\27\1\37\1\35\1\25"+ - "\1\44\1\32\6\45\1\34\1\36\1\45\1\26\3\45\1\26\1\26"+ - "\1\45\1\25\1\10\1\12\1\11\1\14\1\47\1\0\1\23\1\24"+ - "\1\31\1\27\1\23\1\23\1\45\1\44\1\32\4\45\1\22\1\45"+ - "\1\33\1\45\1\22\1\26\1\22\1\41\1\45\1\26\1\40\1\45"+ - "\1\25\1\6\1\21\1\7\54\0\1\45\12\0\1\45\4\0\1\45"+ - "\5\0\27\45\1\0\37\45\1\0\u013f\45\31\0\162\45\4\0\14\45"+ - "\16\0\5\45\11\0\1\45\213\0\1\45\13\0\1\45\1\0\3\45"+ - "\1\0\1\45\1\0\24\45\1\0\54\45\1\0\46\45\1\0\5\45"+ - "\4\0\202\45\10\0\105\45\1\0\46\45\2\0\2\45\6\0\20\45"+ - "\41\0\46\45\2\0\1\45\7\0\47\45\110\0\33\45\5\0\3\45"+ - "\56\0\32\45\5\0\13\45\25\0\12\50\4\0\2\45\1\0\143\45"+ - "\1\0\1\45\17\0\2\45\7\0\2\45\12\50\3\45\2\0\1\45"+ - "\20\0\1\45\1\0\36\45\35\0\3\45\60\0\46\45\13\0\1\45"+ - "\u0152\0\66\45\3\0\1\45\22\0\1\45\7\0\12\45\4\0\12\50"+ - "\25\0\10\45\2\0\2\45\2\0\26\45\1\0\7\45\1\0\1\45"+ - "\3\0\4\45\3\0\1\45\36\0\2\45\1\0\3\45\4\0\12\50"+ - "\2\45\23\0\6\45\4\0\2\45\2\0\26\45\1\0\7\45\1\0"+ - "\2\45\1\0\2\45\1\0\2\45\37\0\4\45\1\0\1\45\7\0"+ - "\12\50\2\0\3\45\20\0\11\45\1\0\3\45\1\0\26\45\1\0"+ - "\7\45\1\0\2\45\1\0\5\45\3\0\1\45\22\0\1\45\17\0"+ - "\2\45\4\0\12\50\25\0\10\45\2\0\2\45\2\0\26\45\1\0"+ - "\7\45\1\0\2\45\1\0\5\45\3\0\1\45\36\0\2\45\1\0"+ - "\3\45\4\0\12\50\1\0\1\45\21\0\1\45\1\0\6\45\3\0"+ - "\3\45\1\0\4\45\3\0\2\45\1\0\1\45\1\0\2\45\3\0"+ - "\2\45\3\0\3\45\3\0\10\45\1\0\3\45\55\0\11\50\25\0"+ - "\10\45\1\0\3\45\1\0\27\45\1\0\12\45\1\0\5\45\46\0"+ - "\2\45\4\0\12\50\25\0\10\45\1\0\3\45\1\0\27\45\1\0"+ - "\12\45\1\0\5\45\3\0\1\45\40\0\1\45\1\0\2\45\4\0"+ - "\12\50\25\0\10\45\1\0\3\45\1\0\27\45\1\0\20\45\46\0"+ - "\2\45\4\0\12\50\25\0\22\45\3\0\30\45\1\0\11\45\1\0"+ - "\1\45\2\0\7\45\72\0\60\45\1\0\2\45\14\0\7\45\11\0"+ - "\12\50\47\0\2\45\1\0\1\45\2\0\2\45\1\0\1\45\2\0"+ - "\1\45\6\0\4\45\1\0\7\45\1\0\3\45\1\0\1\45\1\0"+ - "\1\45\2\0\2\45\1\0\4\45\1\0\2\45\11\0\1\45\2\0"+ - "\5\45\1\0\1\45\11\0\12\50\2\0\2\45\42\0\1\45\37\0"+ - "\12\50\26\0\10\45\1\0\42\45\35\0\4\45\164\0\42\45\1\0"+ - "\5\45\1\0\2\45\25\0\12\50\6\0\6\45\112\0\46\45\12\0"+ - "\51\45\7\0\132\45\5\0\104\45\5\0\122\45\6\0\7\45\1\0"+ - "\77\45\1\0\1\45\1\0\4\45\2\0\7\45\1\0\1\45\1\0"+ - "\4\45\2\0\47\45\1\0\1\45\1\0\4\45\2\0\37\45\1\0"+ - "\1\45\1\0\4\45\2\0\7\45\1\0\1\45\1\0\4\45\2\0"+ - "\7\45\1\0\7\45\1\0\27\45\1\0\37\45\1\0\1\45\1\0"+ - "\4\45\2\0\7\45\1\0\47\45\1\0\23\45\16\0\11\50\56\0"+ - "\125\45\14\0\u026c\45\2\0\10\45\12\0\32\45\5\0\113\45\25\0"+ - "\15\45\1\0\4\45\16\0\22\45\16\0\22\45\16\0\15\45\1\0"+ - "\3\45\17\0\64\45\43\0\1\45\4\0\1\45\3\0\12\50\46\0"+ - "\12\50\6\0\130\45\10\0\51\45\127\0\35\45\51\0\12\50\36\45"+ - "\2\0\5\45\u038b\0\154\45\224\0\234\45\4\0\132\45\6\0\26\45"+ - "\2\0\6\45\2\0\46\45\2\0\6\45\2\0\10\45\1\0\1\45"+ - "\1\0\1\45\1\0\1\45\1\0\37\45\2\0\65\45\1\0\7\45"+ - "\1\0\1\45\3\0\3\45\1\0\7\45\3\0\4\45\2\0\6\45"+ - "\4\0\15\45\5\0\3\45\1\0\7\45\164\0\1\45\15\0\1\45"+ - "\202\0\1\45\4\0\1\45\2\0\12\45\1\0\1\45\3\0\5\45"+ - "\6\0\1\45\1\0\1\45\1\0\1\45\1\0\4\45\1\0\3\45"+ - "\1\0\7\45\3\0\3\45\5\0\5\45\u0ebb\0\2\45\52\0\5\45"+ - "\5\0\2\45\4\0\126\45\6\0\3\45\1\0\132\45\1\0\4\45"+ - "\5\0\50\45\4\0\136\45\21\0\30\45\70\0\20\45\u0200\0\u19b6\45"+ - "\112\0\u51a6\45\132\0\u048d\45\u0773\0\u2ba4\45\u215c\0\u012e\45\2\0\73\45"+ - "\225\0\7\45\14\0\5\45\5\0\1\45\1\0\12\45\1\0\15\45"+ - "\1\0\5\45\1\0\1\45\1\0\2\45\1\0\2\45\1\0\154\45"+ - "\41\0\u016b\45\22\0\100\45\2\0\66\45\50\0\14\45\164\0\5\45"+ - "\1\0\207\45\23\0\12\50\7\0\32\45\6\0\32\45\13\0\131\45"+ - "\3\0\6\45\2\0\6\45\2\0\6\45\2\0\3\45\43\0"; + "\10\0\2\56\1\13\1\0\1\56\1\66\22\0\1\50\1\62\1\0"+ + "\1\64\1\15\1\0\1\55\1\65\1\4\1\5\1\17\1\20\1\54"+ + "\1\45\1\3\1\0\1\2\7\44\2\1\1\57\1\0\1\63\1\61"+ + "\1\60\1\16\1\0\1\24\1\24\1\32\1\31\1\41\1\37\1\25"+ + "\1\46\1\34\2\47\1\51\1\51\1\51\1\47\1\36\1\40\1\47"+ + "\1\30\2\47\1\27\1\27\1\27\1\47\1\26\1\10\1\12\1\11"+ + "\1\14\1\52\1\0\1\23\1\24\1\33\1\31\1\23\1\23\1\47"+ + "\1\46\1\34\4\47\1\22\1\47\1\35\1\47\1\22\1\27\1\22"+ + "\1\43\1\27\1\27\1\42\1\47\1\25\1\6\1\21\1\7\54\0"+ + "\1\47\12\0\1\47\4\0\1\47\5\0\27\47\1\0\37\47\1\0"+ + "\u01ca\47\4\0\14\47\16\0\5\47\7\0\1\47\1\0\1\47\201\0"+ + "\5\47\1\0\2\47\2\0\4\47\10\0\1\47\1\0\3\47\1\0"+ + "\1\47\1\0\24\47\1\0\123\47\1\0\213\47\10\0\236\47\11\0"+ + "\46\47\2\0\1\47\7\0\47\47\110\0\33\47\5\0\3\47\55\0"+ + "\53\47\25\0\12\53\4\0\2\47\1\0\143\47\1\0\1\47\17\0"+ + "\2\47\7\0\2\47\12\53\3\47\2\0\1\47\20\0\1\47\1\0"+ + "\36\47\35\0\131\47\13\0\1\47\16\0\12\53\41\47\11\0\2\47"+ + "\4\0\1\47\5\0\26\47\4\0\1\47\11\0\1\47\3\0\1\47"+ + "\27\0\31\47\107\0\1\47\1\0\13\47\127\0\66\47\3\0\1\47"+ + "\22\0\1\47\7\0\12\47\4\0\12\53\1\0\7\47\1\0\7\47"+ + "\5\0\10\47\2\0\2\47\2\0\26\47\1\0\7\47\1\0\1\47"+ + "\3\0\4\47\3\0\1\47\20\0\1\47\15\0\2\47\1\0\3\47"+ + "\4\0\12\53\2\47\23\0\6\47\4\0\2\47\2\0\26\47\1\0"+ + "\7\47\1\0\2\47\1\0\2\47\1\0\2\47\37\0\4\47\1\0"+ + "\1\47\7\0\12\53\2\0\3\47\20\0\11\47\1\0\3\47\1\0"+ + "\26\47\1\0\7\47\1\0\2\47\1\0\5\47\3\0\1\47\22\0"+ + "\1\47\17\0\2\47\4\0\12\53\25\0\10\47\2\0\2\47\2\0"+ + "\26\47\1\0\7\47\1\0\2\47\1\0\5\47\3\0\1\47\36\0"+ + "\2\47\1\0\3\47\4\0\12\53\1\0\1\47\21\0\1\47\1\0"+ + "\6\47\3\0\3\47\1\0\4\47\3\0\2\47\1\0\1\47\1\0"+ + "\2\47\3\0\2\47\3\0\3\47\3\0\14\47\26\0\1\47\25\0"+ + "\12\53\25\0\10\47\1\0\3\47\1\0\27\47\1\0\12\47\1\0"+ + "\5\47\3\0\1\47\32\0\2\47\6\0\2\47\4\0\12\53\25\0"+ + "\10\47\1\0\3\47\1\0\27\47\1\0\12\47\1\0\5\47\3\0"+ + "\1\47\40\0\1\47\1\0\2\47\4\0\12\53\1\0\2\47\22\0"+ + "\10\47\1\0\3\47\1\0\51\47\2\0\1\47\20\0\1\47\21\0"+ + "\2\47\4\0\12\53\12\0\6\47\5\0\22\47\3\0\30\47\1\0"+ + "\11\47\1\0\1\47\2\0\7\47\72\0\60\47\1\0\2\47\14\0"+ + "\7\47\11\0\12\53\47\0\2\47\1\0\1\47\2\0\2\47\1\0"+ + "\1\47\2\0\1\47\6\0\4\47\1\0\7\47\1\0\3\47\1\0"+ + "\1\47\1\0\1\47\2\0\2\47\1\0\4\47\1\0\2\47\11\0"+ + "\1\47\2\0\5\47\1\0\1\47\11\0\12\53\2\0\4\47\40\0"+ + "\1\47\37\0\12\53\26\0\10\47\1\0\44\47\33\0\5\47\163\0"+ + "\53\47\24\0\1\47\12\53\6\0\6\47\4\0\4\47\3\0\1\47"+ + "\3\0\2\47\7\0\3\47\4\0\15\47\14\0\1\47\1\0\12\53"+ + "\6\0\46\47\1\0\1\47\5\0\1\47\2\0\53\47\1\0\u014d\47"+ + "\1\0\4\47\2\0\7\47\1\0\1\47\1\0\4\47\2\0\51\47"+ + "\1\0\4\47\2\0\41\47\1\0\4\47\2\0\7\47\1\0\1\47"+ + "\1\0\4\47\2\0\17\47\1\0\71\47\1\0\4\47\2\0\103\47"+ + "\45\0\20\47\20\0\125\47\14\0\u026c\47\2\0\21\47\1\0\32\47"+ + "\5\0\113\47\25\0\15\47\1\0\4\47\16\0\22\47\16\0\22\47"+ + "\16\0\15\47\1\0\3\47\17\0\64\47\43\0\1\47\4\0\1\47"+ + "\3\0\12\53\46\0\12\53\6\0\130\47\10\0\51\47\1\0\1\47"+ + "\5\0\106\47\12\0\35\47\51\0\12\53\36\47\2\0\5\47\13\0"+ + "\54\47\25\0\7\47\10\0\12\53\46\0\27\47\11\0\65\47\53\0"+ + "\12\53\6\0\12\53\15\0\1\47\135\0\57\47\21\0\7\47\4\0"+ + "\12\53\51\0\36\47\15\0\2\47\12\53\54\47\32\0\44\47\34\0"+ + "\12\53\3\0\3\47\12\53\44\47\153\0\4\47\1\0\4\47\3\0"+ + "\2\47\11\0\300\47\100\0\u0116\47\2\0\6\47\2\0\46\47\2\0"+ + "\6\47\2\0\10\47\1\0\1\47\1\0\1\47\1\0\1\47\1\0"+ + "\37\47\2\0\65\47\1\0\7\47\1\0\1\47\3\0\3\47\1\0"+ + "\7\47\3\0\4\47\2\0\6\47\4\0\15\47\5\0\3\47\1\0"+ + "\7\47\164\0\1\47\15\0\1\47\20\0\15\47\145\0\1\47\4\0"+ + "\1\47\2\0\12\47\1\0\1\47\3\0\5\47\6\0\1\47\1\0"+ + "\1\47\1\0\1\47\1\0\4\47\1\0\13\47\2\0\4\47\5\0"+ + "\5\47\4\0\1\47\64\0\2\47\u0a7b\0\57\47\1\0\57\47\1\0"+ + "\205\47\6\0\4\47\3\0\2\47\14\0\46\47\1\0\1\47\5\0"+ + "\1\47\2\0\70\47\7\0\1\47\20\0\27\47\11\0\7\47\1\0"+ + "\7\47\1\0\7\47\1\0\7\47\1\0\7\47\1\0\7\47\1\0"+ + "\7\47\1\0\7\47\120\0\1\47\u01d5\0\2\47\52\0\5\47\5\0"+ + "\2\47\4\0\126\47\6\0\3\47\1\0\132\47\1\0\4\47\5\0"+ + "\51\47\3\0\136\47\21\0\33\47\65\0\20\47\u0200\0\u19b6\47\112\0"+ + "\u51cd\47\63\0\u048d\47\103\0\56\47\2\0\u010d\47\3\0\20\47\12\53"+ + "\2\47\24\0\57\47\20\0\31\47\10\0\106\47\61\0\11\47\2\0"+ + "\147\47\2\0\4\47\1\0\4\47\14\0\13\47\115\0\12\47\1\0"+ + "\3\47\1\0\4\47\1\0\27\47\35\0\64\47\16\0\62\47\34\0"+ + "\12\53\30\0\6\47\3\0\1\47\4\0\12\53\34\47\12\0\27\47"+ + "\31\0\35\47\7\0\57\47\34\0\1\47\12\53\46\0\51\47\27\0"+ + "\3\47\1\0\10\47\4\0\12\53\6\0\27\47\3\0\1\47\5\0"+ + "\60\47\1\0\1\47\3\0\2\47\2\0\5\47\2\0\1\47\1\0"+ + "\1\47\30\0\3\47\2\0\13\47\7\0\3\47\14\0\6\47\2\0"+ + "\6\47\2\0\6\47\11\0\7\47\1\0\7\47\221\0\43\47\15\0"+ + "\12\53\6\0\u2ba4\47\14\0\27\47\4\0\61\47\u2104\0\u016e\47\2\0"+ + "\152\47\46\0\7\47\14\0\5\47\5\0\1\47\1\0\12\47\1\0"+ + "\15\47\1\0\5\47\1\0\1\47\1\0\2\47\1\0\2\47\1\0"+ + "\154\47\41\0\u016b\47\22\0\100\47\2\0\66\47\50\0\14\47\164\0"+ + "\5\47\1\0\207\47\23\0\12\53\7\0\32\47\6\0\32\47\13\0"+ + "\131\47\3\0\6\47\2\0\6\47\2\0\6\47\2\0\3\47\43\0"; /** * Translates characters to character classes @@ -136,17 +157,17 @@ class _RegExLexer implements FlexLexer { "\1\17\1\20\1\21\1\22\1\23\1\3\1\24\1\25"+ "\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35"+ "\1\11\1\36\1\3\1\37\1\40\1\37\1\41\1\42"+ - "\1\1\1\43\1\44\1\2\1\45\1\46\1\47\1\50"+ - "\1\0\1\51\1\52\1\53\1\54\1\55\1\56\1\57"+ - "\1\60\2\61\1\62\1\11\1\63\1\64\1\65\1\52"+ - "\1\66\1\67\1\70\1\71\1\72\1\73\1\0\1\74"+ - "\1\75\1\76\1\77\1\0\1\100\1\101\1\102\1\103"+ - "\2\64\2\65\1\52\1\104\1\105\1\106\1\107\1\0"+ - "\1\102\1\64\1\110\2\65\1\111\1\112\1\102\3\65"+ - "\1\113"; + "\1\43\1\1\1\44\1\45\1\2\1\46\1\47\1\50"+ + "\1\51\1\0\1\52\1\53\1\54\1\55\1\56\1\57"+ + "\1\60\1\61\2\62\1\63\1\11\1\64\1\65\1\66"+ + "\1\53\1\67\1\70\1\71\1\72\1\73\1\74\1\0"+ + "\1\75\1\76\1\77\1\100\1\0\1\101\1\102\1\103"+ + "\1\104\2\65\1\66\1\53\1\105\1\106\1\107\1\110"+ + "\1\0\1\103\1\111\2\65\1\66\1\112\1\113\1\103"+ + "\1\65\1\66\1\65\1\114\4\65"; private static int [] zzUnpackAction() { - int [] result = new int[112]; + int [] result = new int[116]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -171,23 +192,24 @@ class _RegExLexer implements FlexLexer { private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\64\0\150\0\234\0\320\0\u0104\0\u0138\0\u016c"+ - "\0\u01a0\0\u01d4\0\u0208\0\u023c\0\u0270\0\u02a4\0\u02a4\0\u02d8"+ - "\0\u02a4\0\u02a4\0\u030c\0\u0340\0\u02a4\0\u02a4\0\u02a4\0\u02a4"+ - "\0\u02a4\0\u02a4\0\u02a4\0\u02a4\0\u02a4\0\u02a4\0\u0374\0\u02a4"+ - "\0\u03a8\0\u02a4\0\u03dc\0\u02a4\0\u02a4\0\u02a4\0\u02a4\0\u0410"+ - "\0\u02a4\0\u0444\0\u02a4\0\u0478\0\u02a4\0\u02a4\0\u030c\0\u02a4"+ - "\0\u02a4\0\u04ac\0\u04e0\0\u02a4\0\u02a4\0\u02a4\0\u02a4\0\u0514"+ - "\0\u02a4\0\u0548\0\u02a4\0\u057c\0\u05b0\0\u02a4\0\u02a4\0\u02a4"+ - "\0\u02a4\0\u02a4\0\u02a4\0\u05e4\0\u02a4\0\u02a4\0\u02a4\0\u0618"+ - "\0\u064c\0\u0680\0\u02a4\0\u02a4\0\u02a4\0\u02a4\0\u02a4\0\u02a4"+ - "\0\u06b4\0\u02a4\0\u02a4\0\u02a4\0\u06e8\0\u071c\0\u02a4\0\u02a4"+ - "\0\u0750\0\u02a4\0\u0784\0\u07b8\0\u07ec\0\u0820\0\u0854\0\u02a4"+ - "\0\u02a4\0\u02a4\0\u02a4\0\u0888\0\u08bc\0\u02a4\0\u02a4\0\u08f0"+ - "\0\u0924\0\u057c\0\u02a4\0\u02a4\0\u0958\0\u098c\0\u02a4\0\u02a4"; + "\0\0\0\67\0\156\0\245\0\334\0\u0113\0\u014a\0\u0181"+ + "\0\u01b8\0\u01ef\0\u0226\0\u025d\0\u0294\0\u02cb\0\u02cb\0\u0302"+ + "\0\u02cb\0\u02cb\0\u0339\0\u0370\0\u02cb\0\u02cb\0\u02cb\0\u02cb"+ + "\0\u02cb\0\u02cb\0\u02cb\0\u02cb\0\u02cb\0\u02cb\0\u03a7\0\u02cb"+ + "\0\u03de\0\u02cb\0\u0415\0\u02cb\0\u02cb\0\u02cb\0\u02cb\0\u044c"+ + "\0\u02cb\0\u0483\0\u02cb\0\u04ba\0\u02cb\0\u02cb\0\u0339\0\u02cb"+ + "\0\u02cb\0\u02cb\0\u04f1\0\u0528\0\u02cb\0\u02cb\0\u02cb\0\u02cb"+ + "\0\u055f\0\u02cb\0\u0596\0\u02cb\0\u05cd\0\u0604\0\u02cb\0\u02cb"+ + "\0\u02cb\0\u02cb\0\u02cb\0\u02cb\0\u063b\0\u02cb\0\u02cb\0\u02cb"+ + "\0\u0672\0\u06a9\0\u06e0\0\u02cb\0\u02cb\0\u02cb\0\u02cb\0\u02cb"+ + "\0\u02cb\0\u0717\0\u02cb\0\u02cb\0\u02cb\0\u074e\0\u0785\0\u02cb"+ + "\0\u02cb\0\u07bc\0\u02cb\0\u07f3\0\u082a\0\u0861\0\u0898\0\u02cb"+ + "\0\u02cb\0\u02cb\0\u02cb\0\u08cf\0\u0906\0\u02cb\0\u093d\0\u02cb"+ + "\0\u0974\0\u05cd\0\u02cb\0\u02cb\0\u09ab\0\u09e2\0\u0a19\0\u02cb"+ + "\0\u0a50\0\u0a87\0\u0abe\0\u0af5"; private static int [] zzUnpackRowMap() { - int [] result = new int[112]; + int [] result = new int[116]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -212,51 +234,68 @@ class _RegExLexer implements FlexLexer { private static final String ZZ_TRANS_PACKED_0 = "\3\16\1\17\1\20\1\21\1\22\1\16\1\23\1\16"+ "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+ - "\21\16\1\34\2\16\1\35\4\16\1\25\5\16\1\36"+ - "\1\16\1\25\12\16\1\37\51\16\1\40\2\41\4\40"+ - "\1\42\12\40\20\43\1\41\1\40\2\43\2\40\1\41"+ - "\1\44\12\40\11\45\1\46\1\45\1\0\63\45\1\0"+ - "\1\47\47\45\6\16\1\22\1\16\1\50\1\51\1\52"+ - "\1\53\1\26\26\16\1\34\6\16\1\54\1\53\7\16"+ - "\1\53\6\55\1\56\1\55\1\57\1\55\1\24\51\55"+ - "\5\60\1\61\14\60\20\62\1\60\1\63\2\62\6\60"+ - "\1\64\7\60\13\11\1\65\47\11\1\65\22\60\20\43"+ - "\2\60\2\43\7\60\1\66\30\60\20\43\2\60\2\43"+ - "\14\60\1\67\6\60\1\61\14\60\20\43\2\60\2\43"+ - "\17\60\2\41\2\60\1\61\14\60\20\43\1\41\1\60"+ - "\2\43\2\60\1\41\13\60\102\0\1\70\56\0\1\71"+ - "\2\0\1\72\47\0\1\73\1\74\1\75\4\76\1\73"+ - "\1\76\1\73\1\76\1\77\6\76\2\100\2\101\2\102"+ - "\1\103\1\104\1\103\2\105\1\106\1\107\1\106\1\110"+ - "\1\111\1\112\1\76\1\113\1\106\1\77\4\73\1\77"+ - "\7\73\1\77\37\0\1\114\25\0\2\41\37\0\1\41"+ - "\5\0\1\41\14\0\2\43\17\0\21\43\1\0\2\43"+ - "\1\0\2\43\24\0\1\115\2\0\1\72\47\0\1\73"+ - "\1\74\1\75\4\76\1\73\1\76\1\116\1\76\1\77"+ - "\6\76\2\100\2\101\2\102\1\103\1\104\1\103\2\105"+ - "\1\106\1\107\1\106\1\110\1\111\1\112\1\76\1\113"+ - "\1\106\1\77\4\73\1\77\7\73\1\77\52\0\1\117"+ - "\33\0\20\62\2\0\2\62\40\0\20\63\2\0\2\63"+ - "\22\0\1\120\27\0\1\121\17\0\2\122\1\123\1\124"+ - "\1\125\1\126\1\127\12\0\1\130\53\0\2\74\37\0"+ - "\1\74\23\0\1\131\37\0\1\131\21\0\64\132\1\133"+ - "\2\134\20\133\2\134\2\133\3\134\3\133\1\134\1\133"+ - "\1\134\2\133\1\134\21\133\1\135\2\136\20\135\2\136"+ - "\2\135\3\136\3\135\1\136\1\135\1\136\2\135\1\136"+ - "\21\135\1\0\1\74\1\137\37\0\1\137\77\0\1\140"+ - "\1\0\1\141\61\0\1\142\1\143\4\0\5\144\1\0"+ - "\56\144\2\0\1\145\37\0\1\145\21\0\65\146\2\147"+ - "\20\146\2\147\2\146\3\147\3\146\1\147\1\146\1\147"+ - "\2\146\1\147\21\146\65\150\2\151\20\150\2\151\2\150"+ - "\3\151\3\150\1\151\1\150\1\151\2\150\1\151\21\150"+ - "\1\0\1\74\1\152\37\0\1\152\21\0\5\144\1\153"+ - "\56\144\2\0\1\154\37\0\1\154\21\0\65\155\2\156"+ - "\20\155\2\156\2\155\3\156\3\155\1\156\1\155\1\156"+ - "\2\155\1\156\21\155\65\157\2\160\20\157\2\160\2\157"+ - "\3\160\3\157\1\160\1\157\1\160\2\157\1\160\21\157"; + "\23\16\1\34\2\16\1\35\5\16\1\25\5\16\1\36"+ + "\1\16\1\25\12\16\1\37\54\16\1\40\2\41\4\40"+ + "\1\42\12\40\22\43\1\41\1\40\2\43\1\40\1\43"+ + "\1\40\1\41\1\44\12\40\11\45\1\46\1\45\1\0"+ + "\66\45\1\0\1\47\52\45\6\16\1\22\1\16\1\50"+ + "\1\51\1\52\1\53\1\26\30\16\1\34\7\16\1\54"+ + "\1\53\7\16\1\53\6\55\1\56\1\55\1\57\1\55"+ + "\1\24\13\55\1\60\1\55\1\60\1\55\1\60\3\55"+ + "\1\60\12\55\1\60\15\55\5\61\1\62\14\61\22\63"+ + "\1\61\1\64\2\63\1\61\1\63\5\61\1\65\7\61"+ + "\13\11\1\66\52\11\1\66\22\61\22\43\2\61\2\43"+ + "\1\61\1\43\6\61\1\67\30\61\22\43\2\61\2\43"+ + "\1\61\1\43\13\61\1\70\6\61\1\62\14\61\22\43"+ + "\2\61\2\43\1\61\1\43\16\61\2\41\2\61\1\62"+ + "\14\61\22\43\1\41\1\61\2\43\1\61\1\43\1\61"+ + "\1\41\13\61\105\0\1\71\61\0\1\72\2\0\1\73"+ + "\52\0\1\74\1\75\1\76\4\77\1\74\1\77\1\74"+ + "\1\77\1\100\6\77\2\101\3\102\3\103\1\104\1\105"+ + "\1\104\2\106\1\107\1\110\1\107\1\111\1\112\1\113"+ + "\1\77\1\114\1\107\1\100\1\107\4\74\1\100\7\74"+ + "\1\100\41\0\1\115\26\0\2\41\41\0\1\41\6\0"+ + "\1\41\14\0\2\43\17\0\23\43\1\0\2\43\1\0"+ + "\3\43\24\0\1\116\2\0\1\73\52\0\1\74\1\75"+ + "\1\76\4\77\1\74\1\77\1\117\1\77\1\100\6\77"+ + "\2\101\3\102\3\103\1\104\1\105\1\104\2\106\1\107"+ + "\1\110\1\107\1\111\1\112\1\113\1\77\1\114\1\107"+ + "\1\100\1\107\4\74\1\100\7\74\1\100\55\0\1\120"+ + "\33\0\22\63\2\0\2\63\1\0\1\63\37\0\22\64"+ + "\2\0\2\64\1\0\1\64\21\0\1\121\31\0\1\122"+ + "\20\0\2\123\1\124\1\125\1\126\1\127\1\130\12\0"+ + "\1\131\56\0\2\75\41\0\1\75\24\0\1\132\41\0"+ + "\1\132\22\0\67\133\1\0\2\134\3\0\1\135\14\0"+ + "\2\134\4\0\3\134\3\0\1\134\1\0\1\134\2\0"+ + "\1\134\23\0\2\136\20\0\2\136\4\0\3\136\3\0"+ + "\1\136\1\0\1\136\2\0\1\136\23\0\1\75\1\137"+ + "\41\0\1\137\103\0\1\140\1\0\1\141\64\0\1\142"+ + "\1\143\4\0\5\144\1\0\61\144\2\0\1\145\41\0"+ + "\1\145\23\0\2\146\20\0\2\146\4\0\3\146\3\0"+ + "\1\146\1\0\1\146\2\0\1\146\23\0\2\147\4\0"+ + "\1\150\13\0\2\147\4\0\3\147\3\0\1\147\1\0"+ + "\1\147\2\0\1\147\23\0\2\151\20\0\2\151\4\0"+ + "\3\151\3\0\1\151\1\0\1\151\2\0\1\151\23\0"+ + "\1\75\1\152\41\0\1\152\22\0\5\144\1\153\61\144"+ + "\2\0\1\154\41\0\1\154\23\0\2\155\4\0\1\146"+ + "\13\0\2\155\4\0\3\155\3\0\1\155\1\0\1\155"+ + "\2\0\1\155\23\0\2\156\20\0\2\156\4\0\3\156"+ + "\3\0\1\156\1\0\1\156\2\0\1\156\23\0\2\157"+ + "\4\0\1\146\13\0\2\157\4\0\3\157\3\0\1\157"+ + "\1\0\1\157\2\0\1\157\23\0\2\160\20\0\2\160"+ + "\4\0\3\160\3\0\1\160\1\0\1\160\2\0\1\160"+ + "\23\0\2\161\4\0\1\146\13\0\2\161\4\0\3\161"+ + "\3\0\1\161\1\0\1\161\2\0\1\161\23\0\2\162"+ + "\4\0\1\146\13\0\2\162\4\0\3\162\3\0\1\162"+ + "\1\0\1\162\2\0\1\162\23\0\2\163\4\0\1\146"+ + "\13\0\2\163\4\0\3\163\3\0\1\163\1\0\1\163"+ + "\2\0\1\163\23\0\2\164\4\0\1\146\13\0\2\164"+ + "\4\0\3\164\3\0\1\164\1\0\1\164\2\0\1\164"+ + "\23\0\2\164\4\0\1\150\13\0\2\164\4\0\3\164"+ + "\3\0\1\164\1\0\1\164\2\0\1\164\22\0"; private static int [] zzUnpackTrans() { - int [] result = new int[2496]; + int [] result = new int[2860]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -299,14 +338,14 @@ class _RegExLexer implements FlexLexer { private static final String ZZ_ATTRIBUTE_PACKED_0 = "\7\0\2\1\4\0\2\11\1\1\2\11\2\1\12\11"+ "\1\1\1\11\1\1\1\11\1\1\4\11\1\1\1\11"+ - "\1\1\1\11\1\1\2\11\1\1\2\11\2\1\4\11"+ + "\1\1\1\11\1\1\2\11\1\1\3\11\2\1\4\11"+ "\1\1\1\11\1\0\1\11\2\1\6\11\1\1\3\11"+ "\3\1\6\11\1\0\3\11\1\1\1\0\2\11\1\1"+ - "\1\11\5\1\4\11\1\0\1\1\2\11\3\1\2\11"+ - "\2\1\2\11"; + "\1\11\4\1\4\11\1\0\1\1\1\11\1\1\1\11"+ + "\2\1\2\11\3\1\1\11\4\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[112]; + int [] result = new int[116]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -366,18 +405,21 @@ class _RegExLexer implements FlexLexer { /* user code: */ // This adds support for nested states. I'm no JFlex pro, so maybe this is overkill, but it works quite well. - private final LinkedList states = new LinkedList(); + private final ArrayList states = new ArrayList(); // This was an idea to use the regex implementation for XML schema regexes (which use a slightly different syntax) // as well, but is currently unfinished as it requires to tweak more places than just the lexer. private boolean xmlSchemaMode; + private int capturingGroupCount = 0; private boolean allowDanglingMetacharacters; private boolean allowNestedCharacterClasses; private boolean allowOctalNoLeadingZero; private boolean allowHexDigitClass; private boolean allowEmptyCharacterClass; + private boolean allowHorizontalWhitespaceClass; + private boolean allowCategoryShorthand; _RegExLexer(EnumSet capabilities) { this((java.io.Reader)null); @@ -387,15 +429,18 @@ class _RegExLexer implements FlexLexer { this.allowOctalNoLeadingZero = capabilities.contains(RegExpCapability.OCTAL_NO_LEADING_ZERO); this.commentMode = capabilities.contains(RegExpCapability.COMMENT_MODE); this.allowHexDigitClass = capabilities.contains(RegExpCapability.ALLOW_HEX_DIGIT_CLASS); + this.allowHorizontalWhitespaceClass = capabilities.contains(RegExpCapability.ALLOW_HORIZONTAL_WHITESPACE_CLASS); this.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS); + this.allowCategoryShorthand = capabilities.contains(RegExpCapability.UNICODE_CATEGORY_SHORTHAND); } private void yypushstate(int state) { - states.addFirst(yystate()); + states.add(yystate()); yybegin(state); } + private void yypopstate() { - final int state = states.removeFirst(); + final int state = states.remove(states.size() - 1); yybegin(state); } @@ -435,7 +480,7 @@ class _RegExLexer implements FlexLexer { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 1338) { + while (i < 1760) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); @@ -657,59 +702,55 @@ class _RegExLexer implements FlexLexer { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 75: + case 76: { return RegExpTT.UNICODE_CHAR; } - case 76: break; + case 77: break; case 7: { if (yystate() != CLASS2) yypushstate(EMBRACED); return RegExpTT.LBRACE; } - case 77: break; + case 78: break; case 24: { return RegExpTT.COMMA; } - case 78: break; - case 61: + case 79: break; + case 62: { return RegExpTT.POS_LOOKAHEAD; } - case 79: break; - case 74: + case 80: break; + case 75: { return RegExpTT.COMMENT; } - case 80: break; - case 69: + case 81: break; + case 70: { yybegin(NAMED_GROUP); return RegExpTT.PYTHON_NAMED_GROUP; } - case 81: break; + case 82: break; case 14: { return RegExpTT.STAR; } - case 82: break; - case 59: + case 83: break; + case 60: { yybegin(PY_COND_REF); return RegExpTT.PYTHON_COND_REF; } - case 83: break; - case 48: + case 84: break; + case 49: { return RegExpTT.CHAR_CLASS; } - case 84: break; - case 35: + case 85: break; + case 36: { handleOptions(); return RegExpTT.OPTIONS_OFF; } - case 85: break; - case 55: + case 86: break; + case 56: { yypopstate(); return RegExpTT.QUOTE_END; } - case 86: break; - case 34: + case 87: break; + case 35: { yybegin(YYINITIAL); return RegExpTT.GROUP_END; } - case 87: break; - case 5: - { return RegExpTT.GROUP_BEGIN; - } case 88: break; - case 36: + case 37: { yybegin(YYINITIAL); return RegExpTT.COLON; } case 89: break; @@ -725,7 +766,7 @@ class _RegExLexer implements FlexLexer { { return commentMode ? com.intellij.psi.TokenType.WHITE_SPACE : RegExpTT.CHARACTER; } case 92: break; - case 45: + case 46: { return commentMode ? RegExpTT.CHARACTER : RegExpTT.REDUNDANT_ESCAPE; } case 93: break; @@ -733,47 +774,46 @@ class _RegExLexer implements FlexLexer { { return RegExpTT.NAME; } case 94: break; - case 73: - { if (allowOctalNoLeadingZero) return RegExpTT.OCT_CHAR; - return yystate() != CLASS2 ? RegExpTT.BACKREF : RegExpTT.ESC_CHARACTER; - } - case 95: break; case 29: { yypopstate(); return RegExpTT.CLASS_END; } - case 96: break; - case 33: + case 95: break; + case 34: { yybegin(YYINITIAL); return RegExpTT.BAD_CHARACTER; } - case 97: break; - case 51: + case 96: break; + case 52: { yypushstate(QUOTED); return RegExpTT.QUOTE_BEGIN; } - case 98: break; + case 97: break; case 21: { return RegExpTT.NUMBER; } - case 99: break; + case 98: break; case 4: { return RegExpTT.DOT; } - case 100: break; - case 71: + case 99: break; + case 72: { return RegExpTT.NEG_LOOKBEHIND; } + case 100: break; + case 33: + { yypopstate(); if (allowCategoryShorthand) return RegExpTT.CATEGORY_SHORT_HAND; else yypushback(1); + } case 101: break; - case 43: + case 44: { return (allowOctalNoLeadingZero ? RegExpTT.OCT_CHAR : RegExpTT.BAD_OCT_VALUE); } case 102: break; - case 40: + case 41: // lookahead expression with fixed base length zzMarkedPos = zzStartRead + 1; { yypushstate(CLASS1); return RegExpTT.CLASS_BEGIN; } case 103: break; - case 62: + case 63: { return RegExpTT.NEG_LOOKAHEAD; } case 104: break; @@ -781,15 +821,15 @@ class _RegExLexer implements FlexLexer { { return commentMode ? com.intellij.psi.TokenType.WHITE_SPACE : RegExpTT.CTRL_CHARACTER; } case 105: break; - case 60: + case 61: { return RegExpTT.NON_CAPT_GROUP; } case 106: break; - case 64: + case 65: { yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP; } case 107: break; - case 65: + case 66: // lookahead expression with fixed base length zzMarkedPos = zzStartRead + 1; { if (allowEmptyCharacterClass) { @@ -813,7 +853,7 @@ class _RegExLexer implements FlexLexer { { if (commentMode) { yypushstate(COMMENT); return RegExpTT.COMMENT; } else return RegExpTT.CHARACTER; } case 110: break; - case 50: + case 51: { yypushstate(PROP); return RegExpTT.PROPERTY; } case 111: break; @@ -822,23 +862,27 @@ class _RegExLexer implements FlexLexer { return RegExpTT.CLASS_BEGIN; } case 112: break; - case 70: + case 71: { return RegExpTT.POS_LOOKBEHIND; } case 113: break; - case 42: - { return yystate() != CLASS2 ? RegExpTT.BACKREF : RegExpTT.ESC_CHARACTER; - } - case 114: break; - case 72: + case 73: { return RegExpTT.HEX_CHAR; } - case 115: break; + case 114: break; case 1: { handleOptions(); return RegExpTT.OPTIONS_ON; } + case 115: break; + case 43: + { if (yystate() == CLASS2) return RegExpTT.ESC_CHARACTER; + while (yylength() > 2 && Integer.parseInt(yytext().toString().substring(1)) > capturingGroupCount) { + yypushback(1); + } + return RegExpTT.BACKREF; + } case 116: break; - case 58: + case 59: { return allowNestedCharacterClasses ? RegExpTT.ANDAND : RegExpTT.CHARACTER; } case 117: break; @@ -850,7 +894,7 @@ class _RegExLexer implements FlexLexer { { return RegExpTT.MINUS; } case 119: break; - case 46: + case 47: { return RegExpTT.ESC_CTRL_CHARACTER; } case 120: break; @@ -862,19 +906,19 @@ class _RegExLexer implements FlexLexer { { return RegExpTT.QUEST; } case 122: break; - case 54: - { return (allowHexDigitClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); + case 5: + { capturingGroupCount++; return RegExpTT.GROUP_BEGIN; } case 123: break; case 15: { return RegExpTT.PLUS; } case 124: break; - case 66: + case 67: { return RegExpTT.OCT_CHAR; } case 125: break; - case 38: + case 39: { yybegin(YYINITIAL); return RegExpTT.QUOTE; } case 126: break; @@ -894,7 +938,7 @@ class _RegExLexer implements FlexLexer { { yybegin(CLASS1); return RegExpTT.CARET; } case 129: break; - case 56: + case 57: // lookahead expression with fixed base length zzMarkedPos = zzStartRead + 1; { if (allowNestedCharacterClasses) { @@ -904,16 +948,16 @@ class _RegExLexer implements FlexLexer { return RegExpTT.CHARACTER; } case 130: break; - case 57: + case 58: { if (!allowNestedCharacterClasses) return RegExpTT.CHARACTER; return RegExpTT.REDUNDANT_ESCAPE; } case 131: break; - case 37: + case 38: { yybegin(YYINITIAL); return RegExpTT.GT; } case 132: break; - case 68: + case 69: { yybegin(PY_NAMED_GROUP_REF); return RegExpTT.PYTHON_NAMED_GROUP_REF; } case 133: break; @@ -925,11 +969,11 @@ class _RegExLexer implements FlexLexer { { return RegExpTT.CHARACTER; } case 135: break; - case 63: + case 64: { yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP; } case 136: break; - case 39: + case 40: { yybegin(OPTIONS); return RegExpTT.SET_OPTIONS; } case 137: break; @@ -937,7 +981,7 @@ class _RegExLexer implements FlexLexer { { yybegin(CLASS2); return RegExpTT.CHARACTER; } case 138: break; - case 67: + case 68: { if (xmlSchemaMode) { yypushback(1); return RegExpTT.CHAR_CLASS; } else return RegExpTT.CTRL; } case 139: break; @@ -949,42 +993,55 @@ class _RegExLexer implements FlexLexer { { return RegExpTT.DOLLAR; } case 141: break; - case 49: + case 50: { if (xmlSchemaMode) return RegExpTT.CHAR_CLASS; else return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN; } case 142: break; - case 41: + case 42: { return RegExpTT.REDUNDANT_ESCAPE; } case 143: break; - case 47: - { return yystate() != CLASS2 ? RegExpTT.BOUNDARY : RegExpTT.ESC_CHARACTER; + case 55: + { return (allowHexDigitClass || allowHorizontalWhitespaceClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); } case 144: break; + case 48: + { return yystate() != CLASS2 ? RegExpTT.BOUNDARY : RegExpTT.ESC_CHARACTER; + } + case 145: break; case 22: { yypopstate(); return RegExpTT.RBRACE; } - case 145: break; - case 53: + case 146: break; + case 54: { return StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN; } - case 146: break; - case 52: + case 147: break; + case 53: { return RegExpTT.BAD_HEX_VALUE; } - case 147: break; + case 148: break; case 9: { return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN; } - case 148: break; + case 149: break; case 11: { return RegExpTT.CARET; } - case 149: break; - case 44: + case 150: break; + case 45: { return RegExpTT.ESC_CHARACTER; } - case 150: break; + case 151: break; + case 74: + { if (allowOctalNoLeadingZero) return RegExpTT.OCT_CHAR; + if (yystate() == CLASS2) return RegExpTT.ESC_CHARACTER; + while (yylength() > 2 && Integer.parseInt(yytext().toString().substring(1)) > capturingGroupCount) { + yypushback(1); + } + return RegExpTT.BACKREF; + } + case 152: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/RegExpSupport/src/org/intellij/lang/regexp/DefaultRegExpPropertiesProvider.java b/RegExpSupport/src/org/intellij/lang/regexp/DefaultRegExpPropertiesProvider.java index 9f23654c710c..844a42edb7a0 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/DefaultRegExpPropertiesProvider.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/DefaultRegExpPropertiesProvider.java @@ -89,8 +89,12 @@ public final class DefaultRegExpPropertiesProvider { private final String[][] myCharacterClasses = { {"d", "digit: [0-9]"}, {"D", "nondigit: [^0-9]"}, + {"h", "horizontal whitespace character: [ \\t\\xA0\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000]"}, + {"H", "non-horizontal whitespace character: [^\\h]"}, {"s", "whitespace [ \\t\\n\\x0B\\f\\r]"}, {"S", "non-whitespace [^\\s]"}, + {"v", "vertical whitespace character: [\\n\\x0B\\f\\r\\x85\\u2028\\u2029]"}, + {"V", "non-vertical whitespace character: [^\\v]"}, {"w", "word character [a-zA-Z_0-9]"}, {"W", "nonword character [^\\w]"}, {"b", "word boundary"}, diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java index 748458d218d5..c815d4bc9c48 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpBraceMatcher.java @@ -30,6 +30,8 @@ public class RegExpBraceMatcher implements PairedBraceMatcher { new BracePair(RegExpTT.POS_LOOKBEHIND, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.NEG_LOOKBEHIND, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.PYTHON_NAMED_GROUP, RegExpTT.GROUP_END, true), new BracePair(RegExpTT.PYTHON_NAMED_GROUP_REF, 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), new BracePair(RegExpTT.CLASS_BEGIN, RegExpTT.CLASS_END, false), new BracePair(RegExpTT.LBRACE, RegExpTT.RBRACE, false), new BracePair(RegExpTT.QUOTE_BEGIN, RegExpTT.QUOTE_END, false),}; } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java index 81db82a112a6..51b4dbf53576 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,4 +27,6 @@ public enum RegExpCapability { COMMENT_MODE, ALLOW_HEX_DIGIT_CLASS, ALLOW_EMPTY_CHARACTER_CLASS, + ALLOW_HORIZONTAL_WHITESPACE_CLASS, + UNICODE_CATEGORY_SHORTHAND } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java index fd3a8b03bd22..d8e1e2179f4d 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpHighlighter.java @@ -114,12 +114,23 @@ public class RegExpHighlighter extends SyntaxHighlighterBase { keys1.put(RegExpTT.BOUNDARY, ESC_CHARACTER); keys1.put(RegExpTT.CTRL, ESC_CHARACTER); keys1.put(RegExpTT.ESC_CTRL_CHARACTER, ESC_CHARACTER); + keys1.put(RegExpTT.CATEGORY_SHORT_HAND, ESC_CHARACTER); keys1.put(RegExpTT.REDUNDANT_ESCAPE, REDUNDANT_ESCAPE); keys1.put(RegExpTT.QUOTE_BEGIN, QUOTE_CHARACTER); keys1.put(RegExpTT.QUOTE_END, QUOTE_CHARACTER); + keys1.put(RegExpTT.NON_CAPT_GROUP, PARENTHS); + keys1.put(RegExpTT.POS_LOOKBEHIND, PARENTHS); + keys1.put(RegExpTT.NEG_LOOKBEHIND, PARENTHS); + keys1.put(RegExpTT.POS_LOOKAHEAD, PARENTHS); + keys1.put(RegExpTT.NEG_LOOKAHEAD, PARENTHS); + keys1.put(RegExpTT.SET_OPTIONS, PARENTHS); + keys1.put(RegExpTT.PYTHON_NAMED_GROUP, PARENTHS); + keys1.put(RegExpTT.PYTHON_NAMED_GROUP_REF, PARENTHS); + keys1.put(RegExpTT.RUBY_NAMED_GROUP, PARENTHS); + keys1.put(RegExpTT.RUBY_QUOTED_NAMED_GROUP, PARENTHS); keys1.put(RegExpTT.GROUP_BEGIN, PARENTHS); keys1.put(RegExpTT.GROUP_END, PARENTHS); diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java index 9208a3239fc3..a09dc1f49c46 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHost.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package org.intellij.lang.regexp; +import org.intellij.lang.regexp.psi.RegExpChar; import org.intellij.lang.regexp.psi.RegExpGroup; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,6 +29,7 @@ public interface RegExpLanguageHost { boolean supportsPossessiveQuantifiers(); boolean supportsPythonConditionalRefs(); boolean supportsNamedGroupSyntax(RegExpGroup group); + boolean supportsExtendedHexCharacter(RegExpChar regExpChar); boolean isValidCategory(@NotNull String category); @NotNull diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java index 943103a0dfc4..ec2b9192c2d5 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpLanguageHosts.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.intellij.lang.regexp; import com.intellij.lang.injection.InjectedLanguageManager; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.ClassExtension; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; @@ -73,6 +74,14 @@ public final class RegExpLanguageHosts extends ClassExtension Character.MAX_CODE_POINT) { + return null; + } return i-start < len && strict ? null : (char)sum; } catch (NumberFormatException e1) { return null; diff --git a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpGroupImpl.java b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpGroupImpl.java index b24669757917..023f64cf16b2 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpGroupImpl.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpGroupImpl.java @@ -56,6 +56,10 @@ public class RegExpGroupImpl extends RegExpElementImpl implements RegExpGroup { getNode().findChildByType(RegExpTT.RUBY_QUOTED_NAMED_GROUP) != null; } + public boolean isNamedGroup() { + return getNode().findChildByType(RegExpTT.RUBY_NAMED_GROUP) != null; + } + public String getGroupName() { if (!isPythonNamedGroup()) { return null; diff --git a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex index 1737148b6cda..d429bd24c6ac 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex +++ b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex @@ -2,13 +2,13 @@ package org.intellij.lang.regexp; import com.intellij.lexer.FlexLexer; -import com.intellij.psi.tree.IElementType; -import java.util.LinkedList; -import java.util.EnumSet; import com.intellij.psi.StringEscapesTokenTypes; +import com.intellij.psi.tree.IElementType; -// IDEADEV-11055 -@SuppressWarnings({ "ALL", "SameParameterValue", "WeakerAccess", "SameReturnValue", "RedundantThrows", "UnusedDeclaration", "UnusedDeclaration" }) +import java.util.ArrayList; +import java.util.EnumSet; + +@SuppressWarnings("ALL") %% %class _RegExLexer @@ -21,18 +21,21 @@ import com.intellij.psi.StringEscapesTokenTypes; %{ // This adds support for nested states. I'm no JFlex pro, so maybe this is overkill, but it works quite well. - private final LinkedList states = new LinkedList(); + private final ArrayList states = new ArrayList(); // This was an idea to use the regex implementation for XML schema regexes (which use a slightly different syntax) // as well, but is currently unfinished as it requires to tweak more places than just the lexer. private boolean xmlSchemaMode; + private int capturingGroupCount = 0; private boolean allowDanglingMetacharacters; private boolean allowNestedCharacterClasses; private boolean allowOctalNoLeadingZero; private boolean allowHexDigitClass; private boolean allowEmptyCharacterClass; + private boolean allowHorizontalWhitespaceClass; + private boolean allowCategoryShorthand; _RegExLexer(EnumSet capabilities) { this((java.io.Reader)null); @@ -42,15 +45,18 @@ import com.intellij.psi.StringEscapesTokenTypes; this.allowOctalNoLeadingZero = capabilities.contains(RegExpCapability.OCTAL_NO_LEADING_ZERO); this.commentMode = capabilities.contains(RegExpCapability.COMMENT_MODE); this.allowHexDigitClass = capabilities.contains(RegExpCapability.ALLOW_HEX_DIGIT_CLASS); + this.allowHorizontalWhitespaceClass = capabilities.contains(RegExpCapability.ALLOW_HORIZONTAL_WHITESPACE_CLASS); this.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS); + this.allowCategoryShorthand = capabilities.contains(RegExpCapability.UNICODE_CATEGORY_SHORTHAND); } private void yypushstate(int state) { - states.addFirst(yystate()); + states.add(yystate()); yybegin(state); } + private void yypopstate() { - final int state = states.removeFirst(); + final int state = states.remove(states.size() - 1); yybegin(state); } @@ -99,7 +105,7 @@ META={ESCAPE} | {DOT} | CONTROL="t" | "n" | "r" | "f" | "a" | "e" BOUNDARY="b" | "B" | "A" | "z" | "Z" | "G" -CLASS="w" | "W" | "s" | "S" | "d" | "D" | "X" | "C" +CLASS="w" | "W" | "s" | "S" | "d" | "D" | "v" | "V" | "X" | "C" XML_CLASS="c" | "C" | "i" | "I" PROP="p" | "P" @@ -118,12 +124,12 @@ HEX_CHAR=[0-9a-fA-F] {ESCAPE} {ESCAPE} { return RegExpTT.ESC_CHARACTER; } /* hex escapes */ -{ESCAPE} "x" {HEX_CHAR}{2} { return RegExpTT.HEX_CHAR; } -{ESCAPE} "x" {ANY}{0,2} { return RegExpTT.BAD_HEX_VALUE; } +{ESCAPE} "x" ({HEX_CHAR}{2}|{LBRACE}{HEX_CHAR}{1,6}{RBRACE}) { return RegExpTT.HEX_CHAR; } +{ESCAPE} "x" ({HEX_CHAR}?|{LBRACE}{HEX_CHAR}*{RBRACE}?) { return RegExpTT.BAD_HEX_VALUE; } /* unicode escapes */ {ESCAPE} "u" {HEX_CHAR}{4} { return RegExpTT.UNICODE_CHAR; } -{ESCAPE} "u" {ANY}{0,4} { return StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN; } +{ESCAPE} "u" {HEX_CHAR}{0,3} { return StringEscapesTokenTypes.INVALID_UNICODE_ESCAPE_TOKEN; } /* octal escapes */ {ESCAPE} "0" [0-7]{1,3} { return RegExpTT.OCT_CHAR; } @@ -141,15 +147,21 @@ HEX_CHAR=[0-9a-fA-F] subexpressions exist at that point in the regular expression, otherwise the parser will drop digits until the number is smaller or equal to the existing number of groups or it is one digit." - - So, for 100% compatibility, backrefs > 9 should be resolved by the parser, but - I'm not sure if it's worth the effort - at least not atm. */ {ESCAPE} [0-7]{3} { if (allowOctalNoLeadingZero) return RegExpTT.OCT_CHAR; - return yystate() != CLASS2 ? RegExpTT.BACKREF : RegExpTT.ESC_CHARACTER; + if (yystate() == CLASS2) return RegExpTT.ESC_CHARACTER; + while (yylength() > 2 && Integer.parseInt(yytext().toString().substring(1)) > capturingGroupCount) { + yypushback(1); + } + return RegExpTT.BACKREF; } -{ESCAPE} {DIGITS} { return yystate() != CLASS2 ? RegExpTT.BACKREF : RegExpTT.ESC_CHARACTER; } +{ESCAPE} {DIGITS} { if (yystate() == CLASS2) return RegExpTT.ESC_CHARACTER; + while (yylength() > 2 && Integer.parseInt(yytext().toString().substring(1)) > capturingGroupCount) { + yypushback(1); + } + return RegExpTT.BACKREF; + } {ESCAPE} "-" { return RegExpTT.ESC_CHARACTER; } {ESCAPE} {META} { return RegExpTT.ESC_CHARACTER; } @@ -159,7 +171,7 @@ HEX_CHAR=[0-9a-fA-F] {ESCAPE} {BOUNDARY} { return yystate() != CLASS2 ? RegExpTT.BOUNDARY : RegExpTT.ESC_CHARACTER; } {ESCAPE} {CONTROL} { return RegExpTT.ESC_CTRL_CHARACTER; } -{ESCAPE} [hH] { return (allowHexDigitClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); } +{ESCAPE} [hH] { return (allowHexDigitClass || allowHorizontalWhitespaceClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN); } {ESCAPE} [:letter:] { return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN; } {ESCAPE} [\n\b\t\r\f ] { return commentMode ? RegExpTT.CHARACTER : RegExpTT.REDUNDANT_ESCAPE; } @@ -175,6 +187,7 @@ HEX_CHAR=[0-9a-fA-F] { {LBRACE} { yypopstate(); yypushstate(EMBRACED); return RegExpTT.LBRACE; } + "L"|"M"|"Z"|"S"|"N"|"P"|"C" { yypopstate(); if (allowCategoryShorthand) return RegExpTT.CATEGORY_SHORT_HAND; else yypushback(1); } {ANY} { yypopstate(); yypushback(1); } } @@ -252,7 +265,7 @@ HEX_CHAR=[0-9a-fA-F] { - {LPAREN} { return RegExpTT.GROUP_BEGIN; } + {LPAREN} { capturingGroupCount++; return RegExpTT.GROUP_BEGIN; } {RPAREN} { return RegExpTT.GROUP_END; } "|" { return RegExpTT.UNION; } diff --git a/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java b/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java index 1d32bf8ab6eb..fd0c716b56af 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/validation/RegExpAnnotator.java @@ -104,6 +104,13 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot registerFix(a, new RemoveRedundantEscapeAction(ch)); } } + if (ch.getType() == RegExpChar.Type.HEX) { + if (text.charAt(text.length() - 1) == '}') { + if (!myLanguageHosts.supportsExtendedHexCharacter(ch)) { + myHolder.createErrorAnnotation(ch, "This hex character syntax is not supported"); + } + } + } } } @@ -124,14 +131,14 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot public void visitRegExpBackref(final RegExpBackref backref) { final RegExpGroup group = backref.resolve(); if (group == null) { - final Annotation a = myHolder.createErrorAnnotation(backref, "Unresolved backreference"); + final Annotation a = myHolder.createErrorAnnotation(backref, "Unresolved back reference"); if (a != null) { // IDEA-9381 a.setHighlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); } } else if (PsiTreeUtil.isAncestor(group, backref, true)) { - myHolder.createWarningAnnotation(backref, "Backreference is nested into the capturing group it refers to"); + myHolder.createWarningAnnotation(backref, "Back reference is nested into the capturing group it refers to"); } } @@ -173,7 +180,7 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot */ final RegExpGroup group = groupRef.resolve(); if (group == null) { - final Annotation a = myHolder.createErrorAnnotation(groupRef, "Unresolved backreference"); + final Annotation a = myHolder.createErrorAnnotation(groupRef, "Unresolved back reference"); if (a != null) { // IDEA-9381 a.setHighlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); diff --git a/RegExpSupport/test/test/RegExpCompletionTest.java b/RegExpSupport/test/test/RegExpCompletionTest.java index a408a540a99a..5e90be4a485a 100644 --- a/RegExpSupport/test/test/RegExpCompletionTest.java +++ b/RegExpSupport/test/test/RegExpCompletionTest.java @@ -58,7 +58,7 @@ public class RegExpCompletionTest extends CodeInsightFixtureTestCase { private void doBackSlashVariantsTest() throws Throwable { java.util.List nameList = new ArrayList(Arrays.asList("d", "D", "s", "S", "w", "W", "b", "B", "A", "G", "Z", "z", "Q", "E", - "t", "n", "r", "f", "a", "e")); + "t", "n", "r", "f", "a", "e", "h", "H", "v", "V")); for (String[] stringArray : DefaultRegExpPropertiesProvider.getInstance().getAllKnownProperties()) { nameList.add("p{" + stringArray[0] + "}"); } diff --git a/RegExpSupport/testData/RETest.xml b/RegExpSupport/testData/RETest.xml index 10e04dcf80fa..f42b9af45c51 100644 --- a/RegExpSupport/testData/RETest.xml +++ b/RegExpSupport/testData/RETest.xml @@ -364,6 +364,18 @@ [\p{L}&&[^\p{Lu}]] OK + + \pL\pM\pZ\pS\pN\pP\pC\PL\PM\PZ\PS\PN\PP\PC + OK + + + \pA + ERR + + + \pl + ERR + a\p ERR @@ -571,6 +583,14 @@ \x4a OK + + \x{0} + OK + + + \x{2011F} + OK + [\x4a-\x4b] OK @@ -710,6 +730,14 @@ ([ab]+)=\1 OK + + (a)(b)(c)(d)(e)(f)(g)(h)(i)(j)\105 + OK + + + (.)\11 + OK + ([ab]+)=\2 ERR @@ -719,7 +747,7 @@ ERR - \1)]]> + \1)]]> OK @@ -771,6 +799,18 @@ abc\x1 ERR + + abc\x{ + ERR + + + abc\x{} + ERR + + + abc\x{0 + ERR + abc\u ERR @@ -1001,4 +1041,11 @@ OK + + + + \h \H \v \V + OK + + diff --git a/build/conf/mac/Contents/MacOS/idea b/build/conf/mac/Contents/MacOS/idea index bd5a2a3f744d..dde4ca2a5bc7 100755 Binary files a/build/conf/mac/Contents/MacOS/idea and b/build/conf/mac/Contents/MacOS/idea differ diff --git a/build/update.xml b/build/update.xml index e06cfce3ee93..ae4871b2eb6b 100644 --- a/build/update.xml +++ b/build/update.xml @@ -31,6 +31,7 @@ + diff --git a/colorSchemes/src/colorSchemes/Darcula.xml b/colorSchemes/src/colorSchemes/Darcula.xml index d04e32a17f22..bf0d584c0771 100644 --- a/colorSchemes/src/colorSchemes/Darcula.xml +++ b/colorSchemes/src/colorSchemes/Darcula.xml @@ -12,7 +12,7 @@