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

Commit6063651

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
do not suggest open namespaces in case of misspelled names (dotnet#2137)
1 parent6b25b6f commit6063651

File tree

3 files changed

+60
-50
lines changed

3 files changed

+60
-50
lines changed

‎VisualFSharp.sln‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio 15
4-
VisualStudioVersion =15.0.26009.0
4+
VisualStudioVersion =15.0.26014.0
55
MinimumVisualStudioVersion =10.0.40219.1
66
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") ="FSharp.Compiler","src\fsharp\FSharp.Compiler\FSharp.Compiler.fsproj","{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}"
77
EndProject

‎src/fsharp/vs/ServiceAssemblyContent.fs‎

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ open Microsoft.FSharp.Compiler.Range
1515

1616
typeinternalShortIdent= string
1717
typeIdents= ShortIdent[]
18+
typeMaybeUnresolvedIdent={ Ident:ShortIdent; Resolved:bool}
19+
typeMaybeUnresolvedIdents= MaybeUnresolvedIdent[]
1820
typeIsAutoOpen= bool
1921

2022
[<AutoOpen>]
@@ -458,15 +460,18 @@ module internal Entity =
458460
|_-> candidateNs.Length
459461
candidateNs.[0..nsCount-1]
460462

461-
lettryCreate(targetNamespace:Idents option,targetScope:Idents,partiallyQualifiedName:Idents,
462-
requiresQualifiedAccessParent:Idents option,autoOpenParent:Idents option,
463-
candidateNamespace:Idents option,candidate:Idents)=
463+
lettryCreate(targetNamespace:Idents option,targetScope:Idents,partiallyQualifiedName:MaybeUnresolvedIdents,
464+
requiresQualifiedAccessParent:Idents option,autoOpenParent:Idents option,candidateNamespace:Idents option,candidate:Idents)=
464465
match candidatewith
465466
|[||]->[||]
466467
|_->
467468
partiallyQualifiedName
468469
|> Array.heads
469-
|> Array.choose(fun parts->
470+
// the last part must be unresolved, otherwise we show false positive suggestions like
471+
// "open System" for `let _ = System.DateTime.Naaaw`. Here only "Naaw" is unresolved.
472+
|> Array.filter(fun x->not(x.[x.Length-1].Resolved))
473+
|> Array.choose(fun parts->
474+
letparts= parts|> Array.map(fun x-> x.Ident)
470475
ifnot(candidate|> Array.endsWith parts)then None
471476
else
472477
letidentCount= parts.Length
@@ -547,29 +552,25 @@ module internal ParsedInput =
547552
| SynConstructorArgs.Pats ps-> ps
548553
| SynConstructorArgs.NamePatPairs(xs,_)-> List.map snd xs
549554

550-
letinternallongIdentToArray(longIdent:LongIdent):Idents=
551-
longIdent|> Seq.map string|> Seq.toArray
552-
553-
/// Returns all Idents and LongIdents found in an untyped AST.
554-
letinternalgetLongIdents(input:ParsedInput option):IDictionary<Range.pos,Idents>=
555-
letidentsByEndPos= Dictionary<Range.pos, Idents>()
555+
/// Returns all `Ident`s and `LongIdent`s found in an untyped AST.
556+
letinternalgetLongIdents(input:ParsedInput option):IDictionary<Range.pos,LongIdent>=
557+
letidentsByEndPos= Dictionary<Range.pos, LongIdent>()
556558

557559
letaddLongIdent(longIdent:LongIdent)=
558-
letidents= longIdentToArray longIdent
559560
for identin longIdentdo
560-
identsByEndPos.[ident.idRange.End]<-idents
561+
identsByEndPos.[ident.idRange.End]<-longIdent
561562

562563
letaddLongIdentWithDots(LongIdentWithDots(longIdent,lids)as value)=
563-
matchlongIdentToArraylongIdentwith
564-
|[||]->()
565-
|[|_|]as idents-> identsByEndPos.[value.Range.End]<- idents
564+
match longIdentwith
565+
|[]->()
566+
|[_]as idents-> identsByEndPos.[value.Range.End]<- idents
566567
| idents->
567568
for dotRangein lidsdo
568569
identsByEndPos.[Range.mkPos dotRange.EndLine(dotRange.EndColumn-1)]<- idents
569570
identsByEndPos.[value.Range.End]<- idents
570571

571572
letaddIdent(ident:Ident)=
572-
identsByEndPos.[ident.idRange.End]<-[|ident.idText|]
573+
identsByEndPos.[ident.idRange.End]<-[ident]
573574

574575
let recwalkImplFileInput(ParsedImplFileInput(_,_,_,_,_,moduleOrNamespaceList,_))=
575576
List.iter walkSynModuleOrNamespace moduleOrNamespaceList
@@ -886,7 +887,7 @@ module internal ParsedInput =
886887
walkImplFileInput input
887888
|_->()
888889
//debug "%A" idents
889-
identsByEndPos:>_
890+
upcast identsByEndPos
890891

891892
letgetLongIdentAt ast pos=
892893
letidents= getLongIdents(Some ast)
@@ -1003,13 +1004,12 @@ module internal ParsedInput =
10031004
|> Seq.sortBy(fun(m,_,_)->-m.Length)
10041005
|> Seq.toList
10051006

1006-
fun(partiallyQualifiedName:Idents)(requiresQualifiedAccessParent: Idents option,autoOpenParent: Idents option,
1007-
entityNamespace: Idents option,entity: Idents)->
1007+
fun(partiallyQualifiedName:MaybeUnresolvedIdents)
1008+
(requiresQualifiedAccessParent: Idents option,autoOpenParent: Idents option,entityNamespace: Idents option,entity: Idents)->
10081009
match reswith
10091010
| None->[||]
10101011
| Some(scope, ns, pos)->
1011-
Entity.tryCreate(ns, scope.Idents, partiallyQualifiedName, requiresQualifiedAccessParent,
1012-
autoOpenParent, entityNamespace, entity)
1012+
Entity.tryCreate(ns, scope.Idents, partiallyQualifiedName, requiresQualifiedAccessParent, autoOpenParent, entityNamespace, entity)
10131013
|> Array.map(fun e->
10141014
e,
10151015
match modules|> List.filter(fun(m,_,_)-> entity|> Array.startsWith m)with

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

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -178,34 +178,44 @@ type internal FSharpAddOpenCodeFixProvider
178178
| None,_
179179
|_, FSharpCheckFileAnswer.Aborted->()
180180
| Some parsedInput, FSharpCheckFileAnswer.Succeeded checkFileResults->
181-
lettextLinePos= sourceText.Lines.GetLinePosition context.Span.Start
182-
letdefines= CompilerEnvironment.GetCompilationDefinesForEditing(context.Document.FilePath, options.OtherOptions|> Seq.toList)
183-
letsymbol= CommonHelpers.getSymbolAtPosition(context.Document.Id, sourceText, context.Span.Start, context.Document.FilePath, defines, SymbolLookupKind.Fuzzy)
184-
match symbolwith
185-
| Some symbol->
186-
letpos= Pos.fromZ textLinePos.Line textLinePos.Character
187-
letisAttribute= UntypedParseImpl.GetEntityKind(pos, parsedInput)= Some EntityKind.Attribute
188-
letentities=
189-
assemblyContentProvider.GetAllEntitiesInProjectAndReferencedAssemblies checkFileResults
190-
|> List.map(fun e->
191-
[yield e.TopRequireQualifiedAccessParent, e.AutoOpenParent, e.Namespace, e.CleanedIdents
192-
if isAttributethen
193-
letlastIdent= e.CleanedIdents.[e.CleanedIdents.Length-1]
194-
if lastIdent.EndsWith"Attribute"&& e.Kind LookupType.Precise= EntityKind.Attributethen
195-
yield
196-
e.TopRequireQualifiedAccessParent,
197-
e.AutoOpenParent,
198-
e.Namespace,
199-
e.CleanedIdents
200-
|> Array.replace(e.CleanedIdents.Length-1)(lastIdent.Substring(0, lastIdent.Length-9))])
201-
|> List.concat
202-
203-
letidents= ParsedInput.getLongIdentAt parsedInput(Range.mkPos pos.Line symbol.RightColumn)
204-
match identswith
205-
| Some idents->
206-
letcreateEntity= ParsedInput.tryFindInsertionContext pos.Line parsedInput idents
207-
return entities|> Seq.map createEntity|> Seq.concat|> Seq.toList|> getSuggestions context
208-
| None->()
181+
letunresolvedIdentRange=
182+
letstartLinePos= sourceText.Lines.GetLinePosition context.Span.Start
183+
letstartPos= Pos.fromZ startLinePos.Line startLinePos.Character
184+
letendLinePos= sourceText.Lines.GetLinePosition context.Span.End
185+
letendPos= Pos.fromZ endLinePos.Line endLinePos.Character
186+
Range.mkRange context.Document.FilePath startPos endPos
187+
188+
letisAttribute= UntypedParseImpl.GetEntityKind(unresolvedIdentRange.Start, parsedInput)= Some EntityKind.Attribute
189+
190+
letentities=
191+
assemblyContentProvider.GetAllEntitiesInProjectAndReferencedAssemblies checkFileResults
192+
|> List.collect(fun e->
193+
[yield e.TopRequireQualifiedAccessParent, e.AutoOpenParent, e.Namespace, e.CleanedIdents
194+
if isAttributethen
195+
letlastIdent= e.CleanedIdents.[e.CleanedIdents.Length-1]
196+
if lastIdent.EndsWith"Attribute"&& e.Kind LookupType.Precise= EntityKind.Attributethen
197+
yield
198+
e.TopRequireQualifiedAccessParent,
199+
e.AutoOpenParent,
200+
e.Namespace,
201+
e.CleanedIdents
202+
|> Array.replace(e.CleanedIdents.Length-1)(lastIdent.Substring(0, lastIdent.Length-9))])
203+
204+
letlongIdent= ParsedInput.getLongIdentAt parsedInput unresolvedIdentRange.End
205+
206+
letmaybeUnresolvedIdents=
207+
longIdent
208+
|> Option.map(fun longIdent->
209+
longIdent
210+
|> List.map(fun ident->
211+
{ Ident= ident.idText
212+
Resolved=not(ident.idRange= unresolvedIdentRange)})
213+
|> List.toArray)
214+
215+
match maybeUnresolvedIdentswith
216+
| Some maybeUnresolvedIdents->
217+
letcreateEntity= ParsedInput.tryFindInsertionContext unresolvedIdentRange.StartLine parsedInput maybeUnresolvedIdents
218+
return entities|> Seq.map createEntity|> Seq.concat|> Seq.toList|> getSuggestions context
209219
| None->()
210220
| None->()
211221
}|> CommonRoslynHelpers.StartAsyncUnitAsTask(context.CancellationToken)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp