From e98010bc2d83e18c7dccbb859456b4fa4de90a88 Mon Sep 17 00:00:00 2001 From: lenherr Date: Fri, 9 Mar 2018 18:46:46 -0800 Subject: [PATCH] Refactor rhino code to work around internal Google limitation on Java 8 use. After this change Java 8 can be used anywhere except in TokenStream and JSIdentifier. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=188569116 --- .../google/javascript/rhino/JSIdentifier.java | 38 --------- .../google/javascript/rhino/TokenUtil.java | 6 ++ .../google/javascript/rhino/JSIdentifier.java | 77 ------------------- .../google/javascript/rhino/TokenStream.java | 10 +-- .../google/javascript/rhino/TokenUtil.java | 18 +++++ 5 files changed, 28 insertions(+), 121 deletions(-) delete mode 100644 src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/JSIdentifier.java delete mode 100644 src/com/google/javascript/rhino/JSIdentifier.java diff --git a/src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/JSIdentifier.java b/src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/JSIdentifier.java deleted file mode 100644 index a646ee8603f..00000000000 --- a/src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/JSIdentifier.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2018 The Closure Compiler Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.javascript.rhino; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsType; - -/** Determines whether a string is a valid JS identifier. */ -public class JSIdentifier { - @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "RegExp") - private static class RegExp { - RegExp(String string) {} - native boolean test(String string); - native boolean test(int charcode); - } - - // TODO(moz): Support full range of valid characters. - private static final RegExp JS_IDENTIFIER_REGEX = new RegExp("^[a-zA-Z_$][\\w$]*$"); - - /** Determines whether a string is a valid JS identifier. */ - public static boolean isJSIdentifier(String s) { - return JS_IDENTIFIER_REGEX.test(s); - } -} diff --git a/src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/TokenUtil.java b/src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/TokenUtil.java index bfabc00e90d..299ccf82f46 100644 --- a/src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/TokenUtil.java +++ b/src/com/google/javascript/jscomp/gwt/super/com/google/javascript/rhino/TokenUtil.java @@ -33,8 +33,14 @@ private static class RegExp { native boolean test(int charcode); } + // TODO(moz): Support full range of valid characters. + private static final RegExp JS_IDENTIFIER_REGEX = new RegExp("^[a-zA-Z_$][\\w$]*$"); private static final RegExp WHITE_SPACE_REGEX = new RegExp("\\s"); + static boolean isJSIdentifier(String s) { + return JS_IDENTIFIER_REGEX.test(s); + } + public static boolean isJSSpace(int c) { if (c <= 127) { return c == 0x20 || c == 0x9 || c == 0xC || c == 0xB; diff --git a/src/com/google/javascript/rhino/JSIdentifier.java b/src/com/google/javascript/rhino/JSIdentifier.java deleted file mode 100644 index 83b37d028c1..00000000000 --- a/src/com/google/javascript/rhino/JSIdentifier.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * - * ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Rhino code, released - * May 6, 1999. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1997-1999 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Roger Lawrence - * Mike McCabe - * Igor Bukanov - * Ethan Hugg - * Bob Jervis - * Terry Lucas - * Milen Nankov - * Pascal-Louis Perez - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License Version 2 or later (the "GPL"), in which - * case the provisions of the GPL are applicable instead of those above. If - * you wish to allow use of your version of this file only under the terms of - * the GPL and not to allow others to use your version of this file under the - * MPL, indicate your decision by deleting the provisions above and replacing - * them with the notice and other provisions required by the GPL. If you do - * not delete the provisions above, a recipient may use your version of this - * file under either the MPL or the GPL. - * - * ***** END LICENSE BLOCK ***** */ - -package com.google.javascript.rhino; - -import com.google.common.annotations.GwtIncompatible; - -/** - * Utility class to hold isJSIdentifier. - * - *

Separated into its own class because it is not GWT compatible. - * - * IMPORTANT: As of 2018-03-09 it is still not possible to use Java 8 features in this file - * due to limitations on some internal Google projects that depend on it. - */ -@GwtIncompatible -public class JSIdentifier { - static boolean isJSIdentifier(String s) { - int length = s.length(); - - if (length == 0 - || Character.isIdentifierIgnorable(s.charAt(0)) - || !Character.isJavaIdentifierStart(s.charAt(0))) { - return false; - } - - for (int i = 1; i < length; i++) { - if (Character.isIdentifierIgnorable(s.charAt(i)) - || !Character.isJavaIdentifierPart(s.charAt(i))) { - return false; - } - } - return true; - } -} diff --git a/src/com/google/javascript/rhino/TokenStream.java b/src/com/google/javascript/rhino/TokenStream.java index cf1fbf1393f..55342be09fb 100644 --- a/src/com/google/javascript/rhino/TokenStream.java +++ b/src/com/google/javascript/rhino/TokenStream.java @@ -51,10 +51,8 @@ * It is based on the C source files jsscan.c and jsscan.h * in the jsref package. * - * - * IMPORTANT: As of 2018-03-09 it is still not possible to use Java 8 features in this file - * due to limitations on some internal Google projects that depend on it. */ + public class TokenStream { public static boolean isKeyword(String name) { boolean id = false; @@ -189,7 +187,7 @@ else if (c=='s') { return id; } - public static boolean isJSIdentifier(String s) { - return JSIdentifier.isJSIdentifier(s); - } + public static boolean isJSIdentifier(String s) { + return TokenUtil.isJSIdentifier(s); + } } diff --git a/src/com/google/javascript/rhino/TokenUtil.java b/src/com/google/javascript/rhino/TokenUtil.java index 8a055be16a2..3b1c0eed302 100644 --- a/src/com/google/javascript/rhino/TokenUtil.java +++ b/src/com/google/javascript/rhino/TokenUtil.java @@ -56,6 +56,24 @@ */ @GwtIncompatible("Unsupported java.lang.Character fields") public class TokenUtil { + static boolean isJSIdentifier(String s) { + int length = s.length(); + + if (length == 0 + || Character.isIdentifierIgnorable(s.charAt(0)) + || !Character.isJavaIdentifierStart(s.charAt(0))) { + return false; + } + + for (int i = 1; i < length; i++) { + if (Character.isIdentifierIgnorable(s.charAt(i)) + || !Character.isJavaIdentifierPart(s.charAt(i))) { + return false; + } + } + return true; + } + /* As defined in ECMA. jsscan.c uses C isspace() (which allows * \v, I think.) note that code in getChar() implicitly accepts * '\r' == \u000D as well.