Merge branch 'master' into clem.pmd7-public-noop-reporter
This commit is contained in:
144 files changed
+3320
-1602
No files matched your search
@@ -7107,6 +7107,15 @@
|
||||
"bug",
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "dague1",
|
||||
"name": "dague1",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/42275566?v=4",
|
||||
"profile": "https://github.com/dague1",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
||||
+1
-1
@@ -224,7 +224,7 @@ function pmd_ci_build_and_upload_doc() {
|
||||
pmd_code_createSymlink "${PMD_CI_MAVEN_PROJECT_VERSION}" "latest"
|
||||
# remove old doc and point to the new version
|
||||
pmd_code_removeDocumentation "${PMD_CI_MAVEN_PROJECT_VERSION}-SNAPSHOT"
|
||||
pmd_code_createSymlink "${PMD_CI_MAVEN_PROJECT_VERSION}" "${PMD_CI_MAVEN_PROJECT_VERSION}-SNAPSHOT"
|
||||
pmd_code_createSymlink "${PMD_CI_MAVEN_PROJECT_VERSION}" "pmd-doc-${PMD_CI_MAVEN_PROJECT_VERSION}-SNAPSHOT"
|
||||
# remove old javadoc
|
||||
pmd_code_removeJavadoc "${PMD_CI_MAVEN_PROJECT_VERSION}-SNAPSHOT"
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ function pmd_code_uploadDocumentation() {
|
||||
scp "${filename}" ${PMD_CODE_SSH_USER}@pmd-code.org:${PMD_CODE_DOCS_PATH}
|
||||
# shellcheck disable=SC2029
|
||||
ssh ${PMD_CODE_SSH_USER}@pmd-code.org "cd \"${PMD_CODE_DOCS_PATH}\" && \
|
||||
( test -h pmd-doc-${pmdVersion} && rm pmd-doc-${pmdVersion} || true ) && \
|
||||
unzip -qo \"${basefilename}\" && \
|
||||
rm \"${basefilename}\""
|
||||
pmd_ci_log_info "Docs updated: https://docs.pmd-code.org/pmd-doc-${pmdVersion}/"
|
||||
|
||||
@@ -5,11 +5,11 @@ on:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
- pmd/7.0.x
|
||||
- experimental-apex-parser
|
||||
tags:
|
||||
- '**'
|
||||
pull_request:
|
||||
merge_group:
|
||||
schedule:
|
||||
# build it monthly: At 04:00 on day-of-month 1.
|
||||
- cron: '0 4 1 * *'
|
||||
|
||||
@@ -5,7 +5,6 @@ on:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
- pmd/7.0.x
|
||||
tags:
|
||||
- '**'
|
||||
workflow_dispatch:
|
||||
|
||||
+13
-11
@@ -15,17 +15,18 @@ if [ ! -f pom.xml ] || [ ! -d ../pmd.github.io ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LAST_VERSION=
|
||||
RELEASE_VERSION=
|
||||
DEVELOPMENT_VERSION=
|
||||
CURRENT_BRANCH=
|
||||
|
||||
echo "-------------------------------------------"
|
||||
echo "Releasing PMD"
|
||||
echo "-------------------------------------------"
|
||||
|
||||
CURRENT_VERSION=$(./mvnw org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout)
|
||||
RELEASE_VERSION=${CURRENT_VERSION%-SNAPSHOT}
|
||||
# allow to override the release version, e.g. via "RELEASE_VERSION=7.0.0-rc1 ./do-release.sh"
|
||||
if [ "$RELEASE_VERSION" = "" ]; then
|
||||
CURRENT_VERSION=$(./mvnw org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout)
|
||||
RELEASE_VERSION=${CURRENT_VERSION%-SNAPSHOT}
|
||||
fi
|
||||
|
||||
MAJOR=$(echo "$RELEASE_VERSION" | cut -d . -f 1)
|
||||
MINOR=$(echo "$RELEASE_VERSION" | cut -d . -f 2)
|
||||
PATCH=$(echo "$RELEASE_VERSION" | cut -d . -f 3)
|
||||
@@ -41,15 +42,16 @@ else
|
||||
LAST_MINOR="${MINOR}"
|
||||
LAST_PATCH=$(("${PATCH}" - 1))
|
||||
fi
|
||||
LAST_VERSION="$MAJOR.$LAST_MINOR.$LAST_PATCH"
|
||||
DEVELOPMENT_VERSION="$MAJOR.$NEXT_MINOR.$NEXT_PATCH"
|
||||
DEVELOPMENT_VERSION="${DEVELOPMENT_VERSION}-SNAPSHOT"
|
||||
|
||||
# allow to override the next version, e.g. via "NEXT_VERSION=7.0.0 ./do-release.sh"
|
||||
if [ "$NEXT_VERSION" != "" ]; then
|
||||
DEVELOPMENT_VERSION="${NEXT_VERSION}-SNAPSHOT"
|
||||
# allow to override the next version, e.g. via "DEVELOPMENT_VERSION=7.0.0-SNAPSHOT ./do-release.sh"
|
||||
if [ "$DEVELOPMENT_VERSION" = "" ]; then
|
||||
DEVELOPMENT_VERSION="$MAJOR.$NEXT_MINOR.$NEXT_PATCH-SNAPSHOT"
|
||||
fi
|
||||
|
||||
# allow to override the last version, e.g. via "LAST_VERSION=6.55.0 ./do-release.sh"
|
||||
if [ "$LAST_VERSION" = "" ]; then
|
||||
LAST_VERSION="$MAJOR.$LAST_MINOR.$LAST_PATCH"
|
||||
fi
|
||||
|
||||
# http://stackoverflow.com/questions/1593051/how-to-programmatically-determine-the-current-checked-out-git-branch
|
||||
CURRENT_BRANCH=$(git symbolic-ref -q HEAD)
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ repository: pmd/pmd
|
||||
|
||||
pmd:
|
||||
version: 7.0.0-SNAPSHOT
|
||||
previous_version: 6.54.0
|
||||
previous_version: 6.55.0
|
||||
date: ??-?????-2023
|
||||
release_type: major
|
||||
|
||||
|
||||
@@ -160,24 +160,6 @@ entries:
|
||||
- title: Security
|
||||
output: web, pdf
|
||||
url: /pmd_rules_apex_security.html
|
||||
- title: null
|
||||
output: web, pdf
|
||||
subfolders:
|
||||
- title: Ecmascript Rules
|
||||
output: web, pdf
|
||||
subfolderitems:
|
||||
- title: Index
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript.html
|
||||
- title: Best Practices
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript_bestpractices.html
|
||||
- title: Code Style
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript_codestyle.html
|
||||
- title: Error Prone
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript_errorprone.html
|
||||
- title: null
|
||||
output: web, pdf
|
||||
subfolders:
|
||||
@@ -247,6 +229,24 @@ entries:
|
||||
- title: Security
|
||||
output: web, pdf
|
||||
url: /pmd_rules_jsp_security.html
|
||||
- title: null
|
||||
output: web, pdf
|
||||
subfolders:
|
||||
- title: JavaScript Rules
|
||||
output: web, pdf
|
||||
subfolderitems:
|
||||
- title: Index
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript.html
|
||||
- title: Best Practices
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript_bestpractices.html
|
||||
- title: Code Style
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript_codestyle.html
|
||||
- title: Error Prone
|
||||
output: web, pdf
|
||||
url: /pmd_rules_ecmascript_errorprone.html
|
||||
- title: null
|
||||
output: web, pdf
|
||||
subfolders:
|
||||
|
||||
@@ -153,9 +153,9 @@ See {% jdoc core::lang.ast.NodeStream %} for more details.
|
||||
#### JavaScript support
|
||||
|
||||
The JS specific parser options have been removed. The parser now always retains comments and uses version ES6.
|
||||
The language module registers only one version (as before), now correctly with version "ES6" instead of "3".
|
||||
Since there is only one version available for JavaScript there is actually no need to selected a specific version.
|
||||
The default version is always ES6.
|
||||
The language module registers a couple of different versions. The latest version, which supports ES6 and also some
|
||||
new constructs (see [Rhino](https://github.com/mozilla/rhino)]), is the default. This should be fine for most
|
||||
use cases.
|
||||
|
||||
#### New Rules
|
||||
|
||||
@@ -254,6 +254,7 @@ The following previously deprecated rules have been finally removed:
|
||||
* [#3782](https://github.com/pmd/pmd/issues/3782): \[core] Language lifecycle
|
||||
* [#3902](https://github.com/pmd/pmd/issues/3902): \[core] Violation decorators
|
||||
* [#4035](https://github.com/pmd/pmd/issues/4035): \[core] ConcurrentModificationException in DefaultRuleViolationFactory
|
||||
* [#4120](https://github.com/pmd/pmd/issues/4120): \[core] Explicitly name all language versions
|
||||
* cli
|
||||
* [#3828](https://github.com/pmd/pmd/issues/3828): \[core] Progress reporting
|
||||
* [#4079](https://github.com/pmd/pmd/issues/4079): \[cli] Split off CLI implementation into a pmd-cli submodule
|
||||
|
||||
@@ -246,6 +246,18 @@ the breaking API changes will be performed in 7.0.0.
|
||||
an API is tagged as `@Deprecated` or not in the latest minor release. During the development of 7.0.0,
|
||||
we may decide to remove some APIs that were not tagged as deprecated, though we'll try to avoid it." %}
|
||||
|
||||
#### 6.55.0
|
||||
|
||||
##### Go
|
||||
* The LanguageModule of Go, that only supports CPD execution, has been deprecated. This language
|
||||
is not fully supported by PMD, so having a language module does not make sense. The functionality of CPD is
|
||||
not affected by this change. The following class has been deprecated and will be removed with PMD 7.0.0:
|
||||
* {% jdoc go::lang.go.GoLanguageModule %}
|
||||
|
||||
##### Java
|
||||
* Support for Java 18 preview language features have been removed. The version "18-preview" is no longer available.
|
||||
* The experimental class `net.sourceforge.pmd.lang.java.ast.ASTGuardedPattern` has been removed.
|
||||
|
||||
#### 6.54.0
|
||||
|
||||
##### PMD CLI
|
||||
|
||||
@@ -15,9 +15,10 @@ Usually the latest non-preview Java Version is the default version.
|
||||
|
||||
| Java Version | Alias | Supported by PMD since |
|
||||
|--------------|-------|------------------------|
|
||||
| 20-preview | | 6.55.0 |
|
||||
| 20 (default) | | 6.55.0 |
|
||||
| 19-preview | | 6.48.0 |
|
||||
| 19 (default) | | 6.48.0 |
|
||||
| 18-preview | | 6.44.0 |
|
||||
| 19 | | 6.48.0 |
|
||||
| 18 | | 6.44.0 |
|
||||
| 17 | | 6.37.0 |
|
||||
| 16 | | 6.32.0 |
|
||||
@@ -38,10 +39,10 @@ Usually the latest non-preview Java Version is the default version.
|
||||
## Using Java preview features
|
||||
|
||||
In order to analyze a project with PMD that uses preview language features, you'll need to enable
|
||||
it via the environment variable `PMD_JAVA_OPTS` and select the new language version, e.g. `19-preview`:
|
||||
it via the environment variable `PMD_JAVA_OPTS` and select the new language version, e.g. `20-preview`:
|
||||
|
||||
export PMD_JAVA_OPTS=--enable-preview
|
||||
pmd check --use-version java-19-preview ...
|
||||
pmd check --use-version java-20-preview ...
|
||||
|
||||
Note: we only support preview language features for the latest two java versions.
|
||||
|
||||
|
||||
@@ -815,195 +815,196 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
</tr>
|
||||
<tr>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
@@ -194,6 +194,21 @@ Just set the environment variable `PMD_JAVA_OPTS` before executing PMD, e.g.
|
||||
windows="set \"PMD_JAVA_OPTS=--enable-preview\"
|
||||
pmd.bat check -d src\main\java\ -f text -R rulesets/java/quickstart.xml" %}
|
||||
|
||||
## Additional runtime classpath
|
||||
|
||||
If you develop custom rules and package them as a jar file, you need to add it to PMD's runtime classpath.
|
||||
You can either copy the jar file into the `lib/` subfolder alongside the other jar files, that are in PMD's
|
||||
standard distribution.
|
||||
|
||||
Or you can set the environment variable `CLASSPATH` before starting PMD, e.g.
|
||||
|
||||
{% include cli_example.html
|
||||
id="preview_classpath"
|
||||
linux="export CLASSPATH=custom-rule-example.jar
|
||||
pmd check -d ../../../src/main/java/ -f text -R myrule.xml"
|
||||
windows="set CLASSPATH=custom-rule-example.jar
|
||||
pmd.bat check -d ..\..\..\src\main\java\ -f text -R myrule.xml" %}
|
||||
|
||||
## Exit Status
|
||||
|
||||
Please note that if PMD detects any violations, it will exit with status 4 (since 5.3).
|
||||
@@ -224,7 +239,14 @@ non-preview version. If you want to use an older version, so that e.g. rules tha
|
||||
that are not available yet won't be executed, you need to specify a specific version via the `--use-version`
|
||||
parameter.
|
||||
|
||||
These parameters are irrelevant for languages that don't support different versions.
|
||||
The selected language version can also influence which rules are applied. Some rules might be relevant for
|
||||
just a specific version of the language. Such rules are marked with either `minimumLanguageVersion` or
|
||||
`maximumLanguageVersion` or both. Most rules apply for all language versions.
|
||||
|
||||
These parameters are most of the time irrelevant, if the rules apply for all versions.
|
||||
|
||||
The available versions depend on the language. You can get a list of the currently supported language versions
|
||||
via the CLI option `--help`.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -245,7 +267,6 @@ Example:
|
||||
* [plsql](pmd_rules_plsql.html)
|
||||
* [pom](pmd_rules_pom.html) (Maven POM)
|
||||
* [scala](pmd_rules_scala.html)
|
||||
* Supported Versions: 2.10, 2.11, 2.12, 2.13 (default)
|
||||
* [swift](pmd_rules_swift.html)
|
||||
* [vf](pmd_rules_vf.html) (Salesforce VisualForce)
|
||||
* [vm](pmd_rules_vm.html) (Apache Velocity)
|
||||
|
||||
@@ -211,48 +211,12 @@ sense with Java 1.7 and later. If your project uses Java 1.5, then you should co
|
||||
accordingly and this rule won't be executed.
|
||||
|
||||
The specific version of a language to be used is selected via the `sourceLanguage`
|
||||
nested element. Possible values are:
|
||||
nested element. Example:
|
||||
|
||||
<sourceLanguage name="apex" version="48"/>
|
||||
<sourceLanguage name="ecmascript" version="3"/>
|
||||
<sourceLanguage name="java" version="1.3"/>
|
||||
<sourceLanguage name="java" version="1.4"/>
|
||||
<sourceLanguage name="java" version="1.5"/>
|
||||
<sourceLanguage name="java" version="5"/> <!-- alias for 1.5 -->
|
||||
<sourceLanguage name="java" version="1.6"/>
|
||||
<sourceLanguage name="java" version="6"/> <!-- alias for 1.6 -->
|
||||
<sourceLanguage name="java" version="1.7"/>
|
||||
<sourceLanguage name="java" version="7"/> <!-- alias for 1.7 -->
|
||||
<sourceLanguage name="java" version="1.8"/>
|
||||
<sourceLanguage name="java" version="8"/> <!-- alias for 1.8 -->
|
||||
<sourceLanguage name="java" version="9"/>
|
||||
<sourceLanguage name="java" version="1.9"/> <!-- alias for 9 -->
|
||||
<sourceLanguage name="java" version="10"/>
|
||||
<sourceLanguage name="java" version="1.10"/> <!-- alias for 10 -->
|
||||
<sourceLanguage name="java" version="11"/>
|
||||
<sourceLanguage name="java" version="12"/>
|
||||
<sourceLanguage name="java" version="13"/>
|
||||
<sourceLanguage name="java" version="14"/>
|
||||
<sourceLanguage name="java" version="15"/>
|
||||
<sourceLanguage name="java" version="16"/>
|
||||
<sourceLanguage name="java" version="17"/>
|
||||
<sourceLanguage name="java" version="18"/>
|
||||
<sourceLanguage name="java" version="18-preview"/>
|
||||
<sourceLanguage name="java" version="19"/> <!-- this is the default -->
|
||||
<sourceLanguage name="java" version="19-preview"/>
|
||||
<sourceLanguage name="jsp" version=""/>
|
||||
<sourceLanguage name="modelica" version=""/>
|
||||
<sourceLanguage name="pom" version=""/>
|
||||
<sourceLanguage name="plsql" version=""/>
|
||||
<sourceLanguage name="scala" version="2.10"/>
|
||||
<sourceLanguage name="scala" version="2.11"/>
|
||||
<sourceLanguage name="scala" version="2.12"/>
|
||||
<sourceLanguage name="scala" version="2.13"/> <!-- this is the default -->
|
||||
<sourceLanguage name="vf" version=""/>
|
||||
<sourceLanguage name="vm" version=""/>
|
||||
<sourceLanguage name="wsdl" version=""/>
|
||||
<sourceLanguage name="xml" version=""/>
|
||||
<sourceLanguage name="xsl" version=""/>
|
||||
|
||||
The available versions depend on the language. You can get a list of the currently supported language versions
|
||||
via the CLI option `--help`.
|
||||
|
||||
### Postprocessing the report file with XSLT
|
||||
|
||||
|
||||
@@ -19,30 +19,14 @@ This is a {{ site.pmd.release_type }} release.
|
||||
|
||||
### New and noteworthy
|
||||
|
||||
#### T-SQL support
|
||||
Thanks to the contribution from [Paul Guyot](https://github.com/pguyot) PMD now has CPD support
|
||||
for T-SQL (Transact-SQL).
|
||||
|
||||
Being based on a proper Antlr grammar, CPD can:
|
||||
|
||||
* ignore comments
|
||||
* honor [comment-based suppressions](pmd_userdocs_cpd.html#suppression)
|
||||
|
||||
### Fixed Issues
|
||||
* java-errorprone
|
||||
* [#4393](https://github.com/pmd/pmd/issues/4393): \[java] MissingStaticMethodInNonInstantiatableClass false-positive for Lombok's @UtilityClass for classes with non-private fields
|
||||
* java-bestpractices
|
||||
* [#1205](https://github.com/pmd/pmd/issues/1205): \[java] Improve ConstantsInInterface message to mention alternatives
|
||||
|
||||
### API Changes
|
||||
|
||||
* The LanguageModule of Go, that only supports CPD execution, has been deprecated. This language
|
||||
is not fully supported by PMD, so having a language module does not make sense. The functionality of CPD is
|
||||
not affected by this change. The following class has been deprecated and will be removed with PMD 7.0.0:
|
||||
* {% jdoc go::lang.go.GoLanguageModule %}
|
||||
|
||||
### External Contributions
|
||||
* [#4384](https://github.com/pmd/pmd/pull/4384): \[swift] Add more swift 5.x support (#unavailable mainly) - [Richard B.](https://github.com/kenji21) (@kenji21)
|
||||
* [#4390](https://github.com/pmd/pmd/pull/4390): Add support for T-SQL using Antlr4 lexer - [Paul Guyot](https://github.com/pguyot) (@pguyot)
|
||||
* [#4392](https://github.com/pmd/pmd/pull/4392): \[java] Fix #4393 MissingStaticMethodInNonInstantiatableClass: Fix false-positive for field-only class - [Dawid Ciok](https://github.com/dawiddc) (@dawiddc)
|
||||
* [#4412](https://github.com/pmd/pmd/pull/4412): \[doc] Added new error msg to ConstantsInInterface - [David Ljunggren](https://github.com/dague1) (@dague1)
|
||||
|
||||
{% endtocmaker %}
|
||||
|
||||
@@ -5,6 +5,90 @@ permalink: pmd_release_notes_old.html
|
||||
|
||||
Previous versions of PMD can be downloaded here: https://github.com/pmd/pmd/releases
|
||||
|
||||
## 25-February-2023 - 6.55.0
|
||||
|
||||
The PMD team is pleased to announce PMD 6.55.0.
|
||||
|
||||
This is a minor release.
|
||||
|
||||
### Table Of Contents
|
||||
|
||||
* [New and noteworthy](#new-and-noteworthy)
|
||||
* [PMD 7 Development](#pmd-7-development)
|
||||
* [Java 20 Support](#java-20-support)
|
||||
* [T-SQL support](#t-sql-support)
|
||||
* [Fixed Issues](#fixed-issues)
|
||||
* [API Changes](#api-changes)
|
||||
* [Go](#go)
|
||||
* [Java](#java)
|
||||
* [External Contributions](#external-contributions)
|
||||
* [Stats](#stats)
|
||||
|
||||
### New and noteworthy
|
||||
|
||||
#### PMD 7 Development
|
||||
This release is the last planned release of PMD 6. The first version 6.0.0 was released in December 2017.
|
||||
Over the course of more than 5 years we published almost every month a new minor version of PMD 6
|
||||
with new features and improvements.
|
||||
|
||||
Already in November 2018 we started in parallel the development of the next major version 7.0.0,
|
||||
and we are now in the process of finalizing the scope of the major version. We want to release a couple of
|
||||
release candidates before publishing the final version 7.0.0.
|
||||
|
||||
We plan to release 7.0.0-rc1 soon. You can see the progress in [PMD 7 Tracking Issue #3898](https://github.com/pmd/pmd/issues/3898).
|
||||
|
||||
#### Java 20 Support
|
||||
This release of PMD brings support for Java 20. There are no new standard language features.
|
||||
|
||||
PMD supports [JEP 433: Pattern Matching for switch (Fourth Preview)](https://openjdk.org/jeps/433) and
|
||||
[JEP 432: Record Patterns (Second Preview)](https://openjdk.org/jeps/432) as preview language features.
|
||||
|
||||
In order to analyze a project with PMD that uses these language features,
|
||||
you'll need to enable it via the environment variable `PMD_JAVA_OPTS` and select the new language
|
||||
version `20-preview`:
|
||||
|
||||
export PMD_JAVA_OPTS=--enable-preview
|
||||
./run.sh pmd --use-version java-20-preview ...
|
||||
|
||||
#### T-SQL support
|
||||
Thanks to the contribution from [Paul Guyot](https://github.com/pguyot) PMD now has CPD support
|
||||
for T-SQL (Transact-SQL).
|
||||
|
||||
Being based on a proper Antlr grammar, CPD can:
|
||||
|
||||
* ignore comments
|
||||
* honor [comment-based suppressions](pmd_userdocs_cpd.html#suppression)
|
||||
|
||||
### Fixed Issues
|
||||
* core
|
||||
* [#4395](https://github.com/pmd/pmd/issues/4395): \[core] Support environment variable CLASSPATH with pmd.bat under Windows
|
||||
* java
|
||||
* [#4333](https://github.com/pmd/pmd/issues/4333): \[java] Support JDK 20
|
||||
* java-errorprone
|
||||
* [#4393](https://github.com/pmd/pmd/issues/4393): \[java] MissingStaticMethodInNonInstantiatableClass false-positive for Lombok's @UtilityClass for classes with non-private fields
|
||||
|
||||
### API Changes
|
||||
|
||||
#### Go
|
||||
* The LanguageModule of Go, that only supports CPD execution, has been deprecated. This language
|
||||
is not fully supported by PMD, so having a language module does not make sense. The functionality of CPD is
|
||||
not affected by this change. The following class has been deprecated and will be removed with PMD 7.0.0:
|
||||
* <a href="https://docs.pmd-code.org/apidocs/pmd-go/6.55.0/net/sourceforge/pmd/lang/go/GoLanguageModule.html#"><code>GoLanguageModule</code></a>
|
||||
|
||||
#### Java
|
||||
* Support for Java 18 preview language features have been removed. The version "18-preview" is no longer available.
|
||||
* The experimental class `net.sourceforge.pmd.lang.java.ast.ASTGuardedPattern` has been removed.
|
||||
|
||||
### External Contributions
|
||||
* [#4384](https://github.com/pmd/pmd/pull/4384): \[swift] Add more swift 5.x support (#unavailable mainly) - [Richard B.](https://github.com/kenji21) (@kenji21)
|
||||
* [#4390](https://github.com/pmd/pmd/pull/4390): Add support for T-SQL using Antlr4 lexer - [Paul Guyot](https://github.com/pguyot) (@pguyot)
|
||||
* [#4392](https://github.com/pmd/pmd/pull/4392): \[java] Fix #4393 MissingStaticMethodInNonInstantiatableClass: Fix false-positive for field-only class - [Dawid Ciok](https://github.com/dawiddc) (@dawiddc)
|
||||
|
||||
### Stats
|
||||
* 40 commits
|
||||
* 11 closed tickets & PRs
|
||||
* Days since last release: 28
|
||||
|
||||
## 28-January-2023 - 6.54.0
|
||||
|
||||
The PMD team is pleased to announce PMD 6.54.0.
|
||||
|
||||
@@ -6,6 +6,8 @@ package net.sourceforge.pmd.cpd;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import net.sourceforge.pmd.lang.apex.ApexLanguageModule;
|
||||
|
||||
public class ApexLanguage extends AbstractLanguage {
|
||||
|
||||
public ApexLanguage() {
|
||||
@@ -13,7 +15,7 @@ public class ApexLanguage extends AbstractLanguage {
|
||||
}
|
||||
|
||||
public ApexLanguage(Properties properties) {
|
||||
super("Apex", "apex", new ApexTokenizer(), ".cls");
|
||||
super(ApexLanguageModule.NAME, ApexLanguageModule.TERSE_NAME, new ApexTokenizer(), ApexLanguageModule.EXTENSIONS);
|
||||
setProperties(properties);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,22 +4,33 @@
|
||||
|
||||
package net.sourceforge.pmd.lang.apex;
|
||||
|
||||
import static net.sourceforge.pmd.util.CollectionUtil.listOf;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.pmd.annotation.InternalApi;
|
||||
import net.sourceforge.pmd.lang.Language;
|
||||
import net.sourceforge.pmd.lang.LanguageModuleBase;
|
||||
import net.sourceforge.pmd.lang.LanguageProcessor;
|
||||
import net.sourceforge.pmd.lang.LanguagePropertyBundle;
|
||||
import net.sourceforge.pmd.lang.LanguageRegistry;
|
||||
|
||||
import apex.jorje.services.Version;
|
||||
|
||||
public class ApexLanguageModule extends LanguageModuleBase {
|
||||
|
||||
public static final String NAME = "Apex";
|
||||
public static final String TERSE_NAME = "apex";
|
||||
|
||||
@InternalApi
|
||||
public static final List<String> EXTENSIONS = listOf("cls", "trigger");
|
||||
|
||||
public ApexLanguageModule() {
|
||||
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions("cls", "trigger")
|
||||
.addDefaultVersion(String.valueOf((int) Version.CURRENT.getExternal())));
|
||||
super(LanguageMetadata.withId(TERSE_NAME).name(NAME).extensions(EXTENSIONS)
|
||||
.addVersion("52")
|
||||
.addVersion("53")
|
||||
.addVersion("54")
|
||||
.addVersion("55")
|
||||
.addVersion("56")
|
||||
.addDefaultVersion("57"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -12,7 +12,7 @@ import net.sourceforge.pmd.AbstractLanguageVersionTest;
|
||||
class LanguageVersionTest extends AbstractLanguageVersionTest {
|
||||
|
||||
static Collection<TestDescriptor> data() {
|
||||
return Arrays.asList(new TestDescriptor(ApexLanguageModule.NAME, ApexLanguageModule.TERSE_NAME, "35",
|
||||
getLanguage("Apex").getVersion("35")));
|
||||
return Arrays.asList(new TestDescriptor(ApexLanguageModule.NAME, ApexLanguageModule.TERSE_NAME, "57",
|
||||
ApexLanguageModule.getInstance().getDefaultVersion()));
|
||||
}
|
||||
}
|
||||
@@ -13,24 +13,6 @@
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>add-javacc-generated-sources</id>
|
||||
<goals>
|
||||
<goal>add-source</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<sources>
|
||||
<source>${project.build.directory}/generated-sources/javacc</source>
|
||||
</sources>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
@@ -54,11 +36,6 @@
|
||||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.java.dev.javacc</groupId>
|
||||
<artifactId>javacc</artifactId>
|
||||
<scope>provided</scope> <!-- only needed for generating the parser via ant -->
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
|
||||
+29
-25
@@ -66,25 +66,36 @@ public abstract class AbstractAnalysisCache implements AnalysisCache {
|
||||
@Override
|
||||
public boolean isUpToDate(final TextDocument document) {
|
||||
try (TimedOperation ignored = TimeTracker.startOperation(TimedOperationCategory.ANALYSIS_CACHE, "up-to-date check")) {
|
||||
// There is a new file being analyzed, prepare entry in updated cache
|
||||
final AnalysisResult updatedResult = new AnalysisResult(document.getCheckSum(), new ArrayList<>());
|
||||
updatedResultsCache.put(document.getPathId(), updatedResult);
|
||||
|
||||
// Now check the old cache
|
||||
final AnalysisResult analysisResult = fileResultsCache.get(document.getPathId());
|
||||
final AnalysisResult cachedResult = fileResultsCache.get(document.getPathId());
|
||||
final AnalysisResult updatedResult;
|
||||
|
||||
// is this a known file? has it changed?
|
||||
final boolean result = analysisResult != null
|
||||
&& analysisResult.getFileChecksum() == updatedResult.getFileChecksum();
|
||||
final boolean upToDate = cachedResult != null
|
||||
&& cachedResult.getFileChecksum() == document.getCheckSum();
|
||||
|
||||
if (result) {
|
||||
LOG.debug("Incremental Analysis cache HIT");
|
||||
if (upToDate) {
|
||||
LOG.trace("Incremental Analysis cache HIT");
|
||||
|
||||
/*
|
||||
* Update cached violation "filename" to match the appropriate text document,
|
||||
* so we can honor relativized paths for the current run
|
||||
*/
|
||||
final String displayName = document.getDisplayName();
|
||||
cachedResult.getViolations().forEach(v -> ((CachedRuleViolation) v).setFileDisplayName(displayName));
|
||||
|
||||
// copy results over
|
||||
updatedResult = cachedResult;
|
||||
} else {
|
||||
LOG.debug("Incremental Analysis cache MISS - {}",
|
||||
analysisResult != null ? "file changed" : "no previous result found");
|
||||
LOG.trace("Incremental Analysis cache MISS - {}",
|
||||
cachedResult != null ? "file changed" : "no previous result found");
|
||||
|
||||
// New file being analyzed, create new empty entry
|
||||
updatedResult = new AnalysisResult(document.getCheckSum(), new ArrayList<>());
|
||||
}
|
||||
|
||||
return result;
|
||||
updatedResultsCache.put(document.getPathId(), updatedResult);
|
||||
|
||||
return upToDate;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,7 +130,7 @@ public abstract class AbstractAnalysisCache implements AnalysisCache {
|
||||
boolean cacheIsValid = cacheExists();
|
||||
|
||||
if (cacheIsValid && ruleSets.getChecksum() != rulesetChecksum) {
|
||||
LOG.info("Analysis cache invalidated, rulesets changed.");
|
||||
LOG.debug("Analysis cache invalidated, rulesets changed.");
|
||||
cacheIsValid = false;
|
||||
}
|
||||
|
||||
@@ -131,7 +142,7 @@ public abstract class AbstractAnalysisCache implements AnalysisCache {
|
||||
|
||||
if (cacheIsValid && currentAuxClassPathChecksum != auxClassPathChecksum) {
|
||||
// TODO some rules don't need that (in fact, some languages)
|
||||
LOG.info("Analysis cache invalidated, auxclasspath changed.");
|
||||
LOG.debug("Analysis cache invalidated, auxclasspath changed.");
|
||||
cacheIsValid = false;
|
||||
}
|
||||
} else {
|
||||
@@ -140,7 +151,7 @@ public abstract class AbstractAnalysisCache implements AnalysisCache {
|
||||
|
||||
final long currentExecutionClassPathChecksum = FINGERPRINTER.fingerprint(getClassPathEntries());
|
||||
if (cacheIsValid && currentExecutionClassPathChecksum != executionClassPathChecksum) {
|
||||
LOG.info("Analysis cache invalidated, execution classpath changed.");
|
||||
LOG.debug("Analysis cache invalidated, execution classpath changed.");
|
||||
cacheIsValid = false;
|
||||
}
|
||||
|
||||
@@ -211,19 +222,12 @@ public abstract class AbstractAnalysisCache implements AnalysisCache {
|
||||
|
||||
@Override
|
||||
public FileAnalysisListener startFileAnalysis(TextDocument file) {
|
||||
String fileName = file.getPathId();
|
||||
AnalysisResult analysisResult = updatedResultsCache.get(fileName);
|
||||
if (analysisResult == null) {
|
||||
analysisResult = new AnalysisResult(file.getCheckSum());
|
||||
}
|
||||
final AnalysisResult nonNullAnalysisResult = analysisResult;
|
||||
final String fileName = file.getPathId();
|
||||
|
||||
return new FileAnalysisListener() {
|
||||
@Override
|
||||
public void onRuleViolation(RuleViolation violation) {
|
||||
synchronized (nonNullAnalysisResult) {
|
||||
nonNullAnalysisResult.addViolation(violation);
|
||||
}
|
||||
updatedResultsCache.get(fileName).addViolation(violation);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,25 +33,31 @@ public final class CachedRuleViolation implements RuleViolation {
|
||||
private final CachedRuleMapper mapper;
|
||||
|
||||
private final String description;
|
||||
private final FileLocation location;
|
||||
private final String ruleClassName;
|
||||
private final String ruleName;
|
||||
private final String ruleTargetLanguage;
|
||||
private final Map<String, String> additionalInfo;
|
||||
|
||||
private FileLocation location;
|
||||
|
||||
private CachedRuleViolation(final CachedRuleMapper mapper, final String description,
|
||||
final String fileName, final String ruleClassName, final String ruleName,
|
||||
final String filePathId, final String ruleClassName, final String ruleName,
|
||||
final String ruleTargetLanguage, final int beginLine, final int beginColumn,
|
||||
final int endLine, final int endColumn,
|
||||
final Map<String, String> additionalInfo) {
|
||||
this.mapper = mapper;
|
||||
this.description = description;
|
||||
this.location = FileLocation.range(fileName, TextRange2d.range2d(beginLine, beginColumn, endLine, endColumn));
|
||||
this.location = FileLocation.range(filePathId, TextRange2d.range2d(beginLine, beginColumn, endLine, endColumn));
|
||||
this.ruleClassName = ruleClassName;
|
||||
this.ruleName = ruleName;
|
||||
this.ruleTargetLanguage = ruleTargetLanguage;
|
||||
this.additionalInfo = additionalInfo;
|
||||
}
|
||||
|
||||
void setFileDisplayName(String displayName) {
|
||||
this.location = FileLocation.range(displayName,
|
||||
TextRange2d.range2d(getBeginLine(), getBeginColumn(), getEndLine(), getEndColumn()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Rule getRule() {
|
||||
@@ -78,13 +84,13 @@ public final class CachedRuleViolation implements RuleViolation {
|
||||
* Helper method to load a {@link CachedRuleViolation} from an input stream.
|
||||
*
|
||||
* @param stream The stream from which to load the violation.
|
||||
* @param fileName The name of the file on which this rule was reported.
|
||||
* @param filePathId The name of the file on which this rule was reported.
|
||||
* @param mapper The mapper to be used to obtain rule instances from the active rulesets.
|
||||
* @return The loaded rule violation.
|
||||
* @throws IOException
|
||||
*/
|
||||
/* package */ static CachedRuleViolation loadFromStream(final DataInputStream stream,
|
||||
final String fileName, final CachedRuleMapper mapper) throws IOException {
|
||||
final String filePathId, final CachedRuleMapper mapper) throws IOException {
|
||||
final String description = stream.readUTF();
|
||||
final String ruleClassName = stream.readUTF();
|
||||
final String ruleName = stream.readUTF();
|
||||
@@ -94,7 +100,7 @@ public final class CachedRuleViolation implements RuleViolation {
|
||||
final int endLine = stream.readInt();
|
||||
final int endColumn = stream.readInt();
|
||||
final Map<String, String> additionalInfo = readAdditionalInfo(stream);
|
||||
return new CachedRuleViolation(mapper, description, fileName, ruleClassName, ruleName, ruleTargetLanguage,
|
||||
return new CachedRuleViolation(mapper, description, filePathId, ruleClassName, ruleName, ruleTargetLanguage,
|
||||
beginLine, beginColumn, endLine, endColumn, additionalInfo);
|
||||
}
|
||||
|
||||
@@ -129,7 +135,7 @@ public final class CachedRuleViolation implements RuleViolation {
|
||||
FileLocation location = violation.getLocation();
|
||||
stream.writeInt(location.getStartPos().getLine());
|
||||
stream.writeInt(location.getStartPos().getColumn());
|
||||
stream.writeInt(location.getEndPos().getColumn());
|
||||
stream.writeInt(location.getEndPos().getLine());
|
||||
stream.writeInt(location.getEndPos().getColumn());
|
||||
Map<String, String> additionalInfo = violation.getAdditionalInfo();
|
||||
stream.writeInt(additionalInfo.size());
|
||||
|
||||
@@ -74,21 +74,21 @@ public class FileAnalysisCache extends AbstractAnalysisCache {
|
||||
|
||||
// Cached results
|
||||
while (inputStream.available() > 0) {
|
||||
final String fileName = inputStream.readUTF();
|
||||
final String filePathId = inputStream.readUTF();
|
||||
final long checksum = inputStream.readLong();
|
||||
|
||||
final int countViolations = inputStream.readInt();
|
||||
final List<RuleViolation> violations = new ArrayList<>(countViolations);
|
||||
for (int i = 0; i < countViolations; i++) {
|
||||
violations.add(CachedRuleViolation.loadFromStream(inputStream, fileName, ruleMapper));
|
||||
violations.add(CachedRuleViolation.loadFromStream(inputStream, filePathId, ruleMapper));
|
||||
}
|
||||
|
||||
fileResultsCache.put(fileName, new AnalysisResult(checksum, violations));
|
||||
fileResultsCache.put(filePathId, new AnalysisResult(checksum, violations));
|
||||
}
|
||||
|
||||
LOG.info("Analysis cache loaded");
|
||||
LOG.debug("Analysis cache loaded from {}", cacheFile);
|
||||
} else {
|
||||
LOG.info("Analysis cache invalidated, PMD version changed.");
|
||||
LOG.debug("Analysis cache invalidated, PMD version changed.");
|
||||
}
|
||||
} catch (final EOFException e) {
|
||||
LOG.warn("Cache file {} is malformed, will not be used for current analysis", cacheFile.getPath());
|
||||
@@ -132,7 +132,7 @@ public class FileAnalysisCache extends AbstractAnalysisCache {
|
||||
for (final Map.Entry<String, AnalysisResult> resultEntry : updatedResultsCache.entrySet()) {
|
||||
final List<RuleViolation> violations = resultEntry.getValue().getViolations();
|
||||
|
||||
outputStream.writeUTF(resultEntry.getKey()); // the full filename
|
||||
outputStream.writeUTF(resultEntry.getKey()); // the path id
|
||||
outputStream.writeLong(resultEntry.getValue().getFileChecksum());
|
||||
|
||||
outputStream.writeInt(violations.size());
|
||||
@@ -141,9 +141,9 @@ public class FileAnalysisCache extends AbstractAnalysisCache {
|
||||
}
|
||||
}
|
||||
if (cacheFileShouldBeCreated) {
|
||||
LOG.info("Analysis cache created");
|
||||
LOG.debug("Analysis cache created");
|
||||
} else {
|
||||
LOG.info("Analysis cache updated");
|
||||
LOG.debug("Analysis cache updated");
|
||||
}
|
||||
} catch (final IOException e) {
|
||||
LOG.error("Could not persist analysis cache to file: {}", e.getMessage());
|
||||
|
||||
@@ -11,6 +11,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import net.sourceforge.pmd.internal.util.PredicateUtil;
|
||||
|
||||
@@ -22,11 +23,23 @@ public abstract class AbstractLanguage implements Language {
|
||||
private final List<String> extensions;
|
||||
|
||||
public AbstractLanguage(String name, String terseName, Tokenizer tokenizer, String... extensions) {
|
||||
this(name, terseName, tokenizer, Arrays.asList(extensions));
|
||||
}
|
||||
|
||||
protected AbstractLanguage(String name, String terseName, Tokenizer tokenizer, List<String> extensions) {
|
||||
this.name = name;
|
||||
this.terseName = terseName;
|
||||
this.tokenizer = tokenizer;
|
||||
this.fileFilter = PredicateUtil.toNormalizedFileFilter(PredicateUtil.getFileExtensionFilter(extensions).or(it -> Files.isDirectory(Paths.get(it))));
|
||||
this.extensions = Arrays.asList(extensions);
|
||||
List<String> extensionsWithDot = extensions.stream().map(e -> {
|
||||
if (e.length() > 0 && e.charAt(0) != '.') {
|
||||
return "." + e;
|
||||
}
|
||||
return e;
|
||||
}).collect(Collectors.toList());
|
||||
this.fileFilter = PredicateUtil.toNormalizedFileFilter(
|
||||
PredicateUtil.getFileExtensionFilter(extensionsWithDot.toArray(new String[0]))
|
||||
.or(it -> Files.isDirectory(Paths.get(it))));
|
||||
this.extensions = extensionsWithDot;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,6 +8,7 @@ import static net.sourceforge.pmd.util.CollectionUtil.setOf;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@@ -21,7 +22,6 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
import net.sourceforge.pmd.lang.LanguageModuleBase.LanguageMetadata.LangVersionMetadata;
|
||||
import net.sourceforge.pmd.util.AssertionUtil;
|
||||
import net.sourceforge.pmd.util.StringUtil;
|
||||
|
||||
@@ -44,7 +44,7 @@ public abstract class LanguageModuleBase implements Language {
|
||||
* Construct a module instance using the given metadata. The metadata must
|
||||
* be properly constructed.
|
||||
*
|
||||
* @throws IllegalStateException If the metadata is invalid (eg missing extensions or name)
|
||||
* @throws IllegalStateException If the metadata is invalid (eg missing extensions or name or no versions)
|
||||
*/
|
||||
protected LanguageModuleBase(LanguageMetadata metadata) {
|
||||
this.meta = metadata;
|
||||
@@ -55,10 +55,7 @@ public abstract class LanguageModuleBase implements Language {
|
||||
LanguageVersion defaultVersion = null;
|
||||
|
||||
if (metadata.versionMetadata.isEmpty()) {
|
||||
// Many languages have just one version, which is implicitly
|
||||
// created here.
|
||||
// TODO #4120 remove this branch, before 7.0.0
|
||||
metadata.versionMetadata.add(new LangVersionMetadata("", Collections.emptyList(), true));
|
||||
throw new IllegalStateException("No versions for '" + getId() + "'");
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
@@ -269,7 +266,7 @@ public abstract class LanguageModuleBase implements Language {
|
||||
|
||||
/**
|
||||
* Record the {@linkplain Language#getExtensions() extensions}
|
||||
* assigned to the language. Parameters should not start with a period
|
||||
* assigned to the language. Extensions should not start with a period
|
||||
* {@code .}.
|
||||
*
|
||||
* @param e1 First extensions
|
||||
@@ -283,6 +280,25 @@ public abstract class LanguageModuleBase implements Language {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Record the {@linkplain Language#getExtensions() extensions}
|
||||
* assigned to the language. Extensions should not start with a period
|
||||
* {@code .}. At least one extension must be provided.
|
||||
*
|
||||
* @param extensions the extensions
|
||||
*
|
||||
* @throws NullPointerException If any extension is null
|
||||
* @throws IllegalArgumentException If no extensions are provided
|
||||
*/
|
||||
public LanguageMetadata extensions(Collection<String> extensions) {
|
||||
this.extensions = new ArrayList<>(new HashSet<>(extensions));
|
||||
AssertionUtil.requireContainsNoNullValue("extensions", this.extensions);
|
||||
if (this.extensions.isEmpty()) {
|
||||
throw new IllegalArgumentException("At least one extension is required.");
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new version by its name.
|
||||
*
|
||||
@@ -290,7 +306,7 @@ public abstract class LanguageModuleBase implements Language {
|
||||
* @param aliases Additional names that are mapped to this version. Must contain no spaces.
|
||||
*
|
||||
* @throws NullPointerException If any parameter is null
|
||||
* @throws IllegalArgumentException If the name or aliases contain spaces
|
||||
* @throws IllegalArgumentException If the name or aliases are empty or contain spaces
|
||||
*/
|
||||
|
||||
public LanguageMetadata addVersion(String name, String... aliases) {
|
||||
@@ -305,7 +321,7 @@ public abstract class LanguageModuleBase implements Language {
|
||||
* @param aliases Additional names that are mapped to this version. Must contain no spaces.
|
||||
*
|
||||
* @throws NullPointerException If any parameter is null
|
||||
* @throws IllegalArgumentException If the name or aliases contain spaces
|
||||
* @throws IllegalArgumentException If the name or aliases are empty or contain spaces
|
||||
*/
|
||||
public LanguageMetadata addDefaultVersion(String name, String... aliases) {
|
||||
versionMetadata.add(new LangVersionMetadata(name, Arrays.asList(aliases), true));
|
||||
@@ -351,7 +367,7 @@ public abstract class LanguageModuleBase implements Language {
|
||||
}
|
||||
|
||||
private static void checkVersionName(String name) {
|
||||
if (SPACE_PAT.matcher(name).find()) { // TODO #4120 also check that the name is non-empty
|
||||
if (StringUtils.isBlank(name) || SPACE_PAT.matcher(name).find()) {
|
||||
throw new IllegalArgumentException("Invalid version name: " + StringUtil.inSingleQuotes(name));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,9 @@ public final class PlainTextLanguage extends SimpleLanguageModuleBase {
|
||||
static final String TERSE_NAME = "text";
|
||||
|
||||
private PlainTextLanguage() {
|
||||
super(LanguageMetadata.withId(TERSE_NAME).name("Plain text").extensions("plain-text-file-goo-extension"),
|
||||
super(LanguageMetadata.withId(TERSE_NAME).name("Plain text")
|
||||
.extensions("plain-text-file-goo-extension")
|
||||
.addDefaultVersion("default"),
|
||||
new TextLvh());
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,8 @@ class NioTextFile extends BaseCloseable implements TextFile {
|
||||
this.charset = charset;
|
||||
this.languageVersion = languageVersion;
|
||||
// using the URI here, that handles files inside zip archives automatically (schema "jar:file:...!/path/inside/zip")
|
||||
this.pathId = path.toUri().toString();
|
||||
// normalization ensures cannonical paths
|
||||
this.pathId = path.normalize().toUri().toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,6 +19,7 @@ import net.sourceforge.pmd.benchmark.TimeTracker;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperation;
|
||||
import net.sourceforge.pmd.benchmark.TimedOperationCategory;
|
||||
import net.sourceforge.pmd.internal.SystemProps;
|
||||
import net.sourceforge.pmd.lang.LanguageVersion;
|
||||
import net.sourceforge.pmd.lang.ast.Node;
|
||||
import net.sourceforge.pmd.lang.ast.RootNode;
|
||||
import net.sourceforge.pmd.reporting.FileAnalysisListener;
|
||||
@@ -37,6 +38,7 @@ public class RuleApplicator {
|
||||
// to eg type resolution.
|
||||
|
||||
private final TreeIndex idx;
|
||||
private LanguageVersion currentLangVer;
|
||||
|
||||
public RuleApplicator(TreeIndex index) {
|
||||
this.idx = index;
|
||||
@@ -46,6 +48,7 @@ public class RuleApplicator {
|
||||
public void index(RootNode root) {
|
||||
idx.reset();
|
||||
indexTree(root, idx);
|
||||
currentLangVer = root.getLanguageVersion();
|
||||
}
|
||||
|
||||
public void apply(Collection<? extends Rule> rules, FileAnalysisListener listener) {
|
||||
@@ -54,6 +57,10 @@ public class RuleApplicator {
|
||||
|
||||
private void applyOnIndex(TreeIndex idx, Collection<? extends Rule> rules, FileAnalysisListener listener) {
|
||||
for (Rule rule : rules) {
|
||||
if (!RuleSet.applies(rule, currentLangVer)) {
|
||||
continue; // No point in even trying to apply the rule
|
||||
}
|
||||
|
||||
RuleContext ctx = RuleContext.create(listener, rule);
|
||||
rule.start(ctx);
|
||||
try (TimedOperation rcto = TimeTracker.startOperation(TimedOperationCategory.RULE, rule.getName())) {
|
||||
@@ -62,9 +69,6 @@ public class RuleApplicator {
|
||||
Iterator<? extends Node> targets = rule.getTargetSelector().getVisitedNodes(idx);
|
||||
while (targets.hasNext()) {
|
||||
Node node = targets.next();
|
||||
if (!RuleSet.applies(rule, node.getTextDocument().getLanguageVersion())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
nodeCounter++;
|
||||
|
||||
+57
-2
@@ -10,6 +10,7 @@ import java.util.Collections;
|
||||
import net.sf.saxon.expr.AxisExpression;
|
||||
import net.sf.saxon.expr.Expression;
|
||||
import net.sf.saxon.expr.FilterExpression;
|
||||
import net.sf.saxon.expr.LetExpression;
|
||||
import net.sf.saxon.expr.RootExpression;
|
||||
import net.sf.saxon.expr.SlashExpression;
|
||||
import net.sf.saxon.om.AxisInfo;
|
||||
@@ -93,15 +94,69 @@ final class SaxonExprTransformations {
|
||||
* Splits a venn expression with the union operator into single expressions.
|
||||
*
|
||||
* <p>E.g. "//A | //B | //C" will result in 3 expressions "//A", "//B", and "//C".
|
||||
*
|
||||
* This split will skip into any top-level lets. So, for "let $a := e1 in (e2 | e3)"
|
||||
* this will return the subexpression e2 and e3. To ensure the splits are actually equivalent
|
||||
* you will have to call {@link #copyTopLevelLets(Expression, Expression)} on each subexpression
|
||||
* to turn them back into "let $a := e1 in e2" and "let $a := e1 in e3" respectively.
|
||||
*/
|
||||
static Iterable<Expression> splitUnions(Expression expr) {
|
||||
SplitUnions unions = new SplitUnions();
|
||||
unions.visit(expr);
|
||||
if (unions.getExpressions().isEmpty()) {
|
||||
return Collections.singletonList(expr);
|
||||
} else {
|
||||
return unions.getExpressions();
|
||||
}
|
||||
return unions.getExpressions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a given subexpression in all top-level lets from the original.
|
||||
* If the subexpression matches the original, then nothing is done.
|
||||
*
|
||||
* @param subexpr The subexpression that has been manipulated.
|
||||
* @param original The original expression from which it was obtained by calling {@link #splitUnions(Expression)}.
|
||||
* @return The subexpression, wrapped in a copy of all top-level let expression from the original.
|
||||
*/
|
||||
static Expression copyTopLevelLets(Expression subexpr, Expression original) {
|
||||
if (!(original instanceof LetExpression)) {
|
||||
return subexpr;
|
||||
}
|
||||
|
||||
// Does it need them? Or is it already the same variable under the same assignment?
|
||||
if (subexpr instanceof LetExpression) {
|
||||
final LetExpression letSubexpr = (LetExpression) subexpr;
|
||||
final LetExpression letOriginal = (LetExpression) original;
|
||||
if (letOriginal.getVariableQName().equals(letSubexpr.getVariableQName())
|
||||
&& letSubexpr.getSequence().toString().equals(letOriginal.getSequence().toString())) {
|
||||
return subexpr;
|
||||
}
|
||||
}
|
||||
|
||||
final SaxonExprVisitor topLevelLetCopier = new SaxonExprVisitor() {
|
||||
|
||||
@Override
|
||||
public Expression visit(LetExpression e) {
|
||||
// keep copying
|
||||
if (e.getAction() instanceof LetExpression) {
|
||||
return super.visit(e);
|
||||
}
|
||||
|
||||
// Manually craft the inner-most LetExpression
|
||||
Expression sequence = visit(e.getSequence());
|
||||
LetExpression result = new LetExpression();
|
||||
result.setAction(subexpr);
|
||||
result.setSequence(sequence);
|
||||
result.setVariableQName(e.getVariableQName());
|
||||
result.setRequiredType(e.getRequiredType());
|
||||
result.setSlotNumber(e.getLocalSlotNumber());
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
if (original instanceof LetExpression) {
|
||||
return topLevelLetCopier.visit(original);
|
||||
}
|
||||
|
||||
return subexpr;
|
||||
}
|
||||
}
|
||||
+1
@@ -226,6 +226,7 @@ public class SaxonXPathRuleQuery {
|
||||
Expression modified = subexpression;
|
||||
modified = SaxonExprTransformations.hoistFilters(modified);
|
||||
modified = SaxonExprTransformations.reduceRoot(modified);
|
||||
modified = SaxonExprTransformations.copyTopLevelLets(modified, expr);
|
||||
RuleChainAnalyzer rca = new RuleChainAnalyzer(xpathEvaluator.getConfiguration());
|
||||
final Expression finalExpr = rca.visit(modified); // final because of lambda
|
||||
|
||||
|
||||
Loaded 30 of 144 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user