Skip to content

Body Macro formatted despite formatMode disabled #2757

@mateusrodriguesxyz

Description

@mateusrodriguesxyz

Description

First level of nodes in body macro is always formatted even when formatMode is set to disabled.

Steps to Reproduce

Consider the following macro:

public struct SourceLocationMacro: BodyMacro {
    
    public static var formatMode: FormatMode { .disabled }
    
    public static func expansion(of node: AttributeSyntax, providingBodyFor declaration: some DeclSyntaxProtocol & WithOptionalCodeBlockSyntax, in context: some MacroExpansionContext) throws -> [CodeBlockItemSyntax] {
        
        if let statements = declaration.body?.statements {
            var body: [CodeBlockItemSyntax] = []
            statements.forEach { statement in
                if let location = context.location(of: statement, at: .afterLeadingTrivia, filePathMode: .filePath) {
                    let transformed = CodeBlockItemListSyntax {
                        "\n#sourceLocation(file: \(location.file), line: \(location.line))"
                        statement
                        "\n#sourceLocation()"
                    }
                    body.append(contentsOf: transformed)
                }
            }
            return body
        } else {
            return []
        }
        
    }
    
}

Usage example:

@SourceLocationMacro
func f() {
        let x: Int = 1
        ^ Immutable value 'x' was never used; consider replacing with '_' or removing it
}

// Macro Expansion:
{ 
    #sourceLocation(file: "/Users/mateusrodrigues/Desktop/TriviaMacro/Sources/TriviaMacroClient/main.swift", line: 8)
    let x: Int = 1
    #sourceLocation() }()
}

// Expected Macro Expansion:

{ 
#sourceLocation(file: "/Users/mateusrodrigues/Desktop/TriviaMacro/Sources/TriviaMacroClient/main.swift", line: 8)
        let x: Int = 1
#sourceLocation() }()
}

Discussion: https://forums.swift.org/t/body-macro-formatted-despite-formatmode-disabled/73488/3

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions