{"action":"created","comment":{"url":"https://api.github.com/repos/apple/swift/pulls/comments/71201386","id":71201386,"diff_hunk":"@@ -1987,6 +1988,69 @@ void ConformanceChecker::recordTypeWitness(AssociatedTypeDecl *assocType,\n     typeDecl);\n }\n \n+/// Generates a note for a protocol requirement for which no witness was found\n+/// and provides a fixit to add a stub to the adopter\n+static void diagnoseNoWitness(ValueDecl *Requirement, Type RequirementType,\n+                              NormalProtocolConformance *Conformance,\n+                              TypeChecker &TC) {\n+  SourceLoc FixitLocation;\n+  SourceLoc TypeLoc;\n+  if (auto Extension = dyn_cast<ExtensionDecl>(Conformance->getDeclContext())) {\n+    FixitLocation = Extension->getBraces().Start.getAdvancedLocOrInvalid(1);\n+    TypeLoc = Extension->getStartLoc();\n+  } else if (auto Nominal =\n+               dyn_cast<NominalTypeDecl>(Conformance->getDeclContext())) {\n+    FixitLocation = Nominal->getBraces().Start.getAdvancedLocOrInvalid(1);\n+    TypeLoc = Nominal->getStartLoc();\n+  } else {\n+    llvm_unreachable(\"Unknown adopter kind\");\n+  }\n+\n+  // FIXME: Infer body indention from the source rather than hard-coding\n+  // 4 spaces.\n+  std::string ExtraIndent = \"    \";\n+  StringRef CurrentIndent = Lexer::getIndentationForLine(TC.Context.SourceMgr,\n+                                                         TypeLoc);\n+  std::string StubIndent = CurrentIndent.str() + ExtraIndent;\n+\n+  std::string FixitString;\n+  llvm::raw_string_ostream FixitStream(FixitString);\n+  ExtraIndentStreamPrinter Printer(FixitStream, StubIndent);\n+\n+  if (auto MissingTypeWitness = dyn_cast<AssociatedTypeDecl>(Requirement)) {\n+    Printer.printNewline();\n+    Printer << \"typealias \" << MissingTypeWitness->getName() << \" = <#type#>\";\n+    Printer << \"\\n\";\n+\n+    TC.diagnose(MissingTypeWitness, diag::no_witnesses_type,\n+                MissingTypeWitness->getName())\n+      .fixItInsert(FixitLocation, FixitStream.str());\n+  } else {\n+    std::function<std::string(const ValueDecl *)> FunctionBody =\n+      [](const ValueDecl *VD) { return \"<#code#>\"; };\n+\n+    PrintOptions Options = PrintOptions::printForDiagnostics();\n+    Options.AccessibilityFilter = Accessibility::Private;\n+    Options.FunctionBody = &FunctionBody;\n+    if (isa<NominalTypeDecl>(Conformance->getDeclContext())) {\n+      // Create a variable declaration instead of a computed property in nominal\n+      // types\n+      Options.PrintPropertyAccessors = false;\n+    }\n+\n+    Printer.printNewline();\n+    Requirement->print(Printer, Options);","path":"lib/Sema/TypeCheckProtocol.cpp","position":63,"original_position":63,"commit_id":"95eb7a602204017a50d0460ae72685570a60a185","original_commit_id":"95eb7a602204017a50d0460ae72685570a60a185","user":{"login":"DougGregor","id":989428,"avatar_url":"https://avatars.githubusercontent.com/u/989428?v=3","gravatar_id":"","url":"https://api.github.com/users/DougGregor","html_url":"https://github.com/DougGregor","followers_url":"https://api.github.com/users/DougGregor/followers","following_url":"https://api.github.com/users/DougGregor/following{/other_user}","gists_url":"https://api.github.com/users/DougGregor/gists{/gist_id}","starred_url":"https://api.github.com/users/DougGregor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DougGregor/subscriptions","organizations_url":"https://api.github.com/users/DougGregor/orgs","repos_url":"https://api.github.com/users/DougGregor/repos","events_url":"https://api.github.com/users/DougGregor/events{/privacy}","received_events_url":"https://api.github.com/users/DougGregor/received_events","type":"User","site_admin":false},"body":"It probably shouldn't hold up the patch, but it would be fantastic if we could substitute 'Self' into the requirement before printing (maybe only when the associated types it uses are known?), so we get a stub that's customized to the given class. For example, 'Self' requirements will be replaced with the name of the conforming type.","created_at":"2016-07-18T18:26:46Z","updated_at":"2016-07-18T18:26:46Z","html_url":"https://github.com/apple/swift/pull/3528#discussion_r71201386","pull_request_url":"https://api.github.com/repos/apple/swift/pulls/3528","_links":{"self":{"href":"https://api.github.com/repos/apple/swift/pulls/comments/71201386"},"html":{"href":"https://github.com/apple/swift/pull/3528#discussion_r71201386"},"pull_request":{"href":"https://api.github.com/repos/apple/swift/pulls/3528"}}},"pull_request":{"url":"https://api.github.com/repos/apple/swift/pulls/3528","id":77586724,"html_url":"https://github.com/apple/swift/pull/3528","diff_url":"https://github.com/apple/swift/pull/3528.diff","patch_url":"https://github.com/apple/swift/pull/3528.patch","issue_url":"https://api.github.com/repos/apple/swift/issues/3528","number":3528,"state":"open","locked":false,"title":"[Diag] Fixits for missing protocol requirements","user":{"login":"ahoppen","id":4062178,"avatar_url":"https://avatars.githubusercontent.com/u/4062178?v=3","gravatar_id":"","url":"https://api.github.com/users/ahoppen","html_url":"https://github.com/ahoppen","followers_url":"https://api.github.com/users/ahoppen/followers","following_url":"https://api.github.com/users/ahoppen/following{/other_user}","gists_url":"https://api.github.com/users/ahoppen/gists{/gist_id}","starred_url":"https://api.github.com/users/ahoppen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahoppen/subscriptions","organizations_url":"https://api.github.com/users/ahoppen/orgs","repos_url":"https://api.github.com/users/ahoppen/repos","events_url":"https://api.github.com/users/ahoppen/events{/privacy}","received_events_url":"https://api.github.com/users/ahoppen/received_events","type":"User","site_admin":false},"body":"<!-- Please complete this template before creating the pull request. -->\r\n#### What's in this pull request?\r\n<!-- Description about pull request. -->\r\nTo each note with a protocol requirement that is not met, we will now add a fixit that adds a stub to the end of the adoptee's declaration. In particular, that is:\r\n\r\n* For missing function requirements: Function with same signature and `fatalError` implementation\r\n* For missing constructors: Constructor with `fatalError` implementation\r\n* For missing subscripts: New subscript with getter and/or setter. Both with `fatalError` implementation\r\n* For missing variables: A variable (always `var`) with the specified type\r\n\r\nA few minor questions are still open:\r\n* Should we rather add the stub at the beginning of the declaration than on the end?\r\n* Should the default implementation be an editor placeholder `<#code#>` instead of `fatalError`. `fatalError` seems to be the approach swift has taken so far but editor placeholders seem more friendly to me (at least when using Xcode)\r\n* I'm currently always using 4 spaces for indention, as it is done in several other fixits. Is that a no-go for such fixits that will probably often be applied? If so, inferring the current indentation settings will be my next task. Otherwise, I'll probably postpone this a little. I filed [SR-2086](https://bugs.swift.org/browse/SR-2086) to track this issue.\r\n* I haven't added any tests for this yet because I don't know how to specify the line at which the fixit should occur. Simply specifying the column and a huge fixit didn't seem the right approach to me.\r\n\r\n#### Resolved bug number: ([SR-2077](https://bugs.swift.org/browse/SR-2077))\r\n<!-- If this pull request resolves any bugs from Swift bug tracker -->\r\n\r\n* * * *\r\n\r\n<!-- This selection should only be completed by Swift admin -->\r\nBefore merging this pull request to apple/swift repository:\r\n- [ ] Test pull request on Swift continuous integration.\r\n\r\n<details>\r\n  <summary>Triggering Swift CI</summary>\r\n\r\nThe swift-ci is triggered by writing a comment on this PR addressed to the GitHub user @swift-ci. Different tests will run depending on the specific comment that you use. The currently available comments are:\r\n\r\n**Smoke Testing**\r\n\r\n        Platform     | Comment\r\n        ------------ | -------------\r\n        All supported platforms     | @swift-ci Please smoke test\r\n        All supported platforms     | @swift-ci Please smoke test and merge\r\n        OS X platform               | @swift-ci Please smoke test OS X platform\r\n        Linux platform              | @swift-ci Please smoke test Linux platform\r\n\r\n**Validation Testing**\r\n\r\n        Platform     | Comment\r\n        ------------ | -------------\r\n        All supported platforms     | @swift-ci Please test\r\n        All supported platforms     | @swift-ci Please test and merge\r\n        OS X platform               | @swift-ci Please test OS X platform\r\n        OS X platform               | @swift-ci Please benchmark\r\n        Linux platform              | @swift-ci Please test Linux platform\r\n\r\n\r\n**Lint Testing**\r\n\r\n        Language     | Comment\r\n        ------------ | -------------\r\n        Python       | @swift-ci Please Python lint\r\n\r\nNote: Only members of the Apple organization can trigger swift-ci.\r\n</details>\r\n<!-- Thank you for your contribution to Swift! -->","created_at":"2016-07-15T09:22:05Z","updated_at":"2016-07-18T18:26:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"553b234be34002bd9c8035580acea91207d63b39","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/apple/swift/pulls/3528/commits","review_comments_url":"https://api.github.com/repos/apple/swift/pulls/3528/comments","review_comment_url":"https://api.github.com/repos/apple/swift/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apple/swift/issues/3528/comments","statuses_url":"https://api.github.com/repos/apple/swift/statuses/95eb7a602204017a50d0460ae72685570a60a185","head":{"label":"ahoppen:SR-2077-protocol-fixit","ref":"SR-2077-protocol-fixit","sha":"95eb7a602204017a50d0460ae72685570a60a185","user":{"login":"ahoppen","id":4062178,"avatar_url":"https://avatars.githubusercontent.com/u/4062178?v=3","gravatar_id":"","url":"https://api.github.com/users/ahoppen","html_url":"https://github.com/ahoppen","followers_url":"https://api.github.com/users/ahoppen/followers","following_url":"https://api.github.com/users/ahoppen/following{/other_user}","gists_url":"https://api.github.com/users/ahoppen/gists{/gist_id}","starred_url":"https://api.github.com/users/ahoppen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahoppen/subscriptions","organizations_url":"https://api.github.com/users/ahoppen/orgs","repos_url":"https://api.github.com/users/ahoppen/repos","events_url":"https://api.github.com/users/ahoppen/events{/privacy}","received_events_url":"https://api.github.com/users/ahoppen/received_events","type":"User","site_admin":false},"repo":{"id":50429743,"name":"swift","full_name":"ahoppen/swift","owner":{"login":"ahoppen","id":4062178,"avatar_url":"https://avatars.githubusercontent.com/u/4062178?v=3","gravatar_id":"","url":"https://api.github.com/users/ahoppen","html_url":"https://github.com/ahoppen","followers_url":"https://api.github.com/users/ahoppen/followers","following_url":"https://api.github.com/users/ahoppen/following{/other_user}","gists_url":"https://api.github.com/users/ahoppen/gists{/gist_id}","starred_url":"https://api.github.com/users/ahoppen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahoppen/subscriptions","organizations_url":"https://api.github.com/users/ahoppen/orgs","repos_url":"https://api.github.com/users/ahoppen/repos","events_url":"https://api.github.com/users/ahoppen/events{/privacy}","received_events_url":"https://api.github.com/users/ahoppen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ahoppen/swift","description":"The Swift Programming Language","fork":true,"url":"https://api.github.com/repos/ahoppen/swift","forks_url":"https://api.github.com/repos/ahoppen/swift/forks","keys_url":"https://api.github.com/repos/ahoppen/swift/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ahoppen/swift/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ahoppen/swift/teams","hooks_url":"https://api.github.com/repos/ahoppen/swift/hooks","issue_events_url":"https://api.github.com/repos/ahoppen/swift/issues/events{/number}","events_url":"https://api.github.com/repos/ahoppen/swift/events","assignees_url":"https://api.github.com/repos/ahoppen/swift/assignees{/user}","branches_url":"https://api.github.com/repos/ahoppen/swift/branches{/branch}","tags_url":"https://api.github.com/repos/ahoppen/swift/tags","blobs_url":"https://api.github.com/repos/ahoppen/swift/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ahoppen/swift/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ahoppen/swift/git/refs{/sha}","trees_url":"https://api.github.com/repos/ahoppen/swift/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ahoppen/swift/statuses/{sha}","languages_url":"https://api.github.com/repos/ahoppen/swift/languages","stargazers_url":"https://api.github.com/repos/ahoppen/swift/stargazers","contributors_url":"https://api.github.com/repos/ahoppen/swift/contributors","subscribers_url":"https://api.github.com/repos/ahoppen/swift/subscribers","subscription_url":"https://api.github.com/repos/ahoppen/swift/subscription","commits_url":"https://api.github.com/repos/ahoppen/swift/commits{/sha}","git_commits_url":"https://api.github.com/repos/ahoppen/swift/git/commits{/sha}","comments_url":"https://api.github.com/repos/ahoppen/swift/comments{/number}","issue_comment_url":"https://api.github.com/repos/ahoppen/swift/issues/comments{/number}","contents_url":"https://api.github.com/repos/ahoppen/swift/contents/{+path}","compare_url":"https://api.github.com/repos/ahoppen/swift/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ahoppen/swift/merges","archive_url":"https://api.github.com/repos/ahoppen/swift/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ahoppen/swift/downloads","issues_url":"https://api.github.com/repos/ahoppen/swift/issues{/number}","pulls_url":"https://api.github.com/repos/ahoppen/swift/pulls{/number}","milestones_url":"https://api.github.com/repos/ahoppen/swift/milestones{/number}","notifications_url":"https://api.github.com/repos/ahoppen/swift/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ahoppen/swift/labels{/name}","releases_url":"https://api.github.com/repos/ahoppen/swift/releases{/id}","deployments_url":"https://api.github.com/repos/ahoppen/swift/deployments","created_at":"2016-01-26T13:18:54Z","updated_at":"2016-01-26T13:19:10Z","pushed_at":"2016-07-18T12:28:58Z","git_url":"git://github.com/ahoppen/swift.git","ssh_url":"git@github.com:ahoppen/swift.git","clone_url":"https://github.com/ahoppen/swift.git","svn_url":"https://github.com/ahoppen/swift","homepage":"https://swift.org/","size":102609,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apple:master","ref":"master","sha":"f519cdf1281643f392ac3c3d426ac401091d11ae","user":{"login":"apple","id":10639145,"avatar_url":"https://avatars.githubusercontent.com/u/10639145?v=3","gravatar_id":"","url":"https://api.github.com/users/apple","html_url":"https://github.com/apple","followers_url":"https://api.github.com/users/apple/followers","following_url":"https://api.github.com/users/apple/following{/other_user}","gists_url":"https://api.github.com/users/apple/gists{/gist_id}","starred_url":"https://api.github.com/users/apple/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apple/subscriptions","organizations_url":"https://api.github.com/users/apple/orgs","repos_url":"https://api.github.com/users/apple/repos","events_url":"https://api.github.com/users/apple/events{/privacy}","received_events_url":"https://api.github.com/users/apple/received_events","type":"Organization","site_admin":false},"repo":{"id":44838949,"name":"swift","full_name":"apple/swift","owner":{"login":"apple","id":10639145,"avatar_url":"https://avatars.githubusercontent.com/u/10639145?v=3","gravatar_id":"","url":"https://api.github.com/users/apple","html_url":"https://github.com/apple","followers_url":"https://api.github.com/users/apple/followers","following_url":"https://api.github.com/users/apple/following{/other_user}","gists_url":"https://api.github.com/users/apple/gists{/gist_id}","starred_url":"https://api.github.com/users/apple/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apple/subscriptions","organizations_url":"https://api.github.com/users/apple/orgs","repos_url":"https://api.github.com/users/apple/repos","events_url":"https://api.github.com/users/apple/events{/privacy}","received_events_url":"https://api.github.com/users/apple/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apple/swift","description":"The Swift Programming Language","fork":false,"url":"https://api.github.com/repos/apple/swift","forks_url":"https://api.github.com/repos/apple/swift/forks","keys_url":"https://api.github.com/repos/apple/swift/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apple/swift/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apple/swift/teams","hooks_url":"https://api.github.com/repos/apple/swift/hooks","issue_events_url":"https://api.github.com/repos/apple/swift/issues/events{/number}","events_url":"https://api.github.com/repos/apple/swift/events","assignees_url":"https://api.github.com/repos/apple/swift/assignees{/user}","branches_url":"https://api.github.com/repos/apple/swift/branches{/branch}","tags_url":"https://api.github.com/repos/apple/swift/tags","blobs_url":"https://api.github.com/repos/apple/swift/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apple/swift/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apple/swift/git/refs{/sha}","trees_url":"https://api.github.com/repos/apple/swift/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apple/swift/statuses/{sha}","languages_url":"https://api.github.com/repos/apple/swift/languages","stargazers_url":"https://api.github.com/repos/apple/swift/stargazers","contributors_url":"https://api.github.com/repos/apple/swift/contributors","subscribers_url":"https://api.github.com/repos/apple/swift/subscribers","subscription_url":"https://api.github.com/repos/apple/swift/subscription","commits_url":"https://api.github.com/repos/apple/swift/commits{/sha}","git_commits_url":"https://api.github.com/repos/apple/swift/git/commits{/sha}","comments_url":"https://api.github.com/repos/apple/swift/comments{/number}","issue_comment_url":"https://api.github.com/repos/apple/swift/issues/comments{/number}","contents_url":"https://api.github.com/repos/apple/swift/contents/{+path}","compare_url":"https://api.github.com/repos/apple/swift/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apple/swift/merges","archive_url":"https://api.github.com/repos/apple/swift/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apple/swift/downloads","issues_url":"https://api.github.com/repos/apple/swift/issues{/number}","pulls_url":"https://api.github.com/repos/apple/swift/pulls{/number}","milestones_url":"https://api.github.com/repos/apple/swift/milestones{/number}","notifications_url":"https://api.github.com/repos/apple/swift/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apple/swift/labels{/name}","releases_url":"https://api.github.com/repos/apple/swift/releases{/id}","deployments_url":"https://api.github.com/repos/apple/swift/deployments","created_at":"2015-10-23T21:15:07Z","updated_at":"2016-07-18T17:45:06Z","pushed_at":"2016-07-18T17:38:42Z","git_url":"git://github.com/apple/swift.git","ssh_url":"git@github.com:apple/swift.git","clone_url":"https://github.com/apple/swift.git","svn_url":"https://github.com/apple/swift","homepage":"https://swift.org/","size":161033,"stargazers_count":32389,"watchers_count":32389,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":4505,"mirror_url":null,"open_issues_count":96,"forks":4505,"open_issues":96,"watchers":32389,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apple/swift/pulls/3528"},"html":{"href":"https://github.com/apple/swift/pull/3528"},"issue":{"href":"https://api.github.com/repos/apple/swift/issues/3528"},"comments":{"href":"https://api.github.com/repos/apple/swift/issues/3528/comments"},"review_comments":{"href":"https://api.github.com/repos/apple/swift/pulls/3528/comments"},"review_comment":{"href":"https://api.github.com/repos/apple/swift/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apple/swift/pulls/3528/commits"},"statuses":{"href":"https://api.github.com/repos/apple/swift/statuses/95eb7a602204017a50d0460ae72685570a60a185"}}}}
{"actor":{"display_login":"DougGregor"}}