in lib/semantic.js [2521:2552]
visitConstruct(ast, env) {
const aliasId = ast.aliasId.lexeme;
if (!this.dependencies.has(aliasId) && !builtin.has(aliasId)) {
this.error(`the module "${aliasId}" is not imported`, ast.aliasId);
}
const checker = this.dependencies.get(aliasId) || builtin.get(aliasId);
if (!checker.init) {
this.error(`the module "${aliasId}" don't has init`, ast.aliasId);
}
const actual = [];
for (let i = 0; i < ast.args.length; i++) {
const arg = ast.args[i];
this.visitExpr(arg, env);
actual.push(arg.inferred);
}
const expected = this.getParameterTypes(checker.init, aliasId);
if (!eql(expected, actual)) {
this.error(`the parameter` +
` types are mismatched. expected ` +
`new ${aliasId}(${expected.map((item) => display(item)).join(', ')}), but ` +
`new ${aliasId}(${actual.map((item) => display(item)).join(', ')})`, ast.aliasId);
}
for (let i = 0; i < ast.args.length; i++) {
const arg = ast.args[i];
arg.needCast = isNeedToMap(expected[i], arg.inferred);
arg.expectedType = expected[i];
}
}