The API of PMD has been growing over the years and needed some cleanup. The goal is, to have a clear separation between a well-defined API and the implementation, which is internal. This should help us in future development.
Until PMD 7.0.0, all released public members and types were implicitly considered part of public PMD API, including inheritance-specific members (protected members, abstract methods). We have maintained those APIs with the goal to preserve full binary compatibility between minor releases, only breaking those APIs infrequently, for major releases.
PMD is used and integrated in many different tools such as IDE plugins or build plugins. These plugins use our public API and rely on it being stable, hence we tried to break it only infrequently.
In order to allow PMD to move forward at a faster pace, this implicit contract will be invalidated with PMD 7.0.0 and onwards. We now introduce more fine-grained distinctions between the type of compatibility support we guarantee for our libraries, and ways to make them explicit to clients of PMD.
The actual API development and marking some part of the API as internal or add new API is an ongoing task, that will need to be done everytime. We wonât just define an API and then are done with it. The API will change as new features want to be implemented.
This decision document aims to document principles and guidelines that are used for PMD development.
Decision Semantic VersioningPMD and all its modules are versioned together. PMD uses Semantic Versioning 2.0.0. This means, that each PMD version consists of MAJOR.MINOR.PATCH components:
Additional labels for release candidates might be used.
Incompatible API changes shouldnât be introduced lightly. See FAQ: If even the tiniest backward incompatible changes to the public API require a major version bump, wonât I end up at version 42.0.0 very rapidly?.
Project structure and Java base packages namesPMD is mainly developed in the Java programming language. The build tool is Maven and the PMD build consists of several maven modules.
net.sourceforge.pmd
. There are many different sub packages.pmd-core
uses directly the base package as the only module. All other modules must use specific sub packages.net.sourceforge.pmd.lang.<language id>
. E.g. pmd-java
uses the package net.sourceforge.pmd.lang.java
.net.sourceforge.pmd.<module>
, E.g. pmd-cli
uses the package net.sourceforge.pmd.cli
.Public API is
Not public API is
internal
and impl
All packages are considered to be public API by default, with two exceptions:
Any package that contains an internal
segment is considered internal. E.g. net.sourceforge.pmd.internal
. Internal API is meant for use only by the main PMD codebase. Internal types and methods may be modified in any way, or even removed, at any time without a MAJOR version change.
The @InternalApi
annotation will be used for types that have to live outside of these packages, e.g. methods of a public type that shouldnât be used outside PMD (again, these can be removed anytime).
Any package that contains an impl
segment is considered internal. E.g. net.sourceforge.pmd.lang.impl
. These packages contain base classes that are needed for extending PMD (like adding a new language). These can change at any time without a MAJOR version change.
In a later version, the impl
packages could be promoted as a public API for implementing new languages for PMD outside the main monorepo. In that sense, e.g. the module pmd-java
is allowed to depend on impl
packages of pmd-core
, but ideally it doesnât depend on internal
packages of pmd-core
(or any other module). However, for now, the impl
packages are explicitly considered internal until this decision is revised.
@Deprecated
annotation.@Experimental
at the class or method level.@Experimental
annotation are subject to change and are considered not stable. They can be modified in any way, or even removed, at any time. You should not use or rely on them in any production code. They are purely to allow broad testing and feedback.AST classes of the individual language modules are used by custom rule implementations and are considered Public API in general. Rules only read the AST and do not need to modify it.
In order to minimize the public API surface of AST classes, the following guidelines apply:
Non-concrete AST classes (like base classes or common interfaces) should follow similar guidelines:
@InternalApi
(net.sourceforge.pmd.annotation.InternalApi
)
This annotation is used for API members that are not publicly supported API but have to live in public packages (outside internal
packages). Such members may be removed, renamed, moved, or otherwise broken at any time and should not be relied upon outside the main PMD codebase.
@Experimental
(net.sourceforge.pmd.annotation.Experimental
)
API members marked with the @Experimental
annotation at the class or method level are subject to change. It is an indication that the feature is in experimental, unstable state. The API members can be modified in any way, or even removed, at any time, without warning. You should not use or rely on them in any production code. They are purely to allow broad testing and feedback.
@Deprecated
(java.lang.Deprecated
)
API members marked with the @Deprecated
annotation at the class or method level will remain supported until the next major release, but it is recommended to stop using them. These members might be removed with the next MAJOR release.
Accepted (Last updated: February 2024)
Consequences2024-02-01: Changed status to âAcceptedâ. (#4756)
2023-12-01: Proposed initial version.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4