You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
1.9 KiB
105 lines
1.9 KiB
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
class IdentifierGenerator { |
|
constructor() { |
|
// u 被框架占用了,不提供 u 开头的变量名 |
|
this._chars = 'abcdefghijklmnopqrstvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
|
this._nextIds = [0]; |
|
} |
|
next() { |
|
const r = []; |
|
for (const char of this._nextIds) { |
|
r.unshift(this._chars[char]); |
|
} |
|
this._increment(); |
|
const id = r.join(''); |
|
if (keywords.includes(id)) { |
|
return this.next(); |
|
} |
|
return id; |
|
} |
|
_increment() { |
|
for (let i = 0; i < this._nextIds.length; i++) { |
|
const val = ++this._nextIds[i]; |
|
if (val >= this._chars.length) { |
|
this._nextIds[i] = 0; |
|
} |
|
else { |
|
return; |
|
} |
|
} |
|
this._nextIds.push(0); |
|
} |
|
*[Symbol.iterator]() { |
|
while (true) { |
|
yield this.next(); |
|
} |
|
} |
|
} |
|
exports.default = IdentifierGenerator; |
|
const keywords = [ |
|
'abstract', |
|
'arguments', |
|
'await', |
|
'boolean', |
|
'break', |
|
'byte', |
|
'case', |
|
'catch', |
|
'char', |
|
'class', |
|
'const', |
|
'continue', |
|
'debugger', |
|
'default', |
|
'delete', |
|
'do', |
|
'double', |
|
'else', |
|
'enum', |
|
'eval', |
|
'export', |
|
'extends', |
|
'false', |
|
'final', |
|
'finally', |
|
'float', |
|
'for', |
|
'function', |
|
'goto', |
|
'if', |
|
'implements', |
|
'import', |
|
'in', |
|
'instanceof', |
|
'int', |
|
'interface', |
|
'let', |
|
'long', |
|
'native', |
|
'new', |
|
'null', |
|
'package', |
|
'private', |
|
'protected', |
|
'public', |
|
'return', |
|
'short', |
|
'static', |
|
'super', |
|
'switch', |
|
'synchronized', |
|
'this', |
|
'throw', |
|
'throws', |
|
'transient', |
|
'true', |
|
'try', |
|
'typeof', |
|
'var', |
|
'void', |
|
'volatile', |
|
'while', |
|
'with', |
|
'yield', |
|
];
|
|
|