如何使用TypePal编写规则限制PropertyType不可重复?
用TypePal实现PropertyType唯一约束的语义检查规则
需求说明
需要编写TypePal规则,强制每个Property下的PropertyType(包括ColumnName、ColumnOrder、ColumnType)最多使用一次,重复配置时标记为语义错误(例如示例中重复的.ColumnType(...)需要被检测出来)。
模型代码
Property(b => b.name) .ColumnOrder(3) .ColumnName("Name") .ColumnType(varchar(45)) .ColumnType(date) ; syntax Property = property: "Property" "(" Expr e ")" PropertyType* ; syntax PropertyType = columnName: "." "ColumnName" "(" Expr e ")" | columnOrder: "." "ColumnOrder" "(" Expr e ")" | columnType: "." "ColumnType" "(" ColumnType c ")" ; syntax ColumnType = intColumn: "int" | varcharColumn: "varchar" "(" Expr e ")" | dateColumn: "date" ;
TypePal规则实现
rule checkUniquePropertyTypes { forall Property p { list[str] usedTypes = []; for (PropertyType pt in p.PropertyType*) { str typeLabel = switch pt { case columnName: "ColumnName" case columnOrder: "ColumnOrder" case columnType: "ColumnType" }; if (typeLabel in usedTypes) { report error "重复的Property配置:'" + typeLabel + "' 只能使用一次" at pt; } else { usedTypes.add(typeLabel); } } } }
规则说明
- 遍历目标节点:规则会扫描所有
Property语法节点 - 类型标识收集:对每个
Property下的PropertyType子节点,通过switch判断其具体类型,生成对应的类型标签(如"ColumnType") - 重复检测:维护一个列表记录已出现的类型标签,若当前标签已存在,就在该
PropertyType节点位置报告错误 - 错误提示:错误信息会明确指出重复的配置类型,帮助定位问题
配置该规则后,示例中第二次调用.ColumnType(date)的位置会被标记为语义错误,符合需求。
内容的提问来源于stack exchange,提问作者Benni Katchy
相关产品推荐
相关产品推荐

