import {Source} from ./sources; import {PatioInstruction} from ./patio/instructions; import {PatioDataLayout, PatioDataValue, PatioType} from ./patio/types; // == Compilation units == struct PatioCompilationUnit { field elements: List[PatioCompilationUnitElement]; field source: Source; } // == Compilation unit elements == sum PatioCompilationUnitElement { variant PatioDataElementImmutableDefinition; variant PatioDataElementMutableDeclaration; variant PatioDataElementMutableDefinition; variant PatioExceptionTypeDefinition; variant PatioFunctionDeclaration; variant PatioFunctionDefinition; } struct PatioDataElementImmutableDefinition { field name: String; field visibility: PatioVisibility; field value: PatioDataValue; field source: Source; } struct PatioDataElementMutableDeclaration { field name: String; field layout: PatioDataLayout; field source: Source; } struct PatioDataElementMutableDefinition { field name: String; field visibility: PatioVisibility; field initialValue: PatioDataValue; field source: Source; } struct PatioExceptionTypeDefinition { field name: String; field valueType: PatioType; field source: Source; } struct PatioFunctionDeclaration { field name: String; field params: List[PatioLocal]; field returnTypes: List[PatioType]; field source: Source; } struct PatioFunctionDefinition { field name: String; field visibility: PatioVisibility; field locals: List[PatioLocal]; field returnTypes: List[PatioType]; field body: List[PatioInstruction]; field source: Source; } // == Visibility == enum PatioVisibility { variant private; variant public; } // == Locals == struct PatioLocal { field name: String; field type: PatioType; field localType: PatioLocalType; } enum PatioLocalType { variant param; variant val; variant var; }