Skip to content

Commit

Permalink
Reduce execution time by ~50% by updating getEnabledRulesPerLineNumbe…
Browse files Browse the repository at this point in the history
…r to make enabledRules immutable and copy only when changed (also, simplify handleInlineConfig slightly).
  • Loading branch information
DavidAnson committed Dec 22, 2021
1 parent 7cf9c2d commit ff8f4ea
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 30 deletions.
27 changes: 14 additions & 13 deletions demo/markdownlint-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1239,8 +1239,7 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin
var enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length);
// Helper functions
// eslint-disable-next-line jsdoc/require-jsdoc
function handleInlineConfig(perLine, forEachMatch, forEachLine) {
var input = perLine ? lines : [lines.join("\n")];
function handleInlineConfig(input, forEachMatch, forEachLine) {
input.forEach(function (line, lineIndex) {
if (!noInlineConfig) {
var match = null;
Expand Down Expand Up @@ -1269,6 +1268,7 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin
}
// eslint-disable-next-line jsdoc/require-jsdoc
function applyEnableDisable(action, parameter, state) {
state = __assign({}, state);
var enabled = (action.startsWith("ENABLE"));
var items = parameter ?
parameter.trim().toUpperCase().split(/\s+/) :
Expand All @@ -1278,48 +1278,49 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin
state[ruleName] = enabled;
});
});
return state;
}
// eslint-disable-next-line jsdoc/require-jsdoc
function enableDisableFile(action, parameter) {
if ((action === "ENABLE-FILE") || (action === "DISABLE-FILE")) {
applyEnableDisable(action, parameter, enabledRules);
enabledRules = applyEnableDisable(action, parameter, enabledRules);
}
}
// eslint-disable-next-line jsdoc/require-jsdoc
function captureRestoreEnableDisable(action, parameter) {
if (action === "CAPTURE") {
capturedRules = __assign({}, enabledRules);
capturedRules = enabledRules;
}
else if (action === "RESTORE") {
enabledRules = __assign({}, capturedRules);
enabledRules = capturedRules;
}
else if ((action === "ENABLE") || (action === "DISABLE")) {
enabledRules = __assign({}, enabledRules);
applyEnableDisable(action, parameter, enabledRules);
enabledRules = applyEnableDisable(action, parameter, enabledRules);
}
}
// eslint-disable-next-line jsdoc/require-jsdoc
function updateLineState() {
enabledRulesPerLineNumber.push(__assign({}, enabledRules));
enabledRulesPerLineNumber.push(enabledRules);
}
// eslint-disable-next-line jsdoc/require-jsdoc
function disableNextLine(action, parameter, lineNumber) {
if (action === "DISABLE-NEXT-LINE") {
applyEnableDisable(action, parameter, enabledRulesPerLineNumber[lineNumber + 1] || {});
enabledRulesPerLineNumber[lineNumber + 1] =
applyEnableDisable(action, parameter, enabledRulesPerLineNumber[lineNumber + 1] || {});
}
}
// Handle inline comments
handleInlineConfig(false, configureFile);
handleInlineConfig([lines.join("\n")], configureFile);
var effectiveConfig = getEffectiveConfig(ruleList, config, aliasToRuleNames);
ruleList.forEach(function (rule) {
var ruleName = rule.names[0].toUpperCase();
allRuleNames.push(ruleName);
enabledRules[ruleName] = !!effectiveConfig[ruleName];
});
capturedRules = enabledRules;
handleInlineConfig(true, enableDisableFile);
handleInlineConfig(true, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(true, disableNextLine);
handleInlineConfig(lines, enableDisableFile);
handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(lines, disableNextLine);
// Return results
return {
effectiveConfig: effectiveConfig,
Expand Down
35 changes: 18 additions & 17 deletions lib/markdownlint.js
Original file line number Diff line number Diff line change
Expand Up @@ -337,8 +337,7 @@ function getEnabledRulesPerLineNumber(
const enabledRulesPerLineNumber = new Array(1 + frontMatterLines.length);
// Helper functions
// eslint-disable-next-line jsdoc/require-jsdoc
function handleInlineConfig(perLine, forEachMatch, forEachLine) {
const input = perLine ? lines : [ lines.join("\n") ];
function handleInlineConfig(input, forEachMatch, forEachLine) {
input.forEach((line, lineIndex) => {
if (!noInlineConfig) {
let match = null;
Expand Down Expand Up @@ -369,6 +368,7 @@ function getEnabledRulesPerLineNumber(
}
// eslint-disable-next-line jsdoc/require-jsdoc
function applyEnableDisable(action, parameter, state) {
state = { ...state };
const enabled = (action.startsWith("ENABLE"));
const items = parameter ?
parameter.trim().toUpperCase().split(/\s+/) :
Expand All @@ -378,40 +378,41 @@ function getEnabledRulesPerLineNumber(
state[ruleName] = enabled;
});
});
return state;
}
// eslint-disable-next-line jsdoc/require-jsdoc
function enableDisableFile(action, parameter) {
if ((action === "ENABLE-FILE") || (action === "DISABLE-FILE")) {
applyEnableDisable(action, parameter, enabledRules);
enabledRules = applyEnableDisable(action, parameter, enabledRules);
}
}
// eslint-disable-next-line jsdoc/require-jsdoc
function captureRestoreEnableDisable(action, parameter) {
if (action === "CAPTURE") {
capturedRules = { ...enabledRules };
capturedRules = enabledRules;
} else if (action === "RESTORE") {
enabledRules = { ...capturedRules };
enabledRules = capturedRules;
} else if ((action === "ENABLE") || (action === "DISABLE")) {
enabledRules = { ...enabledRules };
applyEnableDisable(action, parameter, enabledRules);
enabledRules = applyEnableDisable(action, parameter, enabledRules);
}
}
// eslint-disable-next-line jsdoc/require-jsdoc
function updateLineState() {
enabledRulesPerLineNumber.push({ ...enabledRules });
enabledRulesPerLineNumber.push(enabledRules);
}
// eslint-disable-next-line jsdoc/require-jsdoc
function disableNextLine(action, parameter, lineNumber) {
if (action === "DISABLE-NEXT-LINE") {
applyEnableDisable(
action,
parameter,
enabledRulesPerLineNumber[lineNumber + 1] || {}
);
enabledRulesPerLineNumber[lineNumber + 1] =
applyEnableDisable(
action,
parameter,
enabledRulesPerLineNumber[lineNumber + 1] || {}
);
}
}
// Handle inline comments
handleInlineConfig(false, configureFile);
handleInlineConfig([ lines.join("\n") ], configureFile);
const effectiveConfig = getEffectiveConfig(
ruleList, config, aliasToRuleNames);
ruleList.forEach((rule) => {
Expand All @@ -420,9 +421,9 @@ function getEnabledRulesPerLineNumber(
enabledRules[ruleName] = !!effectiveConfig[ruleName];
});
capturedRules = enabledRules;
handleInlineConfig(true, enableDisableFile);
handleInlineConfig(true, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(true, disableNextLine);
handleInlineConfig(lines, enableDisableFile);
handleInlineConfig(lines, captureRestoreEnableDisable, updateLineState);
handleInlineConfig(lines, disableNextLine);
// Return results
return {
effectiveConfig,
Expand Down

0 comments on commit ff8f4ea

Please sign in to comment.