{"action":"created","comment":{"url":"https://api.github.com/repos/SonarSource/slang/pulls/comments/222640189","pull_request_review_id":161574861,"id":222640189,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMjY0MDE4OQ==","diff_hunk":"@@ -0,0 +1,433 @@\n+/*\n+ * SonarSource SLang\n+ * Copyright (C) 2009-2018 SonarSource SA\n+ * mailto:info AT sonarsource DOT com\n+ *\n+ * This program is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU Lesser General Public\n+ * License as published by the Free Software Foundation; either\n+ * version 3 of the License, or (at your option) any later version.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n+ * Lesser General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU Lesser General Public License\n+ * along with this program; if not, write to the Free Software Foundation,\n+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n+ */\n+package org.sonarsource.slang.plugin.converter;\n+\n+import java.util.Arrays;\n+import java.util.Collections;\n+import java.util.Comparator;\n+import java.util.List;\n+import java.util.Optional;\n+import java.util.Set;\n+import java.util.stream.Collectors;\n+import java.util.stream.Stream;\n+import org.assertj.core.api.ListAssert;\n+import org.junit.Rule;\n+import org.junit.Test;\n+import org.junit.rules.ExpectedException;\n+import org.sonar.api.config.Configuration;\n+import org.sonarsource.slang.api.ASTConverter;\n+import org.sonarsource.slang.api.Comment;\n+import org.sonarsource.slang.api.HasTextRange;\n+import org.sonarsource.slang.api.IdentifierTree;\n+import org.sonarsource.slang.api.NativeKind;\n+import org.sonarsource.slang.api.ParseException;\n+import org.sonarsource.slang.api.TextPointer;\n+import org.sonarsource.slang.api.TextRange;\n+import org.sonarsource.slang.api.Token;\n+import org.sonarsource.slang.api.TopLevelTree;\n+import org.sonarsource.slang.api.Tree;\n+import org.sonarsource.slang.api.TreeMetaData;\n+import org.sonarsource.slang.impl.BlockTreeImpl;\n+import org.sonarsource.slang.impl.CommentImpl;\n+import org.sonarsource.slang.impl.IdentifierTreeImpl;\n+import org.sonarsource.slang.impl.NativeTreeImpl;\n+import org.sonarsource.slang.impl.StringLiteralTreeImpl;\n+import org.sonarsource.slang.impl.TextRangeImpl;\n+import org.sonarsource.slang.impl.TokenImpl;\n+import org.sonarsource.slang.impl.TopLevelTreeImpl;\n+import org.sonarsource.slang.plugin.converter.ASTConverterValidation.ValidationMode;\n+\n+import static org.assertj.core.api.Assertions.assertThat;\n+\n+public class ASTConverterValidationTest {\n+\n+  private static final NativeKind NATIVE_KIND = new NativeKind() {\n+  };\n+\n+  @Rule\n+  public ExpectedException expected = ExpectedException.none();\n+\n+  @Test\n+  public void delegate_calls() {\n+    Tree tree = identifier(1, 0, \"code\");\n+    SimpleConverter wrappedConverter = new SimpleConverter(tree);\n+    ASTConverterValidation validationConverter = new ASTConverterValidation(wrappedConverter, ValidationMode.LOG_ERROR);\n+    assertThat(validationConverter.parse(\"code\")).isSameAs(tree);\n+    assertThat(wrappedConverter.isTerminated).isFalse();\n+    validationConverter.terminate();\n+    assertThat(wrappedConverter.isTerminated).isTrue();\n+    assertThat(validationConverter.errors()).isEmpty();\n+\n+    assertThat(validationConverter.parse(\"BOOM\")).isSameAs(tree);\n+    validationConverter.terminate();\n+    assertThat(wrappedConverter.isTerminated).isTrue();\n+    assertThat(validationConverter.errors()).containsExactly(\"Unexpected AST difference:\\n\" +\n+      \"      Actual   : code\\n\" +\n+      \"      Expected : BOOM\\n\" +\n+      \" (line: 1, column: 1)\");\n+  }\n+\n+  @Test\n+  public void wrap() {\n+    SimpleConverter wrappedConverter = new SimpleConverter(null);\n+    String configKey = \"sonar.slang.converter.validation\";\n+    assertThat(ASTConverterValidation.wrap(wrappedConverter, new SimpleConfig(configKey, null))).isSameAs(wrappedConverter);\n+\n+    ASTConverter converter = ASTConverterValidation.wrap(wrappedConverter, new SimpleConfig(configKey, \"throw\"));\n+    assertThat(converter).isInstanceOf(ASTConverterValidation.class);\n+    assertThat(((ASTConverterValidation) converter).mode()).isEqualTo(ValidationMode.THROW_EXCEPTION);\n+\n+    converter = ASTConverterValidation.wrap(wrappedConverter, new SimpleConfig(configKey, \"log\"));\n+    assertThat(converter).isInstanceOf(ASTConverterValidation.class);\n+    assertThat(((ASTConverterValidation) converter).mode()).isEqualTo(ValidationMode.LOG_ERROR);\n+  }\n+\n+  @Test\n+  public void wrap_error() {\n+    expected.expect(IllegalStateException.class);\n+    expected.expectMessage(\"Unsupported mode: BOOM\");\n+\n+    SimpleConverter wrappedConverter = new SimpleConverter(null);\n+    String configKey = \"sonar.slang.converter.validation\";\n+    ASTConverterValidation.wrap(wrappedConverter, new SimpleConfig(configKey, \"BOOM\"));\n+  }\n+\n+  @Test\n+  public void text_range() {\n+    assertValidationErrors(\"    a\", identifier(1, 4, 2, 0, \"a\"))\n+      .isEmpty();\n+\n+    assertValidationErrors(\"a\", identifier(0, 0, 1, 0, \"a\"))\n+      .containsExactly(\"IdentifierTreeImpl invalid range TextRange[0, 0, 1, 0] (line: 0, column: 1)\");\n+\n+    assertValidationErrors(\"a\", identifier(1, -1, 1, 0, \"a\"))\n+      .containsExactly(\"IdentifierTreeImpl invalid range TextRange[1, -1, 1, 0] (line: 1, column: 0)\");\n+\n+    assertValidationErrors(\"    a\", identifier(1, 4, 2, -1, \"a\"))\n+      .containsExactly(\"IdentifierTreeImpl invalid range TextRange[1, 4, 2, -1] (line: 1, column: 5)\");\n+\n+    assertValidationErrors(\"    a\", identifier(1, 4, 1, 4, \"a\"))\n+      .containsExactly(\n+        \"IdentifierTreeImpl contains a token outside its range range: TextRange[1, 4, 1, 4] tokenRange: TextRange[1, 4, 1, 5] token: 'a' (line: 1, column: 5)\",\n+        \"IdentifierTreeImpl invalid range TextRange[1, 4, 1, 4] (line: 1, column: 5)\");\n+\n+    assertValidationErrors(\"a\", identifier(1, 0, 0, 0, \"a\"))\n+      .containsExactly(\n+        \"IdentifierTreeImpl contains a token outside its range range: TextRange[1, 0, 0, 0] tokenRange: TextRange[1, 0, 1, 1] token: 'a' (line: 1, column: 1)\",\n+        \"IdentifierTreeImpl invalid range TextRange[1, 0, 0, 0] (line: 1, column: 1)\");\n+\n+    assertValidationErrors(\"\\n\\na\", identifier(3, 0, 2, 0, \"a\"))\n+      .containsExactly(\n+        \"IdentifierTreeImpl contains a token outside its range range: TextRange[3, 0, 2, 0] tokenRange: TextRange[3, 0, 3, 1] token: 'a' (line: 3, column: 1)\",\n+        \"IdentifierTreeImpl invalid range TextRange[3, 0, 2, 0] (line: 3, column: 1)\");\n+  }\n+\n+  @Test\n+  public void missing_token() {\n+    expected.expect(ParseException.class);\n+    expected.expectMessage(\"IdentifierTreeImpl has no token\");\n+\n+    TextRange range = new TextRangeImpl(1, 0, 1, 1);\n+    assertValidationErrors(\"\", new IdentifierTreeImpl(metaData(range), \"a\"), ValidationMode.THROW_EXCEPTION);\n+  }\n+\n+  @Test\n+  public void top_level_tree_can_have_zero_token() {\n+    TopLevelTree topLevelTree = new TopLevelTreeImpl(\n+      metaData(new TextRangeImpl(1, 0, 1, 0)),\n+      Collections.emptyList(),\n+      Collections.emptyList());\n+    assertValidationErrors(\"\", topLevelTree).isEmpty();\n+  }\n+\n+  @Test\n+  public void tokens_and_comments_match_source_code() {\n+    Token token1 = keyword(1, 0, \"package\");\n+    Token token2 = token(2, 2, \"abc\");\n+    Comment comment1 = comment(1, 8, \"/* comment1 */\");\n+    Comment comment2 = comment(2, 6, \"/* comment2 */\");\n+    Tree tree = new NativeTreeImpl(\n+      metaData(Arrays.asList(token1, token2), Arrays.asList(comment1, comment2)),\n+      NATIVE_KIND,\n+      Collections.emptyList());\n+    String code = \"package /* comment1 */ \\n  abc /* comment2 */\";\n+    assertValidationErrors(code, tree).isEmpty();\n+  }\n+\n+  @Test\n+  public void missing_token_compare_to_source_code() {\n+    Token token = keyword(1, 0, \"package\");\n+    Tree tree = new NativeTreeImpl(\n+      metaData(Collections.singletonList(token), Collections.emptyList()),\n+      NATIVE_KIND,\n+      Collections.emptyList());\n+    String code = \"package /* comment */\";\n+    assertValidationErrors(code, tree)\n+      .containsExactly(\"Unexpected AST difference:\\n\" +\n+        \"      Actual   : package\\n\" +\n+        \"      Expected : package /* comment */\\n\" +\n+        \" (line: 1, column: 1)\");\n+  }\n+\n+  @Test\n+  public void source_code_has_unexpected_lines() {\n+    Token token1 = keyword(1, 0, \"package\");\n+    Tree tree = new NativeTreeImpl(metaData(Collections.singletonList(token1), Collections.emptyList()), NATIVE_KIND, Collections.emptyList());\n+    String code = \"package\\n/* comment */\";\n+    assertValidationErrors(code, tree)\n+      .containsExactly(\"Unexpected AST number of lines actual: 1, expected: 2 (line: 1, column: 1)\");\n+  }\n+\n+  @Test\n+  public void extra_token_not_in_source_code() {\n+    Token token1 = keyword(1, 0, \"package\");\n+    Token token2 = token(2, 2, \"abc\");\n+    Tree tree = new NativeTreeImpl(\n+      metaData(Arrays.asList(token1, token2), Collections.emptyList()),\n+      NATIVE_KIND,\n+      Collections.emptyList());\n+    String code = \"package\";\n+    assertValidationErrors(code, tree)\n+      .containsExactly(\"Unexpected AST number of lines actual: 2, expected: 1 (line: 1, column: 1)\");\n+  }\n+\n+  @Test\n+  public void native_tree_and_literal_accept_any_tokens() {\n+    TreeMetaData metaData = metaData(\n+      keyword(1, 0, \"if\"),\n+      token(1, 3, \"value\"),\n+      token(1, 9, \"==\"),\n+      stringLiteral(1, 12, \"\\\"a\\\"\"));\n+\n+    assertValidationErrors(\"if value == \\\"a\\\"\", new NativeTreeImpl(metaData, NATIVE_KIND, Collections.emptyList()))\n+      .isEmpty();\n+\n+    assertValidationErrors(\"if value == \\\"a\\\"\", new StringLiteralTreeImpl(metaData, \"\\\"a\\\"\"))\n+      .isEmpty();\n+  }\n+\n+  @Test\n+  public void identifier_tree_does_not_accept_keyword_and_string_literal_tokens() {\n+    TreeMetaData metaData = metaData(\n+      keyword(1, 0, \"if\"),\n+      token(1, 3, \"value\"),\n+      token(1, 9, \"==\"),\n+      stringLiteral(1, 12, \"\\\"a\\\"\"));\n+    assertValidationErrors(\"if value == \\\"a\\\"\", new IdentifierTreeImpl(metaData, \"value\"))\n+      .containsExactly(\"Unexpected tokens in IdentifierTreeImpl: 'if', '\\\"a\\\"' (line: 1, column: 1)\");\n+  }\n+\n+  @Test\n+  public void non_identifier_tree_does_not_accept_identifier_tokens() {\n+    TreeMetaData metaData = metaData(\n+      keyword(1, 0, \"if\"),\n+      token(1, 3, \"value\"),\n+      token(1, 9, \"==\"),\n+      stringLiteral(1, 12, \"\\\"a\\\"\"));\n+    assertValidationErrors(\"if value == \\\"a\\\"\", new BlockTreeImpl(metaData, Collections.emptyList()))\n+      .containsExactly(\"Unexpected tokens in BlockTreeImpl: 'value', '\\\"a\\\"' (line: 1, column: 1)\");\n+  }\n+\n+  @Test\n+  public void child_range_or_token_inside_parent_range() {","path":"slang-plugin/src/test/java/org/sonarsource/slang/plugin/converter/ASTConverterValidationTest.java","position":249,"original_position":249,"commit_id":"6d3fcb9aab0fbb305e0dce38e71d2c6129b0e6aa","original_commit_id":"6d3fcb9aab0fbb305e0dce38e71d2c6129b0e6aa","user":{"login":"sonarcloud[bot]","id":39514782,"node_id":"MDM6Qm90Mzk1MTQ3ODI=","avatar_url":"https://avatars2.githubusercontent.com/in/12526?v=4","gravatar_id":"","url":"https://api.github.com/users/sonarcloud%5Bbot%5D","html_url":"https://github.com/apps/sonarcloud","followers_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/followers","following_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/following{/other_user}","gists_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/gists{/gist_id}","starred_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/subscriptions","organizations_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/orgs","repos_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/repos","events_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/events{/privacy}","received_events_url":"https://api.github.com/users/sonarcloud%5Bbot%5D/received_events","type":"Bot","site_admin":false},"body":"![Code Smell](https://sonarsource.github.io/sonar-github/code_smell.png 'Code Smell') Code Smell: Rename this method name to match the regular expression '^[a-z][a-zA-Z0-9]*$'. ([squid:S00100](https://sonarcloud.io/organizations/autoscan/rules#rule_key=squid%3AS00100))\n\n[See it in SonarCloud](https://sonarcloud.io/project/issues?id=autoscan-slang&pullRequest=236&issues=AWY--JSHnzfF1D4Jqv2p&open=AWY--JSHnzfF1D4Jqv2p)\n\n[ISSUE_KEY]: AWY--JSHnzfF1D4Jqv2p","created_at":"2018-10-04T12:06:15Z","updated_at":"2018-10-04T12:06:17Z","html_url":"https://github.com/SonarSource/slang/pull/236#discussion_r222640189","pull_request_url":"https://api.github.com/repos/SonarSource/slang/pulls/236","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/SonarSource/slang/pulls/comments/222640189"},"html":{"href":"https://github.com/SonarSource/slang/pull/236#discussion_r222640189"},"pull_request":{"href":"https://api.github.com/repos/SonarSource/slang/pulls/236"}}},"pull_request":{"url":"https://api.github.com/repos/SonarSource/slang/pulls/236","id":219364122,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE5MzY0MTIy","html_url":"https://github.com/SonarSource/slang/pull/236","diff_url":"https://github.com/SonarSource/slang/pull/236.diff","patch_url":"https://github.com/SonarSource/slang/pull/236.patch","issue_url":"https://api.github.com/repos/SonarSource/slang/issues/236","number":236,"state":"open","locked":false,"title":"SONARSLANG-238 [Scala] Validate Slang AST completeness","user":{"login":"alban-auzeill","id":1235009,"node_id":"MDQ6VXNlcjEyMzUwMDk=","avatar_url":"https://avatars2.githubusercontent.com/u/1235009?v=4","gravatar_id":"","url":"https://api.github.com/users/alban-auzeill","html_url":"https://github.com/alban-auzeill","followers_url":"https://api.github.com/users/alban-auzeill/followers","following_url":"https://api.github.com/users/alban-auzeill/following{/other_user}","gists_url":"https://api.github.com/users/alban-auzeill/gists{/gist_id}","starred_url":"https://api.github.com/users/alban-auzeill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alban-auzeill/subscriptions","organizations_url":"https://api.github.com/users/alban-auzeill/orgs","repos_url":"https://api.github.com/users/alban-auzeill/repos","events_url":"https://api.github.com/users/alban-auzeill/events{/privacy}","received_events_url":"https://api.github.com/users/alban-auzeill/received_events","type":"User","site_admin":false},"body":null,"created_at":"2018-10-01T12:51:31Z","updated_at":"2018-10-04T12:06:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2d6923801319469e10b090a527d3120c87f5b738","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/SonarSource/slang/pulls/236/commits","review_comments_url":"https://api.github.com/repos/SonarSource/slang/pulls/236/comments","review_comment_url":"https://api.github.com/repos/SonarSource/slang/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SonarSource/slang/issues/236/comments","statuses_url":"https://api.github.com/repos/SonarSource/slang/statuses/6d3fcb9aab0fbb305e0dce38e71d2c6129b0e6aa","head":{"label":"SonarSource:SONARSLANG-238","ref":"SONARSLANG-238","sha":"6d3fcb9aab0fbb305e0dce38e71d2c6129b0e6aa","user":{"login":"SonarSource","id":545988,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU0NTk4OA==","avatar_url":"https://avatars0.githubusercontent.com/u/545988?v=4","gravatar_id":"","url":"https://api.github.com/users/SonarSource","html_url":"https://github.com/SonarSource","followers_url":"https://api.github.com/users/SonarSource/followers","following_url":"https://api.github.com/users/SonarSource/following{/other_user}","gists_url":"https://api.github.com/users/SonarSource/gists{/gist_id}","starred_url":"https://api.github.com/users/SonarSource/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SonarSource/subscriptions","organizations_url":"https://api.github.com/users/SonarSource/orgs","repos_url":"https://api.github.com/users/SonarSource/repos","events_url":"https://api.github.com/users/SonarSource/events{/privacy}","received_events_url":"https://api.github.com/users/SonarSource/received_events","type":"Organization","site_admin":false},"repo":{"id":135174794,"node_id":"MDEwOlJlcG9zaXRvcnkxMzUxNzQ3OTQ=","name":"slang","full_name":"SonarSource/slang","private":false,"owner":{"login":"SonarSource","id":545988,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU0NTk4OA==","avatar_url":"https://avatars0.githubusercontent.com/u/545988?v=4","gravatar_id":"","url":"https://api.github.com/users/SonarSource","html_url":"https://github.com/SonarSource","followers_url":"https://api.github.com/users/SonarSource/followers","following_url":"https://api.github.com/users/SonarSource/following{/other_user}","gists_url":"https://api.github.com/users/SonarSource/gists{/gist_id}","starred_url":"https://api.github.com/users/SonarSource/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SonarSource/subscriptions","organizations_url":"https://api.github.com/users/SonarSource/orgs","repos_url":"https://api.github.com/users/SonarSource/repos","events_url":"https://api.github.com/users/SonarSource/events{/privacy}","received_events_url":"https://api.github.com/users/SonarSource/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/SonarSource/slang","description":null,"fork":false,"url":"https://api.github.com/repos/SonarSource/slang","forks_url":"https://api.github.com/repos/SonarSource/slang/forks","keys_url":"https://api.github.com/repos/SonarSource/slang/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SonarSource/slang/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SonarSource/slang/teams","hooks_url":"https://api.github.com/repos/SonarSource/slang/hooks","issue_events_url":"https://api.github.com/repos/SonarSource/slang/issues/events{/number}","events_url":"https://api.github.com/repos/SonarSource/slang/events","assignees_url":"https://api.github.com/repos/SonarSource/slang/assignees{/user}","branches_url":"https://api.github.com/repos/SonarSource/slang/branches{/branch}","tags_url":"https://api.github.com/repos/SonarSource/slang/tags","blobs_url":"https://api.github.com/repos/SonarSource/slang/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SonarSource/slang/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SonarSource/slang/git/refs{/sha}","trees_url":"https://api.github.com/repos/SonarSource/slang/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SonarSource/slang/statuses/{sha}","languages_url":"https://api.github.com/repos/SonarSource/slang/languages","stargazers_url":"https://api.github.com/repos/SonarSource/slang/stargazers","contributors_url":"https://api.github.com/repos/SonarSource/slang/contributors","subscribers_url":"https://api.github.com/repos/SonarSource/slang/subscribers","subscription_url":"https://api.github.com/repos/SonarSource/slang/subscription","commits_url":"https://api.github.com/repos/SonarSource/slang/commits{/sha}","git_commits_url":"https://api.github.com/repos/SonarSource/slang/git/commits{/sha}","comments_url":"https://api.github.com/repos/SonarSource/slang/comments{/number}","issue_comment_url":"https://api.github.com/repos/SonarSource/slang/issues/comments{/number}","contents_url":"https://api.github.com/repos/SonarSource/slang/contents/{+path}","compare_url":"https://api.github.com/repos/SonarSource/slang/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SonarSource/slang/merges","archive_url":"https://api.github.com/repos/SonarSource/slang/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SonarSource/slang/downloads","issues_url":"https://api.github.com/repos/SonarSource/slang/issues{/number}","pulls_url":"https://api.github.com/repos/SonarSource/slang/pulls{/number}","milestones_url":"https://api.github.com/repos/SonarSource/slang/milestones{/number}","notifications_url":"https://api.github.com/repos/SonarSource/slang/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SonarSource/slang/labels{/name}","releases_url":"https://api.github.com/repos/SonarSource/slang/releases{/id}","deployments_url":"https://api.github.com/repos/SonarSource/slang/deployments","created_at":"2018-05-28T14:52:00Z","updated_at":"2018-10-04T12:03:56Z","pushed_at":"2018-10-04T12:05:15Z","git_url":"git://github.com/SonarSource/slang.git","ssh_url":"git@github.com:SonarSource/slang.git","clone_url":"https://github.com/SonarSource/slang.git","svn_url":"https://github.com/SonarSource/slang","homepage":null,"size":2136,"stargazers_count":5,"watchers_count":5,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":6,"license":null,"forks":1,"open_issues":6,"watchers":5,"default_branch":"master"}},"base":{"label":"SonarSource:master","ref":"master","sha":"745ae006d361ca6d1ba78db636e6ec579ee16f3c","user":{"login":"SonarSource","id":545988,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU0NTk4OA==","avatar_url":"https://avatars0.githubusercontent.com/u/545988?v=4","gravatar_id":"","url":"https://api.github.com/users/SonarSource","html_url":"https://github.com/SonarSource","followers_url":"https://api.github.com/users/SonarSource/followers","following_url":"https://api.github.com/users/SonarSource/following{/other_user}","gists_url":"https://api.github.com/users/SonarSource/gists{/gist_id}","starred_url":"https://api.github.com/users/SonarSource/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SonarSource/subscriptions","organizations_url":"https://api.github.com/users/SonarSource/orgs","repos_url":"https://api.github.com/users/SonarSource/repos","events_url":"https://api.github.com/users/SonarSource/events{/privacy}","received_events_url":"https://api.github.com/users/SonarSource/received_events","type":"Organization","site_admin":false},"repo":{"id":135174794,"node_id":"MDEwOlJlcG9zaXRvcnkxMzUxNzQ3OTQ=","name":"slang","full_name":"SonarSource/slang","private":false,"owner":{"login":"SonarSource","id":545988,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU0NTk4OA==","avatar_url":"https://avatars0.githubusercontent.com/u/545988?v=4","gravatar_id":"","url":"https://api.github.com/users/SonarSource","html_url":"https://github.com/SonarSource","followers_url":"https://api.github.com/users/SonarSource/followers","following_url":"https://api.github.com/users/SonarSource/following{/other_user}","gists_url":"https://api.github.com/users/SonarSource/gists{/gist_id}","starred_url":"https://api.github.com/users/SonarSource/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SonarSource/subscriptions","organizations_url":"https://api.github.com/users/SonarSource/orgs","repos_url":"https://api.github.com/users/SonarSource/repos","events_url":"https://api.github.com/users/SonarSource/events{/privacy}","received_events_url":"https://api.github.com/users/SonarSource/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/SonarSource/slang","description":null,"fork":false,"url":"https://api.github.com/repos/SonarSource/slang","forks_url":"https://api.github.com/repos/SonarSource/slang/forks","keys_url":"https://api.github.com/repos/SonarSource/slang/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SonarSource/slang/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SonarSource/slang/teams","hooks_url":"https://api.github.com/repos/SonarSource/slang/hooks","issue_events_url":"https://api.github.com/repos/SonarSource/slang/issues/events{/number}","events_url":"https://api.github.com/repos/SonarSource/slang/events","assignees_url":"https://api.github.com/repos/SonarSource/slang/assignees{/user}","branches_url":"https://api.github.com/repos/SonarSource/slang/branches{/branch}","tags_url":"https://api.github.com/repos/SonarSource/slang/tags","blobs_url":"https://api.github.com/repos/SonarSource/slang/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SonarSource/slang/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SonarSource/slang/git/refs{/sha}","trees_url":"https://api.github.com/repos/SonarSource/slang/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SonarSource/slang/statuses/{sha}","languages_url":"https://api.github.com/repos/SonarSource/slang/languages","stargazers_url":"https://api.github.com/repos/SonarSource/slang/stargazers","contributors_url":"https://api.github.com/repos/SonarSource/slang/contributors","subscribers_url":"https://api.github.com/repos/SonarSource/slang/subscribers","subscription_url":"https://api.github.com/repos/SonarSource/slang/subscription","commits_url":"https://api.github.com/repos/SonarSource/slang/commits{/sha}","git_commits_url":"https://api.github.com/repos/SonarSource/slang/git/commits{/sha}","comments_url":"https://api.github.com/repos/SonarSource/slang/comments{/number}","issue_comment_url":"https://api.github.com/repos/SonarSource/slang/issues/comments{/number}","contents_url":"https://api.github.com/repos/SonarSource/slang/contents/{+path}","compare_url":"https://api.github.com/repos/SonarSource/slang/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SonarSource/slang/merges","archive_url":"https://api.github.com/repos/SonarSource/slang/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SonarSource/slang/downloads","issues_url":"https://api.github.com/repos/SonarSource/slang/issues{/number}","pulls_url":"https://api.github.com/repos/SonarSource/slang/pulls{/number}","milestones_url":"https://api.github.com/repos/SonarSource/slang/milestones{/number}","notifications_url":"https://api.github.com/repos/SonarSource/slang/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SonarSource/slang/labels{/name}","releases_url":"https://api.github.com/repos/SonarSource/slang/releases{/id}","deployments_url":"https://api.github.com/repos/SonarSource/slang/deployments","created_at":"2018-05-28T14:52:00Z","updated_at":"2018-10-04T12:03:56Z","pushed_at":"2018-10-04T12:05:15Z","git_url":"git://github.com/SonarSource/slang.git","ssh_url":"git@github.com:SonarSource/slang.git","clone_url":"https://github.com/SonarSource/slang.git","svn_url":"https://github.com/SonarSource/slang","homepage":null,"size":2136,"stargazers_count":5,"watchers_count":5,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":6,"license":null,"forks":1,"open_issues":6,"watchers":5,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/SonarSource/slang/pulls/236"},"html":{"href":"https://github.com/SonarSource/slang/pull/236"},"issue":{"href":"https://api.github.com/repos/SonarSource/slang/issues/236"},"comments":{"href":"https://api.github.com/repos/SonarSource/slang/issues/236/comments"},"review_comments":{"href":"https://api.github.com/repos/SonarSource/slang/pulls/236/comments"},"review_comment":{"href":"https://api.github.com/repos/SonarSource/slang/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SonarSource/slang/pulls/236/commits"},"statuses":{"href":"https://api.github.com/repos/SonarSource/slang/statuses/6d3fcb9aab0fbb305e0dce38e71d2c6129b0e6aa"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"sonarcloud"}}