From 228d754313dc89312a757d7a5c202e52daf9c616 Mon Sep 17 00:00:00 2001 From: Todd Nowacki Date: Thu, 2 May 2024 20:04:14 -0700 Subject: [PATCH] [move] Consolidate source/dep logic (#17460) ## Description - We have layered on some notions of dependencies/source targets because of the package system. - I have created an enum with 3 variants, but I kind of hate the name. So open to suggestions here ## Test plan - Internal change --- ## Release notes Check each box that your changes affect. If none of the boxes relate to your changes, release notes aren't required. For each box you select, include information after the relevant heading that describes the impact of your changes that a user might notice and any actions they must take to implement updates. - [ ] Protocol: - [ ] Nodes (Validators and Full nodes): - [ ] Indexer: - [ ] JSON-RPC: - [ ] GraphQL: - [ ] CLI: - [ ] Rust SDK: --- .../crates/move-compiler/src/cfgir/ast.rs | 20 ++++++++------ .../move-compiler/src/cfgir/translate.rs | 4 +-- .../crates/move-compiler/src/expansion/ast.rs | 27 ++++++++++++++----- .../move-compiler/src/expansion/translate.rs | 10 +++++-- .../move/crates/move-compiler/src/hlir/ast.rs | 19 ++++++++----- .../move-compiler/src/hlir/translate.rs | 17 +++++++----- .../crates/move-compiler/src/naming/ast.rs | 22 ++++++++------- .../move-compiler/src/naming/translate.rs | 4 +-- .../move-compiler/src/shared/program_info.rs | 4 ++- .../move-compiler/src/sui_mode/id_leak.rs | 9 +++++-- .../move-compiler/src/sui_mode/typing.rs | 9 +++++-- .../src/to_bytecode/translate.rs | 8 +++--- .../crates/move-compiler/src/typing/ast.rs | 20 ++++++++------ .../move-compiler/src/typing/translate.rs | 13 ++++++--- .../move/crates/move-model/src/lib.rs | 14 ++++++---- 15 files changed, 133 insertions(+), 67 deletions(-) diff --git a/external-crates/move/crates/move-compiler/src/cfgir/ast.rs b/external-crates/move/crates/move-compiler/src/cfgir/ast.rs index a52fac3e97e91..52150be359568 100644 --- a/external-crates/move/crates/move-compiler/src/cfgir/ast.rs +++ b/external-crates/move/crates/move-compiler/src/cfgir/ast.rs @@ -4,7 +4,7 @@ use crate::{ diagnostics::WarningFilters, - expansion::ast::{Attributes, Friend, ModuleIdent, Mutability}, + expansion::ast::{Attributes, Friend, ModuleIdent, Mutability, TargetKind}, hlir::ast::{ BaseType, Command, Command_, EnumDefinition, FunctionSignature, Label, SingleType, StructDefinition, Var, Visibility, @@ -38,7 +38,7 @@ pub struct ModuleDefinition { // package name metadata from compiler arguments, not used for any language rules pub package_name: Option, pub attributes: Attributes, - pub is_source_module: bool, + pub target_kind: TargetKind, /// `dependency_order` is the topological order/rank in the dependency graph. pub dependency_order: usize, pub friends: UniqueMap, @@ -203,7 +203,7 @@ impl AstDebug for ModuleDefinition { warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order, friends, structs, @@ -216,11 +216,15 @@ impl AstDebug for ModuleDefinition { w.writeln(&format!("{}", n)) } attributes.ast_debug(w); - if *is_source_module { - w.writeln("library module") - } else { - w.writeln("source module") - } + w.writeln(match target_kind { + TargetKind::Source { + is_root_package: true, + } => "root module", + TargetKind::Source { + is_root_package: false, + } => "dependency module", + TargetKind::External => "external module", + }); w.writeln(&format!("dependency order #{}", dependency_order)); for (mident, _loc) in friends.key_cloned_iter() { w.write(&format!("friend {};", mident)); diff --git a/external-crates/move/crates/move-compiler/src/cfgir/translate.rs b/external-crates/move/crates/move-compiler/src/cfgir/translate.rs index b6b40986e2077..8192fd4efcfa2 100644 --- a/external-crates/move/crates/move-compiler/src/cfgir/translate.rs +++ b/external-crates/move/crates/move-compiler/src/cfgir/translate.rs @@ -180,7 +180,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order, friends, structs, @@ -200,7 +200,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order, friends, structs, diff --git a/external-crates/move/crates/move-compiler/src/expansion/ast.rs b/external-crates/move/crates/move-compiler/src/expansion/ast.rs index 5c6c21c6f0aaf..8d973bf75a754 100644 --- a/external-crates/move/crates/move-compiler/src/expansion/ast.rs +++ b/external-crates/move/crates/move-compiler/src/expansion/ast.rs @@ -99,6 +99,17 @@ pub type Attributes = UniqueMap, Attribute>; // Modules //************************************************************************************************** +#[derive(Debug, Clone, Copy)] +/// Specifies a source target or dependency +pub enum TargetKind { + /// A source module. If is_root_package is false, some warnings might be suppressed. + /// Bytecode/CompiledModules will be generated for any Source target + Source { is_root_package: bool }, + /// A dependency only used for linking. + /// No bytecode or CompiledModules are generated + External, +} + #[derive(Clone, Copy)] pub enum Address { Numerical { @@ -123,7 +134,7 @@ pub struct ModuleDefinition { pub package_name: Option, pub attributes: Attributes, pub loc: Loc, - pub is_source_module: bool, + pub target_kind: TargetKind, pub use_funs: UseFuns, pub friends: UniqueMap, pub structs: UniqueMap, @@ -1106,7 +1117,7 @@ impl AstDebug for ModuleDefinition { package_name, attributes, loc: _loc, - is_source_module, + target_kind, use_funs, friends, structs, @@ -1120,10 +1131,14 @@ impl AstDebug for ModuleDefinition { w.writeln(&format!("{}", n)) } attributes.ast_debug(w); - w.writeln(if *is_source_module { - "source module" - } else { - "library module" + w.writeln(match target_kind { + TargetKind::Source { + is_root_package: true, + } => "root module", + TargetKind::Source { + is_root_package: false, + } => "dependency module", + TargetKind::External => "external module", }); use_funs.ast_debug(w); for (mident, _loc) in friends.key_cloned_iter() { diff --git a/external-crates/move/crates/move-compiler/src/expansion/translate.rs b/external-crates/move/crates/move-compiler/src/expansion/translate.rs index 397b5c1254e23..1b6b4fb3cd707 100644 --- a/external-crates/move/crates/move-compiler/src/expansion/translate.rs +++ b/external-crates/move/crates/move-compiler/src/expansion/translate.rs @@ -11,7 +11,7 @@ use crate::{ AliasEntry, AliasMapBuilder, ParserExplicitUseFun, UnnecessaryAlias, UseFunsBuilder, }, aliases::AliasSet, - ast::{self as E, Address, Fields, ModuleIdent, ModuleIdent_}, + ast::{self as E, Address, Fields, ModuleIdent, ModuleIdent_, TargetKind}, byte_string, hex_string, path_expander::{ access_result, Access, LegacyPathExpander, ModuleAccessResult, Move2024PathExpander, @@ -895,12 +895,18 @@ fn module_( context.pop_alias_scope(Some(&mut use_funs)); + let target_kind = if !context.is_source_definition { + TargetKind::External + } else { + let is_root_package = !context.env().package_config(package_name).is_dependency; + TargetKind::Source { is_root_package } + }; let def = E::ModuleDefinition { package_name, attributes, loc, use_funs, - is_source_module: context.is_source_definition, + target_kind, friends, structs, enums, diff --git a/external-crates/move/crates/move-compiler/src/hlir/ast.rs b/external-crates/move/crates/move-compiler/src/hlir/ast.rs index e063506ff35c8..98fce042bf500 100644 --- a/external-crates/move/crates/move-compiler/src/hlir/ast.rs +++ b/external-crates/move/crates/move-compiler/src/hlir/ast.rs @@ -6,6 +6,7 @@ use crate::{ diagnostics::WarningFilters, expansion::ast::{ ability_modifiers_ast_debug, AbilitySet, Attributes, Friend, ModuleIdent, Mutability, + TargetKind, }, naming::ast::{BuiltinTypeName, BuiltinTypeName_, DatatypeTypeParameter, TParam}, parser::ast::{ @@ -39,7 +40,7 @@ pub struct ModuleDefinition { // package name metadata from compiler arguments, not used for any language rules pub package_name: Option, pub attributes: Attributes, - pub is_source_module: bool, + pub target_kind: TargetKind, /// `dependency_order` is the topological order/rank in the dependency graph. pub dependency_order: usize, pub friends: UniqueMap, @@ -900,7 +901,7 @@ impl AstDebug for ModuleDefinition { warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order, friends, structs, @@ -913,11 +914,15 @@ impl AstDebug for ModuleDefinition { w.writeln(&format!("{}", n)) } attributes.ast_debug(w); - if *is_source_module { - w.writeln("library module") - } else { - w.writeln("source module") - } + w.writeln(match target_kind { + TargetKind::Source { + is_root_package: true, + } => "root module", + TargetKind::Source { + is_root_package: false, + } => "dependency module", + TargetKind::External => "external module", + }); w.writeln(&format!("dependency order #{}", dependency_order)); for (mident, _loc) in friends.key_cloned_iter() { w.write(&format!("friend {};", mident)); diff --git a/external-crates/move/crates/move-compiler/src/hlir/translate.rs b/external-crates/move/crates/move-compiler/src/hlir/translate.rs index 02012627d092d..af23442f7b209 100644 --- a/external-crates/move/crates/move-compiler/src/hlir/translate.rs +++ b/external-crates/move/crates/move-compiler/src/hlir/translate.rs @@ -5,7 +5,7 @@ use crate::{ debug_display, debug_display_verbose, diag, editions::{FeatureGate, Flavor}, - expansion::ast::{self as E, Fields, ModuleIdent, Mutability}, + expansion::ast::{self as E, Fields, ModuleIdent, Mutability, TargetKind}, hlir::{ ast::{self as H, Block, BlockLabel, MoveOpAnnotation, UnpackType}, detect_dead_code::program as detect_dead_code_analysis, @@ -593,7 +593,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order, immediate_neighbors: _, used_addresses: _, @@ -619,7 +619,7 @@ fn module( } }); - gen_unused_warnings(context, is_source_module, &structs); + gen_unused_warnings(context, target_kind, &structs); context.current_package = None; context.env.pop_warning_filter_scope(); @@ -629,7 +629,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order, friends, structs, @@ -3163,10 +3163,15 @@ fn freeze_single(sp!(sloc, s): H::SingleType) -> H::SingleType { fn gen_unused_warnings( context: &mut Context, - is_source_module: bool, + target_kind: TargetKind, structs: &UniqueMap, ) { - if !is_source_module { + if !matches!( + target_kind, + TargetKind::Source { + is_root_package: true + } + ) { // generate warnings only for modules compiled in this pass rather than for all modules // including pre-compiled libraries for which we do not have source code available and // cannot be analyzed in this pass diff --git a/external-crates/move/crates/move-compiler/src/naming/ast.rs b/external-crates/move/crates/move-compiler/src/naming/ast.rs index 4de8b57ba1c39..715b7e2580191 100644 --- a/external-crates/move/crates/move-compiler/src/naming/ast.rs +++ b/external-crates/move/crates/move-compiler/src/naming/ast.rs @@ -6,8 +6,8 @@ use crate::{ diagnostics::WarningFilters, expansion::ast::{ ability_constraints_ast_debug, ability_modifiers_ast_debug, AbilitySet, Attributes, - DottedUsage, Fields, Friend, ImplicitUseFunCandidate, ModuleIdent, Mutability, Value, - Value_, Visibility, + DottedUsage, Fields, Friend, ImplicitUseFunCandidate, ModuleIdent, Mutability, TargetKind, + Value, Value_, Visibility, }, parser::ast::{ self as P, Ability_, BinOp, ConstantName, DatatypeName, Field, FunctionName, UnaryOp, @@ -141,7 +141,7 @@ pub struct ModuleDefinition { // package name metadata from compiler arguments, not used for any language rules pub package_name: Option, pub attributes: Attributes, - pub is_source_module: bool, + pub target_kind: TargetKind, pub use_funs: UseFuns, pub syntax_methods: SyntaxMethods, pub friends: UniqueMap, @@ -1193,7 +1193,7 @@ impl AstDebug for ModuleDefinition { warning_filter, package_name, attributes, - is_source_module, + target_kind, use_funs, syntax_methods, friends, @@ -1207,11 +1207,15 @@ impl AstDebug for ModuleDefinition { w.writeln(&format!("{}", n)) } attributes.ast_debug(w); - if *is_source_module { - w.writeln("library module") - } else { - w.writeln("source module") - } + w.writeln(match target_kind { + TargetKind::Source { + is_root_package: true, + } => "root module", + TargetKind::Source { + is_root_package: false, + } => "dependency module", + TargetKind::External => "external module", + }); use_funs.ast_debug(w); syntax_methods.ast_debug(w); for (mident, _loc) in friends.key_cloned_iter() { diff --git a/external-crates/move/crates/move-compiler/src/naming/translate.rs b/external-crates/move/crates/move-compiler/src/naming/translate.rs index 1eb8d6880ee10..3ddfdb1fe41ed 100644 --- a/external-crates/move/crates/move-compiler/src/naming/translate.rs +++ b/external-crates/move/crates/move-compiler/src/naming/translate.rs @@ -1239,7 +1239,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, use_funs: euse_funs, friends: efriends, structs: estructs, @@ -1310,7 +1310,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, use_funs, syntax_methods, friends, diff --git a/external-crates/move/crates/move-compiler/src/shared/program_info.rs b/external-crates/move/crates/move-compiler/src/shared/program_info.rs index d2f348c1b448a..594da8d4c27cc 100644 --- a/external-crates/move/crates/move-compiler/src/shared/program_info.rs +++ b/external-crates/move/crates/move-compiler/src/shared/program_info.rs @@ -7,7 +7,7 @@ use move_ir_types::location::Loc; use move_symbol_pool::Symbol; use crate::{ - expansion::ast::{AbilitySet, Attributes, ModuleIdent, Visibility}, + expansion::ast::{AbilitySet, Attributes, ModuleIdent, TargetKind, Visibility}, naming::ast::{ self as N, DatatypeTypeParameter, EnumDefinition, FunctionSignature, ResolvedUseFuns, StructDefinition, SyntaxMethods, Type, @@ -38,6 +38,7 @@ pub struct ConstantInfo { #[derive(Debug, Clone)] pub struct ModuleInfo { + pub target_kind: TargetKind, pub attributes: Attributes, pub package: Option, pub use_funs: ResolvedUseFuns, @@ -86,6 +87,7 @@ macro_rules! program_info { .map(|module_use_funs| module_use_funs.remove(&mident).unwrap()) .unwrap_or_default(); let minfo = ModuleInfo { + target_kind: mdef.target_kind, attributes: mdef.attributes.clone(), package: mdef.package_name, use_funs, diff --git a/external-crates/move/crates/move-compiler/src/sui_mode/id_leak.rs b/external-crates/move/crates/move-compiler/src/sui_mode/id_leak.rs index a28b44abc126d..70ab8a75ca3c0 100644 --- a/external-crates/move/crates/move-compiler/src/sui_mode/id_leak.rs +++ b/external-crates/move/crates/move-compiler/src/sui_mode/id_leak.rs @@ -16,7 +16,7 @@ use crate::{ diag, diagnostics::{Diagnostic, Diagnostics}, editions::Flavor, - expansion::ast::AbilitySet, + expansion::ast::{AbilitySet, TargetKind}, hlir::ast::{Exp, Label, ModuleCall, SingleType, Type, Type_, Var}, parser::ast::{Ability_, DatatypeName}, shared::{unique_map::UniqueMap, CompilationEnv, Identifier}, @@ -105,7 +105,12 @@ impl SimpleAbsIntConstructor for IDLeakVerifier { // Skip if not sui return None; } - if config.is_dependency || !mdef.is_source_module { + if !matches!( + mdef.target_kind, + TargetKind::Source { + is_root_package: true + } + ) { // Skip non-source, dependency modules return None; } diff --git a/external-crates/move/crates/move-compiler/src/sui_mode/typing.rs b/external-crates/move/crates/move-compiler/src/sui_mode/typing.rs index 754d7733e100b..1c9b0a707bcaf 100644 --- a/external-crates/move/crates/move-compiler/src/sui_mode/typing.rs +++ b/external-crates/move/crates/move-compiler/src/sui_mode/typing.rs @@ -8,7 +8,7 @@ use crate::{ diag, diagnostics::{Diagnostic, WarningFilters}, editions::Flavor, - expansion::ast::{AbilitySet, Fields, ModuleIdent, Mutability, Visibility}, + expansion::ast::{AbilitySet, Fields, ModuleIdent, Mutability, TargetKind, Visibility}, naming::ast::{ self as N, BuiltinTypeName_, FunctionSignature, StructFields, Type, TypeName_, Type_, Var, }, @@ -114,7 +114,12 @@ impl<'a> TypingVisitorContext for Context<'a> { // Skip if not sui return true; } - if config.is_dependency || !mdef.is_source_module { + if !matches!( + mdef.target_kind, + TargetKind::Source { + is_root_package: true + } + ) { // Skip non-source, dependency modules return true; } diff --git a/external-crates/move/crates/move-compiler/src/to_bytecode/translate.rs b/external-crates/move/crates/move-compiler/src/to_bytecode/translate.rs index 84ec12a8c4a02..808f71f7d80d4 100644 --- a/external-crates/move/crates/move-compiler/src/to_bytecode/translate.rs +++ b/external-crates/move/crates/move-compiler/src/to_bytecode/translate.rs @@ -7,7 +7,9 @@ use crate::{ cfgir::{ast as G, translate::move_value_from_value_}, compiled_unit::*, diag, - expansion::ast::{AbilitySet, Address, Attributes, ModuleIdent, ModuleIdent_, Mutability}, + expansion::ast::{ + AbilitySet, Address, Attributes, ModuleIdent, ModuleIdent_, Mutability, TargetKind, + }, hlir::ast::{self as H, Value_, Var, Visibility}, naming::{ ast::{BuiltinTypeName_, DatatypeTypeParameter, TParam}, @@ -136,7 +138,7 @@ pub fn program( let mut source_modules = gmodules .into_iter() - .filter(|(_, mdef)| mdef.is_source_module) + .filter(|(_, mdef)| matches!(mdef.target_kind, TargetKind::Source { .. })) .collect::>(); source_modules.sort_by_key(|(_, mdef)| mdef.dependency_order); for (m, mdef) in source_modules { @@ -162,7 +164,7 @@ fn module( warning_filter: _warning_filter, package_name, attributes, - is_source_module: _is_source_module, + target_kind: _, dependency_order: _dependency_order, friends: gfriends, structs: gstructs, diff --git a/external-crates/move/crates/move-compiler/src/typing/ast.rs b/external-crates/move/crates/move-compiler/src/typing/ast.rs index 1f9b52c9042c0..77ce5b10f5083 100644 --- a/external-crates/move/crates/move-compiler/src/typing/ast.rs +++ b/external-crates/move/crates/move-compiler/src/typing/ast.rs @@ -6,7 +6,7 @@ use crate::{ debug_display, diagnostics::WarningFilters, expansion::ast::{ - Address, Attributes, Fields, Friend, ModuleIdent, Mutability, Value, Visibility, + Address, Attributes, Fields, Friend, ModuleIdent, Mutability, TargetKind, Value, Visibility, }, ice, naming::ast::{ @@ -54,7 +54,7 @@ pub struct ModuleDefinition { // package name metadata from compiler arguments, not used for any language rules pub package_name: Option, pub attributes: Attributes, - pub is_source_module: bool, + pub target_kind: TargetKind, /// `dependency_order` is the topological order/rank in the dependency graph. /// `dependency_order` is initialized at `0` and set in the uses pass pub dependency_order: usize, @@ -418,7 +418,7 @@ impl AstDebug for ModuleDefinition { warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order, immediate_neighbors, used_addresses, @@ -435,11 +435,15 @@ impl AstDebug for ModuleDefinition { w.writeln(&format!("{}", n)) } attributes.ast_debug(w); - if *is_source_module { - w.writeln("library module") - } else { - w.writeln("source module") - } + w.writeln(match target_kind { + TargetKind::Source { + is_root_package: true, + } => "root module", + TargetKind::Source { + is_root_package: false, + } => "dependency module", + TargetKind::External => "external module", + }); w.writeln(&format!("dependency order #{}", dependency_order)); for (mident, neighbor) in immediate_neighbors.key_cloned_iter() { w.write(&format!("{mident} is")); diff --git a/external-crates/move/crates/move-compiler/src/typing/translate.rs b/external-crates/move/crates/move-compiler/src/typing/translate.rs index 09e68ea63b04d..c8421b7b927d8 100644 --- a/external-crates/move/crates/move-compiler/src/typing/translate.rs +++ b/external-crates/move/crates/move-compiler/src/typing/translate.rs @@ -8,7 +8,7 @@ use crate::{ editions::{FeatureGate, Flavor}, expansion::ast::{ AbilitySet, Attribute, AttributeValue_, Attribute_, DottedUsage, Fields, Friend, - ModuleAccess_, ModuleIdent, ModuleIdent_, Mutability, Value_, Visibility, + ModuleAccess_, ModuleIdent, ModuleIdent_, Mutability, TargetKind, Value_, Visibility, }, ice, naming::ast::{ @@ -190,7 +190,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, syntax_methods, use_funs, friends, @@ -219,7 +219,7 @@ fn module( warning_filter, package_name, attributes, - is_source_module, + target_kind, dependency_order: 0, immediate_neighbors: UniqueMap::new(), used_addresses: BTreeSet::new(), @@ -4334,7 +4334,12 @@ fn process_attributes(context: &mut Context, all_attributes: &UniqueMa /// Generates warnings for unused (private) functions and unused constants. /// Should be called after the whole program has been processed. fn unused_module_members(context: &mut Context, mident: &ModuleIdent_, mdef: &T::ModuleDefinition) { - if !mdef.is_source_module { + if !matches!( + mdef.target_kind, + TargetKind::Source { + is_root_package: true + } + ) { // generate warnings only for modules compiled in this pass rather than for all modules // including pre-compiled libraries for which we do not have source code available and // cannot be analyzed in this pass diff --git a/external-crates/move/crates/move-model/src/lib.rs b/external-crates/move/crates/move-model/src/lib.rs index 24b1e26247cfc..67628d3d0f113 100644 --- a/external-crates/move/crates/move-model/src/lib.rs +++ b/external-crates/move/crates/move-model/src/lib.rs @@ -24,10 +24,10 @@ use move_compiler::{ self, compiled_unit::{self, AnnotatedCompiledUnit}, diagnostics::{Diagnostics, WarningFilters}, - expansion::ast::{self as E, ModuleIdent, ModuleIdent_}, - parser::ast::{self as P}, + expansion::ast::{self as E, ModuleIdent, ModuleIdent_, TargetKind}, + parser::ast as P, shared::{parse_named_address, unique_map::UniqueMap, NumericalAddress, PackagePaths}, - typing::ast::{self as T}, + typing::ast as T, Compiler, Flags, PASS_COMPILATION, PASS_EXPANSION, PASS_PARSER, PASS_TYPING, }; use move_core_types::account_address::AccountAddress; @@ -235,7 +235,9 @@ pub fn run_model_builder_with_options_and_compilation_flags< let E::Program { modules } = expansion_ast; let modules = modules.filter_map(|mident, mut mdef| { visited_modules.contains(&mident.value).then(|| { - mdef.is_source_module = true; + mdef.target_kind = TargetKind::Source { + is_root_package: true, + }; mdef }) }); @@ -246,7 +248,9 @@ pub fn run_model_builder_with_options_and_compilation_flags< let T::Program_ { modules } = inner; let modules = modules.filter_map(|mident, mut mdef| { visited_modules.contains(&mident.value).then(|| { - mdef.is_source_module = true; + mdef.target_kind = TargetKind::Source { + is_root_package: true, + }; mdef }) });