{"action":"created","comment":{"url":"https://api.github.com/repos/dart-lang/language/pulls/comments/259174357","pull_request_review_id":206611646,"id":259174357,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI1OTE3NDM1Nw==","diff_hunk":"@@ -0,0 +1,916 @@\n+# Unified Collections\n+\n+The Dart team is concurrently working on three proposals that affect collection\n+literals:\n+\n+* [Set Literals][]\n+* [Spread Collections][]\n+* [Control Flow Collections][]\n+\n+[set literals]: https://github.com/dart-lang/language/blob/master/accepted/future-releases/set-literals/feature-specification.md\n+[spread collections]: https://github.com/dart-lang/language/blob/master/accepted/future-releases/spread-collections/feature-specification.md\n+[control flow collections]: https://github.com/dart-lang/language/blob/master/accepted/future-releases/control-flow-collections/feature-specification.md\n+\n+These features interact in several ways, some of which weren't obvious at first.\n+To make things easier on implementers and anyone else trying to understand the\n+entire set of changes, this specification unifies and subsumes all three of\n+those proposals.\n+\n+**This document is now the source of truth for these language changes.** The\n+other three proposals are useful because they contain motivation and other\n+context, but the precise syntax and semantics may be out of date in those docs.\n+This is where you should be looking if you're an implementer.\n+\n+## Grammar\n+\n+Remove `setLiteral` and `mapLiteral` entirely. Then change the grammar to:\n+\n+```\n+setOrMapLiteral   : 'const'? typeArguments? '{' elements? '}' ;\n+listLiteral       : 'const'? typeArguments? '[' elements? ']' ;\n+\n+elements          : element ( ',' element )* ','? ;\n+\n+element           : expressionElement\n+                  | mapEntry\n+                  | spreadElement\n+                  | ifElement\n+                  | forElement\n+                  ;\n+\n+expressionElement : expression ;\n+mapEntry          : expression ':' expression ;\n+\n+spreadElement     : ( '...' | '...?' ) expression ;\n+ifElement         : 'if' '(' expression ')' element ( 'else' element )? ;\n+forElement        : 'await'? 'for' '(' forLoopParts ')' element ;\n+```\n+\n+Let *leaf elements* be all of the `expressionElement` and `mapEntry` elements in\n+*e*, including elements of `ifElement` or `forElement` elements, transitively.\n+\n+It is a compile-time error if any *leaf elements* of a `listLiteral` are\n+`mapEntry` elements. *(We could avoid this prose by duplicating the above rules\n+for lists and removing `mapEntry`, but this is simpler.)*\n+\n+The existing rule that an expression statement cannot start with `{` now covers\n+both map and set literals.\n+\n+## Static Semantics\n+\n+### Disambiguating sets and maps\n+\n+Because sets and maps both use curly braces as delimiters, you can create\n+collection literals that are not obviously either a set or a map, like:\n+\n+```dart\n+var a = {};\n+var b = {...other};\n+```\n+\n+Inference and set/map disambiguation are done concurrently. When possible, we\n+use syntax and the surrounding context type to disambiguate between a map and\n+set:\n+\n+Let *e* be a `setOrMapLiteral`.\n+\n+If *e* has a context `C`, and the base type of `C` is `Cbase` (that is, `Cbase`\n+is `C` with all wrapping `FutureOr`s removed), and `Cbase` is not `?`, then let\n+`S` be the greatest closure.\n+\n+1.  If *e* has `typeArguments` then:\n+\n+    *   If there is exactly one type argument `T`, then *e* is a set literal\n+        with static type `Set<T>`.\n+\n+    *   If there are exactly two type arguments `K` and `V`, then *e* is a map\n+        literal with static type `Map<K, V>`.\n+\n+    *   Otherwise (three or more type arguments), report a compile-time error.\n+\n+1.  Else, if `S` is defined and is a subtype of `Iterable<Object>` and `S` is\n+    not a subtype of `Map<Object, Object>`, then *e* is a set literal.\n+\n+1.  Else, if `S` is defined and is a subtype of `Map<Object, Object>` and `S` is\n+    not a subtype of `Iterable<Object>` then *e* is a map literal.\n+\n+1.  Else, if *leaf elements* is not empty, then:\n+\n+    *   If *leaf elements* has at least one `expressionElement` and no\n+        `mapEntry` elements, then *e* is a set literal with unknown static type.\n+\n+    *   If *leaf elements* has at least one `mapEntry` and no\n+        `expressionElement` elements, then *e* is a map literal with unknown\n+        static type.\n+\n+    *   If *leaf elements* has at least one `mapEntry` and at least one\n+        `expressionElement`, report a compile-time error.\n+\n+    *In other words, at least one key-value pair anywhere in the collection\n+    forces it to be a map, and a bare expression forces it to be a set. Having\n+    both is an error.*\n+\n+1.  Else, if *e* has no `typeArguments`, no useful context type, and no\n+    `elements`, then *e* is treated as a map literal with unknown static type.\n+    *In other words, an empty `{}` is a map unless we have a context that\n+    indicates otherwise.*\n+\n+1.  Otherwise, *e* is still ambiguous. This can only happen when *e* is\n+    non-empty but contains only `spreadElement`s. In this case, the\n+    disambiguation will happen during type inference, defined below.\n+\n+### Type inference\n+\n+#### Maps and sets\n+\n+We perform inference on the literal, and collect up either a set element type\n+(indicating that the literal may/must be a set), or a pair of a key type and a\n+value type (indicating that the literal may/must be a map), or both. We allow\n+both, because spreads of expressions of type `dynamic` do not disambiguate, and\n+can be treated as either (it becomes a runtime error to spread a value into the\n+wrong kind of literal).\n+\n+We require that at least one component unambiguously determine the literal form,\n+otherwise it is a compile-time error. So, given:\n+\n+```dart\n+bool b = true;\n+dynamic x = <int, int>{};\n+Iterable l = [];\n+Map m = {};\n+```\n+\n+Then:\n+\n+```dart\n+{...x}       // Static error, because it is ambiguous.\n+{...x, ...l} // Statically a set, runtime error when spreading x.\n+{...x, ...m} // Statically a map, no runtime error.\n+{...l, ...m} // Static error, because it must be both a set and a map.\n+```\n+\n+In `setOrMapLiteral`, the inferred type of an `element` is a set element type\n+`T`, a pair of a key type `K` and a value type `V`, or both. It is computed\n+relative to a context type `P`.\n+\n+We say that an element *can be a set* if it has a set element type. Likewise, an\n+element *can be a map* if it has a key and value type. We say that an element\n+*must be a set* if it can be a set and has and no key type or value type. We say\n+that an element *must be a map* if can be a map and has no set element type.\n+\n+To infer the type of `element`:\n+\n+*   If `element` is an `expressionElement` with expression `e1`:\n+\n+    *   If `P` is `?` then the inferred set element type of `element` is the\n+        inferred type of the expression `e1` in context `?`.\n+\n+    *   If `P` is `Set<Ps>` then the inferred set element type of `element`\n+        is the inferred type of the expression `e1` in context `Ps`.\n+\n+*   If `element` is a `mapEntry` `ek: ev`:\n+\n+    *   If `P` is `?` then the inferred key type of `element` is the inferred\n+        type of `ek` in context `?` and the inferred value type of `element` is\n+        the inferred type of `ev` in context `?`.\n+\n+    *   If `P` is `Map<Pk, Pv>` then the inferred key type of `element` is the\n+        inferred type of `ek` in context `Pk` and the inferred value type of\n+        `element` is the inferred type of `ev` in context `Pv`.\n+\n+*   If `element` is a `spreadElement` with expression `e1`:\n+\n+    *   If `P` is `?` then let `S` be the inferred type of `e1` in context `?`:\n+\n+        *   If `S` is a non-`Null` subtype of `Iterable<Object>`, then the\n+            inferred set element type of `element` is `T` where `T` is the type\n+            such that `Iterable<T>` is a superinterface of `S` (the result of\n+            constraint matching for `X` using the constraint `S <:\n+            Iterable<X>`).\n+\n+        *   If `S` is a non-`Null` subtype of `Map<Object, Object>`, then the\n+            inferred key type of `element` is `K` and the inferred value type of\n+            `element` is `V`, where `K` and `V` are the types such that `Map<K,\n+            V>` is a superinterface of `S` (the result of constraint matching\n+            for `X` and `Y` using the constraint `S <: Map<X, Y>`).\n+\n+            *Note that both this and the previous case can match on the same\n+            element if `S` is a subtype of both `Iterable<Object>` and\n+            `Map<Object, Object>`. In that case, we rely on other elements to\n+            disambiguate.*\n+\n+        *   If `S` is `dynamic`, then the inferred set element type of `element`\n+            is `dynamic`, the inferred key type of `element` is `dynamic`, and\n+            the inferred value type of `element` is `dynamic`. *(We produce both\n+            a set element type here, and a key/value pair here and rely on other\n+            elements to disambiguate.)*\n+\n+        *   If `S` is `Null` and the spread operator is `...?` then the element\n+            has set element type `Null`, map key type `Null` and map value type\n+            `Null`.\n+\n+        *   If none of these cases match, it is an error.\n+\n+    *   If `P` is `Set<Ps>` then let `S` be the inferred type of `e1` in context\n+        `Iterable<Ps>`:\n+\n+        *   If `S` is a non-`Null` subtype of `Iterable<Object>`, then the\n+            inferred set element type of `element` is `T` where `T` is the type\n+            such that `Iterable<T>` is a superinterface of `S` (the result of\n+            constraint matching for `X` using the constraint `Iterable<X> <:\n+            S`).\n+\n+        *   If `S` is `dynamic`, then the inferred set element type of `element`\n+            is `dynamic`.\n+\n+        *   If `S` is `Null` and the spread operator is `...?`, then the set\n+            element type is `Null`.\n+\n+        *   Otherwise it is an error.\n+\n+    *   If `P` is `Map<Pk, Pv>` then let `S` be the inferred type of `e1` in\n+        context `P`:\n+\n+        *   If `S` is a non-`Null` subtype of `Map<Object, Object>`, then the\n+            inferred key type of `element` is `K` and the inferred value type of\n+            `element` is `V`, where `K` and `V` are the types such that `Map<K,\n+            V>` is a superinterface of `S` (the result of constraint matching\n+            for `X` and `Y` using the constraint `Map<X, Y> <: S`).\n+\n+        *   If `S` is `dynamic`, then the inferred key type of `element` is\n+            `dynamic`, and the inferred value type of `element` is `dynamic`.\n+\n+        *   If `S` is `Null` and the spread operator is `...?`, then the key and\n+            value element types are `Null`.\n+\n+        *   Otherwise it is an error.\n+\n+*   If `element` is an `ifElement` with one `element`, `p1`, and no \"else\"\n+    element:\n+\n+    The condition is inferred with a context type of `bool`.\n+\n+    *   If the inferred set element type of `p1` is `S` then the inferred set\n+        element type of `element` is `S`.\n+\n+    *   If the inferred key type of `p1` is `K` and the inferred value type of\n+        `p1` is `V` then the inferred key and value types of `element` are `K`\n+        and `V`.\n+\n+    *Note that both of the above cases can simultaneously apply because of\n+    `dynamic` spreads.*\n+\n+*   If `element` is an `ifElement` with two `element`s, `e1` and `e2`:\n+\n+    The condition is inferred with a context type of `bool`.\n+\n+    It is a compile error if `e1` must be a set and `e2` must be a map or vice\n+    versa. *In other words, you can't spread a map on one branch and a set on\n+    the other. Since `dynamic` provides both set and map key/value types, a\n+    `dynamic` in either branch does not run into this case.*\n+\n+    *   If the inferred set element type of `e1` is `S1` and the inferred set\n+        element type of `e2` is `S2` then the inferred set element type of\n+        `element` is the upper bound of `S1` and `S2`.\n+\n+    *   If the inferred key type of `e1` is `K1` and the inferred key type of\n+        `e1` is `V1` and the inferred key type of `e2` is `K2` and the inferred\n+        key type of `e2` is `V2` then the inferred key type of `element` is the\n+        upper bound of `K1` and `K2` and the inferred value type is the upper\n+        bound of `V1` and `V2`.\n+\n+    *Note that both of the above cases can simultaneously apply because of\n+    `dynamic` spreads.*\n+\n+*   If `element` is a `forElement` with `element` `e1` then:\n+\n+    Inference for the iterated expression and the controlling variable is done\n+    as for the corresponding `for` or `await for` statement.\n+\n+    *   If the inferred set element type of `e1` is `S` then the inferred set\n+        element type of `element` is `S`.\n+\n+    *   If the inferred key type of `e1` is `K` and the inferred key type of\n+        `e1` is `V` then the inferred key and value types of `element` are `K`\n+        and `V`.\n+\n+    *In other words, inference flows upwards from the body element. Note that\n+    both of the above cases can validly apply because of `dynamic` spreads.*\n+\n+Finally, we define inference on a `setOrMapLiteral` *collection* as follows:\n+\n+*   If *collection* is known to be a set literal, then the downwards context for\n+    inference of the elements of *collection* is `Set<P>` where `P` may be `?`\n+    if downwards inference does not constrain the type of *collection*.\n+\n+    *   If `P` is `?` then the static type of *collection* is `Set<T>` where `T`\n+        is the upper bound of the inferred set element types of the elements.\n+\n+    *   Otherwise, the static type of *collection* is `Set<T>` where `T` is\n+        determined by downwards inference.\n+\n+    *Note that the element inference will never produce a key/value type here\n+    given that downwards context.*\n+\n+*   If *collection* is known to be a map literal and downwards inference has\n+    statically known type `Map<K, V>` then the downwards context for the\n+    elements of *collection* is `Map<K, V>`.\n+\n+*   If *collection* is known to be a map literal then the downwards context for\n+    the elements of *collection* is `Map<Pk, Pv>` where `Pk` and `Pv` are\n+    determined by downwards inference, and may be `?` if the downwards context\n+    does not constrain one or both.\n+\n+    *   If `Pk` is `?` then the static key type of *collection* is `K` where `K`\n+        is the upper bound of the inferred key types of the elements.\n+\n+    *   Otherwise the static key type of *collection* is `K` where `K` is\n+        determined by downwards inference.\n+\n+    And:\n+\n+    *   If `Pv` is `?` then the static value type of *collection* is `V` where\n+        `V` is the upper bound of the inferred value types of the elements.\n+\n+    *   Otherwise the static value type of *collection* is `V` where `V` is\n+        determined by downwards inference.\n+\n+    *Note that the element inference will never produce a set element type here\n+    given this downwards context.*\n+\n+*   Otherwise, *collection* is not known to be a set or map literal, then the\n+    downwards context for the elements of *collection* is `?`, and the\n+    disambiguation is done using the immediate `elements` of *collection* as\n+    follows:\n+\n+    *   If all elements can be a set, and at least one element must be a set,\n+        then *collection* is a set literal with static type `Set<T>` where `T`\n+        is the upper bound of the set element types of the elements.\n+\n+    *   If all elements can be a map, and at least one element must be a map,\n+        then *e* is a map literal with static type `Map<K, V>` where `K` is the\n+        upper bound of the key types of the elements and `V` is the upper bound\n+        of the value types.\n+\n+    *   If all elements can be both maps and sets, then the literal is ambiguous\n+        and it is a compile-time error. *This occurs, for example, when all the\n+        *leaf elements* are dynamic spreads.*\n+\n+    *   Otherwise, it is a compile-time error. This can occur when at least one\n+        element must be a set and one element which must be a map, or when no\n+        element can be a set or map.\n+\n+#### Lists\n+\n+Inference for list literals mostly follows that of set literals without the\n+complexity around disambiguation with maps and using `List` or `Iterable` in a\n+few places instead of `Set`.\n+\n+Inside a `listLiteral`, the inferred type of an `element` is a list element type\n+`T`. It is computed relative to an element context type `P`:\n+\n+*   If `element` is an `expressionElement` with expression `e1`:\n+\n+    *   The inferred list element type of `element` is the inferred type of the\n+        expression `e1` in context `P`.\n+\n+*   If `element` is a `spreadElement` with expression `e1`:\n+\n+    *   If `P` is `?` then let `S` be the inferred type of `e1` in context `?`:\n+\n+        *   If `S` is a subtype of `Iterable<Object>`, then the inferred list\n+            element type of `element` is `T` where `T` is the type such that\n+            `Iterable<T>` is a superinterface of `S` (the result of constraint\n+            matching for `X` using the constraint `S <: Iterable<X>`).\n+\n+        *   If `S` is `dynamic`, then the inferred list element type of\n+            `element` is `dynamic`.\n+\n+        *   If `S` is `Null` and the spread operator is `...?`, then the list\n+            element type is `Null`.\n+\n+        *   Otherwise it is an error (because it is a spread of a non-spreadable\n+            type like Object).\n+\n+    *   Else, let `S` be the inferred type of `e1` in context `Iterable<P>`:\n+\n+        *   If `S` is a non-`Null` subtype of `Iterable<Object>`, then the\n+            inferred list element type of `element` is `T` where `T` is the type\n+            such that `Iterable<T>` is a superinterface of `S` (the result of\n+            constraint matching for `X` using the constraint `Iterable<X> <:\n+            S`).","path":"accepted/future-releases/unified-collections/feature-specification.md","position":401,"original_position":401,"commit_id":"fee73186be4e0a9b48a0660e0ff4c05dbf196da0","original_commit_id":"fee73186be4e0a9b48a0660e0ff4c05dbf196da0","user":{"login":"munificent","id":46275,"node_id":"MDQ6VXNlcjQ2Mjc1","avatar_url":"https://avatars0.githubusercontent.com/u/46275?v=4","gravatar_id":"","url":"https://api.github.com/users/munificent","html_url":"https://github.com/munificent","followers_url":"https://api.github.com/users/munificent/followers","following_url":"https://api.github.com/users/munificent/following{/other_user}","gists_url":"https://api.github.com/users/munificent/gists{/gist_id}","starred_url":"https://api.github.com/users/munificent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/munificent/subscriptions","organizations_url":"https://api.github.com/users/munificent/orgs","repos_url":"https://api.github.com/users/munificent/repos","events_url":"https://api.github.com/users/munificent/events{/privacy}","received_events_url":"https://api.github.com/users/munificent/received_events","type":"User","site_admin":false},"body":"Oh, I see your comments on those now below. So all three are in error? I'll fix them.","created_at":"2019-02-22T00:37:05Z","updated_at":"2019-02-22T00:37:06Z","html_url":"https://github.com/dart-lang/language/pull/200#discussion_r259174357","pull_request_url":"https://api.github.com/repos/dart-lang/language/pulls/200","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/dart-lang/language/pulls/comments/259174357"},"html":{"href":"https://github.com/dart-lang/language/pull/200#discussion_r259174357"},"pull_request":{"href":"https://api.github.com/repos/dart-lang/language/pulls/200"}},"in_reply_to_id":259026691},"pull_request":{"url":"https://api.github.com/repos/dart-lang/language/pulls/200","id":249449002,"node_id":"MDExOlB1bGxSZXF1ZXN0MjQ5NDQ5MDAy","html_url":"https://github.com/dart-lang/language/pull/200","diff_url":"https://github.com/dart-lang/language/pull/200.diff","patch_url":"https://github.com/dart-lang/language/pull/200.patch","issue_url":"https://api.github.com/repos/dart-lang/language/issues/200","number":200,"state":"open","locked":false,"title":"Unified collections","user":{"login":"munificent","id":46275,"node_id":"MDQ6VXNlcjQ2Mjc1","avatar_url":"https://avatars0.githubusercontent.com/u/46275?v=4","gravatar_id":"","url":"https://api.github.com/users/munificent","html_url":"https://github.com/munificent","followers_url":"https://api.github.com/users/munificent/followers","following_url":"https://api.github.com/users/munificent/following{/other_user}","gists_url":"https://api.github.com/users/munificent/gists{/gist_id}","starred_url":"https://api.github.com/users/munificent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/munificent/subscriptions","organizations_url":"https://api.github.com/users/munificent/orgs","repos_url":"https://api.github.com/users/munificent/repos","events_url":"https://api.github.com/users/munificent/events{/privacy}","received_events_url":"https://api.github.com/users/munificent/received_events","type":"User","site_admin":false},"body":"OK, here's my attempt to pull together a unified proposal for set literals, spread, and control flow. The basic process was:\r\n\r\n* Take type inference and disambiguation from the doc Leaf and Lasse put together. I renamed a few things, mostly around \"part\" -> \"element\", since \"part\" already means something in Dart.\r\n\r\n* Take some grammar changes from that doc but mostly pull them from the spread and control flow proposals since those were more comprehensive. (The doc didn't have C-style for, etc.) Simplified it where I could.\r\n\r\n* Take the static error checking from the spread and control flow docs, and maybe the set literal one? I don't recall now.\r\n\r\n* Take const stuff from the doc and the proposals. Right now, it does not separately specify how to produce a const value. I think the runtime semantics are general enough to work for that, with some modifications spelled out in the proposal.\r\n\r\n* Take runtime semantics from my two proposals since I think those were the most complete.\r\n\r\nLet me know what you think!","created_at":"2019-02-01T00:27:59Z","updated_at":"2019-02-22T00:37:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fac9e9919dd03189b94859ecca354957684c342b","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1232391652,"node_id":"MDU6TGFiZWwxMjMyMzkxNjUy","url":"https://api.github.com/repos/dart-lang/language/labels/cla:%20yes","name":"cla: yes","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/dart-lang/language/pulls/200/commits","review_comments_url":"https://api.github.com/repos/dart-lang/language/pulls/200/comments","review_comment_url":"https://api.github.com/repos/dart-lang/language/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dart-lang/language/issues/200/comments","statuses_url":"https://api.github.com/repos/dart-lang/language/statuses/fee73186be4e0a9b48a0660e0ff4c05dbf196da0","head":{"label":"dart-lang:unified-collections","ref":"unified-collections","sha":"fee73186be4e0a9b48a0660e0ff4c05dbf196da0","user":{"login":"dart-lang","id":1609975,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2MDk5NzU=","avatar_url":"https://avatars0.githubusercontent.com/u/1609975?v=4","gravatar_id":"","url":"https://api.github.com/users/dart-lang","html_url":"https://github.com/dart-lang","followers_url":"https://api.github.com/users/dart-lang/followers","following_url":"https://api.github.com/users/dart-lang/following{/other_user}","gists_url":"https://api.github.com/users/dart-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/dart-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dart-lang/subscriptions","organizations_url":"https://api.github.com/users/dart-lang/orgs","repos_url":"https://api.github.com/users/dart-lang/repos","events_url":"https://api.github.com/users/dart-lang/events{/privacy}","received_events_url":"https://api.github.com/users/dart-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":137279731,"node_id":"MDEwOlJlcG9zaXRvcnkxMzcyNzk3MzE=","name":"language","full_name":"dart-lang/language","private":false,"owner":{"login":"dart-lang","id":1609975,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2MDk5NzU=","avatar_url":"https://avatars0.githubusercontent.com/u/1609975?v=4","gravatar_id":"","url":"https://api.github.com/users/dart-lang","html_url":"https://github.com/dart-lang","followers_url":"https://api.github.com/users/dart-lang/followers","following_url":"https://api.github.com/users/dart-lang/following{/other_user}","gists_url":"https://api.github.com/users/dart-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/dart-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dart-lang/subscriptions","organizations_url":"https://api.github.com/users/dart-lang/orgs","repos_url":"https://api.github.com/users/dart-lang/repos","events_url":"https://api.github.com/users/dart-lang/events{/privacy}","received_events_url":"https://api.github.com/users/dart-lang/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/dart-lang/language","description":"Design of the Dart language","fork":false,"url":"https://api.github.com/repos/dart-lang/language","forks_url":"https://api.github.com/repos/dart-lang/language/forks","keys_url":"https://api.github.com/repos/dart-lang/language/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dart-lang/language/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dart-lang/language/teams","hooks_url":"https://api.github.com/repos/dart-lang/language/hooks","issue_events_url":"https://api.github.com/repos/dart-lang/language/issues/events{/number}","events_url":"https://api.github.com/repos/dart-lang/language/events","assignees_url":"https://api.github.com/repos/dart-lang/language/assignees{/user}","branches_url":"https://api.github.com/repos/dart-lang/language/branches{/branch}","tags_url":"https://api.github.com/repos/dart-lang/language/tags","blobs_url":"https://api.github.com/repos/dart-lang/language/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dart-lang/language/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dart-lang/language/git/refs{/sha}","trees_url":"https://api.github.com/repos/dart-lang/language/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dart-lang/language/statuses/{sha}","languages_url":"https://api.github.com/repos/dart-lang/language/languages","stargazers_url":"https://api.github.com/repos/dart-lang/language/stargazers","contributors_url":"https://api.github.com/repos/dart-lang/language/contributors","subscribers_url":"https://api.github.com/repos/dart-lang/language/subscribers","subscription_url":"https://api.github.com/repos/dart-lang/language/subscription","commits_url":"https://api.github.com/repos/dart-lang/language/commits{/sha}","git_commits_url":"https://api.github.com/repos/dart-lang/language/git/commits{/sha}","comments_url":"https://api.github.com/repos/dart-lang/language/comments{/number}","issue_comment_url":"https://api.github.com/repos/dart-lang/language/issues/comments{/number}","contents_url":"https://api.github.com/repos/dart-lang/language/contents/{+path}","compare_url":"https://api.github.com/repos/dart-lang/language/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dart-lang/language/merges","archive_url":"https://api.github.com/repos/dart-lang/language/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dart-lang/language/downloads","issues_url":"https://api.github.com/repos/dart-lang/language/issues{/number}","pulls_url":"https://api.github.com/repos/dart-lang/language/pulls{/number}","milestones_url":"https://api.github.com/repos/dart-lang/language/milestones{/number}","notifications_url":"https://api.github.com/repos/dart-lang/language/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dart-lang/language/labels{/name}","releases_url":"https://api.github.com/repos/dart-lang/language/releases{/id}","deployments_url":"https://api.github.com/repos/dart-lang/language/deployments","created_at":"2018-06-13T22:49:18Z","updated_at":"2019-02-21T23:35:19Z","pushed_at":"2019-02-21T23:35:20Z","git_url":"git://github.com/dart-lang/language.git","ssh_url":"git@github.com:dart-lang/language.git","clone_url":"https://github.com/dart-lang/language.git","svn_url":"https://github.com/dart-lang/language","homepage":"","size":979,"stargazers_count":188,"watchers_count":188,"language":"Dart","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":135,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":18,"open_issues":135,"watchers":188,"default_branch":"master"}},"base":{"label":"dart-lang:master","ref":"master","sha":"47abe777fc25375849d2fe219b1989fa80ba2b9a","user":{"login":"dart-lang","id":1609975,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2MDk5NzU=","avatar_url":"https://avatars0.githubusercontent.com/u/1609975?v=4","gravatar_id":"","url":"https://api.github.com/users/dart-lang","html_url":"https://github.com/dart-lang","followers_url":"https://api.github.com/users/dart-lang/followers","following_url":"https://api.github.com/users/dart-lang/following{/other_user}","gists_url":"https://api.github.com/users/dart-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/dart-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dart-lang/subscriptions","organizations_url":"https://api.github.com/users/dart-lang/orgs","repos_url":"https://api.github.com/users/dart-lang/repos","events_url":"https://api.github.com/users/dart-lang/events{/privacy}","received_events_url":"https://api.github.com/users/dart-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":137279731,"node_id":"MDEwOlJlcG9zaXRvcnkxMzcyNzk3MzE=","name":"language","full_name":"dart-lang/language","private":false,"owner":{"login":"dart-lang","id":1609975,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2MDk5NzU=","avatar_url":"https://avatars0.githubusercontent.com/u/1609975?v=4","gravatar_id":"","url":"https://api.github.com/users/dart-lang","html_url":"https://github.com/dart-lang","followers_url":"https://api.github.com/users/dart-lang/followers","following_url":"https://api.github.com/users/dart-lang/following{/other_user}","gists_url":"https://api.github.com/users/dart-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/dart-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dart-lang/subscriptions","organizations_url":"https://api.github.com/users/dart-lang/orgs","repos_url":"https://api.github.com/users/dart-lang/repos","events_url":"https://api.github.com/users/dart-lang/events{/privacy}","received_events_url":"https://api.github.com/users/dart-lang/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/dart-lang/language","description":"Design of the Dart language","fork":false,"url":"https://api.github.com/repos/dart-lang/language","forks_url":"https://api.github.com/repos/dart-lang/language/forks","keys_url":"https://api.github.com/repos/dart-lang/language/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dart-lang/language/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dart-lang/language/teams","hooks_url":"https://api.github.com/repos/dart-lang/language/hooks","issue_events_url":"https://api.github.com/repos/dart-lang/language/issues/events{/number}","events_url":"https://api.github.com/repos/dart-lang/language/events","assignees_url":"https://api.github.com/repos/dart-lang/language/assignees{/user}","branches_url":"https://api.github.com/repos/dart-lang/language/branches{/branch}","tags_url":"https://api.github.com/repos/dart-lang/language/tags","blobs_url":"https://api.github.com/repos/dart-lang/language/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dart-lang/language/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dart-lang/language/git/refs{/sha}","trees_url":"https://api.github.com/repos/dart-lang/language/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dart-lang/language/statuses/{sha}","languages_url":"https://api.github.com/repos/dart-lang/language/languages","stargazers_url":"https://api.github.com/repos/dart-lang/language/stargazers","contributors_url":"https://api.github.com/repos/dart-lang/language/contributors","subscribers_url":"https://api.github.com/repos/dart-lang/language/subscribers","subscription_url":"https://api.github.com/repos/dart-lang/language/subscription","commits_url":"https://api.github.com/repos/dart-lang/language/commits{/sha}","git_commits_url":"https://api.github.com/repos/dart-lang/language/git/commits{/sha}","comments_url":"https://api.github.com/repos/dart-lang/language/comments{/number}","issue_comment_url":"https://api.github.com/repos/dart-lang/language/issues/comments{/number}","contents_url":"https://api.github.com/repos/dart-lang/language/contents/{+path}","compare_url":"https://api.github.com/repos/dart-lang/language/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dart-lang/language/merges","archive_url":"https://api.github.com/repos/dart-lang/language/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dart-lang/language/downloads","issues_url":"https://api.github.com/repos/dart-lang/language/issues{/number}","pulls_url":"https://api.github.com/repos/dart-lang/language/pulls{/number}","milestones_url":"https://api.github.com/repos/dart-lang/language/milestones{/number}","notifications_url":"https://api.github.com/repos/dart-lang/language/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dart-lang/language/labels{/name}","releases_url":"https://api.github.com/repos/dart-lang/language/releases{/id}","deployments_url":"https://api.github.com/repos/dart-lang/language/deployments","created_at":"2018-06-13T22:49:18Z","updated_at":"2019-02-21T23:35:19Z","pushed_at":"2019-02-21T23:35:20Z","git_url":"git://github.com/dart-lang/language.git","ssh_url":"git@github.com:dart-lang/language.git","clone_url":"https://github.com/dart-lang/language.git","svn_url":"https://github.com/dart-lang/language","homepage":"","size":979,"stargazers_count":188,"watchers_count":188,"language":"Dart","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":135,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":18,"open_issues":135,"watchers":188,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dart-lang/language/pulls/200"},"html":{"href":"https://github.com/dart-lang/language/pull/200"},"issue":{"href":"https://api.github.com/repos/dart-lang/language/issues/200"},"comments":{"href":"https://api.github.com/repos/dart-lang/language/issues/200/comments"},"review_comments":{"href":"https://api.github.com/repos/dart-lang/language/pulls/200/comments"},"review_comment":{"href":"https://api.github.com/repos/dart-lang/language/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dart-lang/language/pulls/200/commits"},"statuses":{"href":"https://api.github.com/repos/dart-lang/language/statuses/fee73186be4e0a9b48a0660e0ff4c05dbf196da0"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"munificent"}}