@@ -17,20 +17,24 @@ open Microsoft.FSharp.Compiler.SourceCodeServices
1717module private UnusedOpens =
1818open Microsoft.CodeAnalysis .Text
1919
20- let rec visitSynModuleOrNamespaceDecls decls =
20+ let rec visitSynModuleOrNamespaceDecls ( parent : Ast.LongIdent ) decls : ( Set < string > * range ) list =
2121[ for declin declsdo
2222match declwith
23- | SynModuleDecl.Open( longIdentWithDots, range) ->
24- yield ( longIdentWithDots.Lid|> List.map( fun l -> l.idText) |> String.concat" ." ), range
25- | SynModuleDecl.NestedModule(_,_, decls,_,_) ->
26- yield ! visitSynModuleOrNamespaceDecls decls
23+ | SynModuleDecl.Open( LongIdentWithDots.LongIdentWithDots( id= longId), range) ->
24+ yield
25+ set[ yield ( longId|> List.map( fun l -> l.idText) |> String.concat" ." )
26+ // `open N.M` can open N.M module from parent module as well, if it's non empty
27+ if not ( List.isEmpty parent) then
28+ yield ( parent@ longId|> List.map( fun l -> l.idText) |> String.concat" ." ) ], range
29+ | SynModuleDecl.NestedModule( SynComponentInfo.ComponentInfo( longId= longId),_, decls,_,_) ->
30+ yield ! visitSynModuleOrNamespaceDecls longId decls
2731| _ -> () ]
2832
2933let getOpenStatements = function
3034| ParsedInput.ImplFile( ParsedImplFileInput( modules= modules)) ->
3135[ for mdin modulesdo
32- let SynModuleOrNamespace ( decls = decls) = md
33- yield ! visitSynModuleOrNamespaceDecls decls]
36+ let SynModuleOrNamespace ( longId = longId ; decls= decls) = md
37+ yield ! visitSynModuleOrNamespaceDeclslongId decls]
3438| _ -> []
3539
3640let getAutoOpenAccessPath ( ent : FSharpEntity ) =
@@ -111,14 +115,14 @@ module private UnusedOpens =
111115|> Seq.collect getPossibleNamespaces
112116|> Set.ofSeq
113117
114- let filter list : ( string * Range. range)list =
118+ let filter list : ( Set < string > * range )list =
115119let rec filterInner acc list ( seenNamespaces : Set < string >) =
116120let notUsed ns = not ( namespacesInUse.Contains ns) || seenNamespaces.Contains ns
117121match listwith
118- | ( ns, range) :: xswhen notUsed ns ->
119- filterInner(( ns, range) :: acc) xs( seenNamespaces.Add ns)
122+ | ( ns, range) :: xswhen ns |> Set.forall notUsed ->
123+ filterInner(( ns, range) :: acc) xs( seenNamespaces|> Set.union ns)
120124| ( ns, _) :: xs->
121- filterInner acc xs( seenNamespaces.Add ns)
125+ filterInner acc xs( seenNamespaces|> Set.union ns)
122126| [] -> List.rev acc
123127 filterInner[] list Set.empty
124128