WEB-11957 Valid JavaScript regexp marked as red

This commit is contained in:
Konstantin Ulitin
2014-04-29 15:22:48 +04:00
parent a15d3978d9
commit 2ebc87153f
5 changed files with 43 additions and 34 deletions
@@ -1,4 +1,4 @@
/* The following code was generated by JFlex 1.4.3 on 4/26/14 1:54 PM */
/* The following code was generated by JFlex 1.4.3 on 4/29/14 2:27 PM */
/* 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
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
* on 4/26/14 1:54 PM from the specification file
* <tt>/Users/ignatov/src/ultimate/tools/lexer/../../community/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex</tt>
* on 4/29/14 2:27 PM from the specification file
* <tt>C:/idea_src/ultimate/tools/lexer/../../community/RegExpSupport/src/org/intellij/lang/regexp/regexp-lexer.flex</tt>
*/
class _RegExLexer implements FlexLexer {
/** initial size of the lookahead buffer */
@@ -377,6 +377,7 @@ class _RegExLexer implements FlexLexer {
private boolean allowNestedCharacterClasses;
private boolean allowOctalNoLeadingZero;
private boolean allowHexDigitClass;
private boolean allowEmptyCharacterClass;
_RegExLexer(EnumSet<RegExpCapability> capabilities) {
this((java.io.Reader)null);
@@ -386,6 +387,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.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS);
}
private void yypushstate(int state) {
@@ -787,6 +789,18 @@ class _RegExLexer implements FlexLexer {
{ yybegin(QUOTED_NAMED_GROUP); return RegExpTT.RUBY_QUOTED_NAMED_GROUP;
}
case 107: break;
case 65:
// lookahead expression with fixed base length
zzMarkedPos = zzStartRead + 1;
{ if (allowEmptyCharacterClass) {
yypushstate(CLASS1PY);
}
else {
yypushstate(CLASS2);
}
return RegExpTT.CLASS_BEGIN;
}
case 108: break;
case 28:
{ if (allowNestedCharacterClasses) {
yypushstate(CLASS2);
@@ -794,87 +808,75 @@ class _RegExLexer implements FlexLexer {
}
return RegExpTT.CHARACTER;
}
case 108: break;
case 109: break;
case 19:
{ if (commentMode) { yypushstate(COMMENT); return RegExpTT.COMMENT; } else return RegExpTT.CHARACTER;
}
case 109: break;
case 110: break;
case 50:
{ yypushstate(PROP); return RegExpTT.PROPERTY;
}
case 110: break;
case 111: break;
case 8:
{ yypushstate(CLASS2);
return RegExpTT.CLASS_BEGIN;
}
case 111: break;
case 112: break;
case 70:
{ return RegExpTT.POS_LOOKBEHIND;
}
case 112: break;
case 113: break;
case 42:
{ return yystate() != CLASS2 ? RegExpTT.BACKREF : RegExpTT.ESC_CHARACTER;
}
case 113: break;
case 114: break;
case 72:
{ return RegExpTT.HEX_CHAR;
}
case 114: break;
case 115: break;
case 1:
{ handleOptions(); return RegExpTT.OPTIONS_ON;
}
case 115: break;
case 116: break;
case 58:
{ return allowNestedCharacterClasses ? RegExpTT.ANDAND : RegExpTT.CHARACTER;
}
case 116: break;
case 117: break;
case 2:
{ yypopstate(); return RegExpTT.COMMENT;
}
case 117: break;
case 118: break;
case 17:
{ return RegExpTT.MINUS;
}
case 118: break;
case 119: break;
case 46:
{ return RegExpTT.ESC_CTRL_CHARACTER;
}
case 119: break;
case 120: break;
case 32:
{ yypopstate(); yypushstate(EMBRACED); return RegExpTT.LBRACE;
}
case 120: break;
case 121: break;
case 13:
{ return RegExpTT.QUEST;
}
case 121: break;
case 122: break;
case 54:
{ return (allowHexDigitClass ? RegExpTT.CHAR_CLASS : StringEscapesTokenTypes.INVALID_CHARACTER_ESCAPE_TOKEN);
}
case 122: break;
case 123: break;
case 15:
{ return RegExpTT.PLUS;
}
case 123: break;
case 124: break;
case 66:
{ return RegExpTT.OCT_CHAR;
}
case 124: break;
case 125: break;
case 38:
{ yybegin(YYINITIAL); return RegExpTT.QUOTE;
}
case 125: break;
case 65:
// lookahead expression with fixed base length
zzMarkedPos = zzStartRead + 1;
{ if (!allowNestedCharacterClasses) {
yypushstate(CLASS1PY);
}
else {
yypushstate(CLASS2);
}
return RegExpTT.CLASS_BEGIN;
}
case 126: break;
case 20:
{ if (allowDanglingMetacharacters) {
@@ -26,4 +26,5 @@ public enum RegExpCapability {
OMIT_NUMBERS_IN_QUANTIFIERS,
COMMENT_MODE,
ALLOW_HEX_DIGIT_CLASS,
ALLOW_EMPTY_CHARACTER_CLASS,
}
@@ -32,6 +32,7 @@ import com.intellij.psi.StringEscapesTokenTypes;
private boolean allowNestedCharacterClasses;
private boolean allowOctalNoLeadingZero;
private boolean allowHexDigitClass;
private boolean allowEmptyCharacterClass;
_RegExLexer(EnumSet<RegExpCapability> capabilities) {
this((java.io.Reader)null);
@@ -41,6 +42,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.allowEmptyCharacterClass = capabilities.contains(RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS);
}
private void yypushstate(int state) {
@@ -217,7 +219,7 @@ HEX_CHAR=[0-9a-fA-F]
return RegExpTT.CLASS_BEGIN; }
/* Python understands that, Java doesn't */
{LBRACKET} / "^" {RBRACKET} { if (!allowNestedCharacterClasses) {
{LBRACKET} / "^" {RBRACKET} { if (allowEmptyCharacterClass) {
yypushstate(CLASS1PY);
}
else {
@@ -8,5 +8,8 @@
</extensions>
<extensions defaultExtensionNs="com.intellij">
<patterns.patternClass className="com.intellij.lang.javascript.patterns.JSPatterns" alias="js"/>
<lang.parserDefinition language="JSRegexp" implementationClass="com.intellij.lang.javascript.inject.JSRegexpParserDefinition"/>
<regExpLanguageHost forClass="com.intellij.lang.javascript.psi.impl.JSLiteralExpressionImpl"
implementationClass="com.intellij.lang.javascript.inject.JSRegexpHost"/>
</extensions>
</idea-plugin>
@@ -33,7 +33,8 @@ public class PythonRegexpParserDefinition extends RegExpParserDefinition {
public static final IFileElementType PYTHON_REGEXP_FILE = new IFileElementType("PYTHON_REGEXP_FILE", PythonRegexpLanguage.INSTANCE);
protected final EnumSet<RegExpCapability> CAPABILITIES = EnumSet.of(RegExpCapability.DANGLING_METACHARACTERS,
RegExpCapability.OCTAL_NO_LEADING_ZERO,
RegExpCapability.OMIT_NUMBERS_IN_QUANTIFIERS);
RegExpCapability.OMIT_NUMBERS_IN_QUANTIFIERS,
RegExpCapability.ALLOW_EMPTY_CHARACTER_CLASS);
@NotNull
public Lexer createLexer(Project project) {