Skip to content

Commit

Permalink
upgrade the extend info
Browse files Browse the repository at this point in the history
  • Loading branch information
peze authored and JacksonTian committed Sep 5, 2024
1 parent b18af68 commit 3c375c0
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 13 deletions.
8 changes: 2 additions & 6 deletions builtin/number.dara
Original file line number Diff line number Diff line change
Expand Up @@ -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;
static function round(num: number): integer;
21 changes: 17 additions & 4 deletions lib/semantic.js
Original file line number Diff line number Diff line change
Expand Up @@ -520,29 +520,31 @@ 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;
});
if(find) {
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');
isException = false;
} 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('.');
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 0 additions & 2 deletions test/fixtures/builtin_module/number.dara
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
18 changes: 18 additions & 0 deletions test/fixtures/extend_model/main.dara
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion test/fixtures/extend_model/oss.dara
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ exception FileError = {
code: string,
}

model SubFile = {
model SubFile extends File = {
file: {
name: string,
}
Expand Down
4 changes: 4 additions & 0 deletions test/fixtures/extend_model/util.dara
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand Down
1 change: 1 addition & 0 deletions test/semantic.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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': {
Expand Down

0 comments on commit 3c375c0

Please sign in to comment.