{"action":"created","comment":{"url":"https://api.github.com/repos/rust-lang/rfcs/pulls/comments/71225851","id":71225851,"diff_hunk":"@@ -0,0 +1,552 @@\n+- Feature Name: `rustc_macros`\n+- Start Date: 2016-07-14\n+- RFC PR: (leave this empty)\n+- Rust Issue: (leave this empty)\n+\n+# Summary\n+[summary]: #summary\n+\n+Extract a very small sliver of today's procedural macro system in the compiler,\n+just enough to get basic features like custom derive working, to have an\n+eventually stable API. Ensure that these features will not pose a maintenance\n+burden on the compiler but also don't try to provide enough features for the\n+\"perfect macro system\" at the same time. Overall, this should be considered an\n+incremental step towards an official \"macros 2.0\".\n+\n+# Motivation\n+[motivation]: #motivation\n+\n+Some large projects in the ecosystem today, such as [serde] and [diesel],\n+effectively require the nightly channel of the Rust compiler. Although most\n+projects have an alternative to work on stable Rust, this tends to be far less\n+ergonomic and comes with its own set of downsides, and empirically it has not\n+been enough to push the nightly users to stable as well.\n+\n+[serde]: https://github.com/serde-rs/serde\n+[diesel]: http://diesel.rs/\n+\n+These large projects, however, are often the face of Rust to external users.\n+Common knowledge is that fast serialization is done using serde, but to others\n+this just sounds likes \"fast Rust needs nightly\". Over time this persistent\n+thought process creates a culture of \"well to be serious you require nightly\"\n+and a general feeling that Rust is not \"production ready\".\n+\n+The good news, however, is that this class of projects which require nightly\n+Rust almost all require nightly for the reason of procedural macros. Even\n+better, the full functionality of procedural macros is rarely needed, only\n+custom derive! Even better, custom derive typically doesn't *require* the features\n+one would expect from a full-on macro system, such as hygiene and modularity,\n+that normal procedural macros typically do. The purpose of this RFC, as a\n+result, is to provide these crates a method of working on stable Rust with the\n+desired ergonomics one would have on nightly otherwise.\n+\n+Unfortunately today's procedural macros are not without their architectural\n+shortcomings as well. For example they're defined and imported with arcane\n+syntax and don't participate in hygiene very well. To address these issues,\n+there are a number of RFCs to develop a \"macros 2.0\" story:\n+\n+* [Changes to name resolution](https://github.com/rust-lang/rfcs/pull/1560)\n+* [Macro naming and modularisation](https://github.com/rust-lang/rfcs/pull/1561)\n+* [Procedural macros](https://github.com/rust-lang/rfcs/pull/1566)\n+* [Macros by example 2.0](https://github.com/rust-lang/rfcs/pull/1584)\n+\n+Many of these designs, however, will require a significant amount of work to not\n+only implement but also a significant amount of work to stabilize. The current\n+understanding is that these improvements are on the time scale of years, whereas\n+the problem of nightly Rust is today!\n+\n+As a result, it is an explicit non-goal of this RFC to architecturally improve\n+on the current procedural macro system. The drawbacks of today's procedural\n+macros will be the same as those proposed in this RFC. The major goal here is\n+to simply minimize the exposed surface area between procedural macros and the\n+compiler to ensure that the interface is well defined and can be stably\n+implemented in future versions of the compiler as well.\n+\n+Put another way, we currently have macros 1.0 unstable today, we're shooting\n+for macros 2.0 stable in the far future, but this RFC is striking a middle\n+ground at macros 1.1 today!\n+\n+# Detailed design\n+[design]: #detailed-design\n+\n+First, before looking how we're going to expose procedural macros, let's\n+take a detailed look at how they work today.\n+\n+### Today's procedural macros\n+\n+A procedural macro today is loaded into a crate with the `#![plugin(foo)]`\n+annotation at the crate root. This in turn looks for a crate named `foo` [via\n+the same crate loading mechanisms][loader] as `extern crate`, except [with the\n+restriction][host-restriction] that the target triple of the crate must be the\n+same as the target the compiler was compiled for. In other words, if you're on\n+x86 compiling to ARM, macros must also be compiled for x86.\n+\n+[loader]: https://github.com/rust-lang/rust/blob/78d49bfac2bbcd48de522199212a1209f498e834/src/librustc_metadata/creader.rs#L480\n+[host-restriction]: https://github.com/rust-lang/rust/blob/78d49bfac2bbcd48de522199212a1209f498e834/src/librustc_metadata/creader.rs#L494\n+\n+Once a crate is found, it's required to be a dynamic library as well, and once\n+that's all verified the compiler [opens it up with `dlopen`][dlopen] (or the\n+equivalent therein). After loading, the compiler will [look for a special\n+symbol][symbol] in the dynamic library, and then call it with a macro context.\n+\n+[dlopen]: https://github.com/rust-lang/rust/blob/78d49bfac2bbcd48de522199212a1209f498e834/src/librustc_plugin/load.rs#L124\n+[symbol]: https://github.com/rust-lang/rust/blob/78d49bfac2bbcd48de522199212a1209f498e834/src/librustc_plugin/load.rs#L136-L139\n+\n+So as we've seen macros are compiled as normal crates into dynamic libraries.\n+One function in the crate is tagged with `#[plugin_registrar]` which gets wired\n+up to this \"special symbol\" the compiler wants. When the function is called with\n+a macro context, it uses the passed in [plugin registry][registry] to register\n+custom macros, attributes, etc.\n+\n+[registry]: https://github.com/rust-lang/rust/blob/78d49bfac2bbcd48de522199212a1209f498e834/src/librustc_plugin/registry.rs#L30-L69\n+\n+After a macro is registered, the compiler will then continue the normal process\n+of expanding a crate. Whenever the compiler encounters this macro it will call\n+this registration with essentially and AST and morally gets back a different\n+AST to splice in or replace.\n+\n+### Today's drawbacks\n+\n+This expansion process suffers from many of the downsides mentioned in the\n+motivation section, such as a lack of hygiene, a lack of modularity, and the\n+inability to import macros as you would normally other functionality in the\n+module system.\n+\n+Additionally, though, it's essentially impossible to ever *stabilize* because\n+the interface to the compiler is... the compiler! We clearly want to make\n+changes to the compiler over time, so this isn't acceptable. To have a stable\n+interface we'll need to cut down this surface area *dramatically* to a curated\n+set of known-stable APIs.\n+\n+Somewhat more subtly, the technical ABI of procedural macros is also exposed\n+quite thinly today as well. The implementation detail of dynamic libraries, and\n+especially that both the compiler and the macro dynamically link to libraries\n+like libsyntax, cannot be changed. This precludes, for example, a completely\n+statically linked compiler (e.g. compiled for `x86_64-unknown-linux-musl`).\n+Another goal of this RFC will also be to hide as many of these technical\n+details as possible, allowing the compiler to flexibly change how it interfaces\n+to macros.\n+\n+## Macros 1.1\n+\n+Ok, with the background knowledge of what procedural macros are today, let's\n+take a look at how we can solve the major problems blocking its stabilization:\n+\n+* Sharing an API of the entire compiler\n+* Frozen interface between the compiler and macros\n+\n+### `librustc_macro`\n+\n+Proposed in [RFC 1566](https://github.com/rust-lang/rfcs/pull/1566) and\n+described in [this blog post](http://ncameron.org/blog/libmacro/) the\n+distribution will now ship with a new `librustc_macro` crate available for macro\n+authors. The intention here is that the gory details of how macros *actually*\n+talk to the compiler is entirely contained within this one crate. The stable\n+interface to the compiler is then entirely defined in this crate, and we can\n+make it as small or large as we want. Additionally, like the standard library,\n+it can contain unstable APIs to test out new pieces of functionality over time.\n+\n+The initial implementation of `librustc_macro` is proposed to be *incredibly*\n+bare bones:\n+\n+```rust\n+#![crate_name = \"macro\"]\n+\n+pub struct TokenStream {\n+    // ...\n+}\n+\n+#[derive(Debug)]\n+pub struct LexError {\n+    // ...\n+}\n+\n+pub struct Context {\n+    // ...\n+}\n+\n+impl TokenStream {\n+    pub fn from_source(cx: &mut Context,\n+                       source: &str) -> Result<TokenStream, LexError> {\n+        // ...\n+    }\n+\n+    pub fn to_source(&self, cx: &mut Context) -> String {\n+        // ...\n+    }\n+}\n+```\n+\n+That is, there will only be a handful of exposed types and `TokenStream` can\n+only be converted to and from a `String`. Eventually `TokenStream` type will\n+more closely resemble token streams [in the compiler\n+itself][compiler-tokenstream], and more fine-grained manipulations will be\n+available as well.\n+\n+Additionally, the `Context` structure will initially be completely devoid\n+of functionality, but in the future it will be the entry point for [many other\n+features][macro20] one would expect in macros 2.0\n+\n+[compiler-tokenstream]: https://github.com/rust-lang/rust/blob/master/src/libsyntax/tokenstream.rs#L323-L338\n+[macro20]: http://ncameron.org/blog/libmacro/\n+\n+### Defining a macro\n+\n+A new crate type will be added to the compiler, `rustc-macro` (described below),\n+indicating a crate that's compiled as a procedural macro. There will not be a\n+\"registrar\" function in this crate type (like there is today), but rather a\n+number of functions which act as token stream transformers to implement macro\n+functionality.\n+\n+A macro crate might look like:\n+\n+```rust\n+#![crate_type = \"rustc-macro\"]\n+#![crate_name = \"double\"]\n+\n+extern crate rustc_macro;\n+\n+use rustc_macro::{Context, TokenStream};\n+\n+#[rustc_macro_derive(Double)]\n+pub fn double(cx: &mut Context, input: TokenStream) -> TokenStream {\n+    let source = input.to_source(cx);\n+\n+    // Parse `source` for struct/enum declaration, and then build up some new\n+    // source code representing representing a number of items in the\n+    // implementation of the `Double` trait for the struct/enum in question.\n+    let source = derive_double(cx, source);\n+\n+    // Parse this back to a token stream and return it\n+    TokenStream::from_source(cx, &source).unwrap()\n+}\n+```\n+\n+This new `rustc_macro_derive` attribute will be allowed inside of a\n+`rustc-macro` crate but disallowed in other crate types. It defines a new\n+`#[derive]` mode which can be used in a crate. The input here is the entire\n+struct that `#[derive]` was attached to, attributes and all. The output is\n+**expected to include the `struct`/`enum` itself** as well as any number of\n+items to be contextually \"placed next to\" the initial declaration.\n+\n+Again, though, there is no hygiene, it's as if the source was simply\n+copy/pasted. All span information for the `TokenStream` structures returned by\n+`from_source` will point to the original `#[derive]` annotation. This means\n+that error messages related to struct definitions will get *worse* if they have\n+a custom derive attribute placed on them, because the entire struct's span will\n+get folded into the `#[derive]` annotation. Eventually, though, more span\n+information will be stable on the `TokenStream` type, so this is just a\n+temporary limitation.\n+\n+The `rustc_macro_derive` attribute requires the signature (similar to [macros\n+2.0][mac20sig]):\n+\n+[mac20sig]: http://ncameron.org/blog/libmacro/#tokenisingandquasiquoting\n+\n+```rust\n+fn(&mut Context, TokenStream) -> TokenStream\n+```\n+\n+If a macro cannot process the input token stream, it is expected to panic for\n+now, although eventually it will call methods on `Context` to provide more\n+structured errors. The compiler will wrap up the panic message and display it\n+to the user appropriately. Eventually, however, `librustc_macro` will provide\n+more interesting methods of signaling errors to users.\n+\n+Customization of user-defined `#[derive]` modes can still be done through custom\n+attributes, although it will be required for `rustc_macro_derive`\n+implementations to remove these attributes when handing them back to the\n+compiler. The compiler will still gate unknown attributes by default.\n+\n+### `rustc-macro` crates\n+\n+Like the executable, staticlib, and cdylib crate types, the `rustc-macro` crate\n+type is intended to be a final product.  What it *actually* produces is not\n+specified, but if a `-L` path is provided to it then the compiler will recognize\n+the output artifacts as a macro and it can be loaded for a program.\n+\n+Initially if a crate is compiled with the `rustc-macro` crate type (and possibly\n+others) it will forbid exporting any items in the crate other than those\n+functions tagged `#[rustc_macro_derive]` and those functions must also be placed\n+at the crate root. Finally, the compiler will automatically set the\n+`cfg(rustc_macro)` annotation whenever any crate type of a compilation is the\n+`rustc-macro` crate type.\n+\n+While these properties may seem a bit odd, they're intended to allow a number of\n+forwards-compatible extensions to be implemented in macros 2.0:\n+\n+* Macros eventually want to be imported from crates (e.g. `use foo::bar!`) and\n+  limiting where `#[derive]` can be defined reduces the surface area for\n+  possible conflict.\n+* Macro crates eventually want to be compiled to be available both at runtime\n+  and at compile time. That is, an `extern crate foo` annotation may load\n+  *both* a `rustc-macro` crate and a crate to link against, if they are\n+  available. Limiting the public exports for now to only custom-derive\n+  annotations should allow for maximal flexibility here.\n+\n+### Using a procedural macro\n+\n+Using a procedural macro will be very similar to today's `extern crate` system,\n+such as:\n+\n+```rust\n+extern crate double;","path":"text/0000-macros-1.1.md","position":293,"original_position":293,"commit_id":"ea504d4ef90e1edbdb9a019c1016d9c39d84580a","original_commit_id":"e2981fca797bf27713f566a6d24320be53c65aa0","user":{"login":"eddyb","id":77424,"avatar_url":"https://avatars.githubusercontent.com/u/77424?v=3","gravatar_id":"","url":"https://api.github.com/users/eddyb","html_url":"https://github.com/eddyb","followers_url":"https://api.github.com/users/eddyb/followers","following_url":"https://api.github.com/users/eddyb/following{/other_user}","gists_url":"https://api.github.com/users/eddyb/gists{/gist_id}","starred_url":"https://api.github.com/users/eddyb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eddyb/subscriptions","organizations_url":"https://api.github.com/users/eddyb/orgs","repos_url":"https://api.github.com/users/eddyb/repos","events_url":"https://api.github.com/users/eddyb/events{/privacy}","received_events_url":"https://api.github.com/users/eddyb/received_events","type":"User","site_admin":false},"body":"The problem is that if you do *anything* by default now, you'll need to opt out to be able to use the normal module system.","created_at":"2016-07-18T20:45:56Z","updated_at":"2016-07-18T20:45:56Z","html_url":"https://github.com/rust-lang/rfcs/pull/1681#discussion_r71225851","pull_request_url":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681","_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rfcs/pulls/comments/71225851"},"html":{"href":"https://github.com/rust-lang/rfcs/pull/1681#discussion_r71225851"},"pull_request":{"href":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681"}}},"pull_request":{"url":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681","id":77871118,"html_url":"https://github.com/rust-lang/rfcs/pull/1681","diff_url":"https://github.com/rust-lang/rfcs/pull/1681.diff","patch_url":"https://github.com/rust-lang/rfcs/pull/1681.patch","issue_url":"https://api.github.com/repos/rust-lang/rfcs/issues/1681","number":1681,"state":"open","locked":false,"title":"RFC: Procedural macros 1.1","user":{"login":"alexcrichton","id":64996,"avatar_url":"https://avatars.githubusercontent.com/u/64996?v=3","gravatar_id":"","url":"https://api.github.com/users/alexcrichton","html_url":"https://github.com/alexcrichton","followers_url":"https://api.github.com/users/alexcrichton/followers","following_url":"https://api.github.com/users/alexcrichton/following{/other_user}","gists_url":"https://api.github.com/users/alexcrichton/gists{/gist_id}","starred_url":"https://api.github.com/users/alexcrichton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexcrichton/subscriptions","organizations_url":"https://api.github.com/users/alexcrichton/orgs","repos_url":"https://api.github.com/users/alexcrichton/repos","events_url":"https://api.github.com/users/alexcrichton/events{/privacy}","received_events_url":"https://api.github.com/users/alexcrichton/received_events","type":"User","site_admin":false},"body":"Extract a very small sliver of today's procedural macro system in the compiler,\r\njust enough to get basic features like custom derive working, to have an\r\neventually stable API. Ensure that these features will not pose a maintenance\r\nburden on the compiler but also don't try to provide enough features for the\r\n\"perfect macro system\" at the same time. Overall, this should be considered an\r\nincremental step towards an official \"plugins 2.0\".\r\n\r\n[Rendered](https://github.com/alexcrichton/rfcs/blob/macros-1.1/text/0000-macros-1.1.md)","created_at":"2016-07-18T20:12:47Z","updated_at":"2016-07-18T20:45:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"98bfd5089149a8ced2d7b297dab5f0bb7db67467","assignee":{"login":"alexcrichton","id":64996,"avatar_url":"https://avatars.githubusercontent.com/u/64996?v=3","gravatar_id":"","url":"https://api.github.com/users/alexcrichton","html_url":"https://github.com/alexcrichton","followers_url":"https://api.github.com/users/alexcrichton/followers","following_url":"https://api.github.com/users/alexcrichton/following{/other_user}","gists_url":"https://api.github.com/users/alexcrichton/gists{/gist_id}","starred_url":"https://api.github.com/users/alexcrichton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexcrichton/subscriptions","organizations_url":"https://api.github.com/users/alexcrichton/orgs","repos_url":"https://api.github.com/users/alexcrichton/repos","events_url":"https://api.github.com/users/alexcrichton/events{/privacy}","received_events_url":"https://api.github.com/users/alexcrichton/received_events","type":"User","site_admin":false},"assignees":[{"login":"alexcrichton","id":64996,"avatar_url":"https://avatars.githubusercontent.com/u/64996?v=3","gravatar_id":"","url":"https://api.github.com/users/alexcrichton","html_url":"https://github.com/alexcrichton","followers_url":"https://api.github.com/users/alexcrichton/followers","following_url":"https://api.github.com/users/alexcrichton/following{/other_user}","gists_url":"https://api.github.com/users/alexcrichton/gists{/gist_id}","starred_url":"https://api.github.com/users/alexcrichton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexcrichton/subscriptions","organizations_url":"https://api.github.com/users/alexcrichton/orgs","repos_url":"https://api.github.com/users/alexcrichton/repos","events_url":"https://api.github.com/users/alexcrichton/events{/privacy}","received_events_url":"https://api.github.com/users/alexcrichton/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681/commits","review_comments_url":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681/comments","review_comment_url":"https://api.github.com/repos/rust-lang/rfcs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rust-lang/rfcs/issues/1681/comments","statuses_url":"https://api.github.com/repos/rust-lang/rfcs/statuses/ea504d4ef90e1edbdb9a019c1016d9c39d84580a","head":{"label":"alexcrichton:macros-1.1","ref":"macros-1.1","sha":"ea504d4ef90e1edbdb9a019c1016d9c39d84580a","user":{"login":"alexcrichton","id":64996,"avatar_url":"https://avatars.githubusercontent.com/u/64996?v=3","gravatar_id":"","url":"https://api.github.com/users/alexcrichton","html_url":"https://github.com/alexcrichton","followers_url":"https://api.github.com/users/alexcrichton/followers","following_url":"https://api.github.com/users/alexcrichton/following{/other_user}","gists_url":"https://api.github.com/users/alexcrichton/gists{/gist_id}","starred_url":"https://api.github.com/users/alexcrichton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexcrichton/subscriptions","organizations_url":"https://api.github.com/users/alexcrichton/orgs","repos_url":"https://api.github.com/users/alexcrichton/repos","events_url":"https://api.github.com/users/alexcrichton/events{/privacy}","received_events_url":"https://api.github.com/users/alexcrichton/received_events","type":"User","site_admin":false},"repo":{"id":17584422,"name":"rfcs","full_name":"alexcrichton/rfcs","owner":{"login":"alexcrichton","id":64996,"avatar_url":"https://avatars.githubusercontent.com/u/64996?v=3","gravatar_id":"","url":"https://api.github.com/users/alexcrichton","html_url":"https://github.com/alexcrichton","followers_url":"https://api.github.com/users/alexcrichton/followers","following_url":"https://api.github.com/users/alexcrichton/following{/other_user}","gists_url":"https://api.github.com/users/alexcrichton/gists{/gist_id}","starred_url":"https://api.github.com/users/alexcrichton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexcrichton/subscriptions","organizations_url":"https://api.github.com/users/alexcrichton/orgs","repos_url":"https://api.github.com/users/alexcrichton/repos","events_url":"https://api.github.com/users/alexcrichton/events{/privacy}","received_events_url":"https://api.github.com/users/alexcrichton/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/alexcrichton/rfcs","description":"RFCs for changes to Rust","fork":true,"url":"https://api.github.com/repos/alexcrichton/rfcs","forks_url":"https://api.github.com/repos/alexcrichton/rfcs/forks","keys_url":"https://api.github.com/repos/alexcrichton/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alexcrichton/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alexcrichton/rfcs/teams","hooks_url":"https://api.github.com/repos/alexcrichton/rfcs/hooks","issue_events_url":"https://api.github.com/repos/alexcrichton/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/alexcrichton/rfcs/events","assignees_url":"https://api.github.com/repos/alexcrichton/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/alexcrichton/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/alexcrichton/rfcs/tags","blobs_url":"https://api.github.com/repos/alexcrichton/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alexcrichton/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alexcrichton/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/alexcrichton/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alexcrichton/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/alexcrichton/rfcs/languages","stargazers_url":"https://api.github.com/repos/alexcrichton/rfcs/stargazers","contributors_url":"https://api.github.com/repos/alexcrichton/rfcs/contributors","subscribers_url":"https://api.github.com/repos/alexcrichton/rfcs/subscribers","subscription_url":"https://api.github.com/repos/alexcrichton/rfcs/subscription","commits_url":"https://api.github.com/repos/alexcrichton/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/alexcrichton/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/alexcrichton/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/alexcrichton/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/alexcrichton/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/alexcrichton/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alexcrichton/rfcs/merges","archive_url":"https://api.github.com/repos/alexcrichton/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alexcrichton/rfcs/downloads","issues_url":"https://api.github.com/repos/alexcrichton/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/alexcrichton/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/alexcrichton/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/alexcrichton/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alexcrichton/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/alexcrichton/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/alexcrichton/rfcs/deployments","created_at":"2014-03-10T06:59:41Z","updated_at":"2016-07-15T18:19:57Z","pushed_at":"2016-07-18T20:18:45Z","git_url":"git://github.com/alexcrichton/rfcs.git","ssh_url":"git@github.com:alexcrichton/rfcs.git","clone_url":"https://github.com/alexcrichton/rfcs.git","svn_url":"https://github.com/alexcrichton/rfcs","homepage":"","size":3092,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":1,"forks":3,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"rust-lang:master","ref":"master","sha":"4ad2de6426e0af679154f225d5995f6345773221","user":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":17527989,"name":"rfcs","full_name":"rust-lang/rfcs","owner":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rust-lang/rfcs","description":"RFCs for changes to Rust","fork":false,"url":"https://api.github.com/repos/rust-lang/rfcs","forks_url":"https://api.github.com/repos/rust-lang/rfcs/forks","keys_url":"https://api.github.com/repos/rust-lang/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rust-lang/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rust-lang/rfcs/teams","hooks_url":"https://api.github.com/repos/rust-lang/rfcs/hooks","issue_events_url":"https://api.github.com/repos/rust-lang/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/rust-lang/rfcs/events","assignees_url":"https://api.github.com/repos/rust-lang/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/rust-lang/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/rust-lang/rfcs/tags","blobs_url":"https://api.github.com/repos/rust-lang/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rust-lang/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rust-lang/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/rust-lang/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rust-lang/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/rust-lang/rfcs/languages","stargazers_url":"https://api.github.com/repos/rust-lang/rfcs/stargazers","contributors_url":"https://api.github.com/repos/rust-lang/rfcs/contributors","subscribers_url":"https://api.github.com/repos/rust-lang/rfcs/subscribers","subscription_url":"https://api.github.com/repos/rust-lang/rfcs/subscription","commits_url":"https://api.github.com/repos/rust-lang/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/rust-lang/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/rust-lang/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/rust-lang/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/rust-lang/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/rust-lang/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rust-lang/rfcs/merges","archive_url":"https://api.github.com/repos/rust-lang/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rust-lang/rfcs/downloads","issues_url":"https://api.github.com/repos/rust-lang/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/rust-lang/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/rust-lang/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/rust-lang/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rust-lang/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/rust-lang/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/rust-lang/rfcs/deployments","created_at":"2014-03-07T21:29:00Z","updated_at":"2016-07-16T09:27:10Z","pushed_at":"2016-07-18T20:18:46Z","git_url":"git://github.com/rust-lang/rfcs.git","ssh_url":"git@github.com:rust-lang/rfcs.git","clone_url":"https://github.com/rust-lang/rfcs.git","svn_url":"https://github.com/rust-lang/rfcs","homepage":"","size":6433,"stargazers_count":681,"watchers_count":681,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":330,"mirror_url":null,"open_issues_count":690,"forks":330,"open_issues":690,"watchers":681,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681"},"html":{"href":"https://github.com/rust-lang/rfcs/pull/1681"},"issue":{"href":"https://api.github.com/repos/rust-lang/rfcs/issues/1681"},"comments":{"href":"https://api.github.com/repos/rust-lang/rfcs/issues/1681/comments"},"review_comments":{"href":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681/comments"},"review_comment":{"href":"https://api.github.com/repos/rust-lang/rfcs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rust-lang/rfcs/pulls/1681/commits"},"statuses":{"href":"https://api.github.com/repos/rust-lang/rfcs/statuses/ea504d4ef90e1edbdb9a019c1016d9c39d84580a"}}}}
{"actor":{"display_login":"eddyb"}}