Merge branch 'master' into clem.pmd7-refactor-cpd

This commit is contained in:
Clément Fournier
2023-05-26 11:59:05 +02:00
136 changed files with 5166 additions and 2171 deletions

View File

@ -7173,6 +7173,15 @@
"contributions": [
"doc"
]
},
{
"login": "wener-tiobe",
"name": "Wener",
"avatar_url": "https://avatars.githubusercontent.com/u/85687939?v=4",
"profile": "https://github.com/wener-tiobe",
"contributions": [
"code"
]
}
],
"contributorsPerLine": 7,

View File

@ -50,6 +50,7 @@ function regression_tester_uploadBaseline() {
--patch-branch "${baseline_branch}" \
--patch-config ./pmd/.ci/files/all-regression-rules.xml \
--list-of-project ./pmd/.ci/files/project-list.xml --html-flag \
--threads "$(nproc)" \
--error-recovery
pushd target/reports || { echo "Directory 'target/reports' doesn't exist"; exit 1; }
BRANCH_FILENAME="${baseline_branch/\//_}"

View File

@ -2,6 +2,7 @@ require 'pmdtester'
require 'time'
require 'logger'
require 'fileutils'
require 'etc'
@logger = Logger.new(STDOUT)
@ -16,6 +17,7 @@ def get_args(base_branch, autogen = TRUE, patch_config = './pmd/.ci/files/all-re
'--keep-reports',
'--error-recovery',
'--baseline-download-url', 'https://pmd-code.org/pmd-regression-tester/',
'--threads', Etc.nprocessors.to_s,
# '--debug',
]
end

View File

@ -3,7 +3,7 @@ repository: pmd/pmd
pmd:
version: 7.0.0-SNAPSHOT
previous_version: 6.55.0
date: ??-????-2023
date: 27-May-2023
release_type: major
# release types: major, minor, bugfix

View File

@ -436,6 +436,9 @@ entries:
- title: Julia
url: /pmd_languages_julia.html
output: web, pdf
- title: Coco
url: /pmd_languages_coco.html
output: web, pdf
- title: Developer Documentation
output: web, pdf
folderitems:

View File

@ -26,7 +26,7 @@ additional_js:
**PMD** is a static source code analyzer. It finds common programming flaws like
unused variables, empty catch blocks, unnecessary object creation, and
so forth. It's mainly concerned with **Java and Apex**, but **supports 14 other
so forth. It's mainly concerned with **Java and Apex**, but **supports 16 other
languages**.
PMD features many **built-in checks** (in PMD lingo, *rules*), which are documented

View File

@ -9,10 +9,7 @@ author: Tom Copeland, Andreas Dangel <andreas.dangel@adangel.org>
## Overview
The processing starts e.g. with the main class: `net.sourceforge.pmd.PMD`
{%include note.html content="This is the command line interface. There are many other means, who
PMD can be invoked. E.g. via ant, maven, gradle..." %}
The processing starts with the main class {% jdoc core::PmdAnalysis %}.
* Parse command line parameters (see net.sourceforge.pmd.cli.PMDParameters)
Also load the incremental analysis cache file

View File

@ -0,0 +1,13 @@
---
title: Coco
permalink: pmd_languages_coco.html
---
Coco is a modern programming language designed specifically for building event-driven software.
It is part of the Coco Platform from <https://cocotec.io/>.
## Support in PMD
Starting from version 7.0.0, Coco support was added to CPD.
### Limitations
- Support for Coco only extends to CPD to detect code duplication in Coco source files.

View File

@ -761,258 +761,259 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center"><a href="https://github.com/Wchenghui"><img src="https://avatars.githubusercontent.com/u/28353797?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wchenghui</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AWchenghui" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/wener-tiobe"><img src="https://avatars.githubusercontent.com/u/85687939?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wener</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=wener-tiobe" title="Code">💻</a></td>
<td align="center"><a href="http://www.willwinder.com/"><img src="https://avatars.githubusercontent.com/u/125509?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Will Winder</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awinder" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/YodaDaCoda"><img src="https://avatars.githubusercontent.com/u/365349?v=4?s=100" width="100px;" alt=""/><br /><sub><b>William Brockhus</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=YodaDaCoda" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3AYodaDaCoda" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/wkurniawan07"><img src="https://avatars.githubusercontent.com/u/7261051?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wilson Kurniawan</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awkurniawan07" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/wimdeblauwe"><img src="https://avatars.githubusercontent.com/u/1115823?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wim Deblauwe</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awimdeblauwe" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/woongsikchoi"><img src="https://avatars.githubusercontent.com/u/3905257?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Woongsik Choi</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awoongsikchoi" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://xenoamess.com/"><img src="https://avatars.githubusercontent.com/u/17455337?v=4?s=100" width="100px;" alt=""/><br /><sub><b>XenoAmess</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=XenoAmess" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3AXenoAmess" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/duanyang25"><img src="https://avatars.githubusercontent.com/u/34642309?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yang</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=duanyang25" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/duanyang25"><img src="https://avatars.githubusercontent.com/u/34642309?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yang</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=duanyang25" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/YaroslavTER"><img src="https://avatars.githubusercontent.com/u/13270181?v=4?s=100" width="100px;" alt=""/><br /><sub><b>YaroslavTER</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AYaroslavTER" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/yasarshaikh"><img src="https://avatars.githubusercontent.com/u/20971327?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yasar Shaikh</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=yasarshaikh" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/YYoungC"><img src="https://avatars.githubusercontent.com/u/55069165?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Young Chan</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=YYoungC" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3AYYoungC" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://dailyco.github.io/"><img src="https://avatars.githubusercontent.com/u/48382813?v=4?s=100" width="100px;" alt=""/><br /><sub><b>YuJin Kim</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adailyco" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/yuridolzhenko"><img src="https://avatars.githubusercontent.com/u/1915205?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yuri Dolzhenko</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ayuridolzhenko" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://www.linkedin.com/in/lazylead"><img src="https://avatars.githubusercontent.com/u/1651114?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yurii Dubinka</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adgroup" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/zolyfarkas"><img src="https://avatars.githubusercontent.com/u/144085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zoltan Farkas</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Azolyfarkas" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/zolyfarkas"><img src="https://avatars.githubusercontent.com/u/144085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zoltan Farkas</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Azolyfarkas" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/Zustin"><img src="https://avatars.githubusercontent.com/u/87302257?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zustin</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AZustin" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/aaronhurst-google"><img src="https://avatars.githubusercontent.com/u/86377278?v=4?s=100" width="100px;" alt=""/><br /><sub><b>aaronhurst-google</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aaaronhurst-google" title="Bug reports">🐛</a> <a href="https://github.com/pmd/pmd/commits?author=aaronhurst-google" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/alexmodis"><img src="https://avatars.githubusercontent.com/u/60091729?v=4?s=100" width="100px;" alt=""/><br /><sub><b>alexmodis</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aalexmodis" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://andreoss.sdf.org/"><img src="https://avatars.githubusercontent.com/u/49783909?v=4?s=100" width="100px;" alt=""/><br /><sub><b>andreoss</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aandreoss" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/andrey81inmd"><img src="https://avatars.githubusercontent.com/u/2624682?v=4?s=100" width="100px;" alt=""/><br /><sub><b>andrey81inmd</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=andrey81inmd" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Aandrey81inmd" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/anicoara"><img src="https://avatars.githubusercontent.com/u/835182?v=4?s=100" width="100px;" alt=""/><br /><sub><b>anicoara</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aanicoara" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://www.twitter.com/arunprasathav"><img src="https://avatars.githubusercontent.com/u/5299114?v=4?s=100" width="100px;" alt=""/><br /><sub><b>arunprasathav</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aaruncollections" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://www.twitter.com/arunprasathav"><img src="https://avatars.githubusercontent.com/u/5299114?v=4?s=100" width="100px;" alt=""/><br /><sub><b>arunprasathav</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aaruncollections" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/asiercamara"><img src="https://avatars.githubusercontent.com/u/38685011?v=4?s=100" width="100px;" alt=""/><br /><sub><b>asiercamara</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aasiercamara" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/astillich-igniti"><img src="https://avatars.githubusercontent.com/u/57359104?v=4?s=100" width="100px;" alt=""/><br /><sub><b>astillich-igniti</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=astillich-igniti" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/avesolovksyy"><img src="https://avatars.githubusercontent.com/u/46165403?v=4?s=100" width="100px;" alt=""/><br /><sub><b>avesolovksyy</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aavesolovksyy" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/vishva007"><img src="https://avatars.githubusercontent.com/u/6756036?v=4?s=100" width="100px;" alt=""/><br /><sub><b>avishvat</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Avishva007" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/avivmu"><img src="https://avatars.githubusercontent.com/u/19804341?v=4?s=100" width="100px;" alt=""/><br /><sub><b>avivmu</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aavivmu" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/axelbarfod1"><img src="https://avatars.githubusercontent.com/u/32651536?v=4?s=100" width="100px;" alt=""/><br /><sub><b>axelbarfod1</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aaxelbarfod1" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/b-3-n"><img src="https://avatars.githubusercontent.com/u/7460509?v=4?s=100" width="100px;" alt=""/><br /><sub><b>b-3-n</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ab-3-n" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/b-3-n"><img src="https://avatars.githubusercontent.com/u/7460509?v=4?s=100" width="100px;" alt=""/><br /><sub><b>b-3-n</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ab-3-n" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/balbhadra9"><img src="https://avatars.githubusercontent.com/u/43748088?v=4?s=100" width="100px;" alt=""/><br /><sub><b>balbhadra9</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Abalbhadra9" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/base23de"><img src="https://avatars.githubusercontent.com/u/37408753?v=4?s=100" width="100px;" alt=""/><br /><sub><b>base23de</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Abase23de" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/bergander"><img src="https://avatars.githubusercontent.com/u/8858497?v=4?s=100" width="100px;" alt=""/><br /><sub><b>bergander</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Abergander" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/berkam"><img src="https://avatars.githubusercontent.com/u/26228441?v=4?s=100" width="100px;" alt=""/><br /><sub><b>berkam</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=berkam" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Aberkam" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/breizh31"><img src="https://avatars.githubusercontent.com/u/15649505?v=4?s=100" width="100px;" alt=""/><br /><sub><b>breizh31</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Abreizh31" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/caesarkim"><img src="https://avatars.githubusercontent.com/u/6069184?v=4?s=100" width="100px;" alt=""/><br /><sub><b>caesarkim</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acaesarkim" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/carolyujing"><img src="https://avatars.githubusercontent.com/u/6173449?v=4?s=100" width="100px;" alt=""/><br /><sub><b>carolyujing</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acarolyujing" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/carolyujing"><img src="https://avatars.githubusercontent.com/u/6173449?v=4?s=100" width="100px;" alt=""/><br /><sub><b>carolyujing</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acarolyujing" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/cbfiddle"><img src="https://avatars.githubusercontent.com/u/6628505?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cbfiddle</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acbfiddle" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/cesares-basilico"><img src="https://avatars.githubusercontent.com/u/14895641?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cesares-basilico</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acesares-basilico" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/chrite"><img src="https://avatars.githubusercontent.com/u/53291173?v=4?s=100" width="100px;" alt=""/><br /><sub><b>chrite</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Achrite" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://www.dannyvanheumen.nl/"><img src="https://avatars.githubusercontent.com/u/1936470?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cobratbq</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acobratbq" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/coladict"><img src="https://avatars.githubusercontent.com/u/1909837?v=4?s=100" width="100px;" alt=""/><br /><sub><b>coladict</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acoladict" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/cosmoJFH"><img src="https://avatars.githubusercontent.com/u/19255991?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cosmoJFH</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AcosmoJFH" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/cristalp"><img src="https://avatars.githubusercontent.com/u/12525759?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cristalp</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acristalp" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/cristalp"><img src="https://avatars.githubusercontent.com/u/12525759?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cristalp</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acristalp" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/crunsk"><img src="https://avatars.githubusercontent.com/u/5631441?v=4?s=100" width="100px;" alt=""/><br /><sub><b>crunsk</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acrunsk" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/cwholmes"><img src="https://avatars.githubusercontent.com/u/14796526?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cwholmes</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acwholmes" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/cyberjj999"><img src="https://avatars.githubusercontent.com/u/51283594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cyberjj999</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acyberjj999" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/cyw3"><img src="https://avatars.githubusercontent.com/u/11549103?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cyw3</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Acyw3" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/d1ss0nanz"><img src="https://avatars.githubusercontent.com/u/7532776?v=4?s=100" width="100px;" alt=""/><br /><sub><b>d1ss0nanz</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ad1ss0nanz" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dague1"><img src="https://avatars.githubusercontent.com/u/42275566?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dague1</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=dague1" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/dalizi007"><img src="https://avatars.githubusercontent.com/u/90743616?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dalizi007</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=dalizi007" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/dalizi007"><img src="https://avatars.githubusercontent.com/u/90743616?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dalizi007</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=dalizi007" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/danbrycefairsailcom"><img src="https://avatars.githubusercontent.com/u/25037396?v=4?s=100" width="100px;" alt=""/><br /><sub><b>danbrycefairsailcom</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adanbrycefairsailcom" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dariansanity"><img src="https://avatars.githubusercontent.com/u/28553192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dariansanity</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adariansanity" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/darrenmiliband"><img src="https://avatars.githubusercontent.com/u/62128185?v=4?s=100" width="100px;" alt=""/><br /><sub><b>darrenmiliband</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adarrenmiliband" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/davidburstrom"><img src="https://avatars.githubusercontent.com/u/1671931?v=4?s=100" width="100px;" alt=""/><br /><sub><b>davidburstrom</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adavidburstrom" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dbirkman-paloalto"><img src="https://avatars.githubusercontent.com/u/53145780?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dbirkman-paloalto</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adbirkman-paloalto" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/deepak-patra"><img src="https://avatars.githubusercontent.com/u/8747728?v=4?s=100" width="100px;" alt=""/><br /><sub><b>deepak-patra</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adeepak-patra" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=dependabot[bot]" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Adependabot[bot]" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=dependabot[bot]" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Adependabot[bot]" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dinesh150"><img src="https://avatars.githubusercontent.com/u/88079095?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dinesh150</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adinesh150" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/diziaq"><img src="https://avatars.githubusercontent.com/u/6733997?v=4?s=100" width="100px;" alt=""/><br /><sub><b>diziaq</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adiziaq" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dreaminzero-cell"><img src="https://avatars.githubusercontent.com/u/24776498?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dreaminpast123</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adreaminzero-cell" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/duanyanan"><img src="https://avatars.githubusercontent.com/u/22003836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>duanyanan</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aduanyanan" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dutt-sanjay"><img src="https://avatars.githubusercontent.com/u/70677817?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dutt-sanjay</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adutt-sanjay" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dylanleung"><img src="https://avatars.githubusercontent.com/u/1852360?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dylanleung</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adylanleung" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/dzeigler"><img src="https://avatars.githubusercontent.com/u/1615832?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dzeigler</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adzeigler" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/dzeigler"><img src="https://avatars.githubusercontent.com/u/1615832?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dzeigler</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Adzeigler" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/ekkirala"><img src="https://avatars.githubusercontent.com/u/44954455?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ekkirala</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aekkirala" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/emersonmoura"><img src="https://avatars.githubusercontent.com/u/5419868?v=4?s=100" width="100px;" alt=""/><br /><sub><b>emersonmoura</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aemersonmoura" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://juejin.cn/user/1063982985642525"><img src="https://avatars.githubusercontent.com/u/24585054?v=4?s=100" width="100px;" alt=""/><br /><sub><b>fairy</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aguxiaonian" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/filiprafalowicz"><img src="https://avatars.githubusercontent.com/u/24355557?v=4?s=100" width="100px;" alt=""/><br /><sub><b>filiprafalowicz</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=filiprafalowicz" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/foxmason"><img src="https://avatars.githubusercontent.com/u/33361071?v=4?s=100" width="100px;" alt=""/><br /><sub><b>foxmason</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Afoxmason" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/frankegabor"><img src="https://avatars.githubusercontent.com/u/13273444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frankegabor</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Afrankegabor" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/fanlw0816"><img src="https://avatars.githubusercontent.com/u/22781995?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frankl</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Afanlw0816" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/fanlw0816"><img src="https://avatars.githubusercontent.com/u/22781995?v=4?s=100" width="100px;" alt=""/><br /><sub><b>frankl</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Afanlw0816" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/freafrea"><img src="https://avatars.githubusercontent.com/u/39403091?v=4?s=100" width="100px;" alt=""/><br /><sub><b>freafrea</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Afreafrea" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/fsapatin"><img src="https://avatars.githubusercontent.com/u/10675254?v=4?s=100" width="100px;" alt=""/><br /><sub><b>fsapatin</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Afsapatin" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/gracia19"><img src="https://avatars.githubusercontent.com/u/32557952?v=4?s=100" width="100px;" alt=""/><br /><sub><b>gracia19</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Agracia19" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/ief2009"><img src="https://avatars.githubusercontent.com/u/1955449?v=4?s=100" width="100px;" alt=""/><br /><sub><b>guo fei</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aief2009" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/gurmsc5"><img src="https://avatars.githubusercontent.com/u/26914263?v=4?s=100" width="100px;" alt=""/><br /><sub><b>gurmsc5</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Agurmsc5" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/gwilymatgearset"><img src="https://avatars.githubusercontent.com/u/43957113?v=4?s=100" width="100px;" alt=""/><br /><sub><b>gwilymatgearset</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=gwilymatgearset" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Agwilymatgearset" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/haigsn"><img src="https://avatars.githubusercontent.com/u/52993319?v=4?s=100" width="100px;" alt=""/><br /><sub><b>haigsn</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ahaigsn" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/haigsn"><img src="https://avatars.githubusercontent.com/u/52993319?v=4?s=100" width="100px;" alt=""/><br /><sub><b>haigsn</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ahaigsn" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/hemanshu070"><img src="https://avatars.githubusercontent.com/u/32012651?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hemanshu070</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ahemanshu070" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/henrik242"><img src="https://avatars.githubusercontent.com/u/129931?v=4?s=100" width="100px;" alt=""/><br /><sub><b>henrik242</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ahenrik242" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/hongpuwu"><img src="https://avatars.githubusercontent.com/u/19198552?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hongpuwu</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ahongpuwu" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/hvbtup"><img src="https://avatars.githubusercontent.com/u/7644776?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hvbtup</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=hvbtup" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Ahvbtup" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://www.igniti.de/"><img src="https://avatars.githubusercontent.com/u/7207145?v=4?s=100" width="100px;" alt=""/><br /><sub><b>igniti GmbH</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aigniti-gmbh" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/ilovezfs"><img src="https://avatars.githubusercontent.com/u/5268928?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ilovezfs</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ailovezfs" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/itaigilo"><img src="https://avatars.githubusercontent.com/u/13402361?v=4?s=100" width="100px;" alt=""/><br /><sub><b>itaigilo</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aitaigilo" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/itaigilo"><img src="https://avatars.githubusercontent.com/u/13402361?v=4?s=100" width="100px;" alt=""/><br /><sub><b>itaigilo</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aitaigilo" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/jakivey32"><img src="https://avatars.githubusercontent.com/u/36869603?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jakivey32</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ajakivey32" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/jbennett2091"><img src="https://avatars.githubusercontent.com/u/16721671?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jbennett2091</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ajbennett2091" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/jcamerin"><img src="https://avatars.githubusercontent.com/u/7663252?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jcamerin</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ajcamerin" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/jkeener1"><img src="https://avatars.githubusercontent.com/u/11696155?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jkeener1</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ajkeener1" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/jmetertea"><img src="https://avatars.githubusercontent.com/u/33323555?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jmetertea</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ajmetertea" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/johnra2"><img src="https://avatars.githubusercontent.com/u/90150885?v=4?s=100" width="100px;" alt=""/><br /><sub><b>johnra2</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=johnra2" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/josemanuelrolon"><img src="https://avatars.githubusercontent.com/u/1685807?v=4?s=100" width="100px;" alt=""/><br /><sub><b>josemanuelrolon</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=josemanuelrolon" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Ajosemanuelrolon" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/josemanuelrolon"><img src="https://avatars.githubusercontent.com/u/1685807?v=4?s=100" width="100px;" alt=""/><br /><sub><b>josemanuelrolon</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=josemanuelrolon" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Ajosemanuelrolon" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/kabroxiko"><img src="https://avatars.githubusercontent.com/u/20568120?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kabroxiko</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=kabroxiko" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Akabroxiko" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/karwer"><img src="https://avatars.githubusercontent.com/u/862540?v=4?s=100" width="100px;" alt=""/><br /><sub><b>karwer</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akarwer" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/kaulonline"><img src="https://avatars.githubusercontent.com/u/1171723?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kaulonline</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akaulonline" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/kdaemonv"><img src="https://avatars.githubusercontent.com/u/5984651?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kdaemonv</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akdaemonv" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/kdebski85"><img src="https://avatars.githubusercontent.com/u/9674813?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kdebski85</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akdebski85" title="Bug reports">🐛</a> <a href="https://github.com/pmd/pmd/commits?author=kdebski85" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/kenji21"><img src="https://avatars.githubusercontent.com/u/1105089?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kenji21</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=kenji21" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Akenji21" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/kfranic"><img src="https://avatars.githubusercontent.com/u/26544594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kfranic</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akfranic" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/kfranic"><img src="https://avatars.githubusercontent.com/u/26544594?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kfranic</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akfranic" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/khalidkh"><img src="https://avatars.githubusercontent.com/u/6832066?v=4?s=100" width="100px;" alt=""/><br /><sub><b>khalidkh</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akhalidkh" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/koalalam"><img src="https://avatars.githubusercontent.com/u/5452429?v=4?s=100" width="100px;" alt=""/><br /><sub><b>koalalam</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akoalalam" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/krzyk"><img src="https://avatars.githubusercontent.com/u/105730?v=4?s=100" width="100px;" alt=""/><br /><sub><b>krzyk</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Akrzyk" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/lasselindqvist"><img src="https://avatars.githubusercontent.com/u/13466645?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lasselindqvist</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Alasselindqvist" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/lgemeinhardt"><img src="https://avatars.githubusercontent.com/u/1395165?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lgemeinhardt</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Algemeinhardt" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/lihuaib"><img src="https://avatars.githubusercontent.com/u/3365643?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lihuaib</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Alihuaib" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/lonelyma1021"><img src="https://avatars.githubusercontent.com/u/22359014?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lonelyma1021</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Alonelyma1021" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/lonelyma1021"><img src="https://avatars.githubusercontent.com/u/22359014?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lonelyma1021</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Alonelyma1021" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/lpeddy"><img src="https://avatars.githubusercontent.com/u/48803108?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lpeddy</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Alpeddy" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://lujie.ac.cn/"><img src="https://avatars.githubusercontent.com/u/2918158?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lujiefsi</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=lujiefsi" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/lukelukes"><img src="https://avatars.githubusercontent.com/u/45536418?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lukelukes</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=lukelukes" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/lyriccoder"><img src="https://avatars.githubusercontent.com/u/20803206?v=4?s=100" width="100px;" alt=""/><br /><sub><b>lyriccoder</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Alyriccoder" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/marcelmore"><img src="https://avatars.githubusercontent.com/u/2975481?v=4?s=100" width="100px;" alt=""/><br /><sub><b>marcelmore</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amarcelmore" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/matchboxy"><img src="https://avatars.githubusercontent.com/u/6457674?v=4?s=100" width="100px;" alt=""/><br /><sub><b>matchbox</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amatchboxy" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/matthiaskraaz"><img src="https://avatars.githubusercontent.com/u/5954500?v=4?s=100" width="100px;" alt=""/><br /><sub><b>matthiaskraaz</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amatthiaskraaz" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/matthiaskraaz"><img src="https://avatars.githubusercontent.com/u/5954500?v=4?s=100" width="100px;" alt=""/><br /><sub><b>matthiaskraaz</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amatthiaskraaz" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/mkeller-ergon"><img src="https://avatars.githubusercontent.com/u/23031669?v=4?s=100" width="100px;" alt=""/><br /><sub><b>meandonlyme</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amkeller-ergon" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/mikesive"><img src="https://avatars.githubusercontent.com/u/4043189?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mikesive</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amikesive" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/milossesic"><img src="https://avatars.githubusercontent.com/u/20756244?v=4?s=100" width="100px;" alt=""/><br /><sub><b>milossesic</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amilossesic" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/mluckam"><img src="https://avatars.githubusercontent.com/u/26581168?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mluckam</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=mluckam" title="Code">💻</a></td>
<td align="center"><a href="https://mohan-chinnappan-n.github.io/about/cv.html"><img src="https://avatars.githubusercontent.com/u/5963194?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mohan-chinnappan-n</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=mohan-chinnappan-n" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/mriddell95"><img src="https://avatars.githubusercontent.com/u/25618660?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mriddell95</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amriddell95" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/mrlzh"><img src="https://avatars.githubusercontent.com/u/13222791?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrlzh</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amrlzh" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/mrlzh"><img src="https://avatars.githubusercontent.com/u/13222791?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mrlzh</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amrlzh" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/msloan"><img src="https://avatars.githubusercontent.com/u/1783723?v=4?s=100" width="100px;" alt=""/><br /><sub><b>msloan</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amsloan" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/mucharlaravalika"><img src="https://avatars.githubusercontent.com/u/32505587?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mucharlaravalika</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amucharlaravalika" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/mvenneman"><img src="https://avatars.githubusercontent.com/u/1266912?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mvenneman</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amvenneman" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/nareshl119"><img src="https://avatars.githubusercontent.com/u/39321364?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nareshl119</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Anareshl119" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/nicolas-harraudeau-sonarsource"><img src="https://avatars.githubusercontent.com/u/40498978?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nicolas-harraudeau-sonarsource</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Anicolas-harraudeau-sonarsource" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/noerremark"><img src="https://avatars.githubusercontent.com/u/4252411?v=4?s=100" width="100px;" alt=""/><br /><sub><b>noerremark</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Anoerremark" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/novsirion"><img src="https://avatars.githubusercontent.com/u/7797113?v=4?s=100" width="100px;" alt=""/><br /><sub><b>novsirion</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Anovsirion" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/novsirion"><img src="https://avatars.githubusercontent.com/u/7797113?v=4?s=100" width="100px;" alt=""/><br /><sub><b>novsirion</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Anovsirion" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/nwcm"><img src="https://avatars.githubusercontent.com/u/111259588?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nwcm</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=nwcm" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/oggboy"><img src="https://avatars.githubusercontent.com/u/4798818?v=4?s=100" width="100px;" alt=""/><br /><sub><b>oggboy</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aoggboy" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://journal.lampetty.net/archive/category/in%20English"><img src="https://avatars.githubusercontent.com/u/78990?v=4?s=100" width="100px;" alt=""/><br /><sub><b>oinume</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aoinume" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/orimarko"><img src="https://avatars.githubusercontent.com/u/17137249?v=4?s=100" width="100px;" alt=""/><br /><sub><b>orimarko</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=orimarko" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Aorimarko" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/pacvz"><img src="https://avatars.githubusercontent.com/u/35453365?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pacvz</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=pacvz" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/pagarwal-ignitetech"><img src="https://avatars.githubusercontent.com/u/30888430?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pallavi agarwal</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Apagarwal-ignitetech" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/parksungrin"><img src="https://avatars.githubusercontent.com/u/29750262?v=4?s=100" width="100px;" alt=""/><br /><sub><b>parksungrin</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aparksungrin" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/parksungrin"><img src="https://avatars.githubusercontent.com/u/29750262?v=4?s=100" width="100px;" alt=""/><br /><sub><b>parksungrin</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aparksungrin" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/patpatpat123"><img src="https://avatars.githubusercontent.com/u/43899031?v=4?s=100" width="100px;" alt=""/><br /><sub><b>patpatpat123</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Apatpatpat123" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/patriksevallius"><img src="https://avatars.githubusercontent.com/u/7291479?v=4?s=100" width="100px;" alt=""/><br /><sub><b>patriksevallius</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Apatriksevallius" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/pbrajesh1"><img src="https://avatars.githubusercontent.com/u/32388299?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pbrajesh1</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Apbrajesh1" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/phoenix384"><img src="https://avatars.githubusercontent.com/u/3883662?v=4?s=100" width="100px;" alt=""/><br /><sub><b>phoenix384</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aphoenix384" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/piotrszymanski-sc"><img src="https://avatars.githubusercontent.com/u/71124942?v=4?s=100" width="100px;" alt=""/><br /><sub><b>piotrszymanski-sc</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=piotrszymanski-sc" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/plan3d"><img src="https://avatars.githubusercontent.com/u/76825073?v=4?s=100" width="100px;" alt=""/><br /><sub><b>plan3d</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aplan3d" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/poojasix"><img src="https://avatars.githubusercontent.com/u/85337280?v=4?s=100" width="100px;" alt=""/><br /><sub><b>poojasix</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Apoojasix" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/poojasix"><img src="https://avatars.githubusercontent.com/u/85337280?v=4?s=100" width="100px;" alt=""/><br /><sub><b>poojasix</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Apoojasix" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/prabhushrikant"><img src="https://avatars.githubusercontent.com/u/6848200?v=4?s=100" width="100px;" alt=""/><br /><sub><b>prabhushrikant</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aprabhushrikant" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/pujitha8783"><img src="https://avatars.githubusercontent.com/u/20646357?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pujitha8783</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Apujitha8783" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/r-r-a-j"><img src="https://avatars.githubusercontent.com/u/33902071?v=4?s=100" width="100px;" alt=""/><br /><sub><b>r-r-a-j</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ar-r-a-j" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/raghujayjunk"><img src="https://avatars.githubusercontent.com/u/48074475?v=4?s=100" width="100px;" alt=""/><br /><sub><b>raghujayjunk</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Araghujayjunk" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/rajeshveera"><img src="https://avatars.githubusercontent.com/u/1306514?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rajeshveera</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arajeshveera" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/rajeswarreddy88"><img src="https://avatars.githubusercontent.com/u/48543250?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rajeswarreddy88</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arajeswarreddy88" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/recdevs"><img src="https://avatars.githubusercontent.com/u/63118273?v=4?s=100" width="100px;" alt=""/><br /><sub><b>recdevs</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arecdevs" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/recdevs"><img src="https://avatars.githubusercontent.com/u/63118273?v=4?s=100" width="100px;" alt=""/><br /><sub><b>recdevs</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arecdevs" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/reudismam"><img src="https://avatars.githubusercontent.com/u/1970407?v=4?s=100" width="100px;" alt=""/><br /><sub><b>reudismam</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=reudismam" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Areudismam" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/rijkt"><img src="https://avatars.githubusercontent.com/u/56129985?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rijkt</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arijkt" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/rillig-tk"><img src="https://avatars.githubusercontent.com/u/46376960?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rillig-tk</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arillig-tk" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/rmohan20"><img src="https://avatars.githubusercontent.com/u/58573547?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rmohan20</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=rmohan20" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Armohan20" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/rnveach"><img src="https://avatars.githubusercontent.com/u/5427943?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rnveach</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arnveach" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://rxmicro.io/"><img src="https://avatars.githubusercontent.com/u/54791695?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rxmicro</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Arxmicro" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/ryan-gustafson"><img src="https://avatars.githubusercontent.com/u/1227016?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ryan-gustafson</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=ryan-gustafson" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Aryan-gustafson" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/ryan-gustafson"><img src="https://avatars.githubusercontent.com/u/1227016?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ryan-gustafson</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=ryan-gustafson" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Aryan-gustafson" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/sabi0"><img src="https://avatars.githubusercontent.com/u/11509875?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sabi0</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asabi0" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/scais"><img src="https://avatars.githubusercontent.com/u/4539192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>scais</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ascais" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/sebbASF"><img src="https://avatars.githubusercontent.com/u/16689231?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sebbASF</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AsebbASF" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/sergeygorbaty"><img src="https://avatars.githubusercontent.com/u/14813710?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sergeygorbaty</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=sergeygorbaty" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/shilko2013"><img src="https://avatars.githubusercontent.com/u/33313482?v=4?s=100" width="100px;" alt=""/><br /><sub><b>shilko2013</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ashilko2013" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/shiomiyan"><img src="https://avatars.githubusercontent.com/u/35842766?v=4?s=100" width="100px;" alt=""/><br /><sub><b>shiomiyan</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=shiomiyan" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/simeonKondr"><img src="https://avatars.githubusercontent.com/u/42644177?v=4?s=100" width="100px;" alt=""/><br /><sub><b>simeonKondr</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AsimeonKondr" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/simeonKondr"><img src="https://avatars.githubusercontent.com/u/42644177?v=4?s=100" width="100px;" alt=""/><br /><sub><b>simeonKondr</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AsimeonKondr" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/snajberk"><img src="https://avatars.githubusercontent.com/u/3585281?v=4?s=100" width="100px;" alt=""/><br /><sub><b>snajberk</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asnajberk" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/sniperrifle2004"><img src="https://avatars.githubusercontent.com/u/18223222?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sniperrifle2004</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asniperrifle2004" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/snuyanzin"><img src="https://avatars.githubusercontent.com/u/403174?v=4?s=100" width="100px;" alt=""/><br /><sub><b>snuyanzin</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asnuyanzin" title="Bug reports">🐛</a> <a href="https://github.com/pmd/pmd/commits?author=snuyanzin" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/sratz"><img src="https://avatars.githubusercontent.com/u/14908423?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sratz</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asratz" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/stonio"><img src="https://avatars.githubusercontent.com/u/19952825?v=4?s=100" width="100px;" alt=""/><br /><sub><b>stonio</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Astonio" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/sturton"><img src="https://avatars.githubusercontent.com/u/1734891?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sturton</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=sturton" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Asturton" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/sudharmohan"><img src="https://avatars.githubusercontent.com/u/16752281?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sudharmohan</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asudharmohan" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/sudharmohan"><img src="https://avatars.githubusercontent.com/u/16752281?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sudharmohan</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asudharmohan" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/suruchidawar"><img src="https://avatars.githubusercontent.com/u/30810931?v=4?s=100" width="100px;" alt=""/><br /><sub><b>suruchidawar</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asuruchidawar" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/svenfinitiv"><img src="https://avatars.githubusercontent.com/u/5653724?v=4?s=100" width="100px;" alt=""/><br /><sub><b>svenfinitiv</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asvenfinitiv" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/tashiscool"><img src="https://avatars.githubusercontent.com/u/1057457?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tashiscool</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atashiscool" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/test-git-hook"><img src="https://avatars.githubusercontent.com/u/49142715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>test-git-hook</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atest-git-hook" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/testation21"><img src="https://avatars.githubusercontent.com/u/47239708?v=4?s=100" width="100px;" alt=""/><br /><sub><b>testation21</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=testation21" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Atestation21" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/thanosa"><img src="https://avatars.githubusercontent.com/u/24596498?v=4?s=100" width="100px;" alt=""/><br /><sub><b>thanosa</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Athanosa" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/tiandiyixian"><img src="https://avatars.githubusercontent.com/u/27055337?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tiandiyixian</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atiandiyixian" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/tiandiyixian"><img src="https://avatars.githubusercontent.com/u/27055337?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tiandiyixian</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atiandiyixian" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/tobwoerk"><img src="https://avatars.githubusercontent.com/u/11739442?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tobwoerk</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atobwoerk" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/tprouvot"><img src="https://avatars.githubusercontent.com/u/35368290?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tprouvot</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atprouvot" title="Bug reports">🐛</a> <a href="https://github.com/pmd/pmd/commits?author=tprouvot" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/trentchilders"><img src="https://avatars.githubusercontent.com/u/6664350?v=4?s=100" width="100px;" alt=""/><br /><sub><b>trentchilders</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atrentchilders" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/triandicAnt"><img src="https://avatars.githubusercontent.com/u/2345902?v=4?s=100" width="100px;" alt=""/><br /><sub><b>triandicAnt</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3AtriandicAnt" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/trishul14"><img src="https://avatars.githubusercontent.com/u/24551131?v=4?s=100" width="100px;" alt=""/><br /><sub><b>trishul14</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Atrishul14" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/xmtsui"><img src="https://avatars.githubusercontent.com/u/1542690?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tsui</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Axmtsui" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/winhkey"><img src="https://avatars.githubusercontent.com/u/4877808?v=4?s=100" width="100px;" alt=""/><br /><sub><b>winhkey</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awinhkey" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/winhkey"><img src="https://avatars.githubusercontent.com/u/4877808?v=4?s=100" width="100px;" alt=""/><br /><sub><b>winhkey</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awinhkey" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/witherspore"><img src="https://avatars.githubusercontent.com/u/813263?v=4?s=100" width="100px;" alt=""/><br /><sub><b>witherspore</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awitherspore" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/wjljack"><img src="https://avatars.githubusercontent.com/u/1182478?v=4?s=100" width="100px;" alt=""/><br /><sub><b>wjljack</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awjljack" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/wuchiuwong"><img src="https://avatars.githubusercontent.com/u/15967553?v=4?s=100" width="100px;" alt=""/><br /><sub><b>wuchiuwong</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Awuchiuwong" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/songxing10000"><img src="https://avatars.githubusercontent.com/u/10040131?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xingsong</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Asongxing10000" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/xioayuge"><img src="https://avatars.githubusercontent.com/u/45328272?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xioayuge</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Axioayuge" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/xnYi9wRezm"><img src="https://avatars.githubusercontent.com/u/61201892?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xnYi9wRezm</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=xnYi9wRezm" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3AxnYi9wRezm" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/xuanuy"><img src="https://avatars.githubusercontent.com/u/3894777?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xuanuy</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Axuanuy" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/xuanuy"><img src="https://avatars.githubusercontent.com/u/3894777?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xuanuy</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Axuanuy" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/xyf0921"><img src="https://avatars.githubusercontent.com/u/17350974?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xyf0921</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Axyf0921" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/yalechen-cyw3"><img src="https://avatars.githubusercontent.com/u/34886223?v=4?s=100" width="100px;" alt=""/><br /><sub><b>yalechen-cyw3</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ayalechen-cyw3" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/yasuharu-sato"><img src="https://avatars.githubusercontent.com/u/45546628?v=4?s=100" width="100px;" alt=""/><br /><sub><b>yasuharu-sato</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ayasuharu-sato" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/zenglian"><img src="https://avatars.githubusercontent.com/u/5268434?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zenglian</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Azenglian" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/zgrzyt93"><img src="https://avatars.githubusercontent.com/u/54275965?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zgrzyt93</b></sub></a><br /><a href="https://github.com/pmd/pmd/commits?author=zgrzyt93" title="Code">💻</a> <a href="https://github.com/pmd/pmd/issues?q=author%3Azgrzyt93" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/zhangxinngang"><img src="https://avatars.githubusercontent.com/u/6891146?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zh3ng</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Azhangxinngang" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/yuchen1013"><img src="https://avatars.githubusercontent.com/u/17316917?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zt_soft</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ayuchen1013" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/yuchen1013"><img src="https://avatars.githubusercontent.com/u/17316917?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zt_soft</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Ayuchen1013" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/ztt79"><img src="https://avatars.githubusercontent.com/u/48408552?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ztt79</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Aztt79" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/zzzzfeng"><img src="https://avatars.githubusercontent.com/u/8851007?v=4?s=100" width="100px;" alt=""/><br /><sub><b>zzzzfeng</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Azzzzfeng" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/magwas"><img src="https://avatars.githubusercontent.com/u/756838?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Árpád Magosányi</b></sub></a><br /><a href="https://github.com/pmd/pmd/issues?q=author%3Amagwas" title="Bug reports">🐛</a></td>

View File

@ -144,6 +144,11 @@ Novice as much as advanced readers may want to [read on on Refactoring Guru](htt
default="false"
languages="C#, C++, Lua"
%}
{% include custom/cli_option_row.html options="--ignore-sequences"
description="Ignore sequences of identifier and literals"
default="false"
languages="C++"
%}
{% include custom/cli_option_row.html options="--ignore-usings"
description="Ignore `using` directives in C# when comparing text"
default="false"
@ -261,36 +266,40 @@ to be "debug".
* C#
* C/C++
* [Coco](pmd_languages_coco.html)
* Dart
* EcmaScript (JavaScript)
* Fortran
* Gherkin (Cucumber)
* [Gherkin](pmd_languages_gherkin.html) (Cucumber)
* Go
* Groovy
* Html
* Java
* Jsp
* Kotlin
* [Html](pmd_languages_html.html)
* [Java](pmd_languages_java.html)
* [Jsp](pmd_languages_jsp.html)
* [Julia](pmd_languages_julia.html)
* [Kotlin](pmd_languages_kotlin.html)
* Lua
* Matlab
* Modelica
* Objective-C
* Perl
* PHP
* PL/SQL
* [PL/SQL](pmd_languages_plsql.html)
* Python
* Ruby
* Salesforce.com Apex
* [Salesforce.com Apex](pmd_languages_apex.html)
* Scala
* Swift
* Visualforce
* XML
* T-SQL
* [TypeScript](pmd_languages_js_ts.html)
* [Visualforce](pmd_languages_visualforce.html)
* [XML](pmd_languages_xml.html)
## Available report formats
* text : Default format
* xml
* xml (and xslt)
* csv
* csv_with_linecount_per_file
* vs
@ -404,6 +413,8 @@ the CPD task as usual and right after it invoke the Ant XSLT script like this:
<xslt in="cpd.xml" style="etc/xslt/cpdhtml.xslt" out="cpd.html" />
```
See [section "xslt" in CPD Report Formats](pmd_userdocs_cpd_report_formats.html#xslt) for more examples.
## GUI
CPD also comes with a simple GUI. You can start it through the unified CLI interface provided in the `bin` folder:

View File

@ -95,6 +95,7 @@ Starting at line 110 of /home/pmd/source/pmd-core/src/test/java/net/sourceforge/
## xml
This format uses XML to output the duplications in a more structured format.
The XML format can then further be processed using XSLT transformations. See [section xslt](#xslt) for examples.
Example:
@ -220,3 +221,41 @@ Example:
/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/xpath/JaxenXPathRuleQueryTest.java(88): Between lines 88 and 104
/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/xpath/JaxenXPathRuleQueryTest.java(110): Between lines 110 and 126
```
## xslt
This is not a direct report format. But you can use `xml` to generate an XML report and then use one of the following
XSLT stylesheets to convert the report into html. Or you can write your own stylesheet.
You can either use [Ant's XSLT task](https://ant.apache.org/manual/Tasks/style.html) or use any other (CLI) xslt processor,
e.g. `xalan` (see <https://xalan.apache.org/>).
### cpdhtml.xslt
This stylesheet is available in the sources or from GitHub at: <https://raw.githubusercontent.com/pmd/pmd/master/pmd-core/etc/xslt/cpdhtml.xslt>.
```shell
xalan -in cpd-report-sample.xml -xsl cpdhtml.xslt -out cpd-report-sample-cpdhtml.html
```
[Example](report-examples/cpdhtml.html)
This stylesheet by default only consideres duplications longer than 30 lines. You can change the default value with
the param `lines`:
```shell
xalan -in cpd-report-sample.xml -xsl cpdhtml.xslt -out cpd-report-sample-cpdhtml.html -param lines 10
```
### cpdhtml-v2.xslt
This stylesheet is available in the sources or from GitHub at: <https://raw.githubusercontent.com/pmd/pmd/master/pmd-core/etc/xslt/cpdhtml-v2.xslt>.
```shell
xalan -in pmd-core-cpd-report.xml -xsl etc/xslt/cpdhtml-v2.xslt -out pmd-core-cpd-report-v2.html
```
[Example](report-examples/cpdhtml-v2.html)
It requires javascript enabled and uses [Bootstrap](https://getbootstrap.com/),
[jQuery](https://jquery.com/), and [DataTables](https://datatables.net/).

View File

@ -192,8 +192,7 @@ then the violation will be suppressed. Note that the query shouldn't be finding
the violation nodes to suppress, but rather, finding a non-empty sequence of nodes
when evaluated with the violation node as a context node.
The XPath version used by those queries is XPath 1.0, so it doesn't support various XPath 2.0
features. This will be updated with PMD 7.0.0.
The XPath version used by those queries is XPath 3.1 since PMD 7. Before then XPath 1.0 was used.
For example, to suppress reporting specifically "String" parameters which are unused:

View File

@ -30,186 +30,6 @@ Note: You'll need to select a specific version. This is done in the example via
This will transitively pull in the artifact `pmd-core` which contains the API.
## Command line interface
The easiest way is to call PMD with the same interface as from command line. The main class is
`net.sourceforge.pmd.PMD`:
``` java
import net.sourceforge.pmd.PMD;
public class Example {
public static void main(String[] args) {
String[] pmdArgs = {
"-d", "/home/workspace/src/main/java/code",
"-R", "rulesets/java/quickstart.xml",
"-f", "xml",
"-r", "/home/workspace/pmd-report.xml"
};
PMD.main(pmdArgs);
}
}
```
It uses the same options as described in [PMD CLI reference](pmd_userdocs_cli_reference.html).
## Programmatically, variant 1
This is very similar:
``` java
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.PMDConfiguration;
public class PmdExample {
public static void main(String[] args) {
PMDConfiguration configuration = new PMDConfiguration();
configuration.setInputPaths("/home/workspace/src/main/java/code");
configuration.addRuleSet("rulesets/java/quickstart.xml");
configuration.setReportFormat("xml");
configuration.setReportFile("/home/workspace/pmd-report.xml");
PMD.runPmd(configuration);
}
}
```
## Programmatically, variant 2
This gives you more control over which files are processed, but is also more complicated.
You can also provide your own custom renderers.
1. First we create a `PMDConfiguration` and configure it, first the rules:
```java
PMDConfiguration configuration = new PMDConfiguration();
configuration.setMinimumPriority(RulePriority.MEDIUM);
configuration.addRuleSet("rulesets/java/quickstart.xml");
```
2. Then we configure, which paths to analyze:
```java
configuration.setInputPaths("/home/workspace/src/main/java/code");
```
3. The we configure the default language version for Java. And in order to support type resolution,
PMD needs to have access to the compiled classes and dependencies as well. This is called
"auxclasspath" and is also configured here.
Note: you can specify multiple class paths separated by `:` on Unix-systems or `;` under Windows.
```java
configuration.setDefaultLanguageVersion(LanguageRegistry.findLanguageByTerseName("java").getVersion("11"));
configuration.prependAuxClasspath("/home/workspace/target/classes:/home/.m2/repository/my/dependency.jar");
```
4. Then we configure the reporting. Configuring the report file is optional. If not specified, the report
will be written to `stdout`.
```java
configuration.setReportFormat("xml");
configuration.setReportFile("/home/workspace/pmd-report.xml");
```
5. Now an optional step: If you want to use additional renderers as in the example, set them up before
calling PMD. You can use a built-in renderer, e.g. `XMLRenderer` or a custom renderer implementing
`Renderer`. Note, that you must manually initialize the renderer by setting a suitable `Writer`:
```java
Writer rendererOutput = new StringWriter();
Renderer renderer = createRenderer(rendererOutput);
// ...
private static Renderer createRenderer(Writer writer) {
XMLRenderer xml = new XMLRenderer("UTF-8");
xml.setWriter(writer);
return xml;
}
```
6. Finally we can start the PMD analysis. There is the possibility to fine-tune the configuration
by adding additional files to analyze or adding additional rulesets or renderers:
```java
try (PmdAnalysis pmd = PmdAnalysis.create(configuration)) {
// optional: add more rulesets
pmd.addRuleSet(pmd.newRuleSetLoader().loadFromResource("custom-ruleset.xml"));
// optional: add more files
pmd.files().addFile(Paths.get("src", "main", "more-java", "ExtraSource.java"));
// optional: add more renderers
pmd.addRenderer(renderer);
// or just call PMD
pmd.performAnalysis();
}
```
The renderer will be automatically flushed and closed at the end of the analysis.
7. Then you can check the rendered output.
``` java
System.out.println("Rendered Report:");
System.out.println(rendererOutput.toString());
```
Here is a complete example:
``` java
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.file.Paths;
import net.sourceforge.pmd.PMDConfiguration;
import net.sourceforge.pmd.PmdAnalysis;
import net.sourceforge.pmd.RulePriority;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.renderers.Renderer;
import net.sourceforge.pmd.renderers.XMLRenderer;
public class PmdExample2 {
public static void main(String[] args) throws IOException {
PMDConfiguration configuration = new PMDConfiguration();
configuration.setMinimumPriority(RulePriority.MEDIUM);
configuration.addRuleSet("rulesets/java/quickstart.xml");
configuration.setInputPaths("/home/workspace/src/main/java/code");
configuration.setDefaultLanguageVersion(LanguageRegistry.findLanguageByTerseName("java").getVersion("11"));
configuration.prependAuxClasspath("/home/workspace/target/classes");
configuration.setReportFormat("xml");
configuration.setReportFile("/home/workspace/pmd-report.xml");
Writer rendererOutput = new StringWriter();
Renderer renderer = createRenderer(rendererOutput);
try (PmdAnalysis pmd = PmdAnalysis.create(configuration)) {
// optional: add more rulesets
pmd.addRuleSet(pmd.newRuleSetLoader().loadFromResource("custom-ruleset.xml"));
// optional: add more files
pmd.files().addFile(Paths.get("src", "main", "more-java", "ExtraSource.java"));
// optional: add more renderers
pmd.addRenderer(renderer);
// or just call PMD
pmd.performAnalysis();
}
System.out.println("Rendered Report:");
System.out.println(rendererOutput.toString());
}
private static Renderer createRenderer(Writer writer) {
XMLRenderer xml = new XMLRenderer("UTF-8");
xml.setWriter(writer);
return xml;
}
}
```
## Running PMD programmatically
The programmatic API for PMD is centered around {% jdoc core::PmdAnalysis %}, please see the javadocs for usage information.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -446,6 +446,13 @@ Contributors: [Lucas Soncini](https://github.com/lsoncini) (@lsoncini),
This PMD release ships a new version of the pmd-designer.
For the changes, see [PMD Designer Changelog](https://github.com/pmd/pmd-designer/releases/tag/7.0.0-rc1).
#### New CPD report format cpdhtml-v2.xslt
Thanks to @mohan-chinnappan-n a new CPD report format has been added which features a data table.
It uses an XSLT stylesheet to convert CPD's XML format into HTML.
See [the example report](report-examples/cpdhtml-v2.html).
## 🎉 Language Related Changes
### New: Swift support
@ -488,6 +495,28 @@ We are shipping the following rules:
Contributors: [Jeroen Borgers](https://github.com/jborgers) (@jborgers),
[Peter Paul Bakker](https://github.com/stokpop) (@stokpop)
### New: CPD support for TypeScript
Thanks to a contribution, CPD now supports the TypeScript language. It is shipped
with the rest of the JavaScript support in the module `pmd-javascript`.
Contributors: [Paul Guyot](https://github.com/pguyot) (@pguyot)
### New: CPD support for Julia
Thanks to a contribution, CPD now supports the Julia language. It is shipped
in the new module `pmd-julia`.
Contributors: [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
### New: CPD support for Coco
Thanks to a contribution, CPD now supports Coco, a modern programming language
designed specifically for building event-driven software. It is shipped in the new
module `pmd-coco`.
Contributors: [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
### Changed: JavaScript support
The JS specific parser options have been removed. The parser now always retains comments and uses version ES6.
@ -508,6 +537,13 @@ the Java module, listing all possible versions enables other languages as well t
Related issue: [[core] Explicitly name all language versions (#4120)](https://github.com/pmd/pmd/issues/4120)
### Changed: CPP can now ignore identifiers in sequences (CPD)
* new command line option for CPD: `--ignore-sequences`.
* This option is used for CPP only: with the already existing option `--ignore-literal-sequences`, only
literals were ignored. The new option additional ignores identifiers as well in sequences.
* See [PR #4470](https://github.com/pmd/pmd/pull/4470) for details.
## 🌟 New and changed rules
### New Rules
@ -530,33 +566,116 @@ Related issue: [[core] Explicitly name all language versions (#4120)](https://gi
### Changed Rules
**Java**
**General changes**
* {% rule "java/codestyle/UnnecessaryFullyQualifiedName" %}: the rule has two new properties,
* All statistical rules (like ExcessiveClassLength, ExcessiveParameterList) have been simplified and unified.
The properties `topscore` and `sigma` have been removed. The property `minimum` is still there, however the type is not
a decimal number anymore but has been changed to an integer. This affects rules in the languages Apex, Java, PLSQL
and Velocity Template Language (vm):
* Apex: {% rule apex/design/ExcessiveClassLength %}, {% rule apex/design/ExcessiveParameterList %},
{% rule apex/design/ExcessivePublicCount %}, {% rule apex/design/NcssConstructorCount %},
{% rule apex/design/NcssMethodCount %}, {% rule apex/design/NcssTypeCount %}
* Java: {% rule java/design/ExcessiveImports %}, {% rule java/design/ExcessiveParameterList %},
{% rule java/design/ExcessivePublicCount %}, {% rule java/design/SwitchDensity %}
* PLSQL: {% rule plsql/design/ExcessiveMethodLength %}, {% rule plsql/design/ExcessiveObjectLength %},
{% rule plsql/design/ExcessivePackageBodyLength %}, {% rule plsql/design/ExcessivePackageSpecificationLength %},
{% rule plsql/design/ExcessiveParameterList %}, {% rule plsql/design/ExcessiveTypeLength %},
{% rule plsql/design/NcssMethodCount %}, {% rule plsql/design/NcssObjectCount %},
{% rule plsql/design/NPathComplexity %}
* VM: {% rule vm/design/ExcessiveTemplateLength %}
* The general property `violationSuppressXPath` which is available for all rules to
[suppress warnings](pmd_userdocs_suppressing_warnings.html) now uses XPath version 3.1 by default.
This version of the XPath language is mostly identical to XPath 2.0. In PMD 6, XPath 1.0 has been used.
If you upgrade from PMD 6, you need to verify your `violationSuppressXPath` properties.
**Apex General changes**
* The properties `cc_categories`, `cc_remediation_points_multiplier`, `cc_block_highlighting` have been removed
from all rules. These properties have been deprecated since PMD 6.13.0.
See [issue #1648](https://github.com/pmd/pmd/issues/1648) for more details.
**Java General changes**
* Violations reported on methods or classes previously reported the line range of the entire method
or class. With PMD 7.0.0, the reported location is now just the identifier of the method or class.
This affects various rules, e.g. {% rule java/design/CognitiveComplexity %}.
The report location is controlled by the overrides of the method {% jdoc core::lang.ast.Node#getReportLocation() %}
in different node types.
See [issue #4439](https://github.com/pmd/pmd/issues/4439) and [issue #730](https://github.com/pmd/pmd/issues/730)
for more details.
**Java Best Practices**
* {% rule java/bestpractices/ArrayIsStoredDirectly %}: Violations are now reported on the assignment and not
anymore on the formal parameter. The reported line numbers will probably move.
* {% rule java/bestpractices/AvoidReassigningLoopVariables %}: This rule might not report anymore all
reassignments of the control variable in for-loops when the property `forReassign` is set to `skip`.
See [issue #4500](https://github.com/pmd/pmd/issues/4500) for more details.
* {% rule java/bestpractices/LooseCoupling %}: The rule has a new property to allow some types to be coupled
to (`allowedTypes`).
* {% rule java/bestpractices/UnusedLocalVariable %}: This rule has some important false-negatives fixed
and finds many more cases now. For details see issues [#2130](https://github.com/pmd/pmd/issues/2130),
[#4516](https://github.com/pmd/pmd/issues/4516), and [#4517](https://github.com/pmd/pmd/issues/4517).
**Java Codestyle**
* {% rule java/codestyle/MethodNamingConventions %}: The property `checkNativeMethods` has been removed. The
property was deprecated since PMD 6.3.0. Use the property `nativePattern` to control whether native methods
should be considered or not.
* {% rule java/codestyle/ShortVariable %}: This rule now also reports short enum constant names.
* {% rule java/codestyle/UseDiamondOperator %}: The property `java7Compatibility` has been removed. The rule now
handles Java 7 properly without a property.
* {% rule java/codestyle/UnnecessaryFullyQualifiedName %}: The rule has two new properties,
to selectively disable reporting on static field and method qualifiers. The rule also has been improved
to be more precise.
* {% rule "java/codestyle/UselessParentheses" %}: the rule has two new properties which control how strict
* {% rule java/codestyle/UselessParentheses %}: The rule has two new properties which control how strict
the rule should be applied. With `ignoreClarifying` (default: true) parentheses that are strictly speaking
not necessary are allowed, if they separate expressions of different precedence.
The other property `ignoreBalancing` (default: true) is similar, in that it allows parentheses that help
reading and understanding the expressions.
* {% rule "java/bestpractices/LooseCoupling" %}: the rule has a new property to allow some types to be coupled
to (`allowedTypes`).
* {% rule "java/errorprone/EmptyCatchBlock" %}: `CloneNotSupportedException` and `InterruptedException` are not
special-cased anymore. Rename the exception parameter to `ignored` to ignore them.
* {% rule "java/errorprone/DontImportSun" %}: `sun.misc.Signal` is not special-cased anymore.
* {% rule "java/codestyle/UseDiamondOperator" %}: the property `java7Compatibility` is removed. The rule now
handles Java 7 properly without a property.
* {% rule "java/design/SingularField" %}: Properties `checkInnerClasses` and `disallowNotAssignment` are removed.
The rule is now more precise and will check these cases properly.
* {% rule "java/design/UseUtilityClass" %}: The property `ignoredAnnotations` has been removed.
* {% rule "java/design/LawOfDemeter" %}: the rule has a new property `trustRadius`. This defines the maximum degree
of trusted data. The default of 1 is the most restrictive.
* {% rule "java/documentation/CommentContent" %}: The properties `caseSensitive` and `disallowedTerms` are removed. The
new property `fobiddenRegex` can be used now to define the disallowed terms with a single regular
expression.
* {% rule "java/design/ImmutableField" %}: the property `ignoredAnnotations` has been removed. The property was
**Java Design**
* {% rule java/design/CyclomaticComplexity %}: The property `reportLevel` has been removed. The property was
deprecated since PMD 6.0.0. The report level can now be configured separated for classes and methods using
`classReportLevel` and `methodReportLevel` instead.
* {% rule java/design/ImmutableField %}: The property `ignoredAnnotations` has been removed. The property was
deprecated since PMD 6.52.0.
* {% rule java/design/LawOfDemeter %}: The rule has a new property `trustRadius`. This defines the maximum degree
of trusted data. The default of 1 is the most restrictive.
* {% rule java/design/NPathComplexity %}: The property `minimum` has been removed. It was deprecated since PMD 6.0.0.
Use the property `reportLevel` instead.
* {% rule java/design/SingularField %}: The properties `checkInnerClasses` and `disallowNotAssignment` have been removed.
The rule is now more precise and will check these cases properly.
* {% rule java/design/UseUtilityClass %}: The property `ignoredAnnotations` has been removed.
**Java Documentation**
* {% rule java/documentation/CommentContent %}: The properties `caseSensitive` and `disallowedTerms` are removed. The
new property `forbiddenRegex` can be used now to define the disallowed terms with a single regular
expression.
* {% rule java/documentation/CommentRequired %}:
* Overridden methods are now detected even without the `@Override`
annotation. This is relevant for the property `methodWithOverrideCommentRequirement`.
See also [pull request #3757](https://github.com/pmd/pmd/pull/3757).
* Elements in annotation types are now detected as well. This might lead to an increased number of violations
for missing public method comments.
* {% rule java/documentation/CommentSize %}: When determining the line-length of a comment, the leading comment
prefix markers (e.g. `*` or `//`) are ignored and don't add up to the line-length.
See also [pull request #4369](https://github.com/pmd/pmd/pull/4369).
**Java Error Prone**
* {% rule java/errorprone/AvoidDuplicateLiterals %}: The property `exceptionfile` has been removed. The property was
deprecated since PMD 6.10.0. Use the property `exceptionList` instead.
* {% rule java/errorprone/DontImportSun %}: `sun.misc.Signal` is not special-cased anymore.
* {% rule java/errorprone/EmptyCatchBlock %}: `CloneNotSupportedException` and `InterruptedException` are not
special-cased anymore. Rename the exception parameter to `ignored` to ignore them.
* {% rule java/errorprone/ImplicitSwitchFallThrough %}: Violations are now reported on the case statements
rather than on the switch statements. This is more accurate but might result in more violations now.
### Deprecated Rules
@ -861,6 +980,15 @@ Related issue: [[core] Language lifecycle (#3782)](https://github.com/pmd/pmd/is
### API removals
#### 7.0.0-rc2
* The following previously deprecated classes have been removed:
* pmd-core
* `net.sourceforge.pmd.PMD`
* `net.sourceforge.pmd.cli.PMDCommandLineInterface`
* `net.sourceforge.pmd.cli.PMDParameters`
* `net.sourceforge.pmd.cli.PmdParametersParseResult`
#### 6.55.0
**Go**

View File

@ -0,0 +1,175 @@
<!DOCTYPE HTML SYSTEM "about:legacy-compat">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<link href="https://cdn.datatables.net/v/bs5/jszip-2.5.0/dt-1.13.4/b-2.3.6/b-html5-2.3.6/b-print-2.3.6/datatables.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script><script src="https://cdn.datatables.net/v/bs5/jszip-2.5.0/dt-1.13.4/b-2.3.6/b-html5-2.3.6/b-print-2.3.6/datatables.min.js"></script>
</head>
<body style="padding-top: 3.5rem;">
<nav class="navbar navbar-expand-lg fixed-top navbar-dark bg-dark">
<a class="navbar-brand" href="#">PMD - CPD (Copy and Paste Detector)</a><button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active" href="#">Home</a>
</li>
<li class="nav-item" id="nav_enable_datatable">
<a class="nav-link" href="?d=">Enable datatable</a>
</li>
<li class="nav-item" id="nav_disable_datatable">
<a class="nav-link" href="?">Disable datatable</a>
</li>
<li class="nav-item">
<a class="nav-link" target="_blank" rel="noopener noreferrer" href="https://docs.pmd-code.org/latest/pmd_userdocs_cpd.html#refactoring-duplicates">About Refactoring Duplicates</a>
</li>
</ul>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col">
<h4>Summary of duplicated code</h4>
<p>This page summarizes the code fragments that have been found to be replicated in the code.</p>
<table class="table table-light table-bordered table-striped table-hover">
<tr>
<th># Duplications</th><th>Total lines</th><th>Total tokens</th><th>Approximate number of bytes</th>
</tr>
<tr>
<td class="SummaryNumber">2</td><td class="SummaryNumber">49</td><td class="SummaryNumber">349</td><td class="SummaryNumber">1396</td>
</tr>
</table>
</div>
</div>
<div class="row">
<div class="col">
<h4>Details of duplicated code</h4>
</div>
<table style="width:100%" id="data_table" class="table table-light table-bordered table-striped table-hover">
<thead>
<tr>
<th>lines</th><th>tokens</th><th>files</th><th>codefragment</th>
</tr>
</thead>
<tbody>
<tr>
<td>33</td><td>239</td><td>
<table class="table table-light table-bordered table-striped table-hover">
<tr>
<th>column</th><th>endcolumn</th><th>line</th><th>endline</th><th>path</th>
</tr>
<tr>
<td>29</td><td>75</td><td>32</td><td>64</td><td>/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/RuleReferenceTest.java</td>
</tr>
<tr>
<td>37</td><td>75</td><td>68</td><td>100</td><td>/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/RuleReferenceTest.java</td>
</tr>
</table>
</td><td>
<pre> public void testOverride() {
final StringProperty PROPERTY1_DESCRIPTOR = new StringProperty("property1", "Test property", null, 0f);
MockRule rule = new MockRule();
rule.definePropertyDescriptor(PROPERTY1_DESCRIPTOR);
rule.setLanguage(LanguageRegistry.getLanguage(Dummy2LanguageModule.NAME));
rule.setName("name1");
rule.setProperty(PROPERTY1_DESCRIPTOR, "value1");
rule.setMessage("message1");
rule.setDescription("description1");
rule.addExample("example1");
rule.setExternalInfoUrl("externalInfoUrl1");
rule.setPriority(RulePriority.HIGH);
final StringProperty PROPERTY2_DESCRIPTOR = new StringProperty("property2", "Test property", null, 0f);
RuleReference ruleReference = new RuleReference();
ruleReference.setRule(rule);
ruleReference.definePropertyDescriptor(PROPERTY2_DESCRIPTOR);
ruleReference.setLanguage(LanguageRegistry.getLanguage(DummyLanguageModule.NAME));
ruleReference
.setMinimumLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getVersion("1.3"));
ruleReference
.setMaximumLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getVersion("1.7"));
ruleReference.setDeprecated(true);
ruleReference.setName("name2");
ruleReference.setProperty(PROPERTY1_DESCRIPTOR, "value2");
ruleReference.setProperty(PROPERTY2_DESCRIPTOR, "value3");
ruleReference.setMessage("message2");
ruleReference.setDescription("description2");
ruleReference.addExample("example2");
ruleReference.setExternalInfoUrl("externalInfoUrl2");
ruleReference.setPriority(RulePriority.MEDIUM_HIGH);
validateOverriddenValues(PROPERTY1_DESCRIPTOR, PROPERTY2_DESCRIPTOR, ruleReference);</pre>
</td>
</tr>
<tr>
<td>16</td><td>110</td><td>
<table class="table table-light table-bordered table-striped table-hover">
<tr>
<th>column</th><th>endcolumn</th><th>line</th><th>endline</th><th>path</th>
</tr>
<tr>
<td>9</td><td>28</td><td>66</td><td>81</td><td>/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/xpath/JaxenXPathRuleQueryTest.java</td>
</tr>
<tr>
<td>9</td><td>28</td><td>88</td><td>103</td><td>/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/xpath/JaxenXPathRuleQueryTest.java</td>
</tr>
<tr>
<td>9</td><td>28</td><td>110</td><td>125</td><td>/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/lang/rule/xpath/JaxenXPathRuleQueryTest.java</td>
</tr>
</table>
</td><td>
<pre> JaxenXPathRuleQuery query = createQuery(xpath);
List&lt;String&gt; ruleChainVisits = query.getRuleChainVisits();
Assert.assertEquals(2, ruleChainVisits.size());
Assert.assertTrue(ruleChainVisits.contains("dummyNode"));
// Note: Having AST_ROOT in the rule chain visits is probably a mistake. But it doesn't hurt, it shouldn't
// match a real node name.
Assert.assertTrue(ruleChainVisits.contains(JaxenXPathRuleQuery.AST_ROOT));
DummyNodeWithListAndEnum dummy = new DummyNodeWithListAndEnum(1);
RuleContext data = new RuleContext();
data.setLanguageVersion(LanguageRegistry.findLanguageByTerseName("dummy").getDefaultVersion());
query.evaluate(dummy, data);
// note: the actual xpath queries are only available after evaluating
Assert.assertEquals(2, query.nodeNameToXPaths.size());
Assert.assertEquals("self::node()[(attribute::Test1 = \"false\")][(attribute::Test2 = \"true\")]", query.nodeNameToXPaths.get("dummyNode").get(0).toString());</pre>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<script>
let params = (new URL(document.location)).searchParams;
let showDatatable = false;
//------------ can be called with this parameter d
if (params.get('d') !== null) { // got it via query param d
showDatatable = true;
}
if (showDatatable) {
$("#nav_disable_datatable").show();
$("#nav_enable_datatable").hide();
$(document).ready( function () {
$('#data_table').DataTable({
dom: "<'row'<'col-sm-12 col-md-4'B><'col-sm-12 col-md-4'l><'col-sm-12 col-md-4'f>>" +
"<'row'<'col-sm-12'tr>>" +
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
buttons: [
'copy', 'csv', 'excel', 'pdf', 'print'
]
}
);
} );
} else {
$("#nav_disable_datatable").hide();
$("#nav_enable_datatable").show();
}
</script>
</body>
</html>

View File

@ -0,0 +1,111 @@
<!DOCTYPE HTML SYSTEM "about:legacy-compat">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta charset="utf-8">
<script type="text/javascript">
function toggleCodeSection(btn, id)
{
area = document.getElementById(id);
if (area.style.display == 'none')
{
btn.innerHTML = '-';
area.style.display = 'inline';
}
else
{
btn.innerHTML = '+';
area.style.display = 'none';
}
}
</script>
<style type="text/css">
.SummaryTitle { }
.SummaryNumber { background-color:#DDDDDD; text-align: center; }
.ItemNumber { background-color: #DDDDDD; }
.CodeFragment { background-color: #BBBBBB; display:none; font:normal normal normal 9pt Courier; }
.ExpandButton { background-color: #FFFFFF; font-size: 8pt; width: 20px; height: 20px; margin:0px; }
</style>
</head>
<body>
<h2>Summary of duplicated code</h2>
This page summarizes the code fragments that have been found to be replicated in the code.
Only those fragments longer than 30 lines of code are shown.
<p></p>
<table border="1" class="summary" cellpadding="2">
<tr style="background-color:#CCCCCC;">
<th># duplications</th><th>Total lines</th><th>Total tokens</th><th>Approx # bytes</th>
</tr>
<tr>
<td class="SummaryNumber">1</td><td class="SummaryNumber">33</td><td class="SummaryNumber">239</td><td class="SummaryNumber">956</td>
</tr>
</table>
<p></p>
You expand and collapse the code fragments using the + buttons. You can also navigate to the source code by clicking
on the file names.
<p></p>
<table>
<tr style="background-color: #444444; color: #DDDDDD;">
<td>ID</td><td>Files</td><td>Lines</td>
</tr>
<tr>
<td class="ItemNumber">1</td><td>
<table>
<tr>
<td><a href="../src//home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/RuleReferenceTest.java.html#32">/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/RuleReferenceTest.java</a></td><td> line 32</td>
</tr>
<tr>
<td><a href="../src//home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/RuleReferenceTest.java.html#68">/home/pmd/source/pmd-core/src/test/java/net/sourceforge/pmd/RuleReferenceTest.java</a></td><td> line 68</td>
</tr>
</table>
</td><td># lines : 33</td>
</tr>
<tr>
<td></td><td colspan="2" valign="top">
<table>
<tr>
<td valign="top"><button class="ExpandButton" onclick="blur(); toggleCodeSection(this, 'frag_1')">+</button></td><td><textarea cols="100" wrap="off" class="CodeFragment" style="display:none;" rows="30" id="frag_1"> public void testOverride() {
final StringProperty PROPERTY1_DESCRIPTOR = new StringProperty("property1", "Test property", null, 0f);
MockRule rule = new MockRule();
rule.definePropertyDescriptor(PROPERTY1_DESCRIPTOR);
rule.setLanguage(LanguageRegistry.getLanguage(Dummy2LanguageModule.NAME));
rule.setName("name1");
rule.setProperty(PROPERTY1_DESCRIPTOR, "value1");
rule.setMessage("message1");
rule.setDescription("description1");
rule.addExample("example1");
rule.setExternalInfoUrl("externalInfoUrl1");
rule.setPriority(RulePriority.HIGH);
final StringProperty PROPERTY2_DESCRIPTOR = new StringProperty("property2", "Test property", null, 0f);
RuleReference ruleReference = new RuleReference();
ruleReference.setRule(rule);
ruleReference.definePropertyDescriptor(PROPERTY2_DESCRIPTOR);
ruleReference.setLanguage(LanguageRegistry.getLanguage(DummyLanguageModule.NAME));
ruleReference
.setMinimumLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getVersion("1.3"));
ruleReference
.setMaximumLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getVersion("1.7"));
ruleReference.setDeprecated(true);
ruleReference.setName("name2");
ruleReference.setProperty(PROPERTY1_DESCRIPTOR, "value2");
ruleReference.setProperty(PROPERTY2_DESCRIPTOR, "value3");
ruleReference.setMessage("message2");
ruleReference.setDescription("description2");
ruleReference.addExample("example2");
ruleReference.setExternalInfoUrl("externalInfoUrl2");
ruleReference.setPriority(RulePriority.MEDIUM_HIGH);
validateOverriddenValues(PROPERTY1_DESCRIPTOR, PROPERTY2_DESCRIPTOR, ruleReference);</textarea></td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">
<hr>
</td>
</tr>
</table>
</body>
</html>

View File

@ -3,9 +3,7 @@
~ BSD-style license; for more info see http://pmd.sourceforge.net/license.html
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>pmd</artifactId>
<groupId>net.sourceforge.pmd</groupId>

View File

@ -115,7 +115,7 @@ public class SomeClass {
</test-code>
<test-code>
<description>class with inner classes</description>
<description>#4509 class with inner classes</description>
<rule-property name="minimum">1</rule-property>
<expected-problems>2</expected-problems>
<expected-linenumbers>1,5</expected-linenumbers>

View File

@ -38,7 +38,7 @@
<arguments>
<argument>-Dpicocli.autocomplete.systemExitOnError</argument>
<argument>-cp</argument>
<classpath/>
<classpath />
<argument>picocli.AutoComplete</argument>
<argument>--force</argument>
<argument>--completionScript</argument>

View File

@ -81,6 +81,7 @@ public abstract class AbstractAnalysisPmdSubcommand<C extends AbstractConfigurat
protected CliExitCode execute() {
final C configuration = toConfiguration();
return PmdRootLogger.executeInLoggingContext(configuration,
debug,
this::doExecute);
}

View File

@ -66,6 +66,9 @@ public class CpdCommand extends AbstractAnalysisPmdSubcommand<CPDConfiguration>
@Option(names = "--ignore-literal-sequences", description = "Ignore sequences of literals such as list initializers.")
private boolean ignoreLiteralSequences;
@Option(names = "--ignore-sequences", description = "Ignore sequences of identifiers and literals")
private boolean ignoreIdentifierAndLiteralSequences;
@Option(names = "--skip-lexical-errors",
description = "Skip files which can't be tokenized due to invalid characters, instead of aborting with an error.")
private boolean skipLexicalErrors;
@ -115,7 +118,6 @@ public class CpdCommand extends AbstractAnalysisPmdSubcommand<CPDConfiguration>
@Override
protected CPDConfiguration toConfiguration() {
final CPDConfiguration configuration = new CPDConfiguration();
configuration.setDebug(debug);
configuration.setExcludes(excludes);
if (relativizeRootPaths != null) {
configuration.addRelativizeRoots(relativizeRootPaths);

View File

@ -284,7 +284,6 @@ public class PmdCommand extends AbstractAnalysisPmdSubcommand<PMDConfiguration>
configuration.setIgnoreFilePath(ignoreListPath);
configuration.setInputUri(uri);
configuration.setReportFormat(format);
configuration.setDebug(debug);
configuration.setSourceEncoding(encoding.getEncoding());
configuration.setMinimumPriority(minimumPriority);
configuration.setReportFile(reportFile);

View File

@ -85,7 +85,6 @@ public class TreeExportCommand extends AbstractPmdSubcommand {
public TreeExportConfiguration toConfiguration() {
final TreeExportConfiguration configuration = new TreeExportConfiguration();
configuration.setDebug(debug);
configuration.setFile(file);
configuration.setFormat(format);
configuration.setLanguage(language);

View File

@ -33,13 +33,13 @@ public final class PmdRootLogger {
// utility class
}
public static <C extends AbstractConfiguration, R> R executeInLoggingContext(C conf, Function<C, R> runnable) {
public static <C extends AbstractConfiguration, R> R executeInLoggingContext(C conf, boolean isDebug, Function<C, R> runnable) {
Level curLogLevel = Slf4jSimpleConfiguration.getDefaultLogLevel();
boolean resetLogLevel = false;
try {
// only reconfigure logging, if debug flag was used on command line
// otherwise just use whatever is in conf/simplelogger.properties which happens automatically
if (conf.isDebug()) {
if (isDebug) {
Slf4jSimpleConfiguration.reconfigureDefaultLogLevel(Level.TRACE);
// need to reload the logger with the new configuration
log = LoggerFactory.getLogger(PMD_CLI_LOGGER);

59
pmd-coco/pom.xml Normal file
View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>pmd-coco</artifactId>
<name>PMD Coco</name>
<parent>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd</artifactId>
<version>7.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<build>
<plugins>
<plugin>
<groupId>org.antlr</groupId>
<artifactId>antlr4-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<useDefaultDelimiters>false</useDefaultDelimiters>
<delimiters>
<delimiter>${*}</delimiter>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-core</artifactId>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-lang-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,30 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.coco;
import net.sourceforge.pmd.cpd.Tokenizer;
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.coco.cpd.CocoTokenizer;
import net.sourceforge.pmd.lang.impl.CpdOnlyLanguageModuleBase;
/**
* Language implementation for Coco.
*/
public class CocoLanguageModule extends CpdOnlyLanguageModuleBase {
public CocoLanguageModule() {
super(LanguageMetadata.withId("coco").name("Coco").extensions("coco"));
}
@Override
public Tokenizer createCpdTokenizer(LanguagePropertyBundle bundle) {
return new CocoTokenizer();
}
public static CocoLanguageModule getInstance() {
return (CocoLanguageModule) LanguageRegistry.CPD.getLanguageById("coco");
}
}

View File

@ -0,0 +1,8 @@
/*
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
/**
* Contains the Antlr grammar for Coco.
*/
package net.sourceforge.pmd.lang.coco.ast;

Some files were not shown because too many files have changed in this diff Show More