Handled flexible array members in structs (#69)
diff --git a/lib/src/code_generator/type.dart b/lib/src/code_generator/type.dart
index 9622ee4..694bacf 100644
--- a/lib/src/code_generator/type.dart
+++ b/lib/src/code_generator/type.dart
@@ -116,7 +116,7 @@
}
factory Type.incompleteArray(Type elementType) {
return Type._(
- broadType: BroadType.ConstantArray,
+ broadType: BroadType.IncompleteArray,
child: elementType,
);
}
diff --git a/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
index 5081aed..39c56de 100644
--- a/lib/src/header_parser/sub_parsers/structdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
@@ -19,6 +19,7 @@
Struc struc;
bool nestedStructMember = false;
bool unimplementedMemberType = false;
+ bool flexibleArrayMember = false;
bool arrayMember = false;
_ParsedStruc();
}
@@ -92,6 +93,12 @@
_logger.warning(
'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), struct member has an unsupported type.');
return _stack.top.struc.members.clear();
+ } else if (_stack.top.flexibleArrayMember) {
+ _logger.fine(
+ '---- Removed Struct members, reason: incomplete array member ${cursor.completeStringRepr()}');
+ _logger.warning(
+ 'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Flexible array members not supported.');
+ return _stack.top.struc.members.clear();
}
}
@@ -118,6 +125,9 @@
// bindings.
_stack.top.nestedStructMember = true;
}
+ } else if (mt.broadType == BroadType.IncompleteArray) {
+ // TODO(68): Structs with flexible Array Members are not supported.
+ _stack.top.flexibleArrayMember = true;
}
if (mt.getBaseType().broadType == BroadType.Unimplemented) {
diff --git a/test/header_parser_tests/function_n_struct.h b/test/header_parser_tests/function_n_struct.h
index e779d5f..3ee27b8 100644
--- a/test/header_parser_tests/function_n_struct.h
+++ b/test/header_parser_tests/function_n_struct.h
@@ -12,4 +12,13 @@
struct Struct1 a;
};
+struct Struct3
+{
+ int a;
+ int b[]; // Flexible array member.
+};
+
void func1(struct Struct2 *s);
+
+// Incomplete array parameter will be treated as a pointer.
+void func2(struct Struct3 s[]);
diff --git a/test/header_parser_tests/function_n_struct_test.dart b/test/header_parser_tests/function_n_struct_test.dart
index b3da1d8..38951f1 100644
--- a/test/header_parser_tests/function_n_struct_test.dart
+++ b/test/header_parser_tests/function_n_struct_test.dart
@@ -32,22 +32,31 @@
);
});
- test('func1', () {
+ test('func1 struct pointer parameter', () {
expect(actual.getBindingAsString('func1'),
expected.getBindingAsString('func1'));
});
- test('Struct2', () {
+ test('func2 incomplete array parameter', () {
+ expect(actual.getBindingAsString('func2'),
+ expected.getBindingAsString('func2'));
+ });
+ test('Struct2 nested struct member', () {
expect((actual.getBinding('Struct2') as Struc).members.isEmpty, true);
});
+ test('Struct3 flexible array member', () {
+ expect((actual.getBinding('Struct3') as Struc).members.isEmpty, true);
+ });
});
}
Library expectedLibrary() {
final struc2 = Struc(name: 'Struct2', members: []);
+ final struc3 = Struc(name: 'Struct3', members: []);
return Library(
name: 'Bindings',
bindings: [
struc2,
+ struc3,
Struc(name: 'Struct1', members: [
Member(
name: 'a',
@@ -63,6 +72,15 @@
SupportedNativeType.Void,
),
),
+ Func(
+ name: 'func2',
+ parameters: [
+ Parameter(name: 's', type: Type.pointer(Type.struct(struc3))),
+ ],
+ returnType: Type.nativeType(
+ SupportedNativeType.Void,
+ ),
+ ),
],
);
}