Reduce execution time by ~50% by updating getEnabledRulesPerLineNumber to make enabledRules immutable and copy only when changed (also, simplify handleInlineConfig slightly).

This commit is contained in:
David Anson 2021-12-21 21:31:47 -08:00
parent 7cf9c2d6be
commit ff8f4ea9fc
2 changed files with 32 additions and 30 deletions

View file

@ -1239,8 +1239,7 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin
var enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length); var enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length);
// Helper functions // Helper functions
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function handleInlineConfig(perLine, forEachMatch, forEachLine) { function handleInlineConfig(input, forEachMatch, forEachLine) {
var input = perLine ? lines : [lines.join("\n")];
input.forEach(function (line, lineIndex) { input.forEach(function (line, lineIndex) {
if (!noInlineConfig) { if (!noInlineConfig) {
var match = null; var match = null;
@ -1269,6 +1268,7 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function applyEnableDisable(action, parameter, state) { function applyEnableDisable(action, parameter, state) {
state = __assign({}, state);
var enabled = (action.startsWith("ENABLE")); var enabled = (action.startsWith("ENABLE"));
var items = parameter ? var items = parameter ?
parameter.trim().toUpperCase().split(/\s+/) : parameter.trim().toUpperCase().split(/\s+/) :
@ -1278,38 +1278,39 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin
state[ruleName] = enabled; state[ruleName] = enabled;
}); });
}); });
return state;
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function enableDisableFile(action, parameter) { function enableDisableFile(action, parameter) {
if ((action === "ENABLE-FILE") || (action === "DISABLE-FILE")) { if ((action === "ENABLE-FILE") || (action === "DISABLE-FILE")) {
applyEnableDisable(action, parameter, enabledRules); enabledRules = applyEnableDisable(action, parameter, enabledRules);
} }
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function captureRestoreEnableDisable(action, parameter) { function captureRestoreEnableDisable(action, parameter) {
if (action === "CAPTURE") { if (action === "CAPTURE") {
capturedRules = __assign({}, enabledRules); capturedRules = enabledRules;
} }
else if (action === "RESTORE") { else if (action === "RESTORE") {
enabledRules = __assign({}, capturedRules); enabledRules = capturedRules;
} }
else if ((action === "ENABLE") || (action === "DISABLE")) { else if ((action === "ENABLE") || (action === "DISABLE")) {
enabledRules = __assign({}, enabledRules); enabledRules = applyEnableDisable(action, parameter, enabledRules);
applyEnableDisable(action, parameter, enabledRules);
} }
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function updateLineState() { function updateLineState() {
enabledRulesPerLineNumber.push(__assign({}, enabledRules)); enabledRulesPerLineNumber.push(enabledRules);
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function disableNextLine(action, parameter, lineNumber) { function disableNextLine(action, parameter, lineNumber) {
if (action === "DISABLE-NEXT-LINE") { if (action === "DISABLE-NEXT-LINE") {
enabledRulesPerLineNumber[lineNumber + 1] =
applyEnableDisable(action, parameter, enabledRulesPerLineNumber[lineNumber + 1] || {}); applyEnableDisable(action, parameter, enabledRulesPerLineNumber[lineNumber + 1] || {});
} }
} }
// Handle inline comments // Handle inline comments
handleInlineConfig(false, configureFile); handleInlineConfig([lines.join("\n")], configureFile);
var effectiveConfig = getEffectiveConfig(ruleList, config, aliasToRuleNames); var effectiveConfig = getEffectiveConfig(ruleList, config, aliasToRuleNames);
ruleList.forEach(function (rule) { ruleList.forEach(function (rule) {
var ruleName = rule.names[0].toUpperCase(); var ruleName = rule.names[0].toUpperCase();
@ -1317,9 +1318,9 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin
enabledRules[ruleName] = !!effectiveConfig[ruleName]; enabledRules[ruleName] = !!effectiveConfig[ruleName];
}); });
capturedRules = enabledRules; capturedRules = enabledRules;
handleInlineConfig(true, enableDisableFile); handleInlineConfig(lines, enableDisableFile);
handleInlineConfig(true, captureRestoreEnableDisable, updateLineState); handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(true, disableNextLine); handleInlineConfig(lines, disableNextLine);
// Return results // Return results
return { return {
effectiveConfig: effectiveConfig, effectiveConfig: effectiveConfig,

View file

@ -337,8 +337,7 @@ function getEnabledRulesPerLineNumber(
const enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length); const enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length);
// Helper functions // Helper functions
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function handleInlineConfig(perLine, forEachMatch, forEachLine) { function handleInlineConfig(input, forEachMatch, forEachLine) {
const input = perLine ? lines : [ lines.join("\n") ];
input.forEach((line, lineIndex) => { input.forEach((line, lineIndex) => {
if (!noInlineConfig) { if (!noInlineConfig) {
let match = null; let match = null;
@ -369,6 +368,7 @@ function getEnabledRulesPerLineNumber(
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function applyEnableDisable(action, parameter, state) { function applyEnableDisable(action, parameter, state) {
state = { ...state };
const enabled = (action.startsWith("ENABLE")); const enabled = (action.startsWith("ENABLE"));
const items = parameter ? const items = parameter ?
parameter.trim().toUpperCase().split(/\s+/) : parameter.trim().toUpperCase().split(/\s+/) :
@ -378,31 +378,32 @@ function getEnabledRulesPerLineNumber(
state[ruleName] = enabled; state[ruleName] = enabled;
}); });
}); });
return state;
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function enableDisableFile(action, parameter) { function enableDisableFile(action, parameter) {
if ((action === "ENABLE-FILE") || (action === "DISABLE-FILE")) { if ((action === "ENABLE-FILE") || (action === "DISABLE-FILE")) {
applyEnableDisable(action, parameter, enabledRules); enabledRules = applyEnableDisable(action, parameter, enabledRules);
} }
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function captureRestoreEnableDisable(action, parameter) { function captureRestoreEnableDisable(action, parameter) {
if (action === "CAPTURE") { if (action === "CAPTURE") {
capturedRules = { ...enabledRules }; capturedRules = enabledRules;
} else if (action === "RESTORE") { } else if (action === "RESTORE") {
enabledRules = { ...capturedRules }; enabledRules = capturedRules;
} else if ((action === "ENABLE") || (action === "DISABLE")) { } else if ((action === "ENABLE") || (action === "DISABLE")) {
enabledRules = { ...enabledRules }; enabledRules = applyEnableDisable(action, parameter, enabledRules);
applyEnableDisable(action, parameter, enabledRules);
} }
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function updateLineState() { function updateLineState() {
enabledRulesPerLineNumber.push({ ...enabledRules }); enabledRulesPerLineNumber.push(enabledRules);
} }
// eslint-disable-next-line jsdoc/require-jsdoc // eslint-disable-next-line jsdoc/require-jsdoc
function disableNextLine(action, parameter, lineNumber) { function disableNextLine(action, parameter, lineNumber) {
if (action === "DISABLE-NEXT-LINE") { if (action === "DISABLE-NEXT-LINE") {
enabledRulesPerLineNumber[lineNumber + 1] =
applyEnableDisable( applyEnableDisable(
action, action,
parameter, parameter,
@ -411,7 +412,7 @@ function getEnabledRulesPerLineNumber(
} }
} }
// Handle inline comments // Handle inline comments
handleInlineConfig(false, configureFile); handleInlineConfig([ lines.join("\n") ], configureFile);
const effectiveConfig = getEffectiveConfig( const effectiveConfig = getEffectiveConfig(
ruleList, config, aliasToRuleNames); ruleList, config, aliasToRuleNames);
ruleList.forEach((rule) => { ruleList.forEach((rule) => {
@ -420,9 +421,9 @@ function getEnabledRulesPerLineNumber(
enabledRules[ruleName] = !!effectiveConfig[ruleName]; enabledRules[ruleName] = !!effectiveConfig[ruleName];
}); });
capturedRules = enabledRules; capturedRules = enabledRules;
handleInlineConfig(true, enableDisableFile); handleInlineConfig(lines, enableDisableFile);
handleInlineConfig(true, captureRestoreEnableDisable, updateLineState); handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(true, disableNextLine); handleInlineConfig(lines, disableNextLine);
// Return results // Return results
return { return {
effectiveConfig, effectiveConfig,