Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf7789b9

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
fixed false positive for relative open statements (dotnet#2487)
1 parent67cd73e commitf7789b9

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

‎vsintegration/src/FSharp.Editor/Diagnostics/UnusedOpensDiagnosticAnalyzer.fs‎

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,24 @@ open Microsoft.FSharp.Compiler.SourceCodeServices
1717
moduleprivateUnusedOpens=
1818
openMicrosoft.CodeAnalysis.Text
1919

20-
let recvisitSynModuleOrNamespaceDecls decls=
20+
let recvisitSynModuleOrNamespaceDecls(parent:Ast.LongIdent)decls:(Set<string>* range)list=
2121
[for declin declsdo
2222
match 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+
ifnot(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

2933
letgetOpenStatements=function
3034
| ParsedInput.ImplFile(ParsedImplFileInput(modules= modules))->
3135
[for mdin modulesdo
32-
letSynModuleOrNamespace(decls= decls)= md
33-
yield! visitSynModuleOrNamespaceDecls decls]
36+
letSynModuleOrNamespace(longId= longId;decls= decls)= md
37+
yield! visitSynModuleOrNamespaceDeclslongIddecls]
3438
|_->[]
3539

3640
letgetAutoOpenAccessPath(ent:FSharpEntity)=
@@ -111,14 +115,14 @@ module private UnusedOpens =
111115
|> Seq.collect getPossibleNamespaces
112116
|> Set.ofSeq
113117

114-
letfilter list:(string*Range.range)list=
118+
letfilter list:(Set<string>* range)list=
115119
let recfilterInner acc list(seenNamespaces:Set<string>)=
116120
letnotUsed ns=not(namespacesInUse.Contains ns)|| seenNamespaces.Contains ns
117121
match listwith
118-
|(ns, range):: xswhennotUsed ns->
119-
filterInner((ns, range):: acc) xs(seenNamespaces.Add ns)
122+
|(ns, range):: xswhenns|> 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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp