diff --git a/platform/platform-api/src/com/intellij/patterns/StringPattern.java b/platform/platform-api/src/com/intellij/patterns/StringPattern.java index 648ad01fda34..fb00b2afd3a8 100644 --- a/platform/platform-api/src/com/intellij/patterns/StringPattern.java +++ b/platform/platform-api/src/com/intellij/patterns/StringPattern.java @@ -17,6 +17,10 @@ package com.intellij.patterns; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ProcessingContext; +import dk.brics.automaton.Automaton; +import dk.brics.automaton.DatatypesAutomatonProvider; +import dk.brics.automaton.RegExp; +import dk.brics.automaton.RunAutomaton; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -91,6 +95,7 @@ public class StringPattern extends ObjectPattern { return equalTo(s); } final Pattern pattern = Pattern.compile(s); + return with(new ValuePatternCondition("matches") { public boolean accepts(@NotNull final String str, final ProcessingContext context) { return pattern.matcher(str).matches(); @@ -103,6 +108,44 @@ public class StringPattern extends ObjectPattern { }); } + @NotNull + public StringPattern matchesBrics(@NonNls @NotNull final String s) { + final String escaped = StringUtil.escapeToRegexp(s); + if (escaped.equals(s)) { + return equalTo(s); + } + + StringBuilder sb = new StringBuilder(s.length()*5); + for (int i = 0; i < s.length(); i++) { + final char c = s.charAt(i); + if(c == ' ') { + sb.append(""); + } + else + if(Character.isUpperCase(c)) { + sb.append('[').append(Character.toUpperCase(c)).append(Character.toLowerCase(c)).append(']'); + } + else + { + sb.append(c); + } + } + final RegExp regExp = new RegExp(sb.toString()); + final Automaton automaton = regExp.toAutomaton(new DatatypesAutomatonProvider()); + final RunAutomaton runAutomaton = new RunAutomaton(automaton, true); + + return with(new ValuePatternCondition("matchesBrics") { + public boolean accepts(@NotNull final String str, final ProcessingContext context) { + return runAutomaton.run(str); + } + + @Override + public Collection getValues() { + return Collections.singleton(s); + } + }); + } + @NotNull public StringPattern contains(@NonNls @NotNull final ElementPattern pattern) { return with(new PatternCondition("contains") {