diff --git a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java
index e2afe5aa8493..b35848683e2d 100644
--- a/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java
+++ b/RegExpSupport/gen/org/intellij/lang/regexp/_RegExLexer.java
@@ -1,4 +1,4 @@
-/* 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/22/14 10:42 AM */
/* It's an automatically generated code. Do not modify it. */
package org.intellij.lang.regexp;
@@ -15,8 +15,8 @@ import com.intellij.psi.StringEscapesTokenTypes;
/**
* 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/22/14 10:42 AM 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 */
@@ -56,69 +56,90 @@ class _RegExLexer implements FlexLexer {
"\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";
+ "\1\44\1\32\6\45\1\34\1\36\1\45\1\26\2\45\1\26\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\26\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\u01ca\45\4\0\14\45\16\0"+
+ "\5\45\7\0\1\45\1\0\1\45\201\0\5\45\1\0\2\45\2\0"+
+ "\4\45\10\0\1\45\1\0\3\45\1\0\1\45\1\0\24\45\1\0"+
+ "\123\45\1\0\213\45\10\0\236\45\11\0\46\45\2\0\1\45\7\0"+
+ "\47\45\110\0\33\45\5\0\3\45\55\0\53\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\131\45\13\0"+
+ "\1\45\16\0\12\50\41\45\11\0\2\45\4\0\1\45\5\0\26\45"+
+ "\4\0\1\45\11\0\1\45\3\0\1\45\27\0\31\45\107\0\1\45"+
+ "\1\0\13\45\127\0\66\45\3\0\1\45\22\0\1\45\7\0\12\45"+
+ "\4\0\12\50\1\0\7\45\1\0\7\45\5\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"+
+ "\20\0\1\45\15\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\14\45\26\0\1\45\25\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\32\0"+
+ "\2\45\6\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\1\0\2\45\22\0\10\45\1\0\3\45\1\0"+
+ "\51\45\2\0\1\45\20\0\1\45\21\0\2\45\4\0\12\50\12\0"+
+ "\6\45\5\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\4\45\40\0\1\45\37\0\12\50\26\0"+
+ "\10\45\1\0\44\45\33\0\5\45\163\0\53\45\24\0\1\45\12\50"+
+ "\6\0\6\45\4\0\4\45\3\0\1\45\3\0\2\45\7\0\3\45"+
+ "\4\0\15\45\14\0\1\45\1\0\12\50\6\0\46\45\1\0\1\45"+
+ "\5\0\1\45\2\0\53\45\1\0\u014d\45\1\0\4\45\2\0\7\45"+
+ "\1\0\1\45\1\0\4\45\2\0\51\45\1\0\4\45\2\0\41\45"+
+ "\1\0\4\45\2\0\7\45\1\0\1\45\1\0\4\45\2\0\17\45"+
+ "\1\0\71\45\1\0\4\45\2\0\103\45\45\0\20\45\20\0\125\45"+
+ "\14\0\u026c\45\2\0\21\45\1\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\1\0\1\45\5\0\106\45\12\0\35\45"+
+ "\51\0\12\50\36\45\2\0\5\45\13\0\54\45\25\0\7\45\10\0"+
+ "\12\50\46\0\27\45\11\0\65\45\53\0\12\50\6\0\12\50\15\0"+
+ "\1\45\135\0\57\45\21\0\7\45\4\0\12\50\51\0\36\45\15\0"+
+ "\2\45\12\50\54\45\32\0\44\45\34\0\12\50\3\0\3\45\12\50"+
+ "\44\45\153\0\4\45\1\0\4\45\3\0\2\45\11\0\300\45\100\0"+
+ "\u0116\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\20\0\15\45\145\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\13\45\2\0\4\45\5\0\5\45\4\0\1\45\64\0"+
+ "\2\45\u0a7b\0\57\45\1\0\57\45\1\0\205\45\6\0\4\45\3\0"+
+ "\2\45\14\0\46\45\1\0\1\45\5\0\1\45\2\0\70\45\7\0"+
+ "\1\45\20\0\27\45\11\0\7\45\1\0\7\45\1\0\7\45\1\0"+
+ "\7\45\1\0\7\45\1\0\7\45\1\0\7\45\1\0\7\45\120\0"+
+ "\1\45\u01d5\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\51\45\3\0\136\45\21\0"+
+ "\33\45\65\0\20\45\u0200\0\u19b6\45\112\0\u51cd\45\63\0\u048d\45\103\0"+
+ "\56\45\2\0\u010d\45\3\0\20\45\12\50\2\45\24\0\57\45\20\0"+
+ "\31\45\10\0\106\45\61\0\11\45\2\0\147\45\2\0\4\45\1\0"+
+ "\4\45\14\0\13\45\115\0\12\45\1\0\3\45\1\0\4\45\1\0"+
+ "\27\45\35\0\64\45\16\0\62\45\34\0\12\50\30\0\6\45\3\0"+
+ "\1\45\4\0\12\50\34\45\12\0\27\45\31\0\35\45\7\0\57\45"+
+ "\34\0\1\45\12\50\46\0\51\45\27\0\3\45\1\0\10\45\4\0"+
+ "\12\50\6\0\27\45\3\0\1\45\5\0\60\45\1\0\1\45\3\0"+
+ "\2\45\2\0\5\45\2\0\1\45\1\0\1\45\30\0\3\45\2\0"+
+ "\13\45\7\0\3\45\14\0\6\45\2\0\6\45\2\0\6\45\11\0"+
+ "\7\45\1\0\7\45\221\0\43\45\15\0\12\50\6\0\u2ba4\45\14\0"+
+ "\27\45\4\0\61\45\u2104\0\u016e\45\2\0\152\45\46\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";
/**
* Translates characters to character classes
@@ -378,6 +399,7 @@ class _RegExLexer implements FlexLexer {
private boolean allowOctalNoLeadingZero;
private boolean allowHexDigitClass;
private boolean allowEmptyCharacterClass;
+ private boolean allowHorizontalWhitespaceClass;
_RegExLexer(EnumSet capabilities) {
this((java.io.Reader)null);
@@ -387,6 +409,7 @@ 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);
}
@@ -435,7 +458,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 < 1752) {
int count = packed.charAt(i++);
char value = packed.charAt(i++);
do map[j++] = value; while (--count > 0);
@@ -862,22 +885,18 @@ class _RegExLexer implements FlexLexer {
{ return RegExpTT.QUEST;
}
case 122: break;
- case 54:
- { return (allowHexDigitClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN);
- }
- case 123: break;
case 15:
{ return RegExpTT.PLUS;
}
- case 124: break;
+ case 123: break;
case 66:
{ return RegExpTT.OCT_CHAR;
}
- case 125: break;
+ case 124: break;
case 38:
{ yybegin(YYINITIAL); return RegExpTT.QUOTE;
}
- case 126: break;
+ case 125: break;
case 20:
{ if (allowDanglingMetacharacters) {
yypopstate(); yypushback(1);
@@ -885,15 +904,15 @@ class _RegExLexer implements FlexLexer {
return RegExpTT.BAD_CHARACTER;
}
}
- case 127: break;
+ case 126: break;
case 31:
{ yypopstate(); yypushback(1);
}
- case 128: break;
+ case 127: break;
case 27:
{ yybegin(CLASS1); return RegExpTT.CARET;
}
- case 129: break;
+ case 128: break;
case 56:
// lookahead expression with fixed base length
zzMarkedPos = zzStartRead + 1;
@@ -903,59 +922,63 @@ class _RegExLexer implements FlexLexer {
}
return RegExpTT.CHARACTER;
}
- case 130: break;
+ case 129: break;
case 57:
{ if (!allowNestedCharacterClasses) return RegExpTT.CHARACTER;
return RegExpTT.REDUNDANT_ESCAPE;
}
- case 131: break;
+ case 130: break;
case 37:
{ yybegin(YYINITIAL); return RegExpTT.GT;
}
- case 132: break;
+ case 131: break;
case 68:
{ yybegin(PY_NAMED_GROUP_REF); return RegExpTT.PYTHON_NAMED_GROUP_REF;
}
- case 133: break;
+ case 132: break;
case 16:
{ return RegExpTT.UNION;
}
- case 134: break;
+ case 133: break;
case 3:
{ return RegExpTT.CHARACTER;
}
- case 135: break;
+ case 134: break;
case 63:
{ yybegin(NAMED_GROUP); return RegExpTT.RUBY_NAMED_GROUP;
}
- case 136: break;
+ case 135: break;
case 39:
{ yybegin(OPTIONS); return RegExpTT.SET_OPTIONS;
}
- case 137: break;
+ case 136: break;
case 26:
{ yybegin(CLASS2); return RegExpTT.CHARACTER;
}
- case 138: break;
+ case 137: break;
case 67:
{ if (xmlSchemaMode) { yypushback(1); return RegExpTT.CHAR_CLASS; } else return RegExpTT.CTRL;
}
- case 139: break;
+ case 138: break;
case 30:
{ return commentMode ? com.intellij.psi.TokenType.WHITE_SPACE : RegExpTT.ESC_CHARACTER;
}
- case 140: break;
+ case 139: break;
case 12:
{ return RegExpTT.DOLLAR;
}
- case 141: break;
+ case 140: break;
case 49:
{ if (xmlSchemaMode) return RegExpTT.CHAR_CLASS; else return StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN;
}
- case 142: break;
+ case 141: break;
case 41:
{ return RegExpTT.REDUNDANT_ESCAPE;
}
+ case 142: break;
+ case 54:
+ { return (allowHexDigitClass || allowHorizontalWhitespaceClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN);
+ }
case 143: break;
case 47:
{ return yystate() != CLASS2 ? RegExpTT.BOUNDARY : RegExpTT.ESC_CHARACTER;
diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java
index 81db82a112a6..330441b22e3e 100644
--- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java
+++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpCapability.java
@@ -27,4 +27,5 @@ public enum RegExpCapability {
COMMENT_MODE,
ALLOW_HEX_DIGIT_CLASS,
ALLOW_EMPTY_CHARACTER_CLASS,
+ ALLOW_HORIZONTAL_WHITESPACE_CLASS
}
diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java
index 2148acb3bb13..18be01fdc1a8 100644
--- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java
+++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpParserDefinition.java
@@ -38,7 +38,7 @@ public class RegExpParserDefinition implements ParserDefinition {
@NotNull
public Lexer createLexer(Project project) {
- return new RegExpLexer(EnumSet.of(RegExpCapability.NESTED_CHARACTER_CLASSES));
+ return new RegExpLexer(EnumSet.of(RegExpCapability.NESTED_CHARACTER_CLASSES, RegExpCapability.ALLOW_HORIZONTAL_WHITESPACE_CLASS));
}
public PsiParser createParser(Project project) {
diff --git a/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java b/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java
index c9f9b9bb8a09..4d085b31d463 100644
--- a/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java
+++ b/RegExpSupport/src/org/intellij/lang/regexp/RegExpTT.java
@@ -75,7 +75,7 @@ public interface RegExpTT {
IElementType ESC_CTRL_CHARACTER = new RegExpElementType("ESC_CTRL_CHARACTER");
// "\\" ("." | "|" | "$" | "^" | "?" | "*" | "+" | "[" | "{" | "(" | ")")
IElementType ESC_CHARACTER = new RegExpElementType("ESC_CHARACTER");
- // "\\" ("w" | "W" | "s" | "S" | "d" | "D")
+ // "\\" ("w" | "W" | "s" | "S" | "d" | "D" | "v" | "V" | "h" | "H")
IElementType CHAR_CLASS = new RegExpElementType("CHAR_CLASS");
// "\\u" XXXX
IElementType UNICODE_CHAR = new RegExpElementType("UNICODE_CHAR");
diff --git a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex
index 1737148b6cda..af0eb9bb6329 100644
--- a/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex
+++ b/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex
@@ -33,6 +33,7 @@ import com.intellij.psi.StringEscapesTokenTypes;
private boolean allowOctalNoLeadingZero;
private boolean allowHexDigitClass;
private boolean allowEmptyCharacterClass;
+ private boolean allowHorizontalWhitespaceClass;
_RegExLexer(EnumSet capabilities) {
this((java.io.Reader)null);
@@ -42,6 +43,7 @@ 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);
}
@@ -99,7 +101,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"
@@ -159,7 +161,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; }
diff --git a/RegExpSupport/testData/RETest.xml b/RegExpSupport/testData/RETest.xml
index 10e04dcf80fa..3aac79ea8de6 100644
--- a/RegExpSupport/testData/RETest.xml
+++ b/RegExpSupport/testData/RETest.xml
@@ -1001,4 +1001,11 @@
OK
+
+
+
+ \h \H \v \V
+ OK
+
+