Skip to content

Commit

Permalink
Implement enums and services, add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
osa1 committed Dec 29, 2023
1 parent 84d9214 commit 89fd765
Show file tree
Hide file tree
Showing 6 changed files with 236 additions and 1 deletion.
1 change: 1 addition & 0 deletions protoc_plugin/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ TEST_PROTO_LIST = \
google/protobuf/wrappers \
custom_option \
dart_name \
deprecations \
default_value_escape \
entity \
enum_extension \
Expand Down
8 changes: 7 additions & 1 deletion protoc_plugin/lib/src/enum_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ class EnumGenerator extends ProtobufContainer {
List<int>? _fieldPath;
final List<int> _fieldPathSegment;

/// See [[ProtobufContainer]
@override
List<int>? get fieldPath =>
_fieldPath ??= List.from(parent!.fieldPath!)..addAll(_fieldPathSegment);
Expand Down Expand Up @@ -107,6 +106,9 @@ class EnumGenerator extends ProtobufContainer {
if (comment != null) {
out.println(comment);
}
if (_descriptor.options.deprecated) {
out.println('@$coreImportPrefix.Deprecated(\'This enum is deprecated\')');
}
out.addAnnotatedBlock(
'class $classname extends $protobufImportPrefix.ProtobufEnum {',
'}\n', [
Expand All @@ -124,6 +126,10 @@ class EnumGenerator extends ProtobufContainer {
out.addSuffix(
omitEnumNames.constFieldName, omitEnumNames.constDefinition);
final conditionalValName = omitEnumNames.createTernary(val.name);
if (val.options.deprecated) {
out.println(
'@$coreImportPrefix.Deprecated(\'This enum value is deprecated\')');
}
out.printlnAnnotated(
'static const $classname $name = '
'$classname._(${val.number}, $conditionalValName);',
Expand Down
22 changes: 22 additions & 0 deletions protoc_plugin/test/deprecations_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:io';

import 'package:test/test.dart';

import 'golden_file.dart';

void main() {
test('Deprecated annotation generation for messages', () {
final actual = File('out/protos/deprecations.pb.dart').readAsStringSync();
expectMatchesGoldenFile(actual, 'test/goldens/deprecations');
});

test('Deprecated annotation generation for enums', () {
final actual = File('out/protos/constructor_args/deprecations.pbenum.dart')
.readAsStringSync();
expectMatchesGoldenFile(actual, 'test/goldens/deprecations.pbenum');
});
}
141 changes: 141 additions & 0 deletions protoc_plugin/test/goldens/deprecations
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
//
// Generated code. Do not modify.
// source: deprecations.proto
//
// @dart = 2.12

// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import

import 'dart:async' as $async;
import 'dart:core' as $core;

import 'package:protobuf/protobuf.dart' as $pb;

export 'deprecations.pbenum.dart';

class HelloRequest extends $pb.GeneratedMessage {
factory HelloRequest() => create();
HelloRequest._() : super();
factory HelloRequest.fromBuffer($core.List<$core.int> i,
[$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(i, r);
factory HelloRequest.fromJson($core.String i,
[$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(i, r);

static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'HelloRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'service'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'name')
..hasRequiredFields = false;

@$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
HelloRequest clone() => HelloRequest()..mergeFromMessage(this);
@$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
HelloRequest copyWith(void Function(HelloRequest) updates) =>
super.copyWith((message) => updates(message as HelloRequest))
as HelloRequest;

$pb.BuilderInfo get info_ => _i;

@$core.pragma('dart2js:noInline')
static HelloRequest create() => HelloRequest._();
HelloRequest createEmptyInstance() => create();
static $pb.PbList<HelloRequest> createRepeated() =>
$pb.PbList<HelloRequest>();
@$core.pragma('dart2js:noInline')
static HelloRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<HelloRequest>(create);
static HelloRequest? _defaultInstance;

@$core.Deprecated('This field is deprecated.')
@$pb.TagNumber(1)
$core.String get name => $_getSZ(0);
@$core.Deprecated('This field is deprecated.')
@$pb.TagNumber(1)
set name($core.String v) {
$_setString(0, v);
}

@$core.Deprecated('This field is deprecated.')
@$pb.TagNumber(1)
$core.bool hasName() => $_has(0);
@$core.Deprecated('This field is deprecated.')
@$pb.TagNumber(1)
void clearName() => clearField(1);
}

class HelloReply extends $pb.GeneratedMessage {
factory HelloReply() => create();
HelloReply._() : super();
factory HelloReply.fromBuffer($core.List<$core.int> i,
[$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(i, r);
factory HelloReply.fromJson($core.String i,
[$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(i, r);

static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'HelloReply',
package: const $pb.PackageName(_omitMessageNames ? '' : 'service'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'message')
..hasRequiredFields = false;

@$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
HelloReply clone() => HelloReply()..mergeFromMessage(this);
@$core.Deprecated('Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
HelloReply copyWith(void Function(HelloReply) updates) =>
super.copyWith((message) => updates(message as HelloReply)) as HelloReply;

$pb.BuilderInfo get info_ => _i;

@$core.pragma('dart2js:noInline')
static HelloReply create() => HelloReply._();
HelloReply createEmptyInstance() => create();
static $pb.PbList<HelloReply> createRepeated() => $pb.PbList<HelloReply>();
@$core.pragma('dart2js:noInline')
static HelloReply getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<HelloReply>(create);
static HelloReply? _defaultInstance;

@$pb.TagNumber(1)
$core.String get message => $_getSZ(0);
@$pb.TagNumber(1)
set message($core.String v) {
$_setString(0, v);
}

@$pb.TagNumber(1)
$core.bool hasMessage() => $_has(0);
@$pb.TagNumber(1)
void clearMessage() => clearField(1);
}

@$core.Deprecated('This service is deprecated')
class GreeterApi {
$pb.RpcClient _client;
GreeterApi(this._client);

@$core.Deprecated('This method is deprecated')
$async.Future<HelloReply> sayHello(
$pb.ClientContext? ctx, HelloRequest request) =>
_client.invoke<HelloReply>(
ctx, 'Greeter', 'SayHello', request, HelloReply());
}

const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');
const _omitMessageNames =
$core.bool.fromEnvironment('protobuf.omit_message_names');
33 changes: 33 additions & 0 deletions protoc_plugin/test/goldens/deprecations.pbenum
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// Generated code. Do not modify.
// source: deprecations.proto
//
// @dart = 2.12

// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_final_fields
// ignore_for_file: unnecessary_import, unnecessary_this, unused_import

import 'dart:core' as $core;

import 'package:protobuf/protobuf.dart' as $pb;

@$core.Deprecated('This enum is deprecated')
class A extends $pb.ProtobufEnum {
static const A A1 = A._(0, _omitEnumNames ? '' : 'A1');
static const A A2 = A._(1, _omitEnumNames ? '' : 'A2');

static const $core.List<A> values = <A>[
A1,
A2,
];

static final $core.Map<$core.int, A> _byValue =
$pb.ProtobufEnum.initByValue(values);
static A? valueOf($core.int value) => _byValue[value];

const A._($core.int v, $core.String n) : super(v, n);
}

const _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');
32 changes: 32 additions & 0 deletions protoc_plugin/test/protos/deprecations.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

syntax = "proto3";

package service;

service Greeter {
option deprecated = true;

rpc SayHello (HelloRequest) returns (HelloReply) {
option deprecated = true;
}
}

message HelloRequest {
option deprecated = true;

string name = 1 [deprecated = true];
}

message HelloReply {
string message = 1;
}

enum A {
option deprecated = true;

A1 = 0;
A2 = 1;
}

0 comments on commit 89fd765

Please sign in to comment.