@@ -145,8 +145,17 @@ module private UnusedOpens =
145145let rec filterInner acc ( list : OpenStatement list ) ( seenOpenStatements : OpenStatement list ) =
146146
147147let notUsed ( os : OpenStatement ) =
148- not ( namespacesInUse|> List.exists( fun nsu -> rangeContainsRange os.ModuleRange nsu.Location&& os.Names|> Set.contains nsu.Ident))
149- || seenOpenStatements|> List.contains os
148+ let notUsedAnywhere = not ( namespacesInUse|> List.exists( fun nsu -> rangeContainsRange os.ModuleRange nsu.Location&& os.Names|> Set.contains nsu.Ident))
149+ if notUsedAnywherethen true
150+ else
151+ let alreadySeen =
152+ seenOpenStatements
153+ |> List.exists( fun seenNs ->
154+ // if such open statement has already been marked as used in this or outer module, we skip it
155+ // (that is, do not mark as used so far)
156+ ( seenNs.ModuleRange= os.ModuleRange|| rangeContainsRange seenNs.ModuleRange os.ModuleRange) &&
157+ not ( os.Names|> Set.intersect seenNs.Names|> Set.isEmpty))
158+ alreadySeen
150159
151160match listwith
152161| os:: xswhen notUsed os->