checkModels()

in lib/semantic.js [584:615]


  checkModels(ast) {
    const models = ast.moduleBody.nodes.filter((item) => {
      return item.type === 'model' || item.type === 'exception';
    });
    models.forEach((node) => {
      const name = node.type === 'model' ? node.modelName : node.exceptionName;
      const key = name.lexeme;
      // 重复定义检查
      if (this.models.has(key)) {
        this.error(`redefined model or exception "${key}"`, name);
      }
      
      this.models.set(key, node);
    });

    // 允许先使用,后定义,所以先全部设置到 types 中,再进行检查
    models.forEach((node) => {
      const name = node.type === 'model' ? node.modelName : node.exceptionName;
      if(node.extendOn) {
        this.checkType(node.extendOn);
        this.modelDep.set(name.lexeme, node.extendOn);
      }
      if(node.type === 'model') {
        this.visitModel(node);
      } else if(node.type === 'exception') {
        this.visitException(node);
      } else {
        this.error('unimplement');
      }
      
    });
  }