[pigeon] Add documentation comment support for Enum members (#2924)

* [pigeon] Add documentation comment support for Enum members

* [pigeon] Bump version
This commit is contained in:
mgkdev
2022-12-19 08:32:29 +09:00
committed by GitHub
parent 676d80c9c8
commit 9b153b2495
18 changed files with 179 additions and 85 deletions

View File

@ -1,3 +1,7 @@
## 4.2.13
* Add documentation comment support for Enum members.
## 4.2.12
* Updates serialization to use lists instead of maps to improve performance.

View File

@ -242,7 +242,7 @@ class Enum extends Node {
String name;
/// All of the members of the enum.
List<String> members;
List<EnumMember> members;
/// List of documentation comments, seperated by line.
///
@ -257,6 +257,30 @@ class Enum extends Node {
}
}
/// Represents a Enum member.
class EnumMember extends Node {
/// Parametric constructor for [EnumMember].
EnumMember({
required this.name,
this.documentationComments = const <String>[],
});
/// The name of the enum member.
final String name;
/// List of documentation comments, seperated by line.
///
/// Lines should not include the comment marker itself, but should include any
/// leading whitespace, so that any indentation in the original comment is preserved.
/// For example: [" List of documentation comments, separated by line.", ...]
final List<String> documentationComments;
@override
String toString() {
return '(EnumMember name:$name documentationComments:$documentationComments)';
}
}
/// Top-level node for the AST.
class Root extends Node {
/// Parametric constructor for [Root].

View File

@ -1059,9 +1059,11 @@ void generateCppHeader(
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('enum class ${anEnum.name} ');
indent.scoped('{', '};', () {
enumerate(anEnum.members, (int index, final String member) {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
indent.writeln(
'$member = $index${index == anEnum.members.length - 1 ? '' : ','}');
'${member.name} = $index${index == anEnum.members.length - 1 ? '' : ','}');
});
});
}

View File

@ -482,8 +482,10 @@ void generateDart(DartOptions opt, Root root, StringSink sink) {
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('enum ${anEnum.name} ');
indent.scoped('{', '}', () {
for (final String member in anEnum.members) {
indent.writeln('$member,');
for (final EnumMember member in anEnum.members) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
indent.writeln('${member.name},');
}
});
}

View File

@ -9,7 +9,7 @@ import 'dart:mirrors';
import 'ast.dart';
/// The current version of pigeon. This must match the version in pubspec.yaml.
const String pigeonVersion = '4.2.12';
const String pigeonVersion = '4.2.13';
/// Read all the content from [stdin] to a String.
String readStdin() {

View File

@ -569,9 +569,11 @@ void generateJava(JavaOptions options, Root root, StringSink sink) {
indent.write('public enum ${anEnum.name} ');
indent.scoped('{', '}', () {
enumerate(anEnum.members, (int index, final String member) {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
indent.writeln(
'${camelToSnake(member)}($index)${index == anEnum.members.length - 1 ? ';' : ','}');
'${camelToSnake(member.name)}($index)${index == anEnum.members.length - 1 ? ';' : ','}');
});
indent.writeln('');
indent.writeln('private final int index;');

View File

@ -471,8 +471,10 @@ void generateKotlin(KotlinOptions options, Root root, StringSink sink) {
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('enum class ${anEnum.name}(val raw: Int) ');
indent.scoped('{', '}', () {
enumerate(anEnum.members, (int index, final String member) {
indent.write('${member.toUpperCase()}($index)');
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
indent.write('${member.name.toUpperCase()}($index)');
if (index != anEnum.members.length - 1) {
indent.addln(',');
} else {

View File

@ -561,10 +561,12 @@ void generateObjcHeader(ObjcOptions options, Root root, StringSink sink) {
indent.write('typedef NS_ENUM(NSUInteger, $enumName) ');
indent.scoped('{', '};', () {
enumerate(anEnum.members, (int index, final String member) {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
// Capitalized first letter to ensure Swift compatibility
indent.writeln(
'$enumName${member[0].toUpperCase()}${member.substring(1)} = $index,');
'$enumName${member.name[0].toUpperCase()}${member.name.substring(1)} = $index,');
});
});
}

View File

@ -1049,7 +1049,11 @@ class _RootBuilder extends dart_ast_visitor.RecursiveAstVisitor<Object?> {
_enums.add(Enum(
name: node.name2.lexeme,
members: node.constants
.map((dart_ast.EnumConstantDeclaration e) => e.name2.lexeme)
.map((dart_ast.EnumConstantDeclaration e) => EnumMember(
name: e.name2.lexeme,
documentationComments: _documentationCommentsParser(
e.documentationComment?.tokens),
))
.toList(),
documentationComments:
_documentationCommentsParser(node.documentationComment?.tokens),

View File

@ -470,8 +470,10 @@ import FlutterMacOS
indent.write('enum ${anEnum.name}: Int ');
indent.scoped('{', '}', () {
enumerate(anEnum.members, (int index, final String member) {
indent.writeln('case ${_camelCase(member)} = $index');
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
indent.writeln('case ${_camelCase(member.name)} = $index');
});
});
}

View File

@ -6,8 +6,13 @@ import 'package:pigeon/pigeon.dart';
/// This comment is to test enum documentation comments.
enum EnumState {
/// This comment is to test enum member (Pending) documentation comments.
Pending,
/// This comment is to test enum member (Success) documentation comments.
Success,
/// This comment is to test enum member (Error) documentation comments.
Error,
}

View File

@ -2,7 +2,7 @@ name: pigeon
description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
repository: https://github.com/flutter/packages/tree/main/packages/pigeon
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
version: 4.2.12 # This must match the version in lib/generator_tools.dart
version: 4.2.13 # This must match the version in lib/generator_tools.dart
environment:
sdk: ">=2.12.0 <3.0.0"

View File

@ -1038,7 +1038,10 @@ void main() {
],
classes: <Class>[],
enums: <Enum>[
Enum(name: 'Foo', members: <String>['one', 'two'])
Enum(name: 'Foo', members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
])
],
);
final List<Error> errors = validateCpp(const CppOptions(), root);
@ -1052,6 +1055,7 @@ void main() {
' class comment',
' class field comment',
' enum comment',
' enum member comment',
];
int count = 0;
@ -1107,9 +1111,12 @@ void main() {
comments[count++],
unspacedComments[unspacedCount++]
],
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(
name: 'one',
documentationComments: <String>[comments[count++]],
),
EnumMember(name: 'two'),
],
),
],

View File

@ -38,9 +38,9 @@ void main() {
test('gen one enum', () {
final Enum anEnum = Enum(
name: 'Foobar',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
);
final Root root = Root(
@ -408,9 +408,9 @@ void main() {
], enums: <Enum>[
Enum(
name: 'Enum',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
)
]);
@ -436,7 +436,10 @@ void main() {
])
])
], classes: <Class>[], enums: <Enum>[
Enum(name: 'Foo', members: <String>['one', 'two'])
Enum(name: 'Foo', members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
])
]);
final StringBuffer sink = StringBuffer();
generateDart(const DartOptions(), root, sink);
@ -475,9 +478,9 @@ void main() {
], enums: <Enum>[
Enum(
name: 'Enum',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
)
]);
@ -1168,6 +1171,7 @@ name: foobar
' class comment',
' class field comment',
' enum comment',
' enum member comment',
];
int count = 0;
@ -1223,9 +1227,12 @@ name: foobar
comments[count++],
unspacedComments[unspacedCount++]
],
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(
name: 'one',
documentationComments: <String>[comments[count++]],
),
EnumMember(name: 'two'),
],
),
],
@ -1339,9 +1346,9 @@ name: foobar
enums: <Enum>[
Enum(
name: 'Enum',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
)
],

View File

@ -42,10 +42,10 @@ void main() {
test('gen one enum', () {
final Enum anEnum = Enum(
name: 'Foobar',
members: <String>[
'one',
'twoThreeFour',
'remoteDB',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'twoThreeFour'),
EnumMember(name: 'remoteDB'),
],
);
final Root root = Root(
@ -558,10 +558,10 @@ void main() {
test('gen one enum class', () {
final Enum anEnum = Enum(
name: 'Enum1',
members: <String>[
'one',
'twoThreeFour',
'remoteDB',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'twoThreeFour'),
EnumMember(name: 'remoteDB'),
],
);
final Class klass = Class(
@ -614,7 +614,10 @@ void main() {
])
])
], classes: <Class>[], enums: <Enum>[
Enum(name: 'Foo', members: <String>['one', 'two'])
Enum(name: 'Foo', members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
])
]);
final StringBuffer sink = StringBuffer();
const JavaOptions javaOptions = JavaOptions(className: 'Messages');
@ -1135,6 +1138,7 @@ void main() {
' class comment',
' class field comment',
' enum comment',
' enum member comment',
];
int count = 0;
@ -1191,9 +1195,12 @@ void main() {
comments[count++],
unspacedComments[unspacedCount++]
],
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(
name: 'one',
documentationComments: <String>[comments[count++]],
),
EnumMember(name: 'two'),
],
),
],

View File

@ -38,9 +38,9 @@ void main() {
test('gen one enum', () {
final Enum anEnum = Enum(
name: 'Foobar',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
);
final Root root = Root(
@ -71,7 +71,10 @@ void main() {
])
])
], classes: <Class>[], enums: <Enum>[
Enum(name: 'Foo', members: <String>['one', 'two'])
Enum(name: 'Foo', members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
])
]);
final StringBuffer sink = StringBuffer();
const KotlinOptions kotlinOptions = KotlinOptions();
@ -583,9 +586,9 @@ void main() {
test('gen one enum class', () {
final Enum anEnum = Enum(
name: 'Enum1',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
);
final Class klass = Class(
@ -1014,6 +1017,7 @@ void main() {
' class comment',
' class field comment',
' enum comment',
' enum member comment',
];
int count = 0;
@ -1070,9 +1074,12 @@ void main() {
comments[count++],
unspacedComments[unspacedCount++]
],
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(
name: 'one',
documentationComments: <String>[comments[count++]],
),
EnumMember(name: 'two'),
],
),
],

View File

@ -42,9 +42,9 @@ void main() {
final Root root = Root(apis: <Api>[], classes: <Class>[], enums: <Enum>[
Enum(
name: 'Enum1',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
)
]);
@ -60,9 +60,9 @@ void main() {
final Root root = Root(apis: <Api>[], classes: <Class>[], enums: <Enum>[
Enum(
name: 'Enum1',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
)
]);
@ -95,9 +95,9 @@ void main() {
enums: <Enum>[
Enum(
name: 'Enum1',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
)
],
@ -127,7 +127,10 @@ void main() {
])
])
], classes: <Class>[], enums: <Enum>[
Enum(name: 'Foo', members: <String>['one', 'two'])
Enum(name: 'Foo', members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
])
]);
final StringBuffer sink = StringBuffer();
const ObjcOptions options = ObjcOptions(header: 'foo.h', prefix: 'AC');
@ -161,7 +164,10 @@ void main() {
])
])
], classes: <Class>[], enums: <Enum>[
Enum(name: 'Foo', members: <String>['one', 'two'])
Enum(name: 'Foo', members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
])
]);
const ObjcOptions options = ObjcOptions(header: 'foo.h');
final List<Error> errors = validateObjc(options, root);
@ -190,9 +196,9 @@ void main() {
enums: <Enum>[
Enum(
name: 'Enum1',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
)
],
@ -1749,6 +1755,7 @@ void main() {
' class comment',
' class field comment',
' enum comment',
' enum member comment',
];
int count = 0;
@ -1805,9 +1812,12 @@ void main() {
comments[count++],
unspacedComments[unspacedCount++]
],
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(
name: 'one',
documentationComments: <String>[comments[count++]],
),
EnumMember(name: 'two'),
],
),
],

View File

@ -37,9 +37,9 @@ void main() {
test('gen one enum', () {
final Enum anEnum = Enum(
name: 'Foobar',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
);
final Root root = Root(
@ -70,7 +70,10 @@ void main() {
])
])
], classes: <Class>[], enums: <Enum>[
Enum(name: 'Foo', members: <String>['one', 'two'])
Enum(name: 'Foo', members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
])
]);
final StringBuffer sink = StringBuffer();
const SwiftOptions swiftOptions = SwiftOptions();
@ -532,9 +535,9 @@ void main() {
test('gen one enum class', () {
final Enum anEnum = Enum(
name: 'Enum1',
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(name: 'one'),
EnumMember(name: 'two'),
],
);
final Class klass = Class(
@ -953,6 +956,7 @@ void main() {
' class comment',
' class field comment',
' enum comment',
' enum member comment',
];
int count = 0;
@ -1009,9 +1013,12 @@ void main() {
comments[count++],
unspacedComments[unspacedCount++]
],
members: <String>[
'one',
'two',
members: <EnumMember>[
EnumMember(
name: 'one',
documentationComments: <String>[comments[count++]],
),
EnumMember(name: 'two'),
],
),
],