2020-05-09 22:18:13 +02:00
|
|
|
|
|
|
|
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 {
|
2020-05-10 11:58:07 +02:00
|
|
|
index?: number;
|
2020-05-09 22:18:13 +02:00
|
|
|
type: 'NodeDeclaration';
|
|
|
|
name: string;
|
2020-05-09 23:41:42 +02:00
|
|
|
parents: string[];
|
2020-05-09 22:18:13 +02:00
|
|
|
fields: NodeField[];
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface EnumField {
|
|
|
|
name: string;
|
|
|
|
value: number | null;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface EnumDeclaration {
|
2020-05-10 11:58:07 +02:00
|
|
|
index?: number;
|
2020-05-09 22:18:13 +02:00
|
|
|
type: 'EnumDeclaration';
|
|
|
|
name: string;
|
|
|
|
fields: EnumField[];
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface TypeDeclaration {
|
2020-05-10 11:58:07 +02:00
|
|
|
index?: number;
|
2020-05-09 22:18:13 +02:00
|
|
|
type: 'TypeDeclaration';
|
|
|
|
name: string;
|
|
|
|
typeNode: TypeNode;
|
|
|
|
}
|
|
|
|
|
|
|
|
export type Declaration
|
|
|
|
= NodeDeclaration
|
|
|
|
| TypeDeclaration
|
|
|
|
| EnumDeclaration
|
|
|
|
|
2020-05-10 11:58:07 +02:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|