From 1b86e4b0ba1d797d9002e33212359413839876ee Mon Sep 17 00:00:00 2001 From: MahdiBM Date: Tue, 16 Jul 2024 23:24:09 +0330 Subject: [PATCH] better error handling --- .../EnumeratorMacroType.swift | 7 +++- .../EnumeratorMacroTests.swift | 37 +++++++++++++------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Sources/EnumeratorMacroImpl/EnumeratorMacroType.swift b/Sources/EnumeratorMacroImpl/EnumeratorMacroType.swift index 13934ac..42f0763 100644 --- a/Sources/EnumeratorMacroImpl/EnumeratorMacroType.swift +++ b/Sources/EnumeratorMacroImpl/EnumeratorMacroType.swift @@ -34,7 +34,7 @@ extension EnumeratorMacroType: MemberMacro { if exprList.isEmpty { throw MacroError.expectedAtLeastOneArgument } - let templates = exprList.compactMap { + let templates = exprList.compactMap { element -> (template: String, syntax: StringLiteralExprSyntax)? in guard let stringLiteral = element.expression.as(StringLiteralExprSyntax.self) else { context.diagnose( @@ -45,6 +45,7 @@ extension EnumeratorMacroType: MemberMacro { ) return nil } + var hadBadSegment = false for segment in stringLiteral.segments where !segment.is(StringSegmentSyntax.self) { context.diagnose( Diagnostic( @@ -52,8 +53,10 @@ extension EnumeratorMacroType: MemberMacro { message: MacroError.allArgumentsMustBeNonInterpolatedStringLiterals ) ) - return nil + hadBadSegment = true } + if hadBadSegment { return nil } + let template = stringLiteral.segments.description return (template, stringLiteral) } diff --git a/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift b/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift index fd8b7a5..9e0c9dd 100644 --- a/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift +++ b/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift @@ -425,6 +425,7 @@ final class EnumeratorMacroTests: XCTestCase { {{#cases}} case \(name) {{/cases}} + \(comments) } """) enum TestEnum { @@ -440,18 +441,32 @@ final class EnumeratorMacroTests: XCTestCase { case testCase(testValue: String) } """#, - diagnostics: [.init( - id: .init( - domain: "EnumeratorMacro.MacroError", - id: "allArgumentsMustBeNonInterpolatedStringLiterals" + diagnostics: [ + .init( + id: .init( + domain: "EnumeratorMacro.MacroError", + id: "allArgumentsMustBeNonInterpolatedStringLiterals" + ), + message: """ + All arguments must be non-interpolated string literals. + """, + line: 4, + column: 10, + severity: .error ), - message: """ - All arguments must be non-interpolated string literals. - """, - line: 4, - column: 10, - severity: .error - )], + .init( + id: .init( + domain: "EnumeratorMacro.MacroError", + id: "allArgumentsMustBeNonInterpolatedStringLiterals" + ), + message: """ + All arguments must be non-interpolated string literals. + """, + line: 6, + column: 5, + severity: .error + ) + ], macros: EnumeratorMacroEntryPoint.macros ) }