2024/8/10
laprasdrum.icon 今日はゆっくり過ごす
/icons/hr.icon
Resumable Uploads
これが実現されれば低インターネット速度のスマホ体験も良くなりそう。
フリーランス新法
正式名は「フリーランス・事業者間取引適正化等法」。
企業側が(従業員を有さない)フリーランスに対して待遇をよくさせるための法律が増えた感じ。
続Swift Testingを読み解く
TestContainer という表現も気になる。この中で定義された [Testing.Test]型に当初探し求めていたライフサイクル関連の実装があるのかも?
code:TestDeclarationMacro.swift
private static func _createTestContainerDecls(
for functionDecl: FunctionDeclSyntax,
on typeName: TypeSyntax?,
testAttribute: AttributeSyntax,
in context: some MacroExpansionContext
...
result.append(
"""
@available(*, deprecated, message: "This type is an implementation detail of the testing library. Do not use it directly.")
enum \(enumName): Testing.__TestContainer {
get async {
\(raw: testsBody)
}
}
}
"""
)
return result
}
}
_createTestContainerDeclsの呼び出し元を辿ると、
_createTestContainerDecls
expansion
となる。実装はこちら。
code:TestDeclarationMacro.swift
public struct TestDeclarationMacro: PeerMacro, Sendable {
public static func expansion(
of node: AttributeSyntax,
providingPeersOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext
guard _diagnoseIssues(with: declaration, testAttribute: node, in: context) else {
return []
}
let functionDecl = declaration.cast(FunctionDeclSyntax.self)
let typeName = context.typeOfLexicalContext
return _createTestContainerDecls(for: functionDecl, on: typeName, testAttribute: node, in: context)
}
この関数はTestDeclarationMacroが準拠する PeerMacro Protocol(SwiftSyntax)に定義された関数。 code:PeerMacro.swift
public protocol PeerMacro: AttachedMacro {
/// Expand a macro described by the given custom attribute and
/// attached to the given declaration and evaluated within a
/// particular expansion context.
///
/// The macro expansion can introduce "peer" declarations that sit alongside
/// the given declaration.
static func expansion(
of node: AttributeSyntax,
providingPeersOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext
}
なのでMacro展開時に result が生成されてそのまま使われているということになる。
次回は Testing.Test の実装を読む。