1
0
mirror of https://github.com/sasjs/lint.git synced 2026-01-09 05:20:06 +00:00

fix: Updated Code + messages has macro name

This commit is contained in:
Saad Jutt
2021-04-07 16:38:43 +05:00
parent b87fb4dca6
commit 99aec59dd1
6 changed files with 149 additions and 120 deletions

View File

@@ -28,7 +28,7 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement is missing macro name', message: '%mend statement is missing macro name - somemacro',
lineNumber: 4, lineNumber: 4,
startColumnNumber: 3, startColumnNumber: 3,
endColumnNumber: 9, endColumnNumber: 9,
@@ -83,7 +83,7 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement has mismatched macro name', message: `%mend statement has mismatched macro name, it should be 'somemacro'`,
lineNumber: 4, lineNumber: 4,
startColumnNumber: 9, startColumnNumber: 9,
endColumnNumber: 24, endColumnNumber: 24,
@@ -126,7 +126,7 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement is missing macro name', message: '%mend statement is missing macro name - inner',
lineNumber: 6, lineNumber: 6,
startColumnNumber: 5, startColumnNumber: 5,
endColumnNumber: 11, endColumnNumber: 11,
@@ -148,7 +148,7 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement is missing macro name', message: '%mend statement is missing macro name - outer',
lineNumber: 9, lineNumber: 9,
startColumnNumber: 3, startColumnNumber: 3,
endColumnNumber: 9, endColumnNumber: 9,
@@ -170,14 +170,14 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement is missing macro name', message: '%mend statement is missing macro name - inner',
lineNumber: 6, lineNumber: 6,
startColumnNumber: 5, startColumnNumber: 5,
endColumnNumber: 11, endColumnNumber: 11,
severity: Severity.Warning severity: Severity.Warning
}, },
{ {
message: '%mend statement is missing macro name', message: '%mend statement is missing macro name - outer',
lineNumber: 9, lineNumber: 9,
startColumnNumber: 3, startColumnNumber: 3,
endColumnNumber: 9, endColumnNumber: 9,
@@ -235,7 +235,7 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement is missing macro name', message: '%mend statement is missing macro name - examplemacro',
lineNumber: 29, lineNumber: 29,
startColumnNumber: 5, startColumnNumber: 5,
endColumnNumber: 11, endColumnNumber: 11,
@@ -254,7 +254,7 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement has mismatched macro name', message: `%mend statement has mismatched macro name, it should be 'somemacro'`,
lineNumber: 6, lineNumber: 6,
startColumnNumber: 14, startColumnNumber: 14,
endColumnNumber: 29, endColumnNumber: 29,
@@ -271,7 +271,7 @@ describe('hasMacroNameInMend', () => {
expect(hasMacroNameInMend.test(content)).toEqual([ expect(hasMacroNameInMend.test(content)).toEqual([
{ {
message: '%mend statement is missing macro name', message: '%mend statement is missing macro name - somemacro',
lineNumber: 4, lineNumber: 4,
startColumnNumber: 5, startColumnNumber: 5,
endColumnNumber: 11, endColumnNumber: 11,

View File

@@ -13,51 +13,64 @@ const message = '%mend statement has missing or incorrect macro name'
const test = (value: string) => { const test = (value: string) => {
const diagnostics: Diagnostic[] = [] const diagnostics: Diagnostic[] = []
const statements: string[] = value ? value.split(';') : [] const lines: string[] = value ? value.split('\n') : []
const declaredMacros: { name: string; lineNumber: number }[] = [] const declaredMacros: { name: string; lineNumber: number }[] = []
let isCommentStarted = false let isCommentStarted = false
statements.forEach((statement, index) => { lines.forEach((line, index) => {
const { statement: trimmedStatement, commentStarted } = trimComments( const { statement: trimmedLine, commentStarted } = trimComments(
statement, line,
isCommentStarted isCommentStarted
) )
isCommentStarted = commentStarted isCommentStarted = commentStarted
const statements: string[] = trimmedLine ? trimmedLine.split(';') : []
if (trimmedStatement.startsWith('%macro ')) { statements.forEach((statement) => {
const macroName = trimmedStatement const { statement: trimmedStatement, commentStarted } = trimComments(
.slice(7, trimmedStatement.length) statement,
.trim() isCommentStarted
.split('(')[0] )
declaredMacros.push({ isCommentStarted = commentStarted
name: macroName,
lineNumber: getLineNumber(statements, index + 1)
})
} else if (trimmedStatement.startsWith('%mend')) {
const declaredMacro = declaredMacros.pop()
const macroName = trimmedStatement
.split(' ')
.filter((s: string) => !!s)[1]
if (!macroName) { if (trimmedStatement.startsWith('%macro ')) {
diagnostics.push({ const macroName = trimmedStatement
message: '%mend statement is missing macro name', .slice(7, trimmedStatement.length)
lineNumber: getLineNumber(statements, index + 1), .trim()
startColumnNumber: getColumnNumber(statement, '%mend'), .split('(')[0]
endColumnNumber: getColumnNumber(statement, '%mend') + 6, declaredMacros.push({
severity: Severity.Warning name: macroName,
}) lineNumber: getLineNumber(lines, index + 1)
} else if (macroName !== declaredMacro!.name) {
diagnostics.push({
message: '%mend statement has mismatched macro name',
lineNumber: getLineNumber(statements, index + 1),
startColumnNumber: getColumnNumber(statement, macroName),
endColumnNumber:
getColumnNumber(statement, macroName) + macroName.length - 1,
severity: Severity.Warning
}) })
} else if (trimmedStatement.startsWith('%mend')) {
const declaredMacro = declaredMacros.pop()
const macroName = trimmedStatement
.split(' ')
.filter((s: string) => !!s)[1]
if (!macroName) {
diagnostics.push({
message: `%mend statement is missing macro name - ${
declaredMacro!.name
}`,
lineNumber: getLineNumber(lines, index + 1),
startColumnNumber: getColumnNumber(line, '%mend'),
endColumnNumber: getColumnNumber(line, '%mend') + 6,
severity: Severity.Warning
})
} else if (macroName !== declaredMacro!.name) {
diagnostics.push({
message: `%mend statement has mismatched macro name, it should be '${
declaredMacro!.name
}'`,
lineNumber: getLineNumber(lines, index + 1),
startColumnNumber: getColumnNumber(line, macroName),
endColumnNumber:
getColumnNumber(line, macroName) + macroName.length - 1,
severity: Severity.Warning
})
}
} }
} })
}) })
declaredMacros.forEach((declaredMacro) => { declaredMacros.forEach((declaredMacro) => {

View File

@@ -36,7 +36,7 @@ describe('hasMacroParentheses', () => {
expect(hasMacroParentheses.test(content)).toEqual([ expect(hasMacroParentheses.test(content)).toEqual([
{ {
message: 'Macro definition missing name', message: 'Macro definition contains space(s)',
lineNumber: 2, lineNumber: 2,
startColumnNumber: 3, startColumnNumber: 3,
endColumnNumber: 12, endColumnNumber: 12,
@@ -53,10 +53,10 @@ describe('hasMacroParentheses', () => {
expect(hasMacroParentheses.test(content)).toEqual([ expect(hasMacroParentheses.test(content)).toEqual([
{ {
message: 'Macro definition missing name', message: 'Macro definition contains space(s)',
lineNumber: 2, lineNumber: 2,
startColumnNumber: 3, startColumnNumber: 3,
endColumnNumber: 10, endColumnNumber: 9,
severity: Severity.Warning severity: Severity.Warning
} }
]) ])

View File

@@ -12,55 +12,64 @@ const message = 'Macro definition missing parentheses'
const test = (value: string) => { const test = (value: string) => {
const diagnostics: Diagnostic[] = [] const diagnostics: Diagnostic[] = []
const statements: string[] = value ? value.split(';') : [] const lines: string[] = value ? value.split('\n') : []
let isCommentStarted = false let isCommentStarted = false
statements.forEach((statement, index) => { lines.forEach((line, index) => {
const { statement: trimmedStatement, commentStarted } = trimComments( const { statement: trimmedLine, commentStarted } = trimComments(
statement, line,
isCommentStarted isCommentStarted
) )
isCommentStarted = commentStarted isCommentStarted = commentStarted
const statements: string[] = trimmedLine ? trimmedLine.split(';') : []
if (trimmedStatement.startsWith('%macro')) { statements.forEach((statement) => {
const macroNameDefinition = trimmedStatement const { statement: trimmedStatement, commentStarted } = trimComments(
.slice(7, trimmedStatement.length) statement,
.trim() isCommentStarted
)
isCommentStarted = commentStarted
const macroNameDefinitionParts = macroNameDefinition.split('(') if (trimmedStatement.startsWith('%macro')) {
const macroName = macroNameDefinitionParts[0] const macroNameDefinition = trimmedStatement
.slice(7, trimmedStatement.length)
.trim()
if (!macroName) const macroNameDefinitionParts = macroNameDefinition.split('(')
diagnostics.push({ const macroName = macroNameDefinitionParts[0]
message: 'Macro definition missing name',
lineNumber: getLineNumber(statements, index + 1), if (!macroName)
startColumnNumber: getColumnNumber(statement, '%macro'), diagnostics.push({
endColumnNumber: statement.length, message: 'Macro definition contains space(s)',
severity: Severity.Warning lineNumber: getLineNumber(lines, index + 1),
}) startColumnNumber: getColumnNumber(line, '%macro'),
else if (macroNameDefinitionParts.length === 1) endColumnNumber:
diagnostics.push({ getColumnNumber(line, '%macro') + trimmedStatement.length,
message, severity: Severity.Warning
lineNumber: getLineNumber(statements, index + 1), })
startColumnNumber: getColumnNumber(statement, macroNameDefinition), else if (macroNameDefinitionParts.length === 1)
endColumnNumber: diagnostics.push({
getColumnNumber(statement, macroNameDefinition) + message,
macroNameDefinition.length - lineNumber: getLineNumber(lines, index + 1),
1, startColumnNumber: getColumnNumber(line, macroNameDefinition),
severity: Severity.Warning endColumnNumber:
}) getColumnNumber(line, macroNameDefinition) +
else if (macroName !== macroName.trim()) macroNameDefinition.length -
diagnostics.push({ 1,
message: 'Macro definition contains space(s)', severity: Severity.Warning
lineNumber: getLineNumber(statements, index + 1), })
startColumnNumber: getColumnNumber(statement, macroNameDefinition), else if (macroName !== macroName.trim())
endColumnNumber: diagnostics.push({
getColumnNumber(statement, macroNameDefinition) + message: 'Macro definition contains space(s)',
macroNameDefinition.length - lineNumber: getLineNumber(lines, index + 1),
1, startColumnNumber: getColumnNumber(line, macroNameDefinition),
severity: Severity.Warning endColumnNumber:
}) getColumnNumber(line, macroNameDefinition) +
} macroNameDefinition.length -
1,
severity: Severity.Warning
})
}
})
}) })
return diagnostics return diagnostics
} }

View File

@@ -11,40 +11,48 @@ const description = 'Enfoces the absence of nested macro definitions.'
const message = `Macro definition for '{macro}' present in macro '{parent}'` const message = `Macro definition for '{macro}' present in macro '{parent}'`
const test = (value: string) => { const test = (value: string) => {
const diagnostics: Diagnostic[] = [] const diagnostics: Diagnostic[] = []
const statements: string[] = value ? value.split(';') : []
const declaredMacros: string[] = [] const declaredMacros: string[] = []
const lines: string[] = value ? value.split('\n') : []
let isCommentStarted = false let isCommentStarted = false
statements.forEach((statement, index) => { lines.forEach((line, index) => {
const { statement: trimmedStatement, commentStarted } = trimComments( const { statement: trimmedLine, commentStarted } = trimComments(
statement, line,
isCommentStarted isCommentStarted
) )
isCommentStarted = commentStarted isCommentStarted = commentStarted
const statements: string[] = trimmedLine ? trimmedLine.split(';') : []
if (trimmedStatement.startsWith('%macro ')) { statements.forEach((statement) => {
const macroName = trimmedStatement const { statement: trimmedStatement, commentStarted } = trimComments(
.slice(7, trimmedStatement.length) statement,
.trim() isCommentStarted
.split('(')[0] )
if (declaredMacros.length) { isCommentStarted = commentStarted
const parentMacro = declaredMacros.slice(-1).pop()
diagnostics.push({ if (trimmedStatement.startsWith('%macro ')) {
message: message const macroName = trimmedStatement
.replace('{macro}', macroName) .slice(7, trimmedStatement.length)
.replace('{parent}', parentMacro!), .trim()
lineNumber: getLineNumber(statements, index + 1), .split('(')[0]
startColumnNumber: getColumnNumber(statement, '%macro'), if (declaredMacros.length) {
endColumnNumber: const parentMacro = declaredMacros.slice(-1).pop()
getColumnNumber(statement, '%macro') + trimmedStatement.length - 1, diagnostics.push({
severity: Severity.Warning message: message
}) .replace('{macro}', macroName)
.replace('{parent}', parentMacro!),
lineNumber: getLineNumber(lines, index + 1),
startColumnNumber: getColumnNumber(line, '%macro'),
endColumnNumber:
getColumnNumber(line, '%macro') + trimmedStatement.length - 1,
severity: Severity.Warning
})
}
declaredMacros.push(macroName)
} else if (trimmedStatement.startsWith('%mend')) {
declaredMacros.pop()
} }
declaredMacros.push(macroName) })
} else if (trimmedStatement.startsWith('%mend')) {
declaredMacros.pop()
}
}) })
return diagnostics return diagnostics
} }

View File

@@ -1,5 +1,4 @@
export const getLineNumber = (statements: string[], index: number): number => { export const getLineNumber = (lines: string[], index: number): number => {
const combinedCode = statements.slice(0, index).join(';') const combinedCode = lines.slice(0, index).join('\n')
const lines = (combinedCode.match(/\n/g) || []).length + 1 return (combinedCode.match(/\n/g) || []).length + 1
return lines
} }