bolt/src/treegen/ast.ts

76 lines
1.4 KiB
TypeScript
Raw Normal View History

export interface ReferenceTypeNode {
type: 'ReferenceTypeNode';
name: string;
typeArgs: TypeNode[];
}
export interface UnionTypeNode {
type: 'UnionTypeNode';
elements: TypeNode[];
}
export type TypeNode
= ReferenceTypeNode
| UnionTypeNode
export interface NodeField {
name: string;
typeNode: TypeNode;
}
export interface NodeDeclaration {
index?: number;
type: 'NodeDeclaration';
name: string;
parents: string[];
fields: NodeField[];
}
export interface EnumField {
name: string;
value: number | null;
}
export interface EnumDeclaration {
index?: number;
type: 'EnumDeclaration';
name: string;
fields: EnumField[];
}
export interface TypeDeclaration {
index?: number;
type: 'TypeDeclaration';
name: string;
typeNode: TypeNode;
}
export type Declaration
= NodeDeclaration
| TypeDeclaration
| EnumDeclaration
export type Syntax
= Declaration
| TypeNode
| NodeField
| EnumField
export function hasArrayType(typeNode: TypeNode) {
if (typeNode.type === 'ReferenceTypeNode') {
return typeNode.name === 'Vec'
} else if (typeNode.type === 'UnionTypeNode') {
return typeNode.elements.some(hasArrayType);
}
}
export function isTypeOptional(typeNode: TypeNode) {
if (typeNode.type === 'ReferenceTypeNode') {
return typeNode.name === 'Option';
} else if (typeNode.type === 'UnionTypeNode') {
return typeNode.elements.every(isTypeOptional);
}
}