From 3c375c0a25be72fafecc337c808bb3ecbafb5287 Mon Sep 17 00:00:00 2001 From: peze Date: Thu, 5 Sep 2024 17:15:52 +0800 Subject: [PATCH] upgrade the extend info --- builtin/number.dara | 8 ++------ lib/semantic.js | 21 +++++++++++++++++---- test/fixtures/builtin_module/number.dara | 2 -- test/fixtures/extend_model/main.dara | 18 ++++++++++++++++++ test/fixtures/extend_model/oss.dara | 2 +- test/fixtures/extend_model/util.dara | 4 ++++ test/semantic.test.js | 1 + 7 files changed, 43 insertions(+), 13 deletions(-) diff --git a/builtin/number.dara b/builtin/number.dara index 6dda24d..52a5a4c 100644 --- a/builtin/number.dara +++ b/builtin/number.dara @@ -12,12 +12,8 @@ function itol(): long; function ltoi(): integer; -static function random(): number; +static function random(): double; static function floor(num: number): integer; -static function round(num: number): integer; - -static function min(a: number, b: number): number; - -static function max(a: number, b: number): number; \ No newline at end of file +static function round(num: number): integer; \ No newline at end of file diff --git a/lib/semantic.js b/lib/semantic.js index ecbe0b9..abee717 100644 --- a/lib/semantic.js +++ b/lib/semantic.js @@ -520,7 +520,7 @@ class TypeChecker { throw new SyntaxError(message); } - findProperty(model, propName, isException = false) { + findProperty(model, propName, isException = false, moduleName, extendFrom = []) { let find = model.modelBody.nodes.find((item) => { return item.fieldName.lexeme === propName; }); @@ -528,13 +528,15 @@ class TypeChecker { return { modelField: find, modelName: model.modelName.lexeme, + extendFrom: extendFrom, }; } if(!model.extendOn && !isException) { return; } - let extendModel, moduleName; + let extendModel; + let checker = this; if(!model.extendOn && isException) { extendModel = builtin.get('$Error'); @@ -542,7 +544,7 @@ class TypeChecker { } else if (model.extendOn.type === 'moduleModel') { const [ main, ...path ] = model.extendOn.path; moduleName = main.lexeme; - const checker = this.dependencies.get(moduleName); + checker = this.dependencies.get(moduleName); const typeName = path.map((item) => { return item.lexeme; }).join('.'); @@ -558,7 +560,13 @@ class TypeChecker { extendModel = this.models.get(model.extendOn.lexeme); } - find = this.findProperty(extendModel, propName, isException); + // console.log(model) + extendFrom.push({ + moduleName, + modelName: extendModel.modelName.lexeme + }); + + find = checker.findProperty(extendModel, propName, isException, moduleName, extendFrom); if(!find) { return; } @@ -855,11 +863,15 @@ class TypeChecker { if(!extendModel) { return extendOn; } + extendOn.push(_model(name, moduleName)); if(extendModel.extendOn) { extendOn = extendOn.concat(this.getExtendOn(extendModel.extendOn, moduleName)); } + + + return extendOn; } @@ -2191,6 +2203,7 @@ class TypeChecker { this.error(`the field type are mismatched. expected ` + `${display(expected)}, but ${display(type)}`, field.fieldName); } + field.extendFrom = find.extendFrom; field.inferred = type; field.expectedType = expected; } diff --git a/test/fixtures/builtin_module/number.dara b/test/fixtures/builtin_module/number.dara index d9f2a77..8d174bb 100644 --- a/test/fixtures/builtin_module/number.dara +++ b/test/fixtures/builtin_module/number.dara @@ -31,6 +31,4 @@ static async function main(args: [string]): void { var randomNum = $Number.random(); inum = $Number.floor(inum); inum = $Number.round(inum); - var min = $Number.min(inum, fnum); - var max = $Number.max(inum, fnum); } \ No newline at end of file diff --git a/test/fixtures/extend_model/main.dara b/test/fixtures/extend_model/main.dara index a565066..99b7d93 100644 --- a/test/fixtures/extend_model/main.dara +++ b/test/fixtures/extend_model/main.dara @@ -12,10 +12,28 @@ model DeriveSubFile extends Util.ExtendSubFile { size: string, } +model SubOssSubFile extends OSS.SubFile{ + size: string, +} + +model SubUtilMainSubFile extends Util.mainSubFile{ + type: string, +} static function getFile(efile: OSS.File, file: OSS.File, err: OSS.SubFile.file, err2: $Error): void; static function call(size: number): void { + var ossFile = new SubOssSubFile{ + name = 'name', + size = '100', + }; + + var subUtilMainSubFile = new SubUtilMainSubFile { + name = 'name', + size = 100, + type = 'html', + }; + var file = new Util.mainFile{ name = 'name', size = 100, diff --git a/test/fixtures/extend_model/oss.dara b/test/fixtures/extend_model/oss.dara index 7d76f07..abc854f 100644 --- a/test/fixtures/extend_model/oss.dara +++ b/test/fixtures/extend_model/oss.dara @@ -7,7 +7,7 @@ exception FileError = { code: string, } -model SubFile = { +model SubFile extends File = { file: { name: string, } diff --git a/test/fixtures/extend_model/util.dara b/test/fixtures/extend_model/util.dara index 4c7ac9f..b522221 100644 --- a/test/fixtures/extend_model/util.dara +++ b/test/fixtures/extend_model/util.dara @@ -4,6 +4,10 @@ model mainFile extends OSS.File { size: number, } +model mainSubFile extends OSS.SubFile { + size: number, +} + exception MainFileError extends OSS.File { size: number, } diff --git a/test/semantic.test.js b/test/semantic.test.js index f7e02ce..7e141c0 100644 --- a/test/semantic.test.js +++ b/test/semantic.test.js @@ -5285,6 +5285,7 @@ describe('semantic', function () { [expr] = ast.moduleBody.nodes[1].functionBody.stmts.stmts[1].expr.object.fields; expect(expr).to.eql({ 'type': 'objectField', + 'extendFrom': [], 'fieldName': { 'tag': 2, 'loc': {