{"action":"created","issue":{"url":"https://api.github.com/repos/scala/scala/issues/5085","repository_url":"https://api.github.com/repos/scala/scala","labels_url":"https://api.github.com/repos/scala/scala/issues/5085/labels{/name}","comments_url":"https://api.github.com/repos/scala/scala/issues/5085/comments","events_url":"https://api.github.com/repos/scala/scala/issues/5085/events","html_url":"https://github.com/scala/scala/pull/5085","id":146095978,"number":5085,"title":"SD-98 don't emit unnecessary mixin forwarders","user":{"login":"lrytz","id":119636,"avatar_url":"https://avatars.githubusercontent.com/u/119636?v=3","gravatar_id":"","url":"https://api.github.com/users/lrytz","html_url":"https://github.com/lrytz","followers_url":"https://api.github.com/users/lrytz/followers","following_url":"https://api.github.com/users/lrytz/following{/other_user}","gists_url":"https://api.github.com/users/lrytz/gists{/gist_id}","starred_url":"https://api.github.com/users/lrytz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lrytz/subscriptions","organizations_url":"https://api.github.com/users/lrytz/orgs","repos_url":"https://api.github.com/users/lrytz/repos","events_url":"https://api.github.com/users/lrytz/events{/privacy}","received_events_url":"https://api.github.com/users/lrytz/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/scala/scala/labels/release-notes","name":"release-notes","color":"d4c5f9"}],"state":"closed","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/scala/scala/milestones/52","html_url":"https://github.com/scala/scala/milestones/2.12.0-M5","labels_url":"https://api.github.com/repos/scala/scala/milestones/52/labels","id":1355301,"number":52,"title":"2.12.0-M5","description":"Merge to 2.12.x. \r\n\r\nBug fixes to stabilize existing features only. Ticket must be created and assigned to M5 milestone on scala/scala-dev: https://github.com/scala/scala-dev/milestones/2.12.0-M5.\r\n\r\nOne potential exception to the no-big-refactorings-rule -- TBD:\r\n  - [ ] fields phase + rework lambdalift to reduce capture? (#5035)\r\n","creator":{"login":"adriaanm","id":91083,"avatar_url":"https://avatars.githubusercontent.com/u/91083?v=3","gravatar_id":"","url":"https://api.github.com/users/adriaanm","html_url":"https://github.com/adriaanm","followers_url":"https://api.github.com/users/adriaanm/followers","following_url":"https://api.github.com/users/adriaanm/following{/other_user}","gists_url":"https://api.github.com/users/adriaanm/gists{/gist_id}","starred_url":"https://api.github.com/users/adriaanm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adriaanm/subscriptions","organizations_url":"https://api.github.com/users/adriaanm/orgs","repos_url":"https://api.github.com/users/adriaanm/repos","events_url":"https://api.github.com/users/adriaanm/events{/privacy}","received_events_url":"https://api.github.com/users/adriaanm/received_events","type":"User","site_admin":false},"open_issues":31,"closed_issues":22,"state":"open","created_at":"2015-10-14T13:06:29Z","updated_at":"2016-04-22T09:02:06Z","due_on":"2016-05-27T07:00:00Z","closed_at":null},"comments":13,"created_at":"2016-04-05T20:05:19Z","updated_at":"2016-04-22T10:02:53Z","closed_at":"2016-04-20T13:49:08Z","pull_request":{"url":"https://api.github.com/repos/scala/scala/pulls/5085","html_url":"https://github.com/scala/scala/pull/5085","diff_url":"https://github.com/scala/scala/pull/5085.diff","patch_url":"https://github.com/scala/scala/pull/5085.patch"},"body":"In most cases when a class inherits a concrete method from a trait we\r\ndon't need to generate a forwarder to the default method in the class."},"comment":{"url":"https://api.github.com/repos/scala/scala/issues/comments/213365299","html_url":"https://github.com/scala/scala/pull/5085#issuecomment-213365299","issue_url":"https://api.github.com/repos/scala/scala/issues/5085","id":213365299,"user":{"login":"lrytz","id":119636,"avatar_url":"https://avatars.githubusercontent.com/u/119636?v=3","gravatar_id":"","url":"https://api.github.com/users/lrytz","html_url":"https://github.com/lrytz","followers_url":"https://api.github.com/users/lrytz/followers","following_url":"https://api.github.com/users/lrytz/following{/other_user}","gists_url":"https://api.github.com/users/lrytz/gists{/gist_id}","starred_url":"https://api.github.com/users/lrytz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lrytz/subscriptions","organizations_url":"https://api.github.com/users/lrytz/orgs","repos_url":"https://api.github.com/users/lrytz/repos","events_url":"https://api.github.com/users/lrytz/events{/privacy}","received_events_url":"https://api.github.com/users/lrytz/received_events","type":"User","site_admin":false},"created_at":"2016-04-22T10:02:53Z","updated_at":"2016-04-22T10:02:53Z","body":"most of these redundant parents stem from the `$init$` calls. i guess the `$init$` methods could be made static, without a non-static method in the interfce on the side. this is even independent of the question what we do for user-defined trait methods.\r\n\r\nactually we are in the funny situation that `$init$` methods override each other, but we're just calling them with `invokespecial` anyway:\r\n\r\n```\r\ntrait T { println(\"hi\") }\r\ntrait U extends T { println(\"ho\") }\r\nclass C extends U\r\n```\r\nboth `T` and `U` get a `public default $init$()V`, so the one in `U` is an override. `C.<init>` has `INVOKESPECIAL T.$init$ ()V` and `INVOKESPECIAL U.$init$ ()V`."}}