From c9fa36613042828350d453c56a91ed3b523b1d5d Mon Sep 17 00:00:00 2001 From: Saad Jutt Date: Fri, 21 May 2021 20:05:53 +0500 Subject: [PATCH] fix(parseMacros): avoid statement break on html encoded semi colon --- src/rules/file/strictMacroDefinition.spec.ts | 3 ++ src/utils/parseMacros.spec.ts | 33 ++++++++++++++++++++ src/utils/parseMacros.ts | 13 ++++++++ 3 files changed, 49 insertions(+) diff --git a/src/rules/file/strictMacroDefinition.spec.ts b/src/rules/file/strictMacroDefinition.spec.ts index 1e757bf..0e5b50e 100644 --- a/src/rules/file/strictMacroDefinition.spec.ts +++ b/src/rules/file/strictMacroDefinition.spec.ts @@ -121,6 +121,9 @@ describe('strictMacroDefinition', () => { it('should return an empty array when the content has correct macro definition syntax', () => { const content = `%macro mp_ds2cards(base_ds=, tgt_ds=\n ,cards_file="%sysfunc(pathname(work))/cardgen.sas"\n ,maxobs=max\n ,random_sample=NO\n ,showlog=YES\n ,outencoding=\n ,append=NO\n)/*/STORE SOURCE*/;` expect(strictMacroDefinition.test(content)).toEqual([]) + + const content2 = `%macro mm_createapplication(\n tree=/User Folders/sasdemo\n ,name=myApp\n ,ClassIdentifier=mcore\n ,desc=Created by mm_createapplication\n ,params= param1=1 param2=blah\n ,version=\n ,frefin=mm_in\n ,frefout=mm_out\n ,mDebug=1\n );` + expect(strictMacroDefinition.test(content2)).toEqual([]) }) it('should return an array with a single diagnostic when Macro definition has space in param', () => { diff --git a/src/utils/parseMacros.spec.ts b/src/utils/parseMacros.spec.ts index e8f25ce..a7b2052 100644 --- a/src/utils/parseMacros.spec.ts +++ b/src/utils/parseMacros.spec.ts @@ -277,5 +277,38 @@ describe('parseMacros', () => { mismatchedMendMacroName: '' }) }) + + it('should return an array with a single macro having semi-colon in params', () => { + const text = `\n%macro mm_createapplication(\n tree=/User Folders/sasdemo\n ,name=myApp\n ,ClassIdentifier=mcore\n ,desc=Created by mm_createapplication\n ,params= param1=1 param2=blah\n ,version=\n ,frefin=mm_in\n ,frefout=mm_out\n ,mDebug=1\n );` + + const macros = parseMacros(text, new LintConfig()) + + expect(macros.length).toEqual(1) + expect(macros).toContainEqual({ + name: 'mm_createapplication', + declarationLines: [ + `%macro mm_createapplication(`, + ` tree=/User Folders/sasdemo`, + ` ,name=myApp`, + ` ,ClassIdentifier=mcore`, + ` ,desc=Created by mm_createapplication`, + ` ,params= param1=1 param2=blah`, + ` ,version=`, + ` ,frefin=mm_in`, + ` ,frefout=mm_out`, + ` ,mDebug=1`, + ` );` + ], + terminationLine: '', + declaration: + '%macro mm_createapplication( tree=/User Folders/sasdemo ,name=myApp ,ClassIdentifier=mcore ,desc=Created by mm_createapplication ,params= param1=1 param2=blah ,version= ,frefin=mm_in ,frefout=mm_out ,mDebug=1 )', + termination: '', + startLineNumbers: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], + endLineNumber: null, + parentMacro: '', + hasMacroNameInMend: false, + mismatchedMendMacroName: '' + }) + }) }) }) diff --git a/src/utils/parseMacros.ts b/src/utils/parseMacros.ts index 591dc50..51a955e 100644 --- a/src/utils/parseMacros.ts +++ b/src/utils/parseMacros.ts @@ -38,6 +38,19 @@ export const parseMacros = (text: string, config?: LintConfig): Macro[] => { const statements: string[] = trimmedLine.split(';') + if (isReadingMacroDefinition) { + statements.forEach((statement, statementIndex) => { + if (/&[^\s]{1,5}$/.test(statement)) { + const next = statements[statementIndex] + const updatedStatement = `${statement};${ + statements[statementIndex + 1] + }` + statements.splice(statementIndex, 1, updatedStatement) + statements.splice(statementIndex + 1, 1) + } + }) + } + statements.forEach((statement, statementIndex) => { const { statement: trimmedStatement, commentStarted } = trimComments( statement,