Skip to content

Commit c0acfe0

Browse files
committed
implement pull diagnostics for cshtml
1 parent c58230f commit c0acfe0

File tree

3 files changed

+56
-17
lines changed

3 files changed

+56
-17
lines changed

src/CSharpLanguageServer/Handlers/Diagnostic.fs

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ open CSharpLanguageServer.Types
1212
[<RequireQualifiedAccess>]
1313
module Diagnostic =
1414
let provider
15-
(clientCapabilities: ClientCapabilities)
15+
(_cc: ClientCapabilities)
1616
: U2<DiagnosticOptions, DiagnosticRegistrationOptions> option =
1717
let registrationOptions: DiagnosticRegistrationOptions =
1818
{ DocumentSelector = Some defaultDocumentSelector
@@ -35,24 +35,18 @@ module Diagnostic =
3535
Items = [||]
3636
RelatedDocuments = None }
3737

38-
match context.GetDocument p.TextDocument.Uri with
39-
| None -> return emptyReport |> U2.C1 |> LspResult.success
38+
let! semanticModel = context.GetSemanticModel p.TextDocument.Uri
4039

41-
| Some doc ->
42-
let! ct = Async.CancellationToken
43-
let! semanticModelMaybe = doc.GetSemanticModelAsync(ct) |> Async.AwaitTask
44-
45-
match semanticModelMaybe |> Option.ofObj with
40+
let diagnostics =
41+
match semanticModel with
42+
| None -> [||]
4643
| Some semanticModel ->
47-
let diagnostics =
48-
semanticModel.GetDiagnostics()
49-
|> Seq.map Diagnostic.fromRoslynDiagnostic
50-
|> Seq.map fst
51-
|> Array.ofSeq
52-
53-
return { emptyReport with Items = diagnostics } |> U2.C1 |> LspResult.success
44+
semanticModel.GetDiagnostics()
45+
|> Seq.map Diagnostic.fromRoslynDiagnostic
46+
|> Seq.map fst
47+
|> Array.ofSeq
5448

55-
| None -> return emptyReport |> U2.C1 |> LspResult.success
49+
return { emptyReport with Items = diagnostics } |> U2.C1 |> LspResult.success
5650
}
5751

5852
let private getWorkspaceDiagnosticReports

src/CSharpLanguageServer/State/ServerRequestContext.fs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,21 @@ type ServerRequestContext(requestId: int, state: ServerState, emitServerEvent) =
138138
return aggregatedLspLocations
139139
}
140140

141+
member this.GetSemanticModel (uri: DocumentUri) : Async<SemanticModel option> = async {
142+
if uri.EndsWith(".cshtml") then
143+
match! getRazorDocumentForUri state.Solution.Value uri with
144+
| None -> return None
145+
| Some(project, compilation, cshtmlPath, cshtmlTree) ->
146+
return compilation.GetSemanticModel(cshtmlTree) |> Option.ofObj
147+
else
148+
match this.GetDocument uri with
149+
| None -> return None
150+
| Some doc ->
151+
let! ct = Async.CancellationToken
152+
let! semanticModel = doc.GetSemanticModelAsync() |> Async.AwaitTask
153+
return semanticModel |> Option.ofObj
154+
}
155+
141156
member this.FindSymbol' (uri: DocumentUri) (pos: Position) : Async<(ISymbol * Project * Document option) option> = async {
142157
if uri.EndsWith(".cshtml") then
143158
match! getRazorDocumentForUri state.Solution.Value uri with

tests/CSharpLanguageServer.Tests/DiagnosticTests.fs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,37 @@ let testPullDiagnosticsWork () =
116116
Assert.AreEqual(0, report.Items.Length)
117117
| _ -> failwith "U2.C1 is expected"
118118

119-
()
119+
120+
[<Test>]
121+
let testPullDiagnosticsWorkForRazorFiles () =
122+
use client = activateFixture "aspnetProject"
123+
use cshtmlFile = client.Open("Project/Views/Test/Index.cshtml")
124+
125+
let diagnosticParams: DocumentDiagnosticParams =
126+
{ WorkDoneToken = None
127+
PartialResultToken = None
128+
TextDocument = { Uri = cshtmlFile.Uri }
129+
Identifier = None
130+
PreviousResultId = None }
131+
132+
let report0: DocumentDiagnosticReport option =
133+
client.Request("textDocument/diagnostic", diagnosticParams)
134+
135+
match report0 with
136+
| Some(U2.C1 report) ->
137+
Assert.AreEqual("full", report.Kind)
138+
Assert.AreEqual(None, report.ResultId)
139+
Assert.AreEqual(7, report.Items.Length)
140+
141+
let reportItems = report.Items |> Array.sortBy _.Range
142+
143+
let diagnostic0 = reportItems[0]
144+
Assert.AreEqual(7, diagnostic0.Range.Start.Line)
145+
Assert.AreEqual(4, diagnostic0.Range.Start.Character)
146+
Assert.AreEqual(Some DiagnosticSeverity.Warning, diagnostic0.Severity)
147+
Assert.AreEqual("Unnecessary using directive.", diagnostic0.Message)
148+
149+
| _ -> failwith "U2.C1 is expected"
120150

121151

122152
[<Test>]

0 commit comments

Comments
 (0)