mirror of
https://github.com/flutter/packages.git
synced 2025-07-01 23:51:55 +08:00
[pigeon] fixed recursing into class declarations in the front end parser (#386)
This commit is contained in:
@ -1,3 +1,8 @@
|
|||||||
|
## 0.2.4
|
||||||
|
|
||||||
|
* bugfix in front-end parser for recursively referenced datatypes.
|
||||||
|
|
||||||
|
|
||||||
## 0.2.3
|
## 0.2.3
|
||||||
|
|
||||||
* bugfix in iOS async handlers of functions with no arguments.
|
* bugfix in iOS async handlers of functions with no arguments.
|
||||||
|
@ -8,7 +8,7 @@ import 'dart:mirrors';
|
|||||||
import 'ast.dart';
|
import 'ast.dart';
|
||||||
|
|
||||||
/// The current version of pigeon. This must match the version in pubspec.yaml.
|
/// The current version of pigeon. This must match the version in pubspec.yaml.
|
||||||
const String pigeonVersion = '0.2.3';
|
const String pigeonVersion = '0.2.4';
|
||||||
|
|
||||||
/// Read all the content from [stdin] to a String.
|
/// Read all the content from [stdin] to a String.
|
||||||
String readStdin() {
|
String readStdin() {
|
||||||
|
@ -399,6 +399,27 @@ class Pigeon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Recurse into class field declarations.
|
||||||
|
final List<ClassMirror> classesToRecurse = <ClassMirror>[...classes];
|
||||||
|
while (classesToRecurse.isNotEmpty) {
|
||||||
|
final ClassMirror next = classesToRecurse.removeLast();
|
||||||
|
for (final DeclarationMirror declaration in next.declarations.values) {
|
||||||
|
if (declaration is VariableMirror) {
|
||||||
|
final TypeMirror fieldType = declaration.type;
|
||||||
|
if (fieldType is ClassMirror) {
|
||||||
|
if (!classes.contains(fieldType) &&
|
||||||
|
!fieldType.isEnum &&
|
||||||
|
!_validTypes
|
||||||
|
.contains(MirrorSystem.getName(fieldType.simpleName))) {
|
||||||
|
classes.add(declaration.type as ClassMirror);
|
||||||
|
classesToRecurse.add(declaration.type as ClassMirror);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Parse referenced enum types out of classes.
|
// Parse referenced enum types out of classes.
|
||||||
for (final ClassMirror klass in classes) {
|
for (final ClassMirror klass in classes) {
|
||||||
for (final DeclarationMirror declaration in klass.declarations.values) {
|
for (final DeclarationMirror declaration in klass.declarations.values) {
|
||||||
|
@ -2,7 +2,7 @@ name: pigeon
|
|||||||
description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
|
description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
|
||||||
repository: https://github.com/flutter/packages/tree/master/packages/pigeon
|
repository: https://github.com/flutter/packages/tree/master/packages/pigeon
|
||||||
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
|
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
|
||||||
version: 0.2.3 # This must match the version in lib/generator_tools.dart
|
version: 0.2.4 # This must match the version in lib/generator_tools.dart
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.12.0 <3.0.0'
|
sdk: '>=2.12.0 <3.0.0'
|
||||||
|
@ -71,8 +71,9 @@ test_pigeon_ios() {
|
|||||||
xcrun clang \
|
xcrun clang \
|
||||||
-arch arm64 \
|
-arch arm64 \
|
||||||
-isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
|
-isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
|
||||||
-F $framework_path \
|
|
||||||
-F $framework_path/Flutter.xcframework/ios-armv7_arm64 \
|
-F $framework_path/Flutter.xcframework/ios-armv7_arm64 \
|
||||||
|
-F $framework_path/Flutter.xcframework/ios-armv7 \
|
||||||
|
-F $framework_path/Flutter.xcframework/ios-arm64_armv7 \
|
||||||
-Werror \
|
-Werror \
|
||||||
-fobjc-arc \
|
-fobjc-arc \
|
||||||
-c $temp_dir/pigeon.m \
|
-c $temp_dir/pigeon.m \
|
||||||
|
@ -86,6 +86,26 @@ abstract class InvalidReturnTypeApi {
|
|||||||
bool doit();
|
bool doit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum NestedEnum { one, two }
|
||||||
|
|
||||||
|
class NestedEnum1 {
|
||||||
|
NestedEnum? test;
|
||||||
|
}
|
||||||
|
|
||||||
|
class NestedEnum2 {
|
||||||
|
NestedEnum1? class1;
|
||||||
|
}
|
||||||
|
|
||||||
|
class NestedEnum3 {
|
||||||
|
NestedEnum2? class1;
|
||||||
|
int? n;
|
||||||
|
}
|
||||||
|
|
||||||
|
@HostApi()
|
||||||
|
abstract class NestedEnumApi {
|
||||||
|
void method(NestedEnum3 foo);
|
||||||
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
test('parse args - input', () {
|
test('parse args - input', () {
|
||||||
final PigeonOptions opts =
|
final PigeonOptions opts =
|
||||||
@ -312,4 +332,13 @@ void main() {
|
|||||||
objcSourceGenerator.generate(buffer, options, root);
|
objcSourceGenerator.generate(buffer, options, root);
|
||||||
expect(buffer.toString(), startsWith('// Copyright 2013'));
|
expect(buffer.toString(), startsWith('// Copyright 2013'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('nested enum', () {
|
||||||
|
final Pigeon dartle = Pigeon.setup();
|
||||||
|
final ParseResults parseResult = dartle.parse(<Type>[NestedEnumApi]);
|
||||||
|
expect(parseResult.errors.length, equals(0));
|
||||||
|
expect(parseResult.root.apis.length, 1);
|
||||||
|
expect(parseResult.root.classes.length, 3);
|
||||||
|
expect(parseResult.root.enums.length, 1);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user