From 7a9d1814591da7a0d5d7181b5287274b35114af7 Mon Sep 17 00:00:00 2001 From: Stefan Blaginov Date: Wed, 22 Nov 2023 18:12:08 +0000 Subject: [PATCH] fix(parser): throw error when concept is extending itself in JSON metamodel form Signed-off-by: Stefan Blaginov --- packages/concerto-cto/lib/printer.js | 3 +++ packages/concerto-cto/test/printer.js | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/packages/concerto-cto/lib/printer.js b/packages/concerto-cto/lib/printer.js index 3d4ab3798b..ca00568f5d 100644 --- a/packages/concerto-cto/lib/printer.js +++ b/packages/concerto-cto/lib/printer.js @@ -343,6 +343,9 @@ function declFromMetaModel(mm) { } } if (mm.superType) { + if (mm.superType.name === mm.name) { + throw new Error(`The declaration "${mm.name}" cannot extend itself.`); + } result += `extends ${mm.superType.name} `; } result += '{'; diff --git a/packages/concerto-cto/test/printer.js b/packages/concerto-cto/test/printer.js index d8090f46e4..d50fe3456a 100644 --- a/packages/concerto-cto/test/printer.js +++ b/packages/concerto-cto/test/printer.js @@ -62,4 +62,30 @@ describe('parser', () => { declarations: [], })).should.throw(Error, 'Unrecognized import'); }); + + it('Should throw error for a self-extending declaration', () => { + (() => Printer.toCTO({ + '$class': 'concerto.metamodel@1.0.0.Model', + 'namespace': 'com.acme@1.0.0', + 'declarations': [ + { + '$class': 'concerto.metamodel@1.0.0.AssetDeclaration', + 'name': 'Self_Extending', + 'isAbstract': false, + 'properties': [ + { + '$class': 'concerto.metamodel@1.0.0.StringProperty', + 'name': 'foo', + 'isArray': false, + 'isOptional': true + } + ], + 'superType': { + '$class': 'concerto.metamodel@1.0.0.TypeIdentifier', + 'name': 'Self_Extending' + } + } + ] + })).should.throw(Error, 'The declaration "Self_Extending" cannot extend itself.'); + }); });