visitConstruct()

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];
    }
  }