Skip to content

Commit

Permalink
Refactor rhino code to work around internal Google
Browse files Browse the repository at this point in the history
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=188559755
  • Loading branch information
brad4d authored and blickly committed Mar 12, 2018
1 parent 6037dc9 commit 74391d0
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 28 deletions.
@@ -0,0 +1,38 @@
/*
* 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);
}
}
Expand Up @@ -33,14 +33,8 @@ private static class RegExp {
native boolean test(int charcode); 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"); 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) { public static boolean isJSSpace(int c) {
if (c <= 127) { if (c <= 127) {
return c == 0x20 || c == 0x9 || c == 0xC || c == 0xB; return c == 0x20 || c == 0x9 || c == 0xC || c == 0xB;
Expand Down
77 changes: 77 additions & 0 deletions src/com/google/javascript/rhino/JSIdentifier.java
@@ -0,0 +1,77 @@
/*
*
* ***** 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.
*
* <p>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;
}
}
10 changes: 6 additions & 4 deletions src/com/google/javascript/rhino/TokenStream.java
Expand Up @@ -51,8 +51,10 @@
* It is based on the C source files jsscan.c and jsscan.h * It is based on the C source files jsscan.c and jsscan.h
* in the jsref package. * 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 class TokenStream {
public static boolean isKeyword(String name) { public static boolean isKeyword(String name) {
boolean id = false; boolean id = false;
Expand Down Expand Up @@ -187,7 +189,7 @@ else if (c=='s') {
return id; return id;
} }


public static boolean isJSIdentifier(String s) { public static boolean isJSIdentifier(String s) {
return TokenUtil.isJSIdentifier(s); return JSIdentifier.isJSIdentifier(s);
} }
} }
18 changes: 0 additions & 18 deletions src/com/google/javascript/rhino/TokenUtil.java
Expand Up @@ -56,24 +56,6 @@
*/ */
@GwtIncompatible("Unsupported java.lang.Character fields") @GwtIncompatible("Unsupported java.lang.Character fields")
public class TokenUtil { 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 /* As defined in ECMA. jsscan.c uses C isspace() (which allows
* \v, I think.) note that code in getChar() implicitly accepts * \v, I think.) note that code in getChar() implicitly accepts
* '\r' == \u000D as well. * '\r' == \u000D as well.
Expand Down

0 comments on commit 74391d0

Please sign in to comment.