From 61b1c372cd9e633c0a7ba86f39ab6e8fa2df95db Mon Sep 17 00:00:00 2001 From: Willem Hajenius Date: Mon, 21 Oct 2024 23:45:20 +0200 Subject: [PATCH 01/11] [apex] Must use case-insensitive input stream to avoid choking on Unicode escape sequences --- .../pmd/lang/apex/ast/ApexCommentBuilder.java | 4 ++- .../pmd/lang/apex/ast/ApexLexerTest.java | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java index a135ca4603..48d41f0faa 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java @@ -22,6 +22,7 @@ import net.sourceforge.pmd.lang.document.TextDocument; import net.sourceforge.pmd.lang.document.TextRegion; import io.github.apexdevtools.apexparser.ApexLexer; +import io.github.apexdevtools.apexparser.CaseInsensitiveInputStream; @InternalApi final class ApexCommentBuilder { @@ -103,7 +104,8 @@ final class ApexCommentBuilder { } private static CommentInformation extractInformationFromComments(TextDocument sourceCode, String suppressMarker) { - ApexLexer lexer = new ApexLexer(CharStreams.fromString(sourceCode.getText().toString())); + String source = sourceCode.getText().toString(); + ApexLexer lexer = new ApexLexer(new CaseInsensitiveInputStream(CharStreams.fromString(source))); List allCommentTokens = new ArrayList<>(); Map suppressMap = new HashMap<>(); diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java index 67c6706f29..b075160370 100644 --- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java +++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java @@ -8,14 +8,18 @@ package net.sourceforge.pmd.lang.apex.ast; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.Token; import org.junit.jupiter.api.Test; import io.github.apexdevtools.apexparser.ApexLexer; import io.github.apexdevtools.apexparser.ApexParser; +import io.github.apexdevtools.apexparser.CaseInsensitiveInputStream; /** * This is an exploration test for {@link ApexLexer}. @@ -49,4 +53,35 @@ class ApexLexerTest { ApexParser.CompilationUnitContext compilationUnit = parser.compilationUnit(); assertNotNull(compilationUnit); } + + @Test + void testLexerUnicodeEscapes() { + String s = "'Fran\\u00E7ois'"; + assertEquals(2, getLexingErrors(CharStreams.fromString(s))); + assertEquals(0, getLexingErrors(new CaseInsensitiveInputStream(CharStreams.fromString(s)))); + } + + private int getLexingErrors(CharStream stream) { + ApexLexer lexer = new ApexLexer(stream); + ErrorListener errorListener = new ErrorListener(); + lexer.removeErrorListeners(); // Avoid distracting "token recognition error" stderr output + lexer.addErrorListener(errorListener); + CommonTokenStream tokens = new CommonTokenStream(lexer); + tokens.fill(); + return errorListener.getErrorCount(); + } + + static class ErrorListener extends BaseErrorListener { + private int errorCount = 0; + + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, + int charPositionInLine, String msg, RecognitionException e) { + ++errorCount; + } + + public int getErrorCount() { + return errorCount; + } + } } From a79d3e6557381cdad139d1ab2ee5d7921f78a081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Thu, 14 Nov 2024 16:13:30 +0100 Subject: [PATCH 02/11] Add unit tests --- .../java/internal/JavaLanguageProperties.java | 2 +- .../internal/infer/InferenceContext.java | 1 + .../internal/infer/TypeInferenceLogger.java | 10 +- .../internal/infer/InferenceCtxUnitTests.java | 93 +++++++++++++++++++ 4 files changed, 103 insertions(+), 3 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java index 7fafea029e..7590d48f6f 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java @@ -22,7 +22,7 @@ public class JavaLanguageProperties extends JvmLanguagePropertyBundle { PropertyFactory.enumProperty("xTypeInferenceLogging", EnumUtils.getEnumMap(InferenceLoggingVerbosity.class)) .desc("Verbosity of the type inference logging") - .defaultValue(InferenceLoggingVerbosity.DISABLED) + .defaultValue(InferenceLoggingVerbosity.VERBOSE) .build(); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceContext.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceContext.java index 73b843439f..8cc251fa0e 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceContext.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceContext.java @@ -525,6 +525,7 @@ final class InferenceContext { * we try again to make progress. */ private boolean solve(VarWalkStrategy walker) { + graphWasChanged = false; incorporate(); while (walker.hasNext()) { diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/TypeInferenceLogger.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/TypeInferenceLogger.java index 2c9cfff9ef..cb7fe3e6d3 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/TypeInferenceLogger.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/TypeInferenceLogger.java @@ -22,6 +22,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import net.sourceforge.pmd.lang.java.ast.JavaNode; +import net.sourceforge.pmd.lang.java.internal.JavaLanguageProperties; import net.sourceforge.pmd.lang.java.symbols.JTypeDeclSymbol; import net.sourceforge.pmd.lang.java.types.JMethodSig; import net.sourceforge.pmd.lang.java.types.JTypeMirror; @@ -34,6 +35,12 @@ import net.sourceforge.pmd.util.StringUtil; /** * A strategy to log the execution traces of {@link Infer}. + * The default does nothing, so the logger calls can be optimized out + * at runtime, while not having to check that logging is enabled at the + * call sites. + * + *

To enable logging for the CLI, use the language property ({@link JavaLanguageProperties}) + * {@code xTypeInferenceLogging}. From tests, see {@code JavaParsingHelper#logTypeInferenceVerbose()}. */ @SuppressWarnings("PMD.UncommentedEmptyMethodBody") public interface TypeInferenceLogger { @@ -64,8 +71,7 @@ public interface TypeInferenceLogger { default void applicabilityTest(InferenceContext ctx) { } - default void finishApplicabilityTest() { - } + default void finishApplicabilityTest() { } default void startArgsChecks() { } diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceCtxUnitTests.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceCtxUnitTests.java index 5e33c6dd01..ba1d834261 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceCtxUnitTests.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/internal/infer/InferenceCtxUnitTests.java @@ -8,7 +8,10 @@ import static net.sourceforge.pmd.lang.java.types.TestUtilitiesForTypesKt.captur import static net.sourceforge.pmd.lang.java.types.internal.infer.BaseTypeInferenceUnitTest.Bound.eqBound; import static net.sourceforge.pmd.lang.java.types.internal.infer.BaseTypeInferenceUnitTest.Bound.lower; import static net.sourceforge.pmd.lang.java.types.internal.infer.BaseTypeInferenceUnitTest.Bound.upper; +import static net.sourceforge.pmd.util.CollectionUtil.setOf; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -19,11 +22,17 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import java.util.List; +import java.util.Set; + +import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; import net.sourceforge.pmd.lang.java.types.JTypeMirror; import net.sourceforge.pmd.lang.java.types.TypeOps; import net.sourceforge.pmd.lang.java.types.internal.infer.InferenceVar.BoundKind; +import net.sourceforge.pmd.lang.java.types.internal.infer.VarWalkStrategy.GraphWalk; +import net.sourceforge.pmd.util.IteratorUtil; /** * @@ -331,4 +340,88 @@ class InferenceCtxUnitTests extends BaseTypeInferenceUnitTest { assertThat(a, hasBoundsExactly(upper(ts.BOOLEAN.box()))); } + + private static @NotNull List> createBatchSetsFromGraph(InferenceContext ctx) { + GraphWalk graphWalk = new GraphWalk(ctx, false); + List> batches = IteratorUtil.toList(graphWalk); + return batches; + } + + @Test + void testGraphBuilding() { + InferenceContext ctx = emptyCtx(); + InferenceVar a = newIvar(ctx); + InferenceVar b = newIvar(ctx); + + List> batches = createBatchSetsFromGraph(ctx); + // no dependency: unordered + assertThat(batches, containsInAnyOrder(setOf(a), setOf(b))); + } + + @Test + void testGraphBuildingWithDependency() { + InferenceContext ctx = emptyCtx(); + InferenceVar a = newIvar(ctx); + InferenceVar b = newIvar(ctx); + + // a -> b + addSubtypeConstraint(ctx, a, ts.arrayType(b)); + + List> batches = createBatchSetsFromGraph(ctx); + + assertThat(batches, contains(setOf(b), setOf(a))); + } + + @Test + void testGraphBuildingWithDependency2() { + InferenceContext ctx = emptyCtx(); + InferenceVar a = newIvar(ctx); + InferenceVar b = newIvar(ctx); + + // a -> b + // b -> a (because of propagation) + addSubtypeConstraint(ctx, a, b); + + List> batches = createBatchSetsFromGraph(ctx); + + assertThat(batches, contains(setOf(b, a))); + } + + + + + @Test + void testGraphBuildingWithExtraDependency() { + InferenceContext ctx = emptyCtx(); + InferenceVar a = newIvar(ctx); + InferenceVar b = newIvar(ctx); + + // b -> a + ctx.addInstantiationDependencies(setOf(b), setOf(a)); + + List> batches = createBatchSetsFromGraph(ctx); + + assertThat(batches, contains(setOf(a), setOf(b))); + } + + @Test + void testGraphBuildingWithDependencyCycle() { + InferenceContext ctx = emptyCtx(); + InferenceVar a = newIvar(ctx); + InferenceVar b = newIvar(ctx); + InferenceVar c = newIvar(ctx); + + // a -> b, b -> a, + // a -> c, b -> c + a.addBound(BoundKind.UPPER, b); + a.addBound(BoundKind.EQ, listType(c)); + b.addBound(BoundKind.LOWER, a); + b.addBound(BoundKind.LOWER, listType(c)); + + + List> batches = createBatchSetsFromGraph(ctx); + + assertThat(batches, contains(setOf(c), setOf(b, a))); + } + } From 2df68ed16888ce9945dfc960d5b51c2547d4c833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Thu, 14 Nov 2024 16:32:09 +0100 Subject: [PATCH 03/11] Disable type inf logging by default --- .../pmd/lang/java/internal/JavaLanguageProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java index 7590d48f6f..7fafea029e 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/internal/JavaLanguageProperties.java @@ -22,7 +22,7 @@ public class JavaLanguageProperties extends JvmLanguagePropertyBundle { PropertyFactory.enumProperty("xTypeInferenceLogging", EnumUtils.getEnumMap(InferenceLoggingVerbosity.class)) .desc("Verbosity of the type inference logging") - .defaultValue(InferenceLoggingVerbosity.VERBOSE) + .defaultValue(InferenceLoggingVerbosity.DISABLED) .build(); From bf388d7fd059aec33d38f6b2088470c04ea1aea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Thu, 14 Nov 2024 17:27:45 +0100 Subject: [PATCH 04/11] Propagate unknown type better when mref is unresolved --- .../types/internal/infer/ExprCheckHelper.java | 7 ++ .../java/types/internal/infer/ExprOps.java | 1 - .../lang/java/types/TypesTreeDumpTest.java | 5 ++ .../pmd/lang/java/types/AstTestUtil.kt | 1 + .../infer/UnresolvedTypesRecoveryTest.kt | 38 +++++++++ .../bestpractices/xml/UnusedPrivateMethod.xml | 41 ++++++++++ .../types/dumptests/UnresolvedThings.java | 16 ++++ .../java/types/dumptests/UnresolvedThings.txt | 80 +++++++++++++++++++ 8 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.java create mode 100644 pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.txt diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprCheckHelper.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprCheckHelper.java index dc8955fcb0..f6521426e2 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprCheckHelper.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprCheckHelper.java @@ -335,6 +335,13 @@ final class ExprCheckHelper { checker.checkExprConstraint(infCtx, capture(r2), r); } completeMethodRefInference(mref, nonWildcard, fun, exactMethod, true); + } else if (TypeOps.isUnresolved(mref.getTypeToSearch())) { + // Then this is neither an exact nor inexact method ref, + // we just don't know what it is. + + // The return values of the mref are assimilated to an (*unknown*) type. + checker.checkExprConstraint(infCtx, ts.UNKNOWN, fun.getReturnType()); + completeMethodRefInference(mref, nonWildcard, fun, ts.UNRESOLVED_METHOD, false); } else { // Otherwise, the method reference is inexact, and: diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprOps.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprOps.java index 8ea1cee3da..a04c91c55f 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprOps.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/internal/infer/ExprOps.java @@ -227,7 +227,6 @@ final class ExprOps { } } else { JClassType enclosing = mref.getEnclosingType(); - accessible = mref.getTypeToSearch() .streamMethods(TypeOps.accessibleMethodFilter(mref.getMethodName(), enclosing.getSymbol())) .collect(OverloadSet.collectMostSpecific(enclosing)); diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/TypesTreeDumpTest.java b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/TypesTreeDumpTest.java index 9b8baaeca6..50d22c663d 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/TypesTreeDumpTest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/TypesTreeDumpTest.java @@ -55,6 +55,11 @@ class TypesTreeDumpTest extends BaseTreeDumpTest { doTest("NestedLambdasAndMethodCalls"); } + @Test + void testUnresolvedThings() { + doTest("UnresolvedThings"); + } + @Override protected @NonNull String normalize(@NonNull String str) { return super.normalize(str) diff --git a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/AstTestUtil.kt b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/AstTestUtil.kt index 1545c93f7e..e5c04d1ac5 100644 --- a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/AstTestUtil.kt +++ b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/AstTestUtil.kt @@ -21,6 +21,7 @@ fun JavaNode.declaredMethodSignatures(): List = methodDeclarations() fun JavaNode.methodCalls(): DescendantNodeStream = descendants(ASTMethodCall::class.java) fun JavaNode.firstMethodCall() = methodCalls().crossFindBoundaries().firstOrThrow() +fun JavaNode.firstMethodCall(name: String) = methodCalls().crossFindBoundaries().filter { it.methodName == name }.firstOrThrow() fun JavaNode.ctorCalls(): DescendantNodeStream = descendants(ASTConstructorCall::class.java) fun JavaNode.firstCtorCall() = ctorCalls().crossFindBoundaries().firstOrThrow() diff --git a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/internal/infer/UnresolvedTypesRecoveryTest.kt b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/internal/infer/UnresolvedTypesRecoveryTest.kt index 24d7ec3c04..45c13cf569 100644 --- a/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/internal/infer/UnresolvedTypesRecoveryTest.kt +++ b/pmd-java/src/test/kotlin/net/sourceforge/pmd/lang/java/types/internal/infer/UnresolvedTypesRecoveryTest.kt @@ -664,4 +664,42 @@ class C { fooToInt.referencedMethod.symbol shouldBe toIntFun } } + + parserTest("Type inference should not resolve UNKNOWN bounded types to Object #5329") { + + val (acu, _) = parser.parseWithTypeInferenceSpy( + """ + import java.util.ArrayList; + import java.util.List; + import java.util.stream.Stream; + import java.util.stream.Collectors; + + class Foo { + public Item methodA(List loads) { + List items = new ArrayList<>(); + loads.stream() + // Here this collect call should have type + // Map<(*unknown*), List<*Item>> + // ie, key is unknown, not Object. + .collect(Collectors.groupingBy(Item::getValue)) + .forEach((a, b) -> items.add(buildItem(a, b))); + } + + private SummaryDto.ItemDto buildItem(BigDecimal a, List b) { + return SummaryDto.ItemDto.builder().build(); + } + } + """ + ) + + val collect = acu.firstMethodCall("collect") + val buildItem = acu.firstMethodCall("buildItem") + val (_, buildItemDecl) = acu.methodDeclarations().toList { it.symbol } + val (itemT) = acu.descendants(ASTClassType::class.java).toList { it.typeMirror } + + acu.withTypeDsl { + collect shouldHaveType java.util.Map::class[ts.UNKNOWN, java.util.List::class[itemT]] + buildItem.methodType.symbol shouldBe buildItemDecl + } + } }) diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateMethod.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateMethod.xml index 2a743036a6..1a6dd1488d 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateMethod.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateMethod.xml @@ -2177,4 +2177,45 @@ public class ObtainViaTest { record Library(Collection books) {} ]]> + + #5324 UnusedPrivateMethod with unresolved types + 0 + { + try { + return registerUser(email, firstName, lastName); + } catch (Exception e) { + throw new IllegalStateException("Failed to register user for " + email, e); + } + }); + // ... + return user; + } + + private User registerUser(String email, String firstName, String lastName) throws Exception { + // register user logic here... + } + } + ]]> + + + #5329 UnusedPrivateMethod with unresolved types + 0 + items = new ArrayList<>(); + loads.stream() + .collect(Collectors.groupingBy(Item::getValue)) + .forEach((a, b) -> items.add(buildItem(a, b))); + } + + private SummaryDto.ItemDto buildItem(BigDecimal a, List b) { + return SummaryDto.ItemDto.builder().build(); + } + } + ]]> + diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.java b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.java new file mode 100644 index 0000000000..83eb9d62b4 --- /dev/null +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.java @@ -0,0 +1,16 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; +import java.util.stream.Collectors; +class Foo { + public User methodA(List loads) { + List items = new ArrayList<>(); + loads.stream() + .collect(Collectors.groupingBy(Item::getValue)) + .forEach((a, b) -> items.add(buildItem(a, b))); + } + + private SummaryDto.ItemDto buildItem(BigDecimal a, List b) { + return SummaryDto.ItemDto.builder().build(); + } +} \ No newline at end of file diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.txt b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.txt new file mode 100644 index 0000000000..32f1f2643e --- /dev/null +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/types/dumptests/UnresolvedThings.txt @@ -0,0 +1,80 @@ ++- CompilationUnit[] + +- ImportDeclaration[] + +- ImportDeclaration[] + +- ImportDeclaration[] + +- ImportDeclaration[] + +- ClassDeclaration[@TypeMirror = "Foo"] + +- ModifierList[] + +- ClassBody[] + +- MethodDeclaration[@Name = "methodA"] + | +- ModifierList[] + | +- ClassType[@TypeMirror = "*User"] + | +- FormalParameters[] + | | +- FormalParameter[@TypeMirror = "java.util.List<*Item>"] + | | +- ModifierList[] + | | +- ClassType[@TypeMirror = "java.util.List<*Item>"] + | | | +- TypeArguments[] + | | | +- ClassType[@TypeMirror = "*Item"] + | | +- VariableId[@Name = "loads", @TypeMirror = "java.util.List<*Item>"] + | +- Block[] + | +- LocalVariableDeclaration[] + | | +- ModifierList[] + | | +- ClassType[@TypeMirror = "java.util.List<*SummaryDto.ItemDto>"] + | | | +- TypeArguments[] + | | | +- ClassType[@TypeMirror = "*SummaryDto.ItemDto"] + | | +- VariableDeclarator[] + | | +- VariableId[@Name = "items", @TypeMirror = "java.util.List<*SummaryDto.ItemDto>"] + | | +- ConstructorCall[@Failed = false, @Function = "java.util.ArrayList<*SummaryDto.ItemDto>.new() -> java.util.ArrayList<*SummaryDto.ItemDto>", @MethodName = "new", @TypeMirror = "java.util.ArrayList<*SummaryDto.ItemDto>", @Unchecked = false, @VarargsCall = false] + | | +- ClassType[@TypeMirror = "java.util.ArrayList"] + | | | +- TypeArguments[] + | | +- ArgumentList[] + | +- ExpressionStatement[] + | +- MethodCall[@Failed = false, @Function = "java.util.Map<(*unknown*), java.util.List<*Item>>.forEach(java.util.function.BiConsumer>) -> void", @MethodName = "forEach", @TypeMirror = "void", @Unchecked = false, @VarargsCall = false] + | +- MethodCall[@Failed = false, @Function = "java.util.stream.Stream<*Item>. collect(java.util.stream.Collector>>) -> java.util.Map<(*unknown*), java.util.List<*Item>>", @MethodName = "collect", @TypeMirror = "java.util.Map<(*unknown*), java.util.List<*Item>>", @Unchecked = false, @VarargsCall = false] + | | +- MethodCall[@Failed = false, @Function = "java.util.Collection<*Item>.stream() -> java.util.stream.Stream<*Item>", @MethodName = "stream", @TypeMirror = "java.util.stream.Stream<*Item>", @Unchecked = false, @VarargsCall = false] + | | | +- VariableAccess[@Name = "loads", @TypeMirror = "java.util.List<*Item>"] + | | | +- ArgumentList[] + | | +- ArgumentList[] + | | +- MethodCall[@Failed = false, @Function = "java.util.stream.Collectors. groupingBy(java.util.function.Function) -> java.util.stream.Collector<*Item, java.lang.Object, java.util.Map<(*unknown*), java.util.List<*Item>>>", @MethodName = "groupingBy", @TypeMirror = "java.util.stream.Collector<*Item, java.lang.Object, java.util.Map<(*unknown*), java.util.List<*Item>>>", @Unchecked = false, @VarargsCall = false] + | | +- TypeExpression[@TypeMirror = "java.util.stream.Collectors"] + | | | +- ClassType[@TypeMirror = "java.util.stream.Collectors"] + | | +- ArgumentList[] + | | +- MethodReference[@TypeMirror = "java.util.function.Function<*Item, (*unknown*)>"] + | | +- AmbiguousName[@TypeMirror = "(*unknown*)"] + | +- ArgumentList[] + | +- LambdaExpression[@TypeMirror = "java.util.function.BiConsumer<(*unknown*), java.util.List<*Item>>"] + | +- LambdaParameterList[] + | | +- LambdaParameter[@TypeMirror = "(*unknown*)"] + | | | +- ModifierList[] + | | | +- VariableId[@Name = "a", @TypeMirror = "(*unknown*)"] + | | +- LambdaParameter[@TypeMirror = "java.util.List<*Item>"] + | | +- ModifierList[] + | | +- VariableId[@Name = "b", @TypeMirror = "java.util.List<*Item>"] + | +- MethodCall[@Failed = false, @Function = "java.util.List<*SummaryDto.ItemDto>.add(*SummaryDto.ItemDto) -> boolean", @MethodName = "add", @TypeMirror = "boolean", @Unchecked = false, @VarargsCall = false] + | +- VariableAccess[@Name = "items", @TypeMirror = "java.util.List<*SummaryDto.ItemDto>"] + | +- ArgumentList[] + | +- MethodCall[@Failed = false, @Function = "Foo.buildItem(*BigDecimal, java.util.List<*Item>) -> *SummaryDto.ItemDto", @MethodName = "buildItem", @TypeMirror = "*SummaryDto.ItemDto", @Unchecked = false, @VarargsCall = false] + | +- ArgumentList[] + | +- VariableAccess[@Name = "a", @TypeMirror = "(*unknown*)"] + | +- VariableAccess[@Name = "b", @TypeMirror = "java.util.List<*Item>"] + +- MethodDeclaration[@Name = "buildItem"] + +- ModifierList[] + +- ClassType[@TypeMirror = "*SummaryDto.ItemDto"] + +- FormalParameters[] + | +- FormalParameter[@TypeMirror = "*BigDecimal"] + | | +- ModifierList[] + | | +- ClassType[@TypeMirror = "*BigDecimal"] + | | +- VariableId[@Name = "a", @TypeMirror = "*BigDecimal"] + | +- FormalParameter[@TypeMirror = "java.util.List<*Item>"] + | +- ModifierList[] + | +- ClassType[@TypeMirror = "java.util.List<*Item>"] + | | +- TypeArguments[] + | | +- ClassType[@TypeMirror = "*Item"] + | +- VariableId[@Name = "b", @TypeMirror = "java.util.List<*Item>"] + +- Block[] + +- ReturnStatement[] + +- MethodCall[@Failed = true, @Function = "(*unknown*).(*unknown method*)() -> (*unknown*)", @MethodName = "build", @TypeMirror = "(*unknown*)", @Unchecked = false, @VarargsCall = false] + +- MethodCall[@Failed = true, @Function = "(*unknown*).(*unknown method*)() -> (*unknown*)", @MethodName = "builder", @TypeMirror = "(*unknown*)", @Unchecked = false, @VarargsCall = false] + | +- AmbiguousName[@TypeMirror = "(*unknown*)"] + | +- ArgumentList[] + +- ArgumentList[] From 3fdbf7d6cbaaa78f2edc2f48922beeb5c2e4a9ce Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 14 Nov 2024 17:48:08 +0100 Subject: [PATCH 05/11] [java] InsufficientStringBufferDeclaration: Fix CCE for Character Fixes #5314 --- docs/pages/release_notes.md | 2 ++ ...sufficientStringBufferDeclarationRule.java | 8 +++++++- .../InsufficientStringBufferDeclaration.xml | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 5fa3ac04b6..3893f1a820 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. * java * [#5293](https://github.com/pmd/pmd/issues/5293): \[java] Deadlock when executing PMD in multiple threads * [#5324](https://github.com/pmd/pmd/issues/5324): \[java] Issue with type inference of nested lambdas +* java-performance + * [#5314](https://github.com/pmd/pmd/issues/5314): \[java] InsufficientStringBufferDeclarationRule: Lack of handling for char type parameters ### ๐Ÿšจ API Changes diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InsufficientStringBufferDeclarationRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InsufficientStringBufferDeclarationRule.java index a6fabf91a2..5acd063c15 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InsufficientStringBufferDeclarationRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InsufficientStringBufferDeclarationRule.java @@ -240,6 +240,12 @@ public class InsufficientStringBufferDeclarationRule extends AbstractJavaRulecha private int calculateExpression(ASTExpression expression) { Object value = expression.getConstValue(); - return value == null ? State.UNKNOWN_CAPACITY : (Integer) value; + if (value == null) { + return State.UNKNOWN_CAPACITY; + } + if (value instanceof Character) { + return (Character) value; + } + return (Integer) value; } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/InsufficientStringBufferDeclaration.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/InsufficientStringBufferDeclaration.xml index ec267fcfcc..bd5d364eb1 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/InsufficientStringBufferDeclaration.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/InsufficientStringBufferDeclaration.xml @@ -1419,4 +1419,23 @@ public class LiteralExpression { } ]]> + + + #5314 [java] InsufficientStringBufferDeclarationRule: Lack of handling for char type parameters + 0 + + From 01b8ca765bc16a57bac3bb8a14f2c13839ae2dd7 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 14 Nov 2024 17:48:26 +0100 Subject: [PATCH 06/11] Add @chenguangqi as a contributor --- .all-contributorsrc | 9 ++ docs/pages/pmd/projectdocs/credits.md | 172 +++++++++++++------------- 2 files changed, 96 insertions(+), 85 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 95ebc05d6e..1d4a930f38 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -7865,6 +7865,15 @@ "contributions": [ "code" ] + }, + { + "login": "chenguangqi", + "name": "ๅคฉ็ƒญๅƒ่ฅฟ็“œ", + "avatar_url": "https://avatars.githubusercontent.com/u/6231010?v=4", + "profile": "http://chenguangqi.github.io/", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 9497ea7378..7b6a55aec6 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -350,770 +350,772 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d JJengility
JJengility

๐Ÿ› Jake Hemmerle
Jake Hemmerle

๐Ÿ› + Jakub Dupak
Jakub Dupak

๐Ÿ’ป James Harrison
James Harrison

๐Ÿ› ๐Ÿ’ป Jamie Bisotti
Jamie Bisotti

๐Ÿ› Jan
Jan

๐Ÿ› Jan Aertgeerts
Jan Aertgeerts

๐Ÿ’ป ๐Ÿ› - Jan Brรผmmer
Jan Brรผmmer

๐Ÿ› + Jan Brรผmmer
Jan Brรผmmer

๐Ÿ› Jan Tล™รญska
Jan Tล™รญska

๐Ÿ› Jan-Lukas Else
Jan-Lukas Else

๐Ÿ› Jason Qiu
Jason Qiu

๐Ÿ’ป ๐Ÿ“– Jason Williams
Jason Williams

๐Ÿ› Javier Spagnoletti
Javier Spagnoletti

๐Ÿ› Jean-Paul Mayer
Jean-Paul Mayer

๐Ÿ› - Jean-Simon Larochelle
Jean-Simon Larochelle

๐Ÿ› + Jean-Simon Larochelle
Jean-Simon Larochelle

๐Ÿ› Jeff Bartolotta
Jeff Bartolotta

๐Ÿ’ป ๐Ÿ› Jeff Hube
Jeff Hube

๐Ÿ’ป ๐Ÿ› Jeff Jensen
Jeff Jensen

๐Ÿ› Jeff May
Jeff May

๐Ÿ› Jens Gerdes
Jens Gerdes

๐Ÿ› Jeroen Borgers
Jeroen Borgers

๐Ÿ› ๐Ÿ’ป ๐Ÿ“ข - Jeroen Meijer
Jeroen Meijer

๐Ÿ› + Jeroen Meijer
Jeroen Meijer

๐Ÿ› Jeroen van Wilgenburg
Jeroen van Wilgenburg

๐Ÿ“– Jerome Russ
Jerome Russ

๐Ÿ› JerritEic
JerritEic

๐Ÿ’ป ๐Ÿ“– ๐Ÿ› Jiri Pejchal
Jiri Pejchal

๐Ÿ› Jithin Sunny
Jithin Sunny

๐Ÿ› Jiล™รญ ล korpil
Jiล™รญ ล korpil

๐Ÿ› - Joao Machado
Joao Machado

๐Ÿ› + Joao Machado
Joao Machado

๐Ÿ› Jochen Krauss
Jochen Krauss

๐Ÿ› Johan Hammar
Johan Hammar

๐Ÿ› John Karp
John Karp

๐Ÿ› John Zhang
John Zhang

๐Ÿ› John-Teng
John-Teng

๐Ÿ’ป ๐Ÿ› Jon Moroney
Jon Moroney

๐Ÿ’ป ๐Ÿ› - Jonas Geiregat
Jonas Geiregat

๐Ÿ› + Jonas Geiregat
Jonas Geiregat

๐Ÿ› Jonas KeรŸler
Jonas KeรŸler

๐Ÿ› Jonathan Wiesel
Jonathan Wiesel

๐Ÿ’ป ๐Ÿ› Jordan
Jordan

๐Ÿ› Jordi Llach
Jordi Llach

๐Ÿ› Jorge Solรณrzano
Jorge Solรณrzano

๐Ÿ› JorneVL
JorneVL

๐Ÿ› - Jose Palafox
Jose Palafox

๐Ÿ› + Jose Palafox
Jose Palafox

๐Ÿ› Jose Stovall
Jose Stovall

๐Ÿ› Joseph
Joseph

๐Ÿ’ป Joseph Heenan
Joseph Heenan

๐Ÿ› Josh Feingold
Josh Feingold

๐Ÿ’ป ๐Ÿ› Josh Holthaus
Josh Holthaus

๐Ÿ› Joshua S Arquilevich
Joshua S Arquilevich

๐Ÿ› - Joรฃo Dinis Ferreira
Joรฃo Dinis Ferreira

๐Ÿ“– + Joรฃo Dinis Ferreira
Joรฃo Dinis Ferreira

๐Ÿ“– Joรฃo Ferreira
Joรฃo Ferreira

๐Ÿ’ป ๐Ÿ› Joรฃo Pedro Schmitt
Joรฃo Pedro Schmitt

๐Ÿ› Juan Martรญn Sotuyo Dodero
Juan Martรญn Sotuyo Dodero

๐Ÿ’ป ๐Ÿ“– ๐Ÿ› ๐Ÿšง Juan Pablo Civile
Juan Pablo Civile

๐Ÿ› Julian Voronetsky
Julian Voronetsky

๐Ÿ› Julien
Julien

๐Ÿ› - Julius
Julius

๐Ÿ› + Julius
Julius

๐Ÿ› JustPRV
JustPRV

๐Ÿ› Justin Stroud
Justin Stroud

๐Ÿ’ป Jรถrn Huxhorn
Jรถrn Huxhorn

๐Ÿ› KThompso
KThompso

๐Ÿ› Kai Amundsen
Kai Amundsen

๐Ÿ› Karel Vervaeke
Karel Vervaeke

๐Ÿ› - Karl-Andero Mere
Karl-Andero Mere

๐Ÿ› + Karl-Andero Mere
Karl-Andero Mere

๐Ÿ› Karl-Philipp Richter
Karl-Philipp Richter

๐Ÿ› Karsten Silz
Karsten Silz

๐Ÿ› Kazuma Watanabe
Kazuma Watanabe

๐Ÿ› Kev
Kev

๐Ÿ› Keve Mรผller
Keve Mรผller

๐Ÿ› Kevin Guerra
Kevin Guerra

๐Ÿ’ป - Kevin Jones
Kevin Jones

๐Ÿ› ๐Ÿ’ป + Kevin Jones
Kevin Jones

๐Ÿ› ๐Ÿ’ป Kevin Poorman
Kevin Poorman

๐Ÿ› Kevin Wayne
Kevin Wayne

๐Ÿ› Kieran Black
Kieran Black

๐Ÿ› Kirill Zubov
Kirill Zubov

๐Ÿ› Kirk Clemens
Kirk Clemens

๐Ÿ’ป ๐Ÿ› Klaus Hartl
Klaus Hartl

๐Ÿ› - Koen Van Looveren
Koen Van Looveren

๐Ÿ› + Koen Van Looveren
Koen Van Looveren

๐Ÿ› Kris Scheibe
Kris Scheibe

๐Ÿ’ป ๐Ÿ› Krystian Dabrowski
Krystian Dabrowski

๐Ÿ› ๐Ÿ’ป Kunal Thanki
Kunal Thanki

๐Ÿ› LaLucid
LaLucid

๐Ÿ’ป Larry Diamond
Larry Diamond

๐Ÿ’ป ๐Ÿ› Lars Knickrehm
Lars Knickrehm

๐Ÿ› - Laurent Bovet
Laurent Bovet

๐Ÿ› ๐Ÿ’ป + Laurent Bovet
Laurent Bovet

๐Ÿ› ๐Ÿ’ป Leo Gutierrez
Leo Gutierrez

๐Ÿ› LiGaOg
LiGaOg

๐Ÿ’ป Liam Sharp
Liam Sharp

๐Ÿ› Lintsi
Lintsi

๐Ÿ› Linus Fernandes
Linus Fernandes

๐Ÿ› Lixon Lookose
Lixon Lookose

๐Ÿ› - Logesh
Logesh

๐Ÿ› + Logesh
Logesh

๐Ÿ› Lorenzo Gabriele
Lorenzo Gabriele

๐Ÿ› Loรฏc Ledoyen
Loรฏc Ledoyen

๐Ÿ› Lucas
Lucas

๐Ÿ› Lucas Silva
Lucas Silva

๐Ÿ› Lucas Soncini
Lucas Soncini

๐Ÿ’ป ๐Ÿ› Luis Alcantar
Luis Alcantar

๐Ÿ’ป - Lukas Grรคf
Lukas Grรคf

๐Ÿ’ป + Lukas Grรคf
Lukas Grรคf

๐Ÿ’ป Lukasz Slonina
Lukasz Slonina

๐Ÿ› Lukebray
Lukebray

๐Ÿ› Lynn
Lynn

๐Ÿ’ป ๐Ÿ› Lyor Goldstein
Lyor Goldstein

๐Ÿ› MCMicS
MCMicS

๐Ÿ› Macarse
Macarse

๐Ÿ› - Machine account for PMD
Machine account for PMD

๐Ÿ’ป + Machine account for PMD
Machine account for PMD

๐Ÿ’ป Maciek Siemczyk
Maciek Siemczyk

๐Ÿ› Maikel Steneker
Maikel Steneker

๐Ÿ’ป ๐Ÿ› Maksim Moiseikin
Maksim Moiseikin

๐Ÿ› Manfred Koch
Manfred Koch

๐Ÿ› Manuel Moya Ferrer
Manuel Moya Ferrer

๐Ÿ’ป ๐Ÿ› Manuel Ryan
Manuel Ryan

๐Ÿ› - Marat Vyshegorodtsev
Marat Vyshegorodtsev

๐Ÿ› + Marat Vyshegorodtsev
Marat Vyshegorodtsev

๐Ÿ› Marcel Hรคrle
Marcel Hรคrle

๐Ÿ› Marcello Fialho
Marcello Fialho

๐Ÿ› Marcin Dฤ…browski
Marcin Dฤ…browski

๐Ÿ’ป Marcin Rataj
Marcin Rataj

๐Ÿ› Marcono1234
Marcono1234

๐Ÿ› Mark Adamcin
Mark Adamcin

๐Ÿ› - Mark Hall
Mark Hall

๐Ÿ’ป ๐Ÿ› + Mark Hall
Mark Hall

๐Ÿ’ป ๐Ÿ› Mark Kolich
Mark Kolich

๐Ÿ› Mark Pritchard
Mark Pritchard

๐Ÿ› Markus Rathgeb
Markus Rathgeb

๐Ÿ› Marquis Wang
Marquis Wang

๐Ÿ› MartGit
MartGit

๐Ÿ› Martin Feldsztejn
Martin Feldsztejn

๐Ÿ› - Martin Lehmann
Martin Lehmann

๐Ÿ› + Martin Lehmann
Martin Lehmann

๐Ÿ› Martin Spamer
Martin Spamer

๐Ÿ› Martin Tarjรกnyi
Martin Tarjรกnyi

๐Ÿ› MatFl
MatFl

๐Ÿ› Mateusz Stefanski
Mateusz Stefanski

๐Ÿ› Mathieu Gouin
Mathieu Gouin

๐Ÿ› MatiasComercio
MatiasComercio

๐Ÿ’ป ๐Ÿ› - Matt Benson
Matt Benson

๐Ÿ› + Matt Benson
Matt Benson

๐Ÿ› Matt De Poorter
Matt De Poorter

๐Ÿ› Matt Hargett
Matt Hargett

๐Ÿ’ป ๐Ÿ’ต Matt Harrah
Matt Harrah

๐Ÿ› Matt Nelson
Matt Nelson

๐Ÿ› Matthew Amos
Matthew Amos

๐Ÿ› Matthew Duggan
Matthew Duggan

๐Ÿ› - Matthew Hall
Matthew Hall

๐Ÿ› + Matthew Hall
Matthew Hall

๐Ÿ› Matthew Rossner
Matthew Rossner

๐Ÿ› Matรญas Fraga
Matรญas Fraga

๐Ÿ’ป ๐Ÿ› Maxime Robert
Maxime Robert

๐Ÿ’ป ๐Ÿ› MetaBF
MetaBF

๐Ÿ› Metin Dagcilar
Metin Dagcilar

๐Ÿ› Michael
Michael

๐Ÿ› - Michael Bell
Michael Bell

๐Ÿ› + Michael Bell
Michael Bell

๐Ÿ› Michael Bernstein
Michael Bernstein

๐Ÿ› Michael Clay
Michael Clay

๐Ÿ› Michael Dombrowski
Michael Dombrowski

๐Ÿ› Michael Hausegger
Michael Hausegger

๐Ÿ› Michael Hoefer
Michael Hoefer

๐Ÿ› Michael Kolesnikov
Michael Kolesnikov

๐Ÿ› - Michael Mรถbius
Michael Mรถbius

๐Ÿ› + Michael Mรถbius
Michael Mรถbius

๐Ÿ› Michael N. Lipp
Michael N. Lipp

๐Ÿ› Michael Pellegrini
Michael Pellegrini

๐Ÿ› Michal Kordas
Michal Kordas

๐Ÿ› Michaล‚ Borek
Michaล‚ Borek

๐Ÿ› Michaล‚ Kuliล„ski
Michaล‚ Kuliล„ski

๐Ÿ› Miguel Nรบรฑez Dรญaz-Montes
Miguel Nรบรฑez Dรญaz-Montes

๐Ÿ› - Mihai Ionut
Mihai Ionut

๐Ÿ› + Mihai Ionut
Mihai Ionut

๐Ÿ› Mikhail Kuchma
Mikhail Kuchma

๐Ÿ› Mirek Hankus
Mirek Hankus

๐Ÿ› Mitch Spano
Mitch Spano

๐Ÿ› Mladjan Gadzic
Mladjan Gadzic

๐Ÿ› MrAngry52
MrAngry52

๐Ÿ› Muminur Choudhury
Muminur Choudhury

๐Ÿ› - Mykhailo Palahuta
Mykhailo Palahuta

๐Ÿ’ป ๐Ÿ› + Mykhailo Palahuta
Mykhailo Palahuta

๐Ÿ’ป ๐Ÿ› Nagendra Kumar Singh
Nagendra Kumar Singh

๐Ÿ› Nahuel Barrios
Nahuel Barrios

๐Ÿ› Nakul Sharma
Nakul Sharma

๐Ÿ› Nathan Braun
Nathan Braun

๐Ÿ› Nathan Reynolds
Nathan Reynolds

๐Ÿ› Nathan Reynolds
Nathan Reynolds

๐Ÿ› - Nathanaรซl
Nathanaรซl

๐Ÿ› + Nathanaรซl
Nathanaรซl

๐Ÿ› Naveen
Naveen

๐Ÿ’ป Nazdravi
Nazdravi

๐Ÿ› Neha-Dhonde
Neha-Dhonde

๐Ÿ› Nicholas Doyle
Nicholas Doyle

๐Ÿ› Nick Butcher
Nick Butcher

๐Ÿ› Nico Gallinal
Nico Gallinal

๐Ÿ› - Nicola Dal Maso
Nicola Dal Maso

๐Ÿ› + Nicola Dal Maso
Nicola Dal Maso

๐Ÿ› Nicolas Filotto
Nicolas Filotto

๐Ÿ’ป Nicolas Vervelle
Nicolas Vervelle

๐Ÿ› Nicolas Vuillamy
Nicolas Vuillamy

๐Ÿ“– Nikita Chursin
Nikita Chursin

๐Ÿ› Niklas Baudy
Niklas Baudy

๐Ÿ› Nikolas Havrikov
Nikolas Havrikov

๐Ÿ› - Nilesh Virkar
Nilesh Virkar

๐Ÿ› + Nilesh Virkar
Nilesh Virkar

๐Ÿ› Nimit Patel
Nimit Patel

๐Ÿ› Niranjan Harpale
Niranjan Harpale

๐Ÿ› Nirvik Patel
Nirvik Patel

๐Ÿ’ป Noah Sussman
Noah Sussman

๐Ÿ› Noah0120
Noah0120

๐Ÿ› Noam Tamim
Noam Tamim

๐Ÿ› - Noel Grandin
Noel Grandin

๐Ÿ› + Noel Grandin
Noel Grandin

๐Ÿ› Olaf Haalstra
Olaf Haalstra

๐Ÿ› Oleg Andreych
Oleg Andreych

๐Ÿ’ป ๐Ÿ› Oleg Pavlenko
Oleg Pavlenko

๐Ÿ› Oleksii Dykov
Oleksii Dykov

๐Ÿ’ป ๐Ÿ› Oliver Eikemeier
Oliver Eikemeier

๐Ÿ› Oliver Siegmar
Oliver Siegmar

๐Ÿ’ต - Olivier Parent
Olivier Parent

๐Ÿ’ป ๐Ÿ› + Olivier Parent
Olivier Parent

๐Ÿ’ป ๐Ÿ› Ollie Abbey
Ollie Abbey

๐Ÿ’ป ๐Ÿ› Ondrej Kratochvil
Ondrej Kratochvil

๐Ÿ› OverDrone
OverDrone

๐Ÿ› Ozan Gulle
Ozan Gulle

๐Ÿ’ป ๐Ÿ› PUNEET JAIN
PUNEET JAIN

๐Ÿ› Parbati Bose
Parbati Bose

๐Ÿ› - Paul Berg
Paul Berg

๐Ÿ› + Paul Berg
Paul Berg

๐Ÿ› Paul Guyot
Paul Guyot

๐Ÿ’ป Pavel Bludov
Pavel Bludov

๐Ÿ› Pavel Miฤka
Pavel Miฤka

๐Ÿ› Pedro Nuno Santos
Pedro Nuno Santos

๐Ÿ› Pedro Rijo
Pedro Rijo

๐Ÿ› Pelisse Romain
Pelisse Romain

๐Ÿ’ป ๐Ÿ“– ๐Ÿ› - Per Abich
Per Abich

๐Ÿ’ป + Per Abich
Per Abich

๐Ÿ’ป Pete Davids
Pete Davids

๐Ÿ› Peter Bruin
Peter Bruin

๐Ÿ› Peter Chittum
Peter Chittum

๐Ÿ’ป ๐Ÿ› Peter Cudmore
Peter Cudmore

๐Ÿ› Peter Kasson
Peter Kasson

๐Ÿ› Peter Kofler
Peter Kofler

๐Ÿ› - Peter Paul Bakker
Peter Paul Bakker

๐Ÿ’ป + Peter Paul Bakker
Peter Paul Bakker

๐Ÿ’ป Peter Rader
Peter Rader

๐Ÿ› Pham Hai Trung
Pham Hai Trung

๐Ÿ› Philip Graf
Philip Graf

๐Ÿ’ป ๐Ÿ› Philip Hachey
Philip Hachey

๐Ÿ› Philippe Ozil
Philippe Ozil

๐Ÿ› Phinehas Artemix
Phinehas Artemix

๐Ÿ› - Phokham Nonava
Phokham Nonava

๐Ÿ› + Phokham Nonava
Phokham Nonava

๐Ÿ› Pim van der Loos
Pim van der Loos

๐Ÿ’ป โš ๏ธ Piotr Szymaล„ski
Piotr Szymaล„ski

๐Ÿ› Piotrek ลปygieล‚o
Piotrek ลปygieล‚o

๐Ÿ’ป ๐Ÿ› ๐Ÿ“– Pranay Jaiswal
Pranay Jaiswal

๐Ÿ› Prasad Kamath
Prasad Kamath

๐Ÿ› Prasanna
Prasanna

๐Ÿ› - Presh-AR
Presh-AR

๐Ÿ› + Presh-AR
Presh-AR

๐Ÿ› Puneet1726
Puneet1726

๐Ÿ› RBRi
RBRi

๐Ÿ› Rafael Cortรชs
Rafael Cortรชs

๐Ÿ› RaheemShaik999
RaheemShaik999

๐Ÿ› RajeshR
RajeshR

๐Ÿ’ป ๐Ÿ› Ramachandra Mohan
Ramachandra Mohan

๐Ÿ› - Ramel0921
Ramel0921

๐Ÿ› + Ramel0921
Ramel0921

๐Ÿ› Raquel Pau
Raquel Pau

๐Ÿ› Ravikiran Janardhana
Ravikiran Janardhana

๐Ÿ› Reda Benhemmouche
Reda Benhemmouche

๐Ÿ› Reinhard Schiedermeier
Reinhard Schiedermeier

๐Ÿ› Renato Oliveira
Renato Oliveira

๐Ÿ’ป ๐Ÿ› Rich DiCroce
Rich DiCroce

๐Ÿ› - Richard Corfield
Richard Corfield

๐Ÿ’ป + Richard Corfield
Richard Corfield

๐Ÿ’ป Richard Corfield
Richard Corfield

๐Ÿ› ๐Ÿ’ป Riot R1cket
Riot R1cket

๐Ÿ› Rishabh Jain
Rishabh Jain

๐Ÿ› RishabhDeep Singh
RishabhDeep Singh

๐Ÿ› Rob Baillie
Rob Baillie

๐Ÿ› Robbie Martinus
Robbie Martinus

๐Ÿ’ป ๐Ÿ› - Robert Henry
Robert Henry

๐Ÿ› + Robert Henry
Robert Henry

๐Ÿ› Robert Mihaly
Robert Mihaly

๐Ÿ› Robert Painsi
Robert Painsi

๐Ÿ› Robert Russell
Robert Russell

๐Ÿ› Robert Sรถsemann
Robert Sรถsemann

๐Ÿ’ป ๐Ÿ“– ๐Ÿ“ข ๐Ÿ› Robert Whitebit
Robert Whitebit

๐Ÿ› Robin Richtsfeld
Robin Richtsfeld

๐Ÿ› - Robin Stocker
Robin Stocker

๐Ÿ’ป ๐Ÿ› + Robin Stocker
Robin Stocker

๐Ÿ’ป ๐Ÿ› Robin Wils
Robin Wils

๐Ÿ› RochusOest
RochusOest

๐Ÿ› Rodolfo Noviski
Rodolfo Noviski

๐Ÿ› Rodrigo Casara
Rodrigo Casara

๐Ÿ› Rodrigo Fernandes
Rodrigo Fernandes

๐Ÿ› Roman Salvador
Roman Salvador

๐Ÿ’ป ๐Ÿ› - Ronald Blaschke
Ronald Blaschke

๐Ÿ› + Ronald Blaschke
Ronald Blaschke

๐Ÿ› Rรณbert Papp
Rรณbert Papp

๐Ÿ› Saikat Sengupta
Saikat Sengupta

๐Ÿ› Saksham Handu
Saksham Handu

๐Ÿ› Saladoc
Saladoc

๐Ÿ› Salesforce Bob Lightning
Salesforce Bob Lightning

๐Ÿ› Sam Carlberg
Sam Carlberg

๐Ÿ› - Sascha Riemer
Sascha Riemer

๐Ÿ› + Sascha Riemer
Sascha Riemer

๐Ÿ› Sashko
Sashko

๐Ÿ’ป Satoshi Kubo
Satoshi Kubo

๐Ÿ› Scott Kennedy
Scott Kennedy

๐Ÿ› Scott Wells
Scott Wells

๐Ÿ› ๐Ÿ’ป Scrates1
Scrates1

๐Ÿ› ๐Ÿ’ป Scrsloota
Scrsloota

๐Ÿ’ป - Sebastian Bรถgl
Sebastian Bรถgl

๐Ÿ› + Sebastian Bรถgl
Sebastian Bรถgl

๐Ÿ› Sebastian Davids
Sebastian Davids

๐Ÿ› Sebastian Schuberth
Sebastian Schuberth

๐Ÿ› Sebastian Schwarz
Sebastian Schwarz

๐Ÿ› Seren
Seren

๐Ÿ› ๐Ÿ’ป Sergey Gorbaty
Sergey Gorbaty

๐Ÿ› Sergey Kozlov
Sergey Kozlov

๐Ÿ› - Sergey Yanzin
Sergey Yanzin

๐Ÿ’ป ๐Ÿ› + Sergey Yanzin
Sergey Yanzin

๐Ÿ’ป ๐Ÿ› Seth Wilcox
Seth Wilcox

๐Ÿ’ป Shai Bennathan
Shai Bennathan

๐Ÿ› ๐Ÿ’ป Shubham
Shubham

๐Ÿ’ป ๐Ÿ› Simon Abykov
Simon Abykov

๐Ÿ’ป ๐Ÿ› Simon Xiao
Simon Xiao

๐Ÿ› Srinivasan Venkatachalam
Srinivasan Venkatachalam

๐Ÿ› - Stanislav Gromov
Stanislav Gromov

๐Ÿ› + Stanislav Gromov
Stanislav Gromov

๐Ÿ› Stanislav Myachenkov
Stanislav Myachenkov

๐Ÿ’ป Stefan Birkner
Stefan Birkner

๐Ÿ› Stefan Bohn
Stefan Bohn

๐Ÿ› Stefan Endrullis
Stefan Endrullis

๐Ÿ› Stefan Klรถss-Schuster
Stefan Klรถss-Schuster

๐Ÿ› Stefan Wolf
Stefan Wolf

๐Ÿ› - Stephan H. Wissel
Stephan H. Wissel

๐Ÿ› + Stephan H. Wissel
Stephan H. Wissel

๐Ÿ› Stephen
Stephen

๐Ÿ› Stephen Carter
Stephen Carter

๐Ÿ› Stephen Friedrich
Stephen Friedrich

๐Ÿ› Steve Babula
Steve Babula

๐Ÿ’ป Steven Stearns
Steven Stearns

๐Ÿ› ๐Ÿ’ป Stexxe
Stexxe

๐Ÿ› - Stian Lรฅgstad
Stian Lรฅgstad

๐Ÿ› + Stian Lรฅgstad
Stian Lรฅgstad

๐Ÿ› StuartClayton5
StuartClayton5

๐Ÿ› Supun Arunoda
Supun Arunoda

๐Ÿ› Suren Abrahamyan
Suren Abrahamyan

๐Ÿ› Suvashri
Suvashri

๐Ÿ“– SwatiBGupta1110
SwatiBGupta1110

๐Ÿ› SyedThoufich
SyedThoufich

๐Ÿ› - Szymon Sasin
Szymon Sasin

๐Ÿ› + Szymon Sasin
Szymon Sasin

๐Ÿ› T-chuangxin
T-chuangxin

๐Ÿ› TERAI Atsuhiro
TERAI Atsuhiro

๐Ÿ› TIOBE Software
TIOBE Software

๐Ÿ’ป ๐Ÿ› Tarush Singh
Tarush Singh

๐Ÿ’ป Taylor Smock
Taylor Smock

๐Ÿ› Techeira Damiรกn
Techeira Damiรกn

๐Ÿ’ป ๐Ÿ› - Ted Husted
Ted Husted

๐Ÿ› + Ted Husted
Ted Husted

๐Ÿ› TehBakker
TehBakker

๐Ÿ› The Gitter Badger
The Gitter Badger

๐Ÿ› Theodoor
Theodoor

๐Ÿ› Thiago Henrique Hรผpner
Thiago Henrique Hรผpner

๐Ÿ› Thibault Meyer
Thibault Meyer

๐Ÿ› Thomas Gรผttler
Thomas Gรผttler

๐Ÿ› - Thomas Jones-Low
Thomas Jones-Low

๐Ÿ› + Thomas Jones-Low
Thomas Jones-Low

๐Ÿ› Thomas Smith
Thomas Smith

๐Ÿ’ป ๐Ÿ› ThrawnCA
ThrawnCA

๐Ÿ› Thu Vo
Thu Vo

๐Ÿ› Thunderforge
Thunderforge

๐Ÿ’ป ๐Ÿ› Tim van der Lippe
Tim van der Lippe

๐Ÿ› Tobias Weimer
Tobias Weimer

๐Ÿ’ป ๐Ÿ› - Tom Copeland
Tom Copeland

๐Ÿ› ๐Ÿ’ป ๐Ÿ“– + Tom Copeland
Tom Copeland

๐Ÿ› ๐Ÿ’ป ๐Ÿ“– Tom Daly
Tom Daly

๐Ÿ› Tomas
Tomas

๐Ÿ› Tomer Figenblat
Tomer Figenblat

๐Ÿ› Tomi De Lucca
Tomi De Lucca

๐Ÿ’ป ๐Ÿ› Tony
Tony

๐Ÿ“– Torsten Kleiber
Torsten Kleiber

๐Ÿ› - TrackerSB
TrackerSB

๐Ÿ› + TrackerSB
TrackerSB

๐Ÿ› Tyson Stewart
Tyson Stewart

๐Ÿ› Ullrich Hafner
Ullrich Hafner

๐Ÿ› Utku Cuhadaroglu
Utku Cuhadaroglu

๐Ÿ’ป ๐Ÿ› Valentin Brandl
Valentin Brandl

๐Ÿ› Valeria
Valeria

๐Ÿ› Valery Yatsynovich
Valery Yatsynovich

๐Ÿ“– - Vasily Anisimov
Vasily Anisimov

๐Ÿ› + Vasily Anisimov
Vasily Anisimov

๐Ÿ› Vedant Chokshi
Vedant Chokshi

๐Ÿ› Vibhor Goyal
Vibhor Goyal

๐Ÿ› Vickenty Fesunov
Vickenty Fesunov

๐Ÿ› Victor Noรซl
Victor Noรซl

๐Ÿ› Vincent Galloy
Vincent Galloy

๐Ÿ’ป Vincent HUYNH
Vincent HUYNH

๐Ÿ› - Vincent Maurin
Vincent Maurin

๐Ÿ› + Vincent Maurin
Vincent Maurin

๐Ÿ› Vincent Privat
Vincent Privat

๐Ÿ› Vishhwas
Vishhwas

๐Ÿ› Vishv_Android
Vishv_Android

๐Ÿ› Vitaly
Vitaly

๐Ÿ› Vitaly Polonetsky
Vitaly Polonetsky

๐Ÿ› Vojtech Polivka
Vojtech Polivka

๐Ÿ› - Vsevolod Zholobov
Vsevolod Zholobov

๐Ÿ› + Vsevolod Zholobov
Vsevolod Zholobov

๐Ÿ› Vyom Yadav
Vyom Yadav

๐Ÿ’ป Wang Shidong
Wang Shidong

๐Ÿ› Waqas Ahmed
Waqas Ahmed

๐Ÿ› Wayne J. Earl
Wayne J. Earl

๐Ÿ› Wchenghui
Wchenghui

๐Ÿ› Wener
Wener

๐Ÿ’ป - Will Winder
Will Winder

๐Ÿ› + Will Winder
Will Winder

๐Ÿ› William Brockhus
William Brockhus

๐Ÿ’ป ๐Ÿ› Wilson Kurniawan
Wilson Kurniawan

๐Ÿ› Wim Deblauwe
Wim Deblauwe

๐Ÿ› Woongsik Choi
Woongsik Choi

๐Ÿ› XenoAmess
XenoAmess

๐Ÿ’ป ๐Ÿ› Yang
Yang

๐Ÿ’ป - YaroslavTER
YaroslavTER

๐Ÿ› + YaroslavTER
YaroslavTER

๐Ÿ› Yasar Shaikh
Yasar Shaikh

๐Ÿ’ป Young Chan
Young Chan

๐Ÿ’ป ๐Ÿ› YuJin Kim
YuJin Kim

๐Ÿ› Yuri Dolzhenko
Yuri Dolzhenko

๐Ÿ› Yurii Dubinka
Yurii Dubinka

๐Ÿ› Zoltan Farkas
Zoltan Farkas

๐Ÿ› - Zustin
Zustin

๐Ÿ› + Zustin
Zustin

๐Ÿ› aaronhurst-google
aaronhurst-google

๐Ÿ› ๐Ÿ’ป alexmodis
alexmodis

๐Ÿ› andreoss
andreoss

๐Ÿ› andrey81inmd
andrey81inmd

๐Ÿ’ป ๐Ÿ› anicoara
anicoara

๐Ÿ› arunprasathav
arunprasathav

๐Ÿ› - asiercamara
asiercamara

๐Ÿ› + asiercamara
asiercamara

๐Ÿ› astillich-igniti
astillich-igniti

๐Ÿ’ป avesolovksyy
avesolovksyy

๐Ÿ› avishvat
avishvat

๐Ÿ› avivmu
avivmu

๐Ÿ› axelbarfod1
axelbarfod1

๐Ÿ› b-3-n
b-3-n

๐Ÿ› - balbhadra9
balbhadra9

๐Ÿ› + balbhadra9
balbhadra9

๐Ÿ› base23de
base23de

๐Ÿ› bergander
bergander

๐Ÿ› ๐Ÿ’ป berkam
berkam

๐Ÿ’ป ๐Ÿ› breizh31
breizh31

๐Ÿ› caesarkim
caesarkim

๐Ÿ› carolyujing
carolyujing

๐Ÿ› - cbfiddle
cbfiddle

๐Ÿ› + cbfiddle
cbfiddle

๐Ÿ› cesares-basilico
cesares-basilico

๐Ÿ› chrite
chrite

๐Ÿ› ciufudean
ciufudean

๐Ÿ“– cobratbq
cobratbq

๐Ÿ› coladict
coladict

๐Ÿ› cosmoJFH
cosmoJFH

๐Ÿ› - cristalp
cristalp

๐Ÿ› + cristalp
cristalp

๐Ÿ› crunsk
crunsk

๐Ÿ› cwholmes
cwholmes

๐Ÿ› cyberjj999
cyberjj999

๐Ÿ› cyw3
cyw3

๐Ÿ› ๐Ÿ“– d1ss0nanz
d1ss0nanz

๐Ÿ› dague1
dague1

๐Ÿ“– - dalizi007
dalizi007

๐Ÿ’ป + dalizi007
dalizi007

๐Ÿ’ป danbrycefairsailcom
danbrycefairsailcom

๐Ÿ› dariansanity
dariansanity

๐Ÿ› darrenmiliband
darrenmiliband

๐Ÿ› davidburstrom
davidburstrom

๐Ÿ› dbirkman-paloalto
dbirkman-paloalto

๐Ÿ› deepak-patra
deepak-patra

๐Ÿ› - dependabot[bot]
dependabot[bot]

๐Ÿ’ป ๐Ÿ› + dependabot[bot]
dependabot[bot]

๐Ÿ’ป ๐Ÿ› dinesh150
dinesh150

๐Ÿ› diziaq
diziaq

๐Ÿ› dreaminpast123
dreaminpast123

๐Ÿ› duanyanan
duanyanan

๐Ÿ› dutt-sanjay
dutt-sanjay

๐Ÿ› duursma
duursma

๐Ÿ’ป - dylanleung
dylanleung

๐Ÿ› + dylanleung
dylanleung

๐Ÿ› dzeigler
dzeigler

๐Ÿ› eant60
eant60

๐Ÿ› ekkirala
ekkirala

๐Ÿ› emersonmoura
emersonmoura

๐Ÿ› emouty
emouty

๐Ÿ’ป ๐Ÿ› eugenepugach
eugenepugach

๐Ÿ› - fairy
fairy

๐Ÿ› + fairy
fairy

๐Ÿ› filiprafalowicz
filiprafalowicz

๐Ÿ’ป flxbl-io
flxbl-io

๐Ÿ’ต foxmason
foxmason

๐Ÿ› frankegabor
frankegabor

๐Ÿ› frankl
frankl

๐Ÿ› freafrea
freafrea

๐Ÿ› - fsapatin
fsapatin

๐Ÿ› + fsapatin
fsapatin

๐Ÿ› gearsethenry
gearsethenry

๐Ÿ› gracia19
gracia19

๐Ÿ› gudzpoz
gudzpoz

๐Ÿ› guo fei
guo fei

๐Ÿ› gurmsc5
gurmsc5

๐Ÿ› gwilymatgearset
gwilymatgearset

๐Ÿ’ป ๐Ÿ› - haigsn
haigsn

๐Ÿ› + haigsn
haigsn

๐Ÿ› hemanshu070
hemanshu070

๐Ÿ› henrik242
henrik242

๐Ÿ› hongpuwu
hongpuwu

๐Ÿ› hvbtup
hvbtup

๐Ÿ’ป ๐Ÿ› igniti GmbH
igniti GmbH

๐Ÿ› ilovezfs
ilovezfs

๐Ÿ› - imax-erik
imax-erik

๐Ÿ› + imax-erik
imax-erik

๐Ÿ› itaigilo
itaigilo

๐Ÿ› jakivey32
jakivey32

๐Ÿ› jbennett2091
jbennett2091

๐Ÿ› jcamerin
jcamerin

๐Ÿ› jkeener1
jkeener1

๐Ÿ› jmetertea
jmetertea

๐Ÿ› - johnra2
johnra2

๐Ÿ’ป + johnra2
johnra2

๐Ÿ’ป johnzhao9
johnzhao9

๐Ÿ› josemanuelrolon
josemanuelrolon

๐Ÿ’ป ๐Ÿ› kabroxiko
kabroxiko

๐Ÿ’ป ๐Ÿ› karthikaiyasamy
karthikaiyasamy

๐Ÿ“– karwer
karwer

๐Ÿ› kaulonline
kaulonline

๐Ÿ› - kdaemonv
kdaemonv

๐Ÿ› + kdaemonv
kdaemonv

๐Ÿ› kdebski85
kdebski85

๐Ÿ› ๐Ÿ’ป kenji21
kenji21

๐Ÿ’ป ๐Ÿ› kfranic
kfranic

๐Ÿ› khalidkh
khalidkh

๐Ÿ› koalalam
koalalam

๐Ÿ› krzyk
krzyk

๐Ÿ› - lasselindqvist
lasselindqvist

๐Ÿ› + lasselindqvist
lasselindqvist

๐Ÿ› lgemeinhardt
lgemeinhardt

๐Ÿ› lihuaib
lihuaib

๐Ÿ› liqingjun123
liqingjun123

๐Ÿ› lonelyma1021
lonelyma1021

๐Ÿ› lpeddy
lpeddy

๐Ÿ› lujiefsi
lujiefsi

๐Ÿ’ป - lukelukes
lukelukes

๐Ÿ’ป + lukelukes
lukelukes

๐Ÿ’ป lyriccoder
lyriccoder

๐Ÿ› marcelmore
marcelmore

๐Ÿ› matchbox
matchbox

๐Ÿ› matthiaskraaz
matthiaskraaz

๐Ÿ› meandonlyme
meandonlyme

๐Ÿ› mikesive
mikesive

๐Ÿ› - milossesic
milossesic

๐Ÿ› + milossesic
milossesic

๐Ÿ› mluckam
mluckam

๐Ÿ’ป ๐Ÿ› mohan-chinnappan-n
mohan-chinnappan-n

๐Ÿ’ป mriddell95
mriddell95

๐Ÿ› mrlzh
mrlzh

๐Ÿ› msloan
msloan

๐Ÿ› mucharlaravalika
mucharlaravalika

๐Ÿ› - mvenneman
mvenneman

๐Ÿ› + mvenneman
mvenneman

๐Ÿ› nareshl119
nareshl119

๐Ÿ› nicolas-harraudeau-sonarsource
nicolas-harraudeau-sonarsource

๐Ÿ› noerremark
noerremark

๐Ÿ› novsirion
novsirion

๐Ÿ› nwcm
nwcm

๐Ÿ“– ๐Ÿ› ๐Ÿ’ป oggboy
oggboy

๐Ÿ› - oinume
oinume

๐Ÿ› + oinume
oinume

๐Ÿ› orimarko
orimarko

๐Ÿ’ป ๐Ÿ› pablogomez2197
pablogomez2197

๐Ÿ› pacvz
pacvz

๐Ÿ’ป pallavi agarwal
pallavi agarwal

๐Ÿ› parksungrin
parksungrin

๐Ÿ› patpatpat123
patpatpat123

๐Ÿ› - patriksevallius
patriksevallius

๐Ÿ› + patriksevallius
patriksevallius

๐Ÿ› pbrajesh1
pbrajesh1

๐Ÿ› phoenix384
phoenix384

๐Ÿ› piotrszymanski-sc
piotrszymanski-sc

๐Ÿ’ป plan3d
plan3d

๐Ÿ› poojasix
poojasix

๐Ÿ› prabhushrikant
prabhushrikant

๐Ÿ› - pujitha8783
pujitha8783

๐Ÿ› + pujitha8783
pujitha8783

๐Ÿ› r-r-a-j
r-r-a-j

๐Ÿ› raghujayjunk
raghujayjunk

๐Ÿ› rajeshveera
rajeshveera

๐Ÿ› rajeswarreddy88
rajeswarreddy88

๐Ÿ› recdevs
recdevs

๐Ÿ› reudismam
reudismam

๐Ÿ’ป ๐Ÿ› - rijkt
rijkt

๐Ÿ› + rijkt
rijkt

๐Ÿ› rillig-tk
rillig-tk

๐Ÿ› rmohan20
rmohan20

๐Ÿ’ป ๐Ÿ› rnveach
rnveach

๐Ÿ› rxmicro
rxmicro

๐Ÿ› ryan-gustafson
ryan-gustafson

๐Ÿ’ป ๐Ÿ› sabi0
sabi0

๐Ÿ› - scais
scais

๐Ÿ› + scais
scais

๐Ÿ› schosin
schosin

๐Ÿ› screamingfrog
screamingfrog

๐Ÿ’ต sebbASF
sebbASF

๐Ÿ› sergeygorbaty
sergeygorbaty

๐Ÿ’ป shilko2013
shilko2013

๐Ÿ› shiomiyan
shiomiyan

๐Ÿ“– - simeonKondr
simeonKondr

๐Ÿ› + simeonKondr
simeonKondr

๐Ÿ› snajberk
snajberk

๐Ÿ› sniperrifle2004
sniperrifle2004

๐Ÿ› snuyanzin
snuyanzin

๐Ÿ› ๐Ÿ’ป soloturn
soloturn

๐Ÿ› soyodream
soyodream

๐Ÿ› sratz
sratz

๐Ÿ› - stonio
stonio

๐Ÿ› + stonio
stonio

๐Ÿ› sturton
sturton

๐Ÿ’ป ๐Ÿ› sudharmohan
sudharmohan

๐Ÿ› suruchidawar
suruchidawar

๐Ÿ› svenfinitiv
svenfinitiv

๐Ÿ› szymanp23
szymanp23

๐Ÿ› ๐Ÿ’ป tashiscool
tashiscool

๐Ÿ› - test-git-hook
test-git-hook

๐Ÿ› + test-git-hook
test-git-hook

๐Ÿ› testation21
testation21

๐Ÿ’ป ๐Ÿ› thanosa
thanosa

๐Ÿ› tiandiyixian
tiandiyixian

๐Ÿ› tobwoerk
tobwoerk

๐Ÿ› tprouvot
tprouvot

๐Ÿ› ๐Ÿ’ป trentchilders
trentchilders

๐Ÿ› - triandicAnt
triandicAnt

๐Ÿ› + triandicAnt
triandicAnt

๐Ÿ› trishul14
trishul14

๐Ÿ› tsui
tsui

๐Ÿ› wangzitom12306
wangzitom12306

๐Ÿ› winhkey
winhkey

๐Ÿ› witherspore
witherspore

๐Ÿ› wjljack
wjljack

๐Ÿ› - wuchiuwong
wuchiuwong

๐Ÿ› + wuchiuwong
wuchiuwong

๐Ÿ› xingsong
xingsong

๐Ÿ› xioayuge
xioayuge

๐Ÿ› xnYi9wRezm
xnYi9wRezm

๐Ÿ’ป ๐Ÿ› xuanuy
xuanuy

๐Ÿ› xyf0921
xyf0921

๐Ÿ› yalechen-cyw3
yalechen-cyw3

๐Ÿ› - yasuharu-sato
yasuharu-sato

๐Ÿ› + yasuharu-sato
yasuharu-sato

๐Ÿ› zenglian
zenglian

๐Ÿ› zgrzyt93
zgrzyt93

๐Ÿ’ป ๐Ÿ› zh3ng
zh3ng

๐Ÿ› zt_soft
zt_soft

๐Ÿ› ztt79
ztt79

๐Ÿ› zzzzfeng
zzzzfeng

๐Ÿ› - รrpรกd Magosรกnyi
รrpรกd Magosรกnyi

๐Ÿ› + รrpรกd Magosรกnyi
รrpรกd Magosรกnyi

๐Ÿ› ไปป่ดตๆฐ
ไปป่ดตๆฐ

๐Ÿ› + ๅคฉ็ƒญๅƒ่ฅฟ็“œ
ๅคฉ็ƒญๅƒ่ฅฟ็“œ

๐Ÿ› ่Œ…ๅปถๅฎ‰
่Œ…ๅปถๅฎ‰

๐Ÿ’ป From 991bc2c41d92de4f9b18cfe67d63870fb9428a2e Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 14 Nov 2024 18:12:13 +0100 Subject: [PATCH 07/11] [apex] Report LexException when extracting comments --- .../pmd/lang/apex/ast/ApexCommentBuilder.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java index 48d41f0faa..7cc9e23f8d 100644 --- a/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java +++ b/pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentBuilder.java @@ -14,10 +14,14 @@ import java.util.List; import java.util.Map; import java.util.RandomAccess; +import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.Token; import net.sourceforge.pmd.annotation.InternalApi; +import net.sourceforge.pmd.lang.ast.LexException; import net.sourceforge.pmd.lang.document.TextDocument; import net.sourceforge.pmd.lang.document.TextRegion; @@ -106,6 +110,13 @@ final class ApexCommentBuilder { private static CommentInformation extractInformationFromComments(TextDocument sourceCode, String suppressMarker) { String source = sourceCode.getText().toString(); ApexLexer lexer = new ApexLexer(new CaseInsensitiveInputStream(CharStreams.fromString(source))); + lexer.removeErrorListeners(); + lexer.addErrorListener(new BaseErrorListener() { + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { + throw new LexException(line, charPositionInLine, sourceCode.getFileId(), msg, e); + } + }); List allCommentTokens = new ArrayList<>(); Map suppressMap = new HashMap<>(); From 509452577def03f1ae357722204424d0ff53591d Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 14 Nov 2024 18:16:06 +0100 Subject: [PATCH 08/11] [apex] Add test case for #5333 --- .../sourceforge/pmd/lang/apex/ast/ApexCommentTest.java | 8 ++++++++ .../net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentTest.java index 728cce6253..6e847170bf 100644 --- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentTest.java +++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexCommentTest.java @@ -66,4 +66,12 @@ class ApexCommentTest extends ApexParserTestBase { ASTFormalComment comment = file.descendants(ASTUserClass.class).children(ASTFormalComment.class).first(); assertEquals(FORMAL_COMMENT_CONTENT, comment.getImage()); } + + @Test + void fileWithUnicodeEscapes() { + ASTApexFile file = apex.parse(FORMAL_COMMENT_CONTENT + "\n" + + "class MyClass { String s = 'Fran\\u00E7ois'; }"); + ASTFormalComment comment = file.descendants(ASTUserClass.class).children(ASTFormalComment.class).first(); + assertEquals(FORMAL_COMMENT_CONTENT, comment.getImage()); + } } diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java index b075160370..22104ac401 100644 --- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java +++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/ast/ApexLexerTest.java @@ -57,6 +57,7 @@ class ApexLexerTest { @Test void testLexerUnicodeEscapes() { String s = "'Fran\\u00E7ois'"; + // note: with apex-parser 4.3.1, no errors are reported anymore assertEquals(2, getLexingErrors(CharStreams.fromString(s))); assertEquals(0, getLexingErrors(new CaseInsensitiveInputStream(CharStreams.fromString(s)))); } @@ -71,7 +72,7 @@ class ApexLexerTest { return errorListener.getErrorCount(); } - static class ErrorListener extends BaseErrorListener { + private static class ErrorListener extends BaseErrorListener { private int errorCount = 0; @Override From 093683bc592e968ae629f7087655575efd394c92 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 14 Nov 2024 18:17:49 +0100 Subject: [PATCH 09/11] [doc] Update release notes (#5284, #5333) --- docs/pages/release_notes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 5fa3ac04b6..4a522f9532 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -17,6 +17,8 @@ This is a {{ site.pmd.release_type }} release. ### ๐Ÿ› Fixed Issues * ant * [#1860](https://github.com/pmd/pmd/issues/1860): \[ant] Reflective access warnings on java > 9 and java < 17 +* apex + * [#5333](https://github.com/pmd/pmd/issues/5333): \[apex] Token recognition errors for string containing unicode escape sequence * java * [#5293](https://github.com/pmd/pmd/issues/5293): \[java] Deadlock when executing PMD in multiple threads * [#5324](https://github.com/pmd/pmd/issues/5324): \[java] Issue with type inference of nested lambdas @@ -29,6 +31,7 @@ This is a {{ site.pmd.release_type }} release. instead (note different package `ast` instead of `antlr4`). ### โœจ External Contributions +* [#5284](https://github.com/pmd/pmd/pull/5284): \[apex] Use case-insensitive input stream to avoid choking on Unicode escape sequences - [Willem A. Hajenius](https://github.com/wahajenius) (@wahajenius) {% endtocmaker %} From e1d4f27e198beba891a3b4d20e112956229c6e4a Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 14 Nov 2024 18:18:06 +0100 Subject: [PATCH 10/11] Add @wahajenius as a contributor --- .all-contributorsrc | 9 + docs/pages/pmd/projectdocs/credits.md | 234 +++++++++++++------------- 2 files changed, 127 insertions(+), 116 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 95ebc05d6e..3ccf2e8784 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -7865,6 +7865,15 @@ "contributions": [ "code" ] + }, + { + "login": "wahajenius", + "name": "Willem A. Hajenius", + "avatar_url": "https://avatars.githubusercontent.com/u/7836322?v=4", + "profile": "https://github.com/wahajenius", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 9497ea7378..8bedbc0f63 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -350,769 +350,771 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d JJengility
JJengility

๐Ÿ› Jake Hemmerle
Jake Hemmerle

๐Ÿ› + Jakub Dupak
Jakub Dupak

๐Ÿ’ป James Harrison
James Harrison

๐Ÿ› ๐Ÿ’ป Jamie Bisotti
Jamie Bisotti

๐Ÿ› Jan
Jan

๐Ÿ› Jan Aertgeerts
Jan Aertgeerts

๐Ÿ’ป ๐Ÿ› - Jan Brรผmmer
Jan Brรผmmer

๐Ÿ› + Jan Brรผmmer
Jan Brรผmmer

๐Ÿ› Jan Tล™รญska
Jan Tล™รญska

๐Ÿ› Jan-Lukas Else
Jan-Lukas Else

๐Ÿ› Jason Qiu
Jason Qiu

๐Ÿ’ป ๐Ÿ“– Jason Williams
Jason Williams

๐Ÿ› Javier Spagnoletti
Javier Spagnoletti

๐Ÿ› Jean-Paul Mayer
Jean-Paul Mayer

๐Ÿ› - Jean-Simon Larochelle
Jean-Simon Larochelle

๐Ÿ› + Jean-Simon Larochelle
Jean-Simon Larochelle

๐Ÿ› Jeff Bartolotta
Jeff Bartolotta

๐Ÿ’ป ๐Ÿ› Jeff Hube
Jeff Hube

๐Ÿ’ป ๐Ÿ› Jeff Jensen
Jeff Jensen

๐Ÿ› Jeff May
Jeff May

๐Ÿ› Jens Gerdes
Jens Gerdes

๐Ÿ› Jeroen Borgers
Jeroen Borgers

๐Ÿ› ๐Ÿ’ป ๐Ÿ“ข - Jeroen Meijer
Jeroen Meijer

๐Ÿ› + Jeroen Meijer
Jeroen Meijer

๐Ÿ› Jeroen van Wilgenburg
Jeroen van Wilgenburg

๐Ÿ“– Jerome Russ
Jerome Russ

๐Ÿ› JerritEic
JerritEic

๐Ÿ’ป ๐Ÿ“– ๐Ÿ› Jiri Pejchal
Jiri Pejchal

๐Ÿ› Jithin Sunny
Jithin Sunny

๐Ÿ› Jiล™รญ ล korpil
Jiล™รญ ล korpil

๐Ÿ› - Joao Machado
Joao Machado

๐Ÿ› + Joao Machado
Joao Machado

๐Ÿ› Jochen Krauss
Jochen Krauss

๐Ÿ› Johan Hammar
Johan Hammar

๐Ÿ› John Karp
John Karp

๐Ÿ› John Zhang
John Zhang

๐Ÿ› John-Teng
John-Teng

๐Ÿ’ป ๐Ÿ› Jon Moroney
Jon Moroney

๐Ÿ’ป ๐Ÿ› - Jonas Geiregat
Jonas Geiregat

๐Ÿ› + Jonas Geiregat
Jonas Geiregat

๐Ÿ› Jonas KeรŸler
Jonas KeรŸler

๐Ÿ› Jonathan Wiesel
Jonathan Wiesel

๐Ÿ’ป ๐Ÿ› Jordan
Jordan

๐Ÿ› Jordi Llach
Jordi Llach

๐Ÿ› Jorge Solรณrzano
Jorge Solรณrzano

๐Ÿ› JorneVL
JorneVL

๐Ÿ› - Jose Palafox
Jose Palafox

๐Ÿ› + Jose Palafox
Jose Palafox

๐Ÿ› Jose Stovall
Jose Stovall

๐Ÿ› Joseph
Joseph

๐Ÿ’ป Joseph Heenan
Joseph Heenan

๐Ÿ› Josh Feingold
Josh Feingold

๐Ÿ’ป ๐Ÿ› Josh Holthaus
Josh Holthaus

๐Ÿ› Joshua S Arquilevich
Joshua S Arquilevich

๐Ÿ› - Joรฃo Dinis Ferreira
Joรฃo Dinis Ferreira

๐Ÿ“– + Joรฃo Dinis Ferreira
Joรฃo Dinis Ferreira

๐Ÿ“– Joรฃo Ferreira
Joรฃo Ferreira

๐Ÿ’ป ๐Ÿ› Joรฃo Pedro Schmitt
Joรฃo Pedro Schmitt

๐Ÿ› Juan Martรญn Sotuyo Dodero
Juan Martรญn Sotuyo Dodero

๐Ÿ’ป ๐Ÿ“– ๐Ÿ› ๐Ÿšง Juan Pablo Civile
Juan Pablo Civile

๐Ÿ› Julian Voronetsky
Julian Voronetsky

๐Ÿ› Julien
Julien

๐Ÿ› - Julius
Julius

๐Ÿ› + Julius
Julius

๐Ÿ› JustPRV
JustPRV

๐Ÿ› Justin Stroud
Justin Stroud

๐Ÿ’ป Jรถrn Huxhorn
Jรถrn Huxhorn

๐Ÿ› KThompso
KThompso

๐Ÿ› Kai Amundsen
Kai Amundsen

๐Ÿ› Karel Vervaeke
Karel Vervaeke

๐Ÿ› - Karl-Andero Mere
Karl-Andero Mere

๐Ÿ› + Karl-Andero Mere
Karl-Andero Mere

๐Ÿ› Karl-Philipp Richter
Karl-Philipp Richter

๐Ÿ› Karsten Silz
Karsten Silz

๐Ÿ› Kazuma Watanabe
Kazuma Watanabe

๐Ÿ› Kev
Kev

๐Ÿ› Keve Mรผller
Keve Mรผller

๐Ÿ› Kevin Guerra
Kevin Guerra

๐Ÿ’ป - Kevin Jones
Kevin Jones

๐Ÿ› ๐Ÿ’ป + Kevin Jones
Kevin Jones

๐Ÿ› ๐Ÿ’ป Kevin Poorman
Kevin Poorman

๐Ÿ› Kevin Wayne
Kevin Wayne

๐Ÿ› Kieran Black
Kieran Black

๐Ÿ› Kirill Zubov
Kirill Zubov

๐Ÿ› Kirk Clemens
Kirk Clemens

๐Ÿ’ป ๐Ÿ› Klaus Hartl
Klaus Hartl

๐Ÿ› - Koen Van Looveren
Koen Van Looveren

๐Ÿ› + Koen Van Looveren
Koen Van Looveren

๐Ÿ› Kris Scheibe
Kris Scheibe

๐Ÿ’ป ๐Ÿ› Krystian Dabrowski
Krystian Dabrowski

๐Ÿ› ๐Ÿ’ป Kunal Thanki
Kunal Thanki

๐Ÿ› LaLucid
LaLucid

๐Ÿ’ป Larry Diamond
Larry Diamond

๐Ÿ’ป ๐Ÿ› Lars Knickrehm
Lars Knickrehm

๐Ÿ› - Laurent Bovet
Laurent Bovet

๐Ÿ› ๐Ÿ’ป + Laurent Bovet
Laurent Bovet

๐Ÿ› ๐Ÿ’ป Leo Gutierrez
Leo Gutierrez

๐Ÿ› LiGaOg
LiGaOg

๐Ÿ’ป Liam Sharp
Liam Sharp

๐Ÿ› Lintsi
Lintsi

๐Ÿ› Linus Fernandes
Linus Fernandes

๐Ÿ› Lixon Lookose
Lixon Lookose

๐Ÿ› - Logesh
Logesh

๐Ÿ› + Logesh
Logesh

๐Ÿ› Lorenzo Gabriele
Lorenzo Gabriele

๐Ÿ› Loรฏc Ledoyen
Loรฏc Ledoyen

๐Ÿ› Lucas
Lucas

๐Ÿ› Lucas Silva
Lucas Silva

๐Ÿ› Lucas Soncini
Lucas Soncini

๐Ÿ’ป ๐Ÿ› Luis Alcantar
Luis Alcantar

๐Ÿ’ป - Lukas Grรคf
Lukas Grรคf

๐Ÿ’ป + Lukas Grรคf
Lukas Grรคf

๐Ÿ’ป Lukasz Slonina
Lukasz Slonina

๐Ÿ› Lukebray
Lukebray

๐Ÿ› Lynn
Lynn

๐Ÿ’ป ๐Ÿ› Lyor Goldstein
Lyor Goldstein

๐Ÿ› MCMicS
MCMicS

๐Ÿ› Macarse
Macarse

๐Ÿ› - Machine account for PMD
Machine account for PMD

๐Ÿ’ป + Machine account for PMD
Machine account for PMD

๐Ÿ’ป Maciek Siemczyk
Maciek Siemczyk

๐Ÿ› Maikel Steneker
Maikel Steneker

๐Ÿ’ป ๐Ÿ› Maksim Moiseikin
Maksim Moiseikin

๐Ÿ› Manfred Koch
Manfred Koch

๐Ÿ› Manuel Moya Ferrer
Manuel Moya Ferrer

๐Ÿ’ป ๐Ÿ› Manuel Ryan
Manuel Ryan

๐Ÿ› - Marat Vyshegorodtsev
Marat Vyshegorodtsev

๐Ÿ› + Marat Vyshegorodtsev
Marat Vyshegorodtsev

๐Ÿ› Marcel Hรคrle
Marcel Hรคrle

๐Ÿ› Marcello Fialho
Marcello Fialho

๐Ÿ› Marcin Dฤ…browski
Marcin Dฤ…browski

๐Ÿ’ป Marcin Rataj
Marcin Rataj

๐Ÿ› Marcono1234
Marcono1234

๐Ÿ› Mark Adamcin
Mark Adamcin

๐Ÿ› - Mark Hall
Mark Hall

๐Ÿ’ป ๐Ÿ› + Mark Hall
Mark Hall

๐Ÿ’ป ๐Ÿ› Mark Kolich
Mark Kolich

๐Ÿ› Mark Pritchard
Mark Pritchard

๐Ÿ› Markus Rathgeb
Markus Rathgeb

๐Ÿ› Marquis Wang
Marquis Wang

๐Ÿ› MartGit
MartGit

๐Ÿ› Martin Feldsztejn
Martin Feldsztejn

๐Ÿ› - Martin Lehmann
Martin Lehmann

๐Ÿ› + Martin Lehmann
Martin Lehmann

๐Ÿ› Martin Spamer
Martin Spamer

๐Ÿ› Martin Tarjรกnyi
Martin Tarjรกnyi

๐Ÿ› MatFl
MatFl

๐Ÿ› Mateusz Stefanski
Mateusz Stefanski

๐Ÿ› Mathieu Gouin
Mathieu Gouin

๐Ÿ› MatiasComercio
MatiasComercio

๐Ÿ’ป ๐Ÿ› - Matt Benson
Matt Benson

๐Ÿ› + Matt Benson
Matt Benson

๐Ÿ› Matt De Poorter
Matt De Poorter

๐Ÿ› Matt Hargett
Matt Hargett

๐Ÿ’ป ๐Ÿ’ต Matt Harrah
Matt Harrah

๐Ÿ› Matt Nelson
Matt Nelson

๐Ÿ› Matthew Amos
Matthew Amos

๐Ÿ› Matthew Duggan
Matthew Duggan

๐Ÿ› - Matthew Hall
Matthew Hall

๐Ÿ› + Matthew Hall
Matthew Hall

๐Ÿ› Matthew Rossner
Matthew Rossner

๐Ÿ› Matรญas Fraga
Matรญas Fraga

๐Ÿ’ป ๐Ÿ› Maxime Robert
Maxime Robert

๐Ÿ’ป ๐Ÿ› MetaBF
MetaBF

๐Ÿ› Metin Dagcilar
Metin Dagcilar

๐Ÿ› Michael
Michael

๐Ÿ› - Michael Bell
Michael Bell

๐Ÿ› + Michael Bell
Michael Bell

๐Ÿ› Michael Bernstein
Michael Bernstein

๐Ÿ› Michael Clay
Michael Clay

๐Ÿ› Michael Dombrowski
Michael Dombrowski

๐Ÿ› Michael Hausegger
Michael Hausegger

๐Ÿ› Michael Hoefer
Michael Hoefer

๐Ÿ› Michael Kolesnikov
Michael Kolesnikov

๐Ÿ› - Michael Mรถbius
Michael Mรถbius

๐Ÿ› + Michael Mรถbius
Michael Mรถbius

๐Ÿ› Michael N. Lipp
Michael N. Lipp

๐Ÿ› Michael Pellegrini
Michael Pellegrini

๐Ÿ› Michal Kordas
Michal Kordas

๐Ÿ› Michaล‚ Borek
Michaล‚ Borek

๐Ÿ› Michaล‚ Kuliล„ski
Michaล‚ Kuliล„ski

๐Ÿ› Miguel Nรบรฑez Dรญaz-Montes
Miguel Nรบรฑez Dรญaz-Montes

๐Ÿ› - Mihai Ionut
Mihai Ionut

๐Ÿ› + Mihai Ionut
Mihai Ionut

๐Ÿ› Mikhail Kuchma
Mikhail Kuchma

๐Ÿ› Mirek Hankus
Mirek Hankus

๐Ÿ› Mitch Spano
Mitch Spano

๐Ÿ› Mladjan Gadzic
Mladjan Gadzic

๐Ÿ› MrAngry52
MrAngry52

๐Ÿ› Muminur Choudhury
Muminur Choudhury

๐Ÿ› - Mykhailo Palahuta
Mykhailo Palahuta

๐Ÿ’ป ๐Ÿ› + Mykhailo Palahuta
Mykhailo Palahuta

๐Ÿ’ป ๐Ÿ› Nagendra Kumar Singh
Nagendra Kumar Singh

๐Ÿ› Nahuel Barrios
Nahuel Barrios

๐Ÿ› Nakul Sharma
Nakul Sharma

๐Ÿ› Nathan Braun
Nathan Braun

๐Ÿ› Nathan Reynolds
Nathan Reynolds

๐Ÿ› Nathan Reynolds
Nathan Reynolds

๐Ÿ› - Nathanaรซl
Nathanaรซl

๐Ÿ› + Nathanaรซl
Nathanaรซl

๐Ÿ› Naveen
Naveen

๐Ÿ’ป Nazdravi
Nazdravi

๐Ÿ› Neha-Dhonde
Neha-Dhonde

๐Ÿ› Nicholas Doyle
Nicholas Doyle

๐Ÿ› Nick Butcher
Nick Butcher

๐Ÿ› Nico Gallinal
Nico Gallinal

๐Ÿ› - Nicola Dal Maso
Nicola Dal Maso

๐Ÿ› + Nicola Dal Maso
Nicola Dal Maso

๐Ÿ› Nicolas Filotto
Nicolas Filotto

๐Ÿ’ป Nicolas Vervelle
Nicolas Vervelle

๐Ÿ› Nicolas Vuillamy
Nicolas Vuillamy

๐Ÿ“– Nikita Chursin
Nikita Chursin

๐Ÿ› Niklas Baudy
Niklas Baudy

๐Ÿ› Nikolas Havrikov
Nikolas Havrikov

๐Ÿ› - Nilesh Virkar
Nilesh Virkar

๐Ÿ› + Nilesh Virkar
Nilesh Virkar

๐Ÿ› Nimit Patel
Nimit Patel

๐Ÿ› Niranjan Harpale
Niranjan Harpale

๐Ÿ› Nirvik Patel
Nirvik Patel

๐Ÿ’ป Noah Sussman
Noah Sussman

๐Ÿ› Noah0120
Noah0120

๐Ÿ› Noam Tamim
Noam Tamim

๐Ÿ› - Noel Grandin
Noel Grandin

๐Ÿ› + Noel Grandin
Noel Grandin

๐Ÿ› Olaf Haalstra
Olaf Haalstra

๐Ÿ› Oleg Andreych
Oleg Andreych

๐Ÿ’ป ๐Ÿ› Oleg Pavlenko
Oleg Pavlenko

๐Ÿ› Oleksii Dykov
Oleksii Dykov

๐Ÿ’ป ๐Ÿ› Oliver Eikemeier
Oliver Eikemeier

๐Ÿ› Oliver Siegmar
Oliver Siegmar

๐Ÿ’ต - Olivier Parent
Olivier Parent

๐Ÿ’ป ๐Ÿ› + Olivier Parent
Olivier Parent

๐Ÿ’ป ๐Ÿ› Ollie Abbey
Ollie Abbey

๐Ÿ’ป ๐Ÿ› Ondrej Kratochvil
Ondrej Kratochvil

๐Ÿ› OverDrone
OverDrone

๐Ÿ› Ozan Gulle
Ozan Gulle

๐Ÿ’ป ๐Ÿ› PUNEET JAIN
PUNEET JAIN

๐Ÿ› Parbati Bose
Parbati Bose

๐Ÿ› - Paul Berg
Paul Berg

๐Ÿ› + Paul Berg
Paul Berg

๐Ÿ› Paul Guyot
Paul Guyot

๐Ÿ’ป Pavel Bludov
Pavel Bludov

๐Ÿ› Pavel Miฤka
Pavel Miฤka

๐Ÿ› Pedro Nuno Santos
Pedro Nuno Santos

๐Ÿ› Pedro Rijo
Pedro Rijo

๐Ÿ› Pelisse Romain
Pelisse Romain

๐Ÿ’ป ๐Ÿ“– ๐Ÿ› - Per Abich
Per Abich

๐Ÿ’ป + Per Abich
Per Abich

๐Ÿ’ป Pete Davids
Pete Davids

๐Ÿ› Peter Bruin
Peter Bruin

๐Ÿ› Peter Chittum
Peter Chittum

๐Ÿ’ป ๐Ÿ› Peter Cudmore
Peter Cudmore

๐Ÿ› Peter Kasson
Peter Kasson

๐Ÿ› Peter Kofler
Peter Kofler

๐Ÿ› - Peter Paul Bakker
Peter Paul Bakker

๐Ÿ’ป + Peter Paul Bakker
Peter Paul Bakker

๐Ÿ’ป Peter Rader
Peter Rader

๐Ÿ› Pham Hai Trung
Pham Hai Trung

๐Ÿ› Philip Graf
Philip Graf

๐Ÿ’ป ๐Ÿ› Philip Hachey
Philip Hachey

๐Ÿ› Philippe Ozil
Philippe Ozil

๐Ÿ› Phinehas Artemix
Phinehas Artemix

๐Ÿ› - Phokham Nonava
Phokham Nonava

๐Ÿ› + Phokham Nonava
Phokham Nonava

๐Ÿ› Pim van der Loos
Pim van der Loos

๐Ÿ’ป โš ๏ธ Piotr Szymaล„ski
Piotr Szymaล„ski

๐Ÿ› Piotrek ลปygieล‚o
Piotrek ลปygieล‚o

๐Ÿ’ป ๐Ÿ› ๐Ÿ“– Pranay Jaiswal
Pranay Jaiswal

๐Ÿ› Prasad Kamath
Prasad Kamath

๐Ÿ› Prasanna
Prasanna

๐Ÿ› - Presh-AR
Presh-AR

๐Ÿ› + Presh-AR
Presh-AR

๐Ÿ› Puneet1726
Puneet1726

๐Ÿ› RBRi
RBRi

๐Ÿ› Rafael Cortรชs
Rafael Cortรชs

๐Ÿ› RaheemShaik999
RaheemShaik999

๐Ÿ› RajeshR
RajeshR

๐Ÿ’ป ๐Ÿ› Ramachandra Mohan
Ramachandra Mohan

๐Ÿ› - Ramel0921
Ramel0921

๐Ÿ› + Ramel0921
Ramel0921

๐Ÿ› Raquel Pau
Raquel Pau

๐Ÿ› Ravikiran Janardhana
Ravikiran Janardhana

๐Ÿ› Reda Benhemmouche
Reda Benhemmouche

๐Ÿ› Reinhard Schiedermeier
Reinhard Schiedermeier

๐Ÿ› Renato Oliveira
Renato Oliveira

๐Ÿ’ป ๐Ÿ› Rich DiCroce
Rich DiCroce

๐Ÿ› - Richard Corfield
Richard Corfield

๐Ÿ’ป + Richard Corfield
Richard Corfield

๐Ÿ’ป Richard Corfield
Richard Corfield

๐Ÿ› ๐Ÿ’ป Riot R1cket
Riot R1cket

๐Ÿ› Rishabh Jain
Rishabh Jain

๐Ÿ› RishabhDeep Singh
RishabhDeep Singh

๐Ÿ› Rob Baillie
Rob Baillie

๐Ÿ› Robbie Martinus
Robbie Martinus

๐Ÿ’ป ๐Ÿ› - Robert Henry
Robert Henry

๐Ÿ› + Robert Henry
Robert Henry

๐Ÿ› Robert Mihaly
Robert Mihaly

๐Ÿ› Robert Painsi
Robert Painsi

๐Ÿ› Robert Russell
Robert Russell

๐Ÿ› Robert Sรถsemann
Robert Sรถsemann

๐Ÿ’ป ๐Ÿ“– ๐Ÿ“ข ๐Ÿ› Robert Whitebit
Robert Whitebit

๐Ÿ› Robin Richtsfeld
Robin Richtsfeld

๐Ÿ› - Robin Stocker
Robin Stocker

๐Ÿ’ป ๐Ÿ› + Robin Stocker
Robin Stocker

๐Ÿ’ป ๐Ÿ› Robin Wils
Robin Wils

๐Ÿ› RochusOest
RochusOest

๐Ÿ› Rodolfo Noviski
Rodolfo Noviski

๐Ÿ› Rodrigo Casara
Rodrigo Casara

๐Ÿ› Rodrigo Fernandes
Rodrigo Fernandes

๐Ÿ› Roman Salvador
Roman Salvador

๐Ÿ’ป ๐Ÿ› - Ronald Blaschke
Ronald Blaschke

๐Ÿ› + Ronald Blaschke
Ronald Blaschke

๐Ÿ› Rรณbert Papp
Rรณbert Papp

๐Ÿ› Saikat Sengupta
Saikat Sengupta

๐Ÿ› Saksham Handu
Saksham Handu

๐Ÿ› Saladoc
Saladoc

๐Ÿ› Salesforce Bob Lightning
Salesforce Bob Lightning

๐Ÿ› Sam Carlberg
Sam Carlberg

๐Ÿ› - Sascha Riemer
Sascha Riemer

๐Ÿ› + Sascha Riemer
Sascha Riemer

๐Ÿ› Sashko
Sashko

๐Ÿ’ป Satoshi Kubo
Satoshi Kubo

๐Ÿ› Scott Kennedy
Scott Kennedy

๐Ÿ› Scott Wells
Scott Wells

๐Ÿ› ๐Ÿ’ป Scrates1
Scrates1

๐Ÿ› ๐Ÿ’ป Scrsloota
Scrsloota

๐Ÿ’ป - Sebastian Bรถgl
Sebastian Bรถgl

๐Ÿ› + Sebastian Bรถgl
Sebastian Bรถgl

๐Ÿ› Sebastian Davids
Sebastian Davids

๐Ÿ› Sebastian Schuberth
Sebastian Schuberth

๐Ÿ› Sebastian Schwarz
Sebastian Schwarz

๐Ÿ› Seren
Seren

๐Ÿ› ๐Ÿ’ป Sergey Gorbaty
Sergey Gorbaty

๐Ÿ› Sergey Kozlov
Sergey Kozlov

๐Ÿ› - Sergey Yanzin
Sergey Yanzin

๐Ÿ’ป ๐Ÿ› + Sergey Yanzin
Sergey Yanzin

๐Ÿ’ป ๐Ÿ› Seth Wilcox
Seth Wilcox

๐Ÿ’ป Shai Bennathan
Shai Bennathan

๐Ÿ› ๐Ÿ’ป Shubham
Shubham

๐Ÿ’ป ๐Ÿ› Simon Abykov
Simon Abykov

๐Ÿ’ป ๐Ÿ› Simon Xiao
Simon Xiao

๐Ÿ› Srinivasan Venkatachalam
Srinivasan Venkatachalam

๐Ÿ› - Stanislav Gromov
Stanislav Gromov

๐Ÿ› + Stanislav Gromov
Stanislav Gromov

๐Ÿ› Stanislav Myachenkov
Stanislav Myachenkov

๐Ÿ’ป Stefan Birkner
Stefan Birkner

๐Ÿ› Stefan Bohn
Stefan Bohn

๐Ÿ› Stefan Endrullis
Stefan Endrullis

๐Ÿ› Stefan Klรถss-Schuster
Stefan Klรถss-Schuster

๐Ÿ› Stefan Wolf
Stefan Wolf

๐Ÿ› - Stephan H. Wissel
Stephan H. Wissel

๐Ÿ› + Stephan H. Wissel
Stephan H. Wissel

๐Ÿ› Stephen
Stephen

๐Ÿ› Stephen Carter
Stephen Carter

๐Ÿ› Stephen Friedrich
Stephen Friedrich

๐Ÿ› Steve Babula
Steve Babula

๐Ÿ’ป Steven Stearns
Steven Stearns

๐Ÿ› ๐Ÿ’ป Stexxe
Stexxe

๐Ÿ› - Stian Lรฅgstad
Stian Lรฅgstad

๐Ÿ› + Stian Lรฅgstad
Stian Lรฅgstad

๐Ÿ› StuartClayton5
StuartClayton5

๐Ÿ› Supun Arunoda
Supun Arunoda

๐Ÿ› Suren Abrahamyan
Suren Abrahamyan

๐Ÿ› Suvashri
Suvashri

๐Ÿ“– SwatiBGupta1110
SwatiBGupta1110

๐Ÿ› SyedThoufich
SyedThoufich

๐Ÿ› - Szymon Sasin
Szymon Sasin

๐Ÿ› + Szymon Sasin
Szymon Sasin

๐Ÿ› T-chuangxin
T-chuangxin

๐Ÿ› TERAI Atsuhiro
TERAI Atsuhiro

๐Ÿ› TIOBE Software
TIOBE Software

๐Ÿ’ป ๐Ÿ› Tarush Singh
Tarush Singh

๐Ÿ’ป Taylor Smock
Taylor Smock

๐Ÿ› Techeira Damiรกn
Techeira Damiรกn

๐Ÿ’ป ๐Ÿ› - Ted Husted
Ted Husted

๐Ÿ› + Ted Husted
Ted Husted

๐Ÿ› TehBakker
TehBakker

๐Ÿ› The Gitter Badger
The Gitter Badger

๐Ÿ› Theodoor
Theodoor

๐Ÿ› Thiago Henrique Hรผpner
Thiago Henrique Hรผpner

๐Ÿ› Thibault Meyer
Thibault Meyer

๐Ÿ› Thomas Gรผttler
Thomas Gรผttler

๐Ÿ› - Thomas Jones-Low
Thomas Jones-Low

๐Ÿ› + Thomas Jones-Low
Thomas Jones-Low

๐Ÿ› Thomas Smith
Thomas Smith

๐Ÿ’ป ๐Ÿ› ThrawnCA
ThrawnCA

๐Ÿ› Thu Vo
Thu Vo

๐Ÿ› Thunderforge
Thunderforge

๐Ÿ’ป ๐Ÿ› Tim van der Lippe
Tim van der Lippe

๐Ÿ› Tobias Weimer
Tobias Weimer

๐Ÿ’ป ๐Ÿ› - Tom Copeland
Tom Copeland

๐Ÿ› ๐Ÿ’ป ๐Ÿ“– + Tom Copeland
Tom Copeland

๐Ÿ› ๐Ÿ’ป ๐Ÿ“– Tom Daly
Tom Daly

๐Ÿ› Tomas
Tomas

๐Ÿ› Tomer Figenblat
Tomer Figenblat

๐Ÿ› Tomi De Lucca
Tomi De Lucca

๐Ÿ’ป ๐Ÿ› Tony
Tony

๐Ÿ“– Torsten Kleiber
Torsten Kleiber

๐Ÿ› - TrackerSB
TrackerSB

๐Ÿ› + TrackerSB
TrackerSB

๐Ÿ› Tyson Stewart
Tyson Stewart

๐Ÿ› Ullrich Hafner
Ullrich Hafner

๐Ÿ› Utku Cuhadaroglu
Utku Cuhadaroglu

๐Ÿ’ป ๐Ÿ› Valentin Brandl
Valentin Brandl

๐Ÿ› Valeria
Valeria

๐Ÿ› Valery Yatsynovich
Valery Yatsynovich

๐Ÿ“– - Vasily Anisimov
Vasily Anisimov

๐Ÿ› + Vasily Anisimov
Vasily Anisimov

๐Ÿ› Vedant Chokshi
Vedant Chokshi

๐Ÿ› Vibhor Goyal
Vibhor Goyal

๐Ÿ› Vickenty Fesunov
Vickenty Fesunov

๐Ÿ› Victor Noรซl
Victor Noรซl

๐Ÿ› Vincent Galloy
Vincent Galloy

๐Ÿ’ป Vincent HUYNH
Vincent HUYNH

๐Ÿ› - Vincent Maurin
Vincent Maurin

๐Ÿ› + Vincent Maurin
Vincent Maurin

๐Ÿ› Vincent Privat
Vincent Privat

๐Ÿ› Vishhwas
Vishhwas

๐Ÿ› Vishv_Android
Vishv_Android

๐Ÿ› Vitaly
Vitaly

๐Ÿ› Vitaly Polonetsky
Vitaly Polonetsky

๐Ÿ› Vojtech Polivka
Vojtech Polivka

๐Ÿ› - Vsevolod Zholobov
Vsevolod Zholobov

๐Ÿ› + Vsevolod Zholobov
Vsevolod Zholobov

๐Ÿ› Vyom Yadav
Vyom Yadav

๐Ÿ’ป Wang Shidong
Wang Shidong

๐Ÿ› Waqas Ahmed
Waqas Ahmed

๐Ÿ› Wayne J. Earl
Wayne J. Earl

๐Ÿ› Wchenghui
Wchenghui

๐Ÿ› Wener
Wener

๐Ÿ’ป - Will Winder
Will Winder

๐Ÿ› + Will Winder
Will Winder

๐Ÿ› + Willem A. Hajenius
Willem A. Hajenius

๐Ÿ’ป William Brockhus
William Brockhus

๐Ÿ’ป ๐Ÿ› Wilson Kurniawan
Wilson Kurniawan

๐Ÿ› Wim Deblauwe
Wim Deblauwe

๐Ÿ› Woongsik Choi
Woongsik Choi

๐Ÿ› XenoAmess
XenoAmess

๐Ÿ’ป ๐Ÿ› - Yang
Yang

๐Ÿ’ป - YaroslavTER
YaroslavTER

๐Ÿ› + Yang
Yang

๐Ÿ’ป + YaroslavTER
YaroslavTER

๐Ÿ› Yasar Shaikh
Yasar Shaikh

๐Ÿ’ป Young Chan
Young Chan

๐Ÿ’ป ๐Ÿ› YuJin Kim
YuJin Kim

๐Ÿ› Yuri Dolzhenko
Yuri Dolzhenko

๐Ÿ› Yurii Dubinka
Yurii Dubinka

๐Ÿ› - Zoltan Farkas
Zoltan Farkas

๐Ÿ› - Zustin
Zustin

๐Ÿ› + Zoltan Farkas
Zoltan Farkas

๐Ÿ› + Zustin
Zustin

๐Ÿ› aaronhurst-google
aaronhurst-google

๐Ÿ› ๐Ÿ’ป alexmodis
alexmodis

๐Ÿ› andreoss
andreoss

๐Ÿ› andrey81inmd
andrey81inmd

๐Ÿ’ป ๐Ÿ› anicoara
anicoara

๐Ÿ› - arunprasathav
arunprasathav

๐Ÿ› - asiercamara
asiercamara

๐Ÿ› + arunprasathav
arunprasathav

๐Ÿ› + asiercamara
asiercamara

๐Ÿ› astillich-igniti
astillich-igniti

๐Ÿ’ป avesolovksyy
avesolovksyy

๐Ÿ› avishvat
avishvat

๐Ÿ› avivmu
avivmu

๐Ÿ› axelbarfod1
axelbarfod1

๐Ÿ› - b-3-n
b-3-n

๐Ÿ› - balbhadra9
balbhadra9

๐Ÿ› + b-3-n
b-3-n

๐Ÿ› + balbhadra9
balbhadra9

๐Ÿ› base23de
base23de

๐Ÿ› bergander
bergander

๐Ÿ› ๐Ÿ’ป berkam
berkam

๐Ÿ’ป ๐Ÿ› breizh31
breizh31

๐Ÿ› caesarkim
caesarkim

๐Ÿ› - carolyujing
carolyujing

๐Ÿ› - cbfiddle
cbfiddle

๐Ÿ› + carolyujing
carolyujing

๐Ÿ› + cbfiddle
cbfiddle

๐Ÿ› cesares-basilico
cesares-basilico

๐Ÿ› chrite
chrite

๐Ÿ› ciufudean
ciufudean

๐Ÿ“– cobratbq
cobratbq

๐Ÿ› coladict
coladict

๐Ÿ› - cosmoJFH
cosmoJFH

๐Ÿ› - cristalp
cristalp

๐Ÿ› + cosmoJFH
cosmoJFH

๐Ÿ› + cristalp
cristalp

๐Ÿ› crunsk
crunsk

๐Ÿ› cwholmes
cwholmes

๐Ÿ› cyberjj999
cyberjj999

๐Ÿ› cyw3
cyw3

๐Ÿ› ๐Ÿ“– d1ss0nanz
d1ss0nanz

๐Ÿ› - dague1
dague1

๐Ÿ“– - dalizi007
dalizi007

๐Ÿ’ป + dague1
dague1

๐Ÿ“– + dalizi007
dalizi007

๐Ÿ’ป danbrycefairsailcom
danbrycefairsailcom

๐Ÿ› dariansanity
dariansanity

๐Ÿ› darrenmiliband
darrenmiliband

๐Ÿ› davidburstrom
davidburstrom

๐Ÿ› dbirkman-paloalto
dbirkman-paloalto

๐Ÿ› - deepak-patra
deepak-patra

๐Ÿ› - dependabot[bot]
dependabot[bot]

๐Ÿ’ป ๐Ÿ› + deepak-patra
deepak-patra

๐Ÿ› + dependabot[bot]
dependabot[bot]

๐Ÿ’ป ๐Ÿ› dinesh150
dinesh150

๐Ÿ› diziaq
diziaq

๐Ÿ› dreaminpast123
dreaminpast123

๐Ÿ› duanyanan
duanyanan

๐Ÿ› dutt-sanjay
dutt-sanjay

๐Ÿ› - duursma
duursma

๐Ÿ’ป - dylanleung
dylanleung

๐Ÿ› + duursma
duursma

๐Ÿ’ป + dylanleung
dylanleung

๐Ÿ› dzeigler
dzeigler

๐Ÿ› eant60
eant60

๐Ÿ› ekkirala
ekkirala

๐Ÿ› emersonmoura
emersonmoura

๐Ÿ› emouty
emouty

๐Ÿ’ป ๐Ÿ› - eugenepugach
eugenepugach

๐Ÿ› - fairy
fairy

๐Ÿ› + eugenepugach
eugenepugach

๐Ÿ› + fairy
fairy

๐Ÿ› filiprafalowicz
filiprafalowicz

๐Ÿ’ป flxbl-io
flxbl-io

๐Ÿ’ต foxmason
foxmason

๐Ÿ› frankegabor
frankegabor

๐Ÿ› frankl
frankl

๐Ÿ› - freafrea
freafrea

๐Ÿ› - fsapatin
fsapatin

๐Ÿ› + freafrea
freafrea

๐Ÿ› + fsapatin
fsapatin

๐Ÿ› gearsethenry
gearsethenry

๐Ÿ› gracia19
gracia19

๐Ÿ› gudzpoz
gudzpoz

๐Ÿ› guo fei
guo fei

๐Ÿ› gurmsc5
gurmsc5

๐Ÿ› - gwilymatgearset
gwilymatgearset

๐Ÿ’ป ๐Ÿ› - haigsn
haigsn

๐Ÿ› + gwilymatgearset
gwilymatgearset

๐Ÿ’ป ๐Ÿ› + haigsn
haigsn

๐Ÿ› hemanshu070
hemanshu070

๐Ÿ› henrik242
henrik242

๐Ÿ› hongpuwu
hongpuwu

๐Ÿ› hvbtup
hvbtup

๐Ÿ’ป ๐Ÿ› igniti GmbH
igniti GmbH

๐Ÿ› - ilovezfs
ilovezfs

๐Ÿ› - imax-erik
imax-erik

๐Ÿ› + ilovezfs
ilovezfs

๐Ÿ› + imax-erik
imax-erik

๐Ÿ› itaigilo
itaigilo

๐Ÿ› jakivey32
jakivey32

๐Ÿ› jbennett2091
jbennett2091

๐Ÿ› jcamerin
jcamerin

๐Ÿ› jkeener1
jkeener1

๐Ÿ› - jmetertea
jmetertea

๐Ÿ› - johnra2
johnra2

๐Ÿ’ป + jmetertea
jmetertea

๐Ÿ› + johnra2
johnra2

๐Ÿ’ป johnzhao9
johnzhao9

๐Ÿ› josemanuelrolon
josemanuelrolon

๐Ÿ’ป ๐Ÿ› kabroxiko
kabroxiko

๐Ÿ’ป ๐Ÿ› karthikaiyasamy
karthikaiyasamy

๐Ÿ“– karwer
karwer

๐Ÿ› - kaulonline
kaulonline

๐Ÿ› - kdaemonv
kdaemonv

๐Ÿ› + kaulonline
kaulonline

๐Ÿ› + kdaemonv
kdaemonv

๐Ÿ› kdebski85
kdebski85

๐Ÿ› ๐Ÿ’ป kenji21
kenji21

๐Ÿ’ป ๐Ÿ› kfranic
kfranic

๐Ÿ› khalidkh
khalidkh

๐Ÿ› koalalam
koalalam

๐Ÿ› - krzyk
krzyk

๐Ÿ› - lasselindqvist
lasselindqvist

๐Ÿ› + krzyk
krzyk

๐Ÿ› + lasselindqvist
lasselindqvist

๐Ÿ› lgemeinhardt
lgemeinhardt

๐Ÿ› lihuaib
lihuaib

๐Ÿ› liqingjun123
liqingjun123

๐Ÿ› lonelyma1021
lonelyma1021

๐Ÿ› lpeddy
lpeddy

๐Ÿ› - lujiefsi
lujiefsi

๐Ÿ’ป - lukelukes
lukelukes

๐Ÿ’ป + lujiefsi
lujiefsi

๐Ÿ’ป + lukelukes
lukelukes

๐Ÿ’ป lyriccoder
lyriccoder

๐Ÿ› marcelmore
marcelmore

๐Ÿ› matchbox
matchbox

๐Ÿ› matthiaskraaz
matthiaskraaz

๐Ÿ› meandonlyme
meandonlyme

๐Ÿ› - mikesive
mikesive

๐Ÿ› - milossesic
milossesic

๐Ÿ› + mikesive
mikesive

๐Ÿ› + milossesic
milossesic

๐Ÿ› mluckam
mluckam

๐Ÿ’ป ๐Ÿ› mohan-chinnappan-n
mohan-chinnappan-n

๐Ÿ’ป mriddell95
mriddell95

๐Ÿ› mrlzh
mrlzh

๐Ÿ› msloan
msloan

๐Ÿ› - mucharlaravalika
mucharlaravalika

๐Ÿ› - mvenneman
mvenneman

๐Ÿ› + mucharlaravalika
mucharlaravalika

๐Ÿ› + mvenneman
mvenneman

๐Ÿ› nareshl119
nareshl119

๐Ÿ› nicolas-harraudeau-sonarsource
nicolas-harraudeau-sonarsource

๐Ÿ› noerremark
noerremark

๐Ÿ› novsirion
novsirion

๐Ÿ› nwcm
nwcm

๐Ÿ“– ๐Ÿ› ๐Ÿ’ป - oggboy
oggboy

๐Ÿ› - oinume
oinume

๐Ÿ› + oggboy
oggboy

๐Ÿ› + oinume
oinume

๐Ÿ› orimarko
orimarko

๐Ÿ’ป ๐Ÿ› pablogomez2197
pablogomez2197

๐Ÿ› pacvz
pacvz

๐Ÿ’ป pallavi agarwal
pallavi agarwal

๐Ÿ› parksungrin
parksungrin

๐Ÿ› - patpatpat123
patpatpat123

๐Ÿ› - patriksevallius
patriksevallius

๐Ÿ› + patpatpat123
patpatpat123

๐Ÿ› + patriksevallius
patriksevallius

๐Ÿ› pbrajesh1
pbrajesh1

๐Ÿ› phoenix384
phoenix384

๐Ÿ› piotrszymanski-sc
piotrszymanski-sc

๐Ÿ’ป plan3d
plan3d

๐Ÿ› poojasix
poojasix

๐Ÿ› - prabhushrikant
prabhushrikant

๐Ÿ› - pujitha8783
pujitha8783

๐Ÿ› + prabhushrikant
prabhushrikant

๐Ÿ› + pujitha8783
pujitha8783

๐Ÿ› r-r-a-j
r-r-a-j

๐Ÿ› raghujayjunk
raghujayjunk

๐Ÿ› rajeshveera
rajeshveera

๐Ÿ› rajeswarreddy88
rajeswarreddy88

๐Ÿ› recdevs
recdevs

๐Ÿ› - reudismam
reudismam

๐Ÿ’ป ๐Ÿ› - rijkt
rijkt

๐Ÿ› + reudismam
reudismam

๐Ÿ’ป ๐Ÿ› + rijkt
rijkt

๐Ÿ› rillig-tk
rillig-tk

๐Ÿ› rmohan20
rmohan20

๐Ÿ’ป ๐Ÿ› rnveach
rnveach

๐Ÿ› rxmicro
rxmicro

๐Ÿ› ryan-gustafson
ryan-gustafson

๐Ÿ’ป ๐Ÿ› - sabi0
sabi0

๐Ÿ› - scais
scais

๐Ÿ› + sabi0
sabi0

๐Ÿ› + scais
scais

๐Ÿ› schosin
schosin

๐Ÿ› screamingfrog
screamingfrog

๐Ÿ’ต sebbASF
sebbASF

๐Ÿ› sergeygorbaty
sergeygorbaty

๐Ÿ’ป shilko2013
shilko2013

๐Ÿ› - shiomiyan
shiomiyan

๐Ÿ“– - simeonKondr
simeonKondr

๐Ÿ› + shiomiyan
shiomiyan

๐Ÿ“– + simeonKondr
simeonKondr

๐Ÿ› snajberk
snajberk

๐Ÿ› sniperrifle2004
sniperrifle2004

๐Ÿ› snuyanzin
snuyanzin

๐Ÿ› ๐Ÿ’ป soloturn
soloturn

๐Ÿ› soyodream
soyodream

๐Ÿ› - sratz
sratz

๐Ÿ› - stonio
stonio

๐Ÿ› + sratz
sratz

๐Ÿ› + stonio
stonio

๐Ÿ› sturton
sturton

๐Ÿ’ป ๐Ÿ› sudharmohan
sudharmohan

๐Ÿ› suruchidawar
suruchidawar

๐Ÿ› svenfinitiv
svenfinitiv

๐Ÿ› szymanp23
szymanp23

๐Ÿ› ๐Ÿ’ป - tashiscool
tashiscool

๐Ÿ› - test-git-hook
test-git-hook

๐Ÿ› + tashiscool
tashiscool

๐Ÿ› + test-git-hook
test-git-hook

๐Ÿ› testation21
testation21

๐Ÿ’ป ๐Ÿ› thanosa
thanosa

๐Ÿ› tiandiyixian
tiandiyixian

๐Ÿ› tobwoerk
tobwoerk

๐Ÿ› tprouvot
tprouvot

๐Ÿ› ๐Ÿ’ป - trentchilders
trentchilders

๐Ÿ› - triandicAnt
triandicAnt

๐Ÿ› + trentchilders
trentchilders

๐Ÿ› + triandicAnt
triandicAnt

๐Ÿ› trishul14
trishul14

๐Ÿ› tsui
tsui

๐Ÿ› wangzitom12306
wangzitom12306

๐Ÿ› winhkey
winhkey

๐Ÿ› witherspore
witherspore

๐Ÿ› - wjljack
wjljack

๐Ÿ› - wuchiuwong
wuchiuwong

๐Ÿ› + wjljack
wjljack

๐Ÿ› + wuchiuwong
wuchiuwong

๐Ÿ› xingsong
xingsong

๐Ÿ› xioayuge
xioayuge

๐Ÿ› xnYi9wRezm
xnYi9wRezm

๐Ÿ’ป ๐Ÿ› xuanuy
xuanuy

๐Ÿ› xyf0921
xyf0921

๐Ÿ› - yalechen-cyw3
yalechen-cyw3

๐Ÿ› - yasuharu-sato
yasuharu-sato

๐Ÿ› + yalechen-cyw3
yalechen-cyw3

๐Ÿ› + yasuharu-sato
yasuharu-sato

๐Ÿ› zenglian
zenglian

๐Ÿ› zgrzyt93
zgrzyt93

๐Ÿ’ป ๐Ÿ› zh3ng
zh3ng

๐Ÿ› zt_soft
zt_soft

๐Ÿ› ztt79
ztt79

๐Ÿ› - zzzzfeng
zzzzfeng

๐Ÿ› - รrpรกd Magosรกnyi
รrpรกd Magosรกnyi

๐Ÿ› + zzzzfeng
zzzzfeng

๐Ÿ› + รrpรกd Magosรกnyi
รrpรกd Magosรกnyi

๐Ÿ› ไปป่ดตๆฐ
ไปป่ดตๆฐ

๐Ÿ› ่Œ…ๅปถๅฎ‰
่Œ…ๅปถๅฎ‰

๐Ÿ’ป From 32f55e22e3df43e3442b8077752d404b2f18eea2 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 14 Nov 2024 19:18:11 +0100 Subject: [PATCH 11/11] [doc] Update release notes (#5329, #5330) --- docs/pages/release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 5fa3ac04b6..44f31cb3cc 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -20,6 +20,7 @@ This is a {{ site.pmd.release_type }} release. * java * [#5293](https://github.com/pmd/pmd/issues/5293): \[java] Deadlock when executing PMD in multiple threads * [#5324](https://github.com/pmd/pmd/issues/5324): \[java] Issue with type inference of nested lambdas + * [#5329](https://github.com/pmd/pmd/issues/5329): \[java] Type inference issue with unknown method ref in call chain ### ๐Ÿšจ API Changes