跳到正文
cccskills
免费在 GitHub 公开

macro

Use this skill when building procedural macros for Topcoat in Rust. It explains how to preserve parsed syntax in AST nodes, separate parsing from meaning, and keep macro entry points focused on parsing input, expanding valid code, and reporting errors.

中文简介正在准备中。当前显示英语简介。

原文查看原文说明

Always use this skill before writing procedural macros for Topcoat

tokio-rs/topcoat星标 6,234(GitHub 6,234 + cccskills 0)

实测评分 未实测

查看安装方法

适用场景

  • Designing AST nodes for a procedural macro
  • Parsing custom syntax while preserving tokens
  • Organizing a macro entry point and code generation

包含的文件(1)

  • SKILL.md3.0 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

AST nodes

  • Like syn nodes, an AST node is a lossless record of the syntax it matched: every field is pub and holds the tokens as written, spans included. The original source should be reconstructible from the node. Field order does not have to match the source, but spans must be preserved.
  • Parsing validates, it does not interpret. A Parse impl rejects what is not valid syntax and stores everything else verbatim in token fields; it never normalizes, resolves, or drops information on the way in.
  • Semantics are derived from the AST, not baked into it. Put the interpretation in methods on the node that read its own fields, so the node stays a faithful representation of the source and the meaning stays separate from it.

Parsing

  • In Parse impls, parse directly into the Self { ... } fields (Self { x: input.parse()? }) rather than through let bindings. Use a let only when a parsed value must be inspected to decide how to parse a later field.
  • To parse custom keywords that are not re-emitted into the generated code, create a private mod kw with syn::custom_keyword! invocations instead of parsing syn::Ident. Use input.lookahead1() if it makes sense.
  • Instead of manually peeking for optional AST nodes in the input stream at the call site, implement ParseOption and parse them with input.call(Node::parse_option)?.

Entry points

The macro/ crate only bridges proc_macro::TokenStream to the grammar crate that holds the AST and the codegen. Every entry point is a parse, a match, and a to_compile_error() on the error arm; no logic lives in lib.rs.

An attribute macro receives two token streams, so it gets three types: one Parse node per stream and a tuple struct pairing them, which is the node the codegen hangs off.

// grammar crate
pub struct ProcedureAttr {}
pub struct ProcedureItem { ... }

pub struct Procedure(ProcedureAttr, ProcedureItem);

impl Procedure {
    #[must_use]
    pub fn new(attr: ProcedureAttr, item: ProcedureItem) -> Self {
        Self(attr, item)
    }

    pub fn parse(attr: TokenStream, item: TokenStream) -> syn::Result<Self> {
        Ok(Self::new(syn::parse2(attr)?, syn::parse2(item)?))
    }
}

impl ToTokens for Procedure { ... }

Parse stays per stream, since neither stream alone is the macro input. The pairing type owns the inherent parse that joins them and the ToTokens impl that expands them, which keeps the entry point a one-liner:

// macro crate
#[doc = include_str!("../docs/procedure.md")]
#[proc_macro_attribute]
pub fn procedure(attr: TokenStream, item: TokenStream) -> TokenStream {
    match topcoat_runtime_grammar::procedure::Procedure::parse(attr.into(), item.into()) {
        Ok(value) => quote! { #value }.into(),
        Err(error) => error.to_compile_error().into(),
    }
}

A function-like macro has a single input, so it needs no pairing type: syn::parse_macro_input! straight into its AST node, then expand.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

check

免费

Use this skill to check Topcoat changes locally before committing or opening a pull request. It runs the project’s Rust formatting, lint, test, and documentation commands, plus browser project checks when relevant, so problems can be caught before review.

中文简介正在准备中。当前显示英语简介。

  • Checking a Rust change before committing
  • Validating browser project changes
  • Building project documentation locally
tokio-rs/topcoat62342026年10月25日 更新

commit

免费

Use this skill to write concise commit messages in the Topcoat project’s Conventional Commits format. It helps choose a change type and scope, describe the update clearly, and mark breaking changes so release notes and version bumps can be based on commit history.

中文简介正在准备中。当前显示英语简介。

  • Writing a commit message for a code change
  • Choosing a commit type and scope
  • Marking a breaking change and migration note
tokio-rs/topcoat62342026年10月25日 更新

pr

免费

Use this skill to prepare a Topcoat pull request from the full branch diff. It guides you to write a Conventional Commits title and a concise body covering the change, verification performed, and an AI-use disclaimer when an agent creates the PR.

中文简介正在准备中。当前显示英语简介。

  • Writing a pull request title from the net branch change
  • Summarizing a diff and the checks performed
  • Adding the required AI-use disclosure to a PR
tokio-rs/topcoat62342026年10月25日 更新

prose

免费

Use this skill to write long-form Markdown guides for Topcoat. It covers where documentation sources belong, how to structure explanations from basic to advanced, and how to keep prose plain, concise, and easier to maintain as implementations change.

中文简介正在准备中。当前显示英语简介。

  • Planning where a guide and its links should live
  • Structuring a guide from basic to advanced use
  • Editing Markdown for clear, maintainable prose
tokio-rs/topcoat62342026年10月25日 更新

style

免费

Apply the project’s Rust conventions when editing code or documentation. The guidance covers module and type organization, workspace dependency declarations, plain English documentation, and tests that check meaningful behavior rather than fixed text.

中文简介正在准备中。当前显示英语简介。

  • Organizing Rust modules and implementations
  • Writing or revising Rust documentation
  • Reviewing whether a test protects real behavior
tokio-rs/topcoat62342026年10月25日 更新

查看 tokio-rs 的全部技能

报告此技能的问题