82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {IS_IDENTIFIER_CHAR, IS_IDENTIFIER_START} from "../parser/util/identifier";
 | 
						|
 | 
						|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar
 | 
						|
// Hard-code a list of reserved words rather than trying to use keywords or contextual keywords
 | 
						|
// from the parser, since currently there are various exceptions, like `package` being reserved
 | 
						|
// but unused and various contextual keywords being reserved. Note that we assume that all code
 | 
						|
// compiled by Sucrase is in a module, so strict mode words and await are all considered reserved
 | 
						|
// here.
 | 
						|
const RESERVED_WORDS = new Set([
 | 
						|
  // Reserved keywords as of ECMAScript 2015
 | 
						|
  "break",
 | 
						|
  "case",
 | 
						|
  "catch",
 | 
						|
  "class",
 | 
						|
  "const",
 | 
						|
  "continue",
 | 
						|
  "debugger",
 | 
						|
  "default",
 | 
						|
  "delete",
 | 
						|
  "do",
 | 
						|
  "else",
 | 
						|
  "export",
 | 
						|
  "extends",
 | 
						|
  "finally",
 | 
						|
  "for",
 | 
						|
  "function",
 | 
						|
  "if",
 | 
						|
  "import",
 | 
						|
  "in",
 | 
						|
  "instanceof",
 | 
						|
  "new",
 | 
						|
  "return",
 | 
						|
  "super",
 | 
						|
  "switch",
 | 
						|
  "this",
 | 
						|
  "throw",
 | 
						|
  "try",
 | 
						|
  "typeof",
 | 
						|
  "var",
 | 
						|
  "void",
 | 
						|
  "while",
 | 
						|
  "with",
 | 
						|
  "yield",
 | 
						|
  // Future reserved keywords
 | 
						|
  "enum",
 | 
						|
  "implements",
 | 
						|
  "interface",
 | 
						|
  "let",
 | 
						|
  "package",
 | 
						|
  "private",
 | 
						|
  "protected",
 | 
						|
  "public",
 | 
						|
  "static",
 | 
						|
  "await",
 | 
						|
  // Literals that cannot be used as identifiers
 | 
						|
  "false",
 | 
						|
  "null",
 | 
						|
  "true",
 | 
						|
]);
 | 
						|
 | 
						|
/**
 | 
						|
 * Determine if the given name is a legal variable name.
 | 
						|
 *
 | 
						|
 * This is needed when transforming TypeScript enums; if an enum key is a valid
 | 
						|
 * variable name, it might be referenced later in the enum, so we need to
 | 
						|
 * declare a variable.
 | 
						|
 */
 | 
						|
export default function isIdentifier(name) {
 | 
						|
  if (name.length === 0) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  if (!IS_IDENTIFIER_START[name.charCodeAt(0)]) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  for (let i = 1; i < name.length; i++) {
 | 
						|
    if (!IS_IDENTIFIER_CHAR[name.charCodeAt(i)]) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return !RESERVED_WORDS.has(name);
 | 
						|
}
 |