@sasjs/lint
Version:
Linting and formatting for SAS code
119 lines • 6.03 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.hasMacroNameInMend = void 0;
const LintRuleType_1 = require("../../types/LintRuleType");
const Severity_1 = require("../../types/Severity");
const getColumnNumber_1 = require("../../utils/getColumnNumber");
const LineEndings_1 = require("../../types/LineEndings");
const parseMacros_1 = require("../../utils/parseMacros");
const name = 'hasMacroNameInMend';
const description = 'Enforces the presence of the macro name in each %mend statement.';
const message = '%mend statement has missing or incorrect macro name';
const test = (value, config) => {
const lineEnding = (config === null || config === void 0 ? void 0 : config.lineEndings) === LineEndings_1.LineEndings.CRLF ? '\r\n' : '\n';
const lines = value ? value.split(lineEnding) : [];
const macros = (0, parseMacros_1.parseMacros)(value, config);
const severity = (config === null || config === void 0 ? void 0 : config.severityLevel[name]) || Severity_1.Severity.Warning;
const diagnostics = [];
macros.forEach((macro) => {
if (macro.startLineNumbers.length === 0 && macro.endLineNumber !== null) {
const endLine = lines[macro.endLineNumber - 1];
diagnostics.push({
message: `%mend statement is redundant`,
lineNumber: macro.endLineNumber,
startColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend'),
endColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + macro.termination.length,
severity
});
}
else if (macro.endLineNumber === null &&
macro.startLineNumbers.length !== 0) {
diagnostics.push({
message: `Missing %mend statement for macro - ${macro.name}`,
lineNumber: macro.startLineNumbers[0],
startColumnNumber: 1,
endColumnNumber: 1,
severity
});
}
else if (macro.mismatchedMendMacroName) {
const endLine = lines[macro.endLineNumber - 1];
diagnostics.push({
message: `%mend statement has mismatched macro name, it should be '${macro.name}'`,
lineNumber: macro.endLineNumber,
startColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName),
endColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName) +
macro.mismatchedMendMacroName.length -
1,
severity
});
}
else if (!macro.hasMacroNameInMend) {
const endLine = lines[macro.endLineNumber - 1];
diagnostics.push({
message: `%mend statement is missing macro name - ${macro.name}`,
lineNumber: macro.endLineNumber,
startColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend'),
endColumnNumber: (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + 6,
severity
});
}
});
return diagnostics;
};
const fix = (value, config) => {
const lineEnding = (config === null || config === void 0 ? void 0 : config.lineEndings) === LineEndings_1.LineEndings.CRLF ? '\r\n' : '\n';
const lines = value ? value.split(lineEnding) : [];
const macros = (0, parseMacros_1.parseMacros)(value, config);
macros.forEach((macro) => {
if (macro.startLineNumbers.length === 0 && macro.endLineNumber !== null) {
// %mend statement is redundant
const endLine = lines[macro.endLineNumber - 1];
const startColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend');
const endColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + macro.termination.length;
const beforeStatement = endLine.slice(0, startColumnNumber - 1);
const afterStatement = endLine.slice(endColumnNumber);
lines[macro.endLineNumber - 1] = beforeStatement + afterStatement;
}
else if (macro.endLineNumber === null &&
macro.startLineNumbers.length !== 0) {
// missing %mend statement
}
else if (macro.mismatchedMendMacroName) {
// mismatched macro name
const endLine = lines[macro.endLineNumber - 1];
const startColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName);
const endColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, macro.mismatchedMendMacroName) +
macro.mismatchedMendMacroName.length -
1;
const beforeMacroName = endLine.slice(0, startColumnNumber - 1);
const afterMacroName = endLine.slice(endColumnNumber);
lines[macro.endLineNumber - 1] =
beforeMacroName + macro.name + afterMacroName;
}
else if (!macro.hasMacroNameInMend) {
// %mend statement is missing macro name
const endLine = lines[macro.endLineNumber - 1];
const startColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend');
const endColumnNumber = (0, getColumnNumber_1.getColumnNumber)(endLine, '%mend') + 4;
const beforeStatement = endLine.slice(0, startColumnNumber - 1);
const afterStatement = endLine.slice(endColumnNumber);
lines[macro.endLineNumber - 1] =
beforeStatement + `%mend ${macro.name}` + afterStatement;
}
});
const formattedText = lines.join(lineEnding);
return formattedText;
};
/**
* Lint rule that checks for the presence of macro name in %mend statement.
*/
exports.hasMacroNameInMend = {
type: LintRuleType_1.LintRuleType.File,
name,
description,
message,
test,
fix
};
//# sourceMappingURL=hasMacroNameInMend.js.map