UNPKG

feeles-ide

Version:

The hackable and serializable IDE to make learning material

52 lines (38 loc) 1.82 kB
"use strict"; 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; }