From 59161f272456cd70af1f21b623785a1a69612e1c Mon Sep 17 00:00:00 2001 From: John Sundell Date: Sat, 9 Mar 2019 13:12:23 +0100 Subject: [PATCH] Support function argument pre-processors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change adds support for three pre-processors that can appear in function delcarations: `#file`, `#line` and `#function`. They’re not highlighted as pre-processors, but rather as keywords, to match the way Xcode treats them. --- Sources/Splash/Grammar/SwiftGrammar.swift | 2 +- .../SplashTests/Tests/DeclarationTests.swift | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Sources/Splash/Grammar/SwiftGrammar.swift b/Sources/Splash/Grammar/SwiftGrammar.swift index 3fecf9c..c700a4c 100644 --- a/Sources/Splash/Grammar/SwiftGrammar.swift +++ b/Sources/Splash/Grammar/SwiftGrammar.swift @@ -48,7 +48,7 @@ private extension SwiftGrammar { "#selector", "required", "willSet", "didSet", "lazy", "subscript", "defer", "inout", "while", "continue", "fallthrough", "repeat", "indirect", - "deinit", "is" + "deinit", "is", "#file", "#line", "#function" ] as Set).union(accessControlKeywords) static let accessControlKeywords: Set = [ diff --git a/Tests/SplashTests/Tests/DeclarationTests.swift b/Tests/SplashTests/Tests/DeclarationTests.swift index bdaa9a6..62444c4 100644 --- a/Tests/SplashTests/Tests/DeclarationTests.swift +++ b/Tests/SplashTests/Tests/DeclarationTests.swift @@ -656,6 +656,41 @@ final class DeclarationTests: SyntaxHighlighterTestCase { ]) } + func testFunctionDeclarationWithPreProcessors() { + let components = highlighter.highlight(""" + func log(_ file: StaticString = #file, _ function: StaticString = #function) {} + """) + + XCTAssertEqual(components, [ + .token("func", .keyword), + .whitespace(" "), + .plainText("log("), + .token("_", .keyword), + .whitespace(" "), + .plainText("file:"), + .whitespace(" "), + .token("StaticString", .type), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("#file", .keyword), + .plainText(","), + .whitespace(" "), + .token("_", .keyword), + .whitespace(" "), + .plainText("function:"), + .whitespace(" "), + .token("StaticString", .type), + .whitespace(" "), + .plainText("="), + .whitespace(" "), + .token("#function", .keyword), + .plainText(")"), + .whitespace(" "), + .plainText("{}") + ]) + } + func testIndirectEnumDeclaration() { let components = highlighter.highlight(""" indirect enum Content { @@ -725,6 +760,7 @@ extension DeclarationTests { ("testFunctionDeclarationWithInOutParameter", testFunctionDeclarationWithInOutParameter), ("testFunctionDeclarationWithNonEscapedKeywordAsName", testFunctionDeclarationWithNonEscapedKeywordAsName), ("testFunctionDeclarationWithEscapedKeywordAsName", testFunctionDeclarationWithEscapedKeywordAsName), + ("testFunctionDeclarationWithPreProcessors", testFunctionDeclarationWithPreProcessors), ("testIndirectEnumDeclaration", testIndirectEnumDeclaration) ] }