From 3203972e667d712d810d0909bb465cd10eb39823 Mon Sep 17 00:00:00 2001 From: daci Date: Thu, 15 Feb 2024 20:01:37 +0200 Subject: [PATCH] limit notification annotation suppport only for node claseses --- src/lib/utils/Diagnostics.ts | 8 ++- src/plugin.spec.ts | 128 +++++++++++++++++++++++++++++++++++ src/plugin.ts | 20 +++++- 3 files changed, 154 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/Diagnostics.ts b/src/lib/utils/Diagnostics.ts index 3636b29..0c8ec7e 100644 --- a/src/lib/utils/Diagnostics.ts +++ b/src/lib/utils/Diagnostics.ts @@ -458,4 +458,10 @@ export function onNotificationConstructorError() { }; } - +export function onNotificationNotSupported() { + return { + message: `@onNotification is only supported on methods in a node class`, + code: `MSTO${1071}`, + severity: DiagnosticSeverity.Error + }; +} diff --git a/src/plugin.spec.ts b/src/plugin.spec.ts index e8edcde..c2e7ee5 100644 --- a/src/plugin.spec.ts +++ b/src/plugin.spec.ts @@ -4000,10 +4000,30 @@ describe('MaestroPlugin', () => { end function `); }); + + it('fails validation if onNotification annotation is added on a method class that is not a node', async () => { + plugin.maestroConfig.allowNotificationAnnotations = true; + plugin.afterProgramCreate(program); + program.setFile('source/comp.bs', ` + class Comp + function initialize() + end function + private json + @onNotification("test") + function classMethod(arg1 as mc.notification) + end function + end class + `); + program.validate(); + await builder.transpile(); + let d = builder.getDiagnostics().filter((d) => d.severity === DiagnosticSeverity.Error && d.code !== 1044); + expect(d[0].code).to.equal('MSTO1071'); + }); it('fails validation if onNotification annotation are disabled', async () => { plugin.maestroConfig.allowNotificationAnnotations = false; plugin.afterProgramCreate(program); program.setFile('source/comp.bs', ` + @node("Comp", "Group") class Comp function initialize() end function @@ -4023,6 +4043,7 @@ describe('MaestroPlugin', () => { plugin.maestroConfig.allowNotificationAnnotations = true; plugin.afterProgramCreate(program); program.setFile('source/comp.bs', ` + @node("Comp", "Group") class Comp function initialize() end function @@ -4042,6 +4063,7 @@ describe('MaestroPlugin', () => { plugin.maestroConfig.allowNotificationAnnotations = true; plugin.afterProgramCreate(program); program.setFile('source/comp.bs', ` + @node("Comp", "Group") class Comp function initialize() end function @@ -4051,6 +4073,8 @@ describe('MaestroPlugin', () => { end function end class `); + + program.validate(); await builder.transpile(); let d = builder.getDiagnostics().filter((d) => d.severity === DiagnosticSeverity.Error); @@ -4061,6 +4085,7 @@ describe('MaestroPlugin', () => { plugin.maestroConfig.allowNotificationAnnotations = true; plugin.afterProgramCreate(program); program.setFile('source/comp.bs', ` + @node("Comp", "Group") class Comp private json @onNotification("test") @@ -4078,6 +4103,7 @@ describe('MaestroPlugin', () => { plugin.maestroConfig.allowNotificationAnnotations = true; plugin.afterProgramCreate(program); program.setFile('source/comp.bs', ` + @node("Comp", "Group") class Comp private json function initialize() @@ -4090,6 +4116,57 @@ describe('MaestroPlugin', () => { program.validate(); await builder.transpile(); //ignore diagnostics - need to import core + expect( + getContents('components/maestro/generated/Comp.xml') + ).to.eql(undent` + + + + + + +