From 7734133cd1fc4f84d73cc78b2f0351b227470e39 Mon Sep 17 00:00:00 2001 From: Paul LeMarquand Date: Wed, 1 May 2024 11:38:50 -0400 Subject: [PATCH 1/3] Filter backticks in TestItem IDs Backticks in TestItem IDs should be sanitized. Use the new TokenSyntax.identifier when building up the TestItem IDs. --- .../SupportTypes/TestItem.swift | 2 +- .../Swift/SwiftTestingScanner.swift | 28 ++++++--- .../DocumentTestDiscoveryTests.swift | 61 +++++++++++++++++++ 3 files changed, 82 insertions(+), 9 deletions(-) diff --git a/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift b/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift index a764dabc6..2b6040d66 100644 --- a/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift +++ b/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift @@ -68,7 +68,7 @@ public struct TestItem: ResponseType, Equatable { tags: [TestTag] ) { self.id = id - self.label = label + self.label = id == label ? self.id : label self.description = description self.sortText = sortText self.disabled = disabled diff --git a/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift b/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift index 31f640fef..c5d731f28 100644 --- a/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift +++ b/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift @@ -269,15 +269,24 @@ final class SyntacticSwiftTestingTestScanner: SyntaxVisitor { } override func visit(_ node: ActorDeclSyntax) -> SyntaxVisitorContinueKind { - return visitTypeOrExtensionDecl(node, typeNames: [node.name.text]) + guard let identifier = node.name.identifier else { + return .skipChildren + } + return visitTypeOrExtensionDecl(node, typeNames: [identifier.name]) } override func visit(_ node: ClassDeclSyntax) -> SyntaxVisitorContinueKind { - return visitTypeOrExtensionDecl(node, typeNames: [node.name.text]) + guard let identifier = node.name.identifier else { + return .skipChildren + } + return visitTypeOrExtensionDecl(node, typeNames: [identifier.name]) } override func visit(_ node: EnumDeclSyntax) -> SyntaxVisitorContinueKind { - return visitTypeOrExtensionDecl(node, typeNames: [node.name.text]) + guard let identifier = node.name.identifier else { + return .skipChildren + } + return visitTypeOrExtensionDecl(node, typeNames: [identifier.name]) } override func visit(_ node: ExtensionDeclSyntax) -> SyntaxVisitorContinueKind { @@ -289,7 +298,10 @@ final class SyntacticSwiftTestingTestScanner: SyntaxVisitor { } override func visit(_ node: StructDeclSyntax) -> SyntaxVisitorContinueKind { - return visitTypeOrExtensionDecl(node, typeNames: [node.name.text]) + guard let identifier = node.name.identifier else { + return .skipChildren + } + return visitTypeOrExtensionDecl(node, typeNames: [identifier.name]) } override func visit(_ node: FunctionDeclSyntax) -> SyntaxVisitorContinueKind { @@ -297,7 +309,7 @@ final class SyntacticSwiftTestingTestScanner: SyntaxVisitor { .compactMap { $0.as(AttributeSyntax.self) } .first { $0.isNamed("Test", inModuleNamed: "Testing") } - guard let testAttribute else { + guard let testAttribute, let identifier = node.name.identifier else { return .skipChildren } let attributeData = TestingAttributeData(attribute: testAttribute) @@ -306,7 +318,7 @@ final class SyntacticSwiftTestingTestScanner: SyntaxVisitor { } let name = - node.name.text + "(" + node.signature.parameterClause.parameters.map { "\($0.firstName.text):" }.joined() + ")" + identifier.name + "(" + node.signature.parameterClause.parameters.map { "\($0.firstName.identifier?.name ?? $0.firstName.text):" }.joined() + ")" let range = snapshot.absolutePositionRange( of: node.positionAfterSkippingLeadingTrivia.. Date: Mon, 3 Jun 2024 13:27:39 -0400 Subject: [PATCH 2/3] Cleanup unnecessary code --- Sources/LanguageServerProtocol/SupportTypes/TestItem.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift b/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift index 2b6040d66..a764dabc6 100644 --- a/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift +++ b/Sources/LanguageServerProtocol/SupportTypes/TestItem.swift @@ -68,7 +68,7 @@ public struct TestItem: ResponseType, Equatable { tags: [TestTag] ) { self.id = id - self.label = id == label ? self.id : label + self.label = label self.description = description self.sortText = sortText self.disabled = disabled From c79f7dc9a7df48e72ba4dd2fce0003fd385cb07c Mon Sep 17 00:00:00 2001 From: Paul LeMarquand Date: Mon, 3 Jun 2024 15:35:45 -0400 Subject: [PATCH 3/3] Fix lint error --- Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift b/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift index c5d731f28..c2d33835c 100644 --- a/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift +++ b/Sources/SourceKitLSP/Swift/SwiftTestingScanner.swift @@ -317,8 +317,10 @@ final class SyntacticSwiftTestingTestScanner: SyntaxVisitor { return .skipChildren } - let name = - identifier.name + "(" + node.signature.parameterClause.parameters.map { "\($0.firstName.identifier?.name ?? $0.firstName.text):" }.joined() + ")" + let parameters = node.signature.parameterClause.parameters.map { + "\($0.firstName.identifier?.name ?? $0.firstName.text):" + }.joined() + let name = "\(identifier.name)(\(parameters))" let range = snapshot.absolutePositionRange( of: node.positionAfterSkippingLeadingTrivia..