""" Schema description This file should be kept simple: * no flow control * no aliases * only class definitions with annotations and `include` calls For how documentation of generated QL code works, please read `misc/codegen/schema_documentation.md`. """ from misc.codegen.lib.schemadefs import * include("prefix.dbscheme") @qltest.skip class Element: pass @qltest.collapse_hierarchy class File(Element): name: string @qltest.skip @qltest.collapse_hierarchy class Location(Element): file: File start_line: int start_column: int end_line: int end_column: int class DbFile(File): pass class DbLocation(Location): pass @synth.on_arguments() class UnknownFile(File): pass @synth.on_arguments() class UnknownLocation(Location): pass @qltest.skip class Locatable(Element): location: optional[Location] @qltest.skip class AstNode(Locatable): pass class Declaration(AstNode): pass class Module(Declaration): # TODO name declarations: list[Declaration] | child @qltest.collapse_hierarchy class Expr(AstNode): pass @qltest.collapse_hierarchy class Pat(AstNode): pass @qltest.skip class Label(AstNode): name: string @qltest.collapse_hierarchy class Stmt(AstNode): pass @qltest.collapse_hierarchy class TypeRef(AstNode): # TODO pass class Function(Declaration): name: string body: Expr # Missing, class MissingExpr(Expr): pass # Path(Path), class Path(Expr): # TODO pass # If { # condition: ExprId, # then_branch: ExprId, # else_branch: Option, # }, class If(Expr): condition: Expr then: Expr else_: optional[Expr] # Let { # pat: PatId, # expr: ExprId, # }, class Let(Expr): pat: Pat expr: Expr # Block { # id: Option, # statements: Box<[Stmt]>, # tail: Option, # label: Option, # }, class BlockBase(Expr): statements: list[Stmt] tail: optional[Expr] class Block(BlockBase): label: optional[Label] # Async { # id: Option, # statements: Box<[Stmt]>, # tail: Option, # }, class AsyncBlock(BlockBase): pass # Const(ConstBlockId), class Const(Expr): pass # // FIXME: Fold this into Block with an unsafe flag? # Unsafe { # id: Option, # statements: Box<[Stmt]>, # tail: Option, # }, class UnsafeBlock(BlockBase): pass # Loop { # body: ExprId, # label: Option, # }, class Loop(Expr): body: Expr label: optional[Label] # Call { # callee: ExprId, # args: Box<[ExprId]>, # is_assignee_expr: bool, # }, class Call(Expr): callee: Expr args: list[Expr] is_assignee_expr: predicate # MethodCall { # receiver: ExprId, # method_name: Name, # args: Box<[ExprId]>, # generic_args: Option>, # }, class MethodCall(Expr): receiver: Expr method_name: string args: list[Expr] # TODO # generic_args: optional[GenericArgs] # pub struct MatchArm { # pub pat: PatId, # pub guard: Option, # pub expr: ExprId, # } @qltest.skip class MatchArm(AstNode): pat: Pat guard: optional[Expr] expr: Expr # Match { # expr: ExprId, # arms: Box<[MatchArm]>, # }, class Match(Expr): expr: Expr branches: list[MatchArm] # Continue { # label: Option, # }, class Continue(Expr): label: optional[Label] # Break { # expr: Option, # label: Option, # }, class Break(Expr): expr: optional[Expr] label: optional[Label] # Return { # expr: Option, # }, class Return(Expr): expr: optional[Expr] # Become { # expr: ExprId, # }, class Become(Expr): expr: Expr # Yield { # expr: Option, # }, class Yield(Expr): expr: optional[Expr] # Yeet { # expr: Option, # }, class Yeet(Expr): expr: optional[Expr] # RecordLit { # path: Option>, # fields: Box<[RecordLitField]>, # spread: Option, # ellipsis: bool, # is_assignee_expr: bool, # }, class RecordLit(Expr): # TODO pass # Field { # expr: ExprId, # name: Name, # }, class Field(Expr): expr: Expr name: string # Await { # expr: ExprId, # }, class Await(Expr): expr: Expr # Cast { # expr: ExprId, # type_ref: Interned, # }, class Cast(Expr): expr: Expr type_ref: TypeRef # Ref { # expr: ExprId, # rawness: Rawness, # mutability: Mutability, # }, class Ref(Expr): expr: Expr is_raw: predicate is_mut: predicate # Box { # expr: ExprId, # }, class Box(Expr): expr: Expr # UnaryOp { # expr: ExprId, # op: UnaryOp, # }, class UnaryOp(Expr): expr: Expr op: string # BinaryOp { # lhs: ExprId, # rhs: ExprId, # op: Option, # }, class BinaryOp(Expr): lhs: Expr rhs: Expr op: optional[string] # Range { # lhs: Option, # rhs: Option, # range_type: RangeOp, # }, class Range(Expr): lhs: optional[Expr] rhs: optional[Expr] is_inclusive: predicate # Index { # base: ExprId, # index: ExprId, # is_assignee_expr: bool, # }, class Index(Expr): base: Expr index: Expr is_assignee_expr: predicate # Closure { # args: Box<[PatId]>, # arg_types: Box<[Option>]>, # ret_type: Option>, # body: ExprId, # closure_kind: ClosureKind, # capture_by: CaptureBy, # }, class Closure(Expr): args: list[Pat] arg_types: list[TypeRef] ret_type: optional[TypeRef] body: Expr # TODO # closure_kind: ClosureKind is_move: predicate # Tuple { # exprs: Box<[ExprId]>, # is_assignee_expr: bool, # }, class Tuple(Expr): exprs: list[Expr] is_assignee_expr: predicate # Array(Array), class Array(Expr): pass # Literal(Literal), class Literal(Expr): pass # Underscore, class Underscore(Expr): pass # OffsetOf(OffsetOf), class OffsetOf(Expr): pass # InlineAsm(InlineAsm), class InlineAsm(Expr): pass # Let { # pat: PatId, # type_ref: Option>, # initializer: Option, # else_branch: Option, # }, class IfLet(Stmt): pat: Pat type_ref: optional[TypeRef] initializer: optional[Expr] else_branch: optional[Expr] # Expr { # expr: ExprId, # has_semi: bool, # }, class ExprStmt(Stmt): expr: Expr has_semi: predicate # // At the moment, we only use this to figure out if a return expression # // is really the last statement of a block. See #16566 # Item, class ItemStmt(Stmt): pass # Missing, class MissingPat(Pat): pass # Wild, class WildPat(Pat): pass # Tuple { args: Box<[PatId]>, ellipsis: Option }, class TuplePat(Pat): args: list[Pat] ellipsis: optional[int] # Or(Box<[PatId]>), class OrPat(Pat): args: list[Pat] # Record { path: Option>, args: Box<[RecordFieldPat]>, ellipsis: bool }, class RecordPat(Pat): # TODO pass # Range { start: Option>, end: Option> }, class RangePat(Pat): start: optional[Pat] end: optional[Pat] # Slice { prefix: Box<[PatId]>, slice: Option, suffix: Box<[PatId]> }, class SlicePat(Pat): prefix: list[Pat] # Path(Box), class PathPat(Pat): pass # Lit(ExprId), class LitPat(Pat): expr: Expr # Bind { id: BindingId, subpat: Option }, class BindPat(Pat): binding_id: string subpat: optional[Pat] # TupleStruct { path: Option>, args: Box<[PatId]>, ellipsis: Option }, class TupleStructPat(Pat): # TODO pass # Ref { pat: PatId, mutability: Mutability }, class RefPat(Pat): pat: Pat is_mut: predicate # Box { inner: PatId }, class BoxPat(Pat): inner: Pat # ConstBlock(ExprId), class ConstBlockPat(Pat): expr: Expr