feeles-ide
Version:
The hackable and serializable IDE to make learning material
52 lines (38 loc) • 1.82 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = replaceExistConsts;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var keywordRegExps = [/(const\s)(item)(\d+)/gm, /(const\s)(map)(\d+)/gm];
function replaceExistConsts(code, text) {
var cache = {}; // すでに使われている変数名をここに追加していく
var exists = function exists(searchText) {
if (searchText in cache) return cache[searchText];
return cache[searchText] = code.includes(searchText);
};
for (var _i = 0; _i < keywordRegExps.length; _i++) {
var keyword = keywordRegExps[_i];
// すでに使われている const item{N} のような変数を探す.
keyword.lastIndex = 0; // カーソルをリセット
for (var result = keyword.exec(text); result !== null; result = keyword.exec(text)) {
// e.g. When 'const item1 = 1;': result === ['const item1', 'const ', 'item', '1']
var _result = result,
_result2 = (0, _slicedToArray2.default)(_result, 4),
all = _result2[0],
prefix = _result2[1],
identifier = _result2[2],
init = _result2[3];
if (!exists(all)) continue; // 被っていない => OK
// もし名前が競合していたら, number を 1 ずつインクリメントする
var number = (init >> 0) + 1;
while (exists(prefix + identifier + number)) {
number++;
} // ユニークな名前が見つかった => 置き換え
text = text.split(identifier + init).join(identifier + number);
cache[prefix + identifier + number] = true; // この変数は使われている
}
}
return text;
}