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');
}
});
}