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:
@@ -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,
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user