{"action":"created","comment":{"url":"https://api.github.com/repos/aspnet/Mvc/pulls/comments/26012343","id":26012343,"diff_hunk":"@@ -58,43 +61,58 @@ public class MvcRazorParser : RazorParser\n             var descriptors = new List<TagHelperDirectiveDescriptor>();\n \n             // For tag helpers, the @removeTagHelper only applies tag helpers that were added prior to it.\n-            // Consequently we must visit tag helpers outside-in - furthest _ViewStart first and nearest one last. This\n+            // Consequently we must visit tag helpers outside-in - furthest _GlobalImport first and nearest one last. This\n             // is different from the behavior of chunk merging where we visit the nearest one first and ignore chunks\n             // that were previously visited.\n-            var chunksFromViewStarts = inheritedCodeTrees.Reverse()\n-                                                         .SelectMany(tree => tree.Chunks);\n-            var chunksInOrder = defaultInheritedChunks.Concat(chunksFromViewStarts);\n+            var chunksFromGlobalImports = inheritedCodeTrees\n+                .Reverse()\n+                .SelectMany(tree => tree.Chunks);\n+            var chunksInOrder = defaultInheritedChunks.Concat(chunksFromGlobalImports);\n             foreach (var chunk in chunksInOrder)\n             {\n-                var addHelperChunk = chunk as AddTagHelperChunk;\n-                if (addHelperChunk != null)\n+                if (chunk is AddTagHelperChunk)\n                 {\n-                    var descriptor = new TagHelperDirectiveDescriptor(addHelperChunk.LookupText,\n-                                                                      SourceLocation.Undefined,\n-                                                                      TagHelperDirectiveType.AddTagHelper);\n+                    var descriptor = CreateInheritedTagHelperDirectiveDescriptor(\n+                        ((AddTagHelperChunk)chunk).LookupText,\n+                        TagHelperDirectiveType.AddTagHelper);\n+\n                     descriptors.Add(descriptor);\n                 }\n-                else\n+                else if (chunk is RemoveTagHelperChunk)\n                 {\n-                    var removeHelperChunk = chunk as RemoveTagHelperChunk;\n-                    if (removeHelperChunk != null)\n-                    {\n-                        var descriptor = new TagHelperDirectiveDescriptor(removeHelperChunk.LookupText,\n-                                                                          SourceLocation.Undefined,\n-                                                                          TagHelperDirectiveType.RemoveTagHelper);\n-                        descriptors.Add(descriptor);\n-                    }\n+                    var descriptor = CreateInheritedTagHelperDirectiveDescriptor(\n+                        ((RemoveTagHelperChunk)chunk).LookupText,\n+                        TagHelperDirectiveType.RemoveTagHelper);\n+\n+                    descriptors.Add(descriptor);\n+                }\n+                else if (chunk is TagHelperPrefixDirectiveChunk)\n+                {\n+                    var descriptor = CreateInheritedTagHelperDirectiveDescriptor(\n+                        ((TagHelperPrefixDirectiveChunk)chunk).Prefix,\n+                        TagHelperDirectiveType.TagHelperPrefix);\n+\n+                    descriptors.Add(descriptor);\n                 }\n             }\n \n             return descriptors;\n         }\n \n-        private class GlobalImportAddRemoveTagHelperVisitor : TagHelperDirectiveSpanVisitor\n+        private static TagHelperDirectiveDescriptor CreateInheritedTagHelperDirectiveDescriptor(\n+            string directiveText,\n+            TagHelperDirectiveType directiveType)\n+        {\n+            // Inherited directive descriptors have undefined source locations because the source that created them\n+            // is not in the same file.\n+            return new TagHelperDirectiveDescriptor(directiveText, SourceLocation.Undefined, directiveType);\n+        }","path":"src/Microsoft.AspNet.Mvc.Razor.Host/MvcRazorParser.cs","position":112,"original_position":112,"commit_id":"da9d301dfd89520e66c920a6064c9d695d0d39d5","original_commit_id":"da9d301dfd89520e66c920a6064c9d695d0d39d5","user":{"login":"dougbu","id":6431421,"avatar_url":"https://avatars.githubusercontent.com/u/6431421?v=3","gravatar_id":"","url":"https://api.github.com/users/dougbu","html_url":"https://github.com/dougbu","followers_url":"https://api.github.com/users/dougbu/followers","following_url":"https://api.github.com/users/dougbu/following{/other_user}","gists_url":"https://api.github.com/users/dougbu/gists{/gist_id}","starred_url":"https://api.github.com/users/dougbu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dougbu/subscriptions","organizations_url":"https://api.github.com/users/dougbu/orgs","repos_url":"https://api.github.com/users/dougbu/repos","events_url":"https://api.github.com/users/dougbu/events{/privacy}","received_events_url":"https://api.github.com/users/dougbu/received_events","type":"User","site_admin":false},"body":"nit: this one-line method doesn't aid reader much and could be inlined as it was before","created_at":"2015-03-09T01:51:30Z","updated_at":"2015-03-09T01:51:30Z","html_url":"https://github.com/aspnet/Mvc/pull/2117#discussion_r26012343","pull_request_url":"https://api.github.com/repos/aspnet/Mvc/pulls/2117","_links":{"self":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/comments/26012343"},"html":{"href":"https://github.com/aspnet/Mvc/pull/2117#discussion_r26012343"},"pull_request":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/2117"}}},"pull_request":{"url":"https://api.github.com/repos/aspnet/Mvc/pulls/2117","id":30439893,"html_url":"https://github.com/aspnet/Mvc/pull/2117","diff_url":"https://github.com/aspnet/Mvc/pull/2117.diff","patch_url":"https://github.com/aspnet/Mvc/pull/2117.patch","issue_url":"https://api.github.com/repos/aspnet/Mvc/issues/2117","number":2117,"state":"open","locked":false,"title":"Add @tagHelperPrefix inheritance support.","user":{"login":"NTaylorMullen","id":2008729,"avatar_url":"https://avatars.githubusercontent.com/u/2008729?v=3","gravatar_id":"","url":"https://api.github.com/users/NTaylorMullen","html_url":"https://github.com/NTaylorMullen","followers_url":"https://api.github.com/users/NTaylorMullen/followers","following_url":"https://api.github.com/users/NTaylorMullen/following{/other_user}","gists_url":"https://api.github.com/users/NTaylorMullen/gists{/gist_id}","starred_url":"https://api.github.com/users/NTaylorMullen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NTaylorMullen/subscriptions","organizations_url":"https://api.github.com/users/NTaylorMullen/orgs","repos_url":"https://api.github.com/users/NTaylorMullen/repos","events_url":"https://api.github.com/users/NTaylorMullen/events{/privacy}","received_events_url":"https://api.github.com/users/NTaylorMullen/received_events","type":"User","site_admin":false},"body":"- Updated some naming bits that were outdated (referring to ViewStart).\r\n- Added a TagHelperDirective merging mechanic to ensure user file descriptors and inherited descriptors come together correctly.\r\n- Updated MvcRazorParserTests to test more cases of the parser, especially with @tagHelperPrefix.\r\n- Add tests to validate @tagHelperPrefix inheritance. \r\n\r\n\r\n#2110","created_at":"2015-03-04T05:43:23Z","updated_at":"2015-03-09T01:51:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f99ebd82a5c7127d7a1ddf4b5b3e138dadac5590","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/aspnet/Mvc/pulls/2117/commits","review_comments_url":"https://api.github.com/repos/aspnet/Mvc/pulls/2117/comments","review_comment_url":"https://api.github.com/repos/aspnet/Mvc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/aspnet/Mvc/issues/2117/comments","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/da9d301dfd89520e66c920a6064c9d695d0d39d5","head":{"label":"aspnet:thprefix.inherit.2110","ref":"thprefix.inherit.2110","sha":"da9d301dfd89520e66c920a6064c9d695d0d39d5","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":15126429,"name":"Mvc","full_name":"aspnet/Mvc","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Mvc","description":"Model view controller framework for building dynamic web sites with clean separation of concerns, including the merged MVC, Web API, and Web Pages w/ Razor.","fork":false,"url":"https://api.github.com/repos/aspnet/Mvc","forks_url":"https://api.github.com/repos/aspnet/Mvc/forks","keys_url":"https://api.github.com/repos/aspnet/Mvc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Mvc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Mvc/teams","hooks_url":"https://api.github.com/repos/aspnet/Mvc/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Mvc/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Mvc/events","assignees_url":"https://api.github.com/repos/aspnet/Mvc/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Mvc/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Mvc/tags","blobs_url":"https://api.github.com/repos/aspnet/Mvc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Mvc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Mvc/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Mvc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Mvc/languages","stargazers_url":"https://api.github.com/repos/aspnet/Mvc/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Mvc/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Mvc/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Mvc/subscription","commits_url":"https://api.github.com/repos/aspnet/Mvc/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Mvc/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Mvc/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Mvc/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Mvc/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Mvc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Mvc/merges","archive_url":"https://api.github.com/repos/aspnet/Mvc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Mvc/downloads","issues_url":"https://api.github.com/repos/aspnet/Mvc/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Mvc/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Mvc/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Mvc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Mvc/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Mvc/releases{/id}","created_at":"2013-12-12T03:54:00Z","updated_at":"2015-03-08T11:20:42Z","pushed_at":"2015-03-08T19:52:50Z","git_url":"git://github.com/aspnet/Mvc.git","ssh_url":"git@github.com:aspnet/Mvc.git","clone_url":"https://github.com/aspnet/Mvc.git","svn_url":"https://github.com/aspnet/Mvc","homepage":"","size":87387,"stargazers_count":1462,"watchers_count":1462,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":443,"mirror_url":null,"open_issues_count":233,"forks":443,"open_issues":233,"watchers":1462,"default_branch":"dev"}},"base":{"label":"aspnet:dev","ref":"dev","sha":"81c3b75980e9e232369e6f18aecdaa478685c39f","user":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":15126429,"name":"Mvc","full_name":"aspnet/Mvc","owner":{"login":"aspnet","id":6476660,"avatar_url":"https://avatars.githubusercontent.com/u/6476660?v=3","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Mvc","description":"Model view controller framework for building dynamic web sites with clean separation of concerns, including the merged MVC, Web API, and Web Pages w/ Razor.","fork":false,"url":"https://api.github.com/repos/aspnet/Mvc","forks_url":"https://api.github.com/repos/aspnet/Mvc/forks","keys_url":"https://api.github.com/repos/aspnet/Mvc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Mvc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Mvc/teams","hooks_url":"https://api.github.com/repos/aspnet/Mvc/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Mvc/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Mvc/events","assignees_url":"https://api.github.com/repos/aspnet/Mvc/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Mvc/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Mvc/tags","blobs_url":"https://api.github.com/repos/aspnet/Mvc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Mvc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Mvc/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Mvc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Mvc/languages","stargazers_url":"https://api.github.com/repos/aspnet/Mvc/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Mvc/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Mvc/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Mvc/subscription","commits_url":"https://api.github.com/repos/aspnet/Mvc/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Mvc/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Mvc/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Mvc/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Mvc/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Mvc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Mvc/merges","archive_url":"https://api.github.com/repos/aspnet/Mvc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Mvc/downloads","issues_url":"https://api.github.com/repos/aspnet/Mvc/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Mvc/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Mvc/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Mvc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Mvc/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Mvc/releases{/id}","created_at":"2013-12-12T03:54:00Z","updated_at":"2015-03-08T11:20:42Z","pushed_at":"2015-03-08T19:52:50Z","git_url":"git://github.com/aspnet/Mvc.git","ssh_url":"git@github.com:aspnet/Mvc.git","clone_url":"https://github.com/aspnet/Mvc.git","svn_url":"https://github.com/aspnet/Mvc","homepage":"","size":87387,"stargazers_count":1462,"watchers_count":1462,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":443,"mirror_url":null,"open_issues_count":233,"forks":443,"open_issues":233,"watchers":1462,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/2117"},"html":{"href":"https://github.com/aspnet/Mvc/pull/2117"},"issue":{"href":"https://api.github.com/repos/aspnet/Mvc/issues/2117"},"comments":{"href":"https://api.github.com/repos/aspnet/Mvc/issues/2117/comments"},"review_comments":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/2117/comments"},"review_comment":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/2117/commits"},"statuses":{"href":"https://api.github.com/repos/aspnet/Mvc/statuses/da9d301dfd89520e66c920a6064c9d695d0d39d5"}}}}