Skip to content

Extend macro protocols with information about the macro types. #1011

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,12 @@ extension CatchClauseSyntax: SyntaxExpressibleByStringInterpolation {

extension PoundAssertStmtSyntax: SyntaxExpressibleByStringInterpolation {}

extension GenericParameterClauseSyntax: SyntaxExpressibleByStringInterpolation {
public static func parse(from parser: inout Parser) -> Self {
return parser.parseGenericParameters().syntax
}
}

extension SimpleTypeIdentifierSyntax: SyntaxExpressibleByStringInterpolation {}

extension MemberTypeIdentifierSyntax: SyntaxExpressibleByStringInterpolation {}
Expand Down
13 changes: 13 additions & 0 deletions Sources/_SwiftSyntaxMacros/Macro.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,22 @@
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import SwiftSyntax

/// Describes a macro.
public protocol Macro {
/// The name of this macro.
static var name: String { get }

/// The generic signature to use when describing the type of this macro.
static var genericSignature: GenericParameterClauseSyntax? { get }

/// The type signature for this macro.
///
/// A function type indicates a function-like macro (such as
/// `#colorLiteral(red: r, green: b, blue: b, alpha: a)`) that takes
/// arguments, whereas any other type indicates a value-like macro (such
/// as `#line`) that does not. This is a syntactic distinction, not a
/// semantic one.
static var signature: TypeSyntax { get }
}
70 changes: 70 additions & 0 deletions Sources/_SwiftSyntaxMacros/MacroSystem+Builtin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ import SwiftSyntaxBuilder
struct ColumnMacro: ExpressionMacro {
static var name: String { "column" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByIntegerLiteral>
"""

static var signature: TypeSyntax = "T"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand All @@ -29,6 +36,13 @@ struct ColumnMacro: ExpressionMacro {
struct LineMacro: ExpressionMacro {
static var name: String { "line" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByIntegerLiteral>
"""

static var signature: TypeSyntax = "T"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand All @@ -54,6 +68,13 @@ extension PatternBindingSyntax {
struct FunctionMacro: ExpressionMacro {
static var name: String { "function" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByStringLiteral>
"""

static var signature: TypeSyntax = "T"

/// Form a function name.
private static func formFunctionName(
_ baseName: String, _ parameters: ParameterClauseSyntax?,
Expand Down Expand Up @@ -159,6 +180,18 @@ struct FunctionMacro: ExpressionMacro {
struct ColorLiteralMacro: ExpressionMacro {
static var name: String { "colorLiteral" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByColorLiteral>
"""

static var signature: TypeSyntax =
"""
(
_colorLiteralRed red: Float, green: Float, blue: Float, alpha: Float
) -> T
"""

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand All @@ -173,6 +206,14 @@ struct ColorLiteralMacro: ExpressionMacro {
struct FileLiteralMacro: ExpressionMacro {
static var name: String { "fileLiteral" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByFileReferenceLiteral>
"""

static var signature: TypeSyntax =
"(fileReferenceLiteralResourceName path: String) -> T"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand All @@ -187,6 +228,14 @@ struct FileLiteralMacro: ExpressionMacro {
struct ImageLiteralMacro: ExpressionMacro {
static var name: String { "imageLiteral" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByImageLiteral>
"""

static var signature: TypeSyntax =
"(imageLiteralResourceName path: String) -> T"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand All @@ -201,6 +250,13 @@ struct ImageLiteralMacro: ExpressionMacro {
struct FilePathMacro: ExpressionMacro {
static var name: String { "filePath" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByStringLiteral>
"""

static var signature: TypeSyntax = "T"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand All @@ -218,6 +274,13 @@ struct FilePathMacro: ExpressionMacro {
struct FileIDMacro: ExpressionMacro {
static var name: String { "fileID" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByStringLiteral>
"""

static var signature: TypeSyntax = "T"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand All @@ -241,6 +304,13 @@ struct FileIDMacro: ExpressionMacro {
struct FileMacro: ExpressionMacro {
static var name: String { "file" }

static var genericSignature: GenericParameterClauseSyntax? =
"""
<T: ExpressibleByStringLiteral>
"""

static var signature: TypeSyntax = "T"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand Down
4 changes: 4 additions & 0 deletions Sources/_SwiftSyntaxMacros/MacroSystem+Examples.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ import SwiftSyntaxBuilder
struct StringifyMacro: ExpressionMacro {
static var name: String { "stringify" }

static var genericSignature: GenericParameterClauseSyntax? = "<T>"

static var signature: TypeSyntax = "(T) -> (T, String)"

static func apply(
_ macro: MacroExpansionExprSyntax, in context: MacroEvaluationContext
) -> MacroResult<ExprSyntax> {
Expand Down
5 changes: 5 additions & 0 deletions Sources/_SwiftSyntaxMacros/MacroSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ public struct MacroSystem {

macros[macro.name] = macro
}

/// Look for a macro with the given name.
public func lookup(_ macroName: String) -> Macro.Type? {
return macros[macroName]
}
}

/// Syntax rewriter that evaluates any macros encountered along the way.
Expand Down
1 change: 1 addition & 0 deletions gyb_syntax_support/GenericNodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@
# generic-parameter-clause -> '<' generic-parameter-list generic-where-clause? '>'
Node('GenericParameterClause', name_for_diagnostics='generic parameter clause',
kind='Syntax',
parser_function='parseGenericParameters',
children=[
Child('LeftAngleBracket', kind='LeftAngleToken'),
Child('GenericParameterList', kind='GenericParameterList',
Expand Down