From a61f1eb40499fec40c3ef99e879b9a2a25643499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Wed, 23 Feb 2022 22:57:17 +0100 Subject: [PATCH 1/4] Fix bug with switch arrows --- .../pmd/lang/java/ast/ASTSwitchStatement.java | 23 ++++- .../lang/java/ast/ASTSwitchStatementTest.java | 47 +++++++++++ .../xml/SwitchStmtsShouldHaveDefault.xml | 84 ++++++++++++++++++- 3 files changed, 152 insertions(+), 2 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java index 6a019966d9a..7ba203ac7f7 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatement.java @@ -4,7 +4,9 @@ package net.sourceforge.pmd.lang.java.ast; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Set; import org.apache.commons.lang3.EnumUtils; @@ -99,9 +101,28 @@ public boolean isExhaustiveEnumSwitch() { return false; } + /** + * Returns true if this a switch which uses fallthrough branches + * (old school {@code case label: break;}) and not arrow branches. + * If the switch has no branches, returns false. + */ + public boolean isFallthroughSwitch() { + return getFirstChildOfType(ASTSwitchLabel.class) != null + && getNumChildren() != 1; + } @Override public Iterator iterator() { - return new NodeChildrenIterator<>(this, ASTSwitchLabel.class); + List result = new ArrayList<>(findChildrenOfType(ASTSwitchLabel.class)); + for (ASTSwitchLabeledBlock labeled : findChildrenOfType(ASTSwitchLabeledBlock.class)) { + result.add((ASTSwitchLabel) labeled.getChild(0)); + } + for (ASTSwitchLabeledExpression labeled : findChildrenOfType(ASTSwitchLabeledExpression.class)) { + result.add((ASTSwitchLabel) labeled.getChild(0)); + } + for (ASTSwitchLabeledThrowStatement labeled : findChildrenOfType(ASTSwitchLabeledThrowStatement.class)) { + result.add((ASTSwitchLabel) labeled.getChild(0)); + } + return result.iterator(); } } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java index 5915a67c3d4..47cc6c770ec 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/ASTSwitchStatementTest.java @@ -17,5 +17,52 @@ public void exhaustiveEnumSwitchWithDefault() { .get(0); Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); // this should not throw a NPE... Assert.assertTrue(switchStatement.hasDefaultCase()); + Assert.assertTrue(switchStatement.isFallthroughSwitch()); + } + + @Test + public void defaultCaseWithArrowBlock() { + ASTSwitchStatement switchStatement = java.parse( + "class Foo { void bar(int x) {" + + "switch (x) { default -> { } } } }") + .getFirstDescendantOfType(ASTSwitchStatement.class); + Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); + Assert.assertTrue(switchStatement.iterator().hasNext()); + Assert.assertTrue(switchStatement.hasDefaultCase()); + Assert.assertFalse(switchStatement.isFallthroughSwitch()); + } + + @Test + public void emptySwitch() { + ASTSwitchStatement switchStatement = java.parse( + "class Foo { void bar(int x) {" + + "switch (x) { } } }") + .getFirstDescendantOfType(ASTSwitchStatement.class); + Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); + Assert.assertFalse(switchStatement.iterator().hasNext()); + Assert.assertFalse(switchStatement.hasDefaultCase()); + Assert.assertFalse(switchStatement.isFallthroughSwitch()); + } + + @Test + public void defaultCaseWithArrowExprs() { + ASTSwitchStatement switchStatement = + java.parse( + "import net.sourceforge.pmd.lang.java.rule.bestpractices.switchstmtsshouldhavedefault.SimpleEnum;\n" + + "\n" + + " public class Foo {\n" + + " void bar(SimpleEnum x) {\n" + + " switch (x) {\n" + + " case FOO -> System.out.println(\"it is on\");\n" + + " case BAR -> System.out.println(\"it is off\");\n" + + " default -> System.out.println(\"it is neither on nor off - should not happen? maybe null?\");\n" + + " }\n" + + " }\n" + + " }") + .getFirstDescendantOfType(ASTSwitchStatement.class); + Assert.assertFalse(switchStatement.isExhaustiveEnumSwitch()); + Assert.assertTrue(switchStatement.iterator().hasNext()); + Assert.assertFalse(switchStatement.isFallthroughSwitch()); + Assert.assertTrue(switchStatement.hasDefaultCase()); } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml index 0ecf6177f15..a6b767069c6 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/SwitchStmtsShouldHaveDefault.xml @@ -79,6 +79,88 @@ public class Foo { } } } - ]]> + ]]> + + + #3605 switch on enum with default + 0 + + + + #3605 switch on enum with default, nonexhaustive + 0 + + + + #3605 switch on enum with default, nonexhaustive, arrow + 0 + System.out.println("it is on"); + case BAR -> System.out.println("it is off"); + default -> System.out.println("it is neither on nor off - should not happen? maybe null?"); + } + } + } + ]]> + + + #3605 switch on enum with default, exhaustive, arrow + 0 + System.out.println("it is on"); + case BAR -> System.out.println("it is off"); + case BZAZ -> System.out.println("it is bzaz"); + default -> System.out.println("it is neither on nor off - should not happen? maybe null?"); + } + } + } + ]]> From 4aa7b56faba29170b61457d6467068c8bdb7e3ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Thu, 24 Feb 2022 00:02:17 +0100 Subject: [PATCH 2/4] Update reference files --- .../lang/java/ast/AllJavaAstTreeDumpTest.java | 22 +++++++++++++++++++ .../java17p/DealingWithNull.txt | 12 +++++----- .../java17p/EnhancedTypeCheckingSwitch.txt | 2 +- .../GuardedAndParenthesizedPatterns.txt | 2 +- .../ScopeOfPatternVariableDeclarations.txt | 4 ++-- 5 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java new file mode 100644 index 00000000000..0e0207ce48a --- /dev/null +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/ast/AllJavaAstTreeDumpTest.java @@ -0,0 +1,22 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.ast; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + ParserCornersTest.class, + Java15TreeDumpTest.class, + Java16PreviewTreeDumpTest.class, + Java16TreeDumpTest.class, + Java17PreviewTreeDumpTest.class, + Java17TreeDumpTest.class +}) +public class AllJavaAstTreeDumpTest { + +} diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt index fdbf6313502..f7395cff4e0 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/DealingWithNull.txt @@ -15,7 +15,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -82,7 +82,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = true] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -167,7 +167,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -219,7 +219,7 @@ | | +- BreakStatement[] | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -262,7 +262,7 @@ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = ""default case"", @FloatLiteral = false, @Image = ""default case"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = ""default case"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0] | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -289,7 +289,7 @@ | | +- Literal[@CharLiteral = false, @DoubleLiteral = false, @EscapedStringLiteral = ""The rest (including null)"", @FloatLiteral = false, @Image = ""The rest (including null)"", @IntLiteral = false, @LongLiteral = false, @SingleCharacterStringLiteral = false, @StringLiteral = true, @TextBlock = false, @TextBlockContent = ""The rest (including null)"", @ValueAsDouble = NaN, @ValueAsFloat = NaN, @ValueAsInt = 0, @ValueAsLong = 0] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt index 785fc5a8642..d5ea56fdf2b 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/EnhancedTypeCheckingSwitch.txt @@ -15,7 +15,7 @@ | | +- Block[@containsComment = false] | | +- BlockStatement[@Allocation = false] | | +- Statement[] - | | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | | +- Expression[@StandAlonePrimitive = false] | | | +- PrimaryExpression[] | | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt index f42b4508351..028f55ff39b 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/GuardedAndParenthesizedPatterns.txt @@ -15,7 +15,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt index 2d8dd4158ee..1a11900d392 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/ast/jdkversiontests/java17p/ScopeOfPatternVariableDeclarations.txt @@ -15,7 +15,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = true] | +- Statement[] - | +- SwitchStatement[@DefaultCase = false, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = false] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] @@ -113,7 +113,7 @@ | +- Block[@containsComment = false] | +- BlockStatement[@Allocation = false] | +- Statement[] - | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false] + | +- SwitchStatement[@DefaultCase = true, @ExhaustiveEnumSwitch = false, @FallthroughSwitch = true] | +- Expression[@StandAlonePrimitive = false] | | +- PrimaryExpression[] | | +- PrimaryPrefix[@SuperModifier = false, @ThisModifier = false] From 71f4fe7243370d2b36135c746d3076c1aa621bda Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 25 Feb 2022 11:23:44 +0100 Subject: [PATCH 3/4] [doc] Update release notes (#3605 #3805) --- docs/pages/release_notes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index cd982139f4e..0a0fae13195 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -20,6 +20,8 @@ This is a {{ site.pmd.release_type }} release. * [#3427](https://github.com/pmd/pmd/issues/3427): \[core] Stop printing CLI usage text when exiting due to invalid parameters * java * [#3698](https://github.com/pmd/pmd/issues/3697): \[java] Parsing error with try-with-resources and qualified resource +* java-bestpractices + * [#3605](https://github.com/pmd/pmd/issues/3605): \[java] SwitchStmtsShouldHaveDefault triggered when default case is present * java-codestyle * [#278](https://github.com/pmd/pmd/issues/278): \[java] ConfusingTernary should treat `!= null` as positive condition * java-performance From f36945572d0e82fdf8b50d77d65d82cd94c65f3c Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 25 Feb 2022 11:24:24 +0100 Subject: [PATCH 4/4] Add @karel1980 as a contributor --- .all-contributorsrc | 9 ++ docs/pages/pmd/projectdocs/credits.md | 127 +++++++++++++------------- 2 files changed, 74 insertions(+), 62 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 312dff111e7..cc0b196cc11 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6538,6 +6538,15 @@ "contributions": [ "code" ] + }, + { + "login": "karel1980", + "name": "Karel Vervaeke", + "avatar_url": "https://avatars.githubusercontent.com/u/153021?v=4", + "profile": "https://github.com/karel1980", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 1edb5bd02f4..60a6432a08e 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -369,566 +369,569 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
JΓΆrn Huxhorn

πŸ›
KThompso

πŸ›
Kai Amundsen

πŸ› +
Karel Vervaeke

πŸ›
Karl-Andero Mere

πŸ›
Karl-Philipp Richter

πŸ› -
Karsten Silz

πŸ› +
Karsten Silz

πŸ›
Kazuma Watanabe

πŸ›
Kev

πŸ›
Keve MΓΌller

πŸ›
Kevin Guerra

πŸ’»
Kevin Jones

πŸ›
Kevin Wayne

πŸ› -
Kieran Black

πŸ› +
Kieran Black

πŸ›
Kirill Zubov

πŸ›
Kirk Clemens

πŸ’» πŸ›
Klaus Hartl

πŸ›
Koen Van Looveren

πŸ›
Kris Scheibe

πŸ’» πŸ›
Kunal Thanki

πŸ› -
Larry Diamond

πŸ’» πŸ› +
Larry Diamond

πŸ’» πŸ›
Lars Knickrehm

πŸ›
Leo Gutierrez

πŸ›
Lintsi

πŸ›
Linus Fernandes

πŸ›
Lixon Lookose

πŸ›
Logesh

πŸ› -
Lorenzo Gabriele

πŸ› +
Lorenzo Gabriele

πŸ›
LoΓ―c Ledoyen

πŸ›
Lucas Silva

πŸ›
Lucas Soncini

πŸ’» πŸ›
Lukasz Slonina

πŸ›
Lukebray

πŸ›
Lyor Goldstein

πŸ› -
MCMicS

πŸ› +
MCMicS

πŸ›
Macarse

πŸ›
Machine account for PMD

πŸ’»
Maciek Siemczyk

πŸ›
Maikel Steneker

πŸ’» πŸ›
Maksim Moiseikin

πŸ›
Manfred Koch

πŸ› -
Manuel Moya Ferrer

πŸ’» πŸ› +
Manuel Moya Ferrer

πŸ’» πŸ›
Manuel Ryan

πŸ›
Marat Vyshegorodtsev

πŸ›
Marcel HΓ€rle

πŸ›
Marcello Fialho

πŸ›
Marcin Rataj

πŸ›
Mark Adamcin

πŸ› -
Mark Hall

πŸ’» πŸ› +
Mark Hall

πŸ’» πŸ›
Mark Kolich

πŸ›
Mark Pritchard

πŸ›
Markus Rathgeb

πŸ›
Marquis Wang

πŸ›
Martin Feldsztejn

πŸ›
Martin Lehmann

πŸ› -
Martin Spamer

πŸ› +
Martin Spamer

πŸ›
Martin TarjΓ‘nyi

πŸ›
MatFl

πŸ›
Mateusz Stefanski

πŸ›
Mathieu Gouin

πŸ›
MatiasComercio

πŸ’» πŸ›
Matt Benson

πŸ› -
Matt De Poorter

πŸ› +
Matt De Poorter

πŸ›
Matt Harrah

πŸ›
Matt Nelson

πŸ›
Matthew Amos

πŸ›
Matthew Duggan

πŸ›
Matthew Hall

πŸ›
MatΓ­as Fraga

πŸ’» πŸ› -
Maxime Robert

πŸ’» πŸ› +
Maxime Robert

πŸ’» πŸ›
Michael

πŸ›
Michael Bell

πŸ›
Michael Bernstein

πŸ›
Michael Clay

πŸ›
Michael Dombrowski

πŸ›
Michael Hausegger

πŸ› -
Michael Hoefer

πŸ› +
Michael Hoefer

πŸ›
Michael MΓΆbius

πŸ›
Michael N. Lipp

πŸ›
Michael Pellegrini

πŸ›
Michal Kordas

πŸ›
MichaΕ‚ Borek

πŸ›
MichaΕ‚ KuliΕ„ski

πŸ› -
Miguel NΓΊΓ±ez DΓ­az-Montes

πŸ› +
Miguel NΓΊΓ±ez DΓ­az-Montes

πŸ›
Mihai Ionut

πŸ›
Mirek Hankus

πŸ›
Mladjan Gadzic

πŸ›
MrAngry52

πŸ›
Muminur Choudhury

πŸ›
Mykhailo Palahuta

πŸ’» πŸ› -
Nagendra Kumar Singh

πŸ› +
Nagendra Kumar Singh

πŸ›
Nahuel Barrios

πŸ›
Nathan Braun

πŸ›
Nathan Reynolds

πŸ›
Nathan Reynolds

πŸ›
NathanaΓ«l

πŸ›
Nazdravi

πŸ› -
Neha-Dhonde

πŸ› +
Neha-Dhonde

πŸ›
Nicholas Doyle

πŸ›
Nick Butcher

πŸ›
Nico Gallinal

πŸ›
Nicola Dal Maso

πŸ›
Nicolas Filotto

πŸ’»
Nikita Chursin

πŸ› -
Niklas Baudy

πŸ› +
Niklas Baudy

πŸ›
Nikolas Havrikov

πŸ›
Nilesh Virkar

πŸ›
Nimit Patel

πŸ›
Niranjan Harpale

πŸ›
Noah Sussman

πŸ›
Noah0120

πŸ› -
Noam Tamim

πŸ› +
Noam Tamim

πŸ›
Noel Grandin

πŸ›
Olaf Haalstra

πŸ›
Oleg Pavlenko

πŸ›
Oleksii Dykov

πŸ’»
Oliver Eikemeier

πŸ›
Olivier Parent

πŸ’» πŸ› -
Ollie Abbey

πŸ’» πŸ› +
Ollie Abbey

πŸ’» πŸ›
OverDrone

πŸ›
Ozan Gulle

πŸ’» πŸ›
PUNEET JAIN

πŸ›
Parbati Bose

πŸ›
Paul Berg

πŸ›
Pavel Bludov

πŸ› -
Pavel Mička

πŸ› +
Pavel Mička

πŸ›
Pedro Nuno Santos

πŸ›
Pedro Rijo

πŸ›
Pelisse Romain

πŸ’» πŸ“– πŸ›
Pete Davids

πŸ›
Peter Bruin

πŸ›
Peter Chittum

πŸ’» πŸ› -
Peter Cudmore

πŸ› +
Peter Cudmore

πŸ›
Peter Kasson

πŸ›
Peter Kofler

πŸ›
Pham Hai Trung

πŸ›
Philip Graf

πŸ’» πŸ›
Philip Hachey

πŸ›
Philippe Ozil

πŸ› -
Phinehas Artemix

πŸ› +
Phinehas Artemix

πŸ›
Phokham Nonava

πŸ›
Piotr SzymaΕ„ski

πŸ›
Piotrek Ε»ygieΕ‚o

πŸ’» πŸ›
Pranay Jaiswal

πŸ›
Prasad Kamath

πŸ›
Prasanna

πŸ› -
Presh-AR

πŸ› +
Presh-AR

πŸ›
Puneet1726

πŸ›
Rafael CortΓͺs

πŸ›
RaheemShaik999

πŸ›
RajeshR

πŸ’» πŸ›
Ramachandra Mohan

πŸ›
Raquel Pau

πŸ› -
Ravikiran Janardhana

πŸ› +
Ravikiran Janardhana

πŸ›
Reda Benhemmouche

πŸ›
Renato Oliveira

πŸ’» πŸ›
Rich DiCroce

πŸ›
Riot R1cket

πŸ›
Rishabh Jain

πŸ›
RishabhDeep Singh

πŸ› -
Robbie Martinus

πŸ’» πŸ› +
Robbie Martinus

πŸ’» πŸ›
Robert Henry

πŸ›
Robert Painsi

πŸ›
Robert Russell

πŸ›
Robert SΓΆsemann

πŸ’» πŸ“– πŸ“’ πŸ›
Robert Whitebit

πŸ›
Robin Richtsfeld

πŸ› -
Robin Stocker

πŸ’» πŸ› +
Robin Stocker

πŸ’» πŸ›
Robin Wils

πŸ›
RochusOest

πŸ›
Rodolfo Noviski

πŸ›
Rodrigo Casara

πŸ›
Rodrigo Fernandes

πŸ›
Roman Salvador

πŸ’» πŸ› -
Ronald Blaschke

πŸ› +
Ronald Blaschke

πŸ›
RΓ³bert Papp

πŸ›
Saikat Sengupta

πŸ›
Saksham Handu

πŸ›
Saladoc

πŸ›
Salesforce Bob Lightning

πŸ›
Sam Carlberg

πŸ› -
Satoshi Kubo

πŸ› +
Satoshi Kubo

πŸ›
Scott Kennedy

πŸ›
Scott Wells

πŸ› πŸ’»
Sebastian BΓΆgl

πŸ›
Sebastian Schuberth

πŸ›
Sebastian Schwarz

πŸ›
Sergey Gorbaty

πŸ› -
Sergey Kozlov

πŸ› +
Sergey Kozlov

πŸ›
Sergey Yanzin

πŸ’» πŸ›
Shubham

πŸ’» πŸ›
Simon Xiao

πŸ›
Srinivasan Venkatachalam

πŸ›
Stanislav Gromov

πŸ›
Stanislav Myachenkov

πŸ’» -
Stefan Birkner

πŸ› +
Stefan Birkner

πŸ›
Stefan Bohn

πŸ›
Stefan Endrullis

πŸ›
Stefan KlΓΆss-Schuster

πŸ›
Stefan Wolf

πŸ›
Stephan H. Wissel

πŸ›
Stephen

πŸ› -
Stephen Friedrich

πŸ› +
Stephen Friedrich

πŸ›
Steve Babula

πŸ’»
Stexxe

πŸ›
Stian LΓ₯gstad

πŸ›
StuartClayton5

πŸ›
Supun Arunoda

πŸ›
Suren Abrahamyan

πŸ› -
SwatiBGupta1110

πŸ› +
SwatiBGupta1110

πŸ›
SyedThoufich

πŸ›
Szymon Sasin

πŸ›
T-chuangxin

πŸ›
TERAI Atsuhiro

πŸ›
TIOBE Software

πŸ’» πŸ›
Taylor Smock

πŸ› -
Techeira DamiΓ‘n

πŸ’» πŸ› +
Techeira DamiΓ‘n

πŸ’» πŸ›
Ted Husted

πŸ›
TehBakker

πŸ›
The Gitter Badger

πŸ›
Theodoor

πŸ›
Thiago Henrique HΓΌpner

πŸ›
Thibault Meyer

πŸ› -
Thomas GΓΌttler

πŸ› +
Thomas GΓΌttler

πŸ›
Thomas Jones-Low

πŸ›
Thomas Smith

πŸ’» πŸ›
ThrawnCA

πŸ›
Thunderforge

πŸ’» πŸ›
Tim van der Lippe

πŸ›
Tobias Weimer

πŸ’» πŸ› -
Tom Daly

πŸ› +
Tom Daly

πŸ›
Tomer Figenblat

πŸ›
Tomi De Lucca

πŸ’» πŸ›
Torsten Kleiber

πŸ›
TrackerSB

πŸ›
Ullrich Hafner

πŸ›
Utku Cuhadaroglu

πŸ’» πŸ› -
Valentin Brandl

πŸ› +
Valentin Brandl

πŸ›
Valeria

πŸ›
Vasily Anisimov

πŸ›
Vickenty Fesunov

πŸ›
Victor NoΓ«l

πŸ›
Vincent Galloy

πŸ’»
Vincent HUYNH

πŸ› -
Vincent Maurin

πŸ› +
Vincent Maurin

πŸ›
Vincent Privat

πŸ›
Vishhwas

πŸ›
Vitaly

πŸ›
Vitaly Polonetsky

πŸ›
Vojtech Polivka

πŸ›
Vsevolod Zholobov

πŸ› -
Vyom Yadav

πŸ’» +
Vyom Yadav

πŸ’»
Wang Shidong

πŸ›
Waqas Ahmed

πŸ›
Wayne J. Earl

πŸ›
Wchenghui

πŸ›
Will Winder

πŸ›
William Brockhus

πŸ’» πŸ› -
Wilson Kurniawan

πŸ› +
Wilson Kurniawan

πŸ›
Wim Deblauwe

πŸ›
Woongsik Choi

πŸ›
XenoAmess

πŸ’» πŸ›
Yang

πŸ’»
YaroslavTER

πŸ›
Young Chan

πŸ’» πŸ› -
YuJin Kim

πŸ› +
YuJin Kim

πŸ›
Yuri Dolzhenko

πŸ›
Yurii Dubinka

πŸ›
Zoltan Farkas

πŸ›
Zustin

πŸ›
aaronhurst-google

πŸ›
alexmodis

πŸ› -
andreoss

πŸ› +
andreoss

πŸ›
andrey81inmd

πŸ’» πŸ›
anicoara

πŸ›
arunprasathav

πŸ›
asiercamara

πŸ›
astillich-igniti

πŸ’»
avesolovksyy

πŸ› -
avishvat

πŸ› +
avishvat

πŸ›
avivmu

πŸ›
axelbarfod1

πŸ›
b-3-n

πŸ›
balbhadra9

πŸ›
base23de

πŸ›
bergander

πŸ› -
berkam

πŸ’» πŸ› +
berkam

πŸ’» πŸ›
breizh31

πŸ›
caesarkim

πŸ›
carolyujing

πŸ›
cesares-basilico

πŸ›
chrite

πŸ›
cobratbq

πŸ› -
coladict

πŸ› +
coladict

πŸ›
cosmoJFH

πŸ›
cristalp

πŸ›
crunsk

πŸ›
cwholmes

πŸ›
cyberjj999

πŸ›
cyw3

πŸ› -
d1ss0nanz

πŸ› +
d1ss0nanz

πŸ›
danbrycefairsailcom

πŸ›
dariansanity

πŸ›
darrenmiliband

πŸ›
davidburstrom

πŸ›
dbirkman-paloalto

πŸ›
deepak-patra

πŸ› -
dependabot[bot]

πŸ’» πŸ› +
dependabot[bot]

πŸ’» πŸ›
dinesh150

πŸ›
diziaq

πŸ›
dreaminpast123

πŸ›
duanyanan

πŸ›
dutt-sanjay

πŸ›
dylanleung

πŸ› -
dzeigler

πŸ› +
dzeigler

πŸ›
ekkirala

πŸ›
emersonmoura

πŸ›
fairy

πŸ›
foxmason

πŸ›
frankegabor

πŸ›
frankl

πŸ› -
freafrea

πŸ› +
freafrea

πŸ›
fsapatin

πŸ›
gracia19

πŸ›
guo fei

πŸ›
gurmsc5

πŸ›
gwilymatgearset

πŸ’» πŸ›
haigsn

πŸ› -
hemanshu070

πŸ› +
hemanshu070

πŸ›
henrik242

πŸ›
hongpuwu

πŸ›
hvbtup

πŸ’» πŸ›
igniti GmbH

πŸ›
ilovezfs

πŸ›
itaigilo

πŸ› -
jakivey32

πŸ› +
jakivey32

πŸ›
jbennett2091

πŸ›
jcamerin

πŸ›
jkeener1

πŸ›
jmetertea

πŸ›
johnra2

πŸ’»
josemanuelrolon

πŸ’» πŸ› -
kabroxiko

πŸ’» πŸ› +
kabroxiko

πŸ’» πŸ›
karwer

πŸ›
kaulonline

πŸ›
kdaemonv

πŸ›
kenji21

πŸ’» πŸ›
kfranic

πŸ›
khalidkh

πŸ› -
krzyk

πŸ› +
krzyk

πŸ›
lasselindqvist

πŸ›
lihuaib

πŸ›
lonelyma1021

πŸ›
lpeddy

πŸ›
lujiefsi

πŸ’»
lyriccoder

πŸ› -
marcelmore

πŸ› +
marcelmore

πŸ›
matchbox

πŸ›
matthiaskraaz

πŸ›
meandonlyme

πŸ›
mikesive

πŸ›
milossesic

πŸ›
mriddell95

πŸ› -
mrlzh

πŸ› +
mrlzh

πŸ›
msloan

πŸ›
mucharlaravalika

πŸ›
mvenneman

πŸ›
nareshl119

πŸ›
nicolas-harraudeau-sonarsource

πŸ›
noerremark

πŸ› -
novsirion

πŸ› +
novsirion

πŸ›
oggboy

πŸ›
oinume

πŸ›
orimarko

πŸ’» πŸ›
pallavi agarwal

πŸ›
parksungrin

πŸ›
patpatpat123

πŸ› -
patriksevallius

πŸ› +
patriksevallius

πŸ›
pbrajesh1

πŸ›
phoenix384

πŸ›
piotrszymanski-sc

πŸ’»
plan3d

πŸ›
poojasix

πŸ›
prabhushrikant

πŸ› -
pujitha8783

πŸ› +
pujitha8783

πŸ›
r-r-a-j

πŸ›
raghujayjunk

πŸ›
rajeshveera

πŸ›
rajeswarreddy88

πŸ›
recdevs

πŸ›
reudismam

πŸ’» πŸ› -
rijkt

πŸ› +
rijkt

πŸ›
rillig-tk

πŸ›
rmohan20

πŸ’» πŸ›
rxmicro

πŸ›
ryan-gustafson

πŸ’» πŸ›
sabi0

πŸ›
scais

πŸ› -
sebbASF

πŸ› +
sebbASF

πŸ›
sergeygorbaty

πŸ’»
shilko2013

πŸ›
simeonKondr

πŸ›
snajberk

πŸ›
sniperrifle2004

πŸ›
snuyanzin

πŸ› πŸ’» -
sratz

πŸ› +
sratz

πŸ›
stonio

πŸ›
sturton

πŸ’» πŸ›
sudharmohan

πŸ›
suruchidawar

πŸ›
svenfinitiv

πŸ›
tashiscool

πŸ› -
test-git-hook

πŸ› +
test-git-hook

πŸ›
testation21

πŸ’» πŸ›
thanosa

πŸ›
tiandiyixian

πŸ›
tobwoerk

πŸ›
tprouvot

πŸ›
trentchilders

πŸ› -
triandicAnt

πŸ› +
triandicAnt

πŸ›
trishul14

πŸ›
tsui

πŸ›
winhkey

πŸ›
witherspore

πŸ›
wjljack

πŸ›
wuchiuwong

πŸ› -
xingsong

πŸ› +
xingsong

πŸ›
xioayuge

πŸ›
xnYi9wRezm

πŸ’» πŸ›
xuanuy

πŸ›
xyf0921

πŸ›
yalechen-cyw3

πŸ›
yasuharu-sato

πŸ› -
zenglian

πŸ› +
zenglian

πŸ›
zgrzyt93

πŸ’» πŸ›
zh3ng

πŸ›
zt_soft

πŸ›
ztt79

πŸ›
zzzzfeng

πŸ›
ÁrpÑd MagosÑnyi

πŸ› + +
任贡杰

πŸ›