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

Commita085f39

Browse files
Vasily KirichenkoVasily Kirichenko
Vasily Kirichenko
authored and
Vasily Kirichenko
committed
do not suggest already opened namespaces and modules in "Add Open" code fix
1 parentb946161 commita085f39

File tree

6 files changed

+59
-30
lines changed

6 files changed

+59
-30
lines changed

‎src/absil/illib.fs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ module Array =
185185
/// Optimized arrays equality. ~100x faster than `array1 = array2` on strings.
186186
/// ~2x faster for floats
187187
/// ~0.8x slower for ints
188-
letinlineareEqual(xs:'T[])(ys:'T[])=
188+
letareEqual(xs:'T[])(ys:'T[])=
189189
match xs, yswith
190190
|null,null->true
191191
|[||],[||]->true
@@ -212,7 +212,7 @@ module Array =
212212

213213
/// check if subArray is found in the wholeArray starting
214214
/// at the provided index
215-
letinlineisSubArray(subArray:'T[])(wholeArray:'T[])index=
215+
letisSubArray(subArray:'T[])(wholeArray:'T[])index=
216216
if isNull subArray|| isNull wholeArraythenfalse
217217
elif subArray.Length=0thentrue
218218
elif subArray.Length> wholeArray.Lengththenfalse

‎src/fsharp/NameResolution.fs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3930,6 +3930,20 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv:
39303930
|_->[]
39313931
modsOrNs@ qualifiedFields
39323932

3933+
letGetVisibleNamespacesAndModulesInScope(ncenv:NameResolver)(nenv:NameResolutionEnv)(scope:range)ad=
3934+
letilTyconNames=
3935+
nenv.TyconsByAccessNames(FullyQualifiedFlag.OpenQualified).Values
3936+
|> List.choose(fun tyconRef->if tyconRef.IsILTyconthen Some tyconRef.DisplayNameelse None)
3937+
|> Set.ofList
3938+
3939+
nenv.ModulesAndNamespaces FullyQualifiedFlag.OpenQualified
3940+
|> NameMultiMap.range
3941+
|> List.filter(fun x->
3942+
letdemangledName= x.DemangledModuleOrNamespaceName
3943+
IsInterestingModuleName demangledName&& notFakeContainerModule ilTyconNames demangledName
3944+
&& EntityRefContainsSomethingAccessible ncenv scope ad x
3945+
&&not(IsTyconUnseen ad ncenv.g ncenv.amap scope x))
3946+
39333947
(* Determining if an `Item` is resolvable at point by given `plid`. It's optimized by being lazy and early returning according to the given `Item`*)
39343948

39353949
letprivateResolveCompletionsInTypeForItem(ncenv:NameResolver)nenv m ad statics typ(item:Item):seq<Item>=

‎src/fsharp/NameResolution.fsi‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,5 +418,8 @@ type ResolveCompletionTargets =
418418
/// Resolve a (possibly incomplete) long identifier to a set of possible resolutions, qualified by type.
419419
valResolveCompletionsInType:NameResolver->NameResolutionEnv->ResolveCompletionTargets->Range.range->AccessorDomain->bool->TType->Item list
420420

421+
/// Returns `true` if an `Item` is resolvable being prefixed with given `idents`.
422+
valIsItemResolvable:NameResolver->NameResolutionEnv->scope:range->AccessorDomain->idents:string list->Item->bool
421423

422-
valIsItemResolvable:NameResolver->NameResolutionEnv->range->AccessorDomain->string list->Item->bool
424+
/// Returns all namespaces and modules opened in given `scope`.
425+
valGetVisibleNamespacesAndModulesInScope:NameResolver->NameResolutionEnv->scope:range->AccessorDomain->ModuleOrNamespaceRef list

‎src/fsharp/vs/service.fs‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ namespace Microsoft.FSharp.Compiler.SourceCodeServices
88
openSystem
99
openSystem.IO
1010
openSystem.Text
11-
openSystem.Threading
12-
openSystem.Runtime
1311
openSystem.Collections.Generic
1412
openSystem.Collections.Concurrent
1513

@@ -26,15 +24,13 @@ open Microsoft.FSharp.Compiler.Ast
2624
openMicrosoft.FSharp.Compiler.CompileOps
2725
openMicrosoft.FSharp.Compiler.ErrorLogger
2826
openMicrosoft.FSharp.Compiler.Lib
29-
openMicrosoft.FSharp.Compiler.ReferenceResolver
3027
openMicrosoft.FSharp.Compiler.PrettyNaming
3128
openMicrosoft.FSharp.Compiler.Parser
3229
openMicrosoft.FSharp.Compiler.Range
3330
openMicrosoft.FSharp.Compiler.Lexhelp
3431
openMicrosoft.FSharp.Compiler.Layout
3532
openMicrosoft.FSharp.Compiler.Tast
3633
openMicrosoft.FSharp.Compiler.Tastops
37-
openMicrosoft.FSharp.Compiler.Tastops.DebugPrint
3834
openMicrosoft.FSharp.Compiler.TcGlobals
3935
openMicrosoft.FSharp.Compiler.Infos
4036
openMicrosoft.FSharp.Compiler.InfoReader
@@ -1141,7 +1137,6 @@ type TypeCheckInfo
11411137
else
11421138
items
11431139

1144-
11451140
memberx.IsRelativeNameResolvable(cursorPos:pos,plid:string list,item:Item):bool=
11461141
/// Determines if a long ident is resolvable at a specific point.
11471142
ErrorScope.Protect
@@ -1511,6 +1506,10 @@ type TypeCheckInfo
15111506
|> Seq.toArray
15121507
|> Array.append(sSymbolUses.GetFormatSpecifierLocations()|> Array.map(fun m-> m, SemanticClassificationType.Printf))
15131508

1509+
memberx.GetVisibleNamespacesAndModulesAtPosition(cursorPos:pos):ModuleOrNamespaceRef list=
1510+
let(nenv,ad),scope= GetBestEnvForPos cursorPos
1511+
NameResolution.GetVisibleNamespacesAndModulesInScope ncenv nenv scope ad
1512+
15141513
memberx.ScopeResolutions= sResolutions
15151514
memberx.ScopeSymbolUses= sSymbolUses
15161515
memberx.TcGlobals= g
@@ -2160,6 +2159,11 @@ type FSharpCheckFileResults(errors: FSharpErrorInfo[], scopeOptX: TypeCheckInfo
21602159
reactorOp"IsRelativeNameResolvable"true(fun ctok scope->
21612160
DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok
21622161
scope.IsRelativeNameResolvable(pos, plid, item))
2162+
2163+
memberinfo.GetVisibleNamespacesAndModulesAtPosition(pos:pos):Async<string[]list>=
2164+
reactorOp"GetVisibleNamespacesAndModulesAtPoint"[](fun ctok scope->
2165+
DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok
2166+
scope.GetVisibleNamespacesAndModulesAtPosition(pos)|> List.map(fun x-> x.ToString().Split'.'))
21632167

21642168
//----------------------------------------------------------------------------
21652169
// BackgroundCompiler

‎src/fsharp/vs/service.fsi‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,10 @@ type internal FSharpCheckFileResults =
304304

305305
/// Determines if a long ident is resolvable at a specific point.
306306
member IsRelativeNameResolvable: cursorPos: pos* plid: string list* item: Item-> Async<bool>
307+
308+
/// Returns all namespaces and modules opened at given `pos`.
309+
member GetVisibleNamespacesAndModulesAtPosition: pos-> Async<string[] list>
310+
307311
/// A handle to the results of CheckFileInProject.
308312
[<Sealed>]
309313
type internal FSharpCheckProjectResults=

‎vsintegration/src/FSharp.Editor/CodeFix/AddOpenCodeFixProvider.fs‎

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -156,32 +156,36 @@ type internal FSharpAddOpenCodeFixProvider
156156
letendPos= Pos.fromZ endLinePos.Line endLinePos.Character
157157
Range.mkRange context.Document.FilePath startPos endPos
158158

159+
let!longIdent= ParsedInput.getLongIdentAt parsedInput unresolvedIdentRange.End
159160
letisAttribute= UntypedParseImpl.GetEntityKind(unresolvedIdentRange.Start, parsedInput)= Some EntityKind.Attribute
161+
let!visibleNamespacesAndModules= checkResults.GetVisibleNamespacesAndModulesAtPosition unresolvedIdentRange.End|> liftAsync
160162

161163
letentities=
162164
assemblyContentProvider.GetAllEntitiesInProjectAndReferencedAssemblies checkResults
163-
|> List.collect(fun e->
164-
[yield e.TopRequireQualifiedAccessParent, e.AutoOpenParent, e.Namespace, e.CleanedIdents
165-
if isAttributethen
166-
letlastIdent= e.CleanedIdents.[e.CleanedIdents.Length-1]
167-
if lastIdent.EndsWith"Attribute"&& e.Kind LookupType.Precise= EntityKind.Attributethen
168-
yield
169-
e.TopRequireQualifiedAccessParent,
170-
e.AutoOpenParent,
171-
e.Namespace,
172-
e.CleanedIdents
173-
|> Array.replace(e.CleanedIdents.Length-1)(lastIdent.Substring(0, lastIdent.Length-9))])
174-
175-
letlongIdent= ParsedInput.getLongIdentAt parsedInput unresolvedIdentRange.End
176-
177-
let!maybeUnresolvedIdents=
178-
longIdent
179-
|> Option.map(fun longIdent->
180-
longIdent
181-
|> List.map(fun ident->
182-
{ Ident= ident.idText
183-
Resolved=not(ident.idRange= unresolvedIdentRange)})
184-
|> List.toArray)
165+
|> List.collect(fun e->
166+
[letresolvable=
167+
visibleNamespacesAndModules|> List.exists(fun nsIdents->
168+
e.CleanedIdents.Length>1&&
169+
e.CleanedIdents.[..e.CleanedIdents.Length-2]|> Array.areEqual nsIdents)
170+
171+
ifnot resolvablethen
172+
yield e.TopRequireQualifiedAccessParent, e.AutoOpenParent, e.Namespace, e.CleanedIdents
173+
if isAttributethen
174+
letlastIdent= e.CleanedIdents.[e.CleanedIdents.Length-1]
175+
if lastIdent.EndsWith"Attribute"&& e.Kind LookupType.Precise= EntityKind.Attributethen
176+
yield
177+
e.TopRequireQualifiedAccessParent,
178+
e.AutoOpenParent,
179+
e.Namespace,
180+
e.CleanedIdents
181+
|> Array.replace(e.CleanedIdents.Length-1)(lastIdent.Substring(0, lastIdent.Length-9))])
182+
183+
letmaybeUnresolvedIdents=
184+
longIdent
185+
|> List.map(fun ident->
186+
{ Ident= ident.idText
187+
Resolved=not(ident.idRange= unresolvedIdentRange)})
188+
|> List.toArray
185189

186190
letcreateEntity= ParsedInput.tryFindInsertionContext unresolvedIdentRange.StartLine parsedInput maybeUnresolvedIdents
187191
return entities|> Seq.map createEntity|> Seq.concat|> Seq.toList|> getSuggestions context

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp