All Downloads are FREE. Search and download functionalities are using the official Maven repository.

.kotlin.kotlin-compiler.1.3.61.source-code.KotlinIr.proto Maven / Gradle / Ivy

syntax = "proto2";
package org.jetbrains.kotlin.backend.common.serialization.proto;

option java_multiple_files = true;
option java_outer_classname = "KotlinIr";
option optimize_for = LITE_RUNTIME;

message DescriptorReference {
  required FqName package_fq_name = 1;
  required FqName class_fq_name = 2;
  required IrDataIndex name = 3;
  optional UniqId uniq_id = 4;
  optional bool is_getter = 5 [default = false];
  optional bool is_setter = 6 [default = false];
  optional bool is_backing_field = 7 [default = false];
  optional bool is_fake_override = 8 [default = false];
  optional bool is_default_constructor = 9 [default = false];
  optional bool is_enum_entry = 10 [default = false];
  optional bool is_enum_special = 11 [default = false];
  optional bool is_type_parameter = 12 [default = false];
}

message UniqId {
  required uint64 index = 1;
  required bool isLocal = 2;
}

message Coordinates {
  required int32 start_offset = 1;
  required int32 end_offset = 2;
}

message Visibility {
  required IrDataIndex name = 1;
}

message IrStatementOrigin {
  required IrDataIndex name = 1;
}

enum KnownOrigin {
  CUSTOM = 1;
  DEFINED = 2;
  FAKE_OVERRIDE = 3;
  FOR_LOOP_ITERATOR = 4;
  FOR_LOOP_VARIABLE = 5;
  FOR_LOOP_IMPLICIT_VARIABLE = 6;
  PROPERTY_BACKING_FIELD = 7;
  DEFAULT_PROPERTY_ACCESSOR = 8;
  DELEGATE = 9;
  DELEGATED_PROPERTY_ACCESSOR = 10;
  DELEGATED_MEMBER = 11;
  ENUM_CLASS_SPECIAL_MEMBER = 12;
  FUNCTION_FOR_DEFAULT_PARAMETER = 13;
  FILE_CLASS = 14;
  GENERATED_DATA_CLASS_MEMBER = 15;
  GENERATED_INLINE_CLASS_MEMBER = 16;
  LOCAL_FUNCTION_FOR_LAMBDA = 17;
  CATCH_PARAMETER = 19;
  INSTANCE_RECEIVER = 20;
  PRIMARY_CONSTRUCTOR_PARAMETER = 21;
  IR_TEMPORARY_VARIABLE = 22;
  IR_EXTERNAL_DECLARATION_STUB = 23;
  IR_EXTERNAL_JAVA_DECLARATION_STUB = 24;
  IR_BUILTINS_STUB = 25;
  BRIDGE = 26;
  FIELD_FOR_ENUM_ENTRY = 27;
  FIELD_FOR_ENUM_VALUES = 28;
  FIELD_FOR_OBJECT_INSTANCE = 29;
}

message IrDeclarationOrigin {
  oneof either {
    KnownOrigin origin = 1;
    IrDataIndex custom = 2;
  }
}

message IrDataIndex {
  required int32 index = 1;
}

message FqName {
  repeated IrDataIndex segment = 1;
}

/* ------ Top Level---------------------------------------------- */

message IrDeclarationContainer {
  repeated IrDeclaration declaration = 1;
}

message FileEntry {
  required string name = 1;
  repeated int32 line_start_offsets = 2;
}

message IrFile {
  repeated UniqId declaration_id = 1;
  required FileEntry file_entry = 2;
  required FqName fq_name = 3;
  required Annotations annotations = 4;
  repeated IrDataIndex explicitly_exported_to_compiler = 5;
}

//message IrModule {
//  required string name = 1;
//  repeated IrFile file = 2;
//}

/* ------ String Table ------------------------------------------ */

message StringTable {
  repeated string strings = 1;
}

/* ------ IrSymbols --------------------------------------------- */

enum IrSymbolKind {
  FUNCTION_SYMBOL = 1;
  CONSTRUCTOR_SYMBOL = 2;
  ENUM_ENTRY_SYMBOL = 3;
  FIELD_SYMBOL = 4;
  VALUE_PARAMETER_SYMBOL = 5;
  RETURNABLE_BLOCK_SYMBOL = 6;
  CLASS_SYMBOL = 7;
  TYPE_PARAMETER_SYMBOL = 8;
  VARIABLE_SYMBOL = 9;
  ANONYMOUS_INIT_SYMBOL = 10;
  STANDALONE_FIELD_SYMBOL = 11; // For fields without properties. WrappedFieldDescriptor, rather than WrappedPropertyDescriptor.
  RECEIVER_PARAMETER_SYMBOL = 12; // ReceiverParameterDescriptor rather than ValueParameterDescriptor.
  PROPERTY_SYMBOL = 13;
  LOCAL_DELEGATED_PROPERTY_SYMBOL = 14;
  TYPEALIAS_SYMBOL = 15;
}

message IrSymbolData {
  required IrSymbolKind kind = 1;
  required UniqId uniq_id = 2;
  required UniqId top_level_uniq_id = 3;
  optional FqName fqname = 4;
  optional DescriptorReference descriptor_reference = 5;
}

message IrSymbolTable {
  repeated IrSymbolData symbols = 1;
}

/* ------ IrTypes --------------------------------------------- */

enum IrTypeVariance { // Should we import metadata variance, or better stay separate?
                      IN = 0;
                      OUT = 1;
                      INV = 2;
}

message Annotations {
  repeated IrConstructorCall annotation = 1;
}

message TypeArguments {
  repeated IrDataIndex type_argument = 1;
}

message IrStarProjection {
  optional bool void = 1;
}

message IrTypeProjection {
  required IrTypeVariance variance = 1;
  required IrDataIndex type = 2;
}

message IrTypeArgument {
  oneof kind {
    IrStarProjection star = 1;
    IrTypeProjection type = 2;
  }
}

message IrSimpleType {
  required Annotations annotations = 1;
  required IrDataIndex classifier = 2;
  required bool has_question_mark = 3;
  repeated IrTypeArgument argument = 4;
  optional IrTypeAbbreviation abbreviation = 5;
}

message IrTypeAbbreviation {
  required Annotations annotations = 1;
  required IrDataIndex type_alias = 2;
  required bool has_question_mark = 3;
  repeated IrTypeArgument argument = 4;
}

message IrDynamicType {
  required Annotations annotations = 1;
}

message IrErrorType {
  required Annotations annotations = 1;
}

message IrType {
  oneof kind {
    IrSimpleType simple = 1;
    IrDynamicType dynamic = 2;
    IrErrorType error = 3;
  }
}

message IrTypeTable {
  repeated IrType types = 1;
}

/* ------ IrExpressions --------------------------------------------- */


message IrBreak {
  required int32 loop_id = 1;
  optional IrDataIndex label = 2;
}

message IrBlock {
  optional IrStatementOrigin origin = 1;
  repeated IrStatement statement = 2;
}

message MemberAccessCommon {
  optional IrExpression dispatch_receiver = 1;
  optional IrExpression extension_receiver = 2;
  repeated NullableIrExpression value_argument = 3;
  required TypeArguments type_arguments = 4;
}

message IrCall {
  required IrDataIndex symbol = 1;
  required MemberAccessCommon member_access = 2;
  optional IrDataIndex super = 3;
  optional IrStatementOrigin origin = 4;
}

message IrConstructorCall {
  required IrDataIndex symbol = 1;
  required int32 constructor_type_arguments_count = 2;
  required MemberAccessCommon member_access = 3;
}

message IrFunctionReference {
  required IrDataIndex symbol = 1;
  optional IrStatementOrigin origin = 2;
  required MemberAccessCommon member_access = 3;
}

message IrLocalDelegatedPropertyReference {
  required IrDataIndex delegate = 1;
  optional IrDataIndex getter = 2;
  optional IrDataIndex setter = 3;
  required IrDataIndex symbol = 4;
  optional IrStatementOrigin origin = 5;
}

message IrPropertyReference {
  optional IrDataIndex field = 1;
  optional IrDataIndex getter = 2;
  optional IrDataIndex setter = 3;
  optional IrStatementOrigin origin = 4;
  required MemberAccessCommon member_access = 5;
  required IrDataIndex symbol = 6;
}

message IrComposite {
  repeated IrStatement statement = 1;
  optional IrStatementOrigin origin = 2;
}

message IrClassReference {
  required IrDataIndex class_symbol = 1;
  required IrDataIndex class_type = 2;
}

message IrConst {
  oneof value {
    bool null = 1;
    bool boolean = 2;
    int32 char = 3;
    int32 byte = 4;
    int32 short = 5;
    int32 int = 6;
    int64 long = 7;
    float float = 8;
    double double = 9;
    IrDataIndex string = 10;
  }
}

message IrContinue {
  required int32 loop_id = 1;
  optional IrDataIndex label = 2;
}

message IrDelegatingConstructorCall {
  required IrDataIndex symbol = 1;
  required MemberAccessCommon member_access = 2;
}

message IrDoWhile {
  required Loop loop = 1;
}

message IrEnumConstructorCall {
  required IrDataIndex symbol = 1;
  required MemberAccessCommon member_access = 2;
}

message IrGetClass {
  required IrExpression argument = 1;
}

message IrGetEnumValue {
  required IrDataIndex symbol = 2;
}

message FieldAccessCommon {
  required IrDataIndex symbol = 1;
  optional IrDataIndex super = 2;
  optional IrExpression receiver = 3;
}

message IrGetField {
  required FieldAccessCommon field_access = 1;
  optional IrStatementOrigin origin = 2;
}

message IrGetValue {
  required IrDataIndex symbol = 1;
  optional IrStatementOrigin origin = 2;
}

message IrGetObject {
  required IrDataIndex symbol = 1;
}

message IrInstanceInitializerCall {
  required IrDataIndex symbol = 1;
}

message Loop {
  required int32 loop_id = 1;
  required IrExpression condition = 2;
  optional IrDataIndex label = 3;
  optional IrExpression body = 4;
  optional IrStatementOrigin origin = 5;
}

message IrReturn {
  required IrDataIndex return_target = 1;
  required IrExpression value = 2;
}

message IrSetField {
  required FieldAccessCommon field_access = 1;
  required IrExpression value = 2;
  optional IrStatementOrigin origin = 3;
}

message IrSetVariable {
  required IrDataIndex symbol = 1;
  required IrExpression value = 2;
  optional IrStatementOrigin origin = 3;
}

message IrSpreadElement {
  required IrExpression expression = 1;
  required Coordinates coordinates = 2;
}

message IrStringConcat {
  repeated IrExpression argument = 1;
}

message IrThrow {
  required IrExpression value = 1;
}

message IrTry {
  required IrExpression result = 1;
  repeated IrStatement catch = 2;
  optional IrExpression finally = 3;
}

message IrTypeOp {
  required IrTypeOperator operator = 1;
  required IrDataIndex operand = 2;
  required IrExpression argument = 3;
}

message IrVararg {
  required IrDataIndex element_type = 1;
  repeated IrVarargElement element = 2;
}

message IrVarargElement {
  oneof vararg_element {
    IrExpression expression = 1;
    IrSpreadElement spread_element = 2;
  }
}

message IrWhen {
  repeated IrStatement branch = 1;
  optional IrStatementOrigin origin = 2;
}

message IrWhile {
  required Loop loop = 1;
}

message IrFunctionExpression {
  required IrFunction function = 1;
  required IrStatementOrigin origin = 2;
}

/* ------ Dynamic expression --------------------------------------------- */

message IrDynamicMemberExpression {
  required IrDataIndex memberName = 1;
  required IrExpression receiver = 2;
}

message IrDynamicOperatorExpression {
  enum IrDynamicOperator {
    UNARY_PLUS = 1;
    UNARY_MINUS = 2;
    EXCL = 3;
    PREFIX_INCREMENT = 4;
    POSTFIX_INCREMENT = 5;
    PREFIX_DECREMENT = 6;
    POSTFIX_DECREMENT = 7;

    BINARY_PLUS = 8;
    BINARY_MINUS = 9;
    MUL = 10;
    DIV = 11;
    MOD = 12;
    GT = 13;
    LT = 14;
    GE = 15;
    LE = 16;
    EQEQ = 17;
    EXCLEQ = 18;
    EQEQEQ = 19;
    EXCLEQEQ = 20;
    ANDAND = 21;
    OROR = 22;

    EQ = 23;
    PLUSEQ = 24;
    MINUSEQ = 25;
    MULEQ = 26;
    DIVEQ = 27;
    MODEQ = 28;

    ARRAY_ACCESS = 29;
    INVOKE = 30;
  }
  required IrDynamicOperator operator = 1;
  required IrExpression receiver = 2;
  repeated IrExpression argument = 3;
}

// TODO: we need an extension mechanism to accomodate new
// IR operators in upcoming releases.
message IrOperation {
  oneof operation {
    IrBlock block = 1;
    IrBreak break = 2;
    IrCall call = 3;
    IrClassReference class_reference = 4;
    IrComposite composite = 5;
    IrConst const = 6;
    IrContinue continue = 7;
    IrDelegatingConstructorCall delegating_constructor_call = 8;
    IrDoWhile do_while = 9;
    IrEnumConstructorCall enum_constructor_call = 10;
    IrFunctionReference function_reference = 11;
    IrGetClass get_class = 12;
    IrGetEnumValue get_enum_value = 13;
    IrGetField get_field = 14;
    IrGetObject get_object = 15;
    IrGetValue get_value = 16;
    IrInstanceInitializerCall instance_initializer_call = 17;
    IrPropertyReference property_reference = 18;
    IrReturn return = 19;
    IrSetField set_field = 20;
    IrSetVariable set_variable = 21;
    IrStringConcat string_concat = 22;
    IrThrow throw = 23;
    IrTry try = 24;
    IrTypeOp type_op = 25;
    IrVararg vararg = 26;
    IrWhen when = 27;
    IrWhile while = 28;
    IrDynamicMemberExpression dynamic_member = 29;
    IrDynamicOperatorExpression dynamic_operator = 30;
    IrLocalDelegatedPropertyReference local_delegated_property_reference = 31;
    IrConstructorCall constructor_call = 32;
    IrFunctionExpression function_expression = 33;
  }
}

enum IrTypeOperator {
  CAST = 1;
  IMPLICIT_CAST = 2;
  IMPLICIT_NOTNULL = 3;
  IMPLICIT_COERCION_TO_UNIT = 4;
  IMPLICIT_INTEGER_COERCION = 5;
  SAFE_CAST = 6;
  INSTANCEOF = 7;
  NOT_INSTANCEOF = 8;
  SAM_CONVERSION = 9;
  IMPLICIT_DYNAMIC_CAST = 10;
}


message IrExpression {
  required IrOperation operation = 1;
  required IrDataIndex type = 2;
  required Coordinates coordinates = 3;
}

message NullableIrExpression {
  optional IrExpression expression = 1;
}

/* ------ Declarations --------------------------------------------- */

message IrDeclarationBase {
  required IrDataIndex symbol = 1;
  required IrDeclarationOrigin origin = 2;
  required Coordinates coordinates = 3;
  required Annotations annotations = 4;
}

message IrFunctionBase {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required Visibility visibility = 3;
  required bool is_inline = 4;
  required bool is_external = 5;
  required IrTypeParameterContainer type_parameters = 6;
  optional IrValueParameter dispatch_receiver = 7;
  optional IrValueParameter extension_receiver = 8;
  repeated IrValueParameter value_parameter = 9;
  optional IrDataIndex body = 10;
  required IrDataIndex return_type = 11;
}

message IrFunction {
  required IrFunctionBase base = 1;
  required ModalityKind modality = 2;
  required bool is_tailrec = 3;
  required bool is_suspend = 4;
  repeated IrDataIndex overridden = 5;
  //optional UniqId corresponding_property = 7;
}

message IrConstructor {
  required IrFunctionBase base = 1;
  required bool is_primary = 2;

}

message IrField {
  required IrDeclarationBase base = 1;
  optional IrDataIndex initializer = 2;
  required IrDataIndex name = 3;
  required Visibility visibility = 4;
  required bool is_final = 5;
  required bool is_external = 6;
  required bool is_static = 7;
  required IrDataIndex type = 8;
}

message IrLocalDelegatedProperty {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required IrDataIndex type = 3;
  required bool is_var = 4;
  required IrVariable delegate = 5;
  optional IrFunction getter = 6;
  optional IrFunction setter = 7;
}

message IrProperty {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required Visibility visibility = 3;
  required ModalityKind modality = 4;
  required bool is_var = 5;
  required bool is_const = 6;
  required bool is_lateinit = 7;
  required bool is_delegated = 8;
  required bool is_external = 9;
  optional IrField backing_field = 10;
  optional IrFunction getter = 11;
  optional IrFunction setter = 12;
}

message IrVariable {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required IrDataIndex type = 3;
  required bool is_var = 4;
  required bool is_const = 5;
  required bool is_lateinit = 6;
  optional IrExpression initializer = 7;
}

enum ClassKind {
  CLASS = 1;
  INTERFACE = 2;
  ENUM_CLASS = 3;
  ENUM_ENTRY = 4;
  ANNOTATION_CLASS = 5;
  OBJECT = 6;
}

enum ModalityKind { // It is ModalityKind to not clash with Modality in descriptor metadata.
                    FINAL_MODALITY = 1;
                    SEALED_MODALITY = 2;
                    OPEN_MODALITY = 3;
                    ABSTRACT_MODALITY = 4;
}

message IrValueParameter {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required int32 index = 3;
  required IrDataIndex type = 4;
  optional IrDataIndex vararg_element_type = 5;
  required bool is_crossinline = 6;
  required bool is_noinline = 7;
  optional IrDataIndex default_value = 8;
}

message IrTypeParameter {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required int32 index = 3;
  required IrTypeVariance variance = 4;
  repeated IrDataIndex super_type = 5;
  required bool is_reified = 6;
}

message IrTypeParameterContainer {
  repeated IrTypeParameter type_parameter = 1;
}

message IrClass {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required ClassKind kind = 3;
  required Visibility visibility = 4;
  required ModalityKind modality = 5;
  // TODO: consider using flags for the booleans.
  required bool is_companion = 6;
  required bool is_inner = 7;
  required bool is_data = 8;
  required bool is_external = 9;
  required bool is_inline = 10;
  optional IrValueParameter this_receiver = 11;
  required IrTypeParameterContainer type_parameters = 12;
  required IrDeclarationContainer declaration_container = 13;
  repeated IrDataIndex super_type = 14;
}

message IrTypeAlias {
  required IrDeclarationBase base = 1;
  required IrDataIndex name = 2;
  required Visibility visibility = 3;
  required IrTypeParameterContainer type_parameters = 4;
  required IrDataIndex expanded_type = 5;
  required bool is_actual = 6;
}

message IrEnumEntry {
  required IrDeclarationBase base = 1;
  optional IrDataIndex initializer = 2;
  optional IrClass corresponding_class = 3;
  required IrDataIndex name = 4;
}

message IrAnonymousInit {
  required IrDeclarationBase base = 1;
  required IrDataIndex body = 2;
}

// TODO: we need an extension mechanism to accomodate new
// IR operators in upcoming releases.

message IrDeclaration {
  oneof declarator {
    IrAnonymousInit ir_anonymous_init = 1;
    IrClass ir_class = 2;
    IrConstructor ir_constructor = 3;
    IrEnumEntry ir_enum_entry = 4;
    IrField ir_field = 5;
    IrFunction ir_function = 6;
    IrProperty ir_property = 7;
    IrTypeParameter ir_type_parameter = 8;
    IrVariable ir_variable = 9;
    IrValueParameter ir_value_parameter = 10;
    IrLocalDelegatedProperty ir_local_delegated_property = 11;
    IrTypeAlias ir_type_alias = 12;
  }
}

/* ------- IrStatements --------------------------------------------- */

message IrBranch {
  required IrExpression condition = 1;
  required IrExpression result = 2;
}

message IrBlockBody {
  repeated IrStatement statement = 1;
}

message IrCatch {
  required IrVariable catch_parameter = 1;
  required IrExpression result = 2;
}

enum IrSyntheticBodyKind {
  ENUM_VALUES = 1;
  ENUM_VALUEOF = 2;
}

message IrSyntheticBody {
  required IrSyntheticBodyKind kind = 1;
}

// Let's try to map IrElement as well as IrStatement to IrStatement.
message IrStatement {
  required Coordinates coordinates = 1;
  oneof statement {
    IrDeclaration declaration = 2;
    IrExpression expression = 3;
    IrBlockBody block_body = 4;
    IrBranch branch = 5;
    IrCatch catch = 6;
    IrSyntheticBody synthetic_body = 7;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy