Skip to content

Commit c544e6d

Browse files
authored
Merge pull request #15995 from dotnet/merges/main-to-release/dev17.8
Merge main to release/dev17.8
2 parents 6fac58b + 9b22031 commit c544e6d

14 files changed

+131
-69
lines changed

eng/Version.Details.xml

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Dependencies>
33
<ProductDependencies>
4-
<Dependency Name="Microsoft.SourceBuild.Intermediate.source-build-reference-packages" Version="8.0.0-alpha.1.23455.3">
4+
<Dependency Name="Microsoft.SourceBuild.Intermediate.source-build-reference-packages" Version="9.0.0-alpha.1.23465.1">
55
<Uri>https://github.com/dotnet/source-build-reference-packages</Uri>
6-
<Sha>75ec14a961f43446d952c64b5b3330df750db54f</Sha>
6+
<Sha>eeb7f1b24a845eebf3e0885a4650b8df67741d4a</Sha>
77
<SourceBuild RepoName="source-build-reference-packages" ManagedOnly="true" />
88
</Dependency>
99
<Dependency Name="Microsoft.SourceBuild.Intermediate.msbuild" Version="17.7.0-preview-23217-02">
@@ -29,9 +29,9 @@
2929
</Dependency>
3030
</ProductDependencies>
3131
<ToolsetDependencies>
32-
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="8.0.0-beta.23461.2">
32+
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="8.0.0-beta.23463.1">
3333
<Uri>https://github.com/dotnet/arcade</Uri>
34-
<Sha>4a908c64757841121e67fda7adaf776c93893163</Sha>
34+
<Sha>1d451c32dda2314c721adbf8829e1c0cd4e681ff</Sha>
3535
<SourceBuild RepoName="arcade" ManagedOnly="true" />
3636
</Dependency>
3737
<Dependency Name="Microsoft.DotNet.XliffTasks" Version="1.0.0-beta.23426.1" CoherentParentDependency="Microsoft.DotNet.Arcade.Sdk">

global.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"perl": "5.38.0.1"
1919
},
2020
"msbuild-sdks": {
21-
"Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.23461.2",
21+
"Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.23463.1",
2222
"Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.23255.2"
2323
}
2424
}

src/Compiler/Service/IncrementalBuild.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ type IncrementalBuilderState with
10691069
HasSignature = hasSignature
10701070
Stamp = DateTime.MinValue
10711071
LogicalStamp = DateTime.MinValue
1072-
Notified = false
1072+
Notified = true
10731073
SyntaxTree = syntaxTree
10741074
BoundModel = model
10751075
}

tests/FSharp.Compiler.ComponentTests/FSharpChecker/CommonWorkflows.fs

+34
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ open Xunit
99
open FSharp.Test.ProjectGeneration
1010
open FSharp.Compiler.Text
1111
open FSharp.Compiler.CodeAnalysis
12+
open FSharp.Compiler.Diagnostics
13+
14+
open OpenTelemetry
15+
open OpenTelemetry.Resources
16+
open OpenTelemetry.Trace
17+
18+
#nowarn "57"
1219

1320
let makeTestProject () =
1421
SyntheticProject.Create(
@@ -132,3 +139,30 @@ let ``Using getSource and notifications instead of filesystem`` () =
132139
checkFile middle expectSignatureChanged
133140
checkFile last expectSignatureChanged
134141
}
142+
143+
[<Fact>]
144+
let GetAllUsesOfAllSymbols() =
145+
let traceProvider =
146+
Sdk.CreateTracerProviderBuilder()
147+
.AddSource("fsc")
148+
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName="F#", serviceVersion = "1"))
149+
.AddJaegerExporter()
150+
.Build()
151+
152+
use _ = Activity.start "GetAllUsesOfAllSymbols" [ ]
153+
154+
let result =
155+
async {
156+
let project = makeTestProject()
157+
let checker = ProjectWorkflowBuilder(project, useGetSource=true, useChangeNotifications = true).Checker
158+
do! saveProject project false checker
159+
let options = project.GetProjectOptions checker
160+
let! checkProjectResults = checker.ParseAndCheckProject(options)
161+
return checkProjectResults.GetAllUsesOfAllSymbols()
162+
} |> Async.RunSynchronously
163+
164+
165+
traceProvider.ForceFlush() |> ignore
166+
traceProvider.Dispose()
167+
168+
Assert.Equal(80, result.Length)

tests/FSharp.Test.Utilities/ProjectGeneration.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ type ProjectWorkflowBuilder
806806
defaultArg
807807
checker
808808
(FSharpChecker.Create(
809-
keepAllBackgroundSymbolUses = false,
809+
keepAllBackgroundSymbolUses = true,
810810
enableBackgroundItemKeyStoreAndSemanticClassification = true,
811811
enablePartialTypeChecking = true,
812812
captureIdentifiersWhenParsing = true,

vsintegration/src/FSharp.Editor/CodeFixes/AddTypeAnnotationToObjectOfIndeterminateType.fs

+2-5
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ open Microsoft.CodeAnalysis.Text
1010
open Microsoft.CodeAnalysis.CodeFixes
1111

1212
open FSharp.Compiler.EditorServices
13-
open FSharp.Compiler.Text
1413
open FSharp.Compiler.Symbols
1514

1615
open CancellableTasks
@@ -43,10 +42,7 @@ type internal AddTypeAnnotationToObjectOfIndeterminateTypeFixProvider [<Importin
4342
match lexerSymbolOpt with
4443
| None -> return ValueNone
4544
| Some lexerSymbol ->
46-
let! sourceText = context.GetSourceTextAsync()
47-
let textLine = sourceText.Lines.GetLineFromPosition position
48-
let textLinePos = sourceText.Lines.GetLinePosition position
49-
let fcsTextLineNumber = Line.fromZ textLinePos.Line
45+
let! fcsTextLineNumber, textLine = context.GetLineNumberAndText position
5046

5147
let! _, checkFileResults =
5248
document.GetFSharpParseAndCheckResultsAsync(nameof AddTypeAnnotationToObjectOfIndeterminateTypeFixProvider)
@@ -62,6 +58,7 @@ type internal AddTypeAnnotationToObjectOfIndeterminateTypeFixProvider [<Importin
6258

6359
match decl with
6460
| FindDeclResult.DeclFound declRange when declRange.FileName = document.FilePath ->
61+
let! sourceText = context.GetSourceTextAsync()
6562
let declSpan = RoslynHelpers.FSharpRangeToTextSpan(sourceText, declRange)
6663
let declTextLine = sourceText.Lines.GetLineFromPosition declSpan.Start
6764

vsintegration/src/FSharp.Editor/CodeFixes/CodeFixHelpers.fs

+22-25
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Microsoft.VisualStudio.FSharp.Editor
44

55
open System
6-
open System.Threading
76
open System.Collections.Immutable
87
open System.Diagnostics
98

@@ -20,13 +19,6 @@ open FSharp.Compiler.Text
2019

2120
open CancellableTasks
2221

23-
module internal MutableCodeFixHelper =
24-
let getLineNumberAndText (sourceText: SourceText) position =
25-
let textLine = sourceText.Lines.GetLineFromPosition position
26-
let textLinePos = sourceText.Lines.GetLinePosition position
27-
let fcsTextLineNumber = Line.fromZ textLinePos.Line
28-
fcsTextLineNumber, textLine.ToString()
29-
3022
module internal UnusedCodeFixHelper =
3123
let getUnusedSymbol textSpan (document: Document) (sourceText: SourceText) codeFixName =
3224
let ident = sourceText.ToString textSpan
@@ -80,34 +72,30 @@ module internal CodeFixHelpers =
8072

8173
TelemetryReporter.ReportSingleEvent(TelemetryEvents.CodefixActivated, props)
8274

83-
let createTextChangeCodeFix (name: string, title: string, context: CodeFixContext, changes: TextChange seq) =
75+
let createTextChangeCodeFix (codeFix, context: CodeFixContext) =
8476
CodeAction.Create(
85-
title,
86-
(fun (cancellationToken: CancellationToken) ->
87-
backgroundTask {
88-
let! sourceText = context.Document.GetTextAsync(cancellationToken)
89-
let doc = context.Document.WithText(sourceText.WithChanges(changes))
90-
reportCodeFixTelemetry context.Diagnostics context.Document name [||]
77+
codeFix.Message,
78+
(fun cancellationToken ->
79+
cancellableTask {
80+
let! sourceText = context.Document.GetTextAsync cancellationToken
81+
let doc = context.Document.WithText(sourceText.WithChanges(codeFix.Changes))
82+
reportCodeFixTelemetry context.Diagnostics context.Document codeFix.Name [||]
9183
return doc
92-
}),
93-
name
84+
}
85+
|> CancellableTask.start cancellationToken),
86+
codeFix.Name
9487
)
9588

9689
[<AutoOpen>]
9790
module internal CodeFixExtensions =
9891
type CodeFixContext with
9992

100-
member ctx.RegisterFsharpFix(staticName, title, changes, ?diagnostics) =
101-
let codeAction =
102-
CodeFixHelpers.createTextChangeCodeFix (staticName, title, ctx, changes)
103-
104-
let diag = diagnostics |> Option.defaultValue ctx.Diagnostics
105-
ctx.RegisterCodeFix(codeAction, diag)
106-
10793
member ctx.RegisterFsharpFix(codeFix: IFSharpCodeFixProvider) =
10894
cancellableTask {
10995
match! codeFix.GetCodeFixIfAppliesAsync ctx with
110-
| ValueSome codeFix -> ctx.RegisterFsharpFix(codeFix.Name, codeFix.Message, codeFix.Changes)
96+
| ValueSome codeFix ->
97+
let codeAction = CodeFixHelpers.createTextChangeCodeFix (codeFix, ctx)
98+
ctx.RegisterCodeFix(codeAction, ctx.Diagnostics)
11199
| ValueNone -> ()
112100
}
113101
|> CancellableTask.startAsTask ctx.CancellationToken
@@ -130,6 +118,15 @@ module internal CodeFixExtensions =
130118
return RoslynHelpers.TextSpanToFSharpRange(ctx.Document.FilePath, ctx.Span, sourceText)
131119
}
132120

121+
member ctx.GetLineNumberAndText position =
122+
cancellableTask {
123+
let! sourceText = ctx.GetSourceTextAsync()
124+
let textLine = sourceText.Lines.GetLineFromPosition position
125+
let textLinePos = sourceText.Lines.GetLinePosition position
126+
let fcsTextLineNumber = Line.fromZ textLinePos.Line
127+
return fcsTextLineNumber, textLine.ToString()
128+
}
129+
133130
// This cannot be an extension on the code fix context
134131
// because the underlying GetFixAllProvider method doesn't take the context in.
135132
#nowarn "3511" // state machine not statically compilable

vsintegration/src/FSharp.Editor/CodeFixes/FixIndexerAccessLegacy.fs

+17-17
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,35 @@ namespace Microsoft.VisualStudio.FSharp.Editor
44

55
open System.Composition
66
open System.Collections.Immutable
7-
open System.Threading.Tasks
87

98
open Microsoft.CodeAnalysis.Text
109
open Microsoft.CodeAnalysis.CodeFixes
1110
open FSharp.Compiler.Diagnostics
1211

12+
open CancellableTasks
13+
1314
[<ExportCodeFixProvider(FSharpConstants.FSharpLanguageName, Name = CodeFix.FixIndexerAccess); Shared>]
1415
type internal LegacyFixAddDotToIndexerAccessCodeFixProvider() =
1516
inherit CodeFixProvider()
1617

1718
static let title = CompilerDiagnostics.GetErrorMessage FSharpDiagnosticKind.AddIndexerDot
1819

19-
override _.FixableDiagnosticIds = ImmutableArray.Create("FS3217")
20+
override _.FixableDiagnosticIds = ImmutableArray.Create "FS3217"
2021

21-
override _.RegisterCodeFixesAsync context : Task =
22-
async {
23-
let! sourceText = context.Document.GetTextAsync() |> Async.AwaitTask
22+
override this.RegisterCodeFixesAsync context = context.RegisterFsharpFix this
2423

25-
context.Diagnostics
26-
|> Seq.iter (fun diagnostic ->
24+
interface IFSharpCodeFixProvider with
25+
member _.GetCodeFixIfAppliesAsync context =
26+
cancellableTask {
27+
let! sourceText = context.GetSourceTextAsync()
2728

2829
let span, replacement =
2930
try
3031
let mutable span = context.Span
3132

3233
let notStartOfBracket (span: TextSpan) =
3334
let t = sourceText.GetSubText(TextSpan(span.Start, span.Length + 1))
34-
t.[t.Length - 1] <> '['
35+
t[t.Length - 1] <> '['
3536

3637
// skip all braces and blanks until we find [
3738
while span.End < sourceText.Length && notStartOfBracket span do
@@ -41,12 +42,11 @@ type internal LegacyFixAddDotToIndexerAccessCodeFixProvider() =
4142
with _ ->
4243
context.Span, sourceText.GetSubText(context.Span).ToString()
4344

44-
do
45-
context.RegisterFsharpFix(
46-
CodeFix.FixIndexerAccess,
47-
title,
48-
[| TextChange(span, replacement.TrimEnd() + ".") |],
49-
ImmutableArray.Create(diagnostic)
50-
))
51-
}
52-
|> RoslynHelpers.StartAsyncUnitAsTask(context.CancellationToken)
45+
return
46+
ValueSome
47+
{
48+
Name = CodeFix.FixIndexerAccess
49+
Message = title
50+
Changes = [ TextChange(span, replacement.TrimEnd() + ".") ]
51+
}
52+
}

vsintegration/src/FSharp.Editor/CodeFixes/MakeDeclarationMutable.fs

+1-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ type internal MakeDeclarationMutableCodeFixProvider [<ImportingConstructor>] ()
4646
| Some lexerSymbol ->
4747
let! sourceText = context.GetSourceTextAsync()
4848

49-
let fcsTextLineNumber, textLine =
50-
MutableCodeFixHelper.getLineNumberAndText sourceText position
49+
let! fcsTextLineNumber, textLine = context.GetLineNumberAndText position
5150

5251
let! parseFileResults, checkFileResults =
5352
document.GetFSharpParseAndCheckResultsAsync(nameof MakeDeclarationMutableCodeFixProvider)

vsintegration/src/FSharp.Editor/CodeFixes/ReplaceWithSuggestion.fs

+1-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ open Microsoft.CodeAnalysis.CodeFixes
1212
open FSharp.Compiler.Diagnostics
1313
open FSharp.Compiler.EditorServices
1414
open FSharp.Compiler.Syntax
15-
open FSharp.Compiler.Text
1615

1716
open CancellableTasks
1817

@@ -38,9 +37,7 @@ type internal ReplaceWithSuggestionCodeFixProvider [<ImportingConstructor>] () =
3837
let! unresolvedIdentifierText = context.GetSquigglyTextAsync()
3938
let pos = context.Span.End
4039
let caretLinePos = sourceText.Lines.GetLinePosition(pos)
41-
let caretLine = sourceText.Lines.GetLineFromPosition(pos)
42-
let fcsCaretLineNumber = Line.fromZ caretLinePos.Line
43-
let lineText = caretLine.ToString()
40+
let! fcsCaretLineNumber, lineText = context.GetLineNumberAndText pos
4441

4542
let partialName =
4643
QuickParse.GetPartialLongNameEx(lineText, caretLinePos.Character - 1)

vsintegration/src/FSharp.Editor/CodeFixes/UseMutationWhenValueIsMutable.fs

+6-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ type internal UseMutationWhenValueIsMutableCodeFixProvider [<ImportingConstructo
3535

3636
let adjustedPosition =
3737
let rec loop ch pos =
38-
if Char.IsWhiteSpace(ch) then
38+
if
39+
Char.IsWhiteSpace(ch)
40+
// edge case - end of file
41+
|| pos = sourceText.Length - 1
42+
then
3943
pos
4044
else
4145
loop sourceText[pos + 1] (pos + 1)
@@ -54,8 +58,7 @@ type internal UseMutationWhenValueIsMutableCodeFixProvider [<ImportingConstructo
5458
match lexerSymbolOpt with
5559
| None -> return ValueNone
5660
| Some lexerSymbol ->
57-
let fcsTextLineNumber, textLine =
58-
MutableCodeFixHelper.getLineNumberAndText sourceText adjustedPosition
61+
let! fcsTextLineNumber, textLine = context.GetLineNumberAndText adjustedPosition
5962

6063
let! _, checkFileResults =
6164
document.GetFSharpParseAndCheckResultsAsync(nameof UseMutationWhenValueIsMutableCodeFixProvider)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
2+
3+
module FSharp.Editor.Tests.CodeFixes.FixIndexerAccessLegacyTests
4+
5+
open Microsoft.VisualStudio.FSharp.Editor
6+
open Xunit
7+
8+
open CodeFixTestFramework
9+
10+
let private codeFix = LegacyFixAddDotToIndexerAccessCodeFixProvider()
11+
12+
[<Fact>]
13+
let ``Fixes FS3217`` () =
14+
let code =
15+
"""
16+
let list = [ 1; 2; 3 ]
17+
let first = list[2]
18+
"""
19+
20+
let expected =
21+
Some
22+
{
23+
Message = "Add . for indexer access."
24+
FixedCode =
25+
"""
26+
let list = [ 1; 2; 3 ]
27+
let first = list.[2]
28+
"""
29+
}
30+
31+
let actual = codeFix |> tryFix code (WithOption "--langversion:5")
32+
33+
Assert.Equal(expected, actual)

vsintegration/tests/FSharp.Editor.Tests/CodeFixes/UseMutationWhenValueIsMutableTests.fs

+7-6
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,15 @@ let f x =
4747

4848
Assert.Equal(expected, actual)
4949

50-
[<Fact>]
51-
let ``Doesn't fix unrelated FS0020`` () =
52-
let code =
53-
"""
50+
[<Theory>]
51+
[<InlineData """
5452
let square x = x * x
5553
square 32
56-
"""
57-
54+
""">]
55+
[<InlineData """
56+
let band = {| Name = "R.E.M." |}
57+
band""">]
58+
let ``Doesn't fix unrelated FS0020`` code =
5859
let expected = None
5960

6061
let actual = codeFix |> tryFix code Auto

vsintegration/tests/FSharp.Editor.Tests/FSharp.Editor.Tests.fsproj

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
<Compile Include="CodeFixes\AddNewKeywordToDisposableConstructorInvocationTests.fs" />
5454
<Compile Include="CodeFixes\RemoveUnusedBindingTests.fs" />
5555
<Compile Include="CodeFixes\RemoveSuperfluousCaptureForUnionCaseWithNoDataTests.fs" />
56+
<Compile Include="CodeFixes\FixIndexerAccessLegacyTests.fs" />
5657
<Compile Include="CodeFixes\FixIndexerAccessTests.fs" />
5758
<Compile Include="CodeFixes\DiscardUnusedValueTests.fs" />
5859
<Compile Include="CodeFixes\PrefixUnusedValueTests.fs" />

0 commit comments

Comments
 (0)