UNPKG

@sasjs/lint

Version:

Linting and formatting for SAS code

119 lines 6.03 kB
"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