Generate extension API shims
This commit is contained in:
@@ -170,6 +170,21 @@ SUPPORT_TYPES = {
|
||||
MEMBER_RETURN_OVERRIDES = {
|
||||
"M:LibreMetaverse.Caps.Capabilities": "Vec<String>",
|
||||
}
|
||||
BOXED_FIELD_IDS = {
|
||||
"F:LibreMetaverse.Caps.Simulator",
|
||||
"F:LibreMetaverse.Simulator.Caps",
|
||||
"F:LibreMetaverse.LslTools.CommentList.tail",
|
||||
"F:LibreMetaverse.LslTools.CSymbol.m_parser",
|
||||
"F:LibreMetaverse.LslTools.CSymbol.m_prod",
|
||||
"F:LibreMetaverse.LslTools.CSymbol.m_refSymbol",
|
||||
"F:LibreMetaverse.LslTools.Dfa.Action.a_next",
|
||||
"F:LibreMetaverse.LslTools.LineList.tail",
|
||||
"F:LibreMetaverse.LslTools.ParseState.m_sgen",
|
||||
"F:LibreMetaverse.LslTools.Precedence.m_next",
|
||||
"F:LibreMetaverse.LslTools.Regex.m_sub",
|
||||
"F:LibreMetaverse.LslTools.SymbolSet.m_next",
|
||||
"F:LibreMetaverse.LslTools.SymbolSet.m_symbols",
|
||||
}
|
||||
RUST_KEYWORDS = {
|
||||
"as", "break", "const", "continue", "crate", "else", "enum", "extern", "false", "fn",
|
||||
"for", "if", "impl", "in", "let", "loop", "match", "mod", "move", "mut", "pub", "ref",
|
||||
@@ -592,6 +607,12 @@ def member_signature(mapper: Mapper, owner: dict, item: dict, rust_name: str) ->
|
||||
error_model = "infallible_placeholder"
|
||||
if kind in {"field", "constant", "enum_value"}:
|
||||
value_type = mapper.type(item["type"], item.get("nullability"), generics)
|
||||
if item["doc_id"] in BOXED_FIELD_IDS:
|
||||
value_type = (
|
||||
f"Option<Box<{value_type[7:-1]}>>"
|
||||
if value_type.startswith("Option<")
|
||||
else f"Box<{value_type}>"
|
||||
)
|
||||
if kind == "enum_value":
|
||||
signature = f"{rust_name}: {value_type}"
|
||||
elif kind == "constant":
|
||||
@@ -757,7 +778,20 @@ def validate(catalog: dict, type_rows: list[dict[str, str]], member_rows: list[d
|
||||
raise ValueError("invalid type mapping status")
|
||||
if {row["status"] for row in member_rows} - VALID_MEMBER_STATUSES:
|
||||
raise ValueError("invalid member mapping status")
|
||||
catalog_ids = {member["doc_id"] for assembly in catalog["assemblies"] for item in assembly["types"] for member in item["members"]}
|
||||
catalog_members = {
|
||||
member["doc_id"]: member
|
||||
for assembly in catalog["assemblies"]
|
||||
for item in assembly["types"]
|
||||
for member in item["members"]
|
||||
}
|
||||
catalog_ids = catalog_members.keys()
|
||||
missing_boxed_fields = BOXED_FIELD_IDS - catalog_ids
|
||||
if missing_boxed_fields:
|
||||
raise ValueError(f"unknown configured boxed fields: {sorted(missing_boxed_fields)}")
|
||||
if invalid_boxed_fields := [
|
||||
member_id for member_id in BOXED_FIELD_IDS if catalog_members[member_id]["kind"] != "field"
|
||||
]:
|
||||
raise ValueError(f"configured boxed members are not fields: {sorted(invalid_boxed_fields)}")
|
||||
mapped_ids = {row["csharp_id"] for row in member_rows}
|
||||
if catalog_ids != mapped_ids:
|
||||
raise ValueError(f"catalog/mapping ID mismatch: missing={len(catalog_ids - mapped_ids)}, stale={len(mapped_ids - catalog_ids)}")
|
||||
|
||||
Reference in New Issue
Block a user