Skip to content

Commit cc86524

Browse files
committed
WIP: cxx-qt-gen: make CxxQtType private inheritance
1 parent cf0e7d1 commit cc86524

File tree

12 files changed

+140
-26
lines changed

12 files changed

+140
-26
lines changed

crates/cxx-qt-gen/src/generator/cpp/cxxqttype.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub fn generate(qobject_idents: &QObjectNames) -> Result<GeneratedCppQObjectBloc
1717

1818
result
1919
.base_classes
20-
.push(format!("::rust::cxxqt1::CxxQtType<{rust_struct}>"));
20+
.push(format!("private ::rust::cxxqt1::CxxQtType<{rust_struct}>"));
2121

2222
Ok(result)
2323
}
@@ -42,7 +42,7 @@ mod tests {
4242
assert_eq!(generated.base_classes.len(), 1);
4343
assert_eq!(
4444
generated.base_classes[0],
45-
"::rust::cxxqt1::CxxQtType<MyObjectRust>"
45+
"private ::rust::cxxqt1::CxxQtType<MyObjectRust>"
4646
);
4747
}
4848
}

crates/cxx-qt-gen/src/generator/cpp/qobject.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,10 @@ impl GeneratedCppQObject {
126126
// CODECOV_EXCLUDE_STOP
127127
};
128128

129-
generated.blocks.base_classes.push(base_class.clone());
129+
generated
130+
.blocks
131+
.base_classes
132+
.push(format!("public {base_class}"));
130133

131134
// Add the CxxQtType rust and rust_mut methods
132135
generated
@@ -227,10 +230,10 @@ mod tests {
227230
assert_eq!(cpp.namespace_internals, "cxx_qt_MyObject");
228231

229232
assert_eq!(cpp.blocks.base_classes.len(), 2);
230-
assert_eq!(cpp.blocks.base_classes[0], "QObject");
233+
assert_eq!(cpp.blocks.base_classes[0], "public QObject");
231234
assert_eq!(
232235
cpp.blocks.base_classes[1],
233-
"::rust::cxxqt1::CxxQtType<MyObjectRust>"
236+
"private ::rust::cxxqt1::CxxQtType<MyObjectRust>"
234237
);
235238
assert_eq!(cpp.blocks.metaobjects.len(), 0);
236239
}
@@ -266,10 +269,10 @@ mod tests {
266269
.unwrap();
267270
assert_eq!(cpp.namespace_internals, "cxx_qt::cxx_qt_MyObject");
268271
assert_eq!(cpp.blocks.base_classes.len(), 2);
269-
assert_eq!(cpp.blocks.base_classes[0], "QStringListModel");
272+
assert_eq!(cpp.blocks.base_classes[0], "public QStringListModel");
270273
assert_eq!(
271274
cpp.blocks.base_classes[1],
272-
"::rust::cxxqt1::CxxQtType<MyObjectRust>"
275+
"private ::rust::cxxqt1::CxxQtType<MyObjectRust>"
273276
);
274277
assert_eq!(cpp.blocks.metaobjects.len(), 0);
275278
}

crates/cxx-qt-gen/src/generator/cpp/threading.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ pub fn generate(qobject_idents: &QObjectNames) -> Result<(String, GeneratedCppQO
3232
.includes
3333
.insert("#include <cxx-qt/threading.h>".to_owned());
3434

35-
result
36-
.base_classes
37-
.push(format!("::rust::cxxqt1::CxxQtThreading<{cpp_class}>"));
35+
// TODO: this should probably be private too?
36+
result.base_classes.push(format!(
37+
"public ::rust::cxxqt1::CxxQtThreading<{cpp_class}>"
38+
));
3839

3940
let class_initializer = format!("::rust::cxxqt1::CxxQtThreading<{cpp_class}>(this)");
4041

@@ -90,7 +91,7 @@ mod tests {
9091
assert_eq!(generated.base_classes.len(), 1);
9192
assert_eq!(
9293
generated.base_classes[0],
93-
"::rust::cxxqt1::CxxQtThreading<MyObject>"
94+
"public ::rust::cxxqt1::CxxQtThreading<MyObject>"
9495
);
9596
}
9697
}

crates/cxx-qt-gen/src/writer/cpp/header.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,18 @@ fn qobjects_header(generated: &GeneratedCppBlocks) -> Vec<String> {
9191
9292
{public_methods}
9393
{private_methods}
94+
95+
private:
96+
template<typename Inner, typename Outer>
97+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
98+
99+
template<typename Inner, typename Outer>
100+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
94101
}};
95102
96103
{qobject_assert}"#,
97104
// Note that there is always a base class as we always have CxxQtType
98-
base_classes = qobject.blocks.base_classes.iter().map(|base| format!("public {base}")).collect::<Vec<String>>().join(", "),
105+
base_classes = qobject.blocks.base_classes.join(", "),
99106
metaobjects = qobject.blocks.metaobjects.join("\n "),
100107
public_methods = create_block("public", &qobject.blocks.methods.iter().filter_map(pair_as_header).collect::<Vec<String>>()),
101108
private_methods = create_block("private", &qobject.blocks.private_methods.iter().filter_map(pair_as_header).collect::<Vec<String>>()),
@@ -276,7 +283,7 @@ class MyObject;
276283
277284
278285
279-
class MyObject : public MyBase, public ::rust::cxxqt1::CxxQtType<MyObjectRust>
286+
class MyObject : public MyBase, private ::rust::cxxqt1::CxxQtType<MyObjectRust>
280287
{
281288
282289
public:
@@ -287,7 +294,12 @@ public:
287294
public:
288295
explicit MyObject();
289296
297+
private:
298+
template<typename Inner, typename Outer>
299+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
290300
301+
template<typename Inner, typename Outer>
302+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
291303
};
292304
293305

crates/cxx-qt-gen/src/writer/cpp/mod.rs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ mod tests {
111111
},
112112
has_qobject_macro: true,
113113
blocks: GeneratedCppQObjectBlocks {
114-
base_classes: vec!["QStringListModel".to_owned()],
114+
base_classes: vec!["public QStringListModel".to_owned()],
115115
includes: {
116116
let mut includes = BTreeSet::<String>::default();
117117
includes.insert("#include <test>".to_owned());
@@ -233,7 +233,7 @@ mod tests {
233233
namespace_internals: "cxx_qt::cxx_qt_first_object".to_owned(),
234234
has_qobject_macro: true,
235235
blocks: GeneratedCppQObjectBlocks {
236-
base_classes: vec!["QStringListModel".to_owned()],
236+
base_classes: vec!["public QStringListModel".to_owned()],
237237
includes: {
238238
let mut includes = BTreeSet::<String>::default();
239239
includes.insert("#include <test>".to_owned());
@@ -276,7 +276,7 @@ mod tests {
276276
namespace_internals: "cxx_qt::cxx_qt_second_object".to_owned(),
277277
has_qobject_macro: true,
278278
blocks: GeneratedCppQObjectBlocks {
279-
base_classes: vec!["QStringListModel".to_owned()],
279+
base_classes: vec!["public QStringListModel".to_owned()],
280280
includes: {
281281
let mut includes = BTreeSet::<String>::default();
282282
includes.insert("#include <test>".to_owned());
@@ -374,6 +374,13 @@ mod tests {
374374
void privateMethod() const;
375375
void privateMethod();
376376
377+
378+
private:
379+
template<typename Inner, typename Outer>
380+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
381+
382+
template<typename Inner, typename Outer>
383+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
377384
};
378385
379386
static_assert(::std::is_base_of<QObject, MyObject>::value, "MyObject must inherit from QObject");
@@ -428,6 +435,13 @@ mod tests {
428435
Q_SIGNAL void countChanged();
429436
430437
438+
439+
private:
440+
template<typename Inner, typename Outer>
441+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
442+
443+
template<typename Inner, typename Outer>
444+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
431445
};
432446
433447
static_assert(::std::is_base_of<QObject, FirstObject>::value, "FirstObject must inherit from QObject");
@@ -455,6 +469,13 @@ mod tests {
455469
private:
456470
void privateMethod() const;
457471
472+
473+
private:
474+
template<typename Inner, typename Outer>
475+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
476+
477+
template<typename Inner, typename Outer>
478+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
458479
};
459480
460481
static_assert(::std::is_base_of<QObject, SecondObject>::value, "SecondObject must inherit from QObject");
@@ -506,6 +527,13 @@ mod tests {
506527
void privateMethod() const;
507528
void privateMethod();
508529
530+
531+
private:
532+
template<typename Inner, typename Outer>
533+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
534+
535+
template<typename Inner, typename Outer>
536+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
509537
};
510538
511539
static_assert(::std::is_base_of<QObject, MyObject>::value, "MyObject must inherit from QObject");

crates/cxx-qt-gen/test_outputs/cfgs.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ QObjectEnabled_signal_enabledConnect(
5555

5656
class QObjectEnabled
5757
: public QObject
58-
, public ::rust::cxxqt1::CxxQtType<QObjectEnabledRust>
58+
, private ::rust::cxxqt1::CxxQtType<QObjectEnabledRust>
5959
{
6060
Q_OBJECT
6161
public:
@@ -76,6 +76,13 @@ class QObjectEnabled
7676
return QObject::inherit_enabled(args...);
7777
}
7878
explicit QObjectEnabled(QObject* parent = nullptr);
79+
80+
private:
81+
template<typename Inner, typename Outer>
82+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
83+
84+
template<typename Inner, typename Outer>
85+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
7986
};
8087

8188
static_assert(::std::is_base_of<QObject, QObjectEnabled>::value,

crates/cxx-qt-gen/test_outputs/inheritance.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class MyObject;
99

1010
class MyObject
1111
: public QAbstractItemModel
12-
, public ::rust::cxxqt1::CxxQtType<MyObjectRust>
12+
, private ::rust::cxxqt1::CxxQtType<MyObjectRust>
1313
{
1414
Q_OBJECT
1515
public:
@@ -36,6 +36,13 @@ class MyObject
3636
return QAbstractItemModel::fetch_more(args...);
3737
}
3838
explicit MyObject(QObject* parent = nullptr);
39+
40+
private:
41+
template<typename Inner, typename Outer>
42+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
43+
44+
template<typename Inner, typename Outer>
45+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
3946
};
4047

4148
static_assert(::std::is_base_of<QObject, MyObject>::value,

crates/cxx-qt-gen/test_outputs/invokables.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ using MyObjectCxxQtThread = ::rust::cxxqt1::CxxQtThread<MyObject>;
1515
namespace cxx_qt::my_object {
1616
class MyObject
1717
: public QObject
18-
, public ::rust::cxxqt1::CxxQtType<MyObjectRust>
18+
, private ::rust::cxxqt1::CxxQtType<MyObjectRust>
1919
, public ::rust::cxxqt1::CxxQtThreading<MyObject>
2020
{
2121
Q_OBJECT
@@ -46,6 +46,13 @@ class MyObject
4646
::cxx_qt::my_object::cxx_qt_MyObject::CxxQtConstructorArguments0&& args);
4747
explicit MyObject(
4848
::cxx_qt::my_object::cxx_qt_MyObject::CxxQtConstructorArguments1&& args);
49+
50+
private:
51+
template<typename Inner, typename Outer>
52+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
53+
54+
template<typename Inner, typename Outer>
55+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
4956
};
5057

5158
static_assert(::std::is_base_of<QObject, MyObject>::value,

crates/cxx-qt-gen/test_outputs/passthrough_and_naming.h

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ MyObject_readyConnect(
107107
namespace cxx_qt::multi_object {
108108
class MyObject
109109
: public QStringListModel
110-
, public ::rust::cxxqt1::CxxQtType<MyObjectRust>
110+
, private ::rust::cxxqt1::CxxQtType<MyObjectRust>
111111
{
112112
Q_OBJECT
113113
public:
@@ -123,6 +123,13 @@ class MyObject
123123
Q_INVOKABLE void invokable_name() noexcept;
124124
Q_SIGNAL void ready();
125125
explicit MyObject(QObject* parent = nullptr);
126+
127+
private:
128+
template<typename Inner, typename Outer>
129+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
130+
131+
template<typename Inner, typename Outer>
132+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
126133
};
127134

128135
static_assert(::std::is_base_of<QObject, MyObject>::value,
@@ -151,7 +158,7 @@ SecondObject_readyConnect(
151158
namespace second_object {
152159
class SecondObject
153160
: public QObject
154-
, public ::rust::cxxqt1::CxxQtType<SecondObjectRust>
161+
, private ::rust::cxxqt1::CxxQtType<SecondObjectRust>
155162
{
156163
Q_OBJECT
157164
public:
@@ -168,6 +175,13 @@ class SecondObject
168175
void myRenamedFunction(::std::int32_t param) const noexcept;
169176
Q_SIGNAL void ready();
170177
explicit SecondObject(QObject* parent = nullptr);
178+
179+
private:
180+
template<typename Inner, typename Outer>
181+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
182+
183+
template<typename Inner, typename Outer>
184+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
171185
};
172186

173187
static_assert(::std::is_base_of<QObject, SecondObject>::value,
@@ -179,14 +193,21 @@ Q_DECLARE_METATYPE(second_object::SecondObject*)
179193
namespace my_namespace {
180194
class MyCxxName
181195
: public QObject
182-
, public ::rust::cxxqt1::CxxQtType<ThirdObjectRust>
196+
, private ::rust::cxxqt1::CxxQtType<ThirdObjectRust>
183197
{
184198
Q_OBJECT
185199
public:
186200
virtual ~MyCxxName() = default;
187201

188202
public:
189203
explicit MyCxxName(QObject* parent = nullptr);
204+
205+
private:
206+
template<typename Inner, typename Outer>
207+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
208+
209+
template<typename Inner, typename Outer>
210+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
190211
};
191212

192213
static_assert(::std::is_base_of<QObject, MyCxxName>::value,

crates/cxx-qt-gen/test_outputs/properties.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ MyObject_my_on_changedConnect(
117117
namespace cxx_qt::my_object {
118118
class MyObject
119119
: public QObject
120-
, public ::rust::cxxqt1::CxxQtType<MyObjectRust>
120+
, private ::rust::cxxqt1::CxxQtType<MyObjectRust>
121121
{
122122
Q_OBJECT
123123
public:
@@ -182,6 +182,13 @@ class MyObject
182182
void myResetFn() noexcept;
183183
Q_SIGNAL void my_on_changed();
184184
explicit MyObject(QObject* parent = nullptr);
185+
186+
private:
187+
template<typename Inner, typename Outer>
188+
friend Inner& ::rust::cxxqt1::unsafeRustMut(Outer& outer);
189+
190+
template<typename Inner, typename Outer>
191+
friend const Inner& ::rust::cxxqt1::unsafeRust(const Outer& outer);
185192
};
186193

187194
static_assert(::std::is_base_of<QObject, MyObject>::value,

0 commit comments

Comments
 (0)