In case the JavaScript Regexp does not parse the expression, use the regular Java one (if available)
1.1 --- a/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java Mon Oct 21 15:06:14 2013 +0200
1.2 +++ b/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/CompareStringsTest.java Mon Oct 21 15:16:04 2013 +0200
1.3 @@ -185,6 +185,10 @@
1.4 return "org.apidesign.bck2brwsr.core.JavaScriptBody".replace(".", "\\.");
1.5 }
1.6
1.7 + @Compare public boolean matchWithComplicatedRegExp() {
1.8 + return "Activates this model instance.".matches("(?sm).*^\\s*@deprecated( |$).*");
1.9 + }
1.10 +
1.11 @Factory
1.12 public static Object[] create() {
1.13 return VMTest.create(CompareStringsTest.class);
2.1 --- a/rt/emul/mini/src/main/java/java/lang/String.java Mon Oct 21 15:06:14 2013 +0200
2.2 +++ b/rt/emul/mini/src/main/java/java/lang/String.java Mon Oct 21 15:16:04 2013 +0200
2.3 @@ -26,6 +26,8 @@
2.4 package java.lang;
2.5
2.6 import java.io.UnsupportedEncodingException;
2.7 +import java.lang.reflect.InvocationTargetException;
2.8 +import java.lang.reflect.Method;
2.9 import java.util.Comparator;
2.10 import java.util.Locale;
2.11 import org.apidesign.bck2brwsr.core.ExtraJavaScript;
2.12 @@ -2098,13 +2100,31 @@
2.13 * @since 1.4
2.14 * @spec JSR-51
2.15 */
2.16 + public boolean matches(String regex) {
2.17 + try {
2.18 + return matchesViaJS(regex);
2.19 + } catch (Throwable t) {
2.20 + // fallback to classical behavior
2.21 + try {
2.22 + Method m = Class.forName("java.util.regex.Pattern").getMethod("matches", String.class, CharSequence.class);
2.23 + return (Boolean)m.invoke(null, regex, this);
2.24 + } catch (InvocationTargetException ex) {
2.25 + if (ex.getTargetException() instanceof RuntimeException) {
2.26 + throw (RuntimeException)ex.getTargetException();
2.27 + }
2.28 + } catch (Throwable another) {
2.29 + // will report the old one
2.30 + }
2.31 + throw new RuntimeException(t);
2.32 + }
2.33 + }
2.34 @JavaScriptBody(args = { "regex" }, body =
2.35 "var self = this.toString();\n"
2.36 + "var re = new RegExp(regex.toString());\n"
2.37 + "var r = re.exec(self);\n"
2.38 + "return r != null && r.length > 0 && self.length == r[0].length;"
2.39 )
2.40 - public boolean matches(String regex) {
2.41 + private boolean matchesViaJS(String regex) {
2.42 throw new UnsupportedOperationException();
2.43 }
2.44