|
|
|
@ -7,12 +7,12 @@ import { MappedCode } from '../utils/mapped_code';
|
|
|
|
* @returns {Source}
|
|
|
|
* @returns {Source}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function slice_source(code_slice, offset, { file_basename, filename, get_location }) {
|
|
|
|
export function slice_source(code_slice, offset, { file_basename, filename, get_location }) {
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
source: code_slice,
|
|
|
|
source: code_slice,
|
|
|
|
get_location: (index) => get_location(index + offset),
|
|
|
|
get_location: (index) => get_location(index + offset),
|
|
|
|
file_basename,
|
|
|
|
file_basename,
|
|
|
|
filename
|
|
|
|
filename
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
@ -21,20 +21,21 @@ export function slice_source(code_slice, offset, { file_basename, filename, get_
|
|
|
|
* @param {string} source
|
|
|
|
* @param {string} source
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
function calculate_replacements(re, get_replacement, source) {
|
|
|
|
function calculate_replacements(re, get_replacement, source) {
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @type {Array<Promise<Replacement>>}
|
|
|
|
* @type {Array<Promise<Replacement>>}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
const replacements = [];
|
|
|
|
const replacements = [];
|
|
|
|
source.replace(re, (...match) => {
|
|
|
|
source.replace(re, (...match) => {
|
|
|
|
replacements.push(
|
|
|
|
replacements.push(get_replacement(...match).then((replacement) => {
|
|
|
|
get_replacement(...match).then((replacement) => {
|
|
|
|
const matched_string = match[0];
|
|
|
|
const matched_string = match[0];
|
|
|
|
const offset = match[match.length - 2];
|
|
|
|
const offset = match[match.length - 2];
|
|
|
|
return { offset, length: matched_string.length, replacement };
|
|
|
|
return { offset, length: matched_string.length, replacement };
|
|
|
|
}));
|
|
|
|
})
|
|
|
|
return '';
|
|
|
|
);
|
|
|
|
});
|
|
|
|
return '';
|
|
|
|
return Promise.all(replacements);
|
|
|
|
});
|
|
|
|
|
|
|
|
return Promise.all(replacements);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
@ -43,15 +44,19 @@ function calculate_replacements(re, get_replacement, source) {
|
|
|
|
* @returns {MappedCode}
|
|
|
|
* @returns {MappedCode}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
function perform_replacements(replacements, source) {
|
|
|
|
function perform_replacements(replacements, source) {
|
|
|
|
const out = new MappedCode();
|
|
|
|
const out = new MappedCode();
|
|
|
|
let last_end = 0;
|
|
|
|
let last_end = 0;
|
|
|
|
for (const { offset, length, replacement } of replacements) {
|
|
|
|
for (const { offset, length, replacement } of replacements) {
|
|
|
|
const unchanged_prefix = MappedCode.from_source(slice_source(source.source.slice(last_end, offset), last_end, source));
|
|
|
|
const unchanged_prefix = MappedCode.from_source(
|
|
|
|
out.concat(unchanged_prefix).concat(replacement);
|
|
|
|
slice_source(source.source.slice(last_end, offset), last_end, source)
|
|
|
|
last_end = offset + length;
|
|
|
|
);
|
|
|
|
}
|
|
|
|
out.concat(unchanged_prefix).concat(replacement);
|
|
|
|
const unchanged_suffix = MappedCode.from_source(slice_source(source.source.slice(last_end), last_end, source));
|
|
|
|
last_end = offset + length;
|
|
|
|
return out.concat(unchanged_suffix);
|
|
|
|
}
|
|
|
|
|
|
|
|
const unchanged_suffix = MappedCode.from_source(
|
|
|
|
|
|
|
|
slice_source(source.source.slice(last_end), last_end, source)
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
return out.concat(unchanged_suffix);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
@ -61,15 +66,12 @@ function perform_replacements(replacements, source) {
|
|
|
|
* @returns {Promise<MappedCode>}
|
|
|
|
* @returns {Promise<MappedCode>}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export async function replace_in_code(regex, get_replacement, location) {
|
|
|
|
export async function replace_in_code(regex, get_replacement, location) {
|
|
|
|
const replacements = await calculate_replacements(regex, get_replacement, location.source);
|
|
|
|
const replacements = await calculate_replacements(regex, get_replacement, location.source);
|
|
|
|
return perform_replacements(replacements, location);
|
|
|
|
return perform_replacements(replacements, location);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** @typedef {Object} Replacement
|
|
|
|
/** @typedef {Object} Replacement
|
|
|
|
* @property {number} offset
|
|
|
|
* @property {number} offset
|
|
|
|
* @property {number} length
|
|
|
|
* @property {number} length
|
|
|
|
* @property {MappedCode} replacement
|
|
|
|
* @property {MappedCode} replacement
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|