{"action":"created","comment":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/comments/88767783","pull_request_review_id":9334939,"id":88767783,"diff_hunk":"@@ -0,0 +1,309 @@\n+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT\n+// file at the top-level directory of this distribution and at\n+// http://rust-lang.org/COPYRIGHT.\n+//\n+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n+// option. This file may not be copied, modified, or distributed\n+// except according to those terms.\n+\n+//! An \"interner\" is a data structure that associates values with usize tags and\n+//! allows bidirectional lookup; i.e. given a value, one can easily find the\n+//! type, and vice versa.\n+\n+use serialize::{Decodable, Decoder, Encodable, Encoder};\n+use std::cell::RefCell;\n+use std::collections::HashMap;\n+use std::fmt;\n+use std::rc::Rc;\n+\n+/// A symbol is an interned or gensymed string.\n+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]\n+pub struct Symbol(pub u32);\n+\n+impl Symbol {\n+    /// Maps a string to its interned representation.\n+    pub fn intern(string: &str) -> Self {\n+        with_interner(|interner| interner.intern(string))\n+    }\n+\n+    /// gensym's a new usize, using the current interner.\n+    pub fn gensym(string: &str) -> Self {\n+        with_interner(|interner| interner.gensym(string))\n+    }\n+\n+    pub fn as_str(self) -> InternedString {\n+        with_interner(|interner| InternedString { string: interner.get(self) })\n+    }\n+}\n+\n+impl fmt::Debug for Symbol {\n+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n+        write!(f, \"{}({})\", self, self.0)\n+    }\n+}\n+\n+impl fmt::Display for Symbol {\n+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n+        fmt::Display::fmt(&self.as_str(), f)\n+    }\n+}\n+\n+impl Encodable for Symbol {\n+    fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {\n+        s.emit_str(&self.as_str())\n+    }\n+}\n+\n+impl Decodable for Symbol {\n+    fn decode<D: Decoder>(d: &mut D) -> Result<Symbol, D::Error> {\n+        Ok(Symbol::intern(&d.read_str()?))\n+    }\n+}\n+\n+impl<'a> PartialEq<&'a str> for Symbol {\n+    fn eq(&self, other: &&str) -> bool {\n+        *self.as_str() == **other\n+    }\n+}\n+\n+#[derive(Default)]\n+pub struct Interner {\n+    names: HashMap<Rc<str>, Symbol>,\n+    strings: Vec<Rc<str>>,\n+}\n+\n+impl Interner {\n+    pub fn new() -> Self {\n+        Interner::default()\n+    }\n+\n+    fn prefill(init: &[&str]) -> Self {\n+        let mut this = Interner::new();\n+        for &string in init {\n+            this.intern(string);\n+        }\n+        this\n+    }\n+\n+    pub fn intern(&mut self, string: &str) -> Symbol {\n+        if let Some(&name) = self.names.get(string) {\n+            return name;\n+        }\n+\n+        let name = Symbol(self.strings.len() as u32);\n+        let string = Rc::__from_str(string);\n+        self.strings.push(string.clone());\n+        self.names.insert(string, name);\n+        name\n+    }\n+\n+    fn gensym(&mut self, string: &str) -> Symbol {\n+        let gensym = Symbol(self.strings.len() as u32);\n+        // leave out of `names` to avoid colliding\n+        self.strings.push(Rc::__from_str(string));\n+        gensym\n+    }\n+\n+    pub fn get(&self, name: Symbol) -> Rc<str> {\n+        self.strings[name.0 as usize].clone()\n+    }\n+}\n+\n+// In this macro, there is the requirement that the name (the number) must be monotonically\n+// increasing by one in the special identifiers, starting at 0; the same holds for the keywords,\n+// except starting from the next number instead of zero.\n+macro_rules! declare_keywords {(\n+    $( ($index: expr, $konst: ident, $string: expr) )*\n+) => {\n+    pub mod keywords {\n+        use ast;\n+        #[derive(Clone, Copy, PartialEq, Eq)]\n+        pub struct Keyword {\n+            ident: ast::Ident,\n+        }\n+        impl Keyword {\n+            #[inline] pub fn ident(self) -> ast::Ident { self.ident }\n+            #[inline] pub fn name(self) -> ast::Name { self.ident.name }\n+        }\n+        $(\n+            #[allow(non_upper_case_globals)]\n+            pub const $konst: Keyword = Keyword {\n+                ident: ast::Ident::with_empty_ctxt(ast::Name($index))\n+            };\n+        )*\n+    }\n+\n+    impl Interner {\n+        fn fresh() -> Self {\n+            Interner::prefill(&[$($string,)*])\n+        }\n+    }\n+}}\n+\n+// NB: leaving holes in the ident table is bad! a different ident will get\n+// interned with the id from the hole, but it will be between the min and max\n+// of the reserved words, and thus tagged as \"reserved\".\n+// After modifying this list adjust `is_strict_keyword`/`is_reserved_keyword`,\n+// this should be rarely necessary though if the keywords are kept in alphabetic order.\n+declare_keywords! {\n+    // Invalid identifier\n+    (0,  Invalid,        \"\")\n+\n+    // Strict keywords used in the language.\n+    (1,  As,             \"as\")\n+    (2,  Box,            \"box\")\n+    (3,  Break,          \"break\")\n+    (4,  Const,          \"const\")\n+    (5,  Continue,       \"continue\")\n+    (6,  Crate,          \"crate\")\n+    (7,  Else,           \"else\")\n+    (8,  Enum,           \"enum\")\n+    (9,  Extern,         \"extern\")\n+    (10, False,          \"false\")\n+    (11, Fn,             \"fn\")\n+    (12, For,            \"for\")\n+    (13, If,             \"if\")\n+    (14, Impl,           \"impl\")\n+    (15, In,             \"in\")\n+    (16, Let,            \"let\")\n+    (17, Loop,           \"loop\")\n+    (18, Match,          \"match\")\n+    (19, Mod,            \"mod\")\n+    (20, Move,           \"move\")\n+    (21, Mut,            \"mut\")\n+    (22, Pub,            \"pub\")\n+    (23, Ref,            \"ref\")\n+    (24, Return,         \"return\")\n+    (25, SelfValue,      \"self\")\n+    (26, SelfType,       \"Self\")\n+    (27, Static,         \"static\")\n+    (28, Struct,         \"struct\")\n+    (29, Super,          \"super\")\n+    (30, Trait,          \"trait\")\n+    (31, True,           \"true\")\n+    (32, Type,           \"type\")\n+    (33, Unsafe,         \"unsafe\")\n+    (34, Use,            \"use\")\n+    (35, Where,          \"where\")\n+    (36, While,          \"while\")\n+\n+    // Keywords reserved for future use.\n+    (37, Abstract,       \"abstract\")\n+    (38, Alignof,        \"alignof\")\n+    (39, Become,         \"become\")\n+    (40, Do,             \"do\")\n+    (41, Final,          \"final\")\n+    (42, Macro,          \"macro\")\n+    (43, Offsetof,       \"offsetof\")\n+    (44, Override,       \"override\")\n+    (45, Priv,           \"priv\")\n+    (46, Proc,           \"proc\")\n+    (47, Pure,           \"pure\")\n+    (48, Sizeof,         \"sizeof\")\n+    (49, Typeof,         \"typeof\")\n+    (50, Unsized,        \"unsized\")\n+    (51, Virtual,        \"virtual\")\n+    (52, Yield,          \"yield\")\n+\n+    // Weak keywords, have special meaning only in specific contexts.\n+    (53, Default,        \"default\")\n+    (54, StaticLifetime, \"'static\")\n+    (55, Union,          \"union\")\n+}\n+\n+// If an interner exists in TLS, return it. Otherwise, prepare a fresh one.\n+// FIXME(eddyb) #8726 This should probably use a thread-local reference.\n+fn with_interner<T, F: FnOnce(&mut Interner) -> T>(f: F) -> T {\n+    thread_local!(static INTERNER: RefCell<Interner> = {\n+        RefCell::new(Interner::fresh())\n+    });\n+    INTERNER.with(|interner| f(&mut *interner.borrow_mut()))\n+}\n+\n+/// Reset the ident interner to its initial state.\n+pub fn reset_interner() {\n+    with_interner(|interner| *interner = Interner::fresh());\n+}\n+\n+pub fn clear_interner() {\n+    with_interner(|interner| *interner = Interner::new());\n+}\n+\n+/// Represents a string stored in the thread-local interner. Because the\n+/// interner lives for the life of the thread, this can be safely treated as an\n+/// immortal string, as long as it never crosses between threads.\n+///\n+/// FIXME(pcwalton): You must be careful about what you do in the destructors\n+/// of objects stored in TLS, because they may run after the interner is\n+/// destroyed. In particular, they must not access string contents. This can\n+/// be fixed in the future by just leaking all strings until thread death\n+/// somehow.\n+#[derive(Clone, PartialEq, Hash, PartialOrd, Eq, Ord)]\n+pub struct InternedString {\n+    string: Rc<str>,\n+}\n+\n+impl InternedString {\n+    pub fn new(string: &'static str) -> InternedString {\n+        InternedString {\n+            string: Rc::__from_str(string),\n+        }\n+    }\n+}\n+\n+impl ::std::ops::Deref for InternedString {\n+    type Target = str;\n+    fn deref(&self) -> &str { &self.string }\n+}\n+\n+impl fmt::Debug for InternedString {\n+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n+        fmt::Debug::fmt(&self.string, f)\n+    }\n+}\n+\n+impl fmt::Display for InternedString {\n+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {\n+        fmt::Display::fmt(&self.string, f)\n+    }\n+}\n+\n+impl Decodable for InternedString {\n+    fn decode<D: Decoder>(d: &mut D) -> Result<InternedString, D::Error> {\n+        Ok(Symbol::intern(&d.read_str()?).as_str())","path":"src/libsyntax/symbol.rs","position":271,"original_position":275,"commit_id":"30043e585b0818e0542b87466ed0fce4cfec6b15","original_commit_id":"fc519bbd7c29ac0c38ed2d3ac6e2a73e7559d91a","user":{"login":"jseyfried","id":8652869,"avatar_url":"https://avatars.githubusercontent.com/u/8652869?v=3","gravatar_id":"","url":"https://api.github.com/users/jseyfried","html_url":"https://github.com/jseyfried","followers_url":"https://api.github.com/users/jseyfried/followers","following_url":"https://api.github.com/users/jseyfried/following{/other_user}","gists_url":"https://api.github.com/users/jseyfried/gists{/gist_id}","starred_url":"https://api.github.com/users/jseyfried/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jseyfried/subscriptions","organizations_url":"https://api.github.com/users/jseyfried/orgs","repos_url":"https://api.github.com/users/jseyfried/repos","events_url":"https://api.github.com/users/jseyfried/events{/privacy}","received_events_url":"https://api.github.com/users/jseyfried/received_events","type":"User","site_admin":false},"body":"After this PR, `InternedString` should be semantically equivalent to `SymbolStringContent` -- we can rename later. I don't think `InternedString` is *that* bad of a name.","created_at":"2016-11-19T01:22:45Z","updated_at":"2016-11-19T01:22:45Z","html_url":"https://github.com/rust-lang/rust/pull/37824#discussion_r88767783","pull_request_url":"https://api.github.com/repos/rust-lang/rust/pulls/37824","_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments/88767783"},"html":{"href":"https://github.com/rust-lang/rust/pull/37824#discussion_r88767783"},"pull_request":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/37824"}}},"pull_request":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/37824","id":94133417,"html_url":"https://github.com/rust-lang/rust/pull/37824","diff_url":"https://github.com/rust-lang/rust/pull/37824.diff","patch_url":"https://github.com/rust-lang/rust/pull/37824.patch","issue_url":"https://api.github.com/repos/rust-lang/rust/issues/37824","number":37824,"state":"open","locked":false,"title":"Clean up `ast::Attribute`, `ast::CrateConfig`, and string interning","user":{"login":"jseyfried","id":8652869,"avatar_url":"https://avatars.githubusercontent.com/u/8652869?v=3","gravatar_id":"","url":"https://api.github.com/users/jseyfried","html_url":"https://github.com/jseyfried","followers_url":"https://api.github.com/users/jseyfried/followers","following_url":"https://api.github.com/users/jseyfried/following{/other_user}","gists_url":"https://api.github.com/users/jseyfried/gists{/gist_id}","starred_url":"https://api.github.com/users/jseyfried/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jseyfried/subscriptions","organizations_url":"https://api.github.com/users/jseyfried/orgs","repos_url":"https://api.github.com/users/jseyfried/repos","events_url":"https://api.github.com/users/jseyfried/events{/privacy}","received_events_url":"https://api.github.com/users/jseyfried/received_events","type":"User","site_admin":false},"body":"This PR\r\n - removes `ast::Attribute_` (changing `Attribute` from `Spanned<Attribute_>` to a struct),\r\n - moves a `MetaItem`'s name from the `MetaItemKind` variants to a field of `MetaItem`,\r\n - avoids needlessly wrapping `ast::MetaItem` with `P`,\r\n - moves string interning into `syntax::symbol` (`ast::Name` is a reexport of `symbol::Symbol` for now),\r\n - replaces `InternedString` with `Symbol` in the AST, HIR, and various other structures, and\r\n - refactors `ast::CrateConfig` from a `Vec` to a `HashSet`.\r\n\r\n(wip, still need to fix fallout in tests)\r\n\r\nr? @eddyb ","created_at":"2016-11-17T09:47:11Z","updated_at":"2016-11-19T01:22:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c73d62bc112281fc2c709ee13dd16621eb469e2a","assignee":{"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},"assignees":[{"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}],"milestone":null,"commits_url":"https://api.github.com/repos/rust-lang/rust/pulls/37824/commits","review_comments_url":"https://api.github.com/repos/rust-lang/rust/pulls/37824/comments","review_comment_url":"https://api.github.com/repos/rust-lang/rust/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rust-lang/rust/issues/37824/comments","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/30043e585b0818e0542b87466ed0fce4cfec6b15","head":{"label":"jseyfried:symbols","ref":"symbols","sha":"30043e585b0818e0542b87466ed0fce4cfec6b15","user":{"login":"jseyfried","id":8652869,"avatar_url":"https://avatars.githubusercontent.com/u/8652869?v=3","gravatar_id":"","url":"https://api.github.com/users/jseyfried","html_url":"https://github.com/jseyfried","followers_url":"https://api.github.com/users/jseyfried/followers","following_url":"https://api.github.com/users/jseyfried/following{/other_user}","gists_url":"https://api.github.com/users/jseyfried/gists{/gist_id}","starred_url":"https://api.github.com/users/jseyfried/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jseyfried/subscriptions","organizations_url":"https://api.github.com/users/jseyfried/orgs","repos_url":"https://api.github.com/users/jseyfried/repos","events_url":"https://api.github.com/users/jseyfried/events{/privacy}","received_events_url":"https://api.github.com/users/jseyfried/received_events","type":"User","site_admin":false},"repo":{"id":45209988,"name":"rust","full_name":"jseyfried/rust","owner":{"login":"jseyfried","id":8652869,"avatar_url":"https://avatars.githubusercontent.com/u/8652869?v=3","gravatar_id":"","url":"https://api.github.com/users/jseyfried","html_url":"https://github.com/jseyfried","followers_url":"https://api.github.com/users/jseyfried/followers","following_url":"https://api.github.com/users/jseyfried/following{/other_user}","gists_url":"https://api.github.com/users/jseyfried/gists{/gist_id}","starred_url":"https://api.github.com/users/jseyfried/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jseyfried/subscriptions","organizations_url":"https://api.github.com/users/jseyfried/orgs","repos_url":"https://api.github.com/users/jseyfried/repos","events_url":"https://api.github.com/users/jseyfried/events{/privacy}","received_events_url":"https://api.github.com/users/jseyfried/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jseyfried/rust","description":"A safe, concurrent, practical language.","fork":true,"url":"https://api.github.com/repos/jseyfried/rust","forks_url":"https://api.github.com/repos/jseyfried/rust/forks","keys_url":"https://api.github.com/repos/jseyfried/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jseyfried/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jseyfried/rust/teams","hooks_url":"https://api.github.com/repos/jseyfried/rust/hooks","issue_events_url":"https://api.github.com/repos/jseyfried/rust/issues/events{/number}","events_url":"https://api.github.com/repos/jseyfried/rust/events","assignees_url":"https://api.github.com/repos/jseyfried/rust/assignees{/user}","branches_url":"https://api.github.com/repos/jseyfried/rust/branches{/branch}","tags_url":"https://api.github.com/repos/jseyfried/rust/tags","blobs_url":"https://api.github.com/repos/jseyfried/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jseyfried/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jseyfried/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/jseyfried/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jseyfried/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/jseyfried/rust/languages","stargazers_url":"https://api.github.com/repos/jseyfried/rust/stargazers","contributors_url":"https://api.github.com/repos/jseyfried/rust/contributors","subscribers_url":"https://api.github.com/repos/jseyfried/rust/subscribers","subscription_url":"https://api.github.com/repos/jseyfried/rust/subscription","commits_url":"https://api.github.com/repos/jseyfried/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/jseyfried/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/jseyfried/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/jseyfried/rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/jseyfried/rust/contents/{+path}","compare_url":"https://api.github.com/repos/jseyfried/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jseyfried/rust/merges","archive_url":"https://api.github.com/repos/jseyfried/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jseyfried/rust/downloads","issues_url":"https://api.github.com/repos/jseyfried/rust/issues{/number}","pulls_url":"https://api.github.com/repos/jseyfried/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/jseyfried/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/jseyfried/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jseyfried/rust/labels{/name}","releases_url":"https://api.github.com/repos/jseyfried/rust/releases{/id}","deployments_url":"https://api.github.com/repos/jseyfried/rust/deployments","created_at":"2015-10-29T20:55:18Z","updated_at":"2016-03-27T03:28:50Z","pushed_at":"2016-11-19T00:03:28Z","git_url":"git://github.com/jseyfried/rust.git","ssh_url":"git@github.com:jseyfried/rust.git","clone_url":"https://github.com/jseyfried/rust.git","svn_url":"https://github.com/jseyfried/rust","homepage":"http://www.rust-lang.org","size":309817,"stargazers_count":0,"watchers_count":0,"language":"Rust","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rust-lang:master","ref":"master","sha":"b7dfc2bd127d9a4a35c60700f89ee30dea9212f8","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":724712,"name":"rust","full_name":"rust-lang/rust","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/rust","description":"A safe, concurrent, practical language.","fork":false,"url":"https://api.github.com/repos/rust-lang/rust","forks_url":"https://api.github.com/repos/rust-lang/rust/forks","keys_url":"https://api.github.com/repos/rust-lang/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rust-lang/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rust-lang/rust/teams","hooks_url":"https://api.github.com/repos/rust-lang/rust/hooks","issue_events_url":"https://api.github.com/repos/rust-lang/rust/issues/events{/number}","events_url":"https://api.github.com/repos/rust-lang/rust/events","assignees_url":"https://api.github.com/repos/rust-lang/rust/assignees{/user}","branches_url":"https://api.github.com/repos/rust-lang/rust/branches{/branch}","tags_url":"https://api.github.com/repos/rust-lang/rust/tags","blobs_url":"https://api.github.com/repos/rust-lang/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rust-lang/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rust-lang/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/rust-lang/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/rust-lang/rust/languages","stargazers_url":"https://api.github.com/repos/rust-lang/rust/stargazers","contributors_url":"https://api.github.com/repos/rust-lang/rust/contributors","subscribers_url":"https://api.github.com/repos/rust-lang/rust/subscribers","subscription_url":"https://api.github.com/repos/rust-lang/rust/subscription","commits_url":"https://api.github.com/repos/rust-lang/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/rust-lang/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/rust-lang/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/rust-lang/rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/rust-lang/rust/contents/{+path}","compare_url":"https://api.github.com/repos/rust-lang/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rust-lang/rust/merges","archive_url":"https://api.github.com/repos/rust-lang/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rust-lang/rust/downloads","issues_url":"https://api.github.com/repos/rust-lang/rust/issues{/number}","pulls_url":"https://api.github.com/repos/rust-lang/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/rust-lang/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/rust-lang/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rust-lang/rust/labels{/name}","releases_url":"https://api.github.com/repos/rust-lang/rust/releases{/id}","deployments_url":"https://api.github.com/repos/rust-lang/rust/deployments","created_at":"2010-06-16T20:39:03Z","updated_at":"2016-11-18T23:47:55Z","pushed_at":"2016-11-19T00:32:14Z","git_url":"git://github.com/rust-lang/rust.git","ssh_url":"git@github.com:rust-lang/rust.git","clone_url":"https://github.com/rust-lang/rust.git","svn_url":"https://github.com/rust-lang/rust","homepage":"https://www.rust-lang.org","size":526490,"stargazers_count":19044,"watchers_count":19044,"language":"Rust","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3659,"mirror_url":null,"open_issues_count":2887,"forks":3659,"open_issues":2887,"watchers":19044,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/37824"},"html":{"href":"https://github.com/rust-lang/rust/pull/37824"},"issue":{"href":"https://api.github.com/repos/rust-lang/rust/issues/37824"},"comments":{"href":"https://api.github.com/repos/rust-lang/rust/issues/37824/comments"},"review_comments":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/37824/comments"},"review_comment":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/37824/commits"},"statuses":{"href":"https://api.github.com/repos/rust-lang/rust/statuses/30043e585b0818e0542b87466ed0fce4cfec6b15"}}}}
{"actor":{"display_login":"jseyfried"}}