1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#if swift(>=6.0)
public import SwiftSyntax
public import SwiftSyntaxMacroExpansion
public import SwiftSyntaxMacros
@_spi(XCTestFailureLocation) public import SwiftSyntaxMacrosGenericTestSupport
private import XCTest
#else
import SwiftSyntax
import SwiftSyntaxMacroExpansion
import SwiftSyntaxMacros
@_spi(XCTestFailureLocation) import SwiftSyntaxMacrosGenericTestSupport
import XCTest
#endif
// Re-export the spec types from `SwiftSyntaxMacrosGenericTestSupport`.
public typealias NoteSpec = SwiftSyntaxMacrosGenericTestSupport.NoteSpec
public typealias FixItSpec = SwiftSyntaxMacrosGenericTestSupport.FixItSpec
public typealias DiagnosticSpec = SwiftSyntaxMacrosGenericTestSupport.DiagnosticSpec
/// Assert that expanding the given macros in the original source produces
/// the given expanded source code.
///
/// - Parameters:
/// - originalSource: The original source code, which is expected to contain
/// macros in various places (e.g., `#stringify(x + y)`).
/// - expectedExpandedSource: The source code that we expect to see after
/// performing macro expansion on the original source.
/// - diagnostics: The diagnostics when expanding any macro
/// - macros: The macros that should be expanded, provided as a dictionary
/// mapping macro names (e.g., `"stringify"`) to implementation types
/// (e.g., `StringifyMacro.self`).
/// - testModuleName: The name of the test module to use.
/// - testFileName: The name of the test file name to use.
/// - indentationWidth: The indentation width used in the expansion.
///
/// - SeeAlso: ``assertMacroExpansion(_:expandedSource:diagnostics:macroSpecs:applyFixIts:fixedSource:testModuleName:testFileName:indentationWidth:file:line:)``
/// to also specify the list of conformances passed to the macro expansion.
public func assertMacroExpansion(
_ originalSource: String,
expandedSource expectedExpandedSource: String,
diagnostics: [DiagnosticSpec] = [],
macros: [String: Macro.Type],
applyFixIts: [String]? = nil,
fixedSource expectedFixedSource: String? = nil,
testModuleName: String = "TestModule",
testFileName: String = "test.swift",
indentationWidth: Trivia = .spaces(4),
file: StaticString = #filePath,
line: UInt = #line
) {
let specs = macros.mapValues { MacroSpec(type: $0) }
assertMacroExpansion(
originalSource,
expandedSource: expectedExpandedSource,
diagnostics: diagnostics,
macroSpecs: specs,
applyFixIts: applyFixIts,
fixedSource: expectedFixedSource,
testModuleName: testModuleName,
testFileName: testFileName,
indentationWidth: indentationWidth,
file: file,
line: line
)
}
/// Assert that expanding the given macros in the original source produces
/// the given expanded source code.
///
/// - Parameters:
/// - originalSource: The original source code, which is expected to contain
/// macros in various places (e.g., `#stringify(x + y)`).
/// - expectedExpandedSource: The source code that we expect to see after
/// performing macro expansion on the original source.
/// - diagnostics: The diagnostics when expanding any macro
/// - macroSpecs: The macros that should be expanded, provided as a dictionary
/// mapping macro names (e.g., `"CodableMacro"`) to specification with macro type
/// (e.g., `CodableMacro.self`) and a list of conformances macro provides
/// (e.g., `["Decodable", "Encodable"]`).
/// - applyFixIts: If specified, filters the Fix-Its that are applied to generate `fixedSource` to only those whose message occurs in this array. If `nil`, all Fix-Its from the diagnostics are applied.
/// - fixedSource: If specified, asserts that the source code after applying Fix-Its matches this string.
/// - testModuleName: The name of the test module to use.
/// - testFileName: The name of the test file name to use.
/// - indentationWidth: The indentation width used in the expansion.
public func assertMacroExpansion(
_ originalSource: String,
expandedSource expectedExpandedSource: String,
diagnostics: [DiagnosticSpec] = [],
macroSpecs: [String: MacroSpec],
applyFixIts: [String]? = nil,
fixedSource expectedFixedSource: String? = nil,
testModuleName: String = "TestModule",
testFileName: String = "test.swift",
indentationWidth: Trivia = .spaces(4),
file: StaticString = #filePath,
line: UInt = #line
) {
SwiftSyntaxMacrosGenericTestSupport.assertMacroExpansion(
originalSource,
expandedSource: expectedExpandedSource,
diagnostics: diagnostics,
macroSpecs: macroSpecs,
applyFixIts: applyFixIts,
fixedSource: expectedFixedSource,
testModuleName: testModuleName,
testFileName: testFileName,
indentationWidth: indentationWidth,
failureHandler: {
XCTFail($0.message, file: $0.location.staticFilePath, line: $0.location.unsignedLine)
},
fileID: "", // Not used in the failure handler
filePath: file,
line: line,
column: 0 // Not used in the failure handler
)
}
|