Skip to content

Commit

Permalink
start automatically boxing types for code generation (#1385)
Browse files Browse the repository at this point in the history
This addresses members that are directly recursive.  It does not handle
nested recursion.

Partial fix for #225
  • Loading branch information
demoray committed Sep 18, 2023
1 parent 5ac39ad commit a97db71
Show file tree
Hide file tree
Showing 96 changed files with 292,204 additions and 31,725 deletions.
6 changes: 3 additions & 3 deletions services/autorust/codegen/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,9 @@ impl TypeNameCode {
if self.force_value {
tp = Type::from(tp_json_value())
}
if self.boxed {
tp = generic_type(tp_box(), tp);
}
if self.optional {
tp = generic_type(tp_option(), tp);
}
Expand All @@ -237,9 +240,6 @@ impl TypeNameCode {
});
}
}
if self.boxed {
tp = generic_type(tp_box(), tp);
}
tp
}
}
Expand Down
44 changes: 34 additions & 10 deletions services/autorust/codegen/src/codegen_models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,13 @@ pub fn create_models(cg: &CodeGen) -> Result<TokenStream> {
file.extend(quote! { pub type #id = #value;});
} else {
let pageable_name = format!("{}", schema_name.to_camel_case_ident()?);
file.extend(create_struct(cg, schema, schema_name, pageable_response_names.get(&pageable_name))?);
file.extend(create_struct(
cg,
schema,
schema_name,
pageable_response_names.get(&pageable_name),
HashSet::new(),
)?);
}
}
Ok(file)
Expand Down Expand Up @@ -625,7 +631,13 @@ fn create_vec_alias(schema: &SchemaGen) -> Result<TokenStream> {
Ok(quote! { pub type #typ = Vec<#items_typ>; })
}

fn create_struct(cg: &CodeGen, schema: &SchemaGen, struct_name: &str, pageable: Option<&MsPageable>) -> Result<TokenStream> {
fn create_struct(
cg: &CodeGen,
schema: &SchemaGen,
struct_name: &str,
pageable: Option<&MsPageable>,
mut needs_boxing: HashSet<String>,
) -> Result<TokenStream> {
let mut code = TokenStream::new();
let mut mod_code = TokenStream::new();
let mut props = TokenStream::new();
Expand All @@ -636,6 +648,7 @@ fn create_struct(cg: &CodeGen, schema: &SchemaGen, struct_name: &str, pageable:
let required = schema.required();

// println!("struct: {} {:?}", struct_name_code, pageable);
needs_boxing.insert(struct_name.to_camel_case_ident()?.to_string());

for schema in schema.all_of() {
let schema_name = schema.name()?;
Expand Down Expand Up @@ -673,12 +686,24 @@ fn create_struct(cg: &CodeGen, schema: &SchemaGen, struct_name: &str, pageable:
let StructFieldCode {
mut type_name,
code: field_code,
} = create_struct_field_code(cg, &ns.clone(), &property.schema, property_name, lowercase_workaround)?;
} = create_struct_field_code(
cg,
&ns.clone(),
&property.schema,
property_name,
lowercase_workaround,
needs_boxing.clone(),
)?;
mod_code.extend(field_code.into_token_stream());
// uncomment the next two lines to help identify entries that need boxed
// let prop_nm_str = format!("{} , {} , {}", prop_nm.file_path, prop_nm.schema_name, property_name);
// props.extend(quote! { #[doc = #prop_nm_str ]});

let mut boxed = false;
if needs_boxing.contains(&type_name.to_string().to_camel_case_ident()?.to_string()) {
boxed = true;
}

if cg.should_force_obj(prop_nm) {
type_name = type_name.force_value(true);
}
Expand Down Expand Up @@ -734,7 +759,9 @@ fn create_struct(cg: &CodeGen, schema: &SchemaGen, struct_name: &str, pageable:
};

// see if a field should be wrapped in a Box
let boxed = cg.should_box_property(prop_nm);
if cg.should_box_property(prop_nm) {
boxed = true;
}
type_name = type_name.boxed(boxed);

let doc_comment = match &property.schema.schema.common.description {
Expand All @@ -759,11 +786,7 @@ fn create_struct(cg: &CodeGen, schema: &SchemaGen, struct_name: &str, pageable:
}
} else {
#[allow(clippy::collapsible_else_if)]
if boxed {
new_fn_body.extend(quote! { #field_name: Box::new(None), });
} else {
new_fn_body.extend(quote! { #field_name: None, });
}
new_fn_body.extend(quote! { #field_name: None, });
}
}

Expand Down Expand Up @@ -938,6 +961,7 @@ fn create_struct_field_code(
property: &SchemaGen,
property_name: &str,
lowercase_workaround: bool,
needs_boxing: HashSet<String>,
) -> Result<StructFieldCode> {
match &property.ref_key {
Some(ref_key) => {
Expand All @@ -953,7 +977,7 @@ fn create_struct_field_code(
} else if property.is_local_struct() {
let id = property_name.to_camel_case_ident()?;
let type_name = TypeNameCode::from(vec![namespace.clone(), id]);
let code = create_struct(cg, property, property_name, None)?;
let code = create_struct(cg, property, property_name, None, needs_boxing)?;
Ok(StructFieldCode {
type_name,
code: Some(TypeCode::Struct(code)),
Expand Down
22 changes: 0 additions & 22 deletions services/mgmt/costmanagement/autorust.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,3 @@ deny = [
"package-preview-2022-10",
"package-preview-2022-10-05",
]

[properties]
boxed = [
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/preview/2019-03-01-preview/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/preview/2019-03-01-preview/costmanagement.json", "ReportConfigFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/preview/2019-03-01-preview/costmanagement.json", "Scope", "childScope"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/preview/2019-04-01-preview/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/preview/2019-04-01-preview/costmanagement.json", "ReportConfigFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/preview/2019-04-01-preview/costmanagement.json", "Scope", "childScope"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2018-05-31/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2018-05-31/costmanagement.json", "ReportConfigFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2019-01-01/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2019-01-01/costmanagement.json", "ReportConfigFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2019-09-01/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2019-09-01/costmanagement.json", "ReportConfigFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2019-10-01/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2019-10-01/costmanagement.json", "ReportConfigFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2020-06-01/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2020-06-01/costmanagement.json", "ReportConfigFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2021-10-01/costmanagement.json", "QueryFilter", "not"],
["../../../azure-rest-api-specs/specification/cost-management/resource-manager/Microsoft.CostManagement/stable/2021-10-01/costmanagement.json", "ReportConfigFilter", "not"],
]
24 changes: 0 additions & 24 deletions services/mgmt/databox/autorust.toml

This file was deleted.

4 changes: 2 additions & 2 deletions services/mgmt/databox/src/package_2022_02/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions services/mgmt/databox/src/package_2022_09/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions services/mgmt/databox/src/package_2022_10/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions services/mgmt/databox/src/package_2022_12/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions services/mgmt/databox/src/package_2023_03/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 0 additions & 12 deletions services/mgmt/dataprotection/autorust.toml
Original file line number Diff line number Diff line change
@@ -1,15 +1,3 @@
[tags]
# There are a lot of previews and each currently requires a new box entry.
deny_contains_preview = true

[properties]
boxed = [
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2021-01-01/dataprotection.json", "InnerError", "embeddedInnerError"],
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2021-07-01/dataprotection.json", "InnerError", "embeddedInnerError"],
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2022-01-01/dataprotection.json", "InnerError", "embeddedInnerError"],
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2022-03-01/dataprotection.json", "InnerError", "embeddedInnerError"],
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2022-04-01/dataprotection.json", "InnerError", "embeddedInnerError"],
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2022-05-01/dataprotection.json", "InnerError", "embeddedInnerError"],
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2023-01-01/dataprotection.json", "InnerError", "embeddedInnerError"],
["../../../azure-rest-api-specs/specification/dataprotection/resource-manager/Microsoft.DataProtection/stable/2023-05-01/dataprotection.json", "InnerError", "embeddedInnerError"],
]
2 changes: 1 addition & 1 deletion services/mgmt/dataprotection/src/package_2022_04/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion services/mgmt/dataprotection/src/package_2022_05/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion services/mgmt/dataprotection/src/package_2022_12/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion services/mgmt/dataprotection/src/package_2023_01/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion services/mgmt/dataprotection/src/package_2023_05/models.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions services/mgmt/hardwaresecuritymodules/autorust.toml

This file was deleted.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a97db71

Please sign in to comment.