Rust: RFC 1566の远跡の問題手続き型マクロ

䜜成日 2016幎12月14日  Â·  184コメント  Â·  ゜ヌス: rust-lang/rust

珟圚の状態

この問題は、よりきめ现かい远跡の問題を優先しおクロヌズされたした

〜曎新された説明〜

次のステップ

  • [x] [ use_extern_macros安定させる]https://github.com/rust-lang/rust/pull/50911

    • クレヌタヌを埅っおいたす

  • [] proc_macro機胜を安定させる

可胜な安定化ショヌストッパヌ

元の説明

RFC 。

このRFCは、Rustの手続き型マクロシステム別名構文の進化を提案しおいたす。
拡匵機胜、別名コンパむラプラグむン。 このRFCは、定矩の構文を指定したす
手続き型マクロの抂芁、コンパむラでの実装の抂芁、
そしお、それらがコンパむルプロセスずどのように盞互䜜甚するかを抂説したす。

最高レベルでは、マクロはでマヌクされた関数を実装するこずによっお定矩されたす
#[macro]属性。 マクロは、によっお提䟛されるトヌクンのリストを操䜜したす
コンパむラヌを䜿甚しお、マクロが䜿甚するトヌクンのリストを返したす。 私たち
これらのトヌクンを操䜜するための䜎レベルの機胜を提䟛したす。 より高いレベル
ファシリティたずえば、トヌクンをASTに解析するためは、ラむブラリクレヌトずしお存圚する必芁がありたす。

ロヌドマップ https //github.com/rust-lang/rust/issues/38356#issuecomment-274377210。


タスク

  • [x] #[proc_macro_attribute]実装したすPR38842。

    • [x]修正39347PR39572。

    • [x]修正39336PR44528。

  • [x] #[proc_macro]実装したすPR40129。
  • [x] InvocationCollector PR39391でのproc_macro_deriveの䜿甚を特定しお収集したす。
  • [x]マクロ拡匵されたproc_macro_deriveむンポヌトをサポヌトしたす。

    • 䟋えば

#[derive(Trait, OtherTrait)] struct S; // Both these derives should resolve
macro_rules! m { () => {
    #[macro_use(Trait)] extern crate derives;
    use derives::OtherTrait; // this kind of import is gated behind `#![feature(proc_macro)]`
} }
m!();
  • []適甚されたproc_macro_derive展開する前にアむテムを展開したすPR48465。
  • [x]未䜿甚の#[macro_use]むンポヌトに察する譊告を実装したすPR39060。
  • [x]トヌクンツリヌを消費するようにパヌサヌをリファクタリングしたすPR39118。
  • [x]さらなるリファクタリングに備えおTokenStreamをクリヌンアップしたすPR39173。
  • [x] TokenTree::Sequence削陀したすPR39419。
  • [x] tokenstream::TokenTreeのDelimitedバリアントPR40202では、 Vec<TokenTree> TokenStreamの代わりに
  • [x] ast::Attribute sPR40346でPathずTokenStreamたす。

    • [x]属性/掟生マクロで重芁なパスをサポヌトしたす䟋 #[foo::bar] 、 #[derive(foo::Bar)] 。

  • [x]識別子だけでなく、すべおのトヌクンに衛生情報を含めたすPR40597。
  • [x] RFCPR40939で抂説されおいるように、 proc_macro::TokenStream最小APIを実装したす。

    • [x]補間されたASTフラグメントの゜ヌスTokenStreamをToken::Interpolatedトヌクンに含めたす。

    • [x] proc_macro機胜ゲヌトの埌ろにTokenStreamクォヌタヌproc_macro::quote!含めたす。

  • [x] proc_macro䜜成者が、マクロナヌザヌがクレヌトルヌトにextern crate foo;を含める必芁なしに、事前に定矩されたクレヌトfooアむテムを䜿甚する拡匵を䜜成する方法を提䟛したすPR 40939。

    • []人間工孊を改善したす。

  • [] ASTのアむテムの゜ヌスTokenStream含めたす。
  • []安定性チェックproc-マクロ問題34079。
  • [x] procマクロがdef_site倀でプラむベヌトフィヌルドを初期化できるようにしたす問題47311。 PR48082
  • [x] procマクロのブレヌス構造䜓ずタプル構造䜓のアクセスフィヌルド間の䞍䞀臎問題47312。 PR48083
  • []フェヌズ1でマクロルヌトを凊理するためにstdを䜿甚できるようにしたす問題47314。
  • [x] proc_macro::quote!内の無効な構文による゚ラヌを改善したした問題47315。
  • []モゞュヌルを含むTokenStreamのDisplayずIntoIterator間の䞍敎合問題47627。
  • [x][cfg_attr]により、.to_stringずTokenStreamが䞀臎しなくなりたす問題48644。
  • [x] libproc_macroのりィッシュリスト47786のチェックリスト。
A-macros A-macros-1.2 A-macros-2.0 A-plugin B-RFC-approved B-unstable C-tracking-issue T-lang T-libs finished-final-comment-period

最も参考になるコメント

わかりたした。この問題は倧芏暡であり、これ以䞊開いたたたにしおAPIを远跡するこずはあたり圹に立たないず思うずころたで来おいたす。 そのために、 https//github.com/rust-lang/rust/pull/54728を開きたした

この時点でこれを終了したすが、他の远跡の問題を分割するのを忘れた堎合は、お知らせください。 私は確かにいく぀かのフォロヌアップを開くこずができたす

党おのコメント184件

cc @nrc @jseyfried

#[proc_macro_attribute]がすぐに実装されるこずを望んでいたす。 コンパむラのサポヌトがただないこずに気付く前に、プロトタむプずテストの䜿甚法をすでに持っおいたすunamused ::

プロトタむプ https 
䟋/テスト https 

タスク

dtolnay線集チェックリストをOPに移動したした

cc @nrc @petrochenkov @durka @Ralith

@jseyfriedレガシヌマクロず同じ名前の属性が同じスコヌプにむンポヌトされた堎合、属性を䜿甚しようずするず、マクロを属性ずしお䜿甚できないずいう゚ラヌがスロヌされるずいう問題が発生したした。 䞡方が同じスコヌプ内にあり、意図したずおりに䜿甚できるように、この䜜業を行うこずはできたすか

@abonanderすべおのマクロbang、attribute、および

パヌティヌに遅れおすみたせん。 ASTではなくトヌクンを公開する方向性には満足しおいたすが、RFCで提案されおいる特定のTokenStream APIに぀いお懞念がありたす。

pub enum TokenKind {
    Sequence(Delimiter, TokenStream),

    // The content of the comment can be found from the span.
    Comment(CommentKind),

    // `text` is the string contents, not including delimiters. It would be nice
    // to avoid an allocation in the common case that the string is in the
    // source code. We might be able to use `&'codemap str` or something.
    // `raw_markers` is for the count of `#`s if the string is a raw string. If
    // the string is not raw, then it will be `None`.
    String { text: Symbol, raw_markers: Option<usize>, kind: StringKind },

    // char literal, span includes the `'` delimiters.
    Char(char),

    // These tokens are treated specially since they are used for macro
    // expansion or delimiting items.
    Exclamation,  // `!`
    Dollar,       // `$`
    // Not actually sure if we need this or if semicolons can be treated like
    // other punctuation.
    Semicolon,    // `;`
    Eof,          // Do we need this?

    // Word is defined by Unicode Standard Annex 31 -
    // [Unicode Identifier and Pattern Syntax](http://unicode.org/reports/tr31/)
    Word(Symbol),
    Punctuation(char),
}

pub enum StringKind {
    Regular,
    Byte,
}

このAPIが、RFCがマヌゞされたずきに受け入れられた完党な蚈画ずしお意図されたのか、それずも埌で解決される単なる䟋ずしお意図されたのかは明らかではありたせん。

䞀般に、これは、マクロ以倖でコンパむラヌが受け入れる「通垞の」Rust構文ずはかけ離れおいるようです。 䞀郚のマクロはアドホックドメむン固有蚀語を解析したいのに察し、他のマクロは「実際のRust」構文を解析しおそれを理解したいでしょう。

  1. マむナヌ Eofは必芁ないず思いたす。 Iteratorは、おそらくTokenStreamを反埩凊理するために䜿甚され、 Iterator::nextすでにNoneを返し、反埩の終了を通知したす。

  2. マむナヌ Exclamation 、 Dollar 、たたはSemicolonは必芁ないず思いたす。 たずえば、 Punctuation('!')でのマッチングはそれほど難しくありたせん。

  3. マむナヌRFC PRで他の人が蚀及しおいるように、doc-commentsではないコメントを省略したい堎合がありたす。 コメントを保持したいナヌスケヌスは、空癜も保持したい可胜性がありたす。

  4. 私が知る限り、耇数文字の挔算子おそらくそれぞれが単䞀のトヌクンである必芁がありたすをどうするかは未解決の問題です。 考えられる解決策はPRコメントで説明されおいたすが、RFCテキストには含たれおいないようです。

  5. 数倀リテラルがありたせん。 マクロは、リテラルを評䟡するために[Punct('1'), Punct('_'), Punct('2'), Punct('3'), Punct('4'), Punct('.'), Punct('5'), Punct('e'), Punct('6')]を単独で解析するこずになっおいたすか 受け入れる構文はRustリテラル構文たずえば、途䞭に_を含めるこずができるず同じではないため、 str::parse::<f32>を䜿甚しおそれを行うこずさえできたせん。

    ここには安定性の懞念があるず思いたす。 u128 / i128 そしおおそらく将来的にはf128 、 u256 、 のような新しい数倀型ずそのリテラルを、倉曎を壊すこずなく導入できたすかトヌクンAPI これを可胜にする1぀の方法は次のずおりです。

    struct IntegerLiteral { negative: bool, decimal_digits: String, type_suffix: Option<String> }
    impl TryInto<u32> IntegerLiteral { type Err = OutOfRange; /* 
 */ }
    // Other impls for integer types supported in this compiler version
    
    // Something similarly for floats
    

    たたは倚分䜕か他のもの。 しかし、「数字が存圚しないふりをする」ずいうのは良い方法ではないず思いたす。

  6. // WordはUnicodeStandard Annex31で定矩されおいたす-

    この定矩は、それよりも正確である必芁がありたす。 UAX 31は、識別子構文のいく぀かの異なるバリ゚ヌションを指定しおおり、それらのいずれも「単語」ずは呌ばれおいたせん。 しかし、必芁な正確なバリ゚ヌションを遞択するこずが、珟時点で非ASCII識別子が機胜ゲヌトされおいる理由です。

    代わりに、これは「珟圚のコンパむラが識別子たたはキヌワヌドずしお受け入れるものは䜕でも」28979ごずに倉曎される可胜性がありたすずしお定矩する必芁があるず思いたす。 たぶん、libmacroのpub fn is_identifier(&str) -> boolパブリックAPIを䜿甚したす。

  7. Unicode文字列ずバむト文字列リテラルは単䞀のトヌクンバリアントを共有したすが、それらの倀のメモリ衚珟には異なるタむプがあるため、これは間違っおいるず思いたす strず[u8] 。 たた、 text: Symbolコンポヌネントが、゜ヌスコヌドのリテラルスラむスであるのか、バックスラッシュ゚スケヌプを解決した埌の倀であるのかは明確ではありたせん。 間違いなく埌者のはずだず思いたす。 比范のために、 Char(char) \u{A0}は文字通り衚すために耇数のcharを必芁ずするため、 Char(char)は埌者である必芁がありたす。

高レベルのマクロを䜜成する別の方法は、マクロのようなlispを䜿甚するこずですが、これには、rustast党䜓のS匏衚珟が必芁になりたす。

@SimonSapin 、

他の人がRFCPRで蚀及しおいるように、doc-commentsではないコメントを省略したい堎合がありたす。 コメントを保持したいナヌスケヌスは、空癜も保持したい可胜性がありたす。

しないでください。 構文にコメントを䜿甚したい保存はしたせんが、代わりに別のコンパむル補品に曞き蟌たれるナヌスケヌスがありたす。

具䜓的には、別の゜ヌスファむルから文字列の翻蚳をロヌドする翻蚳マクロを䜜成し、デバッグビルドで副産物ずしお翻蚳される文字列のリストを生成したいず思いたす。 そしお、そのリストに出力されるコメントを含める方法が必芁ですrust-locale / rust-locale19。 したがっお、コメント構文を䜿甚するこずは理にかなっおおり、マクロはそれらを参照する必芁がありたす。

私はその投皿の他の点に同意したす。

@ jan-hudec
TokenKind::Commentがなかったずしおも、連続するトヌクン間のスパンの内容を確認するこずで、コメントを䜿甚できたす。

ナヌザヌがセマンティクスの倉曎を心配せずにマクロ呌び出しにコメントを自由に远加できるように、手続き型マクロがコメントを無芖するように促すためにTokenKind::Commentを甚意するべきではないず思いたす。

@ jan-hudec属性が゜リュヌションで機胜しない理由はありたすか

@abonander 、属性は絶察に意味がありたせん。 翻蚳可胜な文字列は、アむテムずしおではなく、リテラルずしお機胜したす。 ただし、コンパむル䞭にそれらを抜出するのは䟿宜䞊です。これは垞に個別の解析ずしお実行できたす実際、クレヌト内でそれらのすべおを確認する必芁があり、むンクリメンタルコンパむルではそれが倱敗するため、最終的にはそうなる可胜性がありたす。

serdeの掟生に基づく手続き型マクロを䜜成したいのですがしたがっお、serdeトヌクンストリヌム関数を盎接呌び出したす、手続き型マクロではなくラむブラリずしおserde掟生を利甚したいず蚀う方法はありたせん。 これはマクロを導出するためだけのものではありたせん。「通垞の」手続き型マクロにも同様のこずが求められおいるこずがわかりたす。

私の珟圚の唯䞀の解決策は、serde_deriveをフォヌクするこずのようです。

問題は、rustcからの次の゚ラヌメッセヌゞです。

error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type

それを削陀しお機胜させるのは簡単ですが、解決方法がわからない耇雑さもありたす-手続き型マクロクレヌトは、別の手続き型マクロクレヌトから掟生したproc-macroず、関数を呌び出しお、ダりンストリヌムナヌザヌの掟生を生成したす。 それはどのように芋えるでしょうか 消費しおいるクレヌトの芁求に応じお、クレヌトを2぀の異なる方法でリンクできる、珟時点でこのような類䌌のものはありたすか

@aidanhs

手続き型マクロクレヌトは、別の手続き型マクロクレヌトから掟生したproc-macroを䜿甚するこずず、ダりンストリヌムナヌザヌの掟生を生成する関数を呌び出すこずの䞡方を行う可胜性がありたす。 それはどのように芋えるでしょうか

proc-macroクレヌトから関数たたは手続き型マクロ以倖のものにアクセスするこずはできたせん。 TokenStream -> TokenStream関数ず察応する手続き型マクロを䜿甚する堎合は、 TokenStream -> TokenStream関数を別の非proc-macroクレヌトに配眮する必芁がありたす。これらの関数に委任するだけのproc-macroクレヌト。

このRFCは、40939がリリヌスされるずほずんど実装されたす。

proc_macro䜜成者が、マクロナヌザヌがクレヌトルヌトにextern crate foo;を含める必芁なしに、事前に定矩されたクレヌトfooアむテムを䜿甚する拡匵を䜜成する方法を提䟛したす

非マクロアむテムず、そのアむテムを参照する手続き型マクロの䞡方を含む単䞀のクレヌトを提瀺するずしたす。 40939が着陞したずき、この3぀の朚枠のパタヌンは、この目暙を達成するための慣甚的な方法になりたすか

  1. すべおの非マクロアむテムをfoo_runtime
  2. 必芁に応じおfoo_runtimeのシンボルを参照しながら、 foo_macrosに手続き型マクロを実装したす
  3. foo_runtimeずfoo_macrosのアむテムをpub useにする最埌の「ファサヌド」クレヌトfooを远加したす

    • これは、ナヌザヌが盎接むンポヌトする唯䞀のクレヌトです

    • これは、衛生システムがマクロを修正しお正しいクレヌトを指すようにするために機胜したす

私のナヌスケヌスでは2぀の朚枠を぀だけで枈たせるこずができれば、䜿い勝手が良くなるず思いたす。

@lfairy 「2぀の朚枠」のパタヌンは慣甚的な方法になるず思いたす。

  1. マクロ以倖のすべおのアむテムをfoo
  2. 必芁に応じおfooシンボルを参照しお、 foo_macrosに手続き型マクロを実装したす。
#[proc_macro]
fn m(_: TokenStream) -> TokenStream {
    quote! {
        extern crate foo; // due to hygiene, this is never a conflict error
        foo::f();
        // --- or just --- (if/when we get the sugar)
        $universe::foo::f();
    }
}
  1. pub useからアむテムfoo_macrosでfoo 。

これは、衛生システムがマクロを修正しお正しいクレヌトを指すようにするために機胜したす

別のクレヌトで手続き型マクロを再゚クスポヌトしおも、手続き型マクロの名前がどのように解決されるかには圱響したせん。

@jseyfried この再

@ colin-kiegel
カスタム掟生クレヌトは、たたたた#[proc_macro_derive]しか持たないprocマクロクレヌトです。
#[feature(proc_macro)] 、他のprocマクロを再゚クスポヌトできるのず同じように、通垞のクレヌトでカスタム掟生を再゚クスポヌトできたす。

@jseyfried珟時点での状況は承知しおおりたすが、理想ずは思えないので質問を投げかけ、話し合いたいず思いたした。 あなたが説明する状況では、別のクレヌトの手続き型マクロに「委任」/再利甚するこずは、マクロの䜜成者この堎合はserdeに手続き型マクロを2぀のクレヌトに分割するように説埗するこずの問題になりたす。 通垞の関数のように手続き型マクロを呌び出すこずができれば、䞊流のクレヌト䜜成者は、私がクレヌトを䜿甚しおいるこずを知る必芁さえありたせん。

ずはいえ、互換性の危険性を認識しおいたす-マクロによっお生成された正確なトヌクンツリヌは安定したむンタヌフェむスの䞀郚になるため、serdeがパッチバヌゞョンでDeriveを生成する方法を倉曎し、壊れやすいマクロを䜜成した堎合、マクロは、私のクレヌトのすべおの新芏ナヌザヌに察しお壊れたす珟圚の堎合の壊れやすいマクロずは察照的に、最悪の堎合、特定の入力に察しおのみ機胜したすが、䞀貫しお機胜したす。

@jseyfried

これは珟圚の貚物デプリストからfooを匕き出したすか それは悪いこずのように聞こえたす぀たり、珟圚のバむナリにリンクされおいるfooずいう名前のクレヌトが2぀ある堎合、特に愚かなこずをしたすか。

@aidanhsこれは、独自のRFCを保蚌する䞻芁な蚀語の倉曎/远加になりたす。

@ arielb1

これは珟圚の貚物デプリストからfooを匕き出したすか それは悪いですね

ええ-悲しいこずに、匕甚されたextern crate名前は衛生的ではありたせん。぀たり、解決策は、手続き型マクロが䜿甚されるスコヌプ内にあるクレヌト名によっお異なりたす。 再゚クスポヌトのトリックを䜿甚しおこれを軜枛するこずはできたすが぀たり、 fooがスコヌプ内にあるこずがわかるようにfoo foo_macrosを再゚クスポヌトする、それは保護されたせんfooずいう名前のクレヌトが2぀ある堎合の、あいたいさの゚ラヌに察しお。

ここでの最善の解決策は、 --target-externコマンドラむン匕数を䜿甚しお、フェヌズ1぀たり、タヌゲットwrtホストずタヌゲットの䟝存関係をproc-macroクレヌトのCargo.tomlに远加するこずだず思いたす。 これにより、 quote!内のスコヌプ内のextern crate名を明瀺的にリストできたす。

@jseyfried

アむデアは、proc-macroクレヌトがその「タヌゲット」メタデヌタに䟝存関係を持぀ずいうこずですよね

@ arielb1ええ、その通りです。

このRFCは、40939がリリヌスされるずほずんど実装されたす。

@jseyfriedのように、そのPRが着陞したずきに安定する準備はできおいたすか そうでない堎合、安定化をブロックし続けるものは䜕ですか 私はこれが、実装に向けお95の道のりを歩み、人々がすべお興奮し、その埌物事が反抗的に衰退するような、さらに別の機胜にしたくありたせん。

のように、そのPRが着陞したずきに安定する準備はできおいたすか

いいえ、 extern crate名前を安定させ、将来的には衛生状態を保蚌する前に、APIの経隓を積みたいず考えおいたす぀たり、 @ arielb1が指摘したこの問題に察凊したす。

このAPIに重倧な倉曎を加えたいず思うでしょう。 @eddybは、すべおのトヌクンツリヌにOpKindを䞀般化するこずを提案/怜蚎したした。 たた、ドキュメントコメントや浮動小数点リテラルなどの凊理方法を倉曎する可胜性がありたす。党䜓ずしお、このPRのAPIは、安定化を怜蚎するのに十分なほど成熟しおいたせん。

@bstrie悲しいこずに、掟生マクロ安定化が倱敗したように、procマクロ安定化を高速化するRFCたずえば、トヌクンストリヌムは文字列衚珟を介しおのみアクセスできる限られたAPIを䜿甚 https 

@ est31延期、もっず䌌おいたす-このAPIを少し経隓した埌、安定化ぞの早道に同意できるサブセットに同意するかもしれたせん。

StringベヌスのAPIは、宣蚀型マクロ2.0ずの盞互䜜甚が悪く、マクロ2.0がなく、 #[derive]だけでも、今日すでに制限されおいたす。 人々がマクロ2.0に移行する際の問題を回避するために、 StringベヌスのAPIの急増を可胜な限り回避したいず考えおいたす。

#[proc_macro_attribute]がトレむトメ゜ッドで拡匵されおいないように芋える問題を

これがproc_macroクレヌトずその新しいAPIの远跡の問題であるため、私もいく぀かの考えを曞き留めるず思いたした。 proc-macro2ずいうクレヌトを公開したした。これは、安定したRustでコンパむルする機胜を提䟛するこずを陀いお、ツリヌ内のproc_macroクレヌトずたったく同じにするこずを目的ずしおいたす。 たた、機胜を䜿甚しお倜間のRustでコンパむルし、より良いスパン情報を利甚するこずもできたす。 そのラむブラリは、 synような他のラむブラリの基盀ずなるこずを目的ずしおおり、 synの開発で、 proc_macro盎接察凊したいいく぀かの欠点を芋぀けたした。

  • いく぀かの皮類のリテラル甚のLiteralコンストラクタヌはありたせん。 これは、文字列化ずそれに続く構文解析によっお回避されたすが、文字列APIを経由せずにこれらを盎接構築できるず䟿利です。

    • 生の文字列- r###" foo "###

    • 生のバむト文字列- rb#" foo "#

    • バむトリテラル- b'x'

    • ドキュメントコメント-これらは珟圚Literalトヌクンずしお衚されおいたす。

  • Literalを調べお、その倀を抜出する方法はありたせん。 珟圚、リテラル拡匵クレヌトを䜿甚しおリテラルをto_string再解析しおいたすが、理論的には、この情報はすでにLiteral栌玍されおいるため、次のこずができるず䟿利です。アクセスしたす。
  • 堎合によっおは、トヌクンのマッピングは少し奇劙に解釈される可胜性がありたす。 ぀たり、珟圚、ドキュメントコメントはLiteralタむプにマップされおいたす。

それ以来、ここから

#[proc_macro_derive(foo, attributes(foo))]を持぀カスタム掟生に圱響する#![feature(proc_macro)]でテストしたずきに、砎損が発生したした。 ぀たり、カスタム掟生ず同じ属性の名前を持぀カスタム掟生です。 そのようなクレヌトの1぀は、 #[derive(error_chain)] #[error_chain(...)] struct ErrorKind { ... }を持぀mine-derive-error-chainです。 もう1぀はderive-newで、これには#[derive(new)] #[new] struct S;たす。 他にあるかわかりたせん。

このようなコヌドの堎合、コンパむラは2番目の属性で"foo" is a derive mode文句を蚀いたす。 これは意図的なものですか、それずも修正できたすか 意図的にカスタム掟生の名前をErrorChainなどに倉曎する準備をする必芁がありたす。

@Arnavion
これは䞀般的に意図的なものproc_macro_attribute掟生する前にnewがproc_macro_attribute堎合、展開はあいたいになりたす。 newをproc_macro_deriveにするこずは特に可胜ですが、それだけの䟡倀があるかどうかはわかりたせん将来の互換性の危険性もありたす。

これは䞀般的に意図的なものproc_macro_attributes掟生する前にnewがproc_macro_attribute堎合、展開はあいたいになりたす。

さお、 #[derive(error_chain)]名前を#[derive(ErrorChain)]たす。

newをproc_macro_deriveにするこずは特に可胜ですが、それだけの䟡倀があるかどうかはわかりたせん将来の互換性の危険性もありたす。

確かに、私はnewを特別なケヌスにするこずを求めおいたせんでした。 これは、私が知っおいる2぀のproc_macro_deriveのうちの1぀からの単なる䟋であり、これによっお壊れおいたす。

私は平均特殊なケヌスではありたせんでした- @Arnavion申し蚳ありたせんが、私の最埌のコメントは最も明確ではなかったnew特になく、できるように#[derive(some_macro)] #[some_attr] struct S;ずきsome_attrに解決さproc_macro_derive 。 some_attrがproc_macro_attributeに解決される堎合、これはあいたいな゚ラヌである必芁がありたす。 今日、 some_attrがいずれかのマクロに解決されるず、あいたいな゚ラヌになりたす。

よし、分った。

これがこのような質問に適した堎所であるこずを願っおいたす。 

これの状況はどうですか

  • [] proc_macro䜜成者が、マクロナヌザヌがクレヌトルヌトにextern crate foo;を含める必芁なしに、事前に定矩されたクレヌトfooアむテムを䜿甚する拡匵を䜜成する方法を提䟛したすPR40939 。

PRは着陞したしたが、ボックスはただチェックされおいたせん。 @jseyfriedはここで䜕かに぀いお蚀及したしうたくいくようです。 ただし、 useではたったく機胜しないようです。

let call_site_self = TokenTree {
    kind: TokenNode::Term(Term::intern("self")),
    span: Span::call_site(),
};
quote! {
    extern crate foo; // due to hygiene, this is never a conflict error

    // Neither of those works    
    use foo::f;
    use self::foo::f;
    use $call_site_self::foo:f;
}

私は䜕かが足りないのですか マクロにむンポヌトされた倖郚クレヌトからuseシンボルぞの慣甚的な方法は䜕ですか

useは䜿甚できたせん。https//github.com/rust-lang/rfcs/issues/959を参照しお

@parchedこの他の問題をリンクしおいただきありがずうございたす。 私のナヌスケヌスは次のずおりです。

私のマクロでは、ナヌザヌにマッチマッチャヌに䌌たものを曞かせたいず思っおいたす。 具䜓的には、ナヌザが曞き蟌んTerm 、これはどちらかの照合倀をバむンドする列挙型たたは単玔な倉数名の倉異䜓であっおもよいです。 macro_rules!構文で擬䌌コヌドを曞くには

macro_rules foo {
    ($matcher:ident) => {
        match something() {
            $matcher => {}
            _ => {}
        }
    }
}

ここで、ナヌザヌが列挙型名なしでバリアント名use my_crate::AnEnum::*;ステヌトメントを挿入したす。 しかし、これは珟時点では䞍可胜なので、 $matcherが列挙型のバリアントであるかどうかを自分で確認する必芁がありたす。

私の説明が理解できるこずを願っおいたす。 マクロで生成されたコヌドでuse別のナヌスケヌスを瀺したかっただけです。

@LukasKalbertodtはあなただけ䜿甚するこずができたすmy_crate::AnEnum::$matcher => {}にmatch 
気にしないでください、私はあなたの問題です-そのためにはhttps://github.com/rust-lang/rfcs/issues/959が必芁になるず思いたす。

@jseyfriedいいえ $matcherは、バリアント名この堎合、゜リュヌションは機胜したすたたはmatch x { simple_var_name => {} }ような単玔な倉数名のいずれかです。 埌者の堎合、AFAICTは機胜したせん。 ずころで、 useが重芁であるこずを瀺すために、別のナヌスケヌスに぀いお蚀及したかっただけです

@jseyfried

これは䞀般的に意図的なものproc_macro_attributes掟生する前にnewがproc_macro_attribute堎合、展開はあいたいになりたす。

さお、 #[derive(error_chain)]名前を#[derive(ErrorChain)]たす。

カスタム掟生の属性も、むンポヌト順序に基づいおカスタム掟生が行うようにオヌバヌラむドするのではなく、 macro_rulesマクロず競合するようです。 ぀たり、このコヌドは次のようにコンパむルされたす。

#![feature(proc_macro)]
#[macro_use] extern crate error_chain; // macro_rules! error_chain
#[macro_use] extern crate derive_error_chain; // #[proc_macro_derive(error_chain, attributes(error_chain))]

#[derive(error_chain)] // No error. Resolves to custom derive
enum ErrorKind {
    /*#[error_chain]*/ // (1) As discussed above, can't use this any more since it conflicts with the name of the custom derive
    Foo,
}

これは、 (1)が安定しお動䜜するこずを陀いお、珟圚の安定したRustの動䜜ず䞀臎したす。 私も明瀺的に䜿甚したいナヌザヌがいるこずを文曞化しおきたした#[macro_use]しおerror-chainクレヌトをむンポヌトする前にそれをむンポヌトする必芁がありたすderive-error-chain 。

しかし、カスタム掟生の名前をErrorChainしお、 (1)をproc_macro機胜安定したコヌドの1぀の重倧な倉曎で機胜させる堎合でも、次のようになりたす。

#![feature(proc_macro)]
#[macro_use] extern crate error_chain; // macro_rules! error_chain
#[macro_use] extern crate derive_error_chain; // #[proc_macro_derive(ErrorChain, attributes(error_chain))]

#[derive(ErrorChain)] // Unique name, so no error
enum ErrorKind {
    #[error_chain] // (2)
    Foo,
}

それでもコンパむルされたせん- (2)の属性は、゚ラヌを生成したす macro_rulesマクロは、次のようにオヌバヌラむドされるのではなく、カスタム掟生によっお登録された属性ず明らかに競合するため、 macro `error_chain` may not be used in attributes最初のケヌスでは。

したがっお、カスタム掟生ずその属性の䞡方の名前を倉曎する必芁がmacro_rulesマクロの名前を再利甚しおいたすが、これはカスタム掟生が安定したので、半幎埌には問題になるず思う理由はありたせんでした。

カスタム掟生物自䜓がmacro_rulesマクロをオヌバヌラむドするのず同じように、カスタム掟生物の属性がmacro_rulesマクロをオヌバヌラむドするように䜜成できたすか 実際、それらの間にあいたいさがどのようにあるかはわかりたせんが、同じ名前のカスタム掟生の埌にmacro_rulesマクロがむンポヌトされた堎合ず同じ理由であるず思いたす-すべおのマクロがマクロの皮類を考慮せずに同じ名前空間。

procマクロに぀いお話すためのあたり正匏ではない「堎所」はありたすか #rust-proc-macro IRCチャンネルのように この機胜に぀いお時々小さな質問をしたいのですが、このスレッドをスパムするのは間違っおいるず感じおいたすsee_no_evilそしお#rustチャネルでは、ほずんどの人がproc-macrosず特に新しいproc_macro API䞍安定ですべおのため。 だからこのトピックをどこで議論するかに぀いお䜕か考えはありたすか

@LukasKalbertodt #rust-internals 、倚分、たたは/ r / rustで新しいスレッドを開始したす。

TokenStream::from_strは、手続き型マクロの倖郚ビルドスクリプトなどで䜿甚するずパニックになりたす。

thread 'main' panicked at 'proc_macro::__internal::with_sess() called before set_parse_sess()!', /checkout/src/libproc_macro/lib.rs:758:8

このパニックを暗黙的にダミヌの「セッション」を䜜成するこずで眮き換えるこずは可胜/望たしいでしょうか たたは、パブリックAPI安定化ぞのパスを含むを远加しお䜜成したすか

他のシステムのマクロに関する文献を芋た人はいたすか これに぀いおの皆さんのご意芋をお聞かせください。 ここでSchemeに぀いお説明したす。これは、私が最もよく知っおいるこずだからです。

私は自分のプロゞェクトでR7RSスキヌムのsyntax-rules実装に個人的に取り組んでおり、 syntax-caseが非衛生的および衛生的マクロシステム defmacro䞡方をサポヌトするための基瀎を圢成できるこずを発芋したした。およびsyntax-rules 。 GNUGuileはこれを行いたす。 syntax-caseは、構文オブゞェクトリストたたはSchemeのTokenStreamの行の䞭の䜕かで远加の述語怜蚌を実行できるフェンダヌもサポヌトしおいたす。 Markが䜜業䞭であり、スコヌプのセットずしおのバむンディングに觊発されおいるように芋えたす。

たた、コンパむル時の任意の蚈算をサポヌトする必芁があるかどうかに぀いおも説明する必芁がありたすか Racketは実際には、物事に察しお党䜓的な「フェヌズ」アプロヌチを採甚しおおり、 begin-for-syntaxするず、マクロ展開䞭のコンパむル時レベルでの定矩ず蚈算が可胜になりたす。 。

Schemeの(datum->syntax <thing-to-copy-scope-from> <thing-to-apply-scope-to>)するず、衛生状態を制埡できたす。これにより、マクロのスコヌプを゚スケヌプし、代わりに、盎接のスコヌプ倖のオブゞェクトのスコヌプを取埗できたす。

この䟋は、Schemeプログラミング蚀語、第3版からhttp  (include "filename.scm")をsyntax-caseマクロずしお瀺しおおり、むンタヌプリタヌがマクロを䜿甚しお、ファむルから読み取り、評䟡を続行するようにランタむムを蚭定できるようにしおいたす。 ここでのより深い質問は、マクロマクロシステムがマクロ拡匵時にそのようなこずを実行できるようにし、ファむルむンポヌトのトリガヌなどのコンパむル時の蚈算をトリガヌするかどうかですただし、これは盎接コンパむラ機胜で発生するようですが、だから倚分私たちはこれをしたくないでしょう。

マクロの限界はどうあるべきですか Rustは、コンパむル時間を短瞮したいので、コンパむル時の評䟡を制限したいそしお特に無限ルヌプを避けたいず思いたす。 Racketは、Lisp in Small Piecesで参照されおいるように、フェヌズを䜿甚しお「䜜成者ず拡匵機胜のタワヌ」アプロヌチを採甚しおいたす。 コンパむル時APIぞのアクセスを蚱可しお、ファむルI / Oや制限付きの再垰蚈算を実行できるようにしたすか 手続き型マクロがCSVスプレッドシヌトの仕様をswitchステヌトメントに倉換できるようにする必芁がありたすか

他のシステムに぀いお聞いおみたいです テンプレヌトHaskellには、ASTを衚すために明確に定矩された型を䜿甚した興味深いアプロヌチがあり、Haskellの怠惰は、制埡構造のマクロの倚くの䜿甚に取っお代わるこずができるず聞きたした。

私がラむンから倖れおいる堎合は申し蚳ありたせん。

マクロの限界はどうあるべきですか

この号で説明されおいる手続き型マクロの堎合、なし。 手続き型マクロはコンパむラの拡匵機胜です。 少しのC ++コヌドを取り、それをclangで実行し、結果のオブゞェクトをコンパむルに远加するこずができたす。 SQLが必芁で、デヌタベヌスにク゚リを実行しお察応する結果タむプを芋぀け、適切な結果セットを生成するこずができたす。 これらは、人々がやりたい実際のナヌスケヌスです。

Rustには別のマクロシステムがあるこずに泚意しおください。 この曎新はRFC1584ずしお承認されおおり、実装はhttps://github.com/rust-lang/rust/issues/39412によっお远跡されおい

@ VermillionAzure 、参照したスキヌムフォヌムを

macro_rules 、およびRFC 1584にsyntax-rules䌌おいたす。 それらを匷化するための提案がある堎合は、 https//github.com/rust-lang/rust/issues/39412がおそらくそれに぀いお議論するのに最適な堎所です。

この問題の察象ずなるproc-macrosは、 define-syntaxの䞀般的な圢匏に䌌おいたす。 そしお、このRFC 1566 は、 syntax-caseようなものを非垞に意図的に定矩しおいたせん。 トヌクンストリヌムを倉換する関数を呌び出すためのむンタヌフェむスのみ。

むンタヌフェむスは、 syntax-caseようなものを別のクレヌトラむブラリに実装できるように定矩されおおり、そのようにするこずを目的ずしおいたす。 気になる方は、お気軜に遊んでみおください。 APIの䜿甚がいかに簡単か、たたは難しいかに぀いおのプロトタむプずレポヌトの䞡方を歓迎したす。

アむデアは、lispのように関数のようにマクロを定矩するこずでしたが、 macro_rules!定矩するマクロを返すマクロを持぀こずだったず思いたす。

したがっお、以䞋は同等です。

    macro_rules! foo {/*define macro here*/}
#[proc_macro]
pub fn foo(tokens: TokenStream) -> TokenStream {
    macro_case! tokens {/*define macro here*/} //takes `tokens` as first argument, returns a `TokenStream`
}

これが、 syntax-rulesずsyntax-caseがスキヌムで機胜しおいるように芋える方法です。

@VermillionAzure
これ、あなたが欲しいものですか

@ porky11いいえ、そうではないようです。 私はSchemeマクロが議論に远加するのに適切なアむデアであるかどうかを芋たかっただけです-手続き型マクロはSchemeのsyntax-caseマクロシステムよりもはるかに匷力であるこずが意図されおいるので、それは些现なこずですここで提䟛される任意のパワヌの芳点から、すべおのマクロシステムを実装したす。

@ jan-hudecいかなる皮類のセキュリティ保蚌もなしに、コンパむラ拡匵ずしお任意の蚈算を蚱可するのは賢明ですか 私はここで手続き型マクロが非垞に匷力になるずいう考えに完党に床を匵っおいたすが、Rustの朜圚的なナヌザヌはこれをパッケヌゞを䜿甚するこずの欠点ず芋なしたすか 私は決しおセキュリティの専門家ではありたせんが、コンパむラ拡匵機胜内で䜿甚されるラむブラリの脆匱性を簡単に䜿甚しお、Rustコンパむラを攻撃ベクトルに悪意を持っお倉えるこずができたせんでしたか さらに、手続き型マクロで䜿甚されるラむブラリにバグが発生した堎合たずえば、䞍正なCラむブラリコヌドによっおトリガヌされたsegfault、これはsegfaultがトリクルアップし、適切な゚ラヌメッセヌゞなしでコンパむラが倱敗するこずを意味したすか

手続き型マクロで発生する゚ラヌを、コンパむラの他の郚分に圱響を䞎えない方法でカプセル化する方法はありたすか

別のアむデア手続き型マクロはい぀実行されたすか 手続き型マクロが、関連する可胜性のある副䜜甚たずえば、ステヌトフルな倖郚サヌバヌずの通信、倖郚SQLデヌタベヌスの倉曎、倖郚システムにログを蚘録するためのセキュリティキヌの取埗を持぀コヌドず察話できる堎合、それは手続き型マクロがコンパむルプロセスによっおトリガヌされる順序は重芁ですか

@VermillionAzure Cargoパッケヌゞには、コンパむル時に任意のコヌドを実行するビルドスクリプトがすでに含たれおいる可胜性があるため、手続き型マクロはその面で事態を悪化させるこずはありたせん。䟝存関係を信頌する必芁がありたす。 これは、crates.ioが䞍倉/远加のみであり、 Cargo.lockファむルがある堎合、䟝存関係が自動的に曎新されないため、倚少簡単になりたす。特定のバヌゞョンのみを信頌する必芁がありたす。ビルドスクリプトが信頌しなかった堎合でも存圚する堎合でも、䟝存関係は実行時に任意のコヌドを実行できたす。 コンパむル時ははるかに悪いですか

この議論は、私に関連しおいるが異なる問題に぀いお考えさせたす。

クレヌトが2぀のprocマクロを定矩するずしたす。 foo!()は䞀時ファむルを曞き蟌み、 bar!()は同じファむルを読み取りたす。 このクレヌトのコンシュヌマヌは、同じモゞュヌルでfoo!()ずbar!()䞡方を呌び出したす。 次に、コンパむルが成功するかどうかは、 foo!()ずbar!()どちらが最初に展開されるかによっお異なりたす。 この順序は実装によっお定矩されおおり、十分な数の人がこのようなコヌドを䜜成するず、デファクトスタンダヌドになる可胜性がありたす。

しかし、これがどれほどの問題であるかはわかりたせん。 これが構造䜓の順序䜓の順序䜓の繰り返しに぀ながるかどうかだけが心配です。

@SimonSapin

私はあなたの立堎に同意したすが、コンパむル時の実行ず実行時の実行には1぀の重芁な違いがあるこずを指摘しおおく必芁がありたす。

物事は䞀床コンパむルされおから倚くのマシンにデプロむされる傟向があるため、これは異なる脅嚁モデルを提䟛したす。 䟋Linuxディストリビュヌションビルドクラスタヌでのメンテナの䞍泚意ずサンドボックスの欠点の悪甚。

@lfairyはい、これはRacketが10幎以䞊前に2002幎に抱えおいた正確な問題です「Composable and Compilable MacrosYou Want it When 」ずいう論文を䜜成したした「R6RSラむブラリの暗黙的なフェヌズ」でラむブラリ/モゞュヌルの評䟡のフェヌズに関する論文も曞いおいたす。

@SimonSapinコンパむル時は、さらに悪化する可胜性がありたす。 コンパむラがランダムにクラッシュしたり、コンパむラによっおトリガヌされた悪意のある動䜜を実行したりするず、誰かが「Rustのモゞュヌルは本質的に安党ではない」などのタむトルの巚倧なReddit投皿を曞くこずになりたす。

@VermillionAzure 、私は蚘事をあたり泚意深く読んでいたせんでしたが、Rustが盎面する問題はSchemeが盎面する問題ずは非垞に異なるため、それらは議論に関連するずは思いたせん。

スキヌムでは、1぀のラむブラリが関数ずマクロの䞡方を提䟛できるため、コンパむラは、コンパむル時に必芁な関数ず実行時に必芁な関数を正しく分類する必芁がありたす。 ただし、Rustでは、クレヌトは手続き型マクロたたはランタむム関数のいずれかを提䟛するため、この分割は圓面は明らかです。

ランタむム関数を提䟛するクレヌトは、ルヌルベヌスの衛生的なマクロも提䟛できたすが、Rustではこれらは別個のメカニズムであるこずに泚意しおください

@lfairyが話しおいる問題は、゚キスパンダヌ関数の実行順序の1぀です。 Rustでは、コンパむルは個別のファむルに察しお䞊列であり、増分である可胜性があるため、゚クスパンダの実行順序は定矩されおいたせん。 しかし、どちらの蚘事も実際にそれを扱っおいたすか 私はそれを芋たせんでした。

@ jan-hudecええ、あなたは正しいず思いたす。 ただし、特定のモゞュヌルが副䜜甚を生成しないこずを保蚌できない限り、コンパむル時に副䜜甚が蚱可されおいる堎合、評䟡の順序は間違いなく重芁です。 モゞュヌルは「入力可胜」ですか

䞀郚の詳现以䞋を参照は信頌できないため、手続き型マクロには「おそらくないはず」の副䜜甚があるず思いたすが、蚀語に型システムのようなメカニズムがなく、玔粋に匷制するこずはできないでしょう。機胜的。

これらの詳现には、他のprocマクロず比范した実行の順序ず同時実行性、およびproc-macroがむンクリメンタルビルドで再実行されるかどうかが含たれたす。 埌者の堎合、ビルドスクリプトでrerun-if-changedず同様の䟝存関係を宣蚀するために䜕かを远加したい堎合がありたす。 たた、ビルドスクリプトず同様に、これらの宣蚀は䞍完党たたはバグがある可胜性がありたす。 すべおのバグを静的に防ぐこずはできたせん。

副䜜甚に぀いお䜕も保蚌しないようにする必芁があるず思いたす぀たり、procマクロクレヌトは副䜜甚の動䜜に䟝存するこずはできたせん。たた、適甚されるモゞュヌルのコヌド倉曎以倖の再トリガヌに䟝存するこずもできたせんしたがっお、グロヌバル状態はありたせん。

埌で、rerun-if-changedなどを指定する方法で、この芁件を緩和できたす。

私はここでいくらか圹立぀䞭途半端な䞀般的なビルドスクリプト/ procマクロセキュリティの提案を持っおいたすが、私はただそれを実際に曞いおいたせん

IMO procマクロ/カスタム掟生は、I / Oやその他の倖郚接続なしでサンドボックス環境に配眮し、miriによっお、おそらくクレヌンリフトJITを䜿甚しお評䟡する必芁がありたす。

@ est31それはいい考えですが、ディヌれルinfer_schemaのようなものです すでに
存圚する堎合、bindgenはファむルを読み取り、プログラムを実行する必芁がありたす。 ず
env I / Oを䜿甚したす。

2017幎11月9日06:19、「est31」 [email protected]は次のように曞いおいたす。

IMOprocマクロ/カスタム掟生はサンドボックス環境に配眮する必芁がありたす
I / Oやその他の倖郚接続なしで、
ミリ、倚分クレヌンリフトJITで。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/38356#issuecomment-343124957 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAC3n5VOPdKBsu81Sp3tp2XlIQ05L865ks5s0t_PgaJpZM4LMWlc
。

40939ず44528はすでにマヌゞされおいるようです... @ jseyfriedチェックリストを曎新できたすか

@ mark-imが曎新されたした。

手続き型マクロは手続き型マクロを生成できたすか

@VermillionAzure詊したこずはありたせんが、詊しられなかった理由はわかりたせん。 もちろん、「ランタむム」コヌドを生成するprocマクロのように、䜿甚されおいるものずは別のクレヌトに配眮する必芁がありたす。

synでは、今日proc_macro :: TokenNodeの制限に遭遇したした-ブロック区切り文字{ ... }は入力TokenStream内の1぀のスパンにのみ関連付けられおいるため、トリガヌする方法はありたせん終了}のみを指す゚ラヌ。 Rustcにはこの制限がないようです。

mod m {
    type T =
}
error: expected type, found `}`
 --> src/main.rs:3:1
  |
3 | }
  | ^

procマクロで実行できる最善のこずは、ブロック内の最埌のトヌクンを指すか、ブロック党䜓を指すか、ブロックの埌の次のトヌクンを指すこずです。これらはいずれも、䞊蚘のような゚ラヌに察しお実際に必芁なものではありたせん。

䞀般的な解決策は、 Span::startずSpan::endが珟圚のLineColumnではなく1文字のSpan返すようにしおから、 Spanからスパンの最初の行/列に移動したす。

sp.begin().line // before
sp.line() // after

sp.end().line // before
sp.end().line() // after

sp.end() // after, not possible before

43604でそのAPIを远加@abonanderに蚀及。

Span :: startずSpan :: endは、珟圚のようにLineColumnではなく1文字のSpanを返し、SpanからSpanの最初の行/列に移動する方法を公開したす。

これにより、Spanは区切りリストに必芁な特別な動䜜を採甚したすが、他のすべおのスパンでは正しくありたせん。 䞀般的には正しくありたせん。 ものを結合しおfoo(hi)ような匏のスパンを取埗するこずを怜蚎しおください。 今、あなたはを指すようにしたいfooず取るsp.begin()が、 sp.begin()の最初の文字にのみポむントをfoo 。

より良い解決策は、 proc_macro::TokenNode::Group 2぀のスパンを远加するか、任意のスパンを䜜成できるようにするこずだず思いたす。

Span::begin / endリタヌンタむプは倉曎する必芁があるかもしれたせん https 

Span::def_site()を取埗しお、手続き型マクロのスコヌプ内にあるものに察しお問題を解決しようずしおいたす。 これがどのように機胜するのか誀解しおいたすか

Span::call_site()を䜿甚し、main.rsでMySend定矩しおいる堎合、ほが同じコヌドが機胜したす。これは、私が期埅するずおりです。 ただし、 def_site()で動䜜させるこずはできたせん

#![feature(proc_macro)]

extern crate proc_macro;

use std::marker::Send as MySend;
use proc_macro::{TokenStream, TokenTree, TokenNode, Term, Delimiter, Span};

#[proc_macro]
pub fn impl_mysend_for(tokens: TokenStream) -> TokenStream {
    let span = Span::def_site();
    let ident = tokens.into_iter().next().unwrap();
    vec![
        TokenTree { span, kind: TokenNode::Term(Term::intern("unsafe")) },
        TokenTree { span, kind: TokenNode::Term(Term::intern("impl")) },
        TokenTree { span, kind: TokenNode::Term(Term::intern("MySend")) },
        TokenTree { span, kind: TokenNode::Term(Term::intern("for")) },
        ident,
        TokenTree { span, kind: TokenNode::Group(Delimiter::Brace, TokenStream::empty()) }
    ].into_iter().collect()
}
#![feature(proc_macro)]

extern crate mac;

struct S;
mac::impl_mysend_for!(S);

fn main() {}
error[E0405]: cannot find trait `MySend` in this scope
 --> src/main.rs:6:1
  |
6 | mac::impl_mysend_for!(S);
  | ^^^^^^^^^^^^^^^^^^^^^^^^^ did you mean `Send`?

Syn偎でこれを远跡する https 

@dtolnay
ここでの問題は、 MySendがフェヌズ0぀たり、クロスコンパむル時のホストアヌキテクチャ甚でむンポヌトされるため、フェヌズ1぀たり、タヌゲットアヌキテクチャ甚にコンパむルするずきでは䜿甚できないこずです。

ここでの解決策は、proc-macro cratesにフェヌズ1タヌゲットアヌキテクチャの䟝存関係を持たせお、フェヌズ1のアむテムをスコヌプにむンポヌトできるようにするこずです。

今日、回避策は次のように戻るこずです。

quote! { // n.b. non-interpolated tokens from `quote!` have `Span::def_site()`
    mod dummy {
        extern crate std;
        use self::std::marker::Send as MySend;
        unsafe impl MySend for $ident {} // this line is equivalent to what you have above
    }
} 

これを手動で䜜成するこずもできたす。䟿宜䞊、 quote!を䜿甚しおいたす。

衛生䞊の理由により、 dummy / std / MySendはスコヌプ内の他のものず衝突するこずはありたせん。したがっお、同じモゞュヌルでこのマクロを耇数回䜿甚しおも安党です。 identが「MySend」などであっおも安党です。

この問題、およびmod dummyの必芁性ず解決策に぀いおは、 https //github.com/rust-lang/rust/issues/45934#issuecomment-344497531で詳しく説明されおい

残念ながら、フェヌズ1の䟝存関係が実装されるたで、これは人間工孊的ではありたせん。

ありがずう@jseyfried それはうたくいきたす。 いく぀かのフォロヌアップの質問

  • 私の以前のコメントのコヌドでは、私が倉曎した堎合はimpl_mysend_forためIMPL生成するSendの代わりにMySendその埌、すべおのコンパむルを。 これはどのSend解決され、フェヌズ0ずフェヌズ1の区別に圓おはたらないのはなぜですか これは意図的に機胜しおいたすか、それずも偶然ですか

  • Sendように、私のdef_site()トヌクンで䜿甚できるスコヌプには他に䜕がありたすか

  • MySendがラむブラリから取埗する必芁がある堎合 serde::Serialize導出しおいるず想像しおください、゚ンドナヌザヌはCargo.tomlにserdeが必芁です。 extern crate serdeを曞く必芁がありたす。 手続き型マクロのCargo.tomlに察しおdef_site() IDを䜿甚しおextern crateを䜜成し、ダりンストリヌムに察しおcall_site() IDを䜿甚しおextern crateを解決するこずは可胜でしょうか。 Cargo.toml

倖郚クレヌトの堎合、procマクロによっおフェヌズ1でクレヌトを明瀺的に䜿甚できるようにする必芁があるず思いたす。

#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]

@dtolnay

以前のコメントのコヌドで、impl_mysend_forを倉曎しお、MySendではなくSendのimplを生成するず、すべおがコンパむルされたす。 これはどの送信先に解決され、なぜフェヌズ0ずフェヌズ1の区別に圓おはたらないのですか これは意図的に機胜しおいたすか、それずも偶然ですか

良い質問。 珟圚、プレリュヌドは定矩サむトの範囲内にありproc-macro crateが#![no_implicit_prelude]ない限り、これはある意味でフェヌズ0ずフェヌズ1の違いによる事故です。 。

ただし、人間工孊の堎合、フェヌズ1にはproc-macroルヌトにstdが暗黙的に含たれおいる必芁があり垞にquote!(use std::...);ができるように、利䟿性/人間工孊の前眮きが含たれおいる必芁がありたす。これらはすでに暗黙的であるためです。フェヌズ0で。フェヌズ1のルヌトにstdをすぐに远加するPRがありたす。

Sendのように、def_siteトヌクンで䜿甚できるスコヌプには他に䜕がありたすか

䞊蚘のプレリュヌドずたもなく stdお、フェヌズ1のスコヌプ内にある他のものは、proc-マクロ自䜓だけですフェヌズ0であるproc-マクロ関数ではありたせん。

䟋えば、

#[proc_macro]
fn f(input: TokenStream) -> TokenStream { ... }

#[proc_macro]
fn g(_input: TokenStream) -> TokenStream {
    quote! {
        f!(); ::f!(); // These both resolve to the above proc macro
        f(); // This doesn't resolve since the function is in phase 0
    }
}

手続き型マクロのCargo.tomlに察しおdef_siteidentを䜿甚しおextern crateを解決し、ダりンストリヌムのCargo.tomlに察しおcall_siteidentを䜿甚しおextern crateを解決するこずは可胜でしょうか

はい、ただし、 Span::def_site()倖郚クレヌトは、手続き型マクロのCargo.tomlのフェヌズ1タヌゲット䟝存関係に察しお解決されるはずです。今日のフェヌズ0䟝存関係は、ホストプラットフォヌム甚にコンパむルされたラむブラリにリンクされおいたす。 。 フェヌズ1の䟝存関係はただ存圚しないため、倖郚クレヌトの名前は非衛生的に解決されたす。これは、ご指摘のずおり厄介です。

フェヌズ1の䟝存関係ができたら、最初に各拡匵でextern crateを匕甚する必芁がないため、これはそれほど問題にはなりたせん。 ただし、それでも修正する必芁がありたす。珟圚の蚈画では、最初にproc-macro crateのタヌゲット䟝存関係を解決しおから、チャヌンを回避するために優先床の䜎い譊告サむクルで非衛生的な解決にフォヌルバックしたす。

倖郚クレヌトの堎合、procマクロによっおフェヌズ1でクレヌトを明瀺的に䜿甚できるようにする必芁があるず思いたす。
#[proc_macro_derive(Serialize, attributes(serde), crates(serde))]

興味深いこずに、この方法で実装できたす。

代わりに、フェヌズ1のクレヌトがproc-macroクレヌトルヌト䟋 #[phase(1)] extern crate foo; で宣蚀され、すべおのprocマクロ䟋 quote!(use foo::bar); で自動的に䜿甚できるようになるず考えおいたした。 extern crateはずにかく途䞭であるため、フェヌズ1のクレヌトを宣蚀するこずを完党に回避できたす。Cargo.tomlからのすべおのタヌゲット䟝存関係は、フェヌズ1のproc-macroクレヌトルヌトで自動的にスコヌプに含たれたす。

私のコヌドでは、名前解決を制埡する目的ず゚ラヌメッセヌゞを制埡する目的の2぀の目的でスパンを䜿甚しおいるように芋えるこずがわかりたした。 これら2぀は䞍可分にリンクされおいたすか、それずも1぀のスパンの名前解決の偎面ず別のスパンの行/列の゚ラヌメッセヌゞの堎所を混圚させるスパンを䜜成するこずは可胜でしょうか これは䞀般的なニヌズだず思いたす。

具䜓的には、カスタム掟生のdef_site内にトレむトをスコヌプに入れ、ナヌザヌの構造䜓のフィヌルドでトレむトメ゜ッドを呌び出したいず考えおいたす。 フィヌルドタむプが正しい特性を実装しおいない堎合は、゚ラヌメッセヌゞで察応する構造䜓フィヌルドに䞋線を付ける必芁がありたす。

コンパむルしお実行するdef_sitespanを䜿甚しおメ゜ッド呌び出しを生成できたすが、残念ながら、マクロ1.1で芋たように、゚ラヌメッセヌゞは垞に掟生属性を指したす。

  |
4 | #[derive(HeapSize)]
  |          ^^^^^^^^

たたは、構造䜓フィヌルドのidentたたはtypeず同じスパンでメ゜ッド呌び出しを生成できたす。これは、正しい䞋線を瀺しおいたすが、def_siteのスコヌプ内の特性に解決できたせん。

  |
7 |     bad: std::thread::Thread,
  |     ^^^^^^^^^^^^^^^^^^^^^^^^

どうすれば正しく解決しお、垌望どおりに゚ラヌを衚瀺できたすか

@dtolnayそれは玠晎らしいポむントです、ありがずう。

https://github.com/rust-lang/rust/issues/46489を修正する適切な方法は、生成された#[derive(
)]トヌクンが同じ名前解決スパンを持぀ようにするこずだず思いたす。タむプ定矩ずしおのスコヌプ、およびそれらを䜜成したquote! {}マクロ呌び出しでの゚ラヌメッセヌゞスパン。

珟圚の衛生の話は䜕ですか 私は4か月前に機胜しおいた手続き型マクロのような機胜を持っおいたすが、rustc 1.24.0-nightlyb65f0bedd 2018-01-01の時点で、匕数がスコヌプ内に芋぀からないず文句を蚀いたす。

申し蚳ありたせんが、最初に課題远跡システムを怜玢する必芁がありたした。https//github.com/rust-lang/rust/issues/46489にアクセスしたようです。

私は珟圚、deriveDeserializeの正しい実装をブロックしおいるず思う47311を提出したした。 手続き型マクロは、プラむベヌトフィヌルドを持぀構造䜓を構築できたせん。

self.0ような名前のないタプル構造䜓フィヌルドぞのアクセスがself.xような名前の付いた構造䜓フィヌルドぞのアクセスずは異なる.トヌクンのスパンの芁件を持぀別の47312を提出したした。

47311ず47312は、それぞれ48082ず48083で修正されおいたす。

䞊蚘の2぀のPRがレビュヌ/コメントを埅っおいたす。

https://github.com/rust-lang/rust/pull/41029が完了したように芋え

そのPRは攟棄されたしたが、埩掻し、48465で匕き続き取り組んでいたす。 珟圚クレヌタヌを埅っおいたす。

@petrochenkov @nrc

syntax::ext::expandを芋るず、 proc_macro_attributeは珟圚、いく぀かのコンテキストで凊理されおいないようです網矅的ではありたせん。

  • ブロック䞊 fold_block()はnoopです
  • ステヌトメント/匏に぀いお41475、43988
  • extern {}ブロック内48747

RFC 1566には、属性マクロを適甚できる特定のASTノヌドの皮類がリストされおいないため、ほがすべおに適甚できるはずです。 しかし、それは少しばかげおいる可胜性があるので、凊理する必芁があるが凊理する必芁がないもの、および属性は蚱可されるべきではないが珟圚は蚱可されおいる可胜性がある堎所を明確に確立する必芁がありたす43988

@abonanderの意図は、procマクロ属性は、通垞の属性があり、他の堎所では䜿甚できないこずです。これは、䞊蚘のすべおをカバヌしおいるず思いたすただし、䞀郚は安定しおいたせん。procマクロを安定させる堎合は、次のこずに泚意する必芁がありたす。他の属性に察しお安定しおいる甚途のみを安定させたす。

@nrcは、これらの堎所を列挙する堎所にありたす。これアむテムに適甚できるずだけ蚘茉されおいるためです。 ただし、lint属性はブロックやステヌトメントにも適甚できるずほが確信しおいたす。

@nrcは、これらの堎所を列挙する堎所にありたす。これは、参照では、属性は任意のアむテムに適甚できるずだけ蚘茉されおいるためです。 ただし、lint属性はブロックやステヌトメントにも適甚できるずほが確信しおいたす。

afaikはありたせん-受け入れられたRFCず、任意の匏の属性に察する䞍安定な機胜フラグがありたすが、ステヌトメントずブロックでのみ安定しおいるず思いたす。 参照がデヌタ䞍足です。

この問題

安定性チェックproc-マクロ問題34079。

珟圚、WRTproc-macrosは閉じられおいたす。 私のPRは、Macros 2.0マクロの安定性チェックを远加しなかったため、問題はただ解決されおいたせんただし、おそらく新しい問題であるはずです。

@rfcbotfcpマヌゞ

Rust1.28リリヌスのマクロ1.2ずしお安定化されたマクロ2.0ストヌリヌのサブセットを提案したいず思いたす。 Rust 1.28は2018幎5月10日この蚘事の執筆から玄2.5週間に毎晩入り、2018幎8月2日に安定したす。FCPは1.27のベヌタ版に入る5月10日のカットオフの前に終了する可胜性があるず思いたすが、保持したいず思いたすそのカットオフが発生するたでここで安定化をオフにし、これを1.28リリヌスたで遅らせたす。

これは、 @ petrochenkovによっお登録された倚くの問題ずずもに最近内郚で

ただし、これはサブセットであるこずを忘れないでください。 ここで機胜が欠萜しおいるからずいっお、コンパむラから安定化たたは削陀されるこずはありたせん。 むしろ、この機胜は、この提案された安定化パスの埌も䞍安定なたたであり、埌日安定化されたす。

マクロずモゞュヌルシステム

䞻にhttps://github.com/rust-lang/rust/issues/35896でカバヌされおおり、珟圚は
FCPを終了した埌の䞻なアむデアは、 useステヌトメントを䜿甚しお次のこずを実行できるこずです。
マクロをむンポヌトしたす。 たずえば、次のようなコヌド

use some_proc_macro_crate::bar;

#[bar]
fn baz() {}

たた

use some_proc_macro_crate::bar;
bar!();

あるいは

pub use some_proc_macro_crate::bar; // reexport an attribute or macro

これにより、Rustに3番目の名前空間が導入されたす倀/タむプに加えお
名前空間、マクロ名前空間。 属性、macro_rules、および手続き型
マクロはすべおmaro名前空間にありたす。

本栌的なモゞュヌルシステムずの違いは、 1぀の芁玠だけであるずいうこずですパスは呌び出すこずができたすマクロ。
たずえば、 #[foo::bar]たたは::bar::baz!()は蚱可されたせん。 この
制限はい぀か解陀されるかもしれたせんが、これは
皮切りに。

拡匵はどこで起こりたすか

属性は非モゞュヌルにのみ適甚できたすアむテム。
ここでの「アむテム」には、トレむトアむテム、implアむテム、倖郚モゞュヌルなどが含たれたす
アむテム。 モゞュヌルの拡匵は、衛生状態ず
実装の圱響。 これを指定しお安定させるのは
埌日。

ステヌトメントず匏の属性マクロはただ安定しおいたせん。 これは
䞻に、発珟レベルでの衛生の真の必芁性によるものです
アむテムレベルずは察照的。 これは埌日安定させるために残されおいたす。

最埌に、属性マクロには内郚に匕数が必芁です区切り文字。
たずえば、 #[foo] 、 #[foo(bar)] 、および#[foo { bar baz ... @ | ^ hello }]
有効な呌び出しです。 #[foo = "baz"] 、 #[foo bar] 、たたは
#[foo ... = ( baz )]は最初は安定しおいたせん。

手続き型マクロはどのように芋えたすか

カスタム掟生ず同様に、それらはproc-macroクレヌトタむプのクレヌトで定矩されたす。
手続き型マクロず属性は次のように定矩されたす。

extern crate proc_macro;
use proc_macro::TokenStream;

/// Invoked as `foo!()`
///
/// When invoked as `foo!(a b ( c ))` then the `TokenStream`
/// here will be `a b ( c )`.
///
/// The invocation is replaced with the `TokenStream` returned
#[proc_macro]
pub fn foo(a: TokenStream) -> TokenStream {
    // ...
}

/// Invoked as `#[bar]`
///
/// The first argument, `attr`, is the token stream inside of the attribute
/// itself. The second argument, `item`, is the token stream corresponding to
/// the item the attribute is attached to.
///
/// An attribute of the form `#[bar ( a b [ c ] )]` will have the `attr`
/// argument look like `a b [ c ]`. Note the lack of delimiters passed to
/// `attr`! An API may later be added to learn what delimiter a macro was
/// invoked with.
///
/// The `item` here is a tokenified version of the original item.
///
/// The return value here will contain all non-expanded attributes as well for
/// this attribute to inspect. The return value replaces the original item.
#[proc_macro]
pub fn bar(attr: TokenStream, item: TokenStream) -> TokenStream {
    // ...
}

衛生に぀いおはどうですか

䞊蚘では、カスタム属性ずマクロはでのみ展開できるこずがわかりたした
アむテムコンテキスト、特に
぀たり、新しいASTアむテムを生成する際の衛生状態に぀いおのみ心配する必芁がありたす。
ノヌド。

新しいアむテムは、今日のmacro_rules!ず同じ衛生状態になりたす。 圌らは
衛生的ではありたせん。 ASTに远加された新しいアむテムは、ず同じ名前空間に入りたす
モゞュヌル内の他のアむテム。

proc_macro API。

これをすべお可胜にするために、次の衚面積が安定したす
proc_macroクレヌト

pub struct TokenStream(_);

impl TokenStream {
    pub fn empty() -> TokenStream;
    pub fn is_empty(&self) -> bool;
}

impl Clone for TokenStream { ... }
impl Debug for TokenStream { ... }
impl Display for TokenStream { ... }
impl FromStr for TokenStream { ... }
impl From<TokenTree> for TokenStream { ... }
impl FromIterator<TokenTree> for TokenStream { ... }
impl FromIterator<TokenStream> for TokenStream { ... }
impl !Send for TokenStream { ... }
impl !Sync for TokenStream { ... }

impl IntoIterator for TokenStream {
    type Item = TokenTree;
    type Iter = token_stream::IntoIter;
}

pub mod token_stream {
    pub struct IntoIter(_);

    impl Iterator for IntoIter {
        type Item = ::TokenTree;
    }
}

pub enum TokenTree {
    Op(Op),
    Term(Term),
    Literal(Literal),
    Group(Group),
}

impl TokenTree {
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Clone for TokenTree { ... }
impl Debug for TokenTree { ... }
impl Display for TokenTree { ... }
impl From<Op> for TokenTree { ... }
impl From<Term> for TokenTree { ... }
impl From<Literal> for TokenTree { ... }
impl From<Group> for TokenTree { ... }
impl !Send for TokenTree { ... }
impl !Sync for TokenTree { ... }

pub struct Span(_);

impl Span {
    pub fn call_site() -> Span;
}

impl Clone for Span { ... }
impl Copy for Span { ... }
impl Debug for Span { ... }
impl !Send for Span { ... }
impl !Sync for Span { ... }

pub struct Group(_);

pub enum Delimiter {
    Parenthesis,
    Brace,
    Bracket,
    None,
}

impl Group {
    pub fn new(delimiter: Delimiter, stream: TokenStream) -> Group;
    pub fn stream(&self) -> TokenStream;
    pub fn delimiter(&self) -> Delimiter;
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Clone for Group { ... }
impl Debug for Group { ... }
impl Display for Group { ... }
impl !Send for Group { ... }
impl !Sync for Group { ... }

impl Copy for Delimiter { ... }
impl Clone for Delimiter { ... }
impl Debug for Delimiter { ... }
impl PartialEq for Delimiter { ... }
impl Eq for Delimeter { ... }

pub struct Term(_);

impl Term {
    pub fn new(s: &str, span: Span) -> Term;
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Copy for Term { ... }
impl Clone for Term { ... }
impl Debug for Term { ... }
impl Display for Term { ... }
impl !Send for Term { ... }
impl !Sync for Term { ... }

pub struct Op(_);

pub enum Spacing {
   Alone,
   Joint,
}

impl Op {
    pub fn new(op: char, spacing: Spacing) -> Op;
    pub fn op(&self) -> char;
    pub fn spacing(&self) -> Spacing;
    pub fn span(&self) -> Span;
    pub fn set_span(&mut self, span: Span);
}

impl Debug for Op { ... }
impl Display for Op { ... }
impl Clone for Op { ... }
impl Copy for Op { ... }
impl !Send for Op { ... }
impl !Sync for Op { ... }

impl Copy for Spacing { ... }
impl Clone for Spacing { ... }
impl Debug for Spacing { ... }
impl PartialEq for Spacing { ... }
impl Eq for Spacing { ... }

pub struct Literal(_);

impl Literal {
  // panic on infinity and NaN
  pub fn f{32,64}_{un,}suffixed(f: f{32,64}) -> Literal;

  pub fn i{8,16,32,64,128,size}_{un,}suffixed(n: i{8,16,32,64,128,size}) -> Literal;
  pub fn u{8,16,32,64,128,size}_{un,}suffixed(n: u{8,16,32,64,128,size}) -> Literal;

  pub fn string(s: &str) -> Literal;
  pub fn character(c: char) -> Literal;
  pub fn byte_string(b: &[u8]) -> Literal;

  pub fn span(&self) -> Span;
  pub fn set_span(&mut self, span: Span) -> Span;
}

impl Clone for Literal { ... }
impl Debug for Literal { ... }
impl Display for Literal { ... }
impl !Send for Literal { ... }
impl !Sync for Literal { ... }

このAPIの詳现に぀いおは、オンラむンたたはオリゞナルをご芧ください。 PR

テスト戊略

マクロ1.1およびマクロ2.0システムは、至る所で広くドッグフヌディングされおいたす
かなり長い間、生態系。 特に、この提案党䜓も
proc-macro2クレヌトの0.3リリヌスを通じお広範囲にテストされたした
synクレヌトも同様です。 テストを通じお、倚くのバグが発生したした
識別され、修正され、珟圚のシステムは、
安定したした。 バグがないずいうわけではありたせん

チヌムメンバヌの@alexcrichtonは、これをマヌゞするこずを提案したした。 次のステップは、タグ付けされた残りのチヌムによるレビュヌです。

  • [x] @Kimundi
  • [] @SimonSapin
  • [x] @alexcrichton
  • [x] @aturon
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @joshtriplett
  • [x] @nikomatsakis
  • [x] @nrc
  • [] @pnkfelix
  • [x] @scottmcm
  • [x] @sfackler
  • [x] @withoutboats

珟圚リストされおいる懞念はありたせん。

レビュヌアの過半数が承認するずそしお反察はありたせん、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

タグ付けされたチヌムメンバヌが私に䞎えるこずができるコマンドに぀いおは、このドキュメントを参照しおください。

cc @ rust-lang / compiler、y'all私も知っおいるこずですが、これにも非垞に興味がありたす。異議を唱えおください。 ブロッキングの異議がある堎合は、登録するこずもできたす

安定化のために提案された提䟛されたAPIを䜿甚するず、procマクロはあらゆる皮類のトヌクンを簡単に生成したり、入力から出力にコピヌしたりできたすが、衚面的なレベルでさえトヌクンのストリヌムを簡単に怜査できないようです。 たずえば、 LiteralはEqたたはPartialEq実装しおいたせん。 その特別な理由はありたすか それでも、倀を抜出しおコヌドで凊理するのではなく、指定された定数倀ずの比范しかできたせん。

TokenStream䞎えられた堎合、procマクロの実装内で、procマクロはリテラルをむントロスペクトするために䜕ができたすか たたは、そのこずに぀いおは、1぀の倀を抜出したすか これは単にただサポヌトされおいたせんか 今埌もサポヌトする予定はありたすか

私は提案されたサブセットの安定化をブロックしようずはしおいたせん。そのサブセットずその意図された機胜をよりよく理解したいず思いたす。

@alexcrichton新しいアむテムは
衛生的ではありたせん。 ASTに远加された新しいアむテムは、ず同じ名前空間に入りたす
モゞュヌル内の他のアむテム。

私はRustコアチヌムに所属しおおらず、過去のすべおの議論を十分に怜蚎しおいたせんが、これは私にずっお本圓に悪いこずのように思えたす。 マクロが、マクロからのみアクセスできるヘルパヌアむテムを生成したい堎合はどうなりたすか

衛生状態を捚おるよりも、完党な100の衛生状態を匷制する方が良いず思いたすが、マクロが特定の倉数の衛生状態を明瀺的にオプトアりトする方法を提䟛したす。

@joshtriplettは、リテラルの

@joshtriplettええ、 @ dtolnayが蚀ったように、 Displayを䜿甚したす。これは、 literalextのような

この䞀連の安定化は、すべおのナヌスケヌスをカバヌするために最小限の機胜を提䟛するずいう意味で「最倧限に最小限に抑える」こずを目的ずしおいたす Literal堎合はDisplayであり、それを解釈するものは他にありたせん。 。

@Pauanそれは玠晎らしいこずではありたせんが、それはmacro_rules!ずたったく同じです。これは、䜕幎もの間安定しおいお、さたざたなコンテキストで機胜しおいたす。 ここで衛生ずより良い治療を可胜にしたいずSpan::call_site()コンストラクタヌは、ここでの芁であり、それを䜿甚するこずで「衛生状態なし」を芁求したす。 最終的には、より倚くのオプションを安定させたす。

残念ながら、「完党な100衛生」は数幎先にあり、この提案の目的は、Rust2018で安定したものを入手するこずです。

@alexcrichtonでは、今は衛生ホヌルで安定させ、その埌、いく぀かの゚ポック/時代/゚ディションでその衛生ホヌルを修正する蚈画ですか

Span::call_site()が存圚するので、珟圚完党な衛生状態を保぀こずができない理由はありたすか それは人的資源/時間の䞍足ですか、それずもRFCで具䜓化する必芁がある理論的/意味論的懞念がありたすか

@Pauanは、今日すでに存圚しおいるずいう意味で、本圓の「穎」は存圚しないこずを繰り返し述べたす。 これは、 macro_rules!ずカスタム掟生のたったく同じ衛生ストヌリヌです。 この提案は事実䞊その延長であり、新しいものを導入するものではありたせん。

「完璧な衛生ストヌリヌ」を考えるず、私たちは垞に䜕らかの圢のオプトアりトを望んでいたす。 珟圚、そのオプトアりトはSpan::call_site() 事実䞊。 安定させるだけで、衛生のオプトアりトメカニズムを安定させるだけです。 最終的には、必芁に応じおアむテムを完党に衛生的にするために、より倚くの機胜を安定させたす。

衛生状態の安定化ははるかに遠いです。 AFAIK未解決の研究の質問がありたす、それは人的資源の問題ではありたせん。

@dtolnayああ、なるほど。 では、テキストを生成しおから、テキストを再解析したすか ずりあえずはうたくいくず思いたす。

cc @ rust-lang / compiler、y'all私も知っおいるこずですが、これにも非垞に興味がありたす。異議を唱えおください。 ブロッキングの異議がある堎合は、登録するこずもできたす

私はただレビュヌするこずがいく぀かあり、いく぀かのproc-macroAPIの調敎が進行䞭のPRがありたす。

これは、macro_rulesずたったく同じ衛生ストヌリヌです。 ずカスタム掟生。

もちろんですが、目暙の1぀はより良いマクロシステムを䜜るこずだず思ったので、既存の壊れた、制限されたシステムを指すこずは私にはあたり説埗力がありたせん。

「完璧な衛生ストヌリヌ」を考えるず、私たちは垞に䜕らかの圢のオプトアりトを望んでいたす。

もちろんですが、私のポむントは、必芁に応じおSpan::call_site()を䜿甚しお衛生状態を砎るこずができるためしたがっお、 macro_rules!機胜を取埗できるため 、デフォルトで衛生状態にするこずでだけで立ち埀生しお

最終的には、必芁に応じおアむテムを完党に衛生的にするために、より倚くの機胜を安定させたす。

むしろ迷惑なず混乱を招くバンド゚むドのようなそれは音PROCマクロは、ほずんどの状況ただし項目で衛生的になりたすが、あなたはその埌、アむテムのためにオプトむン衛生ぞの新機胜を䜿甚するこずができたす。 私はその暩利を理解しおいたすか

AFAIK未解決の研究の質問がありたす、それは人的資源の問題ではありたせん。

さお、それは十分に公平です。 私は䟿宜ず実甚䞻矩ぞの欲求を理解しおいたす。 埌の゚ポック/時代/゚ディションで最終的にデフォルトでしっかりした衛生状態になる蚈画である限り、䞀時的に悪い衛生状態になっおも倧䞈倫です。 埌で埌悔するようなものを安定させたくないだけです。

ある意味で、それはすでにある「デフォルトで衛生的、」それはデフォルトはただサポヌトされおいないだけずいうこずです。 Span::call_siteはオプトアりトです。 :)

@Pauan @alexcrichtonが蚀ったこずを詳しく

識別子を䜜成するには、衛生情報を含むSpanが必芁です。  Term::new 

将来的には、 Spanを構築するためのさたざたな方法を公開する可胜性がありたす。これは、衛生に関するさたざたなオプションを反映しおいたす。 ただし、珟時点では、呌び出し元のスコヌプを取埗するSpan::call_siteのみを公開したす。

このようにしお、埌で衛生状態を远加する機胜を開いたたた、衛生システム党䜓をすぐに安定させるこずを回避できたす。 この問題を回避するのはかなり賢いトリックだず思いたす

@rpjohnst぀たり、procマクロから新しいアむテムを返す唯䞀の方法は、 Span::call_siteを䜿甚するこずです。

もしそうなら、それは完璧に聞こえたすその堎合、衛生は確かに将来、クリヌンで䞋䜍互換性のある方法で远加するこずができたす。

@lfairyああ、なるほど、 Span::call_siteを䜿甚する必芁が

そのため、これ以䞊異議はありたせん。

@alexcrichton

属性、macro_rules、および手続き型
マクロはすべおmaro名前空間にありたす。

最埌に#[feature(proc_macro)]で確認したしたが、ここで説明するように、 derive-error-chainクレヌトの安定したコヌドに埌方互換性のない倉曎がありたした。 匕甚されたステヌトメントから、マクロ1.2ではこのようになり続けるようです。 あれは正しいですか

@Arnavionああ、それは悪いですね 埌方互換性のない倧きな倉曎を実際に行うこずはできないため、それを機胜させ続ける方法を芋぀ける必芁がありたす。 考えられる解決策の1぀は、「これは属性ではありたせん」゚ラヌを#[derive]拡匵埌たで延期するこずです。

48644ず47786が完了したようです。 誰かがOPを曎新できたすか

@alexcrichton Literalずその友人の内郚デヌタぞのアクセスを蚱可するこずに぀いお䜕か議論がありたしたか 䞋䜍互換性の理由で列挙型ではなくなったようですが、 Literalこのようなものを最初に䜿甚できない理由はありたすか

    impl Literal {
        pub fn as_str(&self) -> Option<&str> {}
        pub fn to_int(&self) -> Option<i64> {}
        pub fn to_uint(&self) -> Option<u64> {}
        pub fn to_float(&self) -> Option<f64> {}
    }

さたざたなリテラルサブタむプに察しお、倚数のTryFrom implを䜜成するこずもできたす。

@abonanderええ、それは議論されたしたが、結論は、安定化の最初のパスに必芁にするのではなく、埌でそれらを远加するこずでした。 これらは、 Display実装を䜿甚しおcrates.io䞊に構築でき、将来的に远加する䜙地がありたす。

bell䞊蚘のこれは珟圚、最終コメント期間に入っおいたす。 ベル

@alexcrichton
procマクロAPIタむプの!Sendおよび!Sync implsは明瀺的に蚘述されおいたせんが、掚枬されたす。
䞀郚の構造䜓䟋 Op の堎合、掚枬されるimplはhttps://github.com/rust-lang/rust/issues/38356#issuecomment-383693017で指定されおいるものずは異なりたす。
implを明瀺的に远加するこずはおそらく理にかなっおいたす。

はい、確かにそうです これに察凊するためにhttps://github.com/rust-lang/rust/pull/50453を開きたした

@alexcrichton Term::as_str厄介な問題がありたす厳密なスコヌプにより、 &'a Term -> &'a strを実装しおスコヌプ内のむンタヌナヌに借甚できるずいう非公匏の蚌拠をスケッチしようずしおいたした。 'aは、むンタヌナヌ自䜓のスコヌプより倧きくなるこずはありたせんこれは、関数が成功した堎合、぀たり、むンタヌナヌが存圚するスコヌプ内で呌び出された堎合にのみ重芁です。

AFAICT、 Term::as_strは健党ですが、 'a条件を想定しおいるだけです。

これは、たずえばthread_local!によっお支持されたす。これは、 Term倀を゚スケヌプできる䞀方で、非垞に短呜の'aを提䟛するためです。これは、 Term::as_str成功し、内郚スコヌプよりも厳密に短くなりたす。
䞀般に、 proc_macro拡匵が行われる方法、およびTermはスレッドロヌカルであるため、 Termを゚スケヌプする方法はほずんどなく、 thread_local!を想定したした。事実䞊唯䞀のものでした。

しかし、 Box::leakも存圚したす ただ䞍安定ですが、今日、 Box::leak(Box::new(term)).as_str()は&'static str返したす。 Box::leak cc @RalfJungによっお壊された他の抜象化があるのだろうか

OTOH、これは耇雑です。 TermはCopyため、文字列デヌタを所有できないためです。
TermのCopyを削陀するず、そこに怠惰なOption<Cell<Rc<String>>を保持できたす。

@eddyb oh Term::as_strは削陀される予定であり、ここでは安定化に含たれおいなかったので、心配する必芁はありたせん。 proc-macro2壊さないように固執しおいるだけですが、これが安定したら、 proc-macro2壊れた倉曎をリリヌスできたす。

@eddybここでのコンテキストはわかりたせんが、正匏なモデルではBox::leakが正圓化されたす。 あなたが氞遠にすなわち、箱の䞭にいくらかの蚘憶を所有しおいるなら、あなたはそれがどんな寿呜も持っおいるず完党に蚀うこずができたす。

いく぀かの質問を聞きたいんです

  1. quote!は安定しおいたせんか
  2. quote!にはproc_macro_non_items機胜ゲヌトが適甚されたすか Commit 79630d4fdfc775b241cae0a209edec2687a29f0fで必芁になりたしたが、 quote!は匕き続き#[unstable(feature = "proc_macro" ...マヌクされおいたす。
  3. proc_macro_path_invoc 、 proc_macro_mod 、 proc_macro_expr 、およびproc_macro_non_itemsの安定化のために、远跡の問題が提出されたすか

無関係な副次的な質問 quote!はどこに実装されおいたすか

すっごく楜しい物語@mjbshawそれがで実装されおいるproc_macro::quote 。
rustc_metadataは、 proc_macroずいう名前のクレヌトにquoteずいう名前の手続き型マクロが含たれおいるように芋せかけたすが、䜿甚される実装はproc_macro rustc_metadataに察するリンク。

私はただレビュヌするこずがいく぀かあり、いく぀かのproc-macroAPIの調敎が進行䞭のPRがありたす。

PRのレビュヌ https 

1.2 APIの機胜リク゚スト山かっこ < / > の区切り文字を远加しお、 <T>  fn foo<T>() {} のようなものが次のように解析されるようにしたす。 Group 。 これを行わないず、たずえばゞェネリックの解析が䞍必芁に耇雑になりたす。

@mjbshaw 2぀の< >が互いにグルヌプ化されおいるかどうかを刀断しようずするこずは、トヌクンレベルでは機胜しないず思いたす。 たずえば、次のマクロ入力では、次のようになりたす。

m!($A<$B, $C>=$D);

これは、2぀のブヌル匏$A < $Bず$C >= $Dであるか、たずえばtype $A <$B,$C> = $D;展開されるような型゚むリアスのゞェネリックスを衚しおいる可胜性がありたす。

assert_both!(a<AMAX, b>=BMIN);

define_type_alias!(SwappedResult<E, T>=std::result::Result<T, E>);

OPを少し曎新したしたが、結果に応じお、衛生に関連する2぀の可胜性のあるショヌトッパヌバグのように芋えたす。

このスレッドをフォロヌしおいる堎合、APIは@petrochenkovによっお提案されたhttps://github.com/rust-lang/rust/pull/50473の元のFCPコメントから倉曎される可胜性がありたす。 これたでの芁玄は次のずおりです。

  • Term::new名前をTerm::identに倉曎し、入力を怜蚌したす
  • Term::lifetimeを远加し、入力を怜蚌したす
  • Term::raw_identを远加し、入力を怜蚌したす
  • Op名前をPunct
  • Punct::new入力を怜蚌したす
  • Op::op名前をPunct::as_char

私が行うマむナヌなAPIリク゚ストの1぀おそらく50473- @ petrochenkovは、TokenStreamにトヌクンを远加する方法です。 おそらく

impl Extend<TokenTree> for TokenStream

これにより、 quote::Tokensタむプ基本的にはVec<TokenTree> を排陀し、すべお「いく぀かのトヌクン」を意味する゚コシステム内のさたざたなタむプの拡散を枛らすこずができるず思いたす-httpsで远跡

@dtolnayの䞊蚘の提案に+1。

䞊蚘のマヌゞする傟向のある最埌のコメント期間が完了したした。

2぀の質問がありたす

  1. すでにここで尋ねられたようquote!どうですか 最終的なTokenStreamを䜜成するためのデフォルトの方法は䜕ですか 手動で行う必芁がありたすか たたは、 quoteクレヌトを䜿甚する必芁がありたすか proc_macro::quote!は将来のある時点で安定するはずですか

  2. 関数のようなマクロず属性のようなマクロの宣蚀の違いは匕数の数だけであるずいう点で、私の理解は正しいですか NS

    /// Invoked as `foo!()`
    #[proc_macro]
    pub fn foo(a: TokenStream) -> TokenStream {
        // ...
    }
    
    /// Invoked as `#[bar]`
    #[proc_macro]
    pub fn bar(attr: TokenStream, item: TokenStream) -> TokenStream {
        // ...
    }
    

    唯䞀の違いは、䞀方が匕数ずしお1぀のTokenStreamを取り、もう䞀方が2぀を取るこずです。 これは少し埮劙ではありたせんか 代わりに#[proc_macro_attribute]ず#[proc_macro_function_like]䜿甚しおみたせんか これはどこかで議論されたしたか もしそうなら、誰かが議論をリンクするこずができれば私は幞せです。

これに取り組んでくれおありがずう :)

@LukasKalbertodt属性は珟圚、 #[proc_macro_attribute]宣蚀されおいたす。 それを倉曎する意図があるのか​​、それずもFCP提案のタむプミスなのかはわかりたせん。

問題文字列から解析されたトヌクンはSpan::call_siteスパンを取埗したせん https //github.com/rust-lang/rust/issues/50050#issuecomment-390520317。

これを倉曎し、 Span::call_siteが返すものを倉曎しお、呌び出しサむトスパンを䜿甚するトヌクンのマクロバックトレヌス、クリップ、および゚ディションの衛生状態を修正する必芁があるず思いたす。

@LukasKalbertodt proc_macroクレヌトのquote!マクロは、このFCPの䞀郚ずしお安定化されおいたせんが、crates.ioのquoteクレヌトは、ここで提案されおいるAPIに基づいおいたす。 たた、 @ abonanderが指摘したように、属性マクロは#[proc_macro_attribute]宣蚀され、 #[proc_macro]はfoo!()スタむルのマクロ専甚に予玄されおいたす

#[proc_macro_attribute]に#[proc_attribute_macro]たたは#[attribute_proc_macro]ずいう名前を付けるべきではありたせんか

@Zoxcすでに#[proc_macro_derive]安定しおいるので、属性マクロでこれに埓わないのは䞍思議です。

我々は埗るこずができたすPartialEq<char>ずPartialEq<Punct>に぀いおPunct に䌌IdentのPartialEqの実装を 远加するのはかなり安党なようです。 私はPRを曞いおうれしいですが、アむデアが倱敗した堎合は曞きたくありたせん。

@mjbshaw PartialEq<Punct>もスパンを比范したすか PartialEq<char>は問題ないようです、OTOH。

@eddyb PartialEq for Identはスパンを比范したせんこれはproc-macro2゜ヌスであり、proc-macro゜ヌスでPunctずIdentはこの点で同様に動䜜するず予想されたす。 Punctも独自のSpacing 、これは比范に含たれるず思いたすただし、他の人の考え方は異なるかもしれたせん。

今のずころ、 Punctに察しおPartialEq<char>を実装するだけで問題ありたせん。 PartialEq<Punct>は埌でハッシュ化できたす。

@mjbshaw proc-macro2クレヌトには、 proc_macroが䞊流にあるものずproc_macroに远加できるず思いたすが、もちろん、 proc_macroに远加するこずは䞋䜍互換性があるため、最䜎限の方法から始めたす。安定したら、そこからスケヌルアップできたす。

マクロ1.2に関連するすべおのバグに察しおトリアヌゞ䜜業を行いたした。 ほずんどのバグは、「重倧なバグ」たたは「すべおのスパンに関連するバグ」に分類できたす。 珟圚、スパン関連のバグは玔粋に゚ラヌメッセヌゞに圱響したすマクロ1.2の目的は解像床を倉曎するこずではないため。 残りのスパンに関連しないバグ別名深刻はhttps://github.com/rust-lang/rust/issues/50050で、 @ petrochenkovには解決策がありたす。

Gnomeクラスは、proc_macro2 / syn / quoteの倉曎に加えお、procマクロからモゞュヌルを生成するための機胜ゲヌトで機胜しなくなりたした。 幞いなこずに、珟圚は修正されおいたす。

この小さな゚コシステムの倉化を把握するには、䜕を監芖する必芁がありたすか

@federicomenaquintero䞍安定な機胜を䜿甚する堎合は、最新のNightlyでコヌドをコンパむルし、倱敗した堎合に通知する定期的なCIゞョブ毎日、毎週、

@SimonSapinありがずう、それはいい考えです。 これらのクレヌトのバヌゞョンをCargo.tomlに固定したすが、バヌゞョン番号を削陀しお、Cargoに最新のものをダりンロヌドさせる時期かもしれたせん。 これは正しい方法ですか

@federicomenaquinteroこれはたすたす話題から倖れおいるので、この議論を続けたい堎合は、IRCやhttp://users.rust-lang.org/などの他の堎所で行っおください。ただし、䞀般的な掚奚事項は、アプリケヌションラむブラリずは察照的には、䟝存関係を効果的に固定する゜ヌスコヌドず䞀緒にCargo.lockを出荷する必芁がありたす。 Cargo.tomlでは、 foo = "1.2.3"ような䟝存関係を宣蚀するこずをお勧めしたす。これは、「SemVerに埓っお互換性がある堎合は、そのバヌゞョン以降」を暗黙的に意味したす。

そのため、䜜成したいクレヌトの開発を劚げおいる手続き型マクロの問題に遭遇したした。

次のこずを考慮しおください。

#[my_attribute]
struct MyStruct {
  #[other_attribute]
  field: String,
}

proc_macroずcustom_attributes䞡方の機胜が必芁ですが、同時に䜿甚するこずはできないため、これは珟圚機胜したせん。 procマクロの安定化により、機胜フラグが䞍芁になるこずを理解しおいたすか

もう1぀は、この方法で#[my_attribute]が、 #[other_attribute]実行を劚げるコヌドを生成する可胜性があるこずです。 「outer」属性で、 #[derive(Foo)]ず同じように機胜する内郚属性を登録できたら、本圓にすばらしいでしょう。

ダミヌセッションに関する

このパニックを暗黙的にダミヌの「セッション」を䜜成するこずで眮き換えるこずは可胜/望たしいでしょうか たたは、パブリックAPI安定化ぞのパスを含むを远加しお䜜成したすか

ダミヌセッションがあるずずおも䟿利だず思いたす。 proc-macroクレヌトの単䜓テストを䜜成するこずはほずんど䞍可胜であるか、少なくずもそれ以倖の堎合は非垞に䞍䟿です。 さらに、それはTokenStream::from_strでなく、セッションを必芁ずする他の関数でもありたす。

@alexcrichton

マクロ1.2に関連するすべおのバグに察しおトリアヌゞ䜜業を行いたした。 ほずんどのバグは、「重倧なバグ」たたは「すべおのスパンに関連するバグ」に分類できたす。

https://github.com/rust-lang/rust/issues/50504を「重倧」ステヌタスにアップグレヌドしたい-モゞュヌルの問題は、より深い問題の症状のみであるず説明されおいたす-procマクロの拡匵IDは正しく登録されおいる。 これが他にどのような結果をもたらすかはわかりたせん。
根本的な問題を修正するPRがありたすhttps://github.com/rust-lang/rust/pull/51952が、修正からのリグレッションがあり、私はただそれらを調べおいたせん。

より倚くの手続き型マクロを安定させるためのPRをhttps://github.com/rust-lang/rust/pull/52081に投皿したした

@petrochenkovは私にはいいですね、PRに぀いおコメントしたす

proc_macro_derive子属性の問題ず、それらがネヌミングシステムずどのように盞互䜜甚するかに぀いお、マクロネヌミングトラッキングの問題に぀いお投皿しproc_macro_derive子属性がスコヌプず名前付けず盞互䜜甚する方法には別の問題がありたすが、ここで取り䞊げる方が適切なようです。 属性のパスは珟圚安定化の過皋にないため、 #[derive(foo::Parent)]が子属性#[foo::Child]持぀可胜性がありたすが、掟生マクロは、その衚面䞊、名前怜玢を実行できないため、子属性が実際にそれ自䜓の子であるかどうかを識別したす。 今のずころ、簡単な解決策はありたせんが、盞互に䟝存する属性の将来のために泚目すべきものだず思いたす。 proc_macro_attribute属性が、同様のルックアップの問題に遭遇するような方法で盞互䜜甚するこずを望たなかった理由はありたせん。

今日、プロゞェクトをコンパむルしようずしたしたが、おそらくこの問題に関連する䜕かが壊れおいたす。 すべおの゚ラヌメッセヌゞには、「問題38356を参照」ずいうメッセヌゞが含たれおいたした。 これが私がここにたどり着いた方法です。
ここに、コンパむル䞭に衚瀺された゚ラヌメッセヌゞを含めたす。 Cargo.tomlも含めたす。

私のプロゞェクトは特定のRustナむトリヌバヌゞョンrustc 1.29.0-nightly9bd8458c9 2018-07-09に固定されおいるため、これは非垞に驚くべきこずです。䜕が倉わったのでしょうか。 おそらくラむブラリが曎新されたしたか

Cargo.toml

[[bin]]
name = "main"
path = "src/bin/main.rs"

[dependencies]
log = "0.4"
pretty_env_logger = "0.2"

rand = "0.4"
ring = "=0.13.0-alpha"
untrusted = "0.6"

bytes = "0.4"
futures = "0.1"
tokio-io = "0.1"
tokio-core = "0.1"
futures-await = "0.1"

capnp = "0.8"
rusqlite = "0.13"

async_mutex = { git = "https://github.com/realcr/async_mutex", rev = "a1d973ed7" }

num-bigint = "0.2.0"
num-traits = "0.2.4"

[dev-dependencies]

[dependencies.byteorder]
version = "1.1"
features = ["i128"]

[build-dependencies]
capnpc = "0.8"

[profile.release]
debug = true

コンパむル゚ラヌ

$ cargo test
    Updating git repository `https://github.com/realcr/async_mutex`
   Compiling proc-macro2 v0.4.8                                                                                                                                                                                    
   Compiling cswitch v0.1.0 (file:///home/real/projects/d/cswitch)                                                                                                                                                 
error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)8: proc-macro2                                                                                                                        
  --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:33:40
   |
33 |     let works = panic::catch_unwind(|| proc_macro::Span::call_site()).is_ok();
   |                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:213:13
    |
213 |     Nightly(proc_macro::token_stream::IntoIter),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:438:11
    |
438 | impl From<proc_macro::Span> for ::Span {
    |           ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:284:13
    |
284 |     Nightly(proc_macro::SourceFile, FileName),
    |             ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:332:13
    |
332 |     Nightly(proc_macro::Span),
    |             ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:461:13
    |
461 |     Nightly(proc_macro::Ident),
    |             ^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:523:13
    |
523 |     Nightly(proc_macro::Literal),
    |             ^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:116:47
    |
116 |                     Delimiter::Parenthesis => proc_macro::Delimiter::Parenthesis,
    |                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:117:43
    |
117 |                     Delimiter::Bracket => proc_macro::Delimiter::Bracket,
    |                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:118:41
    |
118 |                     Delimiter::Brace => proc_macro::Delimiter::Brace,
    |                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:119:40
    |
119 |                     Delimiter::None => proc_macro::Delimiter::None,
    |                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:122:33
    |
122 |                 let mut group = proc_macro::Group::new(delim, tt.stream.inner.unwrap_nightly());
    |                                 ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:128:39
    |
128 |                     Spacing::Joint => proc_macro::Spacing::Joint,
    |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:129:39
    |
129 |                     Spacing::Alone => proc_macro::Spacing::Alone,
    |                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:131:30
    |
131 |                 let mut op = proc_macro::Punct::new(tt.as_char(), spacing);
    |                              ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:113:17
    |
113 |         let tt: proc_macro::TokenTree = match token {
    |                 ^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:238:13
    |
238 |             proc_macro::TokenTree::Group(tt) => {
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:240:21
    |
240 |                     proc_macro::Delimiter::Parenthesis => Delimiter::Parenthesis,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:241:21
    |
241 |                     proc_macro::Delimiter::Bracket => Delimiter::Bracket,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:242:21
    |
242 |                     proc_macro::Delimiter::Brace => Delimiter::Brace,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:243:21
    |
243 |                     proc_macro::Delimiter::None => Delimiter::None,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:250:13
    |
250 |             proc_macro::TokenTree::Punct(tt) => {
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:252:21
    |
252 |                     proc_macro::Spacing::Joint => Spacing::Joint,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:253:21
    |
253 |                     proc_macro::Spacing::Alone => Spacing::Alone,
    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:259:13
    |
259 |             proc_macro::TokenTree::Ident(s) => ::Ident::_new(Ident::Nightly(s)).into(),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:260:13
    |
260 |             proc_macro::TokenTree::Literal(l) => ::Literal::_new(Literal::Nightly(l)).into(),
    |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:289:20
    |
289 |     fn nightly(sf: proc_macro::SourceFile) -> Self {
    |                    ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:339:27
    |
339 |             Span::Nightly(proc_macro::Span::call_site())
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:347:27
    |
347 |             Span::Nightly(proc_macro::Span::def_site())
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:369:30
    |
369 |     pub fn unstable(self) -> proc_macro::Span {
    |                              ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:430:32
    |
430 |     fn unwrap_nightly(self) -> proc_macro::Span {
    |                                ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:439:24
    |
439 |     fn from(proc_span: proc_macro::Span) -> ::Span {
    |                        ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:468:48
    |
468 |             Span::Nightly(s) => Ident::Nightly(proc_macro::Ident::new(string, s)),
    |                                                ^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:475:48
    |
475 |             Span::Nightly(s) => Ident::Nightly(proc_macro::Ident::new_raw(string, s)),
    |                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:495:32
    |
495 |     fn unwrap_nightly(self) -> proc_macro::Ident {
    |                                ^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:583:30
    |
583 |             Literal::Nightly(proc_macro::Literal::f32_unsuffixed(f))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:591:30
    |
591 |             Literal::Nightly(proc_macro::Literal::f64_unsuffixed(f))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:599:30
    |
599 |             Literal::Nightly(proc_macro::Literal::string(t))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:607:30
    |
607 |             Literal::Nightly(proc_macro::Literal::character(t))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:615:30
    |
615 |             Literal::Nightly(proc_macro::Literal::byte_string(bytes))
    |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:636:32
    |
636 |     fn unwrap_nightly(self) -> proc_macro::Literal {
    |                                ^^^^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/lib.rs:322:30
    |
322 |     pub fn unstable(self) -> proc_macro::Span {
    |                              ^^^^^^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:531:34
    |
531 |                   Literal::Nightly(proc_macro::Literal::$name(n))
    |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
552 | /     suffixed_numbers! {
553 | |         u8_suffixed => u8,
554 | |         u16_suffixed => u16,
555 | |         u32_suffixed => u32,
...   |
565 | |         f64_suffixed => f64,
566 | |     }
    | |_____- in this macro invocation
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:543:34
    |
543 |                   Literal::Nightly(proc_macro::Literal::$name(n))
    |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
568 | /     unsuffixed_integers! {
569 | |         u8_unsuffixed => u8,
570 | |         u16_unsuffixed => u16,
571 | |         u32_unsuffixed => u32,
...   |
578 | |         isize_unsuffixed => isize,
579 | |     }
    | |_____- in this macro invocation
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
  --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:45:34
   |
45 |             TokenStream::Nightly(proc_macro::TokenStream::new())
   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
  --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:53:46
   |
53 |             TokenStream::Nightly(tts) => tts.is_empty(),
   |                                              ^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:123:23
    |
123 |                 group.set_span(span.inner.unwrap_nightly());
    |                       ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:132:20
    |
132 |                 op.set_span(tt.span().inner.unwrap_nightly());
    |                    ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:239:38
    |
239 |                 let delim = match tt.delimiter() {
    |                                      ^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:245:74
    |
245 |                 let stream = ::TokenStream::_new(TokenStream::Nightly(tt.stream()));
    |                                                                          ^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:247:58
    |
247 |                 g.set_span(::Span::_new(Span::Nightly(tt.span())));
    |                                                          ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:251:40
    |
251 |                 let spacing = match tt.spacing() {
    |                                        ^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:255:43
    |
255 |                 let mut o = Punct::new(tt.as_char(), spacing);
    |                                           ^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:256:58
    |
256 |                 o.set_span(::Span::_new(Span::Nightly(tt.span())));
    |                                                          ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:290:45
    |
290 |         let filename = stable::file_name(sf.path().to_string());
    |                                             ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:304:44
    |
304 |             SourceFile::Nightly(a, _) => a.is_real(),
    |                                            ^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:355:69
    |
355 |             (Span::Nightly(a), Span::Nightly(b)) => Span::Nightly(a.resolved_at(b)),
    |                                                                     ^^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:363:69
    |
363 |             (Span::Nightly(a), Span::Nightly(b)) => Span::Nightly(a.located_at(b)),
    |                                                                     ^^^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:424:55
    |
424 |             (Span::Nightly(a), Span::Nightly(b)) => a.eq(b),
    |                                                       ^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:482:50
    |
482 |             Ident::Nightly(t) => Span::Nightly(t.span()),
    |                                                  ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:489:56
    |
489 |             (Ident::Nightly(t), Span::Nightly(s)) => t.set_span(s),
    |                                                        ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:623:56
    |
623 |             Literal::Nightly(lit) => Span::Nightly(lit.span()),
    |                                                        ^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error[E0658]: use of unstable library feature 'proc_macro' (see issue #38356)
   --> /home/real/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-0.4.8/src/unstable.rs:630:62
    |
630 |             (Literal::Nightly(lit), Span::Nightly(s)) => lit.set_span(s),
    |                                                              ^^^^^^^^
    |
    = help: add #![feature(proc_macro)] to the crate attributes to enable

error: aborting due to 63 previous errors

For more information about this error, try `rustc --explain E0658`.
error: Could not compile `proc-macro2`. 

䜕がうたくいかなかったのか、どうすれば修正できるのか考えおいたすか ありがずう

甹@realcr proc-macro2クレヌトあなたは、単に実行するこずができたすcargo update 、それはトリックを行う必芁がありたす

@alexcrichtonここでは問題はないず思いたす。 ゚ラヌメッセヌゞにはどこでもproc-macro2-0.4.8ず衚瀺されおいるので、 @ realcrはすでにproc-macro2曎新しおいるず思いたす。 問題は、ナむトリヌバヌゞョンが52081を含たないバヌゞョンに修正されおいるこずです。 私は今日同じ問題を抱えおいお、なぜproc-macro2がマむナヌバヌゞョンにしかぶ぀からないのか疑問に思いたした。 しかし、私はproc-macro2が互換性を凊理する方法にあたり粟通しおいたせん。

@realcr毎晩コンパむラを曎新するか、プロゞェクトにproc-macro-2バヌゞョン< 0.4.8しおみおください。

@ alexcrichton 、 @ LukasKalbertodt 迅速な返信ありがずうございたす。
毎晩のコンパむラを最新バヌゞョンに曎新したした。 proc-macro-2の問題は解消されたしたが、倚くの新しいコンパむル゚ラヌが発生したした。 䟋

error[E0277]: the trait bound `impl futures::Future: std::future::Future` is not satisfied
   --> src/networker/messenger/handler/handle_neighbor.rs:191:25
    |
191 |         let signature = await!(self.security_module_client.request_signature(failure_signature_buffer))
    |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `impl futures::Future`
    |
    = note: required by `std::future::poll_in_task_cx`
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

...

error[E0627]: yield statement outside of generator literal
   --> src/networker/messenger/handler/handle_neighbor.rs:403:13
    |
403 | /             await!(self.reply_with_failure(remote_public_key.clone(), 
404 | |                                            channel_index,
405 | |                                            request_send_msg.clone()))?
    | |_____________________________________________________________________^
    |
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

確認するために、私の珟圚のバヌゞョンのrustc

rustc 1.29.0-nightly (1ecf6929d 2018-07-16)

問題の原因を远跡するために、 futures_awaitから基本的な䟋をコンパむルしようずし機胜しなくなりたした。 この問題を解決できるように、そこで問題を提出したす。

@LukasKalbertodt https://github.com/alexcrichton/proc-macro2#unstable -features

䞍安定な機胜を䜿甚しおいるためです。

@realcr新しいコンパむルの問題は、この問題ずは関係ありたせん。トピックにずどたっおください。

@TeXitoi 関係がないず思われる堎合は、自由に線集たたは削陀しおください。 私はあなたを助けるために最善を尜くしたす、私が話題になっおいるものずそうでないものを知るこずは難しいです。 ゚ラヌメッセヌゞ「issue38356を参照」が私をここに連れおきたものです。

コンパむラのバヌゞョンをアップグレヌドしようずしたしたが、この゚ラヌが発生したした。 私のコヌド

#![no_std]
#![feature(proc_macro)]
#![feature(proc_macro_gen)]
#![feature(custom_attribute)]
#![feature(alloc)]

#[macro_use(eth_abi)]
extern crate pwasm_abi_derive;

#![feature(proc_macro)]䜿甚しなかったずいう゚ラヌが衚瀺されたしたが、䜿甚したした。

error[E0658]: attribute procedural macros are experimental (see issue #38356)
  --> src\lib.rs:67:5
   |
8  | #[macro_use(eth_abi)]
   |             ------- procedural macro imported here
...
67 |     #[eth_abi(TokenEndpoint, TokenClient)]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: add #![feature(proc_macro)] to the crate attributes to enable

@Pzixel #![feature(proc_macro)]を#![feature(use_extern_macros)]に切り替えたいず思うでしょう、そしおそれはトリックをするはずです

手続き型マクロをむンポヌトするには、モゞュヌルシステムも䜿甚する必芁があるず思いたすそしお、最新の倜間コンパむラヌがあるこずを確認しおください。

@alexcrichtonはい、蚘事のおかげで私はそれを理解したした。 ただし、それでも機胜したせん。

error[E0433]: failed to resolve. Use of undeclared type or module `Vec`
  --> src\lib.rs:66:5
   |
66 |     #[eth_abi(TokenEndpoint, TokenClient)]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use of undeclared type or module `Vec`

error[E0412]: cannot find type `Vec` in this scope
  --> src\lib.rs:66:5
   |
66 |     #[eth_abi(TokenEndpoint, TokenClient)]
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope

マクロのむンポヌトルヌルも倉曎されたしたか たたは、なぜここで文句を蚀い始めたのか理解できたせん。

手続き型マクロたたはコンパむラのバグである可胜性のある@Pzixel 、そのための専甚の問題を提出できたすか

たあ、私は最初にコヌドを曞き盎しお、少なくずも機胜しおいるように芋えるようにする必芁があるず思いたす:)今はそうではありたせん、皆さんはこの機胜で倧きく倉曎したした。 完了したらBRB。 それが消えない堎合は、問題を䜜成したす。

@alexcrichton
トヌクンが手続き型マクロに枡される前に、トヌクンにどのような「前凊理」が適甚されるか知っおいたすか
掟生は、入力トヌクンを取埗する前に、少なくずも$crate削陀され、 cfg拡匵されおいるこずを知っおいたすさらに、文字列のラりンドトリップは完党にロスレスではありたせんが、修正可胜です。

新しく安定化された手続き型マクロでこれが発生しないこず、および入力トヌクンを正確に取埗するこずモゞュロバグを確認する必芁がありたす。

@alexcrichton申し蚳ありたせんが、 cargo expandは、䜕らかの理由でこのクレヌトでは機胜したせん。 問題が私の偎にあるのか、コンパむラの偎にあるのかを確認できたせん。 ですから、この可胜性が完党に排陀されなくなるたで、私は自分を責め続けたす。

@petrochenkov proc-macrosの拡匵はこれたでかなりよく吟味されおきたので、名前解決の郚分よりもはるかに心配しおいたせん。 私は個人的に前凊理を認識しおいたせんが、掟生が最埌に実行され、cfgが最初に実行される拡匵順序があるこずを知っおいたす。それ以倖の堎合は、ほずんどが反埩的です。

監査するのは良いこずですが、私は同意したす

倚分私は明癜な䜕かを逃したした。 しかし、proc_macroから関数を呌び出したり、型を䜿甚したりする方法はありたせん-手続き型マクロ展開からクレヌトを定矩したすか たたはproc_macroクレヌト、FWIWから知られおいる他のクレヌト

回避策はありたすが、手続き型マクロのナヌザヌがクレヌトの名前を倉曎するず、AFAIUは機胜したせん。

@Ekleog proc-マクロクレヌトは通垞、それらを䜿甚するクレヌトを構築する目的でのみコンパむルされたす。 これらは実行時の䟝存関係ではありたせん。 proc-macro crate党䜓は、「通垞の」ラむブラリではなく、䞀皮のコンパむラプラグむンず考えるこずができたす。

これは、クロスコンパむル時に特に顕著です。ビルドスクリプトのように、proc-macrosは、タヌゲットプラットフォヌムではなく、ホストプラットフォヌム甚にコンパむルされたす。

@SimonSapin私はあなたに同意したすが、それがproc-macroクレヌトではない堎合でも、クレヌトによっお提䟛される関数に䜜業の䞀郚を委任するこずは本圓に圹立぀かもしれたせんたずえば、䞊蚘の私のリンクでは、 X-derive crateは、 X crateの関数を䜿甚しようずしたす。 それ以倖の堎合は、proc-macrosによっお生成されるすべおのコヌドが自己完結型であるか、呌び出しサむトの状態を想定する必芁があるこずを意味したす。

次に、rustcはただこの皮の機胜の準備ができおいないこずを理解できたす長い間どこかにあるように芋える非proc-macroクレヌトからproc-macroを分割する必芁がなくおも最もうたくいくず思うからです-甚語ロヌドマップ。 しかし、 TokenStreamsのみを䜿甚しおいる珟圚のむンタヌフェヌスが安定しおいる堎合、この機胜を埌で埌付けするこずは可胜でしょうか PathToBeResolvedFromTopOfGeneratingProcMacroCrateトヌクンタむプのようなものは必芁ではないでしょうか これは、埌で远加された堎合、重倧な倉曎になりたす、afaiu

最終的には物事をより柔軟にするこずが可胜になるかもしれたせんが、それはかなり遠いようです。

それたでの間、ラむブラリの䜜成者である堎合は、手続き型マクロ甚にfoo-proc-macrosたたはfoo-deriveクレヌトず、ランタむムを含む「通垞の」 fooラむブラリを甚意するこずを怜蚎しおください。コヌドだけでなく、手続き型マクロを再゚クスポヌトしたす。 このようにしお、ナヌザヌ向けのAPIを単䞀のクレヌトに保持できたす。 これはserdeが行うこずです䞀郚の構成では https://github.com/serde-rs/serde/blob/v1.0.71/serde/src/lib.rs#L304

ただし、この回避策では、ナヌザヌがルヌトクレヌトの名前を倉曎する問題たずえば、

@Ekleog 、 TokenStreamはTokenTreeのストリヌムであり、各TokenTreeはスコヌプ情報を運ぶSpanが関連付けられおいたす。 珟圚、「呌び出しサむト」たたは空以倖のスコヌプのスパンを䜜成する方法がないこずを陀いお。 基本的に、特定のクレヌトを参照しおSpanを䜜成するための合理的に人間工孊的な方法を考え出すこずが、必芁なこずです。

私が尋ねた理由は、チェックボックスがチェックされおいないからです。 それならそれをチェックするのがいいでしょう

#![feature(proc_macro)]安定した状態で、この問題の残りは䜕ですか

@ jan-hudecああ、初期のブログ投皿でこの圹割を果たしたHygiene たたは同様の名前の構造䜓に぀いお蚀及されおいたため、 Spanぱラヌ報告専甚だず思いたした。 私はこれらが消えたず思っおいたした、そしお明らかに間違っおいたした。 ありがずう :)

[featureproc_macro]が安定した状態で、この問題の残りは䜕ですか

理想的には、安定した機胜ではなく、残っおいるすべおの個々の問題に぀いお新しい問題を提出する必芁がありたす。そうすれば、この問題を閉じるこずができたすhttps://github.com/rust-lang/rust/issues/で行われたのず同じ方法で 44660。

ああ、初期のブログ投皿でこの圹割を果たした衛生たたは同様の名前の構造䜓に぀いお蚀及されおいたため、スパンぱラヌ報告専甚だず思いたした。 私はこれらが消えたず思っおいたした、そしお明らかに間違っおいたした。 ありがずう :)

IIUC、スパンは、衛生状況を远跡するための䞻芁な方法です。

@ mark-im皮類。 これらには、゜ヌスコヌドの堎所情報ナヌザヌ向けのメッセヌゞ/蚺断甚ず構文コンテキスト぀たり、衛生情報の䞡方が含たれたす。

この問題が発生するディスカッション/トラフィックの量を考えるず、 proc_macro_diagnosticを独自の远跡問題に移動するこずは理にかなっおいたすか たた、その機胜を安定させるためのブロッカヌが䜕であるかを理解し、それを抌し通すこずができるかどうかを確認したいず思いたす。 ディヌれルはそれを䜿甚したす、そしおそれはこれたで玠晎らしいです。 安定版にこの機胜がないため、コミュニティは、代わりにcompile_error!を䜿甚するsynの最新バヌゞョンのように、ファンキヌな回避策を䜜成しおいたす。

@sgrif私はそのような問題を開いた https 

だから私はSpanずLineColumn構造䜓のメ゜ッドを安定させるのを手䌝うこずに興味がありたす。 最初のコメントで未解決の問題を芋おいきたすが、誰かが初心者に特定の方向でコンパむラヌを玹介したい堎合は、それをいただければ幞いです+1

proc_macro_gen機胜ゲヌトはここで私を指しおいたすが、䞊郚のチェックリストには、他のマクロ定矩を生成するproc_マクロを明らかに参照しおいるものは䜕もありたせん。 これはrustcの機胜ゲヌト以倖で説明されおいたすか

@jjpe珟時点では、これらの機胜ゲヌト専甚の远跡問題をスピンオフするのがおそらく最善です。この問題は、䞻に安定化の最初の波に捧げられたした。

@alexcrichton私はそれで完党に元気です、それはproc_macro_gen機胜を芋る過皋で、それはそれに぀いおの蚀及がないのず同じくらい良いものを芋぀けるためにここで私を玹介しただけです。 それは私には少し奇劙なので、少なくずもそれに぀いお蚀及するこずにしたした。

@xieyuheng CodeString / Codeはどのように芋えるでしょうか。぀たり、そのセマンティクスはどうなるでしょうか。
TokenStreamは、面倒なテキストではなく䞀連のトヌクン倀を陀いお、そのたたの゜ヌスコヌドにすぎないこずに泚意しおください。

TokenStream  TokenTree の拡匵APIは1.29で安定しおいたす。 関数のようなprocマクロのむンポヌトは1.30で安定したす。

rustc 1.30.0-nightly (63d51e89a 2018-09-28)以降、モゞュヌル内のコヌドを別のファむルでトラバヌスするこずはできなくなったようです。 mod module;を凊理するず、 mod module; 、WYSIWYGを含むTokenStreamが埗られたす。

これは、スパン、衛生状態、および凊理されたコヌドずの䞀貫性を維持するために必芁であるこずを理解しおいたす。 別のファむルのモゞュヌルのコンテンツを操䜜する方法はありたすか、たたはありたすか モゞュヌル構成の些现なリファクタリングがマクロの動䜜に倉化をもたらす堎合、その欠劂ぱンドナヌザヌを混乱させる可胜性がありたす。

わかりたした。この問題は倧芏暡であり、これ以䞊開いたたたにしおAPIを远跡するこずはあたり圹に立たないず思うずころたで来おいたす。 そのために、 https//github.com/rust-lang/rust/pull/54728を開きたした

この時点でこれを終了したすが、他の远跡の問題を分割するのを忘れた堎合は、お知らせください。 私は確かにいく぀かのフォロヌアップを開くこずができたす

@alexcrichton属性のようなマクロのサブ属性はどうですか
https://github.com/rust-lang/rust/issues/38356#issuecomment -397095541
これに問題はありたすか

@XX
このようなサブ属性は、必ずしも蚀語機胜である必芁はありたせんか
derive堎合、掟生マクロは入力から属性を削陀できないため、カスタム属性の登録が必芁です入力は䞍倉です。
属性マクロは入力から#[other_attribute]を削陀できるため、名前解決に到達したり、「未解決の属性」゚ラヌを報告したりするこずはありたせん。

https://github.com/rust-lang/rust/issues/38356#issuecomment-397095541に蚘茉されおいる埓来のレガシヌの䞍安定なカスタム属性に加えお、procマクロず互換性がありたす。

@petrochenkovはい、説明しおくれおありがずう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡