Skip to content

Commit 56b207e

Browse files
committed
Swift: remove IPA classes from cppgen
1 parent f7b5a4d commit 56b207e

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

swift/codegen/generators/cppgen.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,17 @@ def _get_class(self, name: str) -> cpp.Class:
8080
trap_name=trap_name,
8181
)
8282

83+
@functools.lru_cache(maxsize=None)
84+
def _is_ipa(self, name: str) -> bool:
85+
cls = self._classmap[name]
86+
return cls.ipa is not None or (
87+
cls.derived and all(self._is_ipa(d) for d in cls.derived))
88+
8389
def get_classes(self):
8490
ret = {'': []}
8591
for k, cls in self._classmap.items():
86-
ret.setdefault(cls.group, []).append(self._get_class(cls.name))
92+
if not self._is_ipa(k):
93+
ret.setdefault(cls.group, []).append(self._get_class(cls.name))
8794
return ret
8895

8996

swift/codegen/test/test_cppgen.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,5 +180,84 @@ def test_cpp_skip_pragma(generate):
180180
]
181181

182182

183+
def test_ipa_classes_ignored(generate):
184+
assert generate([
185+
schema.Class(
186+
name="X",
187+
ipa=schema.IpaInfo(from_class="A"),
188+
),
189+
schema.Class(
190+
name="Y",
191+
ipa=schema.IpaInfo(on_arguments={"a": "A", "b": "int"}),
192+
),
193+
schema.Class(
194+
name="Z",
195+
),
196+
]) == [
197+
cpp.Class(name="Z", final=True, trap_name="Zs"),
198+
]
199+
200+
201+
def test_ipa_hierarchy_ignored(generate):
202+
assert generate([
203+
schema.Class(
204+
name="Root",
205+
derived={"Base", "Z"},
206+
),
207+
schema.Class(
208+
name="Base",
209+
bases=["Root"],
210+
derived={"X", "Y"}
211+
),
212+
schema.Class(
213+
name="X",
214+
bases=["Base"],
215+
ipa=schema.IpaInfo(from_class="A"),
216+
),
217+
schema.Class(
218+
name="Y",
219+
bases=["Base"],
220+
ipa=schema.IpaInfo(on_arguments={"a": "A", "b": "int"}),
221+
),
222+
schema.Class(
223+
name="Z",
224+
ipa=schema.IpaInfo(from_class="A"),
225+
),
226+
]) == []
227+
228+
229+
def test_ipa_hierarchy_not_ignored_with_non_ipa_descendant(generate):
230+
root = cpp.Class(name="Root")
231+
base = cpp.Class(name="Base", bases=[root])
232+
assert generate([
233+
schema.Class(
234+
name="Root",
235+
derived={"Base", "Z"},
236+
),
237+
schema.Class(
238+
name="Base",
239+
bases=["Root"],
240+
derived={"X", "Y"}
241+
),
242+
schema.Class(
243+
name="X",
244+
bases=["Base"],
245+
),
246+
schema.Class(
247+
name="Y",
248+
bases=["Base"],
249+
ipa=schema.IpaInfo(on_arguments={"a": "A", "b": "int"}),
250+
),
251+
schema.Class(
252+
name="Z",
253+
ipa=schema.IpaInfo(from_class="A"),
254+
),
255+
]) == [
256+
root,
257+
base,
258+
cpp.Class(name="X", bases=[base], final=True, trap_name="Xes"),
259+
]
260+
261+
183262
if __name__ == '__main__':
184263
sys.exit(pytest.main([__file__] + sys.argv[1:]))

0 commit comments

Comments
 (0)