regex: disallow literal backspace [\b] inside java

This commit is contained in:
Bas Leijdekkers
2016-05-23 16:34:35 +02:00
parent 32f7e8cc97
commit fe18bed7c3
5 changed files with 19 additions and 1 deletions
@@ -38,6 +38,10 @@ public interface RegExpLanguageHost {
return true;
}
default boolean supportsLiteralBackspace(RegExpChar aChar) {
return true;
}
boolean isValidCategory(@NotNull String category);
@NotNull
String[][] getAllKnownProperties();
@@ -91,6 +91,11 @@ public final class RegExpLanguageHosts extends ClassExtension<RegExpLanguageHost
}
}
public boolean supportsLiteralBackspace(@Nullable RegExpChar regExpChar) {
final RegExpLanguageHost host = findRegExpHost(regExpChar);
return host != null && host.supportsLiteralBackspace(regExpChar);
}
public boolean supportsNamedGroupSyntax(@Nullable final RegExpGroup group) {
final RegExpLanguageHost host = findRegExpHost(group);
return host != null && host.supportsNamedGroupSyntax(group);
@@ -133,7 +133,7 @@ public final class RegExpAnnotator extends RegExpElementVisitor implements Annot
@Override
public void visitRegExpChar(final RegExpChar ch) {
final Character value = ch.getValue();
if (value == null) {
if (value == null || (value == '\b' && !myLanguageHosts.supportsLiteralBackspace(ch))) {
switch (ch.getType()) {
case CHAR:
myHolder.createErrorAnnotation(ch, "Illegal/unsupported escape sequence");
+4
View File
@@ -434,6 +434,10 @@
<pattern><![CDATA[<weak_warning descr="Redundant character escape">\-</weak_warning>[<weak_warning descr="Redundant character escape">\*</weak_warning>\-\[\]\\<weak_warning descr="Redundant character escape">\+]</weak_warning>]]></pattern>
<expected>OK</expected>
</test>
<test host="com.intellij.psi.impl.JavaRegExpHost">
<pattern>[\b]</pattern>
<expected>ERR</expected>
</test>
</charclasses>
<groups>
@@ -101,6 +101,11 @@ public class JavaRegExpHost implements RegExpLanguageHost {
}
}
@Override
public boolean supportsLiteralBackspace(RegExpChar aChar) {
return false;
}
private static boolean hasAtLeastJdkVersion(PsiElement element, JavaSdkVersion version) {
final JavaSdkVersion version1 = getJavaVersion(element);
return version1 != null && version1.isAtLeast(version);