@@ -724,6 +724,43 @@ module internal SignatureOps =
724724 seqEntity.entity_ flags.IsStructRecordOrUnionType
725725 )))
726726
727+ /// Matches a ModuleOrNamespaceContents that is empty from a signature printing point of view.
728+ /// Signatures printed via the typed tree in NicePrint don't print TMDefOpens or TMDefDo.
729+ /// This will match anything that does not have any types or bindings.
730+ [<return : Struct>]
731+ let (| EmptyModuleOrNamespaces | _ |) ( moduleOrNamespaceContents : ModuleOrNamespaceContents ) =
732+ match moduleOrNamespaceContents with
733+ | TMDefs( defs = defs) ->
734+ let mdDefsLength =
735+ defs
736+ |> List.count ( function
737+ | ModuleOrNamespaceContents.TMDefRec _
738+ | ModuleOrNamespaceContents.TMDefs _ -> true
739+ | _ -> false )
740+
741+ let emptyModuleOrNamespaces =
742+ defs
743+ |> List.choose ( function
744+ | ModuleOrNamespaceContents.TMDefRec _ as defRec
745+ | ModuleOrNamespaceContents.TMDefs( defs = [ ModuleOrNamespaceContents.TMDefRec _ as defRec ]) ->
746+ match defRec with
747+ | TMDefRec( bindings = [ ModuleOrNamespaceBinding.Module( mspec, ModuleOrNamespaceContents.TMDefs( defs = defs)) ]) ->
748+ defs
749+ |> List.forall ( function
750+ | ModuleOrNamespaceContents.TMDefOpens _
751+ | ModuleOrNamespaceContents.TMDefDo _
752+ | ModuleOrNamespaceContents.TMDefRec( isRec = true ; tycons = []; bindings = []) -> true
753+ | _ -> false )
754+ |> fun isEmpty -> if isEmpty then Some mspec else None
755+ | _ -> None
756+ | _ -> None)
757+
758+ if mdDefsLength = emptyModuleOrNamespaces.Length then
759+ ValueSome emptyModuleOrNamespaces
760+ else
761+ ValueNone
762+ | _ -> ValueNone
763+
727764[<AutoOpen>]
728765module internal ExprFreeVars =
729766
0 commit comments