13
13
//===----------------------------------------------------------------------===//
14
14
15
15
import * as assert from "assert" ;
16
- import * as langclient from "vscode-languageclient/node" ;
17
16
import * as vscode from "vscode" ;
18
17
import { SwiftToolchain } from "../../src/toolchain/toolchain" ;
19
18
import { executeTaskAndWaitForResult , waitForNoRunningTasks } from "../utilities/tasks" ;
20
19
import { WorkspaceContext } from "../../src/WorkspaceContext" ;
21
- import { testAssetUri , testAssetWorkspaceFolder , testSwiftTask } from "../fixtures" ;
20
+ import { testAssetUri , testSwiftTask } from "../fixtures" ;
22
21
import { createBuildAllTask } from "../../src/tasks/SwiftTaskProvider" ;
23
22
import { DiagnosticsManager } from "../../src/DiagnosticsManager" ;
24
23
import { FolderContext } from "../../src/FolderContext" ;
25
24
import { Version } from "../../src/utilities/version" ;
26
- import { Workbench } from "../../src/utilities/commands" ;
27
25
import {
28
26
activateExtensionForSuite ,
29
- buildProject ,
30
27
folderInRootWorkspace ,
31
28
updateSettings ,
32
29
} from "./utilities/testutilities" ;
33
30
import { DiagnosticStyle } from "../../src/configuration" ;
34
31
import { expect } from "chai" ;
35
- import { touchDocument , waitForClientState , waitForIndex } from "./utilities/lsputilities" ;
36
32
37
33
const isEqual = ( d1 : vscode . Diagnostic , d2 : vscode . Diagnostic ) => {
38
34
return (
@@ -75,7 +71,6 @@ suite.only("DiagnosticsManager Test Suite", function () {
75
71
let cFolderContext : FolderContext ;
76
72
let cppFolderContext : FolderContext ;
77
73
let toolchain : SwiftToolchain ;
78
- let workspaceFolder : vscode . WorkspaceFolder ;
79
74
80
75
let mainUri : vscode . Uri ;
81
76
let funcUri : vscode . Uri ;
@@ -135,7 +130,6 @@ suite.only("DiagnosticsManager Test Suite", function () {
135
130
136
131
workspaceContext = ctx ;
137
132
toolchain = workspaceContext . globalToolchain ;
138
- workspaceFolder = testAssetWorkspaceFolder ( "diagnostics" ) ;
139
133
folderContext = await folderInRootWorkspace ( "diagnostics" , workspaceContext ) ;
140
134
cFolderContext = await folderInRootWorkspace ( "diagnosticsC" , workspaceContext ) ;
141
135
cppFolderContext = await folderInRootWorkspace ( "diagnosticsCpp" , workspaceContext ) ;
@@ -243,7 +237,7 @@ suite.only("DiagnosticsManager Test Suite", function () {
243
237
) {
244
238
this . skip ( ) ;
245
239
}
246
- this . timeout ( 3 * 60 * 1000 ) ; // Allow 3 minutes to build
240
+ this . timeout ( 5 * 60 * 1000 ) ; // Allow 5 minutes to build
247
241
248
242
// Clean up any lingering diagnostics
249
243
workspaceContext . diagnostics . clear ( ) ;
@@ -433,10 +427,12 @@ suite.only("DiagnosticsManager Test Suite", function () {
433
427
vscode . DiagnosticSeverity . Error
434
428
) ;
435
429
outputDiagnostic . source = "swiftc" ;
430
+ let workspaceFolder : vscode . WorkspaceFolder ;
436
431
437
432
setup ( async ( ) => {
438
433
await waitForNoRunningTasks ( ) ;
439
434
workspaceContext . diagnostics . clear ( ) ;
435
+ workspaceFolder = folderContext . workspaceFolder ;
440
436
} ) ;
441
437
442
438
test ( "Parse partial line" , async ( ) => {
@@ -517,6 +513,8 @@ suite.only("DiagnosticsManager Test Suite", function () {
517
513
let sourcekitErrorDiagnostic : vscode . Diagnostic ;
518
514
let sourcekitWarningDiagnostic : vscode . Diagnostic ;
519
515
let sourcekitLowercaseDiagnostic : vscode . Diagnostic ;
516
+ let clangErrorDiagnostic : vscode . Diagnostic ;
517
+ let swiftcClangErrorDiagnostic : vscode . Diagnostic ;
520
518
521
519
setup ( async ( ) => {
522
520
workspaceContext . diagnostics . clear ( ) ;
@@ -556,6 +554,19 @@ suite.only("DiagnosticsManager Test Suite", function () {
556
554
vscode . DiagnosticSeverity . Warning
557
555
) ;
558
556
sourcekitWarningDiagnostic . source = "SourceKit" ;
557
+
558
+ clangErrorDiagnostic = new vscode . Diagnostic (
559
+ new vscode . Range ( new vscode . Position ( 5 , 10 ) , new vscode . Position ( 5 , 13 ) ) ,
560
+ "Use of undeclared identifier 'bar'" ,
561
+ vscode . DiagnosticSeverity . Error
562
+ ) ;
563
+ clangErrorDiagnostic . source = "clang" ; // Set by LSP
564
+ swiftcClangErrorDiagnostic = new vscode . Diagnostic (
565
+ new vscode . Range ( new vscode . Position ( 5 , 10 ) , new vscode . Position ( 5 , 13 ) ) ,
566
+ "Use of undeclared identifier 'bar'" ,
567
+ vscode . DiagnosticSeverity . Error
568
+ ) ;
569
+ swiftcClangErrorDiagnostic . source = "swiftc" ;
559
570
} ) ;
560
571
561
572
suite ( "markdownLinks" , ( ) => {
@@ -704,6 +715,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
704
715
assertHasDiagnostic ( mainUri , swiftcWarningDiagnostic ) ;
705
716
} ) ;
706
717
718
+ test ( "merge in clangd diagnostics" , async ( ) => {
719
+ // Add initial swiftc diagnostics
720
+ workspaceContext . diagnostics . handleDiagnostics ( cUri , DiagnosticsManager . isSwiftc , [
721
+ swiftcClangErrorDiagnostic ,
722
+ ] ) ;
723
+
724
+ // Now provide identical clangd diagnostic
725
+ workspaceContext . diagnostics . handleDiagnostics (
726
+ cUri ,
727
+ DiagnosticsManager . isSourcekit ,
728
+ [ clangErrorDiagnostic ]
729
+ ) ;
730
+
731
+ // check clangd merged in
732
+ assertHasDiagnostic ( cUri , clangErrorDiagnostic ) ;
733
+ // check swiftc merged in
734
+ assertHasDiagnostic ( cUri , swiftcClangErrorDiagnostic ) ;
735
+ } ) ;
736
+
707
737
test ( "merge in swiftc diagnostics" , async ( ) => {
708
738
// Add initial SourceKit diagnostics
709
739
workspaceContext . diagnostics . handleDiagnostics (
@@ -788,6 +818,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
788
818
assertHasDiagnostic ( mainUri , swiftcWarningDiagnostic ) ;
789
819
} ) ;
790
820
821
+ test ( "merge in clangd diagnostics" , async ( ) => {
822
+ // Add initial swiftc diagnostics
823
+ workspaceContext . diagnostics . handleDiagnostics ( cUri , DiagnosticsManager . isSwiftc , [
824
+ swiftcClangErrorDiagnostic ,
825
+ ] ) ;
826
+
827
+ // Now provide identical clangd diagnostic
828
+ workspaceContext . diagnostics . handleDiagnostics (
829
+ cUri ,
830
+ DiagnosticsManager . isSourcekit ,
831
+ [ clangErrorDiagnostic ]
832
+ ) ;
833
+
834
+ // check clangd merged in
835
+ assertHasDiagnostic ( cUri , clangErrorDiagnostic ) ;
836
+ // swiftc deduplicated
837
+ assertWithoutDiagnostic ( cUri , swiftcClangErrorDiagnostic ) ;
838
+ } ) ;
839
+
791
840
test ( "merge in swiftc diagnostics" , async ( ) => {
792
841
// Add initial SourceKit diagnostic
793
842
workspaceContext . diagnostics . handleDiagnostics (
@@ -886,6 +935,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
886
935
assertHasDiagnostic ( mainUri , sourcekitWarningDiagnostic ) ;
887
936
} ) ;
888
937
938
+ test ( "merge in clangd diagnostics" , async ( ) => {
939
+ // Add initial swiftc diagnostics
940
+ workspaceContext . diagnostics . handleDiagnostics ( cUri , DiagnosticsManager . isSwiftc , [
941
+ swiftcClangErrorDiagnostic ,
942
+ ] ) ;
943
+
944
+ // Now provide identical clangd diagnostic
945
+ workspaceContext . diagnostics . handleDiagnostics (
946
+ cUri ,
947
+ DiagnosticsManager . isSourcekit ,
948
+ [ clangErrorDiagnostic ]
949
+ ) ;
950
+
951
+ // check swiftc stayed in
952
+ assertHasDiagnostic ( cUri , swiftcClangErrorDiagnostic ) ;
953
+ // clangd ignored
954
+ assertWithoutDiagnostic ( cUri , clangErrorDiagnostic ) ;
955
+ } ) ;
956
+
889
957
test ( "merge in SourceKit diagnostics" , async ( ) => {
890
958
// Add initial swiftc diagnostic
891
959
workspaceContext . diagnostics . handleDiagnostics (
@@ -983,6 +1051,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
983
1051
assertWithoutDiagnostic ( mainUri , swiftcWarningDiagnostic ) ;
984
1052
} ) ;
985
1053
1054
+ test ( "merge in clangd diagnostics" , async ( ) => {
1055
+ // Provide clangd diagnostic
1056
+ workspaceContext . diagnostics . handleDiagnostics (
1057
+ cUri ,
1058
+ DiagnosticsManager . isSourcekit ,
1059
+ [ clangErrorDiagnostic ]
1060
+ ) ;
1061
+
1062
+ // Add identical swiftc diagnostic
1063
+ workspaceContext . diagnostics . handleDiagnostics ( cUri , DiagnosticsManager . isSwiftc , [
1064
+ swiftcClangErrorDiagnostic ,
1065
+ ] ) ;
1066
+
1067
+ // check clangd merged in
1068
+ assertHasDiagnostic ( cUri , clangErrorDiagnostic ) ;
1069
+ // swiftc ignored
1070
+ assertWithoutDiagnostic ( cUri , swiftcClangErrorDiagnostic ) ;
1071
+ } ) ;
1072
+
986
1073
test ( "ignore swiftc diagnostics" , async ( ) => {
987
1074
// Provide swiftc diagnostics
988
1075
workspaceContext . diagnostics . handleDiagnostics (
@@ -1067,6 +1154,25 @@ suite.only("DiagnosticsManager Test Suite", function () {
1067
1154
assertWithoutDiagnostic ( mainUri , sourcekitWarningDiagnostic ) ;
1068
1155
} ) ;
1069
1156
1157
+ test ( "ignore clangd diagnostics" , async ( ) => {
1158
+ // Add initial swiftc diagnostics
1159
+ workspaceContext . diagnostics . handleDiagnostics ( cUri , DiagnosticsManager . isSwiftc , [
1160
+ swiftcClangErrorDiagnostic ,
1161
+ ] ) ;
1162
+
1163
+ // Now provide identical clangd diagnostic
1164
+ workspaceContext . diagnostics . handleDiagnostics (
1165
+ cUri ,
1166
+ DiagnosticsManager . isSourcekit ,
1167
+ [ clangErrorDiagnostic ]
1168
+ ) ;
1169
+
1170
+ // check swiftc stayed in
1171
+ assertHasDiagnostic ( cUri , swiftcClangErrorDiagnostic ) ;
1172
+ // clangd ignored
1173
+ assertWithoutDiagnostic ( cUri , clangErrorDiagnostic ) ;
1174
+ } ) ;
1175
+
1070
1176
test ( "clean old SourceKit diagnostics" , async ( ) => {
1071
1177
// Add initial SourceKit diagnostics
1072
1178
workspaceContext . diagnostics . allDiagnostics . set ( mainUri . fsPath , [
@@ -1156,6 +1262,29 @@ suite.only("DiagnosticsManager Test Suite", function () {
1156
1262
assertHasDiagnostic ( mainUri , swiftcWarningDiagnostic ) ;
1157
1263
} ) ;
1158
1264
1265
+ test ( "clangd removes swiftc diagnostic (swiftc shows first)" , async ( ) => {
1266
+ // Add initial diagnostics
1267
+ workspaceContext . diagnostics . handleDiagnostics ( cUri , DiagnosticsManager . isSwiftc , [
1268
+ swiftcClangErrorDiagnostic ,
1269
+ ] ) ;
1270
+ workspaceContext . diagnostics . handleDiagnostics (
1271
+ cUri ,
1272
+ DiagnosticsManager . isSourcekit ,
1273
+ [ clangErrorDiagnostic ]
1274
+ ) ;
1275
+
1276
+ // Have clangd indicate has been fixed
1277
+ workspaceContext . diagnostics . handleDiagnostics (
1278
+ cUri ,
1279
+ DiagnosticsManager . isSourcekit ,
1280
+ [ ]
1281
+ ) ;
1282
+
1283
+ // check cleaned up stale error
1284
+ assertWithoutDiagnostic ( cUri , clangErrorDiagnostic ) ;
1285
+ assertWithoutDiagnostic ( cUri , swiftcClangErrorDiagnostic ) ;
1286
+ } ) ;
1287
+
1159
1288
test ( "don't remove swiftc diagnostics when SourceKit never matched" , async ( ) => {
1160
1289
workspaceContext . diagnostics . handleDiagnostics (
1161
1290
mainUri ,
@@ -1175,107 +1304,4 @@ suite.only("DiagnosticsManager Test Suite", function () {
1175
1304
} ) ;
1176
1305
} ) ;
1177
1306
} ) ;
1178
-
1179
- // Skipped until we enable it in a nightly build
1180
- suite ( "SourceKit-LSP diagnostics @slow" , ( ) => {
1181
- let resetSettings : ( ( ) => Promise < void > ) | undefined ;
1182
- suiteTeardown ( async ( ) => {
1183
- if ( resetSettings ) {
1184
- await resetSettings ( ) ;
1185
- resetSettings = undefined ;
1186
- }
1187
- } ) ;
1188
-
1189
- suiteSetup ( async function ( ) {
1190
- if ( workspaceContext . globalToolchainSwiftVersion . isLessThan ( new Version ( 6 , 0 , 0 ) ) ) {
1191
- // need to waitForIndex
1192
- this . skip ( ) ;
1193
- return ;
1194
- }
1195
- resetSettings = await updateSettings ( {
1196
- "swift.diagnosticsCollection" : "onlySourceKit" , // So waitForDiagnostics only resolves from LSP
1197
- } ) ;
1198
- } ) ;
1199
-
1200
- teardown ( async ( ) => {
1201
- await vscode . commands . executeCommand ( Workbench . ACTION_CLOSEALLEDITORS ) ;
1202
- } ) ;
1203
-
1204
- async function triggerFileDiagnostics ( uri : vscode . Uri , folder : FolderContext ) {
1205
- const clientManager = workspaceContext . languageClientManager . get ( folder ) ;
1206
- await waitForClientState ( clientManager , langclient . State . Running ) ;
1207
- await vscode . window . showTextDocument ( uri ) ;
1208
- await new Promise ( r => setTimeout ( r , 2000 ) ) ;
1209
- await touchDocument ( clientManager , uri ) ;
1210
- await waitForIndex ( clientManager , folder . swiftVersion ) ;
1211
- }
1212
-
1213
- suite ( "swift" , ( ) => {
1214
- setup ( async function ( ) {
1215
- this . timeout ( 3 * 60 * 1000 ) ; // Allow 3 minutes to build
1216
- await buildProject ( workspaceContext , "diagnostics" , true ) ;
1217
- } ) ;
1218
-
1219
- test ( "Provides diagnostics" , async ( ) => {
1220
- const lspSource = toolchain . swiftVersion . isGreaterThanOrEqual ( new Version ( 6 , 0 , 0 ) )
1221
- ? "SourceKit"
1222
- : "sourcekitd" ;
1223
-
1224
- // Include warning
1225
- const expectedDiagnostic1 = new vscode . Diagnostic (
1226
- new vscode . Range ( new vscode . Position ( 1 , 8 ) , new vscode . Position ( 1 , 8 ) ) ,
1227
- "Initialization of variable 'unused' was never used; consider replacing with assignment to '_' or removing it" ,
1228
- vscode . DiagnosticSeverity . Warning
1229
- ) ;
1230
- expectedDiagnostic1 . source = lspSource ; // Set by LSP
1231
-
1232
- // Include error
1233
- const expectedDiagnostic2 = new vscode . Diagnostic (
1234
- new vscode . Range ( new vscode . Position ( 7 , 0 ) , new vscode . Position ( 7 , 3 ) ) ,
1235
- "Cannot assign to value: 'bar' is a 'let' constant" ,
1236
- vscode . DiagnosticSeverity . Error
1237
- ) ;
1238
- expectedDiagnostic2 . source = lspSource ; // Set by LSP
1239
-
1240
- const promise = waitForDiagnostics ( {
1241
- [ mainUri . fsPath ] : [ expectedDiagnostic1 , expectedDiagnostic2 ] ,
1242
- } ) ;
1243
- // Retrigger diagnostics
1244
- await triggerFileDiagnostics ( mainUri , folderContext ) ;
1245
- await promise ;
1246
- } ) ;
1247
- } ) ;
1248
-
1249
- suite ( "clang" , async ( ) => {
1250
- setup ( async function ( ) {
1251
- this . timeout ( 3 * 60 * 1000 ) ; // Allow 3 minutes to build
1252
- await buildProject ( workspaceContext , "diagnosticsC" , true ) ;
1253
- } ) ;
1254
-
1255
- test ( "Provides diagnostics" , async ( ) => {
1256
- // No string manipulation
1257
- const expectedDiagnostic1 = new vscode . Diagnostic (
1258
- new vscode . Range ( new vscode . Position ( 5 , 10 ) , new vscode . Position ( 5 , 13 ) ) ,
1259
- "Use of undeclared identifier 'bar'" ,
1260
- vscode . DiagnosticSeverity . Error
1261
- ) ;
1262
- expectedDiagnostic1 . source = "clang" ; // Set by LSP
1263
-
1264
- // Remove "(fix available)" from string from SourceKit
1265
- const expectedDiagnostic2 = new vscode . Diagnostic (
1266
- new vscode . Range ( new vscode . Position ( 7 , 4 ) , new vscode . Position ( 7 , 10 ) ) ,
1267
- "Expected ';' after expression" ,
1268
- vscode . DiagnosticSeverity . Error
1269
- ) ;
1270
- expectedDiagnostic2 . source = "clang" ; // Set by LSP
1271
-
1272
- const promise = waitForDiagnostics ( {
1273
- [ cUri . fsPath ] : [ expectedDiagnostic1 , expectedDiagnostic2 ] ,
1274
- } ) ;
1275
- // Retrigger diagnostics
1276
- await triggerFileDiagnostics ( cUri , cFolderContext ) ;
1277
- await promise ;
1278
- } ) ;
1279
- } ) ;
1280
- } ) ;
1281
1307
} ) ;
0 commit comments