2020-11-14 09:20:07 +00:00
<!DOCTYPE html>
< html >
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< meta name = "description" content = "" >
< meta name = "keywords" content = "devdocs, " >
< title > Roadmap | PMD Source Code Analyzer< / title >
2023-04-28 11:49:15 +00:00
< link rel = "stylesheet" type = "text/css" href = "assets/fontawesome-free-5.15.4-web/css/all.min.css" >
2023-03-03 20:15:41 +00:00
< link rel = "stylesheet" type = "text/css" href = "assets/bootstrap-4.5.2-dist/css/bootstrap.min.css" >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< link rel = "stylesheet" type = "text/css" href = "css/syntax.css" >
< link rel = "stylesheet" type = "text/css" href = "css/modern-business.css" >
< link rel = "stylesheet" type = "text/css" href = "css/customstyles.css" >
< link rel = "stylesheet" type = "text/css" href = "css/theme-green.css" >
< link rel = "stylesheet" type = "text/css" href = "css/pmd-customstyles.css" >
2020-11-14 09:20:07 +00:00
2023-04-28 11:49:15 +00:00
< link rel = "shortcut icon" href = "images/logo/favicon.ico" type = "image/x-icon" >
< link rel = "icon" href = "images/logo/favicon.ico" type = "image/x-icon" >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< link rel = "alternate" type = "application/rss+xml" title = "" href = "feed.xml" >
2020-11-14 09:20:07 +00:00
< / head >
< body >
<!-- Content is offset by the height of the topnav bar. -->
<!-- There's already a padding - top rule in modern - business.css, but it apparently doesn't work on Firefox 60 and Chrome 67 -->
< div id = "topbar-content-offset" >
<!-- Navigation -->
2023-03-03 20:15:41 +00:00
< nav class = "navbar navbar-expand-lg fixed-top navbar-dark" >
2020-11-14 09:20:07 +00:00
< div class = "container topnavlinks" >
2023-03-03 20:15:41 +00:00
< a class = "navbar-brand fas fa-home fa-lg" href = "index.html" > < span class = "projectTitle" > PMD Source Code Analyzer Project< / span > < / a >
< button class = "navbar-toggler" type = "button" data-toggle = "collapse" data-target = "#navbarSupportedContent" aria-controls = "navbarSupportedContent" aria-expanded = "false" aria-label = "Toggle navigation" >
< span class = "navbar-toggler-icon" > < / span >
< / button >
< div class = "collapse navbar-collapse" id = "navbarSupportedContent" >
< ul class = "navbar-nav mr-auto mt-2 mt-lg-0" > < / ul >
< ul class = "navbar-nav" >
2020-11-14 09:20:07 +00:00
<!-- toggle sidebar button -->
2023-03-03 20:15:41 +00:00
< li class = "nav-item" > < a id = "tg-sb-link" class = "nav-link" href = "#" > < i id = "tg-sb-icon" class = "fas fa-toggle-on" > < / i > Nav< / a > < / li >
2020-11-14 09:20:07 +00:00
<!-- entries without drop - downs appear here -->
2023-03-03 20:15:41 +00:00
< li class = "nav-item" > < a class = "nav-link" href = "https://github.com/pmd/pmd/releases/latest" target = "_blank" > Download< / a > < / li >
< li class = "nav-item" > < a class = "nav-link" href = "https://github.com/pmd/pmd" target = "_blank" > Fork us on github< / a > < / li >
2020-11-14 09:20:07 +00:00
<!-- entries with drop - downs appear here -->
<!-- conditional logic to control which topnav appears for the audience defined in the configuration file. -->
< / ul >
2023-03-03 20:15:41 +00:00
< form class = "form-inline my-2 my-lg-0" >
< input class = "form-control mr-sm-2" type = "search" placeholder = "search..." id = "search-input" >
< ul id = "results-container" > < / ul >
< / form >
2020-11-14 09:20:07 +00:00
< / div >
2023-03-03 20:15:41 +00:00
< / div >
2020-11-14 09:20:07 +00:00
< / nav >
<!-- Page Content -->
2022-02-25 09:51:51 +00:00
< div class = "container-toc-wrapper" >
< div class = "container" >
< div class = "col-lg-12" > < / div >
<!-- Content Row -->
< div class = "row" >
2020-11-14 09:20:07 +00:00
2022-02-25 09:51:51 +00:00
<!-- Sidebar Column -->
< div class = "col-md-3" id = "tg-sb-sidebar" >
2020-11-14 09:20:07 +00:00
< ul id = "mysidebar" class = "nav" >
2024-10-25 08:59:30 +00:00
< li class = "sidebarTitle" > PMD 7.8.0-SNAPSHOT< / li >
< div class = "sidebarTitleDate" > Release date: 29-November-2024< / div >
2020-11-14 09:20:07 +00:00
< li >
< a href = "#" > About< / a >
< ul >
< li > < a href = "index.html" > Home< / a > < / li >
2023-03-23 09:46:34 +00:00
< li > < a href = "pmd_release_notes.html" > Release notes< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-03-23 09:46:34 +00:00
< li > < a href = "pmd_release_notes_pmd7.html" > Release notes (PMD 7)< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_about_help.html" > Getting help< / a > < / li >
2024-06-20 14:27:53 +00:00
< li > < a href = "pmd_about_release_policies.html" > Release policies< / a > < / li >
< li > < a href = "pmd_about_support_lifecycle.html" > Support lifecycle< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li >
< a href = "#" > User Documentation< / a >
< ul >
2023-08-31 14:51:16 +00:00
< li > < a href = "pmd_userdocs_migrating_to_pmd7.html" > Migration Guide for PMD 7< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_userdocs_installation.html" > Installation and basic CLI usage< / a > < / li >
< li > < a href = "pmd_userdocs_making_rulesets.html" > Making rulesets< / a > < / li >
< li > < a href = "pmd_userdocs_configuring_rules.html" > Configuring rules< / a > < / li >
< li > < a href = "pmd_userdocs_best_practices.html" > Best practices< / a > < / li >
< li > < a href = "pmd_userdocs_suppressing_warnings.html" > Suppressing warnings< / a > < / li >
< li > < a href = "pmd_userdocs_incremental_analysis.html" > Incremental analysis< / a > < / li >
< li > < a href = "pmd_userdocs_cli_reference.html" > PMD CLI reference< / a > < / li >
< li > < a href = "pmd_userdocs_report_formats.html" > PMD Report formats< / a > < / li >
2022-09-29 15:04:50 +00:00
< li > < a href = "pmd_userdocs_3rdpartyrulesets.html" > 3rd party rulesets< / a > < / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > CPD reference< / a >
< ul >
< li > < a href = "pmd_userdocs_cpd.html" > Copy-paste detection< / a > < / li >
< li > < a href = "pmd_userdocs_cpd_report_formats.html" > CPD Report formats< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Extending PMD< / a >
< ul >
< li > < a href = "pmd_userdocs_extending_writing_rules_intro.html" > Introduction to writing rules< / a > < / li >
< li > < a href = "pmd_userdocs_extending_your_first_rule.html" > Your first rule< / a > < / li >
< li > < a href = "pmd_userdocs_extending_writing_xpath_rules.html" > XPath rules< / a > < / li >
< li > < a href = "pmd_userdocs_extending_writing_java_rules.html" > Java rules< / a > < / li >
< li > < a href = "pmd_userdocs_extending_designer_reference.html" > Rule designer reference< / a > < / li >
< li > < a href = "pmd_userdocs_extending_defining_properties.html" > Defining rule properties< / a > < / li >
< li > < a href = "pmd_userdocs_extending_rule_guidelines.html" > Rule guidelines< / a > < / li >
< li > < a href = "pmd_userdocs_extending_testing.html" > Testing your rules< / a > < / li >
2024-02-09 17:22:16 +00:00
< li > < a href = "pmd_userdocs_extending_ast_dump.html" > Creating (XML) dump of the AST< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Tools / Integrations< / a >
< ul >
< li > < a href = "pmd_userdocs_tools_maven.html" > Maven PMD Plugin< / a > < / li >
< li > < a href = "pmd_userdocs_tools_gradle.html" > Gradle< / a > < / li >
< li > < a href = "pmd_userdocs_tools_ant.html" > Ant< / a > < / li >
< li > < a href = "pmd_userdocs_tools_java_api.html" > PMD Java API< / a > < / li >
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_userdocs_tools_bld.html" > bld PMD Extension< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_userdocs_tools_ci.html" > CI integrations< / a > < / li >
< li > < a href = "pmd_userdocs_tools.html" > Other Tools / Integrations< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li >
< a href = "#" > Rule Reference< / a >
< ul >
< li class = "subfolders" >
< a href = "#" > Apex Rules< / a >
< ul >
< li > < a href = "pmd_rules_apex.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_apex_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_apex_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_apex_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_apex_documentation.html" > Documentation< / a > < / li >
< li > < a href = "pmd_rules_apex_errorprone.html" > Error Prone< / a > < / li >
< li > < a href = "pmd_rules_apex_performance.html" > Performance< / a > < / li >
< li > < a href = "pmd_rules_apex_security.html" > Security< / a > < / li >
< / ul >
< / li >
2022-04-28 13:34:56 +00:00
< li class = "subfolders" >
< a href = "#" > HTML Rules< / a >
< ul >
< li > < a href = "pmd_rules_html.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_html_bestpractices.html" > Best Practices< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > Java Rules< / a >
< ul >
< li > < a href = "pmd_rules_java.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_java_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_java_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_java_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_java_documentation.html" > Documentation< / a > < / li >
< li > < a href = "pmd_rules_java_errorprone.html" > Error Prone< / a > < / li >
< li > < a href = "pmd_rules_java_multithreading.html" > Multithreading< / a > < / li >
< li > < a href = "pmd_rules_java_performance.html" > Performance< / a > < / li >
< li > < a href = "pmd_rules_java_security.html" > Security< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Java Server Pages Rules< / a >
< ul >
< li > < a href = "pmd_rules_jsp.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_jsp_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_jsp_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_jsp_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_jsp_errorprone.html" > Error Prone< / a > < / li >
< li > < a href = "pmd_rules_jsp_security.html" > Security< / a > < / li >
< / ul >
< / li >
2023-03-03 20:15:41 +00:00
< li class = "subfolders" >
< a href = "#" > JavaScript Rules< / a >
< ul >
< li > < a href = "pmd_rules_ecmascript.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_ecmascript_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_ecmascript_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_ecmascript_errorprone.html" > Error Prone< / a > < / li >
2024-08-29 16:28:37 +00:00
< li > < a href = "pmd_rules_ecmascript_performance.html" > Performance< / a > < / li >
2023-03-03 20:15:41 +00:00
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Kotlin Rules< / a >
< ul >
< li > < a href = "pmd_rules_kotlin.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_kotlin_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_kotlin_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > Maven POM Rules< / a >
< ul >
< li > < a href = "pmd_rules_pom.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_pom_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Modelica Rules< / a >
< ul >
< li > < a href = "pmd_rules_modelica.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_modelica_bestpractices.html" > Best Practices< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > PLSQL Rules< / a >
< ul >
< li > < a href = "pmd_rules_plsql.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_plsql_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_plsql_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_plsql_design.html" > Design< / a > < / li >
< li > < a href = "pmd_rules_plsql_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
2023-10-20 00:49:52 +00:00
< a href = "#" > Salesforce Visualforce Rules< / a >
2020-11-14 09:20:07 +00:00
< ul >
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_visualforce.html" > Index< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_visualforce_security.html" > Security< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
2022-11-18 15:25:16 +00:00
< li class = "subfolders" >
< a href = "#" > Scala Rules< / a >
< ul >
< li > < a href = "pmd_rules_scala.html" > Index< / a > < / li >
< / ul >
< / li >
2023-03-03 20:15:41 +00:00
< li class = "subfolders" >
< a href = "#" > Swift Rules< / a >
< ul >
< li > < a href = "pmd_rules_swift.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_swift_bestpractices.html" > Best Practices< / a > < / li >
< li > < a href = "pmd_rules_swift_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
2023-10-20 00:49:52 +00:00
< a href = "#" > Velocity Template Language (VTL) Rules< / a >
2020-11-14 09:20:07 +00:00
< ul >
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity.html" > Index< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity_bestpractices.html" > Best Practices< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity_design.html" > Design< / a > < / li >
2020-11-14 09:20:07 +00:00
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_rules_velocity_errorprone.html" > Error Prone< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
2022-11-18 15:25:16 +00:00
< li class = "subfolders" >
< a href = "#" > WSDL Rules< / a >
< ul >
< li > < a href = "pmd_rules_wsdl.html" > Index< / a > < / li >
< / ul >
< / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > XML Rules< / a >
< ul >
< li > < a href = "pmd_rules_xml.html" > Index< / a > < / li >
2023-10-19 09:25:45 +00:00
< li > < a href = "pmd_rules_xml_bestpractices.html" > Best Practices< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_rules_xml_errorprone.html" > Error Prone< / a > < / li >
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > XSL Rules< / a >
< ul >
< li > < a href = "pmd_rules_xsl.html" > Index< / a > < / li >
< li > < a href = "pmd_rules_xsl_codestyle.html" > Code Style< / a > < / li >
< li > < a href = "pmd_rules_xsl_performance.html" > Performance< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< li >
2023-03-03 20:15:41 +00:00
< a href = "#" > Language-Specific Documentation< / a >
2020-11-14 09:20:07 +00:00
< ul >
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_index.html" > Overview< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_configuration.html" > Language configuration< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_apex.html" > Apex< / a > < / li >
2022-03-27 15:04:13 +00:00
2023-03-03 20:15:41 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_cpp.html" > C/C++< / a > < / li >
< li > < a href = "pmd_languages_cs.html" > C#< / a > < / li >
< li > < a href = "pmd_languages_coco.html" > Coco< / a > < / li >
< li > < a href = "pmd_languages_dart.html" > Dart< / a > < / li >
< li > < a href = "pmd_languages_fortran.html" > Fortran< / a > < / li >
< li > < a href = "pmd_languages_gherkin.html" > Gherkin< / a > < / li >
< li > < a href = "pmd_languages_go.html" > Go< / a > < / li >
< li > < a href = "pmd_languages_html.html" > HTML< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_java.html" > Java< / a > < / li >
2022-03-27 15:04:13 +00:00
2023-04-29 14:37:59 +00:00
< li > < a href = "pmd_languages_js_ts.html" > JavaScript / TypeScript< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_jsp.html" > JSP< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_julia.html" > Julia< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_languages_kotlin.html" > Kotlin< / a > < / li >
2020-11-14 09:20:07 +00:00
2021-03-26 08:22:23 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_lua.html" > Lua< / a > < / li >
< li > < a href = "pmd_languages_matlab.html" > Matlab< / a > < / li >
< li > < a href = "pmd_languages_modelica.html" > Modelica< / a > < / li >
< li > < a href = "pmd_languages_objectivec.html" > Objective-C< / a > < / li >
< li > < a href = "pmd_languages_perl.html" > Perl< / a > < / li >
< li > < a href = "pmd_languages_php.html" > PHP< / a > < / li >
2021-03-26 08:22:23 +00:00
< li > < a href = "pmd_languages_plsql.html" > PLSQL< / a > < / li >
2021-10-29 17:50:40 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_python.html" > Python< / a > < / li >
2022-04-28 13:34:56 +00:00
2022-07-01 07:55:16 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_ruby.html" > Ruby< / a > < / li >
2022-07-01 07:55:16 +00:00
2023-04-29 16:54:57 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_scala.html" > Scala< / a > < / li >
2023-04-29 16:54:57 +00:00
2023-05-19 09:58:17 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_swift.html" > Swift< / a > < / li >
2023-10-20 00:42:49 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_tsql.html" > T-SQL< / a > < / li >
2023-10-20 00:42:49 +00:00
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_visualforce.html" > Visualforce< / a > < / li >
2024-03-04 19:16:42 +00:00
< li > < a href = "pmd_languages_velocity.html" > Velocity Template Language (VTL)< / a > < / li >
2023-10-20 00:49:52 +00:00
< li > < a href = "pmd_languages_xml.html" > XML and XML dialects< / a > < / li >
2023-05-19 09:58:17 +00:00
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li >
< a href = "#" > Developer Documentation< / a >
< ul >
< li > < a href = "pmd_devdocs_development.html" > Developer resources< / a > < / li >
< li > < a href = "pmd_devdocs_building.html" > Building PMD from source< / a > < / li >
2024-09-26 14:58:11 +00:00
< li > < a href = "https://github.com/pmd/pmd/blob/main/CONTRIBUTING.md" target = "_blank" > Contributing< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_devdocs_writing_documentation.html" > Writing documentation< / a > < / li >
< li class = "active" > < a href = "pmd_devdocs_roadmap.html" > Roadmap< / a > < / li >
< li > < a href = "pmd_devdocs_how_pmd_works.html" > How PMD works< / a > < / li >
< li > < a href = "pmd_devdocs_pmdtester.html" > Pmdtester< / a > < / li >
< li > < a href = "pmd_devdocs_rule_deprecation_policy.html" > Rule Deprecation Policy< / a > < / li >
< li class = "subfolders" >
< a href = "#" > Major contributions< / a >
< ul >
2021-08-27 14:58:36 +00:00
< li > < a href = "pmd_devdocs_major_rule_guidelines.html" > Rule Guidelines< / a > < / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_devdocs_major_adding_new_language_javacc.html" > Adding a new language (JavaCC)< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-04-20 15:12:02 +00:00
< li > < a href = "pmd_devdocs_major_adding_new_language_antlr.html" > Adding a new language (ANTLR)< / a > < / li >
2020-11-14 09:20:07 +00:00
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_devdocs_major_adding_new_cpd_language.html" > Adding a new CPD language< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< li class = "subfolders" >
< a href = "#" > Experimental features< / a >
< ul >
2023-10-20 00:49:52 +00:00
< li > < a href = "tag_experimental.html" > List of experimental Features< / a > < / li >
2020-11-14 09:20:07 +00:00
< / ul >
< / li >
< / ul >
< / li >
< li >
< a href = "#" > Project documentation< / a >
< ul >
< li class = "subfolders" >
< a href = "#" > Trivia about PMD< / a >
< ul >
< li > < a href = "pmd_projectdocs_trivia_news.html" > PMD in the press< / a > < / li >
< li > < a href = "pmd_projectdocs_trivia_products.html" > Products & books related to PMD< / a > < / li >
< li > < a href = "pmd_projectdocs_trivia_similarprojects.html" > Similar projects< / a > < / li >
< li > < a href = "pmd_projectdocs_trivia_meaning.html" > What does 'PMD' mean?< / a > < / li >
< / ul >
< / li >
2023-03-03 20:15:41 +00:00
< li > < a href = "pmd_projectdocs_logo.html" > Logo< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_projectdocs_faq.html" > FAQ< / a > < / li >
< li > < a href = "license.html" > License< / a > < / li >
< li > < a href = "pmd_projectdocs_credits.html" > Credits< / a > < / li >
< li > < a href = "pmd_release_notes_old.html" > Old release notes< / a > < / li >
2022-09-30 10:03:06 +00:00
< li > < a href = "pmd_projectdocs_decisions.html" > Decisions< / a > < / li >
2020-11-14 09:20:07 +00:00
< li class = "subfolders" >
< a href = "#" > Project management< / a >
< ul >
2021-04-23 20:35:51 +00:00
< li > < a href = "pmd_projectdocs_committers_infrastructure.html" > Infrastructure< / a > < / li >
2020-11-14 09:20:07 +00:00
< li > < a href = "pmd_projectdocs_committers_releasing.html" > Release process< / a > < / li >
< li > < a href = "pmd_projectdocs_committers_merging_pull_requests.html" > Merging pull requests< / a > < / li >
< li > < a href = "pmd_projectdocs_committers_main_landing_page.html" > Main Landing page< / a > < / li >
< / ul >
< / li >
< / ul >
< / li >
< / ul >
2022-02-25 09:51:51 +00:00
< / div >
2020-11-14 09:20:07 +00:00
2022-02-25 09:51:51 +00:00
<!-- Content Column -->
< div class = "col-md-9" id = "tg-sb-content" >
2022-03-24 11:42:13 +00:00
< header >
< div class = "row" >
< div class = "col-lg-12" >
< a href = "./" role = "button"
>< i class = "fa fa-home fa-lg" > < /i
>< / a >
» Roadmap
< a
target="_blank"
2024-09-26 14:58:11 +00:00
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/devdocs/roadmap.md"
2023-03-03 20:15:41 +00:00
class="float-right"
2022-03-24 11:42:13 +00:00
role="button"
2023-03-16 10:46:54 +00:00
>< i class = "fab fa-github fa-lg" > < / i > Edit on GitHub< /a
2022-03-24 11:42:13 +00:00
>
< / div >
< / div >
< hr / >
< / header >
< div class = "post-header" >
2020-11-14 09:20:07 +00:00
< h1 class = "post-title-main" > Roadmap< / h1 >
< / div >
2024-09-26 14:58:11 +00:00
< div class = "post-content" data-github-edit-url = "https://github.com/pmd/pmd/blob/main/docs/pages/pmd/devdocs/roadmap.md" >
2020-11-14 09:20:07 +00:00
2023-08-22 15:14:23 +00:00
< details id = "inline-toc-details" >
< summary > Table of Contents< / summary >
< div id = "inline-toc" > <!-- empty, move TOC here when screen size too small --> < / div >
< / details >
2023-03-03 20:15:41 +00:00
2020-11-14 09:20:07 +00:00
< p > TODO:< / p >
< ul >
< li > Update< / li >
< li > Future direction< / li >
< li > projects, plans< / li >
< li > Google Summer of Code< / li >
< / ul >
< h1 id = "future-directions" > Future directions< / h1 >
< p > Want to know what’ s coming? Or, better, wanna contribute ? Here is the page listing what are our plans -
when we have ones, for the future of PMD. It also give you hints at part of the code we would like to clean -
that you may want to clean to contribute to the project!< / p >
< p > Of course, an easy way to contribute is too check out the < a href = "https://github.com/pmd/pmd/issues" > bug tracker< / a > and see if you can fix some issues -
some could be quite easy, we simply have not the time to look at them all!< / p >
< p > At last, if you want to contribute, register on the < a href = "https://sourceforge.net/projects/pmd/lists/pmd-devel" > pmd-devel< / a > mailing list, and come discuss with us!< / p >
< h2 id = "roadmap" > Roadmap< / h2 >
< p > This roadmap contains all the different ‘ workshops’ PMD’ s developers are working right now.< / p >
< ul >
< li > < strong > Better symbol analysis< / strong > : See below.< / li >
< li > < strong > Data Flow Analysis< / strong > : See below.< / li >
< li > < strong > Code Cleanups< / strong > : See below.< / li >
< / ul >
< p > < em > Please note that, of course, there is no warranty about when those ‘ features’ will be finished, if they ever are.< / em > < / p >
< h2 id = "better-symbol-analysis" > Better symbol analysis< / h2 >
< p > 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,
because it’ ll require parsing of class files. Lots of work here.< / p >
< h2 id = "data-flow-analysis-dfa" > Data flow analysis (DFA)< / h2 >
< p > Raik Schroeder, a graduate student at < a href = "http://www.fh-stralsund.de/" > Fachhochschule Stralsund< / a > has written a DFA layer that should enable
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 < code class = "language-plaintext highlighter-rouge" > net.sourceforge.pmd.dfa< / code > packages, and we’ re going through it now figuring out what rules we can write
that use it. We should be able to use it to simplify some current rules, as well.< / p >
< h2 id = "other-changes-well-like-to-see" > Other changes we’ ll like to see…< / h2 >
< p > < strong > These are things which really should be done, but just haven’ t been gotten to yet:< / strong > < / p >
< ul >
< li > Enhance Rule Designer to allow testing of the violation suppress Regex and XPath.< / li >
< li > Remove the type resolution specific rules. Merge these back into the
standard rules. In general, a Rule should use TR when it can, and fall
back on non-TR approach otherwise. No need for separate Rules for TR/non-TR.< / li >
< li > 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.< / li >
< li > Need a JUnit test to check for “dead” Rules, that is those not used by any RuleSet.< / li >
< li > Rule JUnit tests should verify the Test class follows expected naming
conventions just like the Rules need to.< / li >
< li > Do we have a rule to style check for multiple declarations and chained
assignments? (e.g. int a, b; int a = b = x;)< / li >
< / ul >
< p > < strong > These are food for thought, perhaps future items. If you think you’ d like to
work on one of these, check with pmd-devel to see what the current thoughts
on the topic.< / strong > < / p >
< ul >
< li >
< p > 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.
Otherwise, drive CPD behavior based off of core PMD, instead of duplicating
some logic.< / p >
< / li >
< li >
< p > Need a more flexible and powerful scheme for classifying files to various
Languages. At a minimum, should have the ability to specify which
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
hooks into the LanguageVersionDiscoverer process for classifying a
File/String to a LanguageVersion of a specific Language, one could imaging
using a ‘ magic’ system like Unix uses to tell different versions of files
apart based on actual content.< / p >
< / li >
< li >
< p > Should we change Node interface to something like ‘ Node< T extends Node< T> > ’ ,
and then declare the language specific node interfaces to be something like
‘ JavaNode extends Node< JavaNode> ’ ? This could allow anything on the Node
interface to return the language specific node type instead of generic
node. For example, ASTStatement.jjtGetParent() to return a JavaNode,
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
the Node interface with properly with generics, worth the omission of
occasional some casting?< / p >
< / li >
< li >
< p > 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 rules. Stating that certain XML rules also can map to the JSP language
extensions could be useful. This means Source file to LanguageVersion
mapping is not 1-1, but 1-many, we’ d need to deal with this accordingly.< / p >
< / li >
< li >
< p > Additional changes to Rule organization within RuleSets as discussed on
< a href = "http://sourceforge.net/p/pmd/discussion/188194/thread/b840897c" > this forum thread< / a > .< / p >
< / li >
< li >
< p > Figure out a way to allow Rules to deal with parentheses and blocks, which
introduce certain repetitive (and generally ignorable for most Rules)
structures into the AST tree. Some rules are making special effort
(e.g. ConfusingTernaryRule) to detect these AST patterns. Perhaps a
“normalized” AST structure can be created which will make the AST appear
consistent regardless of how many parens are presented, or how many blocks
have been created (e.g. default block inserted, duplicates collapsed).
This should be configurable on per Rule basis similar to TR and SymbolTable.< / p >
< / li >
< / ul >
< h2 id = "code-cleanups" > Code cleanups< / h2 >
< p > Some of the code is a bit sloppy:< / p >
< ul >
< li > RuleSetFactory is a mess. It needs to be refactored into something that has layers, or decorators, or something.< / li >
< li > Cleanups would be welcome for ConstructorCallsOverridableMethod and DoubleCheckedLocking< / li >
< li > The Designer GUI is a bit messed up; the bottom panes look funny.< / li >
< li > The grammar has some odd bits:
< ul >
< li > BlockStatement has an odd hack for class definitions inside methods< / li >
< li > enumLookahead() seems like a bit of overkill, can it use Modifiers somehow?< / li >
< li > The whole “discardable node” thing seems wasteful< / li >
< li > Does ExtendsList need that ‘ extendsMoreThanOne’ thing?< / li >
< li > ClassOrInterfaceBodyDeclaration has a monstrous lookahead to check for enums< / li >
< li > ClassOrInterfaceType gloms together dotted names… is that the right thing to do?< / li >
< li > Some complicated annotations are currently broken< / li >
< / ul >
< / li >
< / ul >
< div class = "tags" >
< b > Tags: < / b >
2023-03-03 20:15:41 +00:00
< a href = "tag_devdocs.html" class = "btn btn-outline-secondary navbar-btn cursorNorm" role = "button" > devdocs< / a >
2020-11-14 09:20:07 +00:00
< / div >
< / div >
< footer >
2022-03-24 11:42:13 +00:00
< hr / >
< div >
This documentation is written in markdown. < br / >
If there is something missing or can be improved, edit this page on
github and create a PR:
< a
target="_blank"
2024-09-26 14:58:11 +00:00
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/devdocs/roadmap.md"
2022-03-24 11:42:13 +00:00
role="button"
2023-04-19 03:50:18 +00:00
>< i class = "fab fa-github fa-lg" > < / i > Edit on GitHub< /a
2022-03-24 11:42:13 +00:00
>
< / div >
< hr / >
< div class = "row" >
< div class = "col-lg-12 footer" >
2024-01-05 14:22:28 +00:00
© 2024 PMD Open Source Project. All rights
2022-03-24 11:42:13 +00:00
reserved. < br / >
2024-11-21 14:49:47 +00:00
Site last generated: Nov 21, 2024 < br / >
2022-03-24 11:42:13 +00:00
< p >
2023-03-03 20:15:41 +00:00
< img src = "images/logo/pmd-logo-70px.png" alt = "PMD
2022-03-24 11:42:13 +00:00
logo"/>
< / p >
< / div >
< / div >
2020-11-14 09:20:07 +00:00
< / footer >
2022-02-25 09:51:51 +00:00
< / div >
<!-- /.row -->
2020-11-14 09:20:07 +00:00
< / div >
2022-02-25 09:51:51 +00:00
<!-- /.container -->
< / div >
<!-- Sticky TOC column -->
< div class = "toc-col" >
2022-03-24 11:42:13 +00:00
< div id = "toc" > < / div >
2020-11-14 09:20:07 +00:00
< / div >
2022-02-25 09:51:51 +00:00
<!-- /.toc - container - wrapper -->
2020-11-14 09:20:07 +00:00
< / div >
< / div >
2023-03-03 20:15:41 +00:00
< script type = "application/javascript" src = "assets/jquery-3.5.1/jquery-3.5.1.min.js" > < / script >
< script type = "application/javascript" src = "assets/anchorjs-4.2.2/anchor.min.js" > < / script >
< script type = "application/javascript" src = "assets/navgoco-0.2.1/src/jquery.navgoco.min.js" > < / script >
< script type = "application/javascript" src = "assets/bootstrap-4.5.2-dist/js/bootstrap.bundle.min.js" > < / script >
< script type = "application/javascript" src = "assets/Simple-Jekyll-Search-1.0.8/dest/jekyll-search.js" > < / script >
< script type = "application/javascript" src = "assets/jekyll-table-of-contents/toc.js" > < / script >
< script type = "application/javascript" src = "js/tabstate.js" > < / script >
< script type = "application/javascript" src = "js/customscripts.js" > < / script >
< / body >
2020-11-14 09:20:07 +00:00
< / html >