Skip to content

Commit 12e3939

Browse files
committed
Dart: implement tests showing invalid behavior for internal typealiases
When typealias is declared in an internal class or is internal, then the generated code does not compile. This commit showcases the bug in smoke and functional tests. The compilation fails. Signed-off-by: Patryk Wrobel <183546751+pwrobeldev@users.noreply.github.com>
1 parent bec8d0f commit 12e3939

6 files changed

Lines changed: 278 additions & 0 deletions

File tree

functional-tests/functional/input/lime/VisibilityInternal.lime

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,31 @@ struct PublicStructWithNonDefaultInternalField {
3232
publicField: Boolean
3333
}
3434

35+
@Skip(Java, Kotlin, Swift)
36+
@Internal
37+
class DartInternalClassWithInternalTypedef {
38+
@Internal
39+
typealias SomeStringToIntMap = Map<String, Int>
40+
41+
@Internal
42+
typealias SomeStringArray = List<String>
43+
44+
property numbers: SomeStringToIntMap
45+
property labels: SomeStringArray
46+
}
47+
48+
@Skip(Java, Kotlin, Swift)
49+
class SomeDartClassThatUsesInternal {
50+
@Internal
51+
typealias ListOfInternals = List<DartInternalClassWithInternalTypedef>
52+
53+
@Internal
54+
fun add_entity(
55+
// The entity to add.
56+
entity: DartInternalClassWithInternalTypedef
57+
)
58+
}
59+
3560
@Internal
3661
class InternalClassWithStaticProperty {
3762
static property fooBar: String

functional-tests/functional/input/src/cpp/VisibilityInternal.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
//
1919
// -------------------------------------------------------------------------------------------------
2020

21+
#include "test/DartInternalClassWithInternalTypedef.h"
2122
#include "test/DartInternalElements.h"
2223
#include "test/DartInternalElementsRev.h"
2324
#include "test/DartPublicElements.h"
@@ -26,6 +27,34 @@
2627

2728
namespace test
2829
{
30+
31+
class SomeImplOfDartInternalClassWithInternalTypedef : public DartInternalClassWithInternalTypedef {
32+
public:
33+
SomeImplOfDartInternalClassWithInternalTypedef() = default;
34+
~SomeImplOfDartInternalClassWithInternalTypedef() override = default;
35+
36+
public:
37+
::test::DartInternalClassWithInternalTypedef::SomeStringToIntMap get_numbers() const override {
38+
return m_numbers;
39+
}
40+
41+
void set_numbers(const ::test::DartInternalClassWithInternalTypedef::SomeStringToIntMap& value) override {
42+
m_numbers = value;
43+
}
44+
45+
::test::DartInternalClassWithInternalTypedef::SomeStringArray get_labels() const override {
46+
return m_labels;
47+
}
48+
49+
void set_labels(const ::test::DartInternalClassWithInternalTypedef::SomeStringArray& value) override {
50+
m_labels = value;
51+
}
52+
53+
private:
54+
::test::DartInternalClassWithInternalTypedef::SomeStringToIntMap m_numbers{};
55+
::test::DartInternalClassWithInternalTypedef::SomeStringArray m_labels{};
56+
};
57+
2958
std::shared_ptr<InternalClassWithFunctions>
3059
InternalClassWithFunctions::make() {
3160
return {};

gluecodium/src/test/resources/smoke/typedefs/input/TypeDefs.lime

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,28 @@ struct TypeCollection {
7474

7575
const INVALID_STORAGE_ID: StorageId = 0
7676
}
77+
78+
@Skip(Java, Kotlin, Swift)
79+
@Internal
80+
class DartInternalClassWithInternalTypedef {
81+
@Internal
82+
typealias SomeStringToIntMap = Map<String, Int>
83+
84+
@Internal
85+
typealias SomeStringArray = List<String>
86+
87+
property numbers: SomeStringToIntMap
88+
property labels: SomeStringArray
89+
}
90+
91+
@Skip(Java, Kotlin, Swift)
92+
class SomeDartClassThatUsesInternal {
93+
@Internal
94+
typealias ListOfInternals = List<DartInternalClassWithInternalTypedef>
95+
96+
@Internal
97+
fun add_entity(
98+
// The entity to add.
99+
entity: DartInternalClassWithInternalTypedef
100+
)
101+
}

gluecodium/src/test/resources/smoke/typedefs/output/dart/lib/smoke.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22

33
export 'src/smoke/global_list_type_def.dart' show GlobalListTypeDef;
44
export 'src/smoke/global_map_type_def.dart' show GlobalMapTypeDef;
5+
export 'src/smoke/some_dart_class_that_uses_internal.dart' show SomeDartClassThatUsesInternal;
56
export 'src/smoke/type_collection.dart' show TypeCollection, TypeCollection_Point, TypeCollection_PointTypeDef, TypeCollection_StorageId, TypeCollection_StructHavingAliasFieldDefinedBelow;
67
export 'src/smoke/type_defs.dart' show TypeDefs, TypeDefs$Impl, TypeDefs_ComplexTypeDef, TypeDefs_NestedIntTypeDef, TypeDefs_NestedStructTypeDef, TypeDefs_PrimitiveTypeDef, TypeDefs_StructArray, TypeDefs_StructHavingAliasFieldDefinedBelow, TypeDefs_TestStruct, TypeDefs_TestStructTypeDef;
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
2+
3+
import 'dart:ffi';
4+
import 'package:library/src/_library_context.dart' as __lib;
5+
import 'package:library/src/_native_base.dart' as __lib;
6+
import 'package:library/src/_token_cache.dart' as __lib;
7+
import 'package:library/src/generic_types__conversion.dart';
8+
9+
/// @nodoc
10+
abstract class DartInternalClassWithInternalTypedef implements Finalizable {
11+
12+
DartInternalClassWithInternalTypedef_SomeStringToIntMap get numbers;
13+
set numbers(DartInternalClassWithInternalTypedef_SomeStringToIntMap value);
14+
15+
DartInternalClassWithInternalTypedef_SomeStringArray get labels;
16+
set labels(DartInternalClassWithInternalTypedef_SomeStringArray value);
17+
18+
}
19+
20+
/// @nodoc
21+
typedef _DartInternalClassWithInternalTypedef_SomeStringToIntMap = Map<String, int>;
22+
/// @nodoc
23+
typedef _DartInternalClassWithInternalTypedef_SomeStringArray = List<String>;
24+
25+
// DartInternalClassWithInternalTypedef "private" section, not exported.
26+
27+
final _smokeDartinternalclasswithinternaltypedefRegisterFinalizer = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<
28+
Void Function(Pointer<Void>, Int32, Handle),
29+
void Function(Pointer<Void>, int, Object)
30+
>('library_smoke_DartInternalClassWithInternalTypedef_register_finalizer'));
31+
final _smokeDartinternalclasswithinternaltypedefCopyHandle = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<
32+
Pointer<Void> Function(Pointer<Void>),
33+
Pointer<Void> Function(Pointer<Void>)
34+
>('library_smoke_DartInternalClassWithInternalTypedef_copy_handle'));
35+
final _smokeDartinternalclasswithinternaltypedefReleaseHandle = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<
36+
Void Function(Pointer<Void>),
37+
void Function(Pointer<Void>)
38+
>('library_smoke_DartInternalClassWithInternalTypedef_release_handle'));
39+
40+
41+
42+
class DartInternalClassWithInternalTypedef$Impl extends __lib.NativeBase implements DartInternalClassWithInternalTypedef {
43+
44+
DartInternalClassWithInternalTypedef$Impl(Pointer<Void> handle) : super(handle);
45+
46+
@override
47+
DartInternalClassWithInternalTypedef_SomeStringToIntMap get numbers {
48+
final _getFfi = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<Pointer<Void> Function(Pointer<Void>, Int32), Pointer<Void> Function(Pointer<Void>, int)>('library_smoke_DartInternalClassWithInternalTypedef_numbers_get'));
49+
final _handle = this.handle;
50+
final __resultHandle = _getFfi(_handle, __lib.LibraryContext.isolateId);
51+
try {
52+
return foobarMapofStringToIntFromFfi(__resultHandle);
53+
} finally {
54+
foobarMapofStringToIntReleaseFfiHandle(__resultHandle);
55+
56+
}
57+
58+
}
59+
60+
@override
61+
set numbers(DartInternalClassWithInternalTypedef_SomeStringToIntMap value) {
62+
final _setFfi = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<Void Function(Pointer<Void>, Int32, Pointer<Void>), void Function(Pointer<Void>, int, Pointer<Void>)>('library_smoke_DartInternalClassWithInternalTypedef_numbers_set__MapOf_String_to_Int'));
63+
final _valueHandle = foobarMapofStringToIntToFfi(value);
64+
final _handle = this.handle;
65+
_setFfi(_handle, __lib.LibraryContext.isolateId, _valueHandle);
66+
foobarMapofStringToIntReleaseFfiHandle(_valueHandle);
67+
68+
}
69+
70+
71+
@override
72+
DartInternalClassWithInternalTypedef_SomeStringArray get labels {
73+
final _getFfi = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<Pointer<Void> Function(Pointer<Void>, Int32), Pointer<Void> Function(Pointer<Void>, int)>('library_smoke_DartInternalClassWithInternalTypedef_labels_get'));
74+
final _handle = this.handle;
75+
final __resultHandle = _getFfi(_handle, __lib.LibraryContext.isolateId);
76+
try {
77+
return foobarListofStringFromFfi(__resultHandle);
78+
} finally {
79+
foobarListofStringReleaseFfiHandle(__resultHandle);
80+
81+
}
82+
83+
}
84+
85+
@override
86+
set labels(DartInternalClassWithInternalTypedef_SomeStringArray value) {
87+
final _setFfi = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<Void Function(Pointer<Void>, Int32, Pointer<Void>), void Function(Pointer<Void>, int, Pointer<Void>)>('library_smoke_DartInternalClassWithInternalTypedef_labels_set__ListOf_String'));
88+
final _valueHandle = foobarListofStringToFfi(value);
89+
final _handle = this.handle;
90+
_setFfi(_handle, __lib.LibraryContext.isolateId, _valueHandle);
91+
foobarListofStringReleaseFfiHandle(_valueHandle);
92+
93+
}
94+
95+
96+
97+
}
98+
99+
Pointer<Void> smokeDartinternalclasswithinternaltypedefToFfi(DartInternalClassWithInternalTypedef value) =>
100+
_smokeDartinternalclasswithinternaltypedefCopyHandle((value as __lib.NativeBase).handle);
101+
102+
DartInternalClassWithInternalTypedef smokeDartinternalclasswithinternaltypedefFromFfi(Pointer<Void> handle) {
103+
if (handle.address == 0) throw StateError("Expected non-null value.");
104+
final instance = __lib.getCachedInstance(handle);
105+
if (instance != null && instance is DartInternalClassWithInternalTypedef) return instance;
106+
107+
final _copiedHandle = _smokeDartinternalclasswithinternaltypedefCopyHandle(handle);
108+
final result = DartInternalClassWithInternalTypedef$Impl(_copiedHandle);
109+
__lib.cacheInstance(_copiedHandle, result);
110+
_smokeDartinternalclasswithinternaltypedefRegisterFinalizer(_copiedHandle, __lib.LibraryContext.isolateId, result);
111+
return result;
112+
}
113+
114+
void smokeDartinternalclasswithinternaltypedefReleaseFfiHandle(Pointer<Void> handle) =>
115+
_smokeDartinternalclasswithinternaltypedefReleaseHandle(handle);
116+
117+
Pointer<Void> smokeDartinternalclasswithinternaltypedefToFfiNullable(DartInternalClassWithInternalTypedef? value) =>
118+
value != null ? smokeDartinternalclasswithinternaltypedefToFfi(value) : Pointer<Void>.fromAddress(0);
119+
120+
DartInternalClassWithInternalTypedef? smokeDartinternalclasswithinternaltypedefFromFfiNullable(Pointer<Void> handle) =>
121+
handle.address != 0 ? smokeDartinternalclasswithinternaltypedefFromFfi(handle) : null;
122+
123+
void smokeDartinternalclasswithinternaltypedefReleaseFfiHandleNullable(Pointer<Void> handle) =>
124+
_smokeDartinternalclasswithinternaltypedefReleaseHandle(handle);
125+
126+
// End of DartInternalClassWithInternalTypedef "private" section.
127+
128+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
2+
3+
import 'dart:ffi';
4+
import 'package:library/src/_library_context.dart' as __lib;
5+
import 'package:library/src/_native_base.dart' as __lib;
6+
import 'package:library/src/_token_cache.dart' as __lib;
7+
import 'package:library/src/generic_types__conversion.dart';
8+
import 'package:library/src/smoke/dart_internal_class_with_internal_typedef.dart';
9+
10+
abstract class SomeDartClassThatUsesInternal implements Finalizable {
11+
12+
}
13+
14+
/// @nodoc
15+
typedef _SomeDartClassThatUsesInternal_ListOfInternals = List<DartInternalClassWithInternalTypedef>;
16+
17+
// SomeDartClassThatUsesInternal "private" section, not exported.
18+
19+
final _smokeSomedartclassthatusesinternalRegisterFinalizer = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<
20+
Void Function(Pointer<Void>, Int32, Handle),
21+
void Function(Pointer<Void>, int, Object)
22+
>('library_smoke_SomeDartClassThatUsesInternal_register_finalizer'));
23+
final _smokeSomedartclassthatusesinternalCopyHandle = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<
24+
Pointer<Void> Function(Pointer<Void>),
25+
Pointer<Void> Function(Pointer<Void>)
26+
>('library_smoke_SomeDartClassThatUsesInternal_copy_handle'));
27+
final _smokeSomedartclassthatusesinternalReleaseHandle = __lib.catchArgumentError(() => __lib.nativeLibrary.lookupFunction<
28+
Void Function(Pointer<Void>),
29+
void Function(Pointer<Void>)
30+
>('library_smoke_SomeDartClassThatUsesInternal_release_handle'));
31+
32+
33+
34+
class SomeDartClassThatUsesInternal$Impl extends __lib.NativeBase implements SomeDartClassThatUsesInternal {
35+
36+
SomeDartClassThatUsesInternal$Impl(Pointer<Void> handle) : super(handle);
37+
38+
39+
}
40+
41+
Pointer<Void> smokeSomedartclassthatusesinternalToFfi(SomeDartClassThatUsesInternal value) =>
42+
_smokeSomedartclassthatusesinternalCopyHandle((value as __lib.NativeBase).handle);
43+
44+
SomeDartClassThatUsesInternal smokeSomedartclassthatusesinternalFromFfi(Pointer<Void> handle) {
45+
if (handle.address == 0) throw StateError("Expected non-null value.");
46+
final instance = __lib.getCachedInstance(handle);
47+
if (instance != null && instance is SomeDartClassThatUsesInternal) return instance;
48+
49+
final _copiedHandle = _smokeSomedartclassthatusesinternalCopyHandle(handle);
50+
final result = SomeDartClassThatUsesInternal$Impl(_copiedHandle);
51+
__lib.cacheInstance(_copiedHandle, result);
52+
_smokeSomedartclassthatusesinternalRegisterFinalizer(_copiedHandle, __lib.LibraryContext.isolateId, result);
53+
return result;
54+
}
55+
56+
void smokeSomedartclassthatusesinternalReleaseFfiHandle(Pointer<Void> handle) =>
57+
_smokeSomedartclassthatusesinternalReleaseHandle(handle);
58+
59+
Pointer<Void> smokeSomedartclassthatusesinternalToFfiNullable(SomeDartClassThatUsesInternal? value) =>
60+
value != null ? smokeSomedartclassthatusesinternalToFfi(value) : Pointer<Void>.fromAddress(0);
61+
62+
SomeDartClassThatUsesInternal? smokeSomedartclassthatusesinternalFromFfiNullable(Pointer<Void> handle) =>
63+
handle.address != 0 ? smokeSomedartclassthatusesinternalFromFfi(handle) : null;
64+
65+
void smokeSomedartclassthatusesinternalReleaseFfiHandleNullable(Pointer<Void> handle) =>
66+
_smokeSomedartclassthatusesinternalReleaseHandle(handle);
67+
68+
// End of SomeDartClassThatUsesInternal "private" section.
69+
70+

0 commit comments

Comments
 (0)