From 65fef39a4cbf5ea6b74d8d4b15c3f01a4dd06a52 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Mon, 25 Jul 2022 21:43:54 -0700 Subject: [PATCH 01/55] Initial Lua type grammar --- .../sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 77 +++++++++++++++++-- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index 59c0b86a60..12773b012a 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -71,12 +71,13 @@ chunk ; block - : stat* laststat? + : (stat ';'?)* (laststat ';'?)? ; stat : ';' | varlist '=' explist + | var compoundop exp | functioncall | label | 'break' @@ -85,11 +86,12 @@ stat | 'while' exp 'do' block 'end' | 'repeat' block 'until' exp | 'if' exp 'then' block ('elseif' exp 'then' block)* ('else' block)? 'end' - | 'for' NAME '=' exp ',' exp (',' exp)? 'do' block 'end' - | 'for' namelist 'in' explist 'do' block 'end' + | 'for' binding '=' exp ',' exp (',' exp)? 'do' block 'end' + | 'for' bindinglist 'in' explist 'do' block 'end' | 'function' funcname funcbody | 'local' 'function' NAME funcbody - | 'local' attnamelist ('=' explist)? + | 'local' bindinglist ('=' explist)? + | ('export')? 'type' NAME ('<' GenericTypeParameterList '>')? '=' Type ; attnamelist @@ -101,7 +103,7 @@ attrib ; laststat - : 'return' explist? | 'break' | 'continue' ';'? + : 'return' explist? | 'break' | 'continue' ; label @@ -120,6 +122,12 @@ namelist : NAME (',' NAME)* ; +binding + : NAME (':' Type ('?')?)? + ; + +bindinglist: binding (',' bindinglist)?; + explist : (exp ',')* exp ; @@ -131,6 +139,7 @@ exp | '...' | functiondef | prefixexp + | ifelseexp | tableconstructor | exp operatorPower exp | operatorUnary exp @@ -143,6 +152,8 @@ exp | exp operatorBitwise exp ; +ifelseexp: 'if' exp 'then' exp ('elseif' exp 'then' exp)* 'else' exp; + prefixexp : varOrExp nameAndArgs* ; @@ -176,7 +187,7 @@ functiondef ; funcbody - : '(' parlist? ')' block 'end' + : ('<' NAME '>')? '(' parlist? ')' block (':' '...'? NAME ) 'end' // GenericTypeParameterList and ReturnType ; parlist @@ -199,6 +210,8 @@ fieldsep : ',' | ';' ; +compoundop: '+=' | '-=' | '*=' | '/=' | '%=' | '^=' | '..='; + operatorOr : 'or'; @@ -234,6 +247,58 @@ string : NORMALSTRING | CHARSTRING | LONGSTRING ; +SimpleType + : 'nil' + | SingletonType + | NAME /* ('.' NAME)? */ ('<' TypeParams '>')? + | 'typeof' '(' NAME ('(' ')')? | '...' ')' // can't use `exp`, manually handle common cases + | TableType + | FunctionType + ; + +SingletonType + : NORMALSTRING | CHARSTRING + | 'true' + | 'false' + ; + +Type + : SimpleType ('?')? + | SimpleType ('?')? ('|' Type) // can't use Type because it's mutually left-recursive + | SimpleType ('?')? ('&' Type) // can't use Type because it's mutually left-recursive + ; + +GenericTypePackParameter: NAME '...' ('=' (('(' (TypeList)? ')') | VariadicTypePack | GenericTypePack))?; // TypePack must be inlined here + +GenericTypeParameterList: NAME ('=' Type)? (',' GenericTypeParameterList)? | GenericTypePackParameter (',' GenericTypePackParameter)*; + +TypeList: Type (',' Type)? | VariadicTypePack; + +TypeParams: (Type | VariadicTypePack | GenericTypePack) (',' TypeParams)?; // had to remove TypePack + +// TypePack: + +GenericTypePack: NAME '...'; + +VariadicTypePack: '...' Type; + +ReturnType: Type | '(' Type ',' Type ')' | '(' ')'; // can't use TypePack, inline common cases + +TableIndexer: '[' Type ']' ':' Type; + +TableProp: NAME ':' Type; + +TablePropOrIndexer + : TableProp | TableIndexer; + +PropList + : TablePropOrIndexer ((','|';') TablePropOrIndexer)* (','|';')?; + +TableType + : '{' PropList '}'; + +FunctionType: ('<' GenericTypeParameterList '>')? '(' (TypeList)? ')' '->' (Type | '(' ')' | '(' (TypeList) ')'); // inline ReturnType to avoid greediness + // LEXER NAME From 8aaa1302cccf913c3658f207f137bd9c05367749 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Tue, 26 Jul 2022 00:13:35 -0700 Subject: [PATCH 02/55] Support all Luau type extension syntax available in all test corpus sources. Add a regression test for a few of the things that required tweaks. --- .../sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 80 ++++--- .../sourceforge/pmd/cpd/LuaTokenizerTest.java | 5 + .../lang/lua/cpd/testdata/regressionTest.lua | 24 +++ .../lang/lua/cpd/testdata/regressionTest.txt | 203 ++++++++++++++++++ 4 files changed, 271 insertions(+), 41 deletions(-) create mode 100644 pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua create mode 100644 pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index 12773b012a..62ac80363d 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -102,20 +102,28 @@ attrib : ('<' NAME '>')? ; -laststat - : 'return' explist? | 'break' | 'continue' - ; - label : '::' NAME '::' ; +laststat + : 'return' explist? | 'break' | 'continue' + ; + funcname : NAME ('.' NAME)* (':' NAME)? ; -varlist - : var (',' var)* +funcbody + : ('<' GenericTypeParameterList '>')? '(' parlist? ')' (':' '...'? ReturnType ) block 'end' // GenericTypeParameterList and ReturnType + ; + +parlist + : bindinglist (',' '...')? | '...' + ; + +explist + : (exp ',')* exp ; namelist @@ -128,32 +136,14 @@ binding bindinglist: binding (',' bindinglist)?; -explist - : (exp ',')* exp +var + : (NAME | '(' exp ')' varSuffix) varSuffix* ; -exp - : 'nil' | 'false' | 'true' - | number - | string - | '...' - | functiondef - | prefixexp - | ifelseexp - | tableconstructor - | exp operatorPower exp - | operatorUnary exp - | exp operatorMulDivMod exp - | exp operatorAddSub exp - | exp operatorStrcat exp - | exp operatorComparison exp - | exp operatorAnd exp - | exp operatorOr exp - | exp operatorBitwise exp +varlist + : var (',' var)* ; -ifelseexp: 'if' exp 'then' exp ('elseif' exp 'then' exp)* 'else' exp; - prefixexp : varOrExp nameAndArgs* ; @@ -162,12 +152,26 @@ functioncall : varOrExp nameAndArgs+ ; -varOrExp - : var | '(' exp ')' +exp + : (asexp | operatorUnary exp) ( binop exp )* ; -var - : (NAME | '(' exp ')' varSuffix) varSuffix* +ifelseexp: 'if' exp 'then' exp ('elseif' exp 'then' exp)* 'else' exp; + +asexp: simpleexp ('::' Type)?; + +simpleexp + : 'nil' | 'false' | 'true' + | number + | string + | '...' + | 'function' funcbody + | prefixexp + | ifelseexp + | tableconstructor; + +varOrExp + : var | '(' exp ')' ; varSuffix @@ -186,14 +190,6 @@ functiondef : 'function' funcbody ; -funcbody - : ('<' NAME '>')? '(' parlist? ')' block (':' '...'? NAME ) 'end' // GenericTypeParameterList and ReturnType - ; - -parlist - : namelist (',' '...')? | '...' - ; - tableconstructor : '{' fieldlist? '}' ; @@ -212,6 +208,8 @@ fieldsep compoundop: '+=' | '-=' | '*=' | '/=' | '%=' | '^=' | '..='; +binop: operatorAddSub | operatorMulDivMod | operatorPower | operatorStrcat | operatorComparison | operatorAnd | operatorOr | operatorBitwise; + operatorOr : 'or'; @@ -276,7 +274,7 @@ TypeList: Type (',' Type)? | VariadicTypePack; TypeParams: (Type | VariadicTypePack | GenericTypePack) (',' TypeParams)?; // had to remove TypePack -// TypePack: +// TypePack: inlined everywhere to avoid overly greedy match when out-of-context GenericTypePack: NAME '...'; diff --git a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java index 76d18a3ffa..ccbd16450d 100644 --- a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java +++ b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java @@ -39,4 +39,9 @@ public class LuaTokenizerTest extends CpdTextComparisonTest { public void testTabWidth() { doTest("tabWidth"); } + + @Test + public void testRegression() { + doTest("regressionTest"); + } } diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua new file mode 100644 index 0000000000..6b46463859 --- /dev/null +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua @@ -0,0 +1,24 @@ +--!strict +type Array = { T } +local x = 31337 +local _negativeLiteral = -3 +local _negativeVariable = -x +local _notLiteral = not true +local _notVariable = not x +local _length = #{x} +export type Function = (...any) -> T... + +return function (req, ...: boolean): ({[string|number]: any}, string, Function<...any>) + local body = string.format("%s %s\n", req.method, req.path) + local res = { + code = 200, + { "Content-Type", "text/plain" }, + { "Content-Length", #body } :: Array, + } :: { [any]: number | Array } + if req.keepAlive then + res[#res + 1] = { "Connection", "Keep-Alive" } + res[#res + 2] = { ... } + end + + return res, body, function(...): ...any return ... end +end \ No newline at end of file diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt new file mode 100644 index 0000000000..f02a9b767c --- /dev/null +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt @@ -0,0 +1,203 @@ + [Image] or [Truncated image[ Bcol Ecol +L2 + [type] 1 4 + [Array] 6 10 + [<] 11 11 + [T] 12 12 + [=] 14 14 + [any] 16 18 + [>] 19 19 + [=] 21 21 + [{] 23 23 + [T] 25 25 + [}] 27 27 +L3 + [local] 1 5 + [x] 7 7 + [=] 9 9 + [31337] 11 15 +L4 + [local] 1 5 + [_negativeLiteral] 7 22 + [=] 24 24 + [-] 26 26 + [3] 27 27 +L5 + [local] 1 5 + [_negativeVariable] 7 23 + [=] 25 25 + [-] 27 27 + [x] 28 28 +L6 + [local] 1 5 + [_notLiteral] 7 17 + [=] 19 19 + [not] 21 23 + [true] 25 28 +L7 + [local] 1 5 + [_notVariable] 7 18 + [=] 20 20 + [not] 22 24 + [x] 26 26 +L8 + [local] 1 5 + [_length] 7 13 + [=] 15 15 + [#] 17 17 + [{] 18 18 + [x] 19 19 + [}] 20 20 +L9 + [export] 1 6 + [type] 8 11 + [Function] 13 20 + [<] 21 21 + [T...] 22 25 + [=] 27 27 + [...any] 29 34 + [>] 35 35 + [=] 37 37 + [(] 39 39 + [...any] 40 45 + [)] 46 46 + [-] 48 48 + [>] 49 49 + [T...] 51 54 +L11 + [return] 1 6 + [function] 8 15 + [(] 17 17 + [req] 18 20 + [,] 21 21 + [...] 23 25 + [:] 26 26 + [boolean] 28 34 + [)] 35 35 + [:] 36 36 + [(] 38 38 + [{] 39 39 + [\[] 40 40 + [string|number] 41 53 + [\]] 54 54 + [:] 55 55 + [any] 57 59 + [}] 60 60 + [,] 61 61 + [string] 63 68 + [,] 69 69 + [Function<...any>] 71 86 + [)] 87 87 +L12 + [local] 3 7 + [body] 9 12 + [=] 14 14 + [string] 16 21 + [.] 22 22 + [format] 23 28 + [(] 29 29 + ["%s %s\\n"] 30 38 + [,] 39 39 + [req] 41 43 + [.] 44 44 + [method] 45 50 + [,] 51 51 + [req] 53 55 + [.] 56 56 + [path] 57 60 + [)] 61 61 +L13 + [local] 3 7 + [res] 9 11 + [=] 13 13 + [{] 15 15 +L14 + [code] 5 8 + [=] 10 10 + [200] 12 14 + [,] 15 15 +L15 + [{] 5 5 + ["Content-Type"] 7 20 + [,] 21 21 + ["text/plain"] 23 34 + [}] 36 36 + [,] 37 37 +L16 + [{] 5 5 + ["Content-Length"] 7 22 + [,] 23 23 + [#] 25 25 + [body] 26 29 + [}] 31 31 + [::] 33 34 + [Array] 36 45 + [,] 46 46 +L17 + [}] 3 3 + [::] 5 6 + [{] 8 8 + [\[] 10 10 + [any] 11 13 + [\]] 14 14 + [:] 15 15 + [number] 17 22 + [|] 24 24 + [Array] 26 30 + [<] 31 31 + [string] 32 37 + [|] 39 39 + [boolean] 41 47 + [>] 48 48 + [}] 50 50 +L18 + [if] 3 4 + [req] 6 8 + [.] 9 9 + [keepAlive] 10 18 + [then] 20 23 +L19 + [res] 5 7 + [\[] 8 8 + [#] 9 9 + [res] 10 12 + [+] 14 14 + [1] 16 16 + [\]] 17 17 + [=] 19 19 + [{] 21 21 + ["Connection"] 23 34 + [,] 35 35 + ["Keep-Alive"] 37 48 + [}] 50 50 +L20 + [res] 5 7 + [\[] 8 8 + [#] 9 9 + [res] 10 12 + [+] 14 14 + [2] 16 16 + [\]] 17 17 + [=] 19 19 + [{] 21 21 + [...] 23 25 + [}] 27 27 +L21 + [end] 3 5 +L23 + [return] 3 8 + [res] 10 12 + [,] 13 13 + [body] 15 18 + [,] 19 19 + [function] 21 28 + [(] 29 29 + [...)] 30 33 + [:] 34 34 + [...any] 36 41 + [return] 43 48 + [...] 50 52 + [end] 54 56 +L24 + [end] 1 3 +EOF From cfb8374611107702191b7dc379c3f146087ea096 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Tue, 26 Jul 2022 13:25:14 -0700 Subject: [PATCH 03/55] Capture more syntax scenarios in the regression test, update the snapshot. --- .../lang/lua/cpd/testdata/regressionTest.lua | 12 +- .../lang/lua/cpd/testdata/regressionTest.txt | 128 +++++++++++------- 2 files changed, 89 insertions(+), 51 deletions(-) diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua index 6b46463859..1c391a37a6 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua @@ -8,17 +8,19 @@ local _notVariable = not x local _length = #{x} export type Function = (...any) -> T... -return function (req, ...: boolean): ({[string|number]: any}, string, Function<...any>) +return function (req, ...: boolean): ({[string|number]: T}, string, Function<...any>) local body = string.format("%s %s\n", req.method, req.path) local res = { code = 200, { "Content-Type", "text/plain" }, { "Content-Length", #body } :: Array, } :: { [any]: number | Array } - if req.keepAlive then - res[#res + 1] = { "Connection", "Keep-Alive" } - res[#res + 2] = { ... } + if (req :: any).keepAlive then + local socketType: "Connection" | "Pingback" | "" = "" :: "" + socketType = "Connection" :: "Connection" + res[#res + 1] = { socketType :: string, "Keep-Alive" } + res[#res - 2] = { ... } end - return res, body, function(...): ...any return ... end + return (res :: any) :: { T }, body, function(...): ...any return ... end end \ No newline at end of file diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt index f02a9b767c..2be84bbb8a 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt @@ -67,27 +67,30 @@ L9 L11 [return] 1 6 [function] 8 15 - [(] 17 17 - [req] 18 20 - [,] 21 21 - [...] 23 25 - [:] 26 26 - [boolean] 28 34 - [)] 35 35 - [:] 36 36 - [(] 38 38 - [{] 39 39 - [\[] 40 40 - [string|number] 41 53 - [\]] 54 54 - [:] 55 55 - [any] 57 59 - [}] 60 60 - [,] 61 61 - [string] 63 68 - [,] 69 69 - [Function<...any>] 71 86 - [)] 87 87 + [<] 17 17 + [T] 18 18 + [>] 19 19 + [(] 20 20 + [req] 21 23 + [,] 24 24 + [...] 26 28 + [:] 29 29 + [boolean] 31 37 + [)] 38 38 + [:] 39 39 + [(] 41 41 + [{] 42 42 + [\[] 43 43 + [string|number] 44 56 + [\]] 57 57 + [:] 58 58 + [T] 60 60 + [}] 61 61 + [,] 62 62 + [string] 64 69 + [,] 70 70 + [Function<...any>] 72 87 + [)] 88 88 L12 [local] 3 7 [body] 9 12 @@ -152,11 +155,34 @@ L17 [}] 50 50 L18 [if] 3 4 - [req] 6 8 - [.] 9 9 - [keepAlive] 10 18 - [then] 20 23 + [(] 6 6 + [req] 7 9 + [::] 11 12 + [any] 14 16 + [)] 17 17 + [.] 18 18 + [keepAlive] 19 27 + [then] 29 32 L19 + [local] 5 9 + [socketType] 11 20 + [:] 21 21 + ["Connection"] 23 34 + [|] 36 36 + ["Pingback"] 38 47 + [|] 49 49 + [""] 51 52 + [=] 54 54 + [""] 56 57 + [::] 59 60 + [""] 62 63 +L20 + [socketType] 5 14 + [=] 16 16 + ["Connection"] 18 29 + [::] 31 32 + ["Connection"] 34 45 +L21 [res] 5 7 [\[] 8 8 [#] 9 9 @@ -166,38 +192,48 @@ L19 [\]] 17 17 [=] 19 19 [{] 21 21 - ["Connection"] 23 34 - [,] 35 35 - ["Keep-Alive"] 37 48 - [}] 50 50 -L20 + [socketType] 23 32 + [::] 34 35 + [string] 37 42 + [,] 43 43 + ["Keep-Alive"] 45 56 + [}] 58 58 +L22 [res] 5 7 [\[] 8 8 [#] 9 9 [res] 10 12 - [+] 14 14 + [-] 14 14 [2] 16 16 [\]] 17 17 [=] 19 19 [{] 21 21 [...] 23 25 [}] 27 27 -L21 - [end] 3 5 L23 + [end] 3 5 +L25 [return] 3 8 - [res] 10 12 - [,] 13 13 - [body] 15 18 - [,] 19 19 - [function] 21 28 - [(] 29 29 - [...)] 30 33 - [:] 34 34 - [...any] 36 41 - [return] 43 48 - [...] 50 52 - [end] 54 56 -L24 + [(] 10 10 + [res] 11 13 + [::] 15 16 + [any] 18 20 + [)] 21 21 + [::] 23 24 + [{] 26 26 + [T] 28 28 + [}] 30 30 + [,] 31 31 + [body] 33 36 + [,] 37 37 + [function] 39 46 + [(] 47 47 + [...)] 48 51 + [:] 52 52 + [...any] 54 59 + [return] 61 66 + [...] 68 70 + [end] 72 74 +L26 [end] 1 3 EOF From 3d6fab0782464562aee9a0f7d72971de4d0efc9e Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Tue, 26 Jul 2022 13:29:19 -0700 Subject: [PATCH 04/55] rename new snapshot artifact to better express intent --- .../src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java | 2 +- .../lang/lua/cpd/testdata/{regressionTest.lua => luauTypes.lua} | 0 .../lang/lua/cpd/testdata/{regressionTest.txt => luauTypes.txt} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/{regressionTest.lua => luauTypes.lua} (100%) rename pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/{regressionTest.txt => luauTypes.txt} (100%) diff --git a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java index ccbd16450d..83b39442a1 100644 --- a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java +++ b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java @@ -42,6 +42,6 @@ public class LuaTokenizerTest extends CpdTextComparisonTest { @Test public void testRegression() { - doTest("regressionTest"); + doTest("luauTypes"); } } diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua similarity index 100% rename from pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.lua rename to pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt similarity index 100% rename from pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/regressionTest.txt rename to pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt From ca2ee055626cd251d1718e96762639063681b46b Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 1 Sep 2022 10:49:48 +0200 Subject: [PATCH 05/55] [doc] Add page for 3rd party rulesets --- docs/_data/sidebars/pmd_sidebar.yml | 3 ++ docs/pages/pmd/projectdocs/trivia/news.md | 31 ++++++++++++++++----- docs/pages/pmd/userdocs/3rdpartyrulesets.md | 27 ++++++++++++++++++ 3 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 docs/pages/pmd/userdocs/3rdpartyrulesets.md diff --git a/docs/_data/sidebars/pmd_sidebar.yml b/docs/_data/sidebars/pmd_sidebar.yml index f7ab16ddb0..e0e3854f86 100644 --- a/docs/_data/sidebars/pmd_sidebar.yml +++ b/docs/_data/sidebars/pmd_sidebar.yml @@ -58,6 +58,9 @@ entries: - title: PMD Report formats url: /pmd_userdocs_report_formats.html output: web, pdf + - title: 3rd party rulesets + output: web, pdf + url: /pmd_userdocs_3rdpartyrulesets.html - title: null output: web, pdf subfolders: diff --git a/docs/pages/pmd/projectdocs/trivia/news.md b/docs/pages/pmd/projectdocs/trivia/news.md index 8fb06bbd4c..2cf8db566d 100644 --- a/docs/pages/pmd/projectdocs/trivia/news.md +++ b/docs/pages/pmd/projectdocs/trivia/news.md @@ -9,26 +9,43 @@ author: Tom Copeland ### Salesforce / Apex Language Module +* October 2020 - [Salesforce CLI Scanner Custom XPath Rules - Part 1](https://bobbuzzard.blogspot.com/2020/10/salesforce-cli-scanner-custom-xpath.html), + [Salesforce CLI Scanner Custom XPath Rules - Part 2](http://bobbuzzard.blogspot.com/2020/10/salesforce-cli-scanner-custom-xpath_11.html) + by [Keir Bowden](https://twitter.com/bob_buzzard) + * March 2020 - [Helping Salesforce developers create readable and maintainable Apex code](https://gearset.com/blog/helping-sf-developers-create-readable-and-maintainable-apex-code) * July 2019 - [Apex PMD \| Static code analysis - Apex Hours](https://youtu.be/34PxAHtAavU) -* June 2019 - [Pluralsight](https://www.pluralsight.com/authors/don-robins) Course about leveraging PMD usage for Salesforce by [Robert Sösemann](https://github.com/rsoesemann) (Apex Language Module Contributor) [Play by Play: Automated Code Analysis in Salesforce - a Tools Deep-Dive](https://www.pluralsight.com/courses/play-by-play-automated-code-analysis-in-salesforce) +* June 2019 - [Pluralsight](https://www.pluralsight.com/authors/don-robins) Course about leveraging PMD usage for + Salesforce by [Robert Sösemann](https://github.com/rsoesemann) (Apex Language Module Contributor) + [Play by Play: Automated Code Analysis in Salesforce - a Tools Deep-Dive](https://www.pluralsight.com/courses/play-by-play-automated-code-analysis-in-salesforce) -* June 2018 - [Salesforce Way Podcast](https://salesforceway.com/podcast/podcast/) with [Robert Sösemann](https://github.com/rsoesemann) [Static Code Analysis with PMD for Apex](https://salesforceway.com/podcast/podcast/static-code-analysis-with-pmd-for-apex/) +* June 2018 - [Salesforce Way Podcast](https://salesforceway.com/podcast/podcast/) with + [Robert Sösemann](https://github.com/rsoesemann) [Static Code Analysis with PMD for Apex](https://salesforceway.com/podcast/podcast/static-code-analysis-with-pmd-for-apex/) -* January 2018 - [Webinar: How to contribute Apex rules to PMD with Robert Sösemann](https://www.youtube.com/watch?v=7_Ex9WWS_3Q) +* January 2018 - [Webinar: How to contribute Apex rules to PMD with Robert Sösemann](https://www.youtube.com/watch?v=7_Ex9WWS_3Q) -* August 2017 - Webinar about how to use PMD with The Welkin Suite Salesforce IDE - Author [Robert Sösemann](https://github.com/rsoesemann) - [Improving your Apex Code Quality with PMD in The Welkin Suite](https://www.youtube.com/watch?v=Ypyiy5b6huc) +* August 2017 - Webinar about how to use PMD with The Welkin Suite Salesforce IDE - Author + [Robert Sösemann](https://github.com/rsoesemann) - [Improving your Apex Code Quality with PMD in The Welkin Suite](https://www.youtube.com/watch?v=Ypyiy5b6huc) -* November 2016 - Recording of [Robert Sösemann](https://github.com/rsoesemann)'s Session at Salesforce Dreamforce Conference about enforcing Clean Code in the Salesforce world using PMD and other tools [Clean Apex Code with Automatic Code Metrics](https://www.youtube.com/watch?v=bW7m6y6bEug) +* November 2016 - Recording of [Robert Sösemann](https://github.com/rsoesemann)'s Session at Salesforce Dreamforce + Conference about enforcing Clean Code in the Salesforce world using PMD and other tools + [Clean Apex Code with Automatic Code Metrics](https://www.youtube.com/watch?v=bW7m6y6bEug) ### PMD in general and other Language Modules -* February 2021 - Artem Krosheninnikov's talk about Quality Assurance Automation: [Artem Krosheninnikov, Wrike - How static analysis can help in QAA processes](https://www.youtube.com/watch?v=L42zH5ne074) +* February 2021 - Artem Krosheninnikov's talk about Quality Assurance Automation: + [Artem Krosheninnikov, Wrike - How static analysis can help in QAA processes]( + https://www.youtube.com/watch?v=L42zH5ne074) -* May 2019 - [Code quality assurance with PMD – An extensible static code analyser for Java and other languages](https://www.datarespons.com/code-quality-assurance-with-pmd/) +* December 2020 - Jeroen Borgers' talk about finding performance bugs with PMD: + [J-Fall Virtual 2020: Jeroen Borgers - Fixing your performance and concurrency bugs before they bite you]( + https://www.youtube.com/watch?v=Z_sT38KTRNk) + +* May 2019 - [Code quality assurance with PMD – An extensible static code analyser for Java and other languages]( + https://www.datarespons.com/code-quality-assurance-with-pmd/) * February 2012 - Romain Pelisse's lightning talk at FOSDEM 2012 about "PMD5: What can it do for you?". [Video recording is available](http://video.fosdem.org/2012/lightningtalks/PMD5.webm). diff --git a/docs/pages/pmd/userdocs/3rdpartyrulesets.md b/docs/pages/pmd/userdocs/3rdpartyrulesets.md new file mode 100644 index 0000000000..ecbfee2818 --- /dev/null +++ b/docs/pages/pmd/userdocs/3rdpartyrulesets.md @@ -0,0 +1,27 @@ +--- +title: 3rd party rulesets +tags: [rule_references, userdocs] +summary: Lists rulesets and rules from the community +permalink: pmd_userdocs_3rdpartyrulesets.html +last_updated: September 2022 +--- + +## For Java + +* **jPinpoint rules:** PMD rule set for performance aware Java and Kotlin coding. + * +* **arch4u-pmd** is a library with pmd rules that bring new regulations related to known problems in REST API, logging, + monitoring, etc., including reconfigured default pmd rules to decrease false-positive violations during usage of + well-known frameworks like Spring, Quarkus, etc. + * +* Sample ruleset from **maxdocs**, a multi markup wiki engine. + * +* Sample ruleset from **geotools**, an open source Java library that provides tools for geospatial data. + * + * + + +## For Apex +* **unhappy-soup**, a repository with problematic Salesforce code to showcase PMD, the SFDX Scanner CLI + * + From 0f99ef0c3c5168356f8785e7d3ba289df397820d Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Tue, 6 Sep 2022 18:33:26 +0200 Subject: [PATCH 06/55] [html] Bump jsoup from 1.14.3 to 1.15.3 Fixes https://github.com/pmd/pmd/security/dependabot/23 CVE-2022-36033 https://github.com/advisories/GHSA-gp7f-rwcx-9369 --- pmd-html/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-html/pom.xml b/pmd-html/pom.xml index bbd5c0a746..cab9828d2d 100644 --- a/pmd-html/pom.xml +++ b/pmd-html/pom.xml @@ -31,7 +31,7 @@ org.jsoup jsoup - 1.14.3 + 1.15.3 From 026015954abc5ec65ba021f6926f854f1f536e26 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Wed, 7 Sep 2022 19:29:55 -0700 Subject: [PATCH 07/55] Move rules from lexer to parser. Fix some bugs found in manual testing. Add bugs found via manual testing to new lua test file. --- .../sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 92 +++++++++-------- .../pmd/lang/lua/cpd/testdata/luauTypes.lua | 4 + .../pmd/lang/lua/cpd/testdata/luauTypes.txt | 99 ++++++++++++++----- 3 files changed, 128 insertions(+), 67 deletions(-) diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index 62ac80363d..1f84395d51 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -91,7 +91,7 @@ stat | 'function' funcname funcbody | 'local' 'function' NAME funcbody | 'local' bindinglist ('=' explist)? - | ('export')? 'type' NAME ('<' GenericTypeParameterList '>')? '=' Type + | ('export')? 'type' NAME ('<' genericTypeParameterList '>')? '=' type ; attnamelist @@ -115,7 +115,7 @@ funcname ; funcbody - : ('<' GenericTypeParameterList '>')? '(' parlist? ')' (':' '...'? ReturnType ) block 'end' // GenericTypeParameterList and ReturnType + : ('<' genericTypeParameterList '>')? '(' parlist? ')' (':' '...'? returnType ) block 'end' // genericTypeParameterList and returnType ; parlist @@ -131,7 +131,7 @@ namelist ; binding - : NAME (':' Type ('?')?)? + : NAME (':' type ('?')?)? ; bindinglist: binding (',' bindinglist)?; @@ -158,10 +158,10 @@ exp ifelseexp: 'if' exp 'then' exp ('elseif' exp 'then' exp)* 'else' exp; -asexp: simpleexp ('::' Type)?; +asexp: simpleexp ('::' type)?; simpleexp - : 'nil' | 'false' | 'true' + : NIL | BOOLEAN | number | string | '...' @@ -242,73 +242,81 @@ number ; string - : NORMALSTRING | CHARSTRING | LONGSTRING + : NORMALSTRING | LONGSTRING ; -SimpleType - : 'nil' - | SingletonType - | NAME /* ('.' NAME)? */ ('<' TypeParams '>')? +simpleType + : NIL + | singletonType + | NAME ('.' NAME)? ('<' typeParams '>')? | 'typeof' '(' NAME ('(' ')')? | '...' ')' // can't use `exp`, manually handle common cases - | TableType - | FunctionType + | tableType + | functionType ; -SingletonType - : NORMALSTRING | CHARSTRING - | 'true' - | 'false' +singletonType + : NORMALSTRING | BOOLEAN ; -Type - : SimpleType ('?')? - | SimpleType ('?')? ('|' Type) // can't use Type because it's mutually left-recursive - | SimpleType ('?')? ('&' Type) // can't use Type because it's mutually left-recursive +type + : simpleType ('?')? + | simpleType ('?')? ('|' type) // can't use type because it's mutually left-recursive + | simpleType ('?')? ('&' type) // can't use type because it's mutually left-recursive ; -GenericTypePackParameter: NAME '...' ('=' (('(' (TypeList)? ')') | VariadicTypePack | GenericTypePack))?; // TypePack must be inlined here +genericTypePackParameter: NAME '...' ('=' (('(' (typeList)? ')') | variadicTypePack | genericTypePack))?; // typePack must be inlined here -GenericTypeParameterList: NAME ('=' Type)? (',' GenericTypeParameterList)? | GenericTypePackParameter (',' GenericTypePackParameter)*; +genericTypeParameterList: NAME ('=' type)? (',' genericTypeParameterList)? | genericTypePackParameter (',' genericTypePackParameter)*; -TypeList: Type (',' Type)? | VariadicTypePack; +typeList: type (',' type)? | variadicTypePack; -TypeParams: (Type | VariadicTypePack | GenericTypePack) (',' TypeParams)?; // had to remove TypePack +typeParams: (type | variadicTypePack | genericTypePack) (',' typeParams)?; // had to remove typePack -// TypePack: inlined everywhere to avoid overly greedy match when out-of-context +// typePack: inlined everywhere to avoid overly greedy match when out-of-context -GenericTypePack: NAME '...'; +genericTypePack: NAME '...'; -VariadicTypePack: '...' Type; +variadicTypePack: '...' type; -ReturnType: Type | '(' Type ',' Type ')' | '(' ')'; // can't use TypePack, inline common cases +returnType: variadicTypePack | '(' typeList ')' | '(' ')'; // can't use typePack, inline common cases -TableIndexer: '[' Type ']' ':' Type; +tableIndexer: '[' type ']' ':' type; -TableProp: NAME ':' Type; +tableProp: NAME ':' type; -TablePropOrIndexer - : TableProp | TableIndexer; +tablePropOrIndexer + : tableProp | tableIndexer; -PropList - : TablePropOrIndexer ((','|';') TablePropOrIndexer)* (','|';')?; +propList + : tablePropOrIndexer ((','|';') tablePropOrIndexer)* (','|';')?; -TableType - : '{' PropList '}'; +tableType + : '{' propList '}'; + +functionType: ('<' genericTypeParameterList '>')? '(' (typeList)? ')' '->' returnType; + +require + : 'require' '(' (NAME ('.' NAME)*) | NORMALSTRING ')' ('::' type)? + ; -FunctionType: ('<' GenericTypeParameterList '>')? '(' (TypeList)? ')' '->' (Type | '(' ')' | '(' (TypeList) ')'); // inline ReturnType to avoid greediness // LEXER +NIL + : 'nil' + ; + +BOOLEAN + : 'true' | 'false' + ; + NAME : [a-zA-Z_][a-zA-Z_0-9]* ; NORMALSTRING : '"' ( EscapeSequence | ~('\\'|'"') )* '"' - ; - -CHARSTRING - : '\'' ( EscapeSequence | ~('\''|'\\') )* '\'' + | '\'' ( EscapeSequence | ~('\\'|'\'') )* '\'' ; LONGSTRING @@ -401,7 +409,7 @@ LINE_COMMENT ; WS - : [ \t\u000C\r\n]+ -> skip + : [ \n\r\t\u000B\u000C\u0000]+ -> channel(HIDDEN) ; SHEBANG diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua index 1c391a37a6..2294030324 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua @@ -7,6 +7,10 @@ local _notLiteral = not true local _notVariable = not x local _length = #{x} export type Function = (...any) -> T... +local _PlatformService = nil +local game = require(script.Parent.game) :: any +pcall(function() _PlatformService = game:GetService('PlatformService') end) + return function (req, ...: boolean): ({[string|number]: T}, string, Function<...any>) local body = string.format("%s %s\n", req.method, req.path) diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt index 2be84bbb8a..7eb53efa9e 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt @@ -53,18 +53,56 @@ L9 [type] 8 11 [Function] 13 20 [<] 21 21 - [T...] 22 25 + [T] 22 22 + [...] 23 25 [=] 27 27 - [...any] 29 34 + [...] 29 31 + [any] 32 34 [>] 35 35 [=] 37 37 [(] 39 39 - [...any] 40 45 + [...] 40 42 + [any] 43 45 [)] 46 46 - [-] 48 48 - [>] 49 49 - [T...] 51 54 + [->] 48 49 + [T] 51 51 + [...] 52 54 +L10 + [local] 1 5 + [_PlatformService] 7 22 + [=] 24 24 + [nil] 26 28 L11 + [local] 1 5 + [game] 7 10 + [=] 12 12 + [require] 14 20 + [(] 21 21 + [script] 22 27 + [.] 28 28 + [Parent] 29 34 + [.] 35 35 + [game] 36 39 + [)] 40 40 + [::] 42 43 + [any] 45 47 +L12 + [pcall] 1 5 + [(] 6 6 + [function] 7 14 + [(] 15 15 + [)] 16 16 + [_PlatformService] 18 33 + [=] 35 35 + [game] 37 40 + [:] 41 41 + [GetService] 42 51 + [(] 52 52 + ['PlatformService'] 53 69 + [)] 70 70 + [end] 72 74 + [)] 75 75 +L15 [return] 1 6 [function] 8 15 [<] 17 17 @@ -81,7 +119,9 @@ L11 [(] 41 41 [{] 42 42 [\[] 43 43 - [string|number] 44 56 + [string] 44 49 + [|] 50 50 + [number] 51 56 [\]] 57 57 [:] 58 58 [T] 60 60 @@ -89,9 +129,13 @@ L11 [,] 62 62 [string] 64 69 [,] 70 70 - [Function<...any>] 72 87 + [Function] 72 79 + [<] 80 80 + [...] 81 83 + [any] 84 86 + [>] 87 87 [)] 88 88 -L12 +L16 [local] 3 7 [body] 9 12 [=] 14 14 @@ -109,24 +153,24 @@ L12 [.] 56 56 [path] 57 60 [)] 61 61 -L13 +L17 [local] 3 7 [res] 9 11 [=] 13 13 [{] 15 15 -L14 +L18 [code] 5 8 [=] 10 10 [200] 12 14 [,] 15 15 -L15 +L19 [{] 5 5 ["Content-Type"] 7 20 [,] 21 21 ["text/plain"] 23 34 [}] 36 36 [,] 37 37 -L16 +L20 [{] 5 5 ["Content-Length"] 7 22 [,] 23 23 @@ -134,9 +178,12 @@ L16 [body] 26 29 [}] 31 31 [::] 33 34 - [Array] 36 45 + [Array] 36 40 + [<] 41 41 + [any] 42 44 + [>] 45 45 [,] 46 46 -L17 +L21 [}] 3 3 [::] 5 6 [{] 8 8 @@ -153,7 +200,7 @@ L17 [boolean] 41 47 [>] 48 48 [}] 50 50 -L18 +L22 [if] 3 4 [(] 6 6 [req] 7 9 @@ -163,7 +210,7 @@ L18 [.] 18 18 [keepAlive] 19 27 [then] 29 32 -L19 +L23 [local] 5 9 [socketType] 11 20 [:] 21 21 @@ -176,13 +223,13 @@ L19 [""] 56 57 [::] 59 60 [""] 62 63 -L20 +L24 [socketType] 5 14 [=] 16 16 ["Connection"] 18 29 [::] 31 32 ["Connection"] 34 45 -L21 +L25 [res] 5 7 [\[] 8 8 [#] 9 9 @@ -198,7 +245,7 @@ L21 [,] 43 43 ["Keep-Alive"] 45 56 [}] 58 58 -L22 +L26 [res] 5 7 [\[] 8 8 [#] 9 9 @@ -210,9 +257,9 @@ L22 [{] 21 21 [...] 23 25 [}] 27 27 -L23 +L27 [end] 3 5 -L25 +L29 [return] 3 8 [(] 10 10 [res] 11 13 @@ -228,12 +275,14 @@ L25 [,] 37 37 [function] 39 46 [(] 47 47 - [...)] 48 51 + [...] 48 50 + [)] 51 51 [:] 52 52 - [...any] 54 59 + [...] 54 56 + [any] 57 59 [return] 61 66 [...] 68 70 [end] 72 74 -L26 +L30 [end] 1 3 EOF From 7cf9c6571e16b5ee786f1a1ee1fd15101c2956fc Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Wed, 7 Sep 2022 19:37:13 -0700 Subject: [PATCH 08/55] add an if-expression twist --- .../pmd/lang/lua/cpd/testdata/luauTypes.lua | 2 +- .../pmd/lang/lua/cpd/testdata/luauTypes.txt | 33 ++++++++++++------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua index 2294030324..6afb9b7c56 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua @@ -26,5 +26,5 @@ return function (req, ...: boolean): ({[string|number]: T}, string, Function< res[#res - 2] = { ... } end - return (res :: any) :: { T }, body, function(...): ...any return ... end + return (res :: any) :: { T }, (if req then body else "") :: string, function(...): ...any return ... end end \ No newline at end of file diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt index 7eb53efa9e..1517afea84 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt @@ -271,18 +271,27 @@ L29 [T] 28 28 [}] 30 30 [,] 31 31 - [body] 33 36 - [,] 37 37 - [function] 39 46 - [(] 47 47 - [...] 48 50 - [)] 51 51 - [:] 52 52 - [...] 54 56 - [any] 57 59 - [return] 61 66 - [...] 68 70 - [end] 72 74 + [(] 33 33 + [if] 34 35 + [req] 37 39 + [then] 41 44 + [body] 46 49 + [else] 51 54 + [""] 56 57 + [)] 58 58 + [::] 60 61 + [string] 63 68 + [,] 69 69 + [function] 71 78 + [(] 79 79 + [...] 80 82 + [)] 83 83 + [:] 84 84 + [...] 86 88 + [any] 89 91 + [return] 93 98 + [...] 100 102 + [end] 104 106 L30 [end] 1 3 EOF From 7747b750914c8c3e6a21b2de728f1bf5ed1c5824 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Thu, 8 Sep 2022 12:46:43 -0700 Subject: [PATCH 09/55] Cleanups and minor tweaks for issues found in testing across 500KLOC of open source Lua code. --- .../sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 23 ++++++++++--------- .../pmd/lang/lua/cpd/testdata/luauTypes.lua | 2 +- .../pmd/lang/lua/cpd/testdata/luauTypes.txt | 6 +++-- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index 1f84395d51..30e36071ff 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -62,6 +62,7 @@ Tested by Matt Hargett with: - Entire codebase and test suite for neovim v0.7.2: https://github.com/neovim/neovim/tree/v0.7.2 - Entire codebase for World of Warcraft Interface: https://github.com/tomrus88/BlizzardInterfaceCode - Benchmarks and conformance test suite for Luau 0.537: https://github.com/Roblox/luau/tree/0.537 + - Entire Lua codebase for nmap 7.92 : https://github.com/nmap/nmap */ grammar Lua; @@ -115,7 +116,7 @@ funcname ; funcbody - : ('<' genericTypeParameterList '>')? '(' parlist? ')' (':' '...'? returnType ) block 'end' // genericTypeParameterList and returnType + : ('<' genericTypeParameterList '>')? '(' parlist? ')' (':' '...'? returnType ) block 'end' ; parlist @@ -249,7 +250,7 @@ simpleType : NIL | singletonType | NAME ('.' NAME)? ('<' typeParams '>')? - | 'typeof' '(' NAME ('(' ')')? | '...' ')' // can't use `exp`, manually handle common cases + | 'typeof' '(' exp ')' | tableType | functionType ; @@ -260,25 +261,25 @@ singletonType type : simpleType ('?')? - | simpleType ('?')? ('|' type) // can't use type because it's mutually left-recursive - | simpleType ('?')? ('&' type) // can't use type because it's mutually left-recursive + | type ('|' type) + | type ('&' type) ; -genericTypePackParameter: NAME '...' ('=' (('(' (typeList)? ')') | variadicTypePack | genericTypePack))?; // typePack must be inlined here +genericTypePackParameter: NAME '...' ('=' (typePack | variadicTypePack | genericTypePack))?; genericTypeParameterList: NAME ('=' type)? (',' genericTypeParameterList)? | genericTypePackParameter (',' genericTypePackParameter)*; -typeList: type (',' type)? | variadicTypePack; +typeList: type (',' typeList)? | variadicTypePack; -typeParams: (type | variadicTypePack | genericTypePack) (',' typeParams)?; // had to remove typePack +typeParams: (type | typePack | variadicTypePack | genericTypePack) (',' typeParams)?; -// typePack: inlined everywhere to avoid overly greedy match when out-of-context +typePack: '(' (typeList)? ')'; genericTypePack: NAME '...'; variadicTypePack: '...' type; -returnType: variadicTypePack | '(' typeList ')' | '(' ')'; // can't use typePack, inline common cases +returnType: type | typePack; tableIndexer: '[' type ']' ':' type; @@ -288,7 +289,7 @@ tablePropOrIndexer : tableProp | tableIndexer; propList - : tablePropOrIndexer ((','|';') tablePropOrIndexer)* (','|';')?; + : tablePropOrIndexer (fieldsep tablePropOrIndexer)* fieldsep?; tableType : '{' propList '}'; @@ -296,7 +297,7 @@ tableType functionType: ('<' genericTypeParameterList '>')? '(' (typeList)? ')' '->' returnType; require - : 'require' '(' (NAME ('.' NAME)*) | NORMALSTRING ')' ('::' type)? + : 'local'? bindinglist '=' 'require' '(' exp ')' ('.' NAME)* ('::' type)? ';'? ; diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua index 6afb9b7c56..9e418a61de 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua @@ -8,7 +8,7 @@ local _notVariable = not x local _length = #{x} export type Function = (...any) -> T... local _PlatformService = nil -local game = require(script.Parent.game) :: any +local game = require(script.Parent.game).default :: any pcall(function() _PlatformService = game:GetService('PlatformService') end) diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt index 1517afea84..ac7939686c 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt @@ -84,8 +84,10 @@ L11 [.] 35 35 [game] 36 39 [)] 40 40 - [::] 42 43 - [any] 45 47 + [.] 41 41 + [default] 42 48 + [::] 50 51 + [any] 53 55 L12 [pcall] 1 5 [(] 6 6 From 11b7bda8719926cc0f3363dd560ff7d81579b302 Mon Sep 17 00:00:00 2001 From: mohan-chinnappan-n Date: Fri, 9 Sep 2022 04:21:56 -0400 Subject: [PATCH 10/55] Update TreeExportCli.java missing --file arg in "Example: ast-dump --format xml --language java --file MyFile.java" added --- .../java/net/sourceforge/pmd/util/treeexport/TreeExportCli.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/treeexport/TreeExportCli.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/treeexport/TreeExportCli.java index cd7c7c7e99..5ad05cb9da 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/treeexport/TreeExportCli.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/treeexport/TreeExportCli.java @@ -139,7 +139,7 @@ public class TreeExportCli { sb.append(System.lineSeparator()) .append(System.lineSeparator()); - sb.append("Example: ast-dump --format xml --language java MyFile.java") + sb.append("Example: ast-dump --format xml --language java --file MyFile.java") .append(System.lineSeparator()); System.err.print(sb); From b8b4e513ac232711f00ed9e4b699b7a2459e1233 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Fri, 9 Sep 2022 16:42:18 -0700 Subject: [PATCH 11/55] Support multi-line 'normal' strings. Support skipping literal sequences. More minor adjustments to make the testing corpus tokenize without errors. --- .../sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 88 +++++++--- .../net/sourceforge/pmd/cpd/LuaLanguage.java | 15 +- .../net/sourceforge/pmd/cpd/LuaTokenizer.java | 166 +++++++++++++++++- .../pmd/lang/lua/cpd/testdata/luauTypes.lua | 10 +- .../pmd/lang/lua/cpd/testdata/luauTypes.txt | 69 ++++---- 5 files changed, 283 insertions(+), 65 deletions(-) diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index 30e36071ff..4676055f48 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -77,7 +77,7 @@ block stat : ';' - | varlist '=' explist + | varlist ASSIGNMENT explist | var compoundop exp | functioncall | label @@ -87,11 +87,11 @@ stat | 'while' exp 'do' block 'end' | 'repeat' block 'until' exp | 'if' exp 'then' block ('elseif' exp 'then' block)* ('else' block)? 'end' - | 'for' binding '=' exp ',' exp (',' exp)? 'do' block 'end' + | 'for' binding ASSIGNMENT exp ',' exp (',' exp)? 'do' block 'end' | 'for' bindinglist 'in' explist 'do' block 'end' | 'function' funcname funcbody - | 'local' 'function' NAME funcbody - | 'local' bindinglist ('=' explist)? + | LOCAL 'function' NAME funcbody + | LOCAL bindinglist (ASSIGNMENT explist)? | ('export')? 'type' NAME ('<' genericTypeParameterList '>')? '=' type ; @@ -116,7 +116,7 @@ funcname ; funcbody - : ('<' genericTypeParameterList '>')? '(' parlist? ')' (':' '...'? returnType ) block 'end' + : ('<' genericTypeParameterList '>')? OPEN_PARENS parlist? CLOSE_PARENS (':' '...'? returnType ) block 'end' ; parlist @@ -138,7 +138,7 @@ binding bindinglist: binding (',' bindinglist)?; var - : (NAME | '(' exp ')' varSuffix) varSuffix* + : (NAME | OPEN_PARENS exp CLOSE_PARENS varSuffix) varSuffix* ; varlist @@ -172,11 +172,11 @@ simpleexp | tableconstructor; varOrExp - : var | '(' exp ')' + : var | OPEN_PARENS exp CLOSE_PARENS ; varSuffix - : nameAndArgs* ('[' exp ']' | '.' NAME) + : nameAndArgs* (OPEN_BRACKET exp CLOSE_BRACKET | '.' NAME) ; nameAndArgs @@ -184,7 +184,7 @@ nameAndArgs ; args - : '(' explist? ')' | tableconstructor | string + : OPEN_PARENS explist? CLOSE_PARENS | tableconstructor | string ; functiondef @@ -192,7 +192,7 @@ functiondef ; tableconstructor - : '{' fieldlist? '}' + : OPEN_BRACE fieldlist? CLOSE_BRACE ; fieldlist @@ -200,7 +200,7 @@ fieldlist ; field - : '[' exp ']' '=' exp | NAME '=' exp | exp + : OPEN_BRACKET exp CLOSE_BRACKET ASSIGNMENT exp | NAME ASSIGNMENT exp | exp ; fieldsep @@ -220,6 +220,8 @@ operatorAnd operatorComparison : '<' | '>' | '<=' | '>=' | '~=' | '=='; +ASSIGNMENT: '='; + operatorStrcat : '..'; @@ -243,20 +245,20 @@ number ; string - : NORMALSTRING | LONGSTRING + : NORMAL_STRING | LONG_STRING | INTERPOLATED_STRING ; simpleType : NIL | singletonType | NAME ('.' NAME)? ('<' typeParams '>')? - | 'typeof' '(' exp ')' + | 'typeof' OPEN_PARENS exp CLOSE_PARENS | tableType | functionType ; singletonType - : NORMALSTRING | BOOLEAN + : NORMAL_STRING | BOOLEAN ; type @@ -273,7 +275,7 @@ typeList: type (',' typeList)? | variadicTypePack; typeParams: (type | typePack | variadicTypePack | genericTypePack) (',' typeParams)?; -typePack: '(' (typeList)? ')'; +typePack: OPEN_PARENS (typeList)? CLOSE_PARENS; genericTypePack: NAME '...'; @@ -281,7 +283,7 @@ variadicTypePack: '...' type; returnType: type | typePack; -tableIndexer: '[' type ']' ':' type; +tableIndexer: OPEN_BRACKET type CLOSE_BRACKET ':' type; tableProp: NAME ':' type; @@ -292,17 +294,25 @@ propList : tablePropOrIndexer (fieldsep tablePropOrIndexer)* fieldsep?; tableType - : '{' propList '}'; + : OPEN_BRACE propList CLOSE_BRACE; -functionType: ('<' genericTypeParameterList '>')? '(' (typeList)? ')' '->' returnType; +functionType: ('<' genericTypeParameterList '>')? OPEN_PARENS (typeList)? CLOSE_PARENS '->' returnType; require - : 'local'? bindinglist '=' 'require' '(' exp ')' ('.' NAME)* ('::' type)? ';'? + : 'local'? bindinglist '=' REQUIRE OPEN_PARENS exp CLOSE_PARENS ('.' NAME)* ('::' type)? ';'? ; // LEXER +LOCAL + : 'local' + ; + +REQUIRE + : 'require' + ; + NIL : 'nil' ; @@ -315,19 +325,23 @@ NAME : [a-zA-Z_][a-zA-Z_0-9]* ; -NORMALSTRING - : '"' ( EscapeSequence | ~('\\'|'"') )* '"' - | '\'' ( EscapeSequence | ~('\\'|'\'') )* '\'' +NORMAL_STRING + : '"' (~["\\\r\n\u0085\u2028\u2029] | EscapeSequence | '\\\n')* '"' + | '\'' (~['\\\r\n\u0085\u2028\u2029] | EscapeSequence | '\\\n')* '\'' ; -LONGSTRING - : '[' NESTED_STR ']' +INTERPOLATED_STRING + : '`' (~[`\\\r\n\u0085\u2028\u2029] | EscapeSequence | '\\\n')* '`' + ; + +LONG_STRING + : OPEN_BRACKET NESTED_STR CLOSE_BRACKET ; fragment NESTED_STR : '=' NESTED_STR '=' - | '[' .*? ']' + | OPEN_BRACKET .*? CLOSE_BRACKET ; INT @@ -350,6 +364,26 @@ HEX_FLOAT | '0' [xX] HexDigit+ HexExponentPart ; +OPEN_BRACE: '{'; +CLOSE_BRACE: '}'; + +OPEN_BRACKET: '['; +CLOSE_BRACKET: ']'; + +OPEN_PARENS: '('; +CLOSE_PARENS: ')'; + +NL + : '\r\n' | '\r' | '\n' + | '\u0085' // ' + | '\u2028' //'' + | '\u2029' //'' + ; + +COMMA + : ',' + ; + fragment ExponentPart : [eE] [+-]? Digit+ @@ -362,8 +396,8 @@ HexExponentPart fragment EscapeSequence - : '\\' [abfnrtvz"'|$#\\] // World of Warcraft Lua additionally escapes |$# - | '\\' '\r'? '\n' + : '\\' [abfnrtvz"'`|$#\\] // World of Warcraft Lua additionally escapes |$# + | NL | DecimalEscape | HexEscape | UtfEscape diff --git a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaLanguage.java b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaLanguage.java index e2a87ec878..2e485e13b8 100644 --- a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaLanguage.java +++ b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaLanguage.java @@ -4,15 +4,28 @@ package net.sourceforge.pmd.cpd; +import java.util.Properties; + /** * Language implementation for Lua */ public class LuaLanguage extends AbstractLanguage { + public LuaLanguage() { + this(System.getProperties()); + } + /** * Creates a new Lua Language instance. */ - public LuaLanguage() { + public LuaLanguage(Properties properties) { super("Lua", "lua", new LuaTokenizer(), ".lua"); + setProperties(properties); + } + + @Override + public final void setProperties(Properties properties) { + LuaTokenizer tokenizer = (LuaTokenizer) getTokenizer(); + tokenizer.setProperties(properties); } } diff --git a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java index 23c292dbe7..8e4f354b17 100644 --- a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java +++ b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java @@ -4,8 +4,11 @@ package net.sourceforge.pmd.cpd; +import java.util.Properties; + import org.antlr.v4.runtime.CharStream; +import net.sourceforge.pmd.cpd.token.AntlrToken; import net.sourceforge.pmd.cpd.token.AntlrTokenFilter; import net.sourceforge.pmd.lang.antlr.AntlrTokenManager; import net.sourceforge.pmd.lang.lua.antlr4.LuaLexer; @@ -15,6 +18,22 @@ import net.sourceforge.pmd.lang.lua.antlr4.LuaLexer; */ public class LuaTokenizer extends AntlrTokenizer { + private boolean ignoreLiteralSequences = false; + + /** + * Sets the possible options for the C# tokenizer. + * + * @param properties the properties + * @see #OPTION_IGNORE_LITERAL_SEQUENCES + */ + public void setProperties(Properties properties) { + ignoreLiteralSequences = getBooleanProperty(properties, OPTION_IGNORE_LITERAL_SEQUENCES); + } + + private boolean getBooleanProperty(final Properties properties, final String property) { + return Boolean.parseBoolean(properties.getProperty(property, Boolean.FALSE.toString())); + } + @Override protected AntlrTokenManager getLexerForSource(SourceCode sourceCode) { CharStream charStream = AntlrTokenizer.getCharStreamFromSourceCode(sourceCode); @@ -23,6 +42,151 @@ public class LuaTokenizer extends AntlrTokenizer { @Override protected AntlrTokenFilter getTokenFilter(final AntlrTokenManager tokenManager) { - return new AntlrTokenFilter(tokenManager); + return new LuaTokenFilter(tokenManager, ignoreLiteralSequences); + } + + /** + * The {@link LuaTokenFilter} extends the {@link AntlrTokenFilter} to discard + * Lua-specific tokens. + *

+ * By default, it enables annotation-based CPD suppression. + * If the --ignoreUsings flag is provided, require() directives are filtered out. + *

+ */ + private static class LuaTokenFilter extends AntlrTokenFilter { + + private final boolean ignoreLiteralSequences; + private boolean discardingRequires = false; + private boolean discardingNL = false; + private AntlrToken discardingLiteralsUntil = null; + private boolean discardCurrent = false; + + + LuaTokenFilter(final AntlrTokenManager tokenManager, boolean ignoreLiteralSequences) { + super(tokenManager); + this.ignoreLiteralSequences = ignoreLiteralSequences; + } + + @Override + protected void analyzeToken(final AntlrToken currentToken) { + skipNewLines(currentToken); + } + + @Override + protected void analyzeTokens(final AntlrToken currentToken, final Iterable remainingTokens) { + discardCurrent = false; + skipRequires(currentToken, remainingTokens); + skipLiteralSequences(currentToken, remainingTokens); + } + + private void skipRequires(final AntlrToken currentToken, final Iterable remainingTokens) { + final int type = currentToken.getKind(); + if (type == LuaLexer.REQUIRE) { + discardingRequires = true; + } else if (type == LuaLexer.CLOSE_PARENS && discardingRequires) { + discardingRequires = false; + discardCurrent = true; + } + } + + private void skipNewLines(final AntlrToken currentToken) { + discardingNL = currentToken.getKind() == LuaLexer.NL; + } + + private void skipLiteralSequences(final AntlrToken currentToken, final Iterable remainingTokens) { + if (ignoreLiteralSequences) { + final int type = currentToken.getKind(); + if (isDiscardingLiterals()) { + if (currentToken == discardingLiteralsUntil) { // NOPMD - intentional check for reference equality + discardingLiteralsUntil = null; + discardCurrent = true; + } + } else if (type == LuaLexer.OPEN_BRACE + || type == LuaLexer.OPEN_BRACKET + || type == LuaLexer.OPEN_PARENS) { + final AntlrToken finalToken = findEndOfSequenceOfLiterals(remainingTokens); + discardingLiteralsUntil = finalToken; + } + } + } + + private AntlrToken findEndOfSequenceOfLiterals(final Iterable remainingTokens) { + boolean seenLiteral = false; + int braceCount = 0; + int bracketCount = 0; + int parenCount = 0; + for (final AntlrToken token : remainingTokens) { + switch (token.getKind()) { + case LuaLexer.INT: + case LuaLexer.NORMAL_STRING: + case LuaLexer.INTERPOLATED_STRING: + case LuaLexer.LONG_STRING: + case LuaLexer.HEX_FLOAT: + case LuaLexer.HEX: + case LuaLexer.FLOAT: + case LuaLexer.NIL: + case LuaLexer.BOOLEAN: + seenLiteral = true; + break; // can be skipped; continue to the next token + case LuaLexer.COMMA: + break; // can be skipped; continue to the next token + case LuaLexer.NL: + // this helps skip large multi-line data table sequences in Lua + break; // can be skipped; continue to the next token + case LuaLexer.ASSIGNMENT: + // this helps skip large data table sequences in Lua: { ["bob"] = "uncle", ["alice"] = "enby" } + break; // can be skipped; continue to the next token + case LuaLexer.OPEN_BRACE: + braceCount++; + break; // curly braces are allowed, as long as they're balanced + case LuaLexer.CLOSE_BRACE: + braceCount--; + if (braceCount < 0) { + // end of the list in the braces; skip all contents + return seenLiteral ? token : null; + } else { + // curly braces are not yet balanced; continue to the next token + break; + } + case LuaLexer.OPEN_BRACKET: + bracketCount++; + break; // brackets are allowed, as long as they're balanced + case LuaLexer.CLOSE_BRACKET: + bracketCount--; + if (bracketCount < 0) { + // end of the list in the brackets; skip all contents + return seenLiteral ? token : null; + } else { + // brackets are not yet balanced; continue to the next token + break; + } + case LuaLexer.OPEN_PARENS: + parenCount++; + break; // parens are allowed, as long as they're balanced + case LuaLexer.CLOSE_PARENS: + parenCount--; + if (parenCount < 0) { + // end of the list in the parens; skip all contents + return seenLiteral ? token : null; + } else { + // parens are not yet balanced; continue to the next token + break; + } + default: + // some other token than the expected ones; this is not a sequence of literals + return null; + } + } + return null; + } + + public boolean isDiscardingLiterals() { + return discardingLiteralsUntil != null; + } + + @Override + protected boolean isLanguageSpecificDiscarding() { + return discardingRequires || discardingNL || isDiscardingLiterals() || discardCurrent; + } } } diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua index 9e418a61de..da4e9ddf80 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.lua @@ -11,18 +11,22 @@ local _PlatformService = nil local game = require(script.Parent.game).default :: any pcall(function() _PlatformService = game:GetService('PlatformService') end) - return function (req, ...: boolean): ({[string|number]: T}, string, Function<...any>) local body = string.format("%s %s\n", req.method, req.path) local res = { code = 200, { "Content-Type", "text/plain" }, - { "Content-Length", #body } :: Array, + { + "Content-Length", + #body, + ["Auth.Confirm"] = [[至:%s。]], + + } :: Array, } :: { [any]: number | Array } if (req :: any).keepAlive then local socketType: "Connection" | "Pingback" | "" = "" :: "" socketType = "Connection" :: "Connection" - res[#res + 1] = { socketType :: string, "Keep-Alive" } + res[#res + 1] = { socketType :: string, `\`${req.keepAlive}\`` } res[#res - 2] = { ... } end diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt index ac7939686c..f1a3934c53 100644 --- a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/luauTypes.txt @@ -76,14 +76,6 @@ L11 [local] 1 5 [game] 7 10 [=] 12 12 - [require] 14 20 - [(] 21 21 - [script] 22 27 - [.] 28 28 - [Parent] 29 34 - [.] 35 35 - [game] 36 39 - [)] 40 40 [.] 41 41 [default] 42 48 [::] 50 51 @@ -104,7 +96,7 @@ L12 [)] 70 70 [end] 72 74 [)] 75 75 -L15 +L14 [return] 1 6 [function] 8 15 [<] 17 17 @@ -137,7 +129,7 @@ L15 [any] 84 86 [>] 87 87 [)] 88 88 -L16 +L15 [local] 3 7 [body] 9 12 [=] 14 14 @@ -155,37 +147,48 @@ L16 [.] 56 56 [path] 57 60 [)] 61 61 -L17 +L16 [local] 3 7 [res] 9 11 [=] 13 13 [{] 15 15 -L18 +L17 [code] 5 8 [=] 10 10 [200] 12 14 [,] 15 15 -L19 +L18 [{] 5 5 ["Content-Type"] 7 20 [,] 21 21 ["text/plain"] 23 34 [}] 36 36 [,] 37 37 -L20 +L19 [{] 5 5 +L20 ["Content-Length"] 7 22 [,] 23 23 - [#] 25 25 - [body] 26 29 - [}] 31 31 - [::] 33 34 - [Array] 36 40 - [<] 41 41 - [any] 42 44 - [>] 45 45 - [,] 46 46 L21 + [#] 7 7 + [body] 8 11 + [,] 12 12 +L22 + [\[] 7 7 + ["Auth.Confirm"] 8 21 + [\]] 22 22 + [=] 24 24 + [\[\[至:%s。\]\]] 26 34 + [,] 35 35 +L24 + [}] 5 5 + [::] 7 8 + [Array] 10 14 + [<] 15 15 + [any] 16 18 + [>] 19 19 + [,] 20 20 +L25 [}] 3 3 [::] 5 6 [{] 8 8 @@ -202,7 +205,7 @@ L21 [boolean] 41 47 [>] 48 48 [}] 50 50 -L22 +L26 [if] 3 4 [(] 6 6 [req] 7 9 @@ -212,7 +215,7 @@ L22 [.] 18 18 [keepAlive] 19 27 [then] 29 32 -L23 +L27 [local] 5 9 [socketType] 11 20 [:] 21 21 @@ -225,13 +228,13 @@ L23 [""] 56 57 [::] 59 60 [""] 62 63 -L24 +L28 [socketType] 5 14 [=] 16 16 ["Connection"] 18 29 [::] 31 32 ["Connection"] 34 45 -L25 +L29 [res] 5 7 [\[] 8 8 [#] 9 9 @@ -245,9 +248,9 @@ L25 [::] 34 35 [string] 37 42 [,] 43 43 - ["Keep-Alive"] 45 56 - [}] 58 58 -L26 + [`\\`${req.keepAlive}\\``] 45 66 + [}] 68 68 +L30 [res] 5 7 [\[] 8 8 [#] 9 9 @@ -259,9 +262,9 @@ L26 [{] 21 21 [...] 23 25 [}] 27 27 -L27 +L31 [end] 3 5 -L29 +L33 [return] 3 8 [(] 10 10 [res] 11 13 @@ -294,6 +297,6 @@ L29 [return] 93 98 [...] 100 102 [end] 104 106 -L30 +L34 [end] 1 3 EOF From 7d9a84fddebf38ce6808e9c1db6a5091baa2e5ca Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Fri, 9 Sep 2022 16:51:33 -0700 Subject: [PATCH 12/55] Format to have more consistent style with itself. Most other files appear to have mixed formatting. --- .../sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 213 +++++++++++++----- 1 file changed, 154 insertions(+), 59 deletions(-) diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index 4676055f48..2c2603c0a2 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -120,7 +120,8 @@ funcbody ; parlist - : bindinglist (',' '...')? | '...' + : bindinglist (',' '...')? + | '...' ; explist @@ -135,7 +136,9 @@ binding : NAME (':' type ('?')?)? ; -bindinglist: binding (',' bindinglist)?; +bindinglist + : binding (',' bindinglist)? + ; var : (NAME | OPEN_PARENS exp CLOSE_PARENS varSuffix) varSuffix* @@ -157,9 +160,13 @@ exp : (asexp | operatorUnary exp) ( binop exp )* ; -ifelseexp: 'if' exp 'then' exp ('elseif' exp 'then' exp)* 'else' exp; +ifelseexp + : 'if' exp 'then' exp ('elseif' exp 'then' exp)* 'else' exp + ; -asexp: simpleexp ('::' type)?; +asexp + : simpleexp ('::' type)? + ; simpleexp : NIL | BOOLEAN @@ -172,7 +179,8 @@ simpleexp | tableconstructor; varOrExp - : var | OPEN_PARENS exp CLOSE_PARENS + : var + | OPEN_PARENS exp CLOSE_PARENS ; varSuffix @@ -184,7 +192,9 @@ nameAndArgs ; args - : OPEN_PARENS explist? CLOSE_PARENS | tableconstructor | string + : OPEN_PARENS explist? CLOSE_PARENS + | tableconstructor + | string ; functiondef @@ -200,16 +210,34 @@ fieldlist ; field - : OPEN_BRACKET exp CLOSE_BRACKET ASSIGNMENT exp | NAME ASSIGNMENT exp | exp + : OPEN_BRACKET exp CLOSE_BRACKET ASSIGNMENT exp + | NAME ASSIGNMENT exp + | exp ; fieldsep - : ',' | ';' + : ',' + | ';' ; -compoundop: '+=' | '-=' | '*=' | '/=' | '%=' | '^=' | '..='; +compoundop + : '+=' + | '-=' + + | '*=' + | '/=' + | '%=' + | '^=' + | '..='; -binop: operatorAddSub | operatorMulDivMod | operatorPower | operatorStrcat | operatorComparison | operatorAnd | operatorOr | operatorBitwise; +binop: operatorAddSub + | operatorMulDivMod + | operatorPower + | operatorStrcat + | operatorComparison + | operatorAnd + | operatorOr + | operatorBitwise; operatorOr : 'or'; @@ -218,34 +246,62 @@ operatorAnd : 'and'; operatorComparison - : '<' | '>' | '<=' | '>=' | '~=' | '=='; + : '<' + | '>' + | '<=' + | '>=' + | '~=' + | '==' + ; -ASSIGNMENT: '='; +ASSIGNMENT + : '=' + ; operatorStrcat : '..'; operatorAddSub - : '+' | '-'; + : '+' + | '-' + ; operatorMulDivMod - : '*' | '/' | '%' | '//'; + : '*' + | '/' + | '%' + | '//' + ; operatorBitwise - : '&' | '|' | '~' | '<<' | '>>'; + : '&' + | '|' + | '~' + | '<<' + | '>>' + ; operatorUnary - : 'not' | '#' | '-' | '~'; + : 'not' + | '#' + | '-' + | '~' + ; operatorPower : '^'; number - : INT | HEX | FLOAT | HEX_FLOAT + : INT + | HEX + | FLOAT + | HEX_FLOAT ; string - : NORMAL_STRING | LONG_STRING | INTERPOLATED_STRING + : NORMAL_STRING + | LONG_STRING + | INTERPOLATED_STRING ; simpleType @@ -258,7 +314,8 @@ simpleType ; singletonType - : NORMAL_STRING | BOOLEAN + : NORMAL_STRING + | BOOLEAN ; type @@ -267,41 +324,64 @@ type | type ('&' type) ; -genericTypePackParameter: NAME '...' ('=' (typePack | variadicTypePack | genericTypePack))?; - -genericTypeParameterList: NAME ('=' type)? (',' genericTypeParameterList)? | genericTypePackParameter (',' genericTypePackParameter)*; - -typeList: type (',' typeList)? | variadicTypePack; - -typeParams: (type | typePack | variadicTypePack | genericTypePack) (',' typeParams)?; - -typePack: OPEN_PARENS (typeList)? CLOSE_PARENS; - -genericTypePack: NAME '...'; - -variadicTypePack: '...' type; - -returnType: type | typePack; - -tableIndexer: OPEN_BRACKET type CLOSE_BRACKET ':' type; - -tableProp: NAME ':' type; - -tablePropOrIndexer - : tableProp | tableIndexer; - -propList - : tablePropOrIndexer (fieldsep tablePropOrIndexer)* fieldsep?; - -tableType - : OPEN_BRACE propList CLOSE_BRACE; - -functionType: ('<' genericTypeParameterList '>')? OPEN_PARENS (typeList)? CLOSE_PARENS '->' returnType; - -require - : 'local'? bindinglist '=' REQUIRE OPEN_PARENS exp CLOSE_PARENS ('.' NAME)* ('::' type)? ';'? +genericTypePackParameter + : NAME '...' ('=' (typePack | variadicTypePack | genericTypePack))? ; +genericTypeParameterList + : NAME ('=' type)? (',' genericTypeParameterList)? + | genericTypePackParameter (',' genericTypePackParameter)* + ; + +typeList + : type (',' typeList)? | variadicTypePack + ; + +typeParams + : (type | typePack | variadicTypePack | genericTypePack) (',' typeParams)? + ; + +typePack + : OPEN_PARENS (typeList)? CLOSE_PARENS + ; + +genericTypePack + : NAME '...' + ; + +variadicTypePack + : '...' type + ; + +returnType + : type + | typePack + ; + +tableIndexer + : OPEN_BRACKET type CLOSE_BRACKET ':' type + ; + +tableProp + : NAME ':' type + ; + +tablePropOrIndexer + : tableProp + | tableIndexer + ; + +propList + : tablePropOrIndexer (fieldsep tablePropOrIndexer)* fieldsep? + ; + +tableType + : OPEN_BRACE propList CLOSE_BRACE + ; + +functionType + : ('<' genericTypeParameterList '>')? OPEN_PARENS (typeList)? CLOSE_PARENS '->' returnType + ; // LEXER @@ -318,7 +398,8 @@ NIL ; BOOLEAN - : 'true' | 'false' + : 'true' + | 'false' ; NAME @@ -364,14 +445,28 @@ HEX_FLOAT | '0' [xX] HexDigit+ HexExponentPart ; -OPEN_BRACE: '{'; -CLOSE_BRACE: '}'; +OPEN_BRACE + : '{' + ; -OPEN_BRACKET: '['; -CLOSE_BRACKET: ']'; +CLOSE_BRACE + : '}' + ; -OPEN_PARENS: '('; -CLOSE_PARENS: ')'; +OPEN_BRACKET + : '[' + ; +CLOSE_BRACKET + : ']' + ; + +OPEN_PARENS: + '(' + ; + +CLOSE_PARENS + : ')' + ; NL : '\r\n' | '\r' | '\n' From 01ea52f90c428dbcb0eeaf4b9262f12b4e6d16ed Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 10 Sep 2022 10:34:25 +0200 Subject: [PATCH 13/55] [cli] Fix java version detection in run.sh Fixes #4118 --- docs/pages/release_notes.md | 2 ++ pmd-dist/src/main/resources/scripts/run.sh | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index b8f8783555..2afc096898 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -15,6 +15,8 @@ This is a {{ site.pmd.release_type }} release. ### New and noteworthy ### Fixed Issues +* cli + * [#4118](https://github.com/pmd/pmd/issues/4118): \[cli] run.sh designer reports "integer expression expected" ### API Changes diff --git a/pmd-dist/src/main/resources/scripts/run.sh b/pmd-dist/src/main/resources/scripts/run.sh index 1501db12bc..ece76fc949 100755 --- a/pmd-dist/src/main/resources/scripts/run.sh +++ b/pmd-dist/src/main/resources/scripts/run.sh @@ -2,7 +2,7 @@ usage() { echo "Usage:" - echo " $(basename $0) [-h|-v] ..." + echo " $(basename "$0") [-h|-v] ..." echo "" echo "application-name: valid options are: $(valid_app_options)" echo "-h print this help" @@ -60,9 +60,9 @@ java_heapsize_settings() { set_lib_dir() { - if [ -z ${LIB_DIR} ]; then + if [ -z "${LIB_DIR}" ]; then # Allow for symlinks to this script - if [ -L $0 ]; then + if [ -L "$0" ]; then local script_real_loc=$(readlink "$0") else local script_real_loc=$0 @@ -83,23 +83,25 @@ check_lib_dir() { } function script_exit() { - echo $1 >&2 + echo "$1" >&2 exit 1 } determine_java_version() { local full_ver=$(java -version 2>&1) - # java_ver is eg "18" for java 1.8, "90" for java 9.0, "100" for java 10.0.x - readonly java_ver=$(echo $full_ver | sed -n '{ + # java_ver is eg "80" for java 1.8, "90" for java 9.0, "100" for java 10.0.x + readonly java_ver=$(echo "$full_ver" | sed -n '{ # replace early access versions, e.g. 11-ea with 11.0.0 s/-ea/.0.0/ # replace versions such as 10 with 10.0.0 s/version "\([0-9]\{1,\}\)"/version "\1.0.0"/ + # replace old java versions 1.x.* (java 1.7, java 1.8) with x.* + s/version "1\.\(.*\)"/version "\1"/ # extract the major and minor parts of the version - s/^.* version "\(.*\)\.\(.*\)\..*".*$/\1\2/p + s/^.* version "\([0-9]\{1,\}\)\.\([0-9]\{1,\}\).*".*$/\1\2/p }') # java_vendor is either java (oracle) or openjdk - readonly java_vendor=$(echo $full_ver | sed -n -e 's/^\(.*\) version .*$/\1/p') + readonly java_vendor=$(echo "$full_ver" | sed -n -e 's/^\(.*\) version .*$/\1/p') } jre_specific_vm_options() { @@ -197,7 +199,7 @@ case "${APPNAME}" in readonly CLASSNAME="net.sourceforge.pmd.util.treeexport.TreeExportCli" ;; *) - echo "${APPNAME} is NOT a valid application name, valid options are:$(valid_app_options)" + echo "${APPNAME} is NOT a valid application name, valid options are: $(valid_app_options)" ;; esac From 0b6a9ce0a7126bfcfccda40320b7a16d8bab73c8 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 10 Sep 2022 10:46:04 +0200 Subject: [PATCH 14/55] Add manual test script --- .../src/test/resources/scripts/runtest.sh | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 pmd-dist/src/test/resources/scripts/runtest.sh diff --git a/pmd-dist/src/test/resources/scripts/runtest.sh b/pmd-dist/src/test/resources/scripts/runtest.sh new file mode 100755 index 0000000000..34185ddb1c --- /dev/null +++ b/pmd-dist/src/test/resources/scripts/runtest.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# BSD-style license; for more info see http://pmd.sourceforge.net/license.html + +# +# Simple manual test script +# - code is copied from run.sh to be tested here (so please check, it might be out of sync) +# - mostly the function "determine_java_version" is tested here +# - just run it with "./runtest.sh" and look at the output +# - test cases are at the end of this script +# + +export LANG=en_US.UTF-8 + +FULL_JAVA_VERSION="" + +get_full_java_version() { + #java -version 2>&1 + #echo "openjdk version \"11.0.6\" 2022-08-12" + echo "$FULL_JAVA_VERSION" +} + +determine_java_version() { + local full_ver=$(get_full_java_version) + # java_ver is eg "80" for java 1.8, "90" for java 9.0, "100" for java 10.0.x + java_ver=$(echo "$full_ver" | sed -n '{ + # replace early access versions, e.g. 11-ea with 11.0.0 + s/-ea/.0.0/ + # replace versions such as 10 with 10.0.0 + s/version "\([0-9]\{1,\}\)"/version "\1.0.0"/ + # replace old java versions 1.x.* (java 1.7, java 1.8) with x.* + s/version "1\.\(.*\)"/version "\1"/ + # extract the major and minor parts of the version + s/^.* version "\([0-9]\{1,\}\)\.\([0-9]\{1,\}\).*".*$/\1\2/p + }') + # java_vendor is either java (oracle) or openjdk + java_vendor=$(echo "$full_ver" | sed -n -e 's/^\(.*\) version .*$/\1/p') +} + +jre_specific_vm_options() { + options="" + if [ "$java_ver" -ge 70 ] && [ "$java_ver" -lt 80 ] + then + options="detected java 7" + elif [ "$java_ver" -ge 80 ] && [ "$java_ver" -lt 90 ] + then + options="detected java 8" + elif [ "$java_ver" -ge 90 ] && [ "$java_ver" -lt 110 ] && [ "$java_vendor" = "java" ] + then + options="detected java 9 or 10 from oracle" + elif [ "$java_vendor" = "openjdk" ] || ( [ "$java_vendor" = "java" ] && [ "$java_ver" -ge 110 ] ) + then + options="detected java 11 from oracle or any openjdk" + fi + echo $options +} + +run_test() { + FULL_JAVA_VERSION="$1" + EXPECTED_VENDOR="$2" + EXPECTED_VER="$3" + EXPECTED="$4" + echo "Testing: '${FULL_JAVA_VERSION}'" + determine_java_version + java_opts="$(jre_specific_vm_options)" + echo -n "java_ver: $java_ver " + if [ "$EXPECTED_VER" = "$java_ver" ]; then echo -e "\e[32mOK\e[0m"; else echo -e "\e[31mFAILED\e[0m"; fi + echo -n "java_vendor: $java_vendor " + if [ "$EXPECTED_VENDOR" = "$java_vendor" ]; then echo -e "\e[32mOK\e[0m"; else echo -e "\e[31mFAILED\e[0m"; fi + echo -n "java_opts: $java_opts " + if [ "$EXPECTED" = "$java_opts" ]; then echo -e "\e[32mOK\e[0m"; else echo -e "\e[31mFAILED\e[0m - expected: ${EXPECTED}"; fi + echo +} + +run_test "java version \"1.7.0_80\"" "java" "70" "detected java 7" +run_test "openjdk version \"1.7.0_352\"" "openjdk" "70" "detected java 7" +run_test "java version \"1.8.0_271\"" "java" "80" "detected java 8" +run_test "openjdk version \"1.8.0_345\"" "openjdk" "80" "detected java 8" +run_test "java version \"9.0.4\"" "java" "90" "detected java 9 or 10 from oracle" +run_test "openjdk version \"9.0.4\"" "openjdk" "90" "detected java 11 from oracle or any openjdk" +run_test "java version \"10.0.2\" 2018-07-17" "java" "100" "detected java 9 or 10 from oracle" +run_test "openjdk version \"11.0.6\" 2022-08-12" "openjdk" "110" "detected java 11 from oracle or any openjdk" +run_test "openjdk version \"11.0.6.1\" 2022-08-12" "openjdk" "110" "detected java 11 from oracle or any openjdk" +run_test "java version \"11.0.13\" 2021-10-19 LTS" "java" "110" "detected java 11 from oracle or any openjdk" +run_test "openjdk version \"17.0.4\" 2022-08-12" "openjdk" "170" "detected java 11 from oracle or any openjdk" +run_test "openjdk version \"17.1.4\" 2022-08-12" "openjdk" "171" "detected java 11 from oracle or any openjdk" +run_test "openjdk version \"17.0.4.1\" 2022-08-12" "openjdk" "170" "detected java 11 from oracle or any openjdk" +run_test "openjdk version \"18.0.2.1\" 2022-08-18" "openjdk" "180" "detected java 11 from oracle or any openjdk" +run_test "openjdk version \"19-ea\" 2022-09-20" "openjdk" "190" "detected java 11 from oracle or any openjdk" From 48269572ebcdc3791a2f48c3583b15454c46a006 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 10 Sep 2022 15:41:58 +0200 Subject: [PATCH 15/55] Use the same jversion convention in designer.bat java 1.8.0: 80 java 9.0: 90 java 17.0: 170 --- .../src/main/resources/scripts/designer.bat | 28 +++-- .../test/resources/scripts/designertest.bat | 103 ++++++++++++++++++ 2 files changed, 120 insertions(+), 11 deletions(-) create mode 100644 pmd-dist/src/test/resources/scripts/designertest.bat diff --git a/pmd-dist/src/main/resources/scripts/designer.bat b/pmd-dist/src/main/resources/scripts/designer.bat index bc3cbb9188..a53623c28c 100644 --- a/pmd-dist/src/main/resources/scripts/designer.bat +++ b/pmd-dist/src/main/resources/scripts/designer.bat @@ -4,35 +4,41 @@ set OPTS= set MAIN_CLASS=net.sourceforge.pmd.util.fxdesigner.DesignerStarter -:: sets the jver variable to the java version, eg 901 for 9.0.1+x or 180 for 1.8.0_171-b11 +:: sets the jver variable to the java version, eg 90 for 9.0.1+x or 80 for 1.8.0_171-b11 or 110 for 11.0.6.1 :: sets the jvendor variable to either java (oracle) or openjdk for /f tokens^=1^,3^,4^,5^ delims^=.-_+^"^ %%j in ('java -version 2^>^&1 ^| find "version"') do ( set jvendor=%%j if %%l EQU ea ( - set /A "jver=%%k00" + set /A "jver=%%k0" ) else ( - set /A jver=%%k%%l%%m + if %%k EQU 1 ( + :: for java version 1.7.x, 1.8.x, ignore the first 1. + set /A "jver=%%l%%m" + ) else ( + set /A "jver=%%k%%l" + ) ) ) + Set "jreopts=" :: oracle java 9 and 10 has javafx included as a module -if /I "%jvendor%" EQU "java" ( - if %jver% GEQ 900 ( - if %jver% LSS 1100 ( +if /I %jvendor% == java ( + if %jver% GEQ 90 ( + if %jver% LSS 110 ( :: enable reflection - Set jreopts=--add-opens javafx.controls/javafx.scene.control.skin=ALL-UNNAMED + set jreopts=--add-opens javafx.controls/javafx.scene.control.skin=ALL-UNNAMED ) ) ) set "_needjfxlib=0" -if /I "%jvendor%" EQU "openjdk" set _needjfxlib=1 -if /I "%jvendor%" EQU "java" ( - if %jver% GEQ 1100 set _needjfxlib=1 +if /I %jvendor% == openjdk set _needjfxlib=1 +if /I %jvendor% == java ( + if %jver% GEQ 110 set _needjfxlib=1 ) if %_needjfxlib% EQU 1 ( - if %jver% LSS 1000 ( + if %jver% LSS 100 ( echo For openjfx at least java 10 is required. pause exit diff --git a/pmd-dist/src/test/resources/scripts/designertest.bat b/pmd-dist/src/test/resources/scripts/designertest.bat new file mode 100644 index 0000000000..d43a5ff146 --- /dev/null +++ b/pmd-dist/src/test/resources/scripts/designertest.bat @@ -0,0 +1,103 @@ +@echo off + +:: BSD-style license; for more info see http://pmd.sourceforge.net/license.html + +:: +:: Simple manual test script +:: - code is copied from designer.bat to be tested here (so please check, it might be out of sync) +:: - mostly the function "determine_java_version" is tested here +:: - just run it with "designertest.bat" and look at the output +:: - test cases are at the end of this script +:: + +GOTO :main + +:determine_java_version +:: sets the jver variable to the java version, eg 90 for 9.0.1+x or 80 for 1.8.0_171-b11 or 110 for 11.0.6.1 +:: sets the jvendor variable to either java (oracle) or openjdk +for /f tokens^=1^,3^,4^,5^ delims^=.-_+^"^ %%j in (%full_version%) do ( + set jvendor=%%j + if %%l EQU ea ( + set /A "jver=%%k0" + ) else ( + if %%k EQU 1 ( + :: for java version 1.7.x, 1.8.x, ignore the first 1. + set /A "jver=%%l%%m" + ) else ( + set /A "jver=%%k%%l" + ) + ) +) + +set detection= +if %jver% GEQ 70 ( + if %jver% LSS 80 ( + set detection="detected java 7" + ) +) +if [%detection%] == [] ( + if %jver% GEQ 80 ( + if %jver% LSS 90 ( + set detection="detected java 8" + ) + ) +) +if [%detection%] == [] ( + if %jver% GEQ 90 ( + if %jver% LSS 110 ( + if %jvendor% == java ( + set detection="detected java 9 or 10 from oracle" + ) + ) + ) +) +if [%detection%] == [] ( + if %jvendor% == openjdk ( + set detection="detected java 11 from oracle or any openjdk" + ) +) +if [%detection%] == [] ( + if %jvendor% == java ( + if %jver% GEQ 110 ( + set detection="detected java 11 from oracle or any openjdk" + ) + ) +) + +EXIT /B + + + +:run_test +set full_version=%1 +set expected_vendor=%2 +set expected_version=%3 +set expected_detection=%4 + +CALL :determine_java_version + +echo full_version: %full_version% +if %jver% == %expected_version% ( echo jver: %jver% OK ) ELSE ( echo jver: %jver% EXPECTED: %expected_version%  ) +if %jvendor% == %expected_vendor% ( echo jvendor: %jvendor% OK ) ELSE ( echo jvendor: %jvendor% EXPECTED: %expected_vendor%  ) +if [%detection%] == [%expected_detection%] ( echo detection: %detection% OK ) ELSE ( echo detection: %detection% EXPECTED: %expected_detection%  ) +echo. + +EXIT /B + +:main + +CALL :run_test "java version ""1.7.0_80""" java 70 "detected java 7" +CALL :run_test "openjdk version ""1.7.0_352""" openjdk 70 "detected java 7" +CALL :run_test "java version ""1.8.0_271""" java 80 "detected java 8" +CALL :run_test "openjdk version ""1.8.0_345""" openjdk 80 "detected java 8" +CALL :run_test "java version ""9.0.4""" java 90 "detected java 9 or 10 from oracle" +CALL :run_test "openjdk version ""9.0.4""" openjdk 90 "detected java 11 from oracle or any openjdk" +CALL :run_test "java version ""10.0.2"" 2018-07-17" java 100 "detected java 9 or 10 from oracle" +CALL :run_test "openjdk version ""11.0.6"" 2022-08-12" openjdk 110 "detected java 11 from oracle or any openjdk" +CALL :run_test "openjdk version ""11.0.6.1"" 2022-08-12" openjdk 110 "detected java 11 from oracle or any openjdk" +CALL :run_test "java version ""11.0.13"" 2021-10-19 LTS" java 110 "detected java 11 from oracle or any openjdk" +CALL :run_test "openjdk version ""17.0.4"" 2022-08-12" openjdk 170 "detected java 11 from oracle or any openjdk" +CALL :run_test "openjdk version ""17.1.4"" 2022-08-12" openjdk 171 "detected java 11 from oracle or any openjdk" +CALL :run_test "openjdk version ""17.0.4.1"" 2022-08-12" openjdk 170 "detected java 11 from oracle or any openjdk" +CALL :run_test "openjdk version ""18.0.2.1"" 2022-08-18" openjdk 180 "detected java 11 from oracle or any openjdk" +CALL :run_test "openjdk version ""19-ea"" 2022-09-20" openjdk 190 "detected java 11 from oracle or any openjdk" From 9a46adf8a9787277f47613bfbccfdbd97d8ee578 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 10 Sep 2022 16:54:24 +0200 Subject: [PATCH 16/55] Bump maven-pmd-plugin from 3.18.0 to 3.19.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9036d17f18..9037678aa3 100644 --- a/pom.xml +++ b/pom.xml @@ -94,7 +94,7 @@ 3.0.0-M5 9.3 3.1.2 - 3.18.0 + 3.19.0 1.10.12 3.2.0 4.7.2 From 15100104425fe9372a686036a3c9628ef82e807f Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 10 Sep 2022 16:54:52 +0200 Subject: [PATCH 17/55] Bump maven-checkstyle-plugin from 3.1.2 to 3.2.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9037678aa3..d54fd0c10e 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ 5.0 3.0.0-M5 9.3 - 3.1.2 + 3.2.0 3.19.0 1.10.12 3.2.0 From 940252bafcbd6fedf4465297b4ebe5972df47554 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 10 Sep 2022 16:55:03 +0200 Subject: [PATCH 18/55] Bump checkstyle from 9.3 to 10.3.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d54fd0c10e..992a104099 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ 5.0 3.0.0-M5 - 9.3 + 10.3.3 3.2.0 3.19.0 1.10.12 From ba262675af36840e8fb5ca1042a1b7d94a95248e Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 10 Sep 2022 17:14:59 +0200 Subject: [PATCH 19/55] Bump org.yaml:snakeyaml from 1.30 to 1.31 Fixes https://github.com/advisories/GHSA-3mc7-4q67-w48m Fixes https://github.com/pmd/pmd/security/dependabot/24 Fixes CVE-2022-25857 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 992a104099..bece94f2d0 100644 --- a/pom.xml +++ b/pom.xml @@ -770,7 +770,7 @@ org.yaml snakeyaml - 1.30 + 1.31 From dba3a76312f69f08c9833dcabc35976b25789eb7 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sun, 11 Sep 2022 11:09:29 +0200 Subject: [PATCH 20/55] Add @mohan-chinnappan-n as a contributor --- .all-contributorsrc | 12 +++++++++++- docs/pages/pmd/projectdocs/credits.md | 25 +++++++++++++------------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 908c5cc8cb..3120c1af00 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6798,7 +6798,8 @@ "contributions": [ "doc" ] - },{ + }, + { "login": "pacvz", "name": "pacvz", "avatar_url": "https://avatars.githubusercontent.com/u/35453365?v=4", @@ -6806,6 +6807,15 @@ "contributions": [ "code" ] + }, + { + "login": "mohan-chinnappan-n", + "name": "mohan-chinnappan-n", + "avatar_url": "https://avatars.githubusercontent.com/u/5963194?v=4", + "profile": "https://mohan-chinnappan-n.github.io/about/cv.html", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 536ffc76a9..53a6336d25 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -863,111 +863,112 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
meandonlyme

🐛
mikesive

🐛
milossesic

🐛 +
mohan-chinnappan-n

💻
mriddell95

🐛
mrlzh

🐛
msloan

🐛 -
mucharlaravalika

🐛 +
mucharlaravalika

🐛
mvenneman

🐛
nareshl119

🐛
nicolas-harraudeau-sonarsource

🐛
noerremark

🐛
novsirion

🐛
oggboy

🐛 -
oinume

🐛 +
oinume

🐛
orimarko

💻 🐛
pacvz

💻
pallavi agarwal

🐛
parksungrin

🐛
patpatpat123

🐛
patriksevallius

🐛 -
pbrajesh1

🐛 +
pbrajesh1

🐛
phoenix384

🐛
piotrszymanski-sc

💻
plan3d

🐛
poojasix

🐛
prabhushrikant

🐛
pujitha8783

🐛 -
r-r-a-j

🐛 +
r-r-a-j

🐛
raghujayjunk

🐛
rajeshveera

🐛
rajeswarreddy88

🐛
recdevs

🐛
reudismam

💻 🐛
rijkt

🐛 -
rillig-tk

🐛 +
rillig-tk

🐛
rmohan20

💻 🐛
rxmicro

🐛
ryan-gustafson

💻 🐛
sabi0

🐛
scais

🐛
sebbASF

🐛 -
sergeygorbaty

💻 +
sergeygorbaty

💻
shilko2013

🐛
shiomiyan

📖
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

🐛 -
任贵杰

🐛 +
任贵杰

🐛
茅延安

💻 From 91d8930e9111c35ac38691e49d32b4361110d01f Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sun, 11 Sep 2022 11:09:46 +0200 Subject: [PATCH 21/55] [doc] Update release notes (#4116) --- 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 b8f8783555..84d0bc0712 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -15,10 +15,12 @@ This is a {{ site.pmd.release_type }} release. ### New and noteworthy ### Fixed Issues +* [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example ### API Changes ### External Contributions +* [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) {% endtocmaker %} From 0962a33e1489b4437f970987ae88042a5c1d6e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20=C5=BBygie=C5=82o?= Date: Thu, 7 Jul 2022 13:03:15 +0200 Subject: [PATCH 22/55] Fix typo --- pmd-java/src/main/resources/category/java/design.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/main/resources/category/java/design.xml b/pmd-java/src/main/resources/category/java/design.xml index edeecae3fd..9cedd65fac 100644 --- a/pmd-java/src/main/resources/category/java/design.xml +++ b/pmd-java/src/main/resources/category/java/design.xml @@ -17,7 +17,7 @@ Rules that help you discover design issues. message="No abstract method which means that the keyword is most likely used to prevent instantiation. Use a private or protected constructor instead." externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_design.html#abstractclasswithoutanymethod"> -If an abstract class does not provides any methods, it may be acting as a simple data container +If an abstract class does not provide any methods, it may be acting as a simple data container that is not meant to be instantiated. In this case, it is probably better to use a private or protected constructor in order to prevent instantiation than make the class misleadingly abstract. From 57138dc1c7aa4a09ba55fcf4218afdc2cbab5d78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20=C5=BBygie=C5=82o?= Date: Thu, 7 Jul 2022 13:04:24 +0200 Subject: [PATCH 23/55] Fix punctuation/use full stop in sentence --- pmd-java/src/main/resources/category/java/design.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/main/resources/category/java/design.xml b/pmd-java/src/main/resources/category/java/design.xml index 9cedd65fac..5b472ad544 100644 --- a/pmd-java/src/main/resources/category/java/design.xml +++ b/pmd-java/src/main/resources/category/java/design.xml @@ -53,7 +53,7 @@ public abstract class Example { class="net.sourceforge.pmd.lang.rule.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_design.html#avoidcatchinggenericexception"> -Avoid catching generic exceptions such as NullPointerException, RuntimeException, Exception in try-catch block +Avoid catching generic exceptions such as NullPointerException, RuntimeException, Exception in try-catch block. 3 From f4a0dff0c9b732b82530e59ce352364ca03f5c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20=C5=BBygie=C5=82o?= Date: Tue, 21 Jul 2020 23:23:32 +0200 Subject: [PATCH 24/55] Add missing 'to' and agree verb with subject --- pmd-java/src/main/resources/category/java/bestpractices.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/main/resources/category/java/bestpractices.xml b/pmd-java/src/main/resources/category/java/bestpractices.xml index e865f684e4..122b0e4dc7 100644 --- a/pmd-java/src/main/resources/category/java/bestpractices.xml +++ b/pmd-java/src/main/resources/category/java/bestpractices.xml @@ -19,7 +19,7 @@ Rules which enforce generally accepted best practices. The abstract class does not contain any abstract methods. An abstract class suggests an incomplete implementation, which is to be completed by subclasses implementing the abstract methods. If the class is intended to be used as a base class only (not to be instantiated -directly) a protected constructor can be provided prevent direct instantiation. +directly) a protected constructor can be provided to prevent direct instantiation. 3 From a3ea6be9caa76fc75ec7cce383e4fd1d15c3eded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotrek=20=C5=BBygie=C5=82o?= Date: Mon, 12 Sep 2022 20:29:00 +0200 Subject: [PATCH 25/55] Fix it's -> its --- pmd-java/src/main/resources/category/java/codestyle.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/main/resources/category/java/codestyle.xml b/pmd-java/src/main/resources/category/java/codestyle.xml index f9770a891b..f222b6cf88 100644 --- a/pmd-java/src/main/resources/category/java/codestyle.xml +++ b/pmd-java/src/main/resources/category/java/codestyle.xml @@ -436,7 +436,7 @@ public class Éléphant {} externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_codestyle.html#commentdefaultaccessmodifier"> To avoid mistakes if we want that an Annotation, Class, Enum, Method, Constructor or Field have a default access modifier -we must add a comment at the beginning of it's declaration. +we must add a comment at the beginning of its declaration. By default the comment must be `/* default */` or `/* package */`, if you want another, you have to provide a regular expression. This rule ignores by default all cases that have a @VisibleForTesting annotation. Use the property "ignoredAnnotations" to customize the recognized annotations. From 936cbafd36c4548f1517a457cfdb3f40ef9b4bad Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Tue, 13 Sep 2022 21:58:02 -0700 Subject: [PATCH 26/55] remove unused param --- .../src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java index 8e4f354b17..cd9a260b6d 100644 --- a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java +++ b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java @@ -75,11 +75,11 @@ public class LuaTokenizer extends AntlrTokenizer { @Override protected void analyzeTokens(final AntlrToken currentToken, final Iterable remainingTokens) { discardCurrent = false; - skipRequires(currentToken, remainingTokens); + skipRequires(currentToken); skipLiteralSequences(currentToken, remainingTokens); } - private void skipRequires(final AntlrToken currentToken, final Iterable remainingTokens) { + private void skipRequires(final AntlrToken currentToken) { final int type = currentToken.getKind(); if (type == LuaLexer.REQUIRE) { discardingRequires = true; From f7a5f9cad98babfc8cff8e0209ea110bb5948958 Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Tue, 13 Sep 2022 22:17:43 -0700 Subject: [PATCH 27/55] fix incorrect comments --- .../src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java index cd9a260b6d..328c5e8ab0 100644 --- a/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java +++ b/pmd-lua/src/main/java/net/sourceforge/pmd/cpd/LuaTokenizer.java @@ -21,7 +21,7 @@ public class LuaTokenizer extends AntlrTokenizer { private boolean ignoreLiteralSequences = false; /** - * Sets the possible options for the C# tokenizer. + * Sets the possible options for the Lua tokenizer. * * @param properties the properties * @see #OPTION_IGNORE_LITERAL_SEQUENCES @@ -49,8 +49,8 @@ public class LuaTokenizer extends AntlrTokenizer { * The {@link LuaTokenFilter} extends the {@link AntlrTokenFilter} to discard * Lua-specific tokens. *

- * By default, it enables annotation-based CPD suppression. - * If the --ignoreUsings flag is provided, require() directives are filtered out. + * By default, it discards semicolons, require statements, and + * enables annotation-based CPD suppression. *

*/ private static class LuaTokenFilter extends AntlrTokenFilter { From 05c30a1053628e90c5ec28374d2ef017a436182d Mon Sep 17 00:00:00 2001 From: Matt Hargett Date: Tue, 13 Sep 2022 22:52:14 -0700 Subject: [PATCH 28/55] Update documentation and changelog --- docs/pages/pmd/userdocs/cpd/cpd.md | 2 +- docs/pages/release_notes.md | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/pages/pmd/userdocs/cpd/cpd.md b/docs/pages/pmd/userdocs/cpd/cpd.md index 67b81492be..22d594259b 100644 --- a/docs/pages/pmd/userdocs/cpd/cpd.md +++ b/docs/pages/pmd/userdocs/cpd/cpd.md @@ -122,7 +122,7 @@ Novice as much as advanced readers may want to [read on on Refactoring Guru](htt {% include custom/cli_option_row.html options="--ignore-literal-sequences" description="Ignore sequences of literals (common e.g. in list initializers)" default="false" - languages="C#, C++" + languages="C#, C++, Lua" %} {% include custom/cli_option_row.html options="--ignore-usings" description="Ignore `using` directives in C# when comparing text" diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 84d0bc0712..720dd44e3e 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -14,13 +14,22 @@ This is a {{ site.pmd.release_type }} release. ### New and noteworthy +#### Luau Support + +This release of PMD brings support for [Luau](https://github.com/Roblox/luau), a gradually typed language derived from Lua. + ### Fixed Issues * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example ### API Changes +#### CPD CLI + +* CPD now supports the `--ignore-literal-sequences` argument when analyzing Lua code. + ### External Contributions * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) +* [#4066](https://github.com/pmd/pmd/pull/4066): \[lua] Add support for Luau syntax and skipping literal sequences in CPD - [@matthargett](https://github.com/matthargett) {% endtocmaker %} From 7f7f8f7b6a1f5f23ac7af94a5066f1e229e9ed19 Mon Sep 17 00:00:00 2001 From: Oleg Andreych Date: Fri, 26 Aug 2022 00:26:10 +0500 Subject: [PATCH 29/55] False-positive UnnecessaryFullyQualifiedName when nested and non-nested classes with the same name and in the same package are used together #4085 --- .../UnnecessaryFullyQualifiedNameRule.java | 31 ++++++++++++++++--- .../xml/UnnecessaryFullyQualifiedName.xml | 19 ++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java index 32bf8fa21c..36773e3a91 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java @@ -17,7 +17,9 @@ import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; import net.sourceforge.pmd.RuleContext; +import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType; +import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit; import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTName; import net.sourceforge.pmd.lang.java.ast.ASTNameList; @@ -186,9 +188,11 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { if (matches.isEmpty()) { if (isJavaLangImplicit(node)) { - addViolation(data, node, new Object[] { node.getImage(), "java.lang.*", "implicit "}); + addViolation(data, node, new Object[]{node.getImage(), "java.lang.*", "implicit "}); } else if (isSamePackage(node, name)) { - addViolation(data, node, new Object[] { node.getImage(), currentPackage + ".*", "same package "}); + if (!hasSameSimpleNameInScope(node)) { + addViolation(data, node, new Object[]{node.getImage(), currentPackage + ".*", "same package "}); + } } } else { ASTImportDeclaration firstMatch = findFirstMatch(matches); @@ -199,11 +203,30 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { String importStr = firstMatch.getImportedName() + (firstMatch.isImportOnDemand() ? ".*" : ""); String type = firstMatch.isStatic() ? "static " : ""; - addViolation(data, node, new Object[] { node.getImage(), importStr, type }); + addViolation(data, node, new Object[]{node.getImage(), importStr, type}); } } } + private boolean hasSameSimpleNameInScope(TypeNode node) { + final ASTCompilationUnit root = node.getRoot(); + final List declarationDescendants = root.findDescendantsOfType(ASTClassOrInterfaceDeclaration.class); + final Class nodeType = node.getType(); + + if (nodeType == null) { + return false; + } + + final String nodeSimpleName = nodeType.getSimpleName(); + + for (ASTClassOrInterfaceDeclaration declarationDescendant : declarationDescendants) { + if (nodeSimpleName.equals(declarationDescendant.getSimpleName())) { + return true; + } + } + return false; + } + private ASTImportDeclaration findFirstMatch(List imports) { // first search only static imports ASTImportDeclaration result = null; @@ -404,7 +427,7 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { // Is it a conflict with a class in the same file? final Set qualifiedTypes = node.getScope().getEnclosingScope(SourceFileScope.class) - .getQualifiedTypeNames().keySet(); + .getQualifiedTypeNames().keySet(); for (final String qualified : qualifiedTypes) { int fullLength = qualified.length(); if (qualified.endsWith(unqualifiedName) diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml index f95d7bc81e..865f62c789 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml @@ -622,6 +622,25 @@ public class UnnecessaryFullyQualifiedName { ]]> + + False positive when same package inner class is referenced (not enum) + 0 + + + #2098 false positive with annotated package 0 From af30f4cef92d882d253ee2f0c9d5144737412635 Mon Sep 17 00:00:00 2001 From: Oleg Andreych Date: Sun, 18 Sep 2022 15:29:50 +0500 Subject: [PATCH 30/55] False-positive UnnecessaryFullyQualifiedName when nested and non-nested classes with the same name and in the same package are used together #4085 * Regression fix; --- .../UnnecessaryFullyQualifiedNameRule.java | 10 +++++----- .../xml/UnnecessaryFullyQualifiedName.xml | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java index 36773e3a91..5348abca59 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java @@ -188,10 +188,11 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { if (matches.isEmpty()) { if (isJavaLangImplicit(node)) { - addViolation(data, node, new Object[]{node.getImage(), "java.lang.*", "implicit "}); + asCtx(data).addViolation(node, + node.getImage(), "java.lang.*", "implicit "); } else if (isSamePackage(node, name)) { if (!hasSameSimpleNameInScope(node)) { - addViolation(data, node, new Object[]{node.getImage(), currentPackage + ".*", "same package "}); + asCtx(data).addViolation(node, node.getImage(), currentPackage + ".*", "same package "); } } } else { @@ -217,10 +218,9 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { return false; } - final String nodeSimpleName = nodeType.getSimpleName(); - for (ASTClassOrInterfaceDeclaration declarationDescendant : declarationDescendants) { - if (nodeSimpleName.equals(declarationDescendant.getSimpleName())) { + if (nodeType.getSimpleName().equals(declarationDescendant.getSimpleName()) + && !nodeType.getName().equals(declarationDescendant.getQualifiedName().toString())) { return true; } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml index 865f62c789..426bb9b4b6 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml @@ -641,6 +641,21 @@ public class OuterTestClass { ]]> + + Should report fully-qualified name usage of a class in itself. + 1 + 4 + + + #2098 false positive with annotated package 0 From 9d7c37cef73348a64b3886ea340a100d1e078bab Mon Sep 17 00:00:00 2001 From: Suvashri <112872981+Suvashri@users.noreply.github.com> Date: Wed, 21 Sep 2022 15:28:51 +0530 Subject: [PATCH 31/55] Update performance.xml --- pmd-java/src/main/resources/category/java/performance.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/main/resources/category/java/performance.xml b/pmd-java/src/main/resources/category/java/performance.xml index d211ac31b4..14a8958bcb 100644 --- a/pmd-java/src/main/resources/category/java/performance.xml +++ b/pmd-java/src/main/resources/category/java/performance.xml @@ -845,7 +845,7 @@ private String baz() { Switch statements are intended to be used to support complex branching behaviour. Using a switch for only a few cases is ill-advised, since switches are not as easy to understand as if-then statements. In these cases use the -if-then statement to increase code readability. +if-else statement to increase code readability. 3 From dcd8ff0ac082bc38760e7154ef73bc321bd48a81 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:13:29 +0200 Subject: [PATCH 32/55] [lua] Fix parsing of short/long comments --- .../net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 17 +++++++++++------ .../sourceforge/pmd/cpd/LuaTokenizerTest.java | 5 +++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index 2c2603c0a2..fc94fa1b50 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -469,11 +469,11 @@ CLOSE_PARENS ; NL - : '\r\n' | '\r' | '\n' - | '\u0085' // ' - | '\u2028' //'' - | '\u2029' //'' - ; + : '\r\n' | '\r' | '\n' + | '\u0085' // ' + | '\u2028' //'' + | '\u2029' //'' + ; COMMA : ',' @@ -525,6 +525,11 @@ HexDigit : [0-9a-fA-F] ; +fragment +StartingSingleCommentLineInputCharacter + : ~[[\r\n\u0085\u2028\u2029] + ; + fragment SingleLineInputCharacter : ~[\r\n\u0085\u2028\u2029] @@ -535,7 +540,7 @@ COMMENT ; LINE_COMMENT - : '--' SingleLineInputCharacter* -> channel(HIDDEN) + : '--' (NL | StartingSingleCommentLineInputCharacter SingleLineInputCharacter*) -> channel(HIDDEN) ; WS diff --git a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java index 83b39442a1..fb77931286 100644 --- a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java +++ b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java @@ -44,4 +44,9 @@ public class LuaTokenizerTest extends CpdTextComparisonTest { public void testRegression() { doTest("luauTypes"); } + + @Test + public void testComment() { + doTest("comment"); + } } From 746fcbf086c514895dd85e7b7a451b3035d8e102 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:18:32 +0200 Subject: [PATCH 33/55] [lua] Fixups from #4066 --- docs/pages/release_notes.md | 5 +++-- .../main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 | 1 + .../test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 720dd44e3e..1c624b8efb 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -14,9 +14,10 @@ This is a {{ site.pmd.release_type }} release. ### New and noteworthy -#### Luau Support +#### Lua now supports additionally Luau -This release of PMD brings support for [Luau](https://github.com/Roblox/luau), a gradually typed language derived from Lua. +This release of PMD adds support for [Luau](https://github.com/Roblox/luau), a gradually typed language derived +from Lua. This means, that the Lua language in PMD can now parse both Lua and Luau. ### Fixed Issues * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example diff --git a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 index fc94fa1b50..fde74727ac 100644 --- a/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 +++ b/pmd-lua/src/main/antlr4/net/sourceforge/pmd/lang/lua/antlr4/Lua.g4 @@ -108,6 +108,7 @@ label ; laststat + // "continue" is a luau addition and actually not a reserved keyword : 'return' explist? | 'break' | 'continue' ; diff --git a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java index fb77931286..9c8705d4b4 100644 --- a/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java +++ b/pmd-lua/src/test/java/net/sourceforge/pmd/cpd/LuaTokenizerTest.java @@ -41,7 +41,7 @@ public class LuaTokenizerTest extends CpdTextComparisonTest { } @Test - public void testRegression() { + public void testLuauTypes() { doTest("luauTypes"); } From 4d630031c462acef63aa46665b179b6a7f06a623 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:29:00 +0200 Subject: [PATCH 34/55] Add missing test files --- .../pmd/lang/lua/cpd/testdata/comment.lua | 13 +++++++++++ .../pmd/lang/lua/cpd/testdata/comment.txt | 23 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.lua create mode 100644 pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.txt diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.lua b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.lua new file mode 100644 index 0000000000..d79dc5db81 --- /dev/null +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.lua @@ -0,0 +1,13 @@ + +-- inline comment ("long comment") +print(1 --[[, 2]]) + +-- line comment ("short comment") +print(1) -- comment + +-- inline comment with multiple lines ("long comment") +print(1 --[[comment line 1 +comment line 2]]) + +-- line comment without any content +print(1) -- diff --git a/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.txt b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.txt new file mode 100644 index 0000000000..f6f1fd25fd --- /dev/null +++ b/pmd-lua/src/test/resources/net/sourceforge/pmd/lang/lua/cpd/testdata/comment.txt @@ -0,0 +1,23 @@ + [Image] or [Truncated image[ Bcol Ecol +L3 + [print] 1 5 + [(] 6 6 + [1] 7 7 + [)] 18 18 +L6 + [print] 1 5 + [(] 6 6 + [1] 7 7 + [)] 8 8 +L9 + [print] 1 5 + [(] 6 6 + [1] 7 7 +L10 + [)] 17 17 +L13 + [print] 1 5 + [(] 6 6 + [1] 7 7 + [)] 8 8 +EOF From 993c5f809a70606093b67d03d7bbd5bb864a89ba Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:35:55 +0200 Subject: [PATCH 35/55] Update pmd-java/src/main/resources/category/java/performance.xml --- pmd-java/src/main/resources/category/java/performance.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/main/resources/category/java/performance.xml b/pmd-java/src/main/resources/category/java/performance.xml index 14a8958bcb..84a7da762d 100644 --- a/pmd-java/src/main/resources/category/java/performance.xml +++ b/pmd-java/src/main/resources/category/java/performance.xml @@ -844,7 +844,7 @@ private String baz() { externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_performance.html#toofewbranchesforaswitchstatement"> Switch statements are intended to be used to support complex branching behaviour. Using a switch for only a few -cases is ill-advised, since switches are not as easy to understand as if-then statements. In these cases use the +cases is ill-advised, since switches are not as easy to understand as if-else statements. In these cases use the if-else statement to increase code readability. 3 From f23f5c2f2bcf0b18a3960a1d1a67b67d912c7162 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:45:48 +0200 Subject: [PATCH 36/55] [doc] Update release notes (#4131) --- 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 84d0bc0712..1336a55897 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -21,6 +21,7 @@ This is a {{ site.pmd.release_type }} release. ### External Contributions * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) +* [#4131](https://github.com/pmd/pmd/pull/4131): \[doc] TooFewBranchesForASwitchStatement - Use "if-else" instead of "if-then" - [@Suvashri](https://github.com/Suvashri) {% endtocmaker %} From d6b5f1cf52705904ec595e8b219c98e681fa3398 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:46:14 +0200 Subject: [PATCH 37/55] Add @Suvashri as a contributor --- .all-contributorsrc | 9 ++++ docs/pages/pmd/projectdocs/credits.md | 71 ++++++++++++++------------- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3120c1af00..e29348424c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6816,6 +6816,15 @@ "contributions": [ "code" ] + }, + { + "login": "Suvashri", + "name": "Suvashri", + "avatar_url": "https://avatars.githubusercontent.com/u/112872981?v=4", + "profile": "https://github.com/Suvashri", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 53a6336d25..9f1604b29a 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -659,315 +659,316 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
StuartClayton5

🐛
Supun Arunoda

🐛
Suren Abrahamyan

🐛 -
SwatiBGupta1110

🐛 +
Suvashri

📖 +
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

🐛
Vibhor Goyal

🐛
Vickenty Fesunov

🐛
Victor Noël

🐛
Vincent Galloy

💻 -
Vincent HUYNH

🐛 +
Vincent HUYNH

🐛
Vincent Maurin

🐛
Vincent Privat

🐛
Vishhwas

🐛
Vitaly

🐛
Vitaly Polonetsky

🐛
Vojtech Polivka

🐛 -
Vsevolod Zholobov

🐛 +
Vsevolod Zholobov

🐛
Vyom Yadav

💻
Wang Shidong

🐛
Waqas Ahmed

🐛
Wayne J. Earl

🐛
Wchenghui

🐛
Will Winder

🐛 -
William Brockhus

💻 🐛 +
William Brockhus

💻 🐛
Wilson Kurniawan

🐛
Wim Deblauwe

🐛
Woongsik Choi

🐛
XenoAmess

💻 🐛
Yang

💻
YaroslavTER

🐛 -
Young Chan

💻 🐛 +
Young Chan

💻 🐛
YuJin Kim

🐛
Yuri Dolzhenko

🐛
Yurii Dubinka

🐛
Zoltan Farkas

🐛
Zustin

🐛
aaronhurst-google

🐛 💻 -
alexmodis

🐛 +
alexmodis

🐛
andreoss

🐛
andrey81inmd

💻 🐛
anicoara

🐛
arunprasathav

🐛
asiercamara

🐛
astillich-igniti

💻 -
avesolovksyy

🐛 +
avesolovksyy

🐛
avishvat

🐛
avivmu

🐛
axelbarfod1

🐛
b-3-n

🐛
balbhadra9

🐛
base23de

🐛 -
bergander

🐛 +
bergander

🐛
berkam

💻 🐛
breizh31

🐛
caesarkim

🐛
carolyujing

🐛
cesares-basilico

🐛
chrite

🐛 -
cobratbq

🐛 +
cobratbq

🐛
coladict

🐛
cosmoJFH

🐛
cristalp

🐛
crunsk

🐛
cwholmes

🐛
cyberjj999

🐛 -
cyw3

🐛 +
cyw3

🐛
d1ss0nanz

🐛
dalizi007

💻
danbrycefairsailcom

🐛
dariansanity

🐛
darrenmiliband

🐛
davidburstrom

🐛 -
dbirkman-paloalto

🐛 +
dbirkman-paloalto

🐛
deepak-patra

🐛
dependabot[bot]

💻 🐛
dinesh150

🐛
diziaq

🐛
dreaminpast123

🐛
duanyanan

🐛 -
dutt-sanjay

🐛 +
dutt-sanjay

🐛
dylanleung

🐛
dzeigler

🐛
ekkirala

🐛
emersonmoura

🐛
fairy

🐛
filiprafalowicz

💻 -
foxmason

🐛 +
foxmason

🐛
frankegabor

🐛
frankl

🐛
freafrea

🐛
fsapatin

🐛
gracia19

🐛
guo fei

🐛 -
gurmsc5

🐛 +
gurmsc5

🐛
gwilymatgearset

💻 🐛
haigsn

🐛
hemanshu070

🐛
henrik242

🐛
hongpuwu

🐛
hvbtup

💻 🐛 -
igniti GmbH

🐛 +
igniti GmbH

🐛
ilovezfs

🐛
itaigilo

🐛
jakivey32

🐛
jbennett2091

🐛
jcamerin

🐛
jkeener1

🐛 -
jmetertea

🐛 +
jmetertea

🐛
johnra2

💻
josemanuelrolon

💻 🐛
kabroxiko

💻 🐛
karwer

🐛
kaulonline

🐛
kdaemonv

🐛 -
kenji21

💻 🐛 +
kenji21

💻 🐛
kfranic

🐛
khalidkh

🐛
krzyk

🐛
lasselindqvist

🐛
lgemeinhardt

🐛
lihuaib

🐛 -
lonelyma1021

🐛 +
lonelyma1021

🐛
lpeddy

🐛
lujiefsi

💻
lukelukes

💻
lyriccoder

🐛
marcelmore

🐛
matchbox

🐛 -
matthiaskraaz

🐛 +
matthiaskraaz

🐛
meandonlyme

🐛
mikesive

🐛
milossesic

🐛
mohan-chinnappan-n

💻
mriddell95

🐛
mrlzh

🐛 -
msloan

🐛 +
msloan

🐛
mucharlaravalika

🐛
mvenneman

🐛
nareshl119

🐛
nicolas-harraudeau-sonarsource

🐛
noerremark

🐛
novsirion

🐛 -
oggboy

🐛 +
oggboy

🐛
oinume

🐛
orimarko

💻 🐛
pacvz

💻
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

🐛
shiomiyan

📖
simeonKondr

🐛
snajberk

🐛
sniperrifle2004

🐛 -
snuyanzin

🐛 💻 +
snuyanzin

🐛 💻
sratz

🐛
stonio

🐛
sturton

💻 🐛
sudharmohan

🐛
suruchidawar

🐛
svenfinitiv

🐛 -
tashiscool

🐛 +
tashiscool

🐛
test-git-hook

🐛
testation21

💻 🐛
thanosa

🐛
tiandiyixian

🐛
tobwoerk

🐛
tprouvot

🐛 💻 -
trentchilders

🐛 +
trentchilders

🐛
triandicAnt

🐛
trishul14

🐛
tsui

🐛
winhkey

🐛
witherspore

🐛
wjljack

🐛 -
wuchiuwong

🐛 +
wuchiuwong

🐛
xingsong

🐛
xioayuge

🐛
xnYi9wRezm

💻 🐛
xuanuy

🐛
xyf0921

🐛
yalechen-cyw3

🐛 -
yasuharu-sato

🐛 +
yasuharu-sato

🐛
zenglian

🐛
zgrzyt93

💻 🐛
zh3ng

🐛
zt_soft

🐛
ztt79

🐛
zzzzfeng

🐛 -
Árpád Magosányi

🐛 +
Árpád Magosányi

🐛
任贵杰

🐛
茅延安

💻 From b56e697b28a887947b783e47186e2e56dc7000b4 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:50:55 +0200 Subject: [PATCH 38/55] Bump org.yaml:snakeyaml from 1.31 to 1.32 Fixes https://github.com/pmd/pmd/security/dependabot/25 Fixes https://github.com/advisories/GHSA-9w3m-gqgf-c4p9 Fixes CVE-2022-38752 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bece94f2d0..569c34bfd1 100644 --- a/pom.xml +++ b/pom.xml @@ -770,7 +770,7 @@ org.yaml snakeyaml - 1.31 + 1.32 From 0dcff7245549f6bcfe9f27c1fab6e5219ce5fd77 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sat, 24 Sep 2022 17:52:56 +0200 Subject: [PATCH 39/55] Update gems Fixes https://github.com/pmd/pmd/security/dependabot/26 Fixes https://github.com/advisories/GHSA-4qw4-jpp4-8gvp --- Gemfile.lock | 29 +++++++++++++++-------------- docs/Gemfile.lock | 20 ++++++++++---------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0a16d16858..f47c7c5067 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) claide (1.1.0) claide-plugins (0.9.2) cork @@ -12,7 +12,7 @@ GEM concurrent-ruby (1.1.10) cork (0.3.0) colored2 (~> 3.1) - danger (8.6.1) + danger (9.0.0) claide (~> 1.0) claide-plugins (>= 0.9.2) colored2 (~> 3.1) @@ -23,12 +23,12 @@ GEM kramdown (~> 2.3) kramdown-parser-gfm (~> 1.0) no_proxy_fix - octokit (~> 4.7) + octokit (~> 5.0) terminal-table (>= 1, < 4) differ (0.1.2) et-orbi (1.2.7) tzinfo - faraday (1.10.0) + faraday (1.10.2) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -43,7 +43,7 @@ GEM faraday-em_http (1.0.0) faraday-em_synchrony (1.0.0) faraday-excon (1.1.0) - faraday-http-cache (2.4.0) + faraday-http-cache (2.4.1) faraday (>= 0.8) faraday-httpclient (1.0.1) faraday-multipart (1.0.4) @@ -53,25 +53,26 @@ GEM faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) - fugit (1.5.3) + fugit (1.7.1) et-orbi (~> 1, >= 1.2.7) raabro (~> 1.4) - git (1.11.0) + git (1.12.0) + addressable (~> 2.8) rchardet (~> 1.8) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (5.3.0) + liquid (5.4.0) logger-colors (1.0.0) mini_portile2 (2.8.0) multipart-post (2.2.3) nap (1.1.0) no_proxy_fix (0.1.2) - nokogiri (1.13.7) + nokogiri (1.13.8) mini_portile2 (~> 2.8.0) racc (~> 1.4) - octokit (4.25.1) + octokit (5.6.1) faraday (>= 1, < 3) sawyer (~> 0.9) open4 (1.3.4) @@ -82,12 +83,12 @@ GEM nokogiri (~> 1.13) rufus-scheduler (~> 3.8) slop (~> 4.6) - public_suffix (4.0.7) + public_suffix (5.0.0) raabro (1.4.0) racc (1.6.0) rchardet (1.8.0) rexml (3.2.5) - rouge (3.29.0) + rouge (4.0.0) ruby2_keywords (0.0.5) rufus-scheduler (3.8.2) fugit (~> 1.1, >= 1.1.6) @@ -100,7 +101,7 @@ GEM unicode-display_width (>= 1.1.1, < 3) tzinfo (2.0.5) concurrent-ruby (~> 1.0) - unicode-display_width (2.2.0) + unicode-display_width (2.3.0) PLATFORMS ruby diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index f85828b039..37ab0dfb1e 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -1,20 +1,20 @@ GEM remote: https://rubygems.org/ specs: - activesupport (6.0.5.1) + activesupport (6.0.6) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.11.1) colorator (1.1.0) - commonmarker (0.23.5) + commonmarker (0.23.6) concurrent-ruby (1.1.10) dnsruby (1.61.9) simpleidn (~> 0.1) @@ -25,10 +25,10 @@ GEM ffi (>= 1.15.0) eventmachine (1.2.7) execjs (2.8.1) - faraday (2.3.0) - faraday-net_http (~> 2.0) + faraday (2.5.2) + faraday-net_http (>= 2.0, < 3.1) ruby2_keywords (>= 0.0.4) - faraday-net_http (2.0.3) + faraday-net_http (3.0.0) ffi (1.15.5) forwardable-extended (2.6.0) gemoji (3.0.1) @@ -211,8 +211,8 @@ GEM jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minitest (5.16.2) - nokogiri (1.13.7) + minitest (5.16.3) + nokogiri (1.13.8) mini_portile2 (~> 2.8.0) racc (~> 1.4) octokit (4.25.1) @@ -222,7 +222,7 @@ GEM forwardable-extended (~> 2.6) public_suffix (4.0.7) racc (1.6.0) - rb-fsevent (0.11.1) + rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) rexml (3.2.5) From a44c3287328a15f100cd6ccb992b286ea5cb2284 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Mon, 26 Sep 2022 18:39:49 +0200 Subject: [PATCH 40/55] [java] FinalFieldCouldBeStatic - ignore synchronized statements in non-static methods Fixes #4090 --- docs/pages/release_notes.md | 5 +++- .../main/resources/category/java/design.xml | 2 ++ .../design/xml/FinalFieldCouldBeStatic.xml | 30 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 364ff7c856..a47b35abbe 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -20,7 +20,10 @@ This release of PMD adds support for [Luau](https://github.com/Roblox/luau), a g from Lua. This means, that the Lua language in PMD can now parse both Lua and Luau. ### Fixed Issues -* [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example +* core + * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example +* java-design + * [#4090](https://github.com/pmd/pmd/issues/4090): \[java] FinalFieldCouldBeStatic false positive with non-static synchronized block (regression in 6.48, worked with 6.47) ### API Changes diff --git a/pmd-java/src/main/resources/category/java/design.xml b/pmd-java/src/main/resources/category/java/design.xml index edeecae3fd..39b45d1992 100644 --- a/pmd-java/src/main/resources/category/java/design.xml +++ b/pmd-java/src/main/resources/category/java/design.xml @@ -836,6 +836,8 @@ in each object at runtime. ] ] /VariableDeclaratorId + [not(@Image = //MethodDeclaration[@Static = false()]//SynchronizedStatement/Expression/PrimaryExpression/ + (PrimaryPrefix/Name|PrimarySuffix[preceding-sibling::PrimaryPrefix[@ThisModifier = true()]])/@Image)] ]]> diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/FinalFieldCouldBeStatic.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/FinalFieldCouldBeStatic.xml index e5f41598a0..4ed2aed5c1 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/FinalFieldCouldBeStatic.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/FinalFieldCouldBeStatic.xml @@ -231,4 +231,34 @@ public class Foo { } ]]>
+ + + [java] FinalFieldCouldBeStatic false positive with non-static synchronized block (regression in 6.48, worked with 6.47) #4090 + 1 + 4 + + From 58c9f361d3447e10e0ebcfe3cd00c7709a361267 Mon Sep 17 00:00:00 2001 From: Luis Alcantar Date: Wed, 28 Sep 2022 12:01:32 -0700 Subject: [PATCH 41/55] [java] issue#3859: Exclude junit5 test methods from the commentDefaultAccessModifierRule There was a conflict between the CommentDefaultAccessModifier and the JUnit5TestShouldBePackagePrivate rule. while the JUnit5TestShouldBePackagePrivate rule passed, the CommentDefaultAccessModifier complained about the lack of a comment on the method encapsulation generating a false alert. example "@org.junit.jupiter.api.Test void MissingCommentMethod {}", missing " /* default */" but not required in junit5. The changes will exclude methods with junit5 @Test or @ParameterizedTest annotation for the commentDefaultAccessModifierRule. --- docs/pages/release_notes.md | 2 + .../CommentDefaultAccessModifierRule.java | 8 +++- .../MethodNamingConventionsRule.java | 7 +-- .../java/types/TestingFrameworkTypeUtil.java | 28 ++++++++++++ .../types/TestingFrameworkTypeUtilTest.java | 45 +++++++++++++++++++ .../xml/CommentDefaultAccessModifier.xml | 15 +++++++ 6 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/TestingFrameworkTypeUtil.java create mode 100644 pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/TestingFrameworkTypeUtilTest.java diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 364ff7c856..aab407056f 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -21,6 +21,7 @@ from Lua. This means, that the Lua language in PMD can now parse both Lua and Lu ### Fixed Issues * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example +* [#3859](https://github.com/pmd/pmd/pull/3859): \[java] CommentDefaultAccessModifier is triggered in JUnit5 test class ### API Changes @@ -32,6 +33,7 @@ from Lua. This means, that the Lua language in PMD can now parse both Lua and Lu * [#4066](https://github.com/pmd/pmd/pull/4066): \[lua] Add support for Luau syntax and skipping literal sequences in CPD - [@matthargett](https://github.com/matthargett) * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) * [#4131](https://github.com/pmd/pmd/pull/4131): \[doc] TooFewBranchesForASwitchStatement - Use "if-else" instead of "if-then" - [@Suvashri](https://github.com/Suvashri) +* [#3859](https://github.com/pmd/pmd/pull/3859): \[java] CommentDefaultAccessModifier is triggered in JUnit5 test class [@lfalcantar](https://github.com/lfalcantar) {% endtocmaker %} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java index 2891b13843..ac2d287a74 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java @@ -25,6 +25,7 @@ import net.sourceforge.pmd.lang.java.ast.AccessNode; import net.sourceforge.pmd.lang.java.ast.Annotatable; import net.sourceforge.pmd.lang.java.ast.Comment; import net.sourceforge.pmd.lang.java.rule.AbstractIgnoredAnnotationRule; +import net.sourceforge.pmd.lang.java.types.TestingFrameworkTypeUtil; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyFactory; @@ -72,9 +73,14 @@ public class CommentDefaultAccessModifierRule extends AbstractIgnoredAnnotationR return super.visit(node, data); } + /* + * The method determines is the method needs to be included in the violations report + * Also, the code needs to check that the method is not a Test from junit5 + * to avoid conflicts with JUnit5TestShouldBePackagePrivate + */ @Override public Object visit(final ASTMethodDeclaration decl, final Object data) { - if (shouldReport(decl)) { + if (!TestingFrameworkTypeUtil.isJunit5Test(decl) && shouldReport(decl)) { addViolationWithMessage(data, decl, String.format(MESSAGE, decl.getFirstChildOfType(ASTMethodDeclarator.class).getImage(), "method")); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java index 3d8b99554d..5b152f50c3 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java @@ -14,6 +14,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTAnyTypeDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTEnumConstant; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; +import net.sourceforge.pmd.lang.java.types.TestingFrameworkTypeUtil; import net.sourceforge.pmd.lang.java.types.TypeTestUtil; import net.sourceforge.pmd.properties.BooleanProperty; import net.sourceforge.pmd.properties.PropertyBuilder.RegexPropertyBuilder; @@ -48,10 +49,6 @@ public class MethodNamingConventionsRule extends AbstractNamingConventionRule + + + + #3859 [java] CommentDefaultAccessModifier is triggered in JUnit5 method. + and it was conflicting with rule JUnit5TestShouldBePackagePrivate + 0 + From 3ba63285ac7d4a4a4a2ddd610df44551a798d1df Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 15:04:35 +0200 Subject: [PATCH 42/55] [java] CommentDefaultAccessModifier - configure JUnit5 annotations to be ignored --- .../CommentDefaultAccessModifierRule.java | 12 ++++- .../MethodNamingConventionsRule.java | 7 ++- .../java/types/TestingFrameworkTypeUtil.java | 28 ------------ .../types/TestingFrameworkTypeUtilTest.java | 45 ------------------- .../xml/CommentDefaultAccessModifier.xml | 3 +- 5 files changed, 16 insertions(+), 79 deletions(-) delete mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/types/TestingFrameworkTypeUtil.java delete mode 100644 pmd-java/src/test/java/net/sourceforge/pmd/lang/java/types/TestingFrameworkTypeUtilTest.java diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java index ac2d287a74..f859d2d6f5 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java @@ -25,7 +25,6 @@ import net.sourceforge.pmd.lang.java.ast.AccessNode; import net.sourceforge.pmd.lang.java.ast.Annotatable; import net.sourceforge.pmd.lang.java.ast.Comment; import net.sourceforge.pmd.lang.java.rule.AbstractIgnoredAnnotationRule; -import net.sourceforge.pmd.lang.java.types.TestingFrameworkTypeUtil; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyFactory; @@ -58,6 +57,15 @@ public class CommentDefaultAccessModifierRule extends AbstractIgnoredAnnotationR Collection ignoredStrings = new ArrayList<>(); ignoredStrings.add("com.google.common.annotations.VisibleForTesting"); ignoredStrings.add("android.support.annotation.VisibleForTesting"); + ignoredStrings.add("org.junit.jupiter.api.Test"); + ignoredStrings.add("org.junit.jupiter.api.ParameterizedTest"); + ignoredStrings.add("org.junit.jupiter.api.RepeatedTest"); + ignoredStrings.add("org.junit.jupiter.api.TestFactory"); + ignoredStrings.add("org.junit.jupiter.api.TestTemplate"); + ignoredStrings.add("org.junit.jupiter.api.BeforeEach"); + ignoredStrings.add("org.junit.jupiter.api.BeforeAll"); + ignoredStrings.add("org.junit.jupiter.api.AfterEach"); + ignoredStrings.add("org.junit.jupiter.api.AfterAll"); return ignoredStrings; } @@ -80,7 +88,7 @@ public class CommentDefaultAccessModifierRule extends AbstractIgnoredAnnotationR */ @Override public Object visit(final ASTMethodDeclaration decl, final Object data) { - if (!TestingFrameworkTypeUtil.isJunit5Test(decl) && shouldReport(decl)) { + if (shouldReport(decl)) { addViolationWithMessage(data, decl, String.format(MESSAGE, decl.getFirstChildOfType(ASTMethodDeclarator.class).getImage(), "method")); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java index 5b152f50c3..3d8b99554d 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/MethodNamingConventionsRule.java @@ -14,7 +14,6 @@ import net.sourceforge.pmd.lang.java.ast.ASTAnyTypeDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTEnumConstant; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; -import net.sourceforge.pmd.lang.java.types.TestingFrameworkTypeUtil; import net.sourceforge.pmd.lang.java.types.TypeTestUtil; import net.sourceforge.pmd.properties.BooleanProperty; import net.sourceforge.pmd.properties.PropertyBuilder.RegexPropertyBuilder; @@ -49,6 +48,10 @@ public class MethodNamingConventionsRule extends AbstractNamingConventionRule - #3859 [java] CommentDefaultAccessModifier is triggered in JUnit5 method. - and it was conflicting with rule JUnit5TestShouldBePackagePrivate + #3859 [java] CommentDefaultAccessModifier is triggered in JUnit5 method and it was conflicting with rule JUnit5TestShouldBePackagePrivate 0 Date: Thu, 29 Sep 2022 15:06:20 +0200 Subject: [PATCH 43/55] [doc] Update release notes (#3859, #4137) --- docs/pages/release_notes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index aab407056f..a293f1b95a 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -21,7 +21,7 @@ from Lua. This means, that the Lua language in PMD can now parse both Lua and Lu ### Fixed Issues * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example -* [#3859](https://github.com/pmd/pmd/pull/3859): \[java] CommentDefaultAccessModifier is triggered in JUnit5 test class +* [#3859](https://github.com/pmd/pmd/issues/3859): \[java] CommentDefaultAccessModifier is triggered in JUnit5 test class ### API Changes @@ -33,7 +33,7 @@ from Lua. This means, that the Lua language in PMD can now parse both Lua and Lu * [#4066](https://github.com/pmd/pmd/pull/4066): \[lua] Add support for Luau syntax and skipping literal sequences in CPD - [@matthargett](https://github.com/matthargett) * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) * [#4131](https://github.com/pmd/pmd/pull/4131): \[doc] TooFewBranchesForASwitchStatement - Use "if-else" instead of "if-then" - [@Suvashri](https://github.com/Suvashri) -* [#3859](https://github.com/pmd/pmd/pull/3859): \[java] CommentDefaultAccessModifier is triggered in JUnit5 test class [@lfalcantar](https://github.com/lfalcantar) +* [#4137](https://github.com/pmd/pmd/pull/4137): \[java] Fixes 3859: Exclude junit5 test methods from the commentDefaultAccessModifierRule - [@lfalcantar](https://github.com/lfalcantar) {% endtocmaker %} From dbe2881d6d6fbc9cdd232b3c45d750d9980b674a Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 15:09:22 +0200 Subject: [PATCH 44/55] [doc] CommentDefaultAccessModifier - update rule description --- docs/pages/release_notes.md | 5 +++++ pmd-java/src/main/resources/category/java/codestyle.xml | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index a293f1b95a..b85a996ace 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -19,6 +19,11 @@ This is a {{ site.pmd.release_type }} release. This release of PMD adds support for [Luau](https://github.com/Roblox/luau), a gradually typed language derived from Lua. This means, that the Lua language in PMD can now parse both Lua and Luau. +#### Modified rules + +* The Java rule {% rule java/codestyle/CommentDefaultAccessModifier %} now by default ignores JUnit5 annotated + methods. This behavior can be customized using the property `ignoredAnnotations`. + ### Fixed Issues * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example * [#3859](https://github.com/pmd/pmd/issues/3859): \[java] CommentDefaultAccessModifier is triggered in JUnit5 test class diff --git a/pmd-java/src/main/resources/category/java/codestyle.xml b/pmd-java/src/main/resources/category/java/codestyle.xml index f9770a891b..ec8f37cc46 100644 --- a/pmd-java/src/main/resources/category/java/codestyle.xml +++ b/pmd-java/src/main/resources/category/java/codestyle.xml @@ -436,9 +436,10 @@ public class Éléphant {} externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_codestyle.html#commentdefaultaccessmodifier"> To avoid mistakes if we want that an Annotation, Class, Enum, Method, Constructor or Field have a default access modifier -we must add a comment at the beginning of it's declaration. -By default the comment must be `/* default */` or `/* package */`, if you want another, you have to provide a regular expression. -This rule ignores by default all cases that have a @VisibleForTesting annotation. Use the +we must add a comment at the beginning of its declaration. +By default, the comment must be `/* default */` or `/* package */`, if you want another, you have to provide a regular expression. + +This rule ignores by default all cases that have a `@VisibleForTesting` annotation or any JUnit5 annotation. Use the property "ignoredAnnotations" to customize the recognized annotations. 3 From 792fe44d0ba4211d88878183b78d82c57c238169 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 15:54:50 +0200 Subject: [PATCH 45/55] Fixups from review (#4128) --- .../rule/codestyle/UnnecessaryFullyQualifiedNameRule.java | 2 +- .../java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java index 5348abca59..8091d944e3 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/UnnecessaryFullyQualifiedNameRule.java @@ -204,7 +204,7 @@ public class UnnecessaryFullyQualifiedNameRule extends AbstractJavaRule { String importStr = firstMatch.getImportedName() + (firstMatch.isImportOnDemand() ? ".*" : ""); String type = firstMatch.isStatic() ? "static " : ""; - addViolation(data, node, new Object[]{node.getImage(), importStr, type}); + asCtx(data).addViolation(node, node.getImage(), importStr, type); } } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml index 426bb9b4b6..097e096767 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/codestyle/xml/UnnecessaryFullyQualifiedName.xml @@ -623,7 +623,7 @@ public class UnnecessaryFullyQualifiedName { - False positive when same package inner class is referenced (not enum) + False positive when same package inner class is referenced (not enum) #4085 0 - Should report fully-qualified name usage of a class in itself. + Should report fully-qualified name usage of a class in itself #4085 1 4 Date: Thu, 29 Sep 2022 16:02:51 +0200 Subject: [PATCH 46/55] Add @osiegmar as a contributor --- .all-contributorsrc | 9 +++ docs/pages/pmd/projectdocs/credits.md | 99 ++++++++++++++------------- docs/pages/release_notes.md | 6 ++ 3 files changed, 65 insertions(+), 49 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e29348424c..3a4f606e6c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6825,6 +6825,15 @@ "contributions": [ "doc" ] + }, + { + "login": "osiegmar", + "name": "Oliver Siegmar", + "avatar_url": "https://avatars.githubusercontent.com/u/1918869?v=4", + "profile": "https://github.com/osiegmar", + "contributions": [ + "financial" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 9f1604b29a..940e872308 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -533,441 +533,442 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Oleg Pavlenko

🐛
Oleksii Dykov

💻
Oliver Eikemeier

🐛 -
Olivier Parent

💻 🐛 +
Oliver Siegmar

💵 +
Olivier Parent

💻 🐛
Ollie Abbey

💻 🐛
OverDrone

🐛
Ozan Gulle

💻 🐛
PUNEET JAIN

🐛
Parbati Bose

🐛
Paul Berg

🐛 -
Pavel Bludov

🐛 +
Pavel Bludov

🐛
Pavel Mička

🐛
Pedro Nuno Santos

🐛
Pedro Rijo

🐛
Pelisse Romain

💻 📖 🐛
Per Abich

💻
Pete Davids

🐛 -
Peter Bruin

🐛 +
Peter Bruin

🐛
Peter Chittum

💻 🐛
Peter Cudmore

🐛
Peter Kasson

🐛
Peter Kofler

🐛
Peter Paul Bakker

💻
Pham Hai Trung

🐛 -
Philip Graf

💻 🐛 +
Philip Graf

💻 🐛
Philip Hachey

🐛
Philippe Ozil

🐛
Phinehas Artemix

🐛
Phokham Nonava

🐛
Piotr Szymański

🐛
Piotrek Żygieło

💻 🐛 -
Pranay Jaiswal

🐛 +
Pranay Jaiswal

🐛
Prasad Kamath

🐛
Prasanna

🐛
Presh-AR

🐛
Puneet1726

🐛
Rafael Cortês

🐛
RaheemShaik999

🐛 -
RajeshR

💻 🐛 +
RajeshR

💻 🐛
Ramachandra Mohan

🐛
Ramel0921

🐛
Raquel Pau

🐛
Ravikiran Janardhana

🐛
Reda Benhemmouche

🐛
Renato Oliveira

💻 🐛 -
Rich DiCroce

🐛 +
Rich DiCroce

🐛
Riot R1cket

🐛
Rishabh Jain

🐛
RishabhDeep Singh

🐛
Robbie Martinus

💻 🐛
Robert Henry

🐛
Robert Painsi

🐛 -
Robert Russell

🐛 +
Robert Russell

🐛
Robert Sösemann

💻 📖 📢 🐛
Robert Whitebit

🐛
Robin Richtsfeld

🐛
Robin Stocker

💻 🐛
Robin Wils

🐛
RochusOest

🐛 -
Rodolfo Noviski

🐛 +
Rodolfo Noviski

🐛
Rodrigo Casara

🐛
Rodrigo Fernandes

🐛
Roman Salvador

💻 🐛
Ronald Blaschke

🐛
Róbert Papp

🐛
Saikat Sengupta

🐛 -
Saksham Handu

🐛 +
Saksham Handu

🐛
Saladoc

🐛
Salesforce Bob Lightning

🐛
Sam Carlberg

🐛
Satoshi Kubo

🐛
Scott Kennedy

🐛
Scott Wells

🐛 💻 -
Scrsloota

💻 +
Scrsloota

💻
Sebastian Bögl

🐛
Sebastian Schuberth

🐛
Sebastian Schwarz

🐛
Sergey Gorbaty

🐛
Sergey Kozlov

🐛
Sergey Yanzin

💻 🐛 -
Seth Wilcox

💻 +
Seth Wilcox

💻
Shubham

💻 🐛
Simon Abykov

💻
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

🐛 -
Suvashri

📖 +
Suvashri

📖
SwatiBGupta1110

🐛
SyedThoufich

🐛
Szymon Sasin

🐛
T-chuangxin

🐛
TERAI Atsuhiro

🐛
TIOBE Software

💻 🐛 -
Taylor Smock

🐛 +
Taylor Smock

🐛
Techeira Damián

💻 🐛
Ted Husted

🐛
TehBakker

🐛
The Gitter Badger

🐛
Theodoor

🐛
Thiago Henrique Hüpner

🐛 -
Thibault Meyer

🐛 +
Thibault Meyer

🐛
Thomas Güttler

🐛
Thomas Jones-Low

🐛
Thomas Smith

💻 🐛
ThrawnCA

🐛
Thunderforge

💻 🐛
Tim van der Lippe

🐛 -
Tobias Weimer

💻 🐛 +
Tobias Weimer

💻 🐛
Tom Daly

🐛
Tomer Figenblat

🐛
Tomi De Lucca

💻 🐛
Torsten Kleiber

🐛
TrackerSB

🐛
Ullrich Hafner

🐛 -
Utku Cuhadaroglu

💻 🐛 +
Utku Cuhadaroglu

💻 🐛
Valentin Brandl

🐛
Valeria

🐛
Vasily Anisimov

🐛
Vibhor Goyal

🐛
Vickenty Fesunov

🐛
Victor Noël

🐛 -
Vincent Galloy

💻 +
Vincent Galloy

💻
Vincent HUYNH

🐛
Vincent Maurin

🐛
Vincent Privat

🐛
Vishhwas

🐛
Vitaly

🐛
Vitaly Polonetsky

🐛 -
Vojtech Polivka

🐛 +
Vojtech Polivka

🐛
Vsevolod Zholobov

🐛
Vyom Yadav

💻
Wang Shidong

🐛
Waqas Ahmed

🐛
Wayne J. Earl

🐛
Wchenghui

🐛 -
Will Winder

🐛 +
Will Winder

🐛
William Brockhus

💻 🐛
Wilson Kurniawan

🐛
Wim Deblauwe

🐛
Woongsik Choi

🐛
XenoAmess

💻 🐛
Yang

💻 -
YaroslavTER

🐛 +
YaroslavTER

🐛
Young Chan

💻 🐛
YuJin Kim

🐛
Yuri Dolzhenko

🐛
Yurii Dubinka

🐛
Zoltan Farkas

🐛
Zustin

🐛 -
aaronhurst-google

🐛 💻 +
aaronhurst-google

🐛 💻
alexmodis

🐛
andreoss

🐛
andrey81inmd

💻 🐛
anicoara

🐛
arunprasathav

🐛
asiercamara

🐛 -
astillich-igniti

💻 +
astillich-igniti

💻
avesolovksyy

🐛
avishvat

🐛
avivmu

🐛
axelbarfod1

🐛
b-3-n

🐛
balbhadra9

🐛 -
base23de

🐛 +
base23de

🐛
bergander

🐛
berkam

💻 🐛
breizh31

🐛
caesarkim

🐛
carolyujing

🐛
cesares-basilico

🐛 -
chrite

🐛 +
chrite

🐛
cobratbq

🐛
coladict

🐛
cosmoJFH

🐛
cristalp

🐛
crunsk

🐛
cwholmes

🐛 -
cyberjj999

🐛 +
cyberjj999

🐛
cyw3

🐛
d1ss0nanz

🐛
dalizi007

💻
danbrycefairsailcom

🐛
dariansanity

🐛
darrenmiliband

🐛 -
davidburstrom

🐛 +
davidburstrom

🐛
dbirkman-paloalto

🐛
deepak-patra

🐛
dependabot[bot]

💻 🐛
dinesh150

🐛
diziaq

🐛
dreaminpast123

🐛 -
duanyanan

🐛 +
duanyanan

🐛
dutt-sanjay

🐛
dylanleung

🐛
dzeigler

🐛
ekkirala

🐛
emersonmoura

🐛
fairy

🐛 -
filiprafalowicz

💻 +
filiprafalowicz

💻
foxmason

🐛
frankegabor

🐛
frankl

🐛
freafrea

🐛
fsapatin

🐛
gracia19

🐛 -
guo fei

🐛 +
guo fei

🐛
gurmsc5

🐛
gwilymatgearset

💻 🐛
haigsn

🐛
hemanshu070

🐛
henrik242

🐛
hongpuwu

🐛 -
hvbtup

💻 🐛 +
hvbtup

💻 🐛
igniti GmbH

🐛
ilovezfs

🐛
itaigilo

🐛
jakivey32

🐛
jbennett2091

🐛
jcamerin

🐛 -
jkeener1

🐛 +
jkeener1

🐛
jmetertea

🐛
johnra2

💻
josemanuelrolon

💻 🐛
kabroxiko

💻 🐛
karwer

🐛
kaulonline

🐛 -
kdaemonv

🐛 +
kdaemonv

🐛
kenji21

💻 🐛
kfranic

🐛
khalidkh

🐛
krzyk

🐛
lasselindqvist

🐛
lgemeinhardt

🐛 -
lihuaib

🐛 +
lihuaib

🐛
lonelyma1021

🐛
lpeddy

🐛
lujiefsi

💻
lukelukes

💻
lyriccoder

🐛
marcelmore

🐛 -
matchbox

🐛 +
matchbox

🐛
matthiaskraaz

🐛
meandonlyme

🐛
mikesive

🐛
milossesic

🐛
mohan-chinnappan-n

💻
mriddell95

🐛 -
mrlzh

🐛 +
mrlzh

🐛
msloan

🐛
mucharlaravalika

🐛
mvenneman

🐛
nareshl119

🐛
nicolas-harraudeau-sonarsource

🐛
noerremark

🐛 -
novsirion

🐛 +
novsirion

🐛
oggboy

🐛
oinume

🐛
orimarko

💻 🐛
pacvz

💻
pallavi agarwal

🐛
parksungrin

🐛 -
patpatpat123

🐛 +
patpatpat123

🐛
patriksevallius

🐛
pbrajesh1

🐛
phoenix384

🐛
piotrszymanski-sc

💻
plan3d

🐛
poojasix

🐛 -
prabhushrikant

🐛 +
prabhushrikant

🐛
pujitha8783

🐛
r-r-a-j

🐛
raghujayjunk

🐛
rajeshveera

🐛
rajeswarreddy88

🐛
recdevs

🐛 -
reudismam

💻 🐛 +
reudismam

💻 🐛
rijkt

🐛
rillig-tk

🐛
rmohan20

💻 🐛
rxmicro

🐛
ryan-gustafson

💻 🐛
sabi0

🐛 -
scais

🐛 +
scais

🐛
sebbASF

🐛
sergeygorbaty

💻
shilko2013

🐛
shiomiyan

📖
simeonKondr

🐛
snajberk

🐛 -
sniperrifle2004

🐛 +
sniperrifle2004

🐛
snuyanzin

🐛 💻
sratz

🐛
stonio

🐛
sturton

💻 🐛
sudharmohan

🐛
suruchidawar

🐛 -
svenfinitiv

🐛 +
svenfinitiv

🐛
tashiscool

🐛
test-git-hook

🐛
testation21

💻 🐛
thanosa

🐛
tiandiyixian

🐛
tobwoerk

🐛 -
tprouvot

🐛 💻 +
tprouvot

🐛 💻
trentchilders

🐛
triandicAnt

🐛
trishul14

🐛
tsui

🐛
winhkey

🐛
witherspore

🐛 -
wjljack

🐛 +
wjljack

🐛
wuchiuwong

🐛
xingsong

🐛
xioayuge

🐛
xnYi9wRezm

💻 🐛
xuanuy

🐛
xyf0921

🐛 -
yalechen-cyw3

🐛 +
yalechen-cyw3

🐛
yasuharu-sato

🐛
zenglian

🐛
zgrzyt93

💻 🐛
zh3ng

🐛
zt_soft

🐛
ztt79

🐛 -
zzzzfeng

🐛 +
zzzzfeng

🐛
Árpád Magosányi

🐛
任贵杰

🐛
茅延安

💻 diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 364ff7c856..69dc9614ba 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -28,6 +28,12 @@ from Lua. This means, that the Lua language in PMD can now parse both Lua and Lu * CPD now supports the `--ignore-literal-sequences` argument when analyzing Lua code. +### Financial Contributions + +Many thanks to our sponsors: + +* [Oliver Siegmar](https://github.com/osiegmar) (@osiegmar) + ### External Contributions * [#4066](https://github.com/pmd/pmd/pull/4066): \[lua] Add support for Luau syntax and skipping literal sequences in CPD - [@matthargett](https://github.com/matthargett) * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) From 560a9a078184877536de04106385a32f92538542 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:05:43 +0200 Subject: [PATCH 47/55] [doc] Update release notes --- docs/pages/release_notes.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 69dc9614ba..809984dc8f 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -20,7 +20,8 @@ This release of PMD adds support for [Luau](https://github.com/Roblox/luau), a g from Lua. This means, that the Lua language in PMD can now parse both Lua and Luau. ### Fixed Issues -* [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example +* core + * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example ### API Changes @@ -35,9 +36,9 @@ Many thanks to our sponsors: * [Oliver Siegmar](https://github.com/osiegmar) (@osiegmar) ### External Contributions -* [#4066](https://github.com/pmd/pmd/pull/4066): \[lua] Add support for Luau syntax and skipping literal sequences in CPD - [@matthargett](https://github.com/matthargett) -* [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) -* [#4131](https://github.com/pmd/pmd/pull/4131): \[doc] TooFewBranchesForASwitchStatement - Use "if-else" instead of "if-then" - [@Suvashri](https://github.com/Suvashri) +* [#4066](https://github.com/pmd/pmd/pull/4066): \[lua] Add support for Luau syntax and skipping literal sequences in CPD - [Matt Hargett](https://github.com/matthargett) (@matthargett) +* [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) (@mohan-chinnappan-n) +* [#4131](https://github.com/pmd/pmd/pull/4131): \[doc] TooFewBranchesForASwitchStatement - Use "if-else" instead of "if-then" - [Suvashri](https://github.com/Suvashri) (@Suvashri) {% endtocmaker %} From fe1222abfe5034d59b76429b80d410b2a1959fc0 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:08:08 +0200 Subject: [PATCH 48/55] [doc] Update release notes (#4109) --- 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 b8f8783555..cafacaa10e 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -15,6 +15,8 @@ This is a {{ site.pmd.release_type }} release. ### New and noteworthy ### Fixed Issues +* doc + * [#4109](https://github.com/pmd/pmd/pull/4109): \[doc] Add page for 3rd party rulesets ### API Changes From 00201ae9f7447e61b6c724f03455c8bb794ff09a Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:13:07 +0200 Subject: [PATCH 49/55] Update @pzygielo as a contributor --- .all-contributorsrc | 3 ++- docs/pages/pmd/projectdocs/credits.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3120c1af00..3fedd6a198 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -492,7 +492,8 @@ "profile": "https://github.com/pzygielo", "contributions": [ "code", - "bug" + "bug", + "doc" ] }, { diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 53a6336d25..34ff789e94 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -568,7 +568,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Phinehas Artemix

🐛
Phokham Nonava

🐛
Piotr Szymański

🐛 -
Piotrek Żygieło

💻 🐛 +
Piotrek Żygieło

💻 🐛 📖
Pranay Jaiswal

🐛 From cb85a01a88548f85bd29d24189eacc655b392a65 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:13:41 +0200 Subject: [PATCH 50/55] [doc] Update release notes (#4124) --- 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 84d0bc0712..66a2088ece 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -16,11 +16,14 @@ This is a {{ site.pmd.release_type }} release. ### Fixed Issues * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example +* doc + * [#4124](https://github.com/pmd/pmd/pull/4124): \[doc] Fix typos in Java rule docs ### API Changes ### External Contributions * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) +* [#4124](https://github.com/pmd/pmd/pull/4124) : \[doc] Fix typos in Java rule docs - [Piotrek Żygieło](https://github.com/pzygielo) (@pzygielo) {% endtocmaker %} From 491e8bec6ce72ecb91801d50e1537dd84b80ddff Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:21:02 +0200 Subject: [PATCH 51/55] Add @OlegAndreych as a contributor --- .all-contributorsrc | 9 +++ docs/pages/pmd/projectdocs/credits.md | 99 ++++++++++++++------------- 2 files changed, 59 insertions(+), 49 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3120c1af00..5d3b45de5c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6816,6 +6816,15 @@ "contributions": [ "code" ] + }, + { + "login": "OlegAndreych", + "name": "Oleg Andreych", + "avatar_url": "https://avatars.githubusercontent.com/u/2041351?v=4", + "profile": "https://github.com/OlegAndreych", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 53a6336d25..a5e8b64c45 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -530,444 +530,445 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Noam Tamim

🐛
Noel Grandin

🐛
Olaf Haalstra

🐛 +
Oleg Andreych

💻
Oleg Pavlenko

🐛
Oleksii Dykov

💻
Oliver Eikemeier

🐛 -
Olivier Parent

💻 🐛 +
Olivier Parent

💻 🐛
Ollie Abbey

💻 🐛
OverDrone

🐛
Ozan Gulle

💻 🐛
PUNEET JAIN

🐛
Parbati Bose

🐛
Paul Berg

🐛 -
Pavel Bludov

🐛 +
Pavel Bludov

🐛
Pavel Mička

🐛
Pedro Nuno Santos

🐛
Pedro Rijo

🐛
Pelisse Romain

💻 📖 🐛
Per Abich

💻
Pete Davids

🐛 -
Peter Bruin

🐛 +
Peter Bruin

🐛
Peter Chittum

💻 🐛
Peter Cudmore

🐛
Peter Kasson

🐛
Peter Kofler

🐛
Peter Paul Bakker

💻
Pham Hai Trung

🐛 -
Philip Graf

💻 🐛 +
Philip Graf

💻 🐛
Philip Hachey

🐛
Philippe Ozil

🐛
Phinehas Artemix

🐛
Phokham Nonava

🐛
Piotr Szymański

🐛
Piotrek Żygieło

💻 🐛 -
Pranay Jaiswal

🐛 +
Pranay Jaiswal

🐛
Prasad Kamath

🐛
Prasanna

🐛
Presh-AR

🐛
Puneet1726

🐛
Rafael Cortês

🐛
RaheemShaik999

🐛 -
RajeshR

💻 🐛 +
RajeshR

💻 🐛
Ramachandra Mohan

🐛
Ramel0921

🐛
Raquel Pau

🐛
Ravikiran Janardhana

🐛
Reda Benhemmouche

🐛
Renato Oliveira

💻 🐛 -
Rich DiCroce

🐛 +
Rich DiCroce

🐛
Riot R1cket

🐛
Rishabh Jain

🐛
RishabhDeep Singh

🐛
Robbie Martinus

💻 🐛
Robert Henry

🐛
Robert Painsi

🐛 -
Robert Russell

🐛 +
Robert Russell

🐛
Robert Sösemann

💻 📖 📢 🐛
Robert Whitebit

🐛
Robin Richtsfeld

🐛
Robin Stocker

💻 🐛
Robin Wils

🐛
RochusOest

🐛 -
Rodolfo Noviski

🐛 +
Rodolfo Noviski

🐛
Rodrigo Casara

🐛
Rodrigo Fernandes

🐛
Roman Salvador

💻 🐛
Ronald Blaschke

🐛
Róbert Papp

🐛
Saikat Sengupta

🐛 -
Saksham Handu

🐛 +
Saksham Handu

🐛
Saladoc

🐛
Salesforce Bob Lightning

🐛
Sam Carlberg

🐛
Satoshi Kubo

🐛
Scott Kennedy

🐛
Scott Wells

🐛 💻 -
Scrsloota

💻 +
Scrsloota

💻
Sebastian Bögl

🐛
Sebastian Schuberth

🐛
Sebastian Schwarz

🐛
Sergey Gorbaty

🐛
Sergey Kozlov

🐛
Sergey Yanzin

💻 🐛 -
Seth Wilcox

💻 +
Seth Wilcox

💻
Shubham

💻 🐛
Simon Abykov

💻
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

🐛
Vibhor Goyal

🐛
Vickenty Fesunov

🐛
Victor Noël

🐛
Vincent Galloy

💻 -
Vincent HUYNH

🐛 +
Vincent HUYNH

🐛
Vincent Maurin

🐛
Vincent Privat

🐛
Vishhwas

🐛
Vitaly

🐛
Vitaly Polonetsky

🐛
Vojtech Polivka

🐛 -
Vsevolod Zholobov

🐛 +
Vsevolod Zholobov

🐛
Vyom Yadav

💻
Wang Shidong

🐛
Waqas Ahmed

🐛
Wayne J. Earl

🐛
Wchenghui

🐛
Will Winder

🐛 -
William Brockhus

💻 🐛 +
William Brockhus

💻 🐛
Wilson Kurniawan

🐛
Wim Deblauwe

🐛
Woongsik Choi

🐛
XenoAmess

💻 🐛
Yang

💻
YaroslavTER

🐛 -
Young Chan

💻 🐛 +
Young Chan

💻 🐛
YuJin Kim

🐛
Yuri Dolzhenko

🐛
Yurii Dubinka

🐛
Zoltan Farkas

🐛
Zustin

🐛
aaronhurst-google

🐛 💻 -
alexmodis

🐛 +
alexmodis

🐛
andreoss

🐛
andrey81inmd

💻 🐛
anicoara

🐛
arunprasathav

🐛
asiercamara

🐛
astillich-igniti

💻 -
avesolovksyy

🐛 +
avesolovksyy

🐛
avishvat

🐛
avivmu

🐛
axelbarfod1

🐛
b-3-n

🐛
balbhadra9

🐛
base23de

🐛 -
bergander

🐛 +
bergander

🐛
berkam

💻 🐛
breizh31

🐛
caesarkim

🐛
carolyujing

🐛
cesares-basilico

🐛
chrite

🐛 -
cobratbq

🐛 +
cobratbq

🐛
coladict

🐛
cosmoJFH

🐛
cristalp

🐛
crunsk

🐛
cwholmes

🐛
cyberjj999

🐛 -
cyw3

🐛 +
cyw3

🐛
d1ss0nanz

🐛
dalizi007

💻
danbrycefairsailcom

🐛
dariansanity

🐛
darrenmiliband

🐛
davidburstrom

🐛 -
dbirkman-paloalto

🐛 +
dbirkman-paloalto

🐛
deepak-patra

🐛
dependabot[bot]

💻 🐛
dinesh150

🐛
diziaq

🐛
dreaminpast123

🐛
duanyanan

🐛 -
dutt-sanjay

🐛 +
dutt-sanjay

🐛
dylanleung

🐛
dzeigler

🐛
ekkirala

🐛
emersonmoura

🐛
fairy

🐛
filiprafalowicz

💻 -
foxmason

🐛 +
foxmason

🐛
frankegabor

🐛
frankl

🐛
freafrea

🐛
fsapatin

🐛
gracia19

🐛
guo fei

🐛 -
gurmsc5

🐛 +
gurmsc5

🐛
gwilymatgearset

💻 🐛
haigsn

🐛
hemanshu070

🐛
henrik242

🐛
hongpuwu

🐛
hvbtup

💻 🐛 -
igniti GmbH

🐛 +
igniti GmbH

🐛
ilovezfs

🐛
itaigilo

🐛
jakivey32

🐛
jbennett2091

🐛
jcamerin

🐛
jkeener1

🐛 -
jmetertea

🐛 +
jmetertea

🐛
johnra2

💻
josemanuelrolon

💻 🐛
kabroxiko

💻 🐛
karwer

🐛
kaulonline

🐛
kdaemonv

🐛 -
kenji21

💻 🐛 +
kenji21

💻 🐛
kfranic

🐛
khalidkh

🐛
krzyk

🐛
lasselindqvist

🐛
lgemeinhardt

🐛
lihuaib

🐛 -
lonelyma1021

🐛 +
lonelyma1021

🐛
lpeddy

🐛
lujiefsi

💻
lukelukes

💻
lyriccoder

🐛
marcelmore

🐛
matchbox

🐛 -
matthiaskraaz

🐛 +
matthiaskraaz

🐛
meandonlyme

🐛
mikesive

🐛
milossesic

🐛
mohan-chinnappan-n

💻
mriddell95

🐛
mrlzh

🐛 -
msloan

🐛 +
msloan

🐛
mucharlaravalika

🐛
mvenneman

🐛
nareshl119

🐛
nicolas-harraudeau-sonarsource

🐛
noerremark

🐛
novsirion

🐛 -
oggboy

🐛 +
oggboy

🐛
oinume

🐛
orimarko

💻 🐛
pacvz

💻
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

🐛
shiomiyan

📖
simeonKondr

🐛
snajberk

🐛
sniperrifle2004

🐛 -
snuyanzin

🐛 💻 +
snuyanzin

🐛 💻
sratz

🐛
stonio

🐛
sturton

💻 🐛
sudharmohan

🐛
suruchidawar

🐛
svenfinitiv

🐛 -
tashiscool

🐛 +
tashiscool

🐛
test-git-hook

🐛
testation21

💻 🐛
thanosa

🐛
tiandiyixian

🐛
tobwoerk

🐛
tprouvot

🐛 💻 -
trentchilders

🐛 +
trentchilders

🐛
triandicAnt

🐛
trishul14

🐛
tsui

🐛
winhkey

🐛
witherspore

🐛
wjljack

🐛 -
wuchiuwong

🐛 +
wuchiuwong

🐛
xingsong

🐛
xioayuge

🐛
xnYi9wRezm

💻 🐛
xuanuy

🐛
xyf0921

🐛
yalechen-cyw3

🐛 -
yasuharu-sato

🐛 +
yasuharu-sato

🐛
zenglian

🐛
zgrzyt93

💻 🐛
zh3ng

🐛
zt_soft

🐛
ztt79

🐛
zzzzfeng

🐛 -
Árpád Magosányi

🐛 +
Árpád Magosányi

🐛
任贵杰

🐛
茅延安

💻 From 94d343e63bfd93f89a58c72f3f557014f68b9c3d Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:21:32 +0200 Subject: [PATCH 52/55] [doc] Update release notes (#4085, #4128) --- 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 84d0bc0712..f966f06180 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -16,11 +16,14 @@ This is a {{ site.pmd.release_type }} release. ### Fixed Issues * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Missing --file arg in TreeExport CLI example +* java-codestyle + * [#4085](https://github.com/pmd/pmd/issues/4085): \[java] UnnecessaryFullyQualifiedName false positive when nested and non-nested classes with the same name and in the same package are used together ### API Changes ### External Contributions * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [@mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) +* [#4128](https://github.com/pmd/pmd/pull/4128): \[java] Fix False-positive UnnecessaryFullyQualifiedName when nested and non-nest… #4103 - [Oleg Andreych](https://github.com/OlegAndreych) (@OlegAndreych) {% endtocmaker %} From ec97933e9954ddedb5fad99f3a74846c209b51cc Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:28:09 +0200 Subject: [PATCH 53/55] Remove old comment --- .../rule/codestyle/CommentDefaultAccessModifierRule.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java index f859d2d6f5..f6f9fb0fbc 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/codestyle/CommentDefaultAccessModifierRule.java @@ -81,11 +81,6 @@ public class CommentDefaultAccessModifierRule extends AbstractIgnoredAnnotationR return super.visit(node, data); } - /* - * The method determines is the method needs to be included in the violations report - * Also, the code needs to check that the method is not a Test from junit5 - * to avoid conflicts with JUnit5TestShouldBePackagePrivate - */ @Override public Object visit(final ASTMethodDeclaration decl, final Object data) { if (shouldReport(decl)) { From 38955b5c8d5967ef1e5e483bc5c0188641c3c338 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:28:43 +0200 Subject: [PATCH 54/55] Add @lfalcantar as a contributor --- .all-contributorsrc | 9 ++ docs/pages/pmd/projectdocs/credits.md | 123 +++++++++++++------------- 2 files changed, 71 insertions(+), 61 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e29348424c..13290459cc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -6825,6 +6825,15 @@ "contributions": [ "doc" ] + }, + { + "login": "lfalcantar", + "name": "Luis Alcantar", + "avatar_url": "https://avatars.githubusercontent.com/u/13026131?v=4", + "profile": "https://github.com/lfalcantar", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md index 9f1604b29a..5a5d76c42a 100644 --- a/docs/pages/pmd/projectdocs/credits.md +++ b/docs/pages/pmd/projectdocs/credits.md @@ -419,555 +419,556 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Lucas Soncini

💻 🐛 +
Luis Alcantar

💻
Lukasz Slonina

🐛
Lukebray

🐛
Lyor Goldstein

🐛
MCMicS

🐛
Macarse

🐛
Machine account for PMD

💻 -
Maciek Siemczyk

🐛 +
Maciek Siemczyk

🐛
Maikel Steneker

💻 🐛
Maksim Moiseikin

🐛
Manfred Koch

🐛
Manuel Moya Ferrer

💻 🐛
Manuel Ryan

🐛
Marat Vyshegorodtsev

🐛 -
Marcel Härle

🐛 +
Marcel Härle

🐛
Marcello Fialho

🐛
Marcin Rataj

🐛
Mark Adamcin

🐛
Mark Hall

💻 🐛
Mark Kolich

🐛
Mark Pritchard

🐛 -
Markus Rathgeb

🐛 +
Markus Rathgeb

🐛
Marquis Wang

🐛
Martin Feldsztejn

🐛
Martin Lehmann

🐛
Martin Spamer

🐛
Martin Tarjányi

🐛
MatFl

🐛 -
Mateusz Stefanski

🐛 +
Mateusz Stefanski

🐛
Mathieu Gouin

🐛
MatiasComercio

💻 🐛
Matt Benson

🐛
Matt De Poorter

🐛
Matt Hargett

💻 💵
Matt Harrah

🐛 -
Matt Nelson

🐛 +
Matt Nelson

🐛
Matthew Amos

🐛
Matthew Duggan

🐛
Matthew Hall

🐛
Matías Fraga

💻 🐛
Maxime Robert

💻 🐛
MetaBF

🐛 -
Michael

🐛 +
Michael

🐛
Michael Bell

🐛
Michael Bernstein

🐛
Michael Clay

🐛
Michael Dombrowski

🐛
Michael Hausegger

🐛
Michael Hoefer

🐛 -
Michael Möbius

🐛 +
Michael Möbius

🐛
Michael N. Lipp

🐛
Michael Pellegrini

🐛
Michal Kordas

🐛
Michał Borek

🐛
Michał Kuliński

🐛
Miguel Núñez Díaz-Montes

🐛 -
Mihai Ionut

🐛 +
Mihai Ionut

🐛
Mirek Hankus

🐛
Mladjan Gadzic

🐛
MrAngry52

🐛
Muminur Choudhury

🐛
Mykhailo Palahuta

💻 🐛
Nagendra Kumar Singh

🐛 -
Nahuel Barrios

🐛 +
Nahuel Barrios

🐛
Nathan Braun

🐛
Nathan Reynolds

🐛
Nathan Reynolds

🐛
Nathanaël

🐛
Naveen

💻
Nazdravi

🐛 -
Neha-Dhonde

🐛 +
Neha-Dhonde

🐛
Nicholas Doyle

🐛
Nick Butcher

🐛
Nico Gallinal

🐛
Nicola Dal Maso

🐛
Nicolas Filotto

💻
Nicolas Vuillamy

📖 -
Nikita Chursin

🐛 +
Nikita Chursin

🐛
Niklas Baudy

🐛
Nikolas Havrikov

🐛
Nilesh Virkar

🐛
Nimit Patel

🐛
Niranjan Harpale

🐛
Noah Sussman

🐛 -
Noah0120

🐛 +
Noah0120

🐛
Noam Tamim

🐛
Noel Grandin

🐛
Olaf Haalstra

🐛
Oleg Pavlenko

🐛
Oleksii Dykov

💻
Oliver Eikemeier

🐛 -
Olivier Parent

💻 🐛 +
Olivier Parent

💻 🐛
Ollie Abbey

💻 🐛
OverDrone

🐛
Ozan Gulle

💻 🐛
PUNEET JAIN

🐛
Parbati Bose

🐛
Paul Berg

🐛 -
Pavel Bludov

🐛 +
Pavel Bludov

🐛
Pavel Mička

🐛
Pedro Nuno Santos

🐛
Pedro Rijo

🐛
Pelisse Romain

💻 📖 🐛
Per Abich

💻
Pete Davids

🐛 -
Peter Bruin

🐛 +
Peter Bruin

🐛
Peter Chittum

💻 🐛
Peter Cudmore

🐛
Peter Kasson

🐛
Peter Kofler

🐛
Peter Paul Bakker

💻
Pham Hai Trung

🐛 -
Philip Graf

💻 🐛 +
Philip Graf

💻 🐛
Philip Hachey

🐛
Philippe Ozil

🐛
Phinehas Artemix

🐛
Phokham Nonava

🐛
Piotr Szymański

🐛
Piotrek Żygieło

💻 🐛 -
Pranay Jaiswal

🐛 +
Pranay Jaiswal

🐛
Prasad Kamath

🐛
Prasanna

🐛
Presh-AR

🐛
Puneet1726

🐛
Rafael Cortês

🐛
RaheemShaik999

🐛 -
RajeshR

💻 🐛 +
RajeshR

💻 🐛
Ramachandra Mohan

🐛
Ramel0921

🐛
Raquel Pau

🐛
Ravikiran Janardhana

🐛
Reda Benhemmouche

🐛
Renato Oliveira

💻 🐛 -
Rich DiCroce

🐛 +
Rich DiCroce

🐛
Riot R1cket

🐛
Rishabh Jain

🐛
RishabhDeep Singh

🐛
Robbie Martinus

💻 🐛
Robert Henry

🐛
Robert Painsi

🐛 -
Robert Russell

🐛 +
Robert Russell

🐛
Robert Sösemann

💻 📖 📢 🐛
Robert Whitebit

🐛
Robin Richtsfeld

🐛
Robin Stocker

💻 🐛
Robin Wils

🐛
RochusOest

🐛 -
Rodolfo Noviski

🐛 +
Rodolfo Noviski

🐛
Rodrigo Casara

🐛
Rodrigo Fernandes

🐛
Roman Salvador

💻 🐛
Ronald Blaschke

🐛
Róbert Papp

🐛
Saikat Sengupta

🐛 -
Saksham Handu

🐛 +
Saksham Handu

🐛
Saladoc

🐛
Salesforce Bob Lightning

🐛
Sam Carlberg

🐛
Satoshi Kubo

🐛
Scott Kennedy

🐛
Scott Wells

🐛 💻 -
Scrsloota

💻 +
Scrsloota

💻
Sebastian Bögl

🐛
Sebastian Schuberth

🐛
Sebastian Schwarz

🐛
Sergey Gorbaty

🐛
Sergey Kozlov

🐛
Sergey Yanzin

💻 🐛 -
Seth Wilcox

💻 +
Seth Wilcox

💻
Shubham

💻 🐛
Simon Abykov

💻
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

🐛 -
Suvashri

📖 +
Suvashri

📖
SwatiBGupta1110

🐛
SyedThoufich

🐛
Szymon Sasin

🐛
T-chuangxin

🐛
TERAI Atsuhiro

🐛
TIOBE Software

💻 🐛 -
Taylor Smock

🐛 +
Taylor Smock

🐛
Techeira Damián

💻 🐛
Ted Husted

🐛
TehBakker

🐛
The Gitter Badger

🐛
Theodoor

🐛
Thiago Henrique Hüpner

🐛 -
Thibault Meyer

🐛 +
Thibault Meyer

🐛
Thomas Güttler

🐛
Thomas Jones-Low

🐛
Thomas Smith

💻 🐛
ThrawnCA

🐛
Thunderforge

💻 🐛
Tim van der Lippe

🐛 -
Tobias Weimer

💻 🐛 +
Tobias Weimer

💻 🐛
Tom Daly

🐛
Tomer Figenblat

🐛
Tomi De Lucca

💻 🐛
Torsten Kleiber

🐛
TrackerSB

🐛
Ullrich Hafner

🐛 -
Utku Cuhadaroglu

💻 🐛 +
Utku Cuhadaroglu

💻 🐛
Valentin Brandl

🐛
Valeria

🐛
Vasily Anisimov

🐛
Vibhor Goyal

🐛
Vickenty Fesunov

🐛
Victor Noël

🐛 -
Vincent Galloy

💻 +
Vincent Galloy

💻
Vincent HUYNH

🐛
Vincent Maurin

🐛
Vincent Privat

🐛
Vishhwas

🐛
Vitaly

🐛
Vitaly Polonetsky

🐛 -
Vojtech Polivka

🐛 +
Vojtech Polivka

🐛
Vsevolod Zholobov

🐛
Vyom Yadav

💻
Wang Shidong

🐛
Waqas Ahmed

🐛
Wayne J. Earl

🐛
Wchenghui

🐛 -
Will Winder

🐛 +
Will Winder

🐛
William Brockhus

💻 🐛
Wilson Kurniawan

🐛
Wim Deblauwe

🐛
Woongsik Choi

🐛
XenoAmess

💻 🐛
Yang

💻 -
YaroslavTER

🐛 +
YaroslavTER

🐛
Young Chan

💻 🐛
YuJin Kim

🐛
Yuri Dolzhenko

🐛
Yurii Dubinka

🐛
Zoltan Farkas

🐛
Zustin

🐛 -
aaronhurst-google

🐛 💻 +
aaronhurst-google

🐛 💻
alexmodis

🐛
andreoss

🐛
andrey81inmd

💻 🐛
anicoara

🐛
arunprasathav

🐛
asiercamara

🐛 -
astillich-igniti

💻 +
astillich-igniti

💻
avesolovksyy

🐛
avishvat

🐛
avivmu

🐛
axelbarfod1

🐛
b-3-n

🐛
balbhadra9

🐛 -
base23de

🐛 +
base23de

🐛
bergander

🐛
berkam

💻 🐛
breizh31

🐛
caesarkim

🐛
carolyujing

🐛
cesares-basilico

🐛 -
chrite

🐛 +
chrite

🐛
cobratbq

🐛
coladict

🐛
cosmoJFH

🐛
cristalp

🐛
crunsk

🐛
cwholmes

🐛 -
cyberjj999

🐛 +
cyberjj999

🐛
cyw3

🐛
d1ss0nanz

🐛
dalizi007

💻
danbrycefairsailcom

🐛
dariansanity

🐛
darrenmiliband

🐛 -
davidburstrom

🐛 +
davidburstrom

🐛
dbirkman-paloalto

🐛
deepak-patra

🐛
dependabot[bot]

💻 🐛
dinesh150

🐛
diziaq

🐛
dreaminpast123

🐛 -
duanyanan

🐛 +
duanyanan

🐛
dutt-sanjay

🐛
dylanleung

🐛
dzeigler

🐛
ekkirala

🐛
emersonmoura

🐛
fairy

🐛 -
filiprafalowicz

💻 +
filiprafalowicz

💻
foxmason

🐛
frankegabor

🐛
frankl

🐛
freafrea

🐛
fsapatin

🐛
gracia19

🐛 -
guo fei

🐛 +
guo fei

🐛
gurmsc5

🐛
gwilymatgearset

💻 🐛
haigsn

🐛
hemanshu070

🐛
henrik242

🐛
hongpuwu

🐛 -
hvbtup

💻 🐛 +
hvbtup

💻 🐛
igniti GmbH

🐛
ilovezfs

🐛
itaigilo

🐛
jakivey32

🐛
jbennett2091

🐛
jcamerin

🐛 -
jkeener1

🐛 +
jkeener1

🐛
jmetertea

🐛
johnra2

💻
josemanuelrolon

💻 🐛
kabroxiko

💻 🐛
karwer

🐛
kaulonline

🐛 -
kdaemonv

🐛 +
kdaemonv

🐛
kenji21

💻 🐛
kfranic

🐛
khalidkh

🐛
krzyk

🐛
lasselindqvist

🐛
lgemeinhardt

🐛 -
lihuaib

🐛 +
lihuaib

🐛
lonelyma1021

🐛
lpeddy

🐛
lujiefsi

💻
lukelukes

💻
lyriccoder

🐛
marcelmore

🐛 -
matchbox

🐛 +
matchbox

🐛
matthiaskraaz

🐛
meandonlyme

🐛
mikesive

🐛
milossesic

🐛
mohan-chinnappan-n

💻
mriddell95

🐛 -
mrlzh

🐛 +
mrlzh

🐛
msloan

🐛
mucharlaravalika

🐛
mvenneman

🐛
nareshl119

🐛
nicolas-harraudeau-sonarsource

🐛
noerremark

🐛 -
novsirion

🐛 +
novsirion

🐛
oggboy

🐛
oinume

🐛
orimarko

💻 🐛
pacvz

💻
pallavi agarwal

🐛
parksungrin

🐛 -
patpatpat123

🐛 +
patpatpat123

🐛
patriksevallius

🐛
pbrajesh1

🐛
phoenix384

🐛
piotrszymanski-sc

💻
plan3d

🐛
poojasix

🐛 -
prabhushrikant

🐛 +
prabhushrikant

🐛
pujitha8783

🐛
r-r-a-j

🐛
raghujayjunk

🐛
rajeshveera

🐛
rajeswarreddy88

🐛
recdevs

🐛 -
reudismam

💻 🐛 +
reudismam

💻 🐛
rijkt

🐛
rillig-tk

🐛
rmohan20

💻 🐛
rxmicro

🐛
ryan-gustafson

💻 🐛
sabi0

🐛 -
scais

🐛 +
scais

🐛
sebbASF

🐛
sergeygorbaty

💻
shilko2013

🐛
shiomiyan

📖
simeonKondr

🐛
snajberk

🐛 -
sniperrifle2004

🐛 +
sniperrifle2004

🐛
snuyanzin

🐛 💻
sratz

🐛
stonio

🐛
sturton

💻 🐛
sudharmohan

🐛
suruchidawar

🐛 -
svenfinitiv

🐛 +
svenfinitiv

🐛
tashiscool

🐛
test-git-hook

🐛
testation21

💻 🐛
thanosa

🐛
tiandiyixian

🐛
tobwoerk

🐛 -
tprouvot

🐛 💻 +
tprouvot

🐛 💻
trentchilders

🐛
triandicAnt

🐛
trishul14

🐛
tsui

🐛
winhkey

🐛
witherspore

🐛 -
wjljack

🐛 +
wjljack

🐛
wuchiuwong

🐛
xingsong

🐛
xioayuge

🐛
xnYi9wRezm

💻 🐛
xuanuy

🐛
xyf0921

🐛 -
yalechen-cyw3

🐛 +
yalechen-cyw3

🐛
yasuharu-sato

🐛
zenglian

🐛
zgrzyt93

💻 🐛
zh3ng

🐛
zt_soft

🐛
ztt79

🐛 -
zzzzfeng

🐛 +
zzzzfeng

🐛
Árpád Magosányi

🐛
任贵杰

🐛
茅延安

💻 From 9c215e97222d5a42bb5407fbc99f66640f7097b5 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 29 Sep 2022 16:41:59 +0200 Subject: [PATCH 55/55] [doc] Update release notes --- docs/pages/release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index bf54e794de..2da44b2235 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -53,7 +53,7 @@ Many thanks to our sponsors: ### External Contributions * [#4066](https://github.com/pmd/pmd/pull/4066): \[lua] Add support for Luau syntax and skipping literal sequences in CPD - [Matt Hargett](https://github.com/matthargett) (@matthargett) * [#4116](https://github.com/pmd/pmd/pull/4116): \[core] Fix missing --file arg in TreeExport CLI example - [mohan-chinnappan-n](https://github.com/mohan-chinnappan-n) (@mohan-chinnappan-n) -* [#4124](https://github.com/pmd/pmd/pull/4124) : \[doc] Fix typos in Java rule docs - [Piotrek Żygieło](https://github.com/pzygielo) (@pzygielo) +* [#4124](https://github.com/pmd/pmd/pull/4124): \[doc] Fix typos in Java rule docs - [Piotrek Żygieło](https://github.com/pzygielo) (@pzygielo) * [#4128](https://github.com/pmd/pmd/pull/4128): \[java] Fix False-positive UnnecessaryFullyQualifiedName when nested and non-nest… #4103 - [Oleg Andreych](https://github.com/OlegAndreych) (@OlegAndreych) * [#4131](https://github.com/pmd/pmd/pull/4131): \[doc] TooFewBranchesForASwitchStatement - Use "if-else" instead of "if-then" - [Suvashri](https://github.com/Suvashri) (@Suvashri) * [#4137](https://github.com/pmd/pmd/pull/4137): \[java] Fixes 3859: Exclude junit5 test methods from the commentDefaultAccessModifierRule - [Luis Alcantar](https://github.com/lfalcantar) (@lfalcantar)