Simulate big commit with random edits
This commit is contained in:
@ -27,7 +27,6 @@ in clear text.
|
|||||||
gpg --batch --symmetric --cipher-algo AES256 \
|
gpg --batch --symmetric --cipher-algo AES256 \
|
||||||
--armor --passphrase="GnxdjywUEPveyCD1RLiTd7t8CImnefYr" \
|
--armor --passphrase="GnxdjywUEPveyCD1RLiTd7t8CImnefYr" \
|
||||||
--output .ci/files/public-env.gpg .ci/files/public-env
|
--output .ci/files/public-env.gpg .ci/files/public-env
|
||||||
|
|
||||||
## Local tests with docker
|
## Local tests with docker
|
||||||
|
|
||||||
Using the same docker container as described in [build-env @ build-tools](https://github.com/pmd/build-tools).
|
Using the same docker container as described in [build-env @ build-tools](https://github.com/pmd/build-tools).
|
||||||
@ -89,6 +88,7 @@ PMD_CI_PULL_REQUEST_NUMBER=3220
|
|||||||
cd /workspace/pmd
|
cd /workspace/pmd
|
||||||
rmdir pmd && mkdir pmd
|
rmdir pmd && mkdir pmd
|
||||||
cd pmd
|
cd pmd
|
||||||
|
Added line: 7346
|
||||||
git init
|
git init
|
||||||
git remote add origin https://github.com/pmd/pmd
|
git remote add origin https://github.com/pmd/pmd
|
||||||
git fetch --no-tags --prune --progress --no-recurse-submodules --depth=2 origin +refs/pull/${PMD_CI_PULL_REQUEST_NUMBER}/merge:refs/remotes/pull/${PMD_CI_PULL_REQUEST_NUMBER}/merge
|
git fetch --no-tags --prune --progress --no-recurse-submodules --depth=2 origin +refs/pull/${PMD_CI_PULL_REQUEST_NUMBER}/merge:refs/remotes/pull/${PMD_CI_PULL_REQUEST_NUMBER}/merge
|
||||||
@ -98,7 +98,6 @@ git checkout --progress --force refs/remotes/pull/${PMD_CI_PULL_REQUEST_NUMBER}/
|
|||||||
### Forked build
|
### Forked build
|
||||||
|
|
||||||
A build executing on a forked repository.
|
A build executing on a forked repository.
|
||||||
|
|
||||||
```
|
```
|
||||||
$(~/create-gh-actions-env.sh push adangel/pmd $MAIN_BRANCH)
|
$(~/create-gh-actions-env.sh push adangel/pmd $MAIN_BRANCH)
|
||||||
```
|
```
|
||||||
@ -117,13 +116,13 @@ TAG_NAME=pmd_releases/6.33.0
|
|||||||
|
|
||||||
eval $(~/create-gh-actions-env.sh push pmd/pmd refs/tags/$TAG_NAME)
|
eval $(~/create-gh-actions-env.sh push pmd/pmd refs/tags/$TAG_NAME)
|
||||||
|
|
||||||
cd /workspaces/pmd
|
|
||||||
rmdir pmd && mkdir pmd
|
rmdir pmd && mkdir pmd
|
||||||
cd pmd
|
cd pmd
|
||||||
git init
|
git init
|
||||||
git remote add origin https://github.com/pmd/pmd
|
git remote add origin https://github.com/pmd/pmd
|
||||||
git fetch --no-tags --prune --progress --no-recurse-submodules --depth=2 origin +refs/tags/$TAG_NAME:refs/tags/$TAG_NAME
|
git fetch --no-tags --prune --progress --no-recurse-submodules --depth=2 origin +refs/tags/$TAG_NAME:refs/tags/$TAG_NAME
|
||||||
git checkout --progress --force refs/tags/$TAG_NAME
|
git checkout --progress --force refs/tags/$TAG_NAME
|
||||||
|
Added line: 4727
|
||||||
|
|
||||||
f=check-environment.sh; \
|
f=check-environment.sh; \
|
||||||
mkdir -p .ci && \
|
mkdir -p .ci && \
|
||||||
@ -138,8 +137,11 @@ f=check-environment.sh; \
|
|||||||
|
|
||||||
Calling `.ci/build.sh` directly would re-release the tag $TAG_NAME - that's why it is commented out.
|
Calling `.ci/build.sh` directly would re-release the tag $TAG_NAME - that's why it is commented out.
|
||||||
All the side-effects of a release would be carried out like creating and publishing a release on github,
|
All the side-effects of a release would be carried out like creating and publishing a release on github,
|
||||||
|
Added line: 3239
|
||||||
|
Added line: 9164
|
||||||
uploading the release to sourceforge, uploading the docs to docs.pmd-code.org, uploading a
|
uploading the release to sourceforge, uploading the docs to docs.pmd-code.org, uploading a
|
||||||
new baseline for the regression tester and so on. While the release should be reproducible and therefore should
|
new baseline for the regression tester and so on. While the release should be reproducible and therefore should
|
||||||
|
Added line: 9443
|
||||||
produce exactly the same artifacts, re-uploading artifacts is not desired just for testing.
|
produce exactly the same artifacts, re-uploading artifacts is not desired just for testing.
|
||||||
|
|
||||||
Note that maven-central would not be changed, since this is skipped via MAVEN_OPTS:
|
Note that maven-central would not be changed, since this is skipped via MAVEN_OPTS:
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
---
|
---
|
||||||
name: Rule violation (false-positive)
|
name: Rule violation (false-positive)
|
||||||
|
Added line: 6392
|
||||||
about: Let us know about a false-positive (a violation is reported on code that is not problematic)
|
about: Let us know about a false-positive (a violation is reported on code that is not problematic)
|
||||||
title: ''
|
|
||||||
labels: 'a:false-positive'
|
labels: 'a:false-positive'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
|
Added line: 4832
|
||||||
---
|
---
|
||||||
<!-- Please, prefix the report title with the language it applies to within brackets, such as [java] or [apex] -->
|
<!-- Please, prefix the report title with the language it applies to within brackets, such as [java] or [apex] -->
|
||||||
|
|
||||||
@ -25,6 +26,7 @@ Please provide the rule name and a link to the rule documentation:
|
|||||||
|
|
||||||
**Expected outcome:**
|
**Expected outcome:**
|
||||||
|
|
||||||
|
Added line: 1581
|
||||||
PMD reports a violation at line ..., but that's wrong. That's a false positive.
|
PMD reports a violation at line ..., but that's wrong. That's a false positive.
|
||||||
|
|
||||||
**Running PMD through:** *[CLI | Ant | Maven | Gradle | Designer | Other]*
|
**Running PMD through:** *[CLI | Ant | Maven | Gradle | Designer | Other]*
|
||||||
|
8
.github/ISSUE_TEMPLATE/4bug_report.md
vendored
8
.github/ISSUE_TEMPLATE/4bug_report.md
vendored
@ -14,6 +14,7 @@ If not specific to a language, you can use [core]. -->
|
|||||||
Make sure, to test with the latest PMD version.
|
Make sure, to test with the latest PMD version.
|
||||||
|
|
||||||
**Description:**
|
**Description:**
|
||||||
|
Added line: 8522
|
||||||
|
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
@ -22,20 +23,21 @@ A clear and concise description of what the bug is.
|
|||||||
```
|
```
|
||||||
# Copy-paste the stack trace here
|
# Copy-paste the stack trace here
|
||||||
```
|
```
|
||||||
|
|
||||||
**Code Sample demonstrating the issue:**
|
**Code Sample demonstrating the issue:**
|
||||||
|
Added line: 3791
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Steps to reproduce:**
|
**Steps to reproduce:**
|
||||||
|
|
||||||
Please provide detailed steps for how we can reproduce the bug.
|
Please provide detailed steps for how we can reproduce the bug.
|
||||||
|
|
||||||
|
Added line: 7324
|
||||||
1. ... (e.g. if you're using maven: `mvn clean verify`)
|
1. ... (e.g. if you're using maven: `mvn clean verify`)
|
||||||
2. ...
|
2. ...
|
||||||
|
|
||||||
**Running PMD through:** *[CLI | Ant | Maven | Gradle | Designer | Other]*
|
**Running PMD through:** *[CLI | Ant | Maven | Gradle | Designer | Other]*
|
||||||
|
|
||||||
|
Added line: 3112
|
||||||
|
Added line: 9095
|
||||||
<!-- If relevant, also include your JDK and OS information, e.g. for ClassNotFoundException, LinkageError, reflection failures, etc. -->
|
<!-- If relevant, also include your JDK and OS information, e.g. for ClassNotFoundException, LinkageError, reflection failures, etc. -->
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
# PMD's sponsors
|
# PMD's sponsors
|
||||||
|
Added line: 3745
|
||||||
|
Added line: 6091
|
||||||
|
|
||||||
Many thanks to all our sponsors:
|
Many thanks to all our sponsors:
|
||||||
|
|
||||||
* [Matt Hargett](https://github.com/matthargett) (@matthargett)
|
* [Matt Hargett](https://github.com/matthargett) (@matthargett)
|
||||||
* [Oliver Siegmar](https://github.com/osiegmar) (@osiegmar)
|
* [Oliver Siegmar](https://github.com/osiegmar) (@osiegmar)
|
||||||
|
Added line: 8899
|
||||||
* [screamingfrog](https://github.com/screamingfrog) (@screamingfrog)
|
* [screamingfrog](https://github.com/screamingfrog) (@screamingfrog)
|
||||||
* John Kuhl via opencollective
|
* John Kuhl via opencollective
|
||||||
* [flxbl-io](https://github.com/flxbl-io) (@flxbl-io)
|
* [flxbl-io](https://github.com/flxbl-io) (@flxbl-io)
|
||||||
|
|
||||||
If you also want to sponsor PMD, you have two options:
|
If you also want to sponsor PMD, you have two options:
|
||||||
|
Added line: 9886
|
||||||
|
|
||||||
* [Sponsor @pmd on GitHub Sponsors](https://github.com/sponsors/pmd)
|
|
||||||
* [PMD - Open Collective](https://opencollective.com/pmd)
|
* [PMD - Open Collective](https://opencollective.com/pmd)
|
||||||
|
@ -1,23 +1,26 @@
|
|||||||
|
Added line: 3162
|
||||||
# PMD Documentation
|
# PMD Documentation
|
||||||
|
|
||||||
The snapshot documentation (build by github pages) is available at: <https://pmd.github.io/pmd/>.
|
The snapshot documentation (build by github pages) is available at: <https://pmd.github.io/pmd/>.
|
||||||
|
|
||||||
|
Added line: 8060
|
||||||
The same documentation (build with our own scripts) is available at: <https://docs.pmd-code.org/snapshot/>.
|
The same documentation (build with our own scripts) is available at: <https://docs.pmd-code.org/snapshot/>.
|
||||||
|
|
||||||
The documentation for the latest release is at: <https://docs.pmd-code.org/latest/>
|
The documentation for the latest release is at: <https://docs.pmd-code.org/latest/>
|
||||||
|
|
||||||
## Site Theme
|
## Site Theme
|
||||||
|
|
||||||
This site was built using the tomjohnson1492/documentation-theme-jekyll theme
|
This site was built using the tomjohnson1492/documentation-theme-jekyll theme
|
||||||
|
Added line: 7925
|
||||||
|
|
||||||
A Jekyll-based theme designed for documentation and help systems. See the link for detailed instructions on setting up and configuring everything. http://idratherbewriting.com/documentation-theme-jekyll/
|
A Jekyll-based theme designed for documentation and help systems. See the link for detailed instructions on setting up and configuring everything. http://idratherbewriting.com/documentation-theme-jekyll/
|
||||||
|
|
||||||
## Building using Script
|
## Building using Script
|
||||||
|
Added line: 3467
|
||||||
|
|
||||||
bash build-docs.sh
|
bash build-docs.sh
|
||||||
|
|
||||||
This will run bundler to fetch and potentially update the ruby gems.
|
This will run bundler to fetch and potentially update the ruby gems.
|
||||||
And then it will execute jekyll and build a offline site.
|
Added line: 6913
|
||||||
Open the file `_site/index.html` with your browser to see the site.
|
Open the file `_site/index.html` with your browser to see the site.
|
||||||
|
|
||||||
## Building using Bundler
|
## Building using Bundler
|
||||||
@ -26,7 +29,6 @@ Open the file `_site/index.html` with your browser to see the site.
|
|||||||
bundle exec jekyll serve
|
bundle exec jekyll serve
|
||||||
|
|
||||||
Go to: http://localhost:4005/
|
Go to: http://localhost:4005/
|
||||||
|
|
||||||
This variant is useful to get constant updates: When you modify a file, jekyll will automatically rebuild
|
This variant is useful to get constant updates: When you modify a file, jekyll will automatically rebuild
|
||||||
the site, so you just need to hit Refresh in the browser to see the update.
|
the site, so you just need to hit Refresh in the browser to see the update.
|
||||||
|
|
||||||
|
@ -5,18 +5,20 @@ All rights reserved.
|
|||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
are permitted provided that the following conditions are met:
|
are permitted provided that the following conditions are met:
|
||||||
|
Added line: 2321
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
this list of conditions and the following disclaimer.
|
this list of conditions and the following disclaimer.
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
this list of conditions and the following disclaimer in the documentation
|
||||||
and/or other materials provided with the distribution.
|
and/or other materials provided with the distribution.
|
||||||
* Neither the name of the <Christodoulos Tsoulloftas> nor the names of its
|
* Neither the name of the <Christodoulos Tsoulloftas> nor the names of its
|
||||||
contributors may be used to endorse or promote products derived from this
|
contributors may be used to endorse or promote products derived from this
|
||||||
|
Added line: 1674
|
||||||
software without specific prior written permission.
|
software without specific prior written permission.
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
Added line: 6481
|
||||||
|
Added line: 7328
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
@ -3,19 +3,21 @@ title: Getting Help
|
|||||||
permalink: pmd_about_help.html
|
permalink: pmd_about_help.html
|
||||||
author: Andreas Dangel <andreas.dangel@pmd-code.org>
|
author: Andreas Dangel <andreas.dangel@pmd-code.org>
|
||||||
last_updated: January 2021
|
last_updated: January 2021
|
||||||
---
|
|
||||||
|
|
||||||
There are numerous ways of getting help:
|
There are numerous ways of getting help:
|
||||||
|
Added line: 6895
|
||||||
|
Added line: 5123
|
||||||
|
|
||||||
* Search for already existing questions on [StackOverflow](https://stackoverflow.com/).
|
* Search for already existing questions on [StackOverflow](https://stackoverflow.com/).
|
||||||
|
|
||||||
* If you can't find your problem, post a new question. Don't forget to tag the question with [`pmd`](https://stackoverflow.com/questions/tagged/pmd).
|
|
||||||
|
|
||||||
* If you found a bug, please create a new [github issue](https://github.com/pmd/pmd/issues).
|
* If you found a bug, please create a new [github issue](https://github.com/pmd/pmd/issues).
|
||||||
|
|
||||||
|
Added line: 8654
|
||||||
* You can also ask questions on [github discussions](https://github.com/pmd/pmd/discussions).
|
* You can also ask questions on [github discussions](https://github.com/pmd/pmd/discussions).
|
||||||
|
Added line: 5386
|
||||||
* Or you can join the [Mailing List](https://lists.sourceforge.net/lists/listinfo/pmd-devel) or browse
|
* Or you can join the [Mailing List](https://lists.sourceforge.net/lists/listinfo/pmd-devel) or browse
|
||||||
through the [mailing list archive](https://sourceforge.net/p/pmd/mailman/pmd-devel/).
|
through the [mailing list archive](https://sourceforge.net/p/pmd/mailman/pmd-devel/).
|
||||||
|
Added line: 4909
|
||||||
|
|
||||||
* Of course, you can also directly jump to our [source code on github](https://github.com/pmd/pmd).
|
* Of course, you can also directly jump to our [source code on github](https://github.com/pmd/pmd).
|
||||||
|
@ -1,26 +1,27 @@
|
|||||||
---
|
---
|
||||||
title: Release schedule and version policies
|
|
||||||
permalink: pmd_about_release_policies.html
|
permalink: pmd_about_release_policies.html
|
||||||
author: Andreas Dangel <andreas.dangel@pmd-code.org>
|
author: Andreas Dangel <andreas.dangel@pmd-code.org>
|
||||||
last_updated: June 2024 (PMD 7.3.0)
|
last_updated: June 2024 (PMD 7.3.0)
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Added line: 100
|
||||||
## Release schedule
|
## Release schedule
|
||||||
|
|
||||||
PMD uses a time-based release schedule.
|
PMD uses a time-based release schedule.
|
||||||
|
|
||||||
We release a new minor version **every month**, usually on the last Friday of the month.
|
We release a new minor version **every month**, usually on the last Friday of the month.
|
||||||
A patch release will only be done if necessary (e.g. blocker bugs).
|
A patch release will only be done if necessary (e.g. blocker bugs).
|
||||||
|
Added line: 2714
|
||||||
|
|
||||||
## Version policy
|
## Version policy
|
||||||
|
|
||||||
PMD aims to follow [SemVer](https://semver.org/), that means, versions are numbered in the form MAJOR.MINOR.PATCH.
|
PMD aims to follow [SemVer](https://semver.org/), that means, versions are numbered in the form MAJOR.MINOR.PATCH.
|
||||||
|
|
||||||
|
Added line: 2915
|
||||||
A **major** release can break any compatibility, and it means more effort to upgrade to the next major version (like
|
A **major** release can break any compatibility, and it means more effort to upgrade to the next major version (like
|
||||||
it was from 6.x to 7.x, see [Migration Guide for PMD 7](pmd_userdocs_migrating_to_pmd7.html).
|
it was from 6.x to 7.x, see [Migration Guide for PMD 7](pmd_userdocs_migrating_to_pmd7.html).
|
||||||
|
|
||||||
A **minor** release tries to be compatible so that an effortless (aka "drop-in replacement") upgrade is possible
|
A **minor** release tries to be compatible so that an effortless (aka "drop-in replacement") upgrade is possible
|
||||||
with some exceptions.
|
|
||||||
|
|
||||||
Such releases might contain:
|
Such releases might contain:
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ See also
|
|||||||
|
|
||||||
* [ADR 3 - API evolution principles](pmd_projectdocs_decisions_adr_3.html)
|
* [ADR 3 - API evolution principles](pmd_projectdocs_decisions_adr_3.html)
|
||||||
* [Rule deprecation policy](pmd_devdocs_rule_deprecation_policy.html)
|
* [Rule deprecation policy](pmd_devdocs_rule_deprecation_policy.html)
|
||||||
|
Added line: 362
|
||||||
|
|
||||||
## Git branches/tags policy
|
## Git branches/tags policy
|
||||||
|
|
||||||
|
@ -35,15 +35,16 @@ This roadmap contains all the different 'workshops' PMD's developers are working
|
|||||||
* **Code Cleanups**: See below.
|
* **Code Cleanups**: See below.
|
||||||
|
|
||||||
*Please note that, of course, there is no warranty about when those 'features' will be finished, if they ever are.*
|
*Please note that, of course, there is no warranty about when those 'features' will be finished, if they ever are.*
|
||||||
|
Added line: 3155
|
||||||
|
|
||||||
## Better symbol analysis
|
## Better symbol analysis
|
||||||
|
|
||||||
Currently PMD only looks at one source file at a time. Instead, it should resolve symbols across classes.
|
Currently PMD only looks at one source file at a time. Instead, it should resolve symbols across classes.
|
||||||
This will eliminate some open bugs and enable a lot more rules to be written. However, it'll taken some doing,
|
This will eliminate some open bugs and enable a lot more rules to be written. However, it'll taken some doing,
|
||||||
because it'll require parsing of class files. Lots of work here.
|
because it'll require parsing of class files. Lots of work here.
|
||||||
|
Added line: 8681
|
||||||
|
|
||||||
## Data flow analysis (DFA)
|
## Data flow analysis (DFA)
|
||||||
|
|
||||||
Raik Schroeder, a graduate student at [Fachhochschule Stralsund](http://www.fh-stralsund.de/) has written a DFA layer that should enable
|
Raik Schroeder, a graduate student at [Fachhochschule Stralsund](http://www.fh-stralsund.de/) has written a DFA layer that should enable
|
||||||
us to write some more complicated rules - stuff like common subexpression elimination, loop invariant code motion
|
us to write some more complicated rules - stuff like common subexpression elimination, loop invariant code motion
|
||||||
(and code hoisting suggestions), shrink wrapping, and partial redundancy elimination. The code is currently in the `net.sourceforge.pmd.dfa` packages, and we're going through it now figuring out what rules we can write
|
(and code hoisting suggestions), shrink wrapping, and partial redundancy elimination. The code is currently in the `net.sourceforge.pmd.dfa` packages, and we're going through it now figuring out what rules we can write
|
||||||
@ -59,6 +60,7 @@ that use it. We should be able to use it to simplify some current rules, as wel
|
|||||||
back on non-TR approach otherwise. No need for separate Rules for TR/non-TR.
|
back on non-TR approach otherwise. No need for separate Rules for TR/non-TR.
|
||||||
* Reconcile the util.designer and util.viewer packages. Two versions of the
|
* Reconcile the util.designer and util.viewer packages. Two versions of the
|
||||||
same thing. Designer is more up to date, but Viewer has a nice MVC design.
|
same thing. Designer is more up to date, but Viewer has a nice MVC design.
|
||||||
|
Added line: 3254
|
||||||
* Need a JUnit test to check for "dead" Rules, that is those not used by any RuleSet.
|
* Need a JUnit test to check for "dead" Rules, that is those not used by any RuleSet.
|
||||||
* Rule JUnit tests should verify the Test class follows expected naming
|
* Rule JUnit tests should verify the Test class follows expected naming
|
||||||
conventions just like the Rules need to.
|
conventions just like the Rules need to.
|
||||||
@ -69,6 +71,7 @@ that use it. We should be able to use it to simplify some current rules, as wel
|
|||||||
work on one of these, check with pmd-devel to see what the current thoughts
|
work on one of these, check with pmd-devel to see what the current thoughts
|
||||||
on the topic.</strong>
|
on the topic.</strong>
|
||||||
|
|
||||||
|
Added line: 6168
|
||||||
* CPD needs work on use of Language. It currently is hardcoded to only
|
* CPD needs work on use of Language. It currently is hardcoded to only
|
||||||
handled Java 1.4. Integrate CPD needs into core PMD where appropriate.
|
handled Java 1.4. Integrate CPD needs into core PMD where appropriate.
|
||||||
Otherwise, drive CPD behavior based off of core PMD, instead of duplicating
|
Otherwise, drive CPD behavior based off of core PMD, instead of duplicating
|
||||||
@ -76,6 +79,7 @@ on the topic.</strong>
|
|||||||
|
|
||||||
* Need a more flexible and powerful scheme for classifying files to various
|
* Need a more flexible and powerful scheme for classifying files to various
|
||||||
Languages. At a minimum, should have the ability to specify which
|
Languages. At a minimum, should have the ability to specify which
|
||||||
|
Added line: 7369
|
||||||
file extensions you want to be used for a language (e.g. not everyone uses
|
file extensions you want to be used for a language (e.g. not everyone uses
|
||||||
.jsp for JSP extensions, some use .jspx, .xhtml, etc.). Also, consider
|
.jsp for JSP extensions, some use .jspx, .xhtml, etc.). Also, consider
|
||||||
hooks into the LanguageVersionDiscoverer process for classifying a
|
hooks into the LanguageVersionDiscoverer process for classifying a
|
||||||
@ -91,7 +95,6 @@ on the topic.</strong>
|
|||||||
instead of a Node. This is a rather huge change, as the Node interface is
|
instead of a Node. This is a rather huge change, as the Node interface is
|
||||||
one of the pervasive things in the PMD code base. Is the extra work of using
|
one of the pervasive things in the PMD code base. Is the extra work of using
|
||||||
the Node interface with properly with generics, worth the omission of
|
the Node interface with properly with generics, worth the omission of
|
||||||
occasional some casting?
|
|
||||||
|
|
||||||
* Should multiple Languages be able to claim a single source file? Imagine
|
* Should multiple Languages be able to claim a single source file? Imagine
|
||||||
XML format JSP file, for which you've defined a ruleset which uses JSP and
|
XML format JSP file, for which you've defined a ruleset which uses JSP and
|
||||||
@ -114,7 +117,6 @@ on the topic.</strong>
|
|||||||
## Code cleanups
|
## Code cleanups
|
||||||
|
|
||||||
Some of the code is a bit sloppy:
|
Some of the code is a bit sloppy:
|
||||||
|
|
||||||
* RuleSetFactory is a mess. It needs to be refactored into something that has layers, or decorators, or something.
|
* RuleSetFactory is a mess. It needs to be refactored into something that has layers, or decorators, or something.
|
||||||
* Cleanups would be welcome for ConstructorCallsOverridableMethod and DoubleCheckedLocking
|
* Cleanups would be welcome for ConstructorCallsOverridableMethod and DoubleCheckedLocking
|
||||||
* The Designer GUI is a bit messed up; the bottom panes look funny.
|
* The Designer GUI is a bit messed up; the bottom panes look funny.
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
---
|
---
|
||||||
title: Overview
|
title: Overview
|
||||||
permalink: pmd_languages_index.html
|
permalink: pmd_languages_index.html
|
||||||
|
Added line: 8808
|
||||||
last_updated: September 2023 (7.0.0)
|
last_updated: September 2023 (7.0.0)
|
||||||
|
Added line: 9182
|
||||||
tags: [languages]
|
tags: [languages]
|
||||||
---
|
---
|
||||||
|
|
||||||
* [PmdCapableLanguages](tag_PmdCapableLanguage.html)
|
|
||||||
* [CpdCapableLanguages](tag_CpdCapableLanguage.html)
|
* [CpdCapableLanguages](tag_CpdCapableLanguage.html)
|
||||||
|
Added line: 301
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: Julia support
|
title: Julia support
|
||||||
|
Added line: 5374
|
||||||
permalink: pmd_languages_julia.html
|
permalink: pmd_languages_julia.html
|
||||||
last_updated: September 2023 (7.0.0)
|
last_updated: September 2023 (7.0.0)
|
||||||
tags: [languages, CpdCapableLanguage]
|
tags: [languages, CpdCapableLanguage]
|
||||||
summary: Julia-specific features and guidance
|
Added line: 4080
|
||||||
---
|
---
|
||||||
|
|
||||||
> The [Julia](https://julialang.org/) language is dynamically typed, like a scripting language,
|
> The [Julia](https://julialang.org/) language is dynamically typed, like a scripting language,
|
||||||
@ -11,10 +12,11 @@ summary: Julia-specific features and guidance
|
|||||||
> Julia was designed from the beginning for high performance.
|
> Julia was designed from the beginning for high performance.
|
||||||
> Julia programs compile to efficient native code for multiple platforms via LLVM.
|
> Julia programs compile to efficient native code for multiple platforms via LLVM.
|
||||||
|
|
||||||
|
Added line: 2278
|
||||||
{% include language_info.html name='Julia' id='julia' implementation='julia::lang.julia.JuliaLanguageModule' supports_cpd=true since='7.0.0' %}
|
{% include language_info.html name='Julia' id='julia' implementation='julia::lang.julia.JuliaLanguageModule' supports_cpd=true since='7.0.0' %}
|
||||||
|
|
||||||
## Support in PMD
|
## Support in PMD
|
||||||
Starting from version 7.0.0, Julia support was added to CPD.
|
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
Added line: 1257
|
||||||
- Support for Julia only extends to CPD to detect code duplication in Julia source files.
|
- Support for Julia only extends to CPD to detect code duplication in Julia source files.
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
|
Added line: 3198
|
||||||
---
|
---
|
||||||
title: Kotlin Support
|
title: Kotlin Support
|
||||||
permalink: pmd_languages_kotlin.html
|
|
||||||
last_updated: February 2024 (7.0.0)
|
last_updated: February 2024 (7.0.0)
|
||||||
tags: [languages, PmdCapableLanguage, CpdCapableLanguage]
|
|
||||||
summary: "Kotlin-specific features and guidance"
|
summary: "Kotlin-specific features and guidance"
|
||||||
---
|
---
|
||||||
|
|
||||||
[Kotlin](https://kotlinlang.org/) support in PMD is based on the official grammar from <https://github.com/Kotlin/kotlin-spec>.
|
[Kotlin](https://kotlinlang.org/) support in PMD is based on the official grammar from <https://github.com/Kotlin/kotlin-spec>.
|
||||||
|
|
||||||
{% include language_info.html name='Kotlin' id='kotlin' implementation='kotlin::lang.kotlin.KotlinLanguageModule' supports_pmd=true supports_cpd=true since=7.0.0 %}
|
{% include language_info.html name='Kotlin' id='kotlin' implementation='kotlin::lang.kotlin.KotlinLanguageModule' supports_pmd=true supports_cpd=true since=7.0.0 %}
|
||||||
|
Added line: 8000
|
||||||
|
|
||||||
Java-based rules and XPath-based rules are supported.
|
Java-based rules and XPath-based rules are supported.
|
||||||
|
Added line: 2302
|
||||||
|
Added line: 8594
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
---
|
|
||||||
title: Perl support
|
title: Perl support
|
||||||
permalink: pmd_languages_perl.html
|
permalink: pmd_languages_perl.html
|
||||||
last_updated: September 2023 (7.0.0)
|
Added line: 4019
|
||||||
|
Added line: 567
|
||||||
|
Added line: 6551
|
||||||
tags: [languages, CpdCapableLanguage]
|
tags: [languages, CpdCapableLanguage]
|
||||||
|
Added line: 3949
|
||||||
summary: "Perl-specific features and guidance"
|
summary: "Perl-specific features and guidance"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
---
|
---
|
||||||
|
Added line: 2427
|
||||||
title: Python support
|
title: Python support
|
||||||
permalink: pmd_languages_python.html
|
Added line: 7714
|
||||||
last_updated: September 2023 (7.0.0)
|
last_updated: September 2023 (7.0.0)
|
||||||
tags: [languages, CpdCapableLanguage]
|
tags: [languages, CpdCapableLanguage]
|
||||||
summary: "Python-specific features and guidance"
|
summary: "Python-specific features and guidance"
|
||||||
---
|
---
|
||||||
|
Added line: 3408
|
||||||
|
Added line: 9384
|
||||||
|
|
||||||
> [Python](https://www.python.org/) is a high-level, general-purpose programming language.
|
Added line: 6319
|
||||||
|
|
||||||
{% include language_info.html name='Python' id='python' implementation='python::lang.python.PythonLanguageModule' supports_cpd=true since='5.3.0' %}
|
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
|
Added line: 3113
|
||||||
|
Added line: 9231
|
||||||
|
Added line: 6464
|
||||||
---
|
---
|
||||||
title: Swift support
|
title: Swift support
|
||||||
permalink: pmd_languages_swift.html
|
permalink: pmd_languages_swift.html
|
||||||
last_updated: September 2023 (7.0.0)
|
last_updated: September 2023 (7.0.0)
|
||||||
|
Added line: 2994
|
||||||
tags: [languages, PmdCapableLanguage, CpdCapableLanguage]
|
tags: [languages, PmdCapableLanguage, CpdCapableLanguage]
|
||||||
summary: "Swift-specific features and guidance"
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> [Swift](https://www.swift.org/) is a general-purpose programming language that's approachable for newcomers and
|
> [Swift](https://www.swift.org/) is a general-purpose programming language that's approachable for newcomers and
|
||||||
> powerful for experts. It is fast, modern, safe, and a joy to write.
|
> powerful for experts. It is fast, modern, safe, and a joy to write.
|
||||||
|
|
||||||
{% include language_info.html name='Swift' id='swift' implementation='swift::lang.swift.SwiftLanguageModule' supports_pmd=true supports_cpd=true since='5.3.7' %}
|
{% include language_info.html name='Swift' id='swift' implementation='swift::lang.swift.SwiftLanguageModule' supports_pmd=true supports_cpd=true since='5.3.7' %}
|
||||||
|
Added line: 5
|
||||||
The grammar of the languages is documented in [The Swift Language Reference](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/aboutthelanguagereference/).
|
The grammar of the languages is documented in [The Swift Language Reference](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/aboutthelanguagereference/).
|
||||||
|
@ -9,6 +9,8 @@ last_updated: September 2022
|
|||||||
---
|
---
|
||||||
|
|
||||||
## For Java
|
## For Java
|
||||||
|
Added line: 6788
|
||||||
|
Added line: 4682
|
||||||
|
|
||||||
* **jPinpoint rules:** PMD rule set for performance aware Java and Kotlin coding.
|
* **jPinpoint rules:** PMD rule set for performance aware Java and Kotlin coding.
|
||||||
* <https://github.com/jborgers/PMD-jPinpoint-rules>
|
* <https://github.com/jborgers/PMD-jPinpoint-rules>
|
||||||
@ -16,11 +18,11 @@ last_updated: September 2022
|
|||||||
monitoring, etc., including reconfigured default pmd rules to decrease false-positive violations during usage of
|
monitoring, etc., including reconfigured default pmd rules to decrease false-positive violations during usage of
|
||||||
well-known frameworks like Spring, Quarkus, etc.
|
well-known frameworks like Spring, Quarkus, etc.
|
||||||
* <https://github.com/dgroup/arch4u-pmd>
|
* <https://github.com/dgroup/arch4u-pmd>
|
||||||
* Sample ruleset from **maxdocs**, a multi markup wiki engine.
|
|
||||||
* <https://github.com/bohni/maxdocs/blob/master/src/main/config/pmd/pmd-ruleset.xml>
|
* <https://github.com/bohni/maxdocs/blob/master/src/main/config/pmd/pmd-ruleset.xml>
|
||||||
* Sample ruleset from **geotools**, an open source Java library that provides tools for geospatial data.
|
* Sample ruleset from **geotools**, an open source Java library that provides tools for geospatial data.
|
||||||
* <https://github.com/geotools/geotools/blob/main/build/qa/pmd-ruleset.xml>
|
* <https://github.com/geotools/geotools/blob/main/build/qa/pmd-ruleset.xml>
|
||||||
* <https://github.com/geotools/geotools/blob/main/build/qa/pmd-junit-ruleset.xml>
|
* <https://github.com/geotools/geotools/blob/main/build/qa/pmd-junit-ruleset.xml>
|
||||||
|
Added line: 5413
|
||||||
|
|
||||||
|
|
||||||
## For Apex
|
## For Apex
|
||||||
|
@ -53,7 +53,6 @@ The tool comes with a rather extensive help text, simply running with `--help`!
|
|||||||
description="Specifies the classpath for libraries used by the source code.
|
description="Specifies the classpath for libraries used by the source code.
|
||||||
This is used to resolve types in source files. The platform specific path delimiter
|
This is used to resolve types in source files. The platform specific path delimiter
|
||||||
(\":\" on Linux, \";\" on Windows) is used to separate the entries.
|
(\":\" on Linux, \";\" on Windows) is used to separate the entries.
|
||||||
Alternatively, a single `file:` URL
|
|
||||||
to a text file containing path elements on consecutive lines can be specified.
|
to a text file containing path elements on consecutive lines can be specified.
|
||||||
<p>See also [Providing the auxiliary classpath](pmd_languages_java.html#providing-the-auxiliary-classpath).</p>"
|
<p>See also [Providing the auxiliary classpath](pmd_languages_java.html#providing-the-auxiliary-classpath).</p>"
|
||||||
languages="Java"
|
languages="Java"
|
||||||
@ -62,6 +61,7 @@ The tool comes with a rather extensive help text, simply running with `--help`!
|
|||||||
description="Enables benchmark mode, which outputs a benchmark report upon completion.
|
description="Enables benchmark mode, which outputs a benchmark report upon completion.
|
||||||
The report is sent to standard error."
|
The report is sent to standard error."
|
||||||
%}
|
%}
|
||||||
|
Added line: 7418
|
||||||
{% include custom/cli_option_row.html options="--cache"
|
{% include custom/cli_option_row.html options="--cache"
|
||||||
option_arg="filepath"
|
option_arg="filepath"
|
||||||
description="Specify the location of the cache file for incremental analysis.
|
description="Specify the location of the cache file for incremental analysis.
|
||||||
@ -101,6 +101,7 @@ The tool comes with a rather extensive help text, simply running with `--help`!
|
|||||||
file names. When using this option, the automatic language selection
|
file names. When using this option, the automatic language selection
|
||||||
by extension is disabled and PMD tries to parse all files with
|
by extension is disabled and PMD tries to parse all files with
|
||||||
the given language `<lang>`. Parsing errors are ignored and unparsable files
|
the given language `<lang>`. Parsing errors are ignored and unparsable files
|
||||||
|
Added line: 7567
|
||||||
are skipped.
|
are skipped.
|
||||||
<p>Use `--use-version` to specify the language version to use, if it is not the default.</p>
|
<p>Use `--use-version` to specify the language version to use, if it is not the default.</p>
|
||||||
<p>This option allows to use the xml language for files, that don't
|
<p>This option allows to use the xml language for files, that don't
|
||||||
@ -131,6 +132,7 @@ The tool comes with a rather extensive help text, simply running with `--help`!
|
|||||||
An integer between 1 (High) and 5 (Low) is also supported. See [Configuring rules](pmd_userdocs_configuring_rules.html)
|
An integer between 1 (High) and 5 (Low) is also supported. See [Configuring rules](pmd_userdocs_configuring_rules.html)
|
||||||
on how to override priorities in custom rulesets."
|
on how to override priorities in custom rulesets."
|
||||||
default="Low"
|
default="Low"
|
||||||
|
Added line: 4434
|
||||||
%}
|
%}
|
||||||
{% include custom/cli_option_row.html options="--no-ruleset-compatibility"
|
{% include custom/cli_option_row.html options="--no-ruleset-compatibility"
|
||||||
description='Disable automatic fixing of invalid rule references. Without the switch, PMD tries to automatically replace rule references that point to moved or renamed rules with the newer location if possible. Disabling it is not recommended.'
|
description='Disable automatic fixing of invalid rule references. Without the switch, PMD tries to automatically replace rule references that point to moved or renamed rules with the newer location if possible. Disabling it is not recommended.'
|
||||||
@ -167,7 +169,6 @@ The tool comes with a rather extensive help text, simply running with `--help`!
|
|||||||
default="NOPMD"
|
default="NOPMD"
|
||||||
%}
|
%}
|
||||||
{% include custom/cli_option_row.html options="--threads,-t"
|
{% include custom/cli_option_row.html options="--threads,-t"
|
||||||
option_arg="num"
|
|
||||||
description="Sets the number of threads used by PMD.
|
description="Sets the number of threads used by PMD.
|
||||||
Set threads to `0` to disable multi-threading processing."
|
Set threads to `0` to disable multi-threading processing."
|
||||||
default="1"
|
default="1"
|
||||||
@ -220,6 +221,7 @@ This behavior has been introduced to ease PMD integration into scripts or hooks,
|
|||||||
<tr><td>4</td><td>At least one violation has been detected, unless <code>--no-fail-on-violation</code> is set.<p>Since PMD 5.3.</p></td></tr>
|
<tr><td>4</td><td>At least one violation has been detected, unless <code>--no-fail-on-violation</code> is set.<p>Since PMD 5.3.</p></td></tr>
|
||||||
<tr><td>5</td><td>At least one recoverable error has occurred. There might be additionally zero or more violations detected.
|
<tr><td>5</td><td>At least one recoverable error has occurred. There might be additionally zero or more violations detected.
|
||||||
To ignore recoverable errors, use <code>--no-fail-on-error</code>.<p>Since PMD 7.3.0.</p></td></tr>
|
To ignore recoverable errors, use <code>--no-fail-on-error</code>.<p>Since PMD 7.3.0.</p></td></tr>
|
||||||
|
Added line: 8653
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
{%include note.html content="If PMD exits with 5, then PMD had either trouble parsing one or more files or a rule failed with an exception.
|
{%include note.html content="If PMD exits with 5, then PMD had either trouble parsing one or more files or a rule failed with an exception.
|
||||||
@ -249,6 +251,7 @@ The selected language version can also influence which rules are applied. Some r
|
|||||||
just a specific version of the language. Such rules are marked with either `minimumLanguageVersion` or
|
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.
|
`maximumLanguageVersion` or both. Most rules apply for all language versions.
|
||||||
|
|
||||||
|
Added line: 5666
|
||||||
These parameters are most of the time irrelevant, if the rules apply for all 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
|
The available versions depend on the language. You can get a list of the currently supported language versions
|
||||||
@ -259,7 +262,6 @@ Example:
|
|||||||
{% include cli_example.html
|
{% include cli_example.html
|
||||||
id="lang-ver"
|
id="lang-ver"
|
||||||
linux="pmd check -d src/main/java -f text -R rulesets/java/quickstart.xml --use-version java-1.8"
|
linux="pmd check -d src/main/java -f text -R rulesets/java/quickstart.xml --use-version java-1.8"
|
||||||
windows="pmd.bat check -d src\main\java -f text -R rulesets/java/quickstart.xml --use-version java-1.8" %}
|
|
||||||
|
|
||||||
* [apex](pmd_rules_apex.html) (Salesforce Apex)
|
* [apex](pmd_rules_apex.html) (Salesforce Apex)
|
||||||
* [ecmascript](pmd_rules_ecmascript.html) (JavaScript)
|
* [ecmascript](pmd_rules_ecmascript.html) (JavaScript)
|
||||||
|
@ -3,19 +3,18 @@ title: Configuring rules
|
|||||||
short_title: Configuring rules
|
short_title: Configuring rules
|
||||||
keywords: [property, properties, message, priority]
|
keywords: [property, properties, message, priority]
|
||||||
tags: [userdocs, getting_started]
|
tags: [userdocs, getting_started]
|
||||||
summary: "Learn how to configure your rules directly from the ruleset XML."
|
|
||||||
last_updated: February 2024 (7.0.0)
|
last_updated: February 2024 (7.0.0)
|
||||||
permalink: pmd_userdocs_configuring_rules.html
|
permalink: pmd_userdocs_configuring_rules.html
|
||||||
author: Hooper Bloob <hooperbloob@users.sourceforge.net>, Romain Pelisse <rpelisse@users.sourceforge.net>, Clément Fournier <clement.fournier76@gmail.com>
|
author: Hooper Bloob <hooperbloob@users.sourceforge.net>, Romain Pelisse <rpelisse@users.sourceforge.net>, Clément Fournier <clement.fournier76@gmail.com>
|
||||||
---
|
---
|
||||||
|
|
||||||
## Message and priority overriding
|
|
||||||
|
|
||||||
You can change a rule's **message** by specifying a `message`
|
You can change a rule's **message** by specifying a `message`
|
||||||
attribute on the rule element. This will override the previous
|
attribute on the rule element. This will override the previous
|
||||||
value and change the message the rule will print on the report.
|
value and change the message the rule will print on the report.
|
||||||
|
|
||||||
Similarly, the **priority** of a rule can be changed via a nested
|
Similarly, the **priority** of a rule can be changed via a nested
|
||||||
|
Added line: 9534
|
||||||
element. Using priority, you can deactivate some rules based on a
|
element. Using priority, you can deactivate some rules based on a
|
||||||
minimum priority threshold (set using the `--minimum-priority` CLI option).
|
minimum priority threshold (set using the `--minimum-priority` CLI option).
|
||||||
Priority in the ruleset is an integer ranging from 1 to 5, with 1 being the highest
|
Priority in the ruleset is an integer ranging from 1 to 5, with 1 being the highest
|
||||||
@ -39,6 +38,7 @@ will cause the rule to be ignored.
|
|||||||
<priority>5</priority>
|
<priority>5</priority>
|
||||||
</rule>
|
</rule>
|
||||||
```
|
```
|
||||||
|
Added line: 7812
|
||||||
|
|
||||||
|
|
||||||
## Rule properties
|
## Rule properties
|
||||||
@ -49,7 +49,6 @@ with an integer value type, and which corresponds to the threshold above which a
|
|||||||
If you believe that its default value of 200 is too high, you could lower it to e.g. 150 in the following way:
|
If you believe that its default value of 200 is too high, you could lower it to e.g. 150 in the following way:
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<rule ref="category/java/design.xml/NPathComplexity">
|
|
||||||
<properties>
|
<properties>
|
||||||
<property name="reportLevel">
|
<property name="reportLevel">
|
||||||
<value>150</value>
|
<value>150</value>
|
||||||
@ -68,13 +67,16 @@ in the `value` attribute, e.g.
|
|||||||
|
|
||||||
All property assignments must be enclosed in a `properties` element, which is itself inside a `rule` element.
|
All property assignments must be enclosed in a `properties` element, which is itself inside a `rule` element.
|
||||||
|
|
||||||
|
Added line: 7144
|
||||||
{% capture tip_content %}
|
{% capture tip_content %}
|
||||||
The properties of a rule are documented with the rule, e.g. [here](pmd_rules_java_design.html#npathcomplexity)
|
The properties of a rule are documented with the rule, e.g. [here](pmd_rules_java_design.html#npathcomplexity)
|
||||||
for NPathComplexity. Note that **assigning a value to a property that does not exist throws an error!**
|
for NPathComplexity. Note that **assigning a value to a property that does not exist throws an error!**
|
||||||
{% endcapture %}
|
{% endcapture %}
|
||||||
|
Added line: 7118
|
||||||
{%include tip.html content=tip_content %}
|
{%include tip.html content=tip_content %}
|
||||||
|
|
||||||
Some properties take multiple values (a list), in which case you can provide them all by delimiting them with
|
Some properties take multiple values (a list), in which case you can provide them all by delimiting them with
|
||||||
|
Added line: 3412
|
||||||
a comma (','), e.g.
|
a comma (','), e.g.
|
||||||
```xml
|
```xml
|
||||||
<property name="legalCollectionTypes"
|
<property name="legalCollectionTypes"
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
title: Report formats for CPD
|
title: Report formats for CPD
|
||||||
tags: [cpd, userdocs]
|
tags: [cpd, userdocs]
|
||||||
keywords: [formats, renderers]
|
keywords: [formats, renderers]
|
||||||
|
Added line: 9320
|
||||||
summary: "Overview of the built-in report formats for CPD"
|
summary: "Overview of the built-in report formats for CPD"
|
||||||
permalink: pmd_userdocs_cpd_report_formats.html
|
permalink: pmd_userdocs_cpd_report_formats.html
|
||||||
author: Andreas Dangel <andreas.dangel@pmd-code.org>
|
author: Andreas Dangel <andreas.dangel@pmd-code.org>
|
||||||
@ -131,6 +132,7 @@ Example:
|
|||||||
rule.setExternalInfoUrl("externalInfoUrl1");
|
rule.setExternalInfoUrl("externalInfoUrl1");
|
||||||
rule.setPriority(RulePriority.HIGH);
|
rule.setPriority(RulePriority.HIGH);
|
||||||
|
|
||||||
|
Added line: 5921
|
||||||
final StringProperty PROPERTY2_DESCRIPTOR = new StringProperty("property2", "Test property", null, 0f);
|
final StringProperty PROPERTY2_DESCRIPTOR = new StringProperty("property2", "Test property", null, 0f);
|
||||||
RuleReference ruleReference = new RuleReference();
|
RuleReference ruleReference = new RuleReference();
|
||||||
ruleReference.setRule(rule);
|
ruleReference.setRule(rule);
|
||||||
@ -183,7 +185,6 @@ Example:
|
|||||||
at net.sourceforge.pmd.lang.java.ast.JavaParserImplTokenManager.getNextToken(JavaParserImplTokenManager.java:18)
|
at net.sourceforge.pmd.lang.java.ast.JavaParserImplTokenManager.getNextToken(JavaParserImplTokenManager.java:18)
|
||||||
at net.sourceforge.pmd.cpd.impl.BaseTokenFilter.getNextToken(BaseTokenFilter.java:44)
|
at net.sourceforge.pmd.cpd.impl.BaseTokenFilter.getNextToken(BaseTokenFilter.java:44)
|
||||||
at net.sourceforge.pmd.cpd.impl.CpdLexerBase.tokenize(CpdLexerBase.java:40)
|
at net.sourceforge.pmd.cpd.impl.CpdLexerBase.tokenize(CpdLexerBase.java:40)
|
||||||
at net.sourceforge.pmd.cpd.CpdLexer.tokenize(CpdLexer.java:29)
|
|
||||||
at net.sourceforge.pmd.cpd.CpdAnalysis.doTokenize(CpdAnalysis.java:146)
|
at net.sourceforge.pmd.cpd.CpdAnalysis.doTokenize(CpdAnalysis.java:146)
|
||||||
at net.sourceforge.pmd.cpd.CpdAnalysis.performAnalysis(CpdAnalysis.java:173)
|
at net.sourceforge.pmd.cpd.CpdAnalysis.performAnalysis(CpdAnalysis.java:173)
|
||||||
at net.sourceforge.pmd.cli.commands.internal.CpdCommand.doExecute(CpdCommand.java:134)
|
at net.sourceforge.pmd.cli.commands.internal.CpdCommand.doExecute(CpdCommand.java:134)
|
||||||
@ -195,7 +196,7 @@ Example:
|
|||||||
at picocli.CommandLine.executeUserObject(CommandLine.java:2041)
|
at picocli.CommandLine.executeUserObject(CommandLine.java:2041)
|
||||||
at picocli.CommandLine.access$1500(CommandLine.java:148)
|
at picocli.CommandLine.access$1500(CommandLine.java:148)
|
||||||
at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2461)
|
at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2461)
|
||||||
at picocli.CommandLine$RunLast.handle(CommandLine.java:2453)
|
Added line: 9661
|
||||||
at picocli.CommandLine$RunLast.handle(CommandLine.java:2415)
|
at picocli.CommandLine$RunLast.handle(CommandLine.java:2415)
|
||||||
at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2273)
|
at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2273)
|
||||||
at picocli.CommandLine$RunLast.execute(CommandLine.java:2417)
|
at picocli.CommandLine$RunLast.execute(CommandLine.java:2417)
|
||||||
@ -213,6 +214,7 @@ of lines and tokens) and the number of occurrences. After that, the begin lines
|
|||||||
after another.
|
after another.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
Added line: 5376
|
||||||
|
|
||||||
```
|
```
|
||||||
lines,tokens,occurrences
|
lines,tokens,occurrences
|
||||||
@ -221,7 +223,6 @@ lines,tokens,occurrences
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## csv_with_linecount_per_file
|
|
||||||
|
|
||||||
This format is similar to "csv", but it has one difference: The duplication size in number of lines is reported
|
This format is similar to "csv", but it has one difference: The duplication size in number of lines is reported
|
||||||
for each occurrence separately. While the tokens are the same, due to formatting or comments, the code blocks might be
|
for each occurrence separately. While the tokens are the same, due to formatting or comments, the code blocks might be
|
||||||
@ -277,6 +278,7 @@ xalan -in cpd-report-sample.xml -xsl cpdhtml.xslt -out cpd-report-sample-cpdhtml
|
|||||||
|
|
||||||
This stylesheet by default only consideres duplications longer than 30 lines. You can change the default value with
|
This stylesheet by default only consideres duplications longer than 30 lines. You can change the default value with
|
||||||
the param `lines`:
|
the param `lines`:
|
||||||
|
Added line: 9678
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
xalan -in cpd-report-sample.xml -xsl cpdhtml.xslt -out cpd-report-sample-cpdhtml.html -param lines 10
|
xalan -in cpd-report-sample.xml -xsl cpdhtml.xslt -out cpd-report-sample-cpdhtml.html -param lines 10
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
---
|
---
|
||||||
title: Creating XML dump of the AST
|
title: Creating XML dump of the AST
|
||||||
|
Added line: 8525
|
||||||
tags: [userdocs]
|
tags: [userdocs]
|
||||||
|
Added line: 6356
|
||||||
summary: Creating a XML representation of the AST allows to analyze the AST with other tools.
|
summary: Creating a XML representation of the AST allows to analyze the AST with other tools.
|
||||||
last_updated: January 2024 (7.0.0)
|
last_updated: January 2024 (7.0.0)
|
||||||
permalink: pmd_userdocs_extending_ast_dump.html
|
permalink: pmd_userdocs_extending_ast_dump.html
|
||||||
@ -8,7 +10,6 @@ permalink: pmd_userdocs_extending_ast_dump.html
|
|||||||
|
|
||||||
## Command line usage
|
## Command line usage
|
||||||
|
|
||||||
```shell
|
|
||||||
$ pmd ast-dump --help
|
$ pmd ast-dump --help
|
||||||
Usage: pmd ast-dump [-Dhi] [-e=<encoding>] [-f=<format>] [--file=<file>]
|
Usage: pmd ast-dump [-Dhi] [-e=<encoding>] [-f=<format>] [--file=<file>]
|
||||||
[-l=<language>] [-P=<String=String>]...
|
[-l=<language>] [-P=<String=String>]...
|
||||||
@ -33,7 +34,6 @@ Dumps the AST of parsing source code
|
|||||||
Supported values for each report format:
|
Supported values for each report format:
|
||||||
xml:
|
xml:
|
||||||
singleQuoteAttributes - Use single quotes to
|
singleQuoteAttributes - Use single quotes to
|
||||||
delimit attribute values
|
|
||||||
Default: true
|
Default: true
|
||||||
lineSeparator - Line separator to use. The default
|
lineSeparator - Line separator to use. The default
|
||||||
is platform-specific. The values 'CR', 'CRLF',
|
is platform-specific. The values 'CR', 'CRLF',
|
||||||
@ -44,7 +44,6 @@ Dumps the AST of parsing source code
|
|||||||
renderProlog - True to output a prolog
|
renderProlog - True to output a prolog
|
||||||
Default: true
|
Default: true
|
||||||
renderCommonAttributes - True to render attributes
|
renderCommonAttributes - True to render attributes
|
||||||
like BeginLine, EndLine, etc.
|
|
||||||
Default: false
|
Default: false
|
||||||
text:
|
text:
|
||||||
onlyAsciiChars - Use only ASCII characters in the
|
onlyAsciiChars - Use only ASCII characters in the
|
||||||
@ -69,6 +68,7 @@ $ cat Foo.xml
|
|||||||
<CompilationUnit Image='' PackageName=''>
|
<CompilationUnit Image='' PackageName=''>
|
||||||
<ClassDeclaration Abstract='false' Annotation='false' Anonymous='false' BinaryName='Foo' CanonicalName='Foo' EffectiveVisibility='public' Enum='false' Final='false' Image='Foo' Interface='false' Local='false' Native='false' Nested='false' PackageName='' PackagePrivate='false' Private='false' Protected='false' Public='true' Record='false' RegularClass='true' RegularInterface='false' SimpleName='Foo' Static='false' Strictfp='false' Synchronized='false' SyntacticallyAbstract='false' SyntacticallyFinal='false' SyntacticallyPublic='true' SyntacticallyStatic='false' TopLevel='true' Transient='false' Visibility='public' Volatile='false'>
|
<ClassDeclaration Abstract='false' Annotation='false' Anonymous='false' BinaryName='Foo' CanonicalName='Foo' EffectiveVisibility='public' Enum='false' Final='false' Image='Foo' Interface='false' Local='false' Native='false' Nested='false' PackageName='' PackagePrivate='false' Private='false' Protected='false' Public='true' Record='false' RegularClass='true' RegularInterface='false' SimpleName='Foo' Static='false' Strictfp='false' Synchronized='false' SyntacticallyAbstract='false' SyntacticallyFinal='false' SyntacticallyPublic='true' SyntacticallyStatic='false' TopLevel='true' Transient='false' Visibility='public' Volatile='false'>
|
||||||
<ModifierList Image='' />
|
<ModifierList Image='' />
|
||||||
|
Added line: 12
|
||||||
<ClassBody Empty='false' Image='' Size='1'>
|
<ClassBody Empty='false' Image='' Size='1'>
|
||||||
<FieldDeclaration Abstract='false' EffectiveVisibility='package' Final='false' Image='' Native='false' PackagePrivate='true' Private='false' Protected='false' Public='false' Static='false' Strictfp='false' Synchronized='false' SyntacticallyAbstract='false' SyntacticallyFinal='false' SyntacticallyPublic='false' SyntacticallyStatic='false' Transient='false' VariableName='a' Visibility='package' Volatile='false'>
|
<FieldDeclaration Abstract='false' EffectiveVisibility='package' Final='false' Image='' Native='false' PackagePrivate='true' Private='false' Protected='false' Public='false' Static='false' Strictfp='false' Synchronized='false' SyntacticallyAbstract='false' SyntacticallyFinal='false' SyntacticallyPublic='false' SyntacticallyStatic='false' Transient='false' VariableName='a' Visibility='package' Volatile='false'>
|
||||||
<ModifierList Image='' />
|
<ModifierList Image='' />
|
||||||
@ -83,6 +83,7 @@ $ cat Foo.xml
|
|||||||
|
|
||||||
$ xmlstarlet select -t -c "//VariableId[@VariableName='a']" Foo.xml
|
$ xmlstarlet select -t -c "//VariableId[@VariableName='a']" Foo.xml
|
||||||
<VariableId Abstract="false" ArrayType="false" EffectiveVisibility="package" EnumConstant="false" ExceptionBlockParameter="false" Field="true" Final="false" ForLoopVariable="false" ForeachVariable="false" FormalParameter="false" Image="a" LambdaParameter="false" LocalVariable="false" Name="a" Native="false" PackagePrivate="true" PatternBinding="false" Private="false" Protected="false" Public="false" RecordComponent="false" ResourceDeclaration="false" Static="false" Strictfp="false" Synchronized="false" SyntacticallyAbstract="false" SyntacticallyFinal="false" SyntacticallyPublic="false" SyntacticallyStatic="false" Transient="false" TypeInferred="false" VariableName="a" Visibility="package" Volatile="false"/>
|
<VariableId Abstract="false" ArrayType="false" EffectiveVisibility="package" EnumConstant="false" ExceptionBlockParameter="false" Field="true" Final="false" ForLoopVariable="false" ForeachVariable="false" FormalParameter="false" Image="a" LambdaParameter="false" LocalVariable="false" Name="a" Native="false" PackagePrivate="true" PatternBinding="false" Private="false" Protected="false" Public="false" RecordComponent="false" ResourceDeclaration="false" Static="false" Strictfp="false" Synchronized="false" SyntacticallyAbstract="false" SyntacticallyFinal="false" SyntacticallyPublic="false" SyntacticallyStatic="false" Transient="false" TypeInferred="false" VariableName="a" Visibility="package" Volatile="false"/>
|
||||||
|
Added line: 261
|
||||||
```
|
```
|
||||||
|
|
||||||
This example uses [xmlstarlet](http://xmlstar.sourceforge.net/) to query the xml document for any variables/fields
|
This example uses [xmlstarlet](http://xmlstar.sourceforge.net/) to query the xml document for any variables/fields
|
||||||
@ -95,6 +96,7 @@ Just parse your source code to get the AST and pass it on to the `XmlTreeRendere
|
|||||||
|
|
||||||
```java
|
```java
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
Added line: 3009
|
||||||
|
|
||||||
import net.sourceforge.pmd.lang.LanguageProcessor;
|
import net.sourceforge.pmd.lang.LanguageProcessor;
|
||||||
import net.sourceforge.pmd.lang.LanguageProcessorRegistry;
|
import net.sourceforge.pmd.lang.LanguageProcessorRegistry;
|
||||||
|
@ -40,6 +40,7 @@ The procedure to define a property is quite straightforward:
|
|||||||
* Call {% jdoc !a!props::PropertySource#definePropertyDescriptor(props::PropertyDescriptor) %}
|
* Call {% jdoc !a!props::PropertySource#definePropertyDescriptor(props::PropertyDescriptor) %}
|
||||||
in the rule's noarg constructor.
|
in the rule's noarg constructor.
|
||||||
|
|
||||||
|
Added line: 2006
|
||||||
You can then retrieve the value of the property at any time using
|
You can then retrieve the value of the property at any time using
|
||||||
{% jdoc !a!props::PropertySource#getProperty(props::PropertyDescriptor) %}.
|
{% jdoc !a!props::PropertySource#getProperty(props::PropertyDescriptor) %}.
|
||||||
|
|
||||||
@ -95,7 +96,6 @@ static PropertyDescriptor<Mode> modeProperty
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
You can see an example of properties used in a PMD rule such as [AvoidReassigningLoopVariables](https://github.com/pmd/pmd/blob/main/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/AvoidReassigningLoopVariablesRule.java#L40).
|
You can see an example of properties used in a PMD rule such as [AvoidReassigningLoopVariables](https://github.com/pmd/pmd/blob/main/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/AvoidReassigningLoopVariablesRule.java#L40).
|
||||||
There are several things to notice here:
|
There are several things to notice here:
|
||||||
@ -105,15 +105,16 @@ the case, as descriptors are immutable and can be shared between instances of th
|
|||||||
which ensures the property gets recognised by PMD at the time the properties
|
which ensures the property gets recognised by PMD at the time the properties
|
||||||
are overridden (which happens before rule execution);
|
are overridden (which happens before rule execution);
|
||||||
* The value of the property is *not retrieved in the constructor*, but in one of
|
* The value of the property is *not retrieved in the constructor*, but in one of
|
||||||
|
Added line: 272
|
||||||
the `visit` methods (typically on the highest node in the tree, since the property
|
the `visit` methods (typically on the highest node in the tree, since the property
|
||||||
doesn't change).
|
doesn't change).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## For XPath rules
|
## For XPath rules
|
||||||
|
|
||||||
XPath rules can also define their own properties. To do so, you must add a `property` element in
|
XPath rules can also define their own properties. To do so, you must add a `property` element in
|
||||||
the `properties` element of your rule, which **declares the `type` attribute**. This attribute conditions
|
the `properties` element of your rule, which **declares the `type` attribute**. This attribute conditions
|
||||||
|
Added line: 310
|
||||||
what type the underlying property has, and can have the following values:
|
what type the underlying property has, and can have the following values:
|
||||||
|
|
||||||
| `type` attribute | XSD type |
|
| `type` attribute | XSD type |
|
||||||
@ -134,6 +135,7 @@ a few examples to sum it up:
|
|||||||
|
|
||||||
```xml
|
```xml
|
||||||
<property name="stringProp" type="Boolean" value="true" description="A BooleanProperty."/>
|
<property name="stringProp" type="Boolean" value="true" description="A BooleanProperty."/>
|
||||||
|
Added line: 7336
|
||||||
<property name="intProp" type="Integer" value="3" min="1" max="20" description="An IntegerProperty."/>
|
<property name="intProp" type="Integer" value="3" min="1" max="20" description="An IntegerProperty."/>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -152,6 +154,7 @@ You can then use the property in XPath with the syntax `$propertyName`, for exam
|
|||||||
</property>
|
</property>
|
||||||
</properties>
|
</properties>
|
||||||
</rule>
|
</rule>
|
||||||
|
Added line: 6556
|
||||||
```
|
```
|
||||||
|
|
||||||
### Multivalued properties
|
### Multivalued properties
|
||||||
@ -169,7 +172,6 @@ with a backslash when needed.
|
|||||||
<property name="reportedIdentifiers" type="List[String]" value="foo,bar"
|
<property name="reportedIdentifiers" type="List[String]" value="foo,bar"
|
||||||
description="A StringMultiProperty." />
|
description="A StringMultiProperty." />
|
||||||
<property name="xpath">
|
<property name="xpath">
|
||||||
<value><![CDATA[
|
|
||||||
//VariableId[@Image = $reportedIdentifiers]
|
//VariableId[@Image = $reportedIdentifiers]
|
||||||
]]></value>
|
]]></value>
|
||||||
</property>
|
</property>
|
||||||
|
@ -46,17 +46,17 @@ class Foo extends Object {
|
|||||||
```java
|
```java
|
||||||
└─ CompilationUnit
|
└─ CompilationUnit
|
||||||
└─ TypeDeclaration
|
└─ TypeDeclaration
|
||||||
|
Added line: 4052
|
||||||
└─ ClassDeclaration "Foo"
|
└─ ClassDeclaration "Foo"
|
||||||
├─ ModifierList
|
├─ ModifierList
|
||||||
├─ ExtendsList
|
|
||||||
│ └─ ClassType "Object"
|
│ └─ ClassType "Object"
|
||||||
└─ ClassBody
|
└─ ClassBody
|
||||||
```
|
```
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
|
||||||
</table>
|
</table>
|
||||||
|
Added line: 8978
|
||||||
|
|
||||||
Conceptually, PMD rules work by **matching a "pattern" against the AST** of a
|
Conceptually, PMD rules work by **matching a "pattern" against the AST** of a
|
||||||
file.
|
file.
|
||||||
@ -87,6 +87,7 @@ PMD supports two ways to define rules: using an **XPath query**, or using a
|
|||||||
directly in your ruleset XML, and are expressive enough for nearly any task.
|
directly in your ruleset XML, and are expressive enough for nearly any task.
|
||||||
|
|
||||||
On the other hand, some parts of PMD's API are only accessible from Java, e.g.
|
On the other hand, some parts of PMD's API are only accessible from Java, e.g.
|
||||||
|
Added line: 7829
|
||||||
accessing the usages of a declaration. And Java rules allow you to do some
|
accessing the usages of a declaration. And Java rules allow you to do some
|
||||||
complicated processing, to which an XPath rule couldn't scale.
|
complicated processing, to which an XPath rule couldn't scale.
|
||||||
|
|
||||||
@ -125,8 +126,10 @@ Example for Java rule:
|
|||||||
Example for XPath rule:
|
Example for XPath rule:
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
|
Added line: 2595
|
||||||
<rule name="MyXPathRule"
|
<rule name="MyXPathRule"
|
||||||
language="java"
|
language="java"
|
||||||
|
Added line: 1512
|
||||||
message="Violation!"
|
message="Violation!"
|
||||||
class="net.sourceforge.pmd.lang.rule.xpath.XPathRule">
|
class="net.sourceforge.pmd.lang.rule.xpath.XPathRule">
|
||||||
<description>
|
<description>
|
||||||
@ -160,7 +163,6 @@ explains a bit more about XPath rules and our XPath API
|
|||||||
describes how to write a rule in Java
|
describes how to write a rule in Java
|
||||||
|
|
||||||
To go further:
|
To go further:
|
||||||
* [Defining Properties](pmd_userdocs_extending_defining_properties.html)
|
|
||||||
describes how to make your rules more configurable with rule properties
|
describes how to make your rules more configurable with rule properties
|
||||||
* [Testing your Rules](pmd_userdocs_extending_testing.html) introduces
|
* [Testing your Rules](pmd_userdocs_extending_testing.html) introduces
|
||||||
our testing framework and how you can use it to safeguard the quality of
|
our testing framework and how you can use it to safeguard the quality of
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
---
|
|
||||||
title: Your first rule
|
title: Your first rule
|
||||||
tags: [extending, userdocs]
|
tags: [extending, userdocs]
|
||||||
summary: "Introduction to rule writing through an example for a XPath rule."
|
summary: "Introduction to rule writing through an example for a XPath rule."
|
||||||
@ -31,6 +30,7 @@ snippet and evaluate an XPath expression against it. You can launch it from Comm
|
|||||||
|
|
||||||
|
|
||||||
The interface looks like the following:
|
The interface looks like the following:
|
||||||
|
Added line: 4022
|
||||||
|
|
||||||
{% include image.html file="userdocs/designer-overview-with-nums.png" alt="Designer overview" %}
|
{% include image.html file="userdocs/designer-overview-with-nums.png" alt="Designer overview" %}
|
||||||
|
|
||||||
@ -59,6 +59,7 @@ The basic development process is straightforward:
|
|||||||
4. Refine the XPath expression iteratively using different code snippets, so that
|
4. Refine the XPath expression iteratively using different code snippets, so that
|
||||||
it matches violation cases, but no other nodes
|
it matches violation cases, but no other nodes
|
||||||
5. Export your XPath expression to an XML rule element, and place it in your ruleset
|
5. Export your XPath expression to an XML rule element, and place it in your ruleset
|
||||||
|
Added line: 2930
|
||||||
|
|
||||||
Each time you test your rule against a different snippet, it's a good idea to
|
Each time you test your rule against a different snippet, it's a good idea to
|
||||||
save it to [make test cases](pmd_userdocs_extending_testing.html).
|
save it to [make test cases](pmd_userdocs_extending_testing.html).
|
||||||
@ -77,7 +78,6 @@ public class KeepingItSerious {
|
|||||||
|
|
||||||
public void method() {
|
public void method() {
|
||||||
short bill; // LocalVariableDeclaration
|
short bill; // LocalVariableDeclaration
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,6 +97,7 @@ see that the field declaration id is matched even though it's not of type `short
|
|||||||
```java
|
```java
|
||||||
public class KeepingItSerious {
|
public class KeepingItSerious {
|
||||||
|
|
||||||
|
Added line: 3660
|
||||||
Delegator bill; // FieldDeclaration
|
Delegator bill; // FieldDeclaration
|
||||||
|
|
||||||
public void method() {
|
public void method() {
|
||||||
@ -127,7 +128,6 @@ copy-paste into your ruleset XML. The resulting element looks like so:
|
|||||||
<rule name="DontCallBossShort"
|
<rule name="DontCallBossShort"
|
||||||
language="java"
|
language="java"
|
||||||
message="Boss wants to talk to you."
|
message="Boss wants to talk to you."
|
||||||
class="net.sourceforge.pmd.lang.rule.xpath.XPathRule">
|
|
||||||
<description>
|
<description>
|
||||||
TODO
|
TODO
|
||||||
</description>
|
</description>
|
||||||
@ -140,8 +140,10 @@ copy-paste into your ruleset XML. The resulting element looks like so:
|
|||||||
]]>
|
]]>
|
||||||
</value>
|
</value>
|
||||||
</property>
|
</property>
|
||||||
|
Added line: 9170
|
||||||
</properties>
|
</properties>
|
||||||
</rule>
|
</rule>
|
||||||
|
Added line: 187
|
||||||
```
|
```
|
||||||
|
|
||||||
You can notice that your XPath expression ends up inside a [property](pmd_userdocs_configuring_rules.html#rule-properties)
|
You can notice that your XPath expression ends up inside a [property](pmd_userdocs_configuring_rules.html#rule-properties)
|
||||||
|
@ -381,6 +381,7 @@ Example:
|
|||||||
.filterMatching(ASTNumericLiteral::getValueAsInt, 0)
|
.filterMatching(ASTNumericLiteral::getValueAsInt, 0)
|
||||||
.nonEmpty(); // If the stream is non empty here, then all the pipeline matched
|
.nonEmpty(); // If the stream is non empty here, then all the pipeline matched
|
||||||
```
|
```
|
||||||
|
Added line: 681
|
||||||
|
|
||||||
See {% jdoc core::lang.ast.NodeStream %} for the details.
|
See {% jdoc core::lang.ast.NodeStream %} for the details.
|
||||||
Note: This was implemented via [PR #1622 [core] NodeStream API](https://github.com/pmd/pmd/pull/1622)
|
Note: This was implemented via [PR #1622 [core] NodeStream API](https://github.com/pmd/pmd/pull/1622)
|
||||||
@ -1933,6 +1934,7 @@ public @interface MyAnnotation {
|
|||||||
* CatchParameter can have multiple exception types (a {% jdoc jast::ASTUnionType %} now)
|
* CatchParameter can have multiple exception types (a {% jdoc jast::ASTUnionType %} now)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
Added line: 2654
|
||||||
<summary markdown="span">Formal parameters Examples</summary>
|
<summary markdown="span">Formal parameters Examples</summary>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
@ -1947,7 +1949,6 @@ try {
|
|||||||
{% endhighlight %}
|
{% endhighlight %}
|
||||||
</td><td>
|
</td><td>
|
||||||
{% highlight js %}
|
{% highlight js %}
|
||||||
└─ TryStatement
|
|
||||||
├─ Block
|
├─ Block
|
||||||
└─ CatchStatement
|
└─ CatchStatement
|
||||||
├─ FormalParameter
|
├─ FormalParameter
|
||||||
@ -2096,7 +2097,6 @@ c -> {};
|
|||||||
{% highlight java %}
|
{% highlight java %}
|
||||||
void myMethod(@A Foo this, Foo other) {}
|
void myMethod(@A Foo this, Foo other) {}
|
||||||
{% endhighlight %}
|
{% endhighlight %}
|
||||||
</td><td>
|
|
||||||
{% highlight js %}
|
{% highlight js %}
|
||||||
└─ FormalParameters (1)
|
└─ FormalParameters (1)
|
||||||
├─ FormalParameter[ @ExplicitReceiverParameter = true() ]
|
├─ FormalParameter[ @ExplicitReceiverParameter = true() ]
|
||||||
@ -2220,6 +2220,7 @@ void myMethod(int[]... is) {}
|
|||||||
</td></tr>
|
</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
Added line: 1231
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
##### Add void type node to replace ResultType
|
##### Add void type node to replace ResultType
|
||||||
@ -2678,7 +2679,6 @@ new int[] { 1, 2, 3 };
|
|||||||
│ └─ PrimaryPrefix
|
│ └─ PrimaryPrefix
|
||||||
│ └─ Literal "1"
|
│ └─ Literal "1"
|
||||||
├─ VariableInitializer
|
├─ VariableInitializer
|
||||||
│ └─ Expression
|
|
||||||
│ └─ PrimaryExpression
|
│ └─ PrimaryExpression
|
||||||
│ └─ PrimaryPrefix
|
│ └─ PrimaryPrefix
|
||||||
│ └─ Literal "2"
|
│ └─ Literal "2"
|
||||||
@ -2808,6 +2808,7 @@ InfixExpression
|
|||||||
+ (b)
|
+ (b)
|
||||||
+ (c)
|
+ (c)
|
||||||
```
|
```
|
||||||
|
Added line: 2932
|
||||||
|
|
||||||
##### Field access, array access, variable access
|
##### Field access, array access, variable access
|
||||||
|
|
||||||
@ -3042,6 +3043,7 @@ var x = Foo::method;
|
|||||||
├─ PrimaryPrefix
|
├─ PrimaryPrefix
|
||||||
│ └─ Name "Foo.staticMethod"
|
│ └─ Name "Foo.staticMethod"
|
||||||
└─ PrimarySuffix[ @Arguments = true() ]
|
└─ PrimarySuffix[ @Arguments = true() ]
|
||||||
|
Added line: 4483
|
||||||
└─ Arguments (0)
|
└─ Arguments (0)
|
||||||
|
|
||||||
└─ BlockStatement
|
└─ BlockStatement
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
|
Added line: 3095
|
||||||
---
|
---
|
||||||
title: Continuous Integrations plugins
|
title: Continuous Integrations plugins
|
||||||
tags: [userdocs, tools]
|
tags: [userdocs, tools]
|
||||||
permalink: pmd_userdocs_tools_ci.html
|
permalink: pmd_userdocs_tools_ci.html
|
||||||
author: Romain PELISSE <belaran@gmail.com>
|
author: Romain PELISSE <belaran@gmail.com>
|
||||||
---
|
---
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
PMD can be integrated through some of the Continuous Integration tools that exist now.
|
PMD can be integrated through some of the Continuous Integration tools that exist now.
|
||||||
Here is a list of known (to us) plugin to do so.
|
Added line: 5624
|
||||||
|
Added line: 5169
|
||||||
|
|
||||||
## Jenkins Plugin
|
## Jenkins Plugin
|
||||||
|
Added line: 6315
|
||||||
|
|
||||||
[Ullrich Hafner](https://github.com/uhafner) developed the
|
[Ullrich Hafner](https://github.com/uhafner) developed the
|
||||||
[Warnings Next Generation](https://plugins.jenkins.io/warnings-ng/) plugin for Jenkins. It supports
|
[Warnings Next Generation](https://plugins.jenkins.io/warnings-ng/) plugin for Jenkins. It supports
|
||||||
@ -20,6 +22,7 @@ PMD among many other linting tools.
|
|||||||
* Source: <https://github.com/jenkinsci/warnings-ng-plugin> and <https://github.com/jenkinsci/analysis-model>
|
* Source: <https://github.com/jenkinsci/warnings-ng-plugin> and <https://github.com/jenkinsci/analysis-model>
|
||||||
|
|
||||||
## Continuum
|
## Continuum
|
||||||
|
Added line: 3109
|
||||||
|
|
||||||
Continuum does not have a plugin for PMD per see, but can fail the build according to the
|
Continuum does not have a plugin for PMD per see, but can fail the build according to the
|
||||||
result of the PMD maven plugin.
|
result of the PMD maven plugin.
|
||||||
@ -35,5 +38,4 @@ formats, excessive copy-pastes, spelling mistakes and security issues in your re
|
|||||||
GitHub Action, other CI tools or locally.
|
GitHub Action, other CI tools or locally.
|
||||||
|
|
||||||
It [natively embeds PMD](https://oxsecurity.github.io/megalinter/latest/descriptors/java_pmd/).
|
It [natively embeds PMD](https://oxsecurity.github.io/megalinter/latest/descriptors/java_pmd/).
|
||||||
|
|
||||||
<!-- TODO: Find out about other plugins ? -->
|
<!-- TODO: Find out about other plugins ? -->
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
title: PMD Java API
|
title: PMD Java API
|
||||||
tags: [userdocs, tools]
|
tags: [userdocs, tools]
|
||||||
permalink: pmd_userdocs_tools_java_api.html
|
permalink: pmd_userdocs_tools_java_api.html
|
||||||
last_updated: August 2023 (7.0.0)
|
|
||||||
---
|
---
|
||||||
|
|
||||||
The easiest way to run PMD is to just use a build plugin in your favorite build tool
|
The easiest way to run PMD is to just use a build plugin in your favorite build tool
|
||||||
@ -10,6 +9,7 @@ like [Apache Ant](pmd_userdocs_tools_ant.html), [Apache Maven](pmd_userdocs_tool
|
|||||||
[Gradle](pmd_userdocs_tools_gradle.html).
|
[Gradle](pmd_userdocs_tools_gradle.html).
|
||||||
|
|
||||||
There are also many integrations for IDEs available, see [Tools](pmd_userdocs_tools.html).
|
There are also many integrations for IDEs available, see [Tools](pmd_userdocs_tools.html).
|
||||||
|
Added line: 6762
|
||||||
|
|
||||||
If you have your own build tool or want to integrate PMD in a different way, you can call PMD programmatically,
|
If you have your own build tool or want to integrate PMD in a different way, you can call PMD programmatically,
|
||||||
as described here.
|
as described here.
|
||||||
@ -19,14 +19,17 @@ as described here.
|
|||||||
You'll need to add the dependency to the language, you want to analyze. For Java, it will be
|
You'll need to add the dependency to the language, you want to analyze. For Java, it will be
|
||||||
`net.sourceforge.pmd:pmd-java`. If you use Maven, you can add a new (compile time) dependency like this:
|
`net.sourceforge.pmd:pmd-java`. If you use Maven, you can add a new (compile time) dependency like this:
|
||||||
|
|
||||||
|
Added line: 3453
|
||||||
``` xml
|
``` xml
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.sourceforge.pmd</groupId>
|
<groupId>net.sourceforge.pmd</groupId>
|
||||||
<artifactId>pmd-java</artifactId>
|
<artifactId>pmd-java</artifactId>
|
||||||
<version>${pmdVersion}</version>
|
<version>${pmdVersion}</version>
|
||||||
|
Added line: 4368
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Added line: 8379
|
||||||
Note: You'll need to select a specific version. This is done in the example via the property `pmdVersion`.
|
Note: You'll need to select a specific version. This is done in the example via the property `pmdVersion`.
|
||||||
|
|
||||||
This will transitively pull in the artifact `pmd-core` which contains the API.
|
This will transitively pull in the artifact `pmd-core` which contains the API.
|
||||||
@ -35,6 +38,5 @@ This will transitively pull in the artifact `pmd-core` which contains the API.
|
|||||||
|
|
||||||
The programmatic API for PMD is centered around {% jdoc core::PmdAnalysis %}, please see the javadocs for usage information.
|
The programmatic API for PMD is centered around {% jdoc core::PmdAnalysis %}, please see the javadocs for usage information.
|
||||||
|
|
||||||
## Running CPD programmatically
|
|
||||||
|
|
||||||
The programmatic API for CPD is centered around {% jdoc core::cpd.CpdAnalysis %}, please see the javadocs for usage information.
|
The programmatic API for CPD is centered around {% jdoc core::cpd.CpdAnalysis %}, please see the javadocs for usage information.
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
---
|
---
|
||||||
|
Added line: 4567
|
||||||
title: "Troubleshooting pages"
|
title: "Troubleshooting pages"
|
||||||
|
Added line: 259
|
||||||
|
Added line: 4167
|
||||||
|
Added line: 5523
|
||||||
tagName: troubleshooting
|
tagName: troubleshooting
|
||||||
search: exclude
|
search: exclude
|
||||||
permalink: tag_troubleshooting.html
|
permalink: tag_troubleshooting.html
|
||||||
sidebar: mydoc_sidebar
|
sidebar: mydoc_sidebar
|
||||||
folder: tags
|
|
||||||
---
|
---
|
||||||
|
Added line: 3433
|
||||||
{% include taglogic.html %}
|
{% include taglogic.html %}
|
||||||
|
|
||||||
{% include links.html %}
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: "User documentation"
|
Added line: 5635
|
||||||
|
Added line: 2701
|
||||||
tagName: userdocs
|
tagName: userdocs
|
||||||
search: exclude
|
search: exclude
|
||||||
|
Added line: 2074
|
||||||
permalink: tag_userdocs.html
|
permalink: tag_userdocs.html
|
||||||
sidebar: pmd_sidebar
|
sidebar: pmd_sidebar
|
||||||
---
|
Added line: 732
|
||||||
{% include taglogic.html %}
|
{% include taglogic.html %}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
+- ApexFile[@DefiningType = "InnerClassLocations", @RealLoc = true]
|
+- ApexFile[@DefiningType = "InnerClassLocations", @RealLoc = true]
|
||||||
+- UserClass[@DefiningType = "InnerClassLocations", @Image = "InnerClassLocations", @InterfaceNames = (), @Nested = false, @RealLoc = true, @SimpleName = "InnerClassLocations", @SuperClassName = ""]
|
+- UserClass[@DefiningType = "InnerClassLocations", @Image = "InnerClassLocations", @InterfaceNames = (), @Nested = false, @RealLoc = true, @SimpleName = "InnerClassLocations", @SuperClassName = ""]
|
||||||
|
Added line: 5047
|
||||||
+- ModifierNode[@Abstract = false, @DefiningType = "InnerClassLocations", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
+- ModifierNode[@Abstract = false, @DefiningType = "InnerClassLocations", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
||||||
+- UserClass[@DefiningType = "InnerClassLocations.bar1", @Image = "bar1", @InterfaceNames = (), @Nested = true, @RealLoc = true, @SimpleName = "bar1", @SuperClassName = ""]
|
+- UserClass[@DefiningType = "InnerClassLocations.bar1", @Image = "bar1", @InterfaceNames = (), @Nested = true, @RealLoc = true, @SimpleName = "bar1", @SuperClassName = ""]
|
||||||
| +- ModifierNode[@Abstract = false, @DefiningType = "InnerClassLocations.bar1", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
| +- ModifierNode[@Abstract = false, @DefiningType = "InnerClassLocations.bar1", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
||||||
@ -8,18 +9,19 @@
|
|||||||
| +- BlockStatement[@CurlyBrace = true, @DefiningType = "InnerClassLocations.bar1", @RealLoc = true]
|
| +- BlockStatement[@CurlyBrace = true, @DefiningType = "InnerClassLocations.bar1", @RealLoc = true]
|
||||||
| +- ExpressionStatement[@DefiningType = "InnerClassLocations.bar1", @RealLoc = true]
|
| +- ExpressionStatement[@DefiningType = "InnerClassLocations.bar1", @RealLoc = true]
|
||||||
| | +- MethodCallExpression[@DefiningType = "InnerClassLocations.bar1", @FullMethodName = "System.out.println", @InputParametersSize = 1, @MethodName = "println", @RealLoc = true]
|
| | +- MethodCallExpression[@DefiningType = "InnerClassLocations.bar1", @FullMethodName = "System.out.println", @InputParametersSize = 1, @MethodName = "println", @RealLoc = true]
|
||||||
|
Added line: 7846
|
||||||
| | +- ReferenceExpression[@DefiningType = "InnerClassLocations.bar1", @Image = "System", @RealLoc = true, @ReferenceType = ReferenceType.METHOD, @SObjectType = false, @SafeNav = false]
|
| | +- ReferenceExpression[@DefiningType = "InnerClassLocations.bar1", @Image = "System", @RealLoc = true, @ReferenceType = ReferenceType.METHOD, @SObjectType = false, @SafeNav = false]
|
||||||
| | +- LiteralExpression[@Boolean = false, @Decimal = false, @DefiningType = "InnerClassLocations.bar1", @Double = false, @Image = "foo", @Integer = false, @LiteralType = LiteralType.STRING, @Long = false, @Name = null, @Null = false, @RealLoc = true, @String = true]
|
| | +- LiteralExpression[@Boolean = false, @Decimal = false, @DefiningType = "InnerClassLocations.bar1", @Double = false, @Image = "foo", @Integer = false, @LiteralType = LiteralType.STRING, @Long = false, @Name = null, @Null = false, @RealLoc = true, @String = true]
|
||||||
| +- ExpressionStatement[@DefiningType = "InnerClassLocations.bar1", @RealLoc = true]
|
| +- ExpressionStatement[@DefiningType = "InnerClassLocations.bar1", @RealLoc = true]
|
||||||
| +- MethodCallExpression[@DefiningType = "InnerClassLocations.bar1", @FullMethodName = "System.out.println", @InputParametersSize = 1, @MethodName = "println", @RealLoc = true]
|
| +- MethodCallExpression[@DefiningType = "InnerClassLocations.bar1", @FullMethodName = "System.out.println", @InputParametersSize = 1, @MethodName = "println", @RealLoc = true]
|
||||||
| +- ReferenceExpression[@DefiningType = "InnerClassLocations.bar1", @Image = "System", @RealLoc = true, @ReferenceType = ReferenceType.METHOD, @SObjectType = false, @SafeNav = false]
|
|
||||||
| +- LiteralExpression[@Boolean = false, @Decimal = false, @DefiningType = "InnerClassLocations.bar1", @Double = false, @Image = "foo", @Integer = false, @LiteralType = LiteralType.STRING, @Long = false, @Name = null, @Null = false, @RealLoc = true, @String = true]
|
| +- LiteralExpression[@Boolean = false, @Decimal = false, @DefiningType = "InnerClassLocations.bar1", @Double = false, @Image = "foo", @Integer = false, @LiteralType = LiteralType.STRING, @Long = false, @Name = null, @Null = false, @RealLoc = true, @String = true]
|
||||||
+- UserClass[@DefiningType = "InnerClassLocations.bar2", @Image = "bar2", @InterfaceNames = (), @Nested = true, @RealLoc = true, @SimpleName = "bar2", @SuperClassName = ""]
|
+- UserClass[@DefiningType = "InnerClassLocations.bar2", @Image = "bar2", @InterfaceNames = (), @Nested = true, @RealLoc = true, @SimpleName = "bar2", @SuperClassName = ""]
|
||||||
+- ModifierNode[@Abstract = false, @DefiningType = "InnerClassLocations.bar2", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
+- ModifierNode[@Abstract = false, @DefiningType = "InnerClassLocations.bar2", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
||||||
+- Method[@Arity = 0, @CanonicalName = "m", @Constructor = false, @DefiningType = "InnerClassLocations.bar2", @Image = "m", @RealLoc = true, @ReturnType = "void", @StaticInitializer = false]
|
+- Method[@Arity = 0, @CanonicalName = "m", @Constructor = false, @DefiningType = "InnerClassLocations.bar2", @Image = "m", @RealLoc = true, @ReturnType = "void", @StaticInitializer = false]
|
||||||
+- ModifierNode[@Abstract = false, @DefiningType = "InnerClassLocations.bar2", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
Added line: 2102
|
||||||
+- BlockStatement[@CurlyBrace = true, @DefiningType = "InnerClassLocations.bar2", @RealLoc = true]
|
+- BlockStatement[@CurlyBrace = true, @DefiningType = "InnerClassLocations.bar2", @RealLoc = true]
|
||||||
+- ExpressionStatement[@DefiningType = "InnerClassLocations.bar2", @RealLoc = true]
|
+- ExpressionStatement[@DefiningType = "InnerClassLocations.bar2", @RealLoc = true]
|
||||||
|
Added line: 1292
|
||||||
| +- MethodCallExpression[@DefiningType = "InnerClassLocations.bar2", @FullMethodName = "System.out.println", @InputParametersSize = 1, @MethodName = "println", @RealLoc = true]
|
| +- MethodCallExpression[@DefiningType = "InnerClassLocations.bar2", @FullMethodName = "System.out.println", @InputParametersSize = 1, @MethodName = "println", @RealLoc = true]
|
||||||
| +- ReferenceExpression[@DefiningType = "InnerClassLocations.bar2", @Image = "System", @RealLoc = true, @ReferenceType = ReferenceType.METHOD, @SObjectType = false, @SafeNav = false]
|
| +- ReferenceExpression[@DefiningType = "InnerClassLocations.bar2", @Image = "System", @RealLoc = true, @ReferenceType = ReferenceType.METHOD, @SObjectType = false, @SafeNav = false]
|
||||||
| +- LiteralExpression[@Boolean = false, @Decimal = false, @DefiningType = "InnerClassLocations.bar2", @Double = false, @Image = "foo", @Integer = false, @LiteralType = LiteralType.STRING, @Long = false, @Name = null, @Null = false, @RealLoc = true, @String = true]
|
| +- LiteralExpression[@Boolean = false, @Decimal = false, @DefiningType = "InnerClassLocations.bar2", @Double = false, @Image = "foo", @Integer = false, @LiteralType = LiteralType.STRING, @Long = false, @Name = null, @Null = false, @RealLoc = true, @String = true]
|
||||||
|
@ -4,13 +4,15 @@
|
|||||||
+- Method[@Arity = 2, @CanonicalName = "leftOrRight", @Constructor = false, @DefiningType = "NullCoalescingOperator", @Image = "leftOrRight", @RealLoc = true, @ReturnType = "String", @StaticInitializer = false]
|
+- Method[@Arity = 2, @CanonicalName = "leftOrRight", @Constructor = false, @DefiningType = "NullCoalescingOperator", @Image = "leftOrRight", @RealLoc = true, @ReturnType = "String", @StaticInitializer = false]
|
||||||
+- ModifierNode[@Abstract = false, @DefiningType = "NullCoalescingOperator", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
+- ModifierNode[@Abstract = false, @DefiningType = "NullCoalescingOperator", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 1, @Override = false, @Private = false, @Protected = false, @Public = true, @RealLoc = true, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
||||||
+- Parameter[@DefiningType = "NullCoalescingOperator", @Image = "leftHand", @RealLoc = true, @Type = "String"]
|
+- Parameter[@DefiningType = "NullCoalescingOperator", @Image = "leftHand", @RealLoc = true, @Type = "String"]
|
||||||
|
Added line: 1222
|
||||||
|
Added line: 3734
|
||||||
|
Added line: 2755
|
||||||
| +- ModifierNode[@Abstract = false, @DefiningType = "NullCoalescingOperator", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 0, @Override = false, @Private = false, @Protected = false, @Public = false, @RealLoc = false, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
| +- ModifierNode[@Abstract = false, @DefiningType = "NullCoalescingOperator", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 0, @Override = false, @Private = false, @Protected = false, @Public = false, @RealLoc = false, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
||||||
+- Parameter[@DefiningType = "NullCoalescingOperator", @Image = "rightHand", @RealLoc = true, @Type = "String"]
|
+- Parameter[@DefiningType = "NullCoalescingOperator", @Image = "rightHand", @RealLoc = true, @Type = "String"]
|
||||||
| +- ModifierNode[@Abstract = false, @DefiningType = "NullCoalescingOperator", @DeprecatedTestMethod = false, @Final = false, @Global = false, @InheritedSharing = false, @Modifiers = 0, @Override = false, @Private = false, @Protected = false, @Public = false, @RealLoc = false, @Static = false, @Test = false, @TestOrTestSetup = false, @Transient = false, @Virtual = false, @WebService = false, @WithSharing = false, @WithoutSharing = false]
|
|
||||||
+- BlockStatement[@CurlyBrace = true, @DefiningType = "NullCoalescingOperator", @RealLoc = true]
|
|
||||||
+- ReturnStatement[@DefiningType = "NullCoalescingOperator", @RealLoc = true]
|
+- ReturnStatement[@DefiningType = "NullCoalescingOperator", @RealLoc = true]
|
||||||
+- BinaryExpression[@DefiningType = "NullCoalescingOperator", @Op = BinaryOperator.NULL_COALESCING, @RealLoc = true]
|
+- BinaryExpression[@DefiningType = "NullCoalescingOperator", @Op = BinaryOperator.NULL_COALESCING, @RealLoc = true]
|
||||||
+- VariableExpression[@DefiningType = "NullCoalescingOperator", @Image = "leftHand", @RealLoc = true]
|
+- VariableExpression[@DefiningType = "NullCoalescingOperator", @Image = "leftHand", @RealLoc = true]
|
||||||
| +- EmptyReferenceExpression[@DefiningType = null, @RealLoc = false]
|
| +- EmptyReferenceExpression[@DefiningType = null, @RealLoc = false]
|
||||||
+- VariableExpression[@DefiningType = "NullCoalescingOperator", @Image = "rightHand", @RealLoc = true]
|
+- VariableExpression[@DefiningType = "NullCoalescingOperator", @Image = "rightHand", @RealLoc = true]
|
||||||
+- EmptyReferenceExpression[@DefiningType = null, @RealLoc = false]
|
+- EmptyReferenceExpression[@DefiningType = null, @RealLoc = false]
|
||||||
|
Added line: 8923
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user