| // RUN: %target-run-simple-swift |
| // REQUIRES: executable_test |
| // REQUIRES: OS=macosx |
| // REQUIRES: objc_interop |
| |
| import StdlibUnittest |
| import Foundation |
| import SwiftSyntax |
| import SwiftLang |
| |
| func getInput(_ file: String) -> URL { |
| var result = URL(fileURLWithPath: #file) |
| result.deleteLastPathComponent() |
| result.appendPathComponent("Inputs") |
| result.appendPathComponent(file) |
| return result |
| } |
| |
| var VisitorTests = TestSuite("SyntaxVisitor") |
| |
| VisitorTests.test("Basic") { |
| class FuncCounter: SyntaxVisitor { |
| var funcCount = 0 |
| override func visit(_ node: FunctionDeclSyntax) { |
| funcCount += 1 |
| super.visit(node) |
| } |
| } |
| expectDoesNotThrow({ |
| let parsed = try SourceFileSyntax.decodeSourceFileSyntax(try |
| SwiftLang.parse(getInput("visitor.swift"))) |
| let counter = FuncCounter() |
| let hashBefore = parsed.hashValue |
| counter.visit(parsed) |
| expectEqual(counter.funcCount, 3) |
| expectEqual(hashBefore, parsed.hashValue) |
| }) |
| } |
| |
| VisitorTests.test("RewritingNodeWithEmptyChild") { |
| class ClosureRewriter: SyntaxRewriter { |
| override func visit(_ node: ClosureExprSyntax) -> ExprSyntax { |
| // Perform a no-op transform that requires rebuilding the node. |
| return node.withSignature(node.signature) |
| } |
| } |
| expectDoesNotThrow({ |
| let parsed = try SourceFileSyntax.decodeSourceFileSyntax(try |
| SwiftLang.parse(getInput("closure.swift"))) |
| let rewriter = ClosureRewriter() |
| let rewritten = rewriter.visit(parsed) |
| expectEqual(parsed.description, rewritten.description) |
| }) |
| } |
| |
| VisitorTests.test("SyntaxRewriter.visitAny") { |
| class VisitAnyRewriter: SyntaxRewriter { |
| let transform: (TokenSyntax) -> TokenSyntax |
| init(transform: @escaping (TokenSyntax) -> TokenSyntax) { |
| self.transform = transform |
| } |
| override func visitAny(_ node: Syntax) -> Syntax? { |
| if let tok = node as? TokenSyntax { |
| return transform(tok) |
| } |
| return nil |
| } |
| } |
| expectDoesNotThrow({ |
| let parsed = try SourceFileSyntax.decodeSourceFileSyntax(try |
| SwiftLang.parse(getInput("near-empty.swift"))) |
| let rewriter = VisitAnyRewriter(transform: { _ in |
| return SyntaxFactory.makeIdentifier("") |
| }) |
| let rewritten = rewriter.visit(parsed) |
| expectEqual(rewritten.description, "") |
| }) |
| } |
| |
| runAllTests() |