// Experimental options controlling Dart code generation.
syntax = "proto2";

package dart_options;

// This file must be modified for Google internal use,
// because custom options only work when the package name
// agrees with the version of protoc we are using.
// (The import statement and "google.protobuf." prefix need to be changed.)

import "descriptor.proto";

// A mixin that can be used in the 'with' clause of the generated Dart class
// for a proto message.
message DartMixin {
  // The name of the mixin class.
  optional string name = 1;

  // A URI pointing to the Dart library that defines the mixin.
  // The generated Dart code will use this in an import statement.
  optional string import_from = 2;

  // The name of another mixin to be applied ahead of this one.
  // The generated class for the message will inherit from all mixins
  // in the parent chain.
  optional string parent = 3;
}

// Defines additional Dart imports to be used with messages in this file.
message Imports {

  // Mixins to be used on messages in this file.
  // These mixins are in addition to internally defined mixins (e.g PbMapMixin)
  // and may override them.
  //
  // Warning: mixins are experimental. The protoc Dart plugin doesn't check
  // for name conflicts between mixin class members and generated class members,
  // so the generated code may contain errors. Therefore, running dartanalyzer
  // on the generated file is a good idea.
  repeated DartMixin mixins = 1;
}

extend google.protobuf.FileOptions {

  optional Imports imports = 28125061;

  // Applies the named mixin to all messages in this file.
  // (May be overridden by the "mixin" option on a message.)
  // For now, "PbMapMixin" is the only available mixin.
  optional string default_mixin = 96128839;
}

extend google.protobuf.MessageOptions {

  // Applies the named mixin.
  // For now, "PbMapMixin" is the only available mixin.
  // The empty string can be used to turn off mixins for this message.
  optional string mixin = 96128839;
}

extend google.protobuf.FieldOptions {
  // Adds @override annotation to the field's getter (for use with mixins).
  optional bool override_getter = 28205290;

  // Adds @override annotation to the field's setter (for use with mixins).
  optional bool override_setter = 28937366;

  // Adds @override annotation to the field's hasX() method (for use with
  // mixins).
  optional bool override_has_method = 28937461;

  // Adds @override annotation to the field's clearX() method (for use with
  // mixins).
  optional bool override_clear_method = 28907907;

  // Uses the given name for getters, setters and as suffixes for has/clear
  // methods in the generated Dart file. Should be lowerCamelCase.
  optional string dart_name = 28700919;
}
