From 89fd765c3a8adadbbdc4fc1b750f639339a02b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= Date: Fri, 29 Dec 2023 14:34:04 +0100 Subject: [PATCH] Implement enums and services, add tests --- protoc_plugin/Makefile | 1 + protoc_plugin/lib/src/enum_generator.dart | 8 +- protoc_plugin/test/deprecations_test.dart | 22 +++ protoc_plugin/test/goldens/deprecations | 141 ++++++++++++++++++ .../test/goldens/deprecations.pbenum | 33 ++++ protoc_plugin/test/protos/deprecations.proto | 32 ++++ 6 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 protoc_plugin/test/deprecations_test.dart create mode 100644 protoc_plugin/test/goldens/deprecations create mode 100644 protoc_plugin/test/goldens/deprecations.pbenum create mode 100644 protoc_plugin/test/protos/deprecations.proto diff --git a/protoc_plugin/Makefile b/protoc_plugin/Makefile index 69bca65d2..45e2cdd1a 100644 --- a/protoc_plugin/Makefile +++ b/protoc_plugin/Makefile @@ -24,6 +24,7 @@ TEST_PROTO_LIST = \ google/protobuf/wrappers \ custom_option \ dart_name \ + deprecations \ default_value_escape \ entity \ enum_extension \ diff --git a/protoc_plugin/lib/src/enum_generator.dart b/protoc_plugin/lib/src/enum_generator.dart index 03c80b0a1..48bfe6da1 100644 --- a/protoc_plugin/lib/src/enum_generator.dart +++ b/protoc_plugin/lib/src/enum_generator.dart @@ -32,7 +32,6 @@ class EnumGenerator extends ProtobufContainer { List? _fieldPath; final List _fieldPathSegment; - /// See [[ProtobufContainer] @override List? get fieldPath => _fieldPath ??= List.from(parent!.fieldPath!)..addAll(_fieldPathSegment); @@ -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', [ @@ -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);', diff --git a/protoc_plugin/test/deprecations_test.dart b/protoc_plugin/test/deprecations_test.dart new file mode 100644 index 000000000..3b386c798 --- /dev/null +++ b/protoc_plugin/test/deprecations_test.dart @@ -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'); + }); +} diff --git a/protoc_plugin/test/goldens/deprecations b/protoc_plugin/test/goldens/deprecations new file mode 100644 index 000000000..7452a64eb --- /dev/null +++ b/protoc_plugin/test/goldens/deprecations @@ -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 createRepeated() => + $pb.PbList(); + @$core.pragma('dart2js:noInline') + static HelloRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(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 createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static HelloReply getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(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 sayHello( + $pb.ClientContext? ctx, HelloRequest request) => + _client.invoke( + ctx, 'Greeter', 'SayHello', request, HelloReply()); +} + +const _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); +const _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/protoc_plugin/test/goldens/deprecations.pbenum b/protoc_plugin/test/goldens/deprecations.pbenum new file mode 100644 index 000000000..90b16631b --- /dev/null +++ b/protoc_plugin/test/goldens/deprecations.pbenum @@ -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 values = [ + 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'); diff --git a/protoc_plugin/test/protos/deprecations.proto b/protoc_plugin/test/protos/deprecations.proto new file mode 100644 index 000000000..bcf419119 --- /dev/null +++ b/protoc_plugin/test/protos/deprecations.proto @@ -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; +}