pmd/pmd_userdocs_extending_writing_xpath_rules.html

3091 lines
94 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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="This page describes XPath rule support in more details">
<meta name="keywords" content="extendinguserdocs, ">
<title>Writing XPath rules | PMD Source Code Analyzer</title>
<link rel="stylesheet" type="text/css" href="assets/fontawesome-free-5.15.4-web/css/all.min.css">
<link rel="stylesheet" type="text/css" href="assets/bootstrap-4.5.2-dist/css/bootstrap.min.css">
<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">
<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">
<link rel="alternate" type="application/rss+xml" title="" href="feed.xml">
</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 -->
<nav class="navbar navbar-expand-lg fixed-top navbar-dark">
<div class="container topnavlinks">
<a class="navbar-brand fas fa-home fa-lg" href="index.html">&nbsp;<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">
<!-- toggle sidebar button -->
<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>
<!-- entries without drop-downs appear here -->
<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>
<!-- entries with drop-downs appear here -->
<!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
</ul>
<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>
</div>
</div>
</nav>
<!-- Page Content -->
<div class="container-toc-wrapper">
<div class="container">
<div class="col-lg-12">&nbsp;</div>
<!-- Content Row -->
<div class="row">
<!-- Sidebar Column -->
<div class="col-md-3" id="tg-sb-sidebar">
<ul id="mysidebar" class="nav">
<li class="sidebarTitle">PMD 7.8.0-SNAPSHOT</li>
<div class="sidebarTitleDate">Release date: 29-November-2024</div>
<li>
<a href="#">About</a>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="pmd_release_notes.html">Release notes</a></li>
<li><a href="pmd_release_notes_pmd7.html">Release notes (PMD 7)</a></li>
<li><a href="pmd_about_help.html">Getting help</a></li>
<li><a href="pmd_about_release_policies.html">Release policies</a></li>
<li><a href="pmd_about_support_lifecycle.html">Support lifecycle</a></li>
</ul>
</li>
<li>
<a href="#">User Documentation</a>
<ul>
<li><a href="pmd_userdocs_migrating_to_pmd7.html">Migration Guide for PMD 7</a></li>
<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>
<li><a href="pmd_userdocs_3rdpartyrulesets.html">3rd party rulesets</a></li>
<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 class="active"><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>
<li><a href="pmd_userdocs_extending_ast_dump.html">Creating (XML) dump of the AST</a></li>
</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>
<li><a href="pmd_userdocs_tools_bld.html">bld PMD Extension</a></li>
<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>
<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>
<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>
<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>
<li><a href="pmd_rules_ecmascript_performance.html">Performance</a></li>
</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>
<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">
<a href="#">Salesforce Visualforce Rules</a>
<ul>
<li><a href="pmd_rules_visualforce.html">Index</a></li>
<li><a href="pmd_rules_visualforce_security.html">Security</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Scala Rules</a>
<ul>
<li><a href="pmd_rules_scala.html">Index</a></li>
</ul>
</li>
<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>
<li class="subfolders">
<a href="#">Velocity Template Language (VTL) Rules</a>
<ul>
<li><a href="pmd_rules_velocity.html">Index</a></li>
<li><a href="pmd_rules_velocity_bestpractices.html">Best Practices</a></li>
<li><a href="pmd_rules_velocity_design.html">Design</a></li>
<li><a href="pmd_rules_velocity_errorprone.html">Error Prone</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">WSDL Rules</a>
<ul>
<li><a href="pmd_rules_wsdl.html">Index</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">XML Rules</a>
<ul>
<li><a href="pmd_rules_xml.html">Index</a></li>
<li><a href="pmd_rules_xml_bestpractices.html">Best Practices</a></li>
<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>
<a href="#">Language-Specific Documentation</a>
<ul>
<li><a href="pmd_languages_index.html">Overview</a></li>
<li><a href="pmd_languages_configuration.html">Language configuration</a></li>
<li><a href="pmd_languages_apex.html">Apex</a></li>
<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>
<li><a href="pmd_languages_java.html">Java</a></li>
<li><a href="pmd_languages_js_ts.html">JavaScript / TypeScript</a></li>
<li><a href="pmd_languages_jsp.html">JSP</a></li>
<li><a href="pmd_languages_julia.html">Julia</a></li>
<li><a href="pmd_languages_kotlin.html">Kotlin</a></li>
<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>
<li><a href="pmd_languages_plsql.html">PLSQL</a></li>
<li><a href="pmd_languages_python.html">Python</a></li>
<li><a href="pmd_languages_ruby.html">Ruby</a></li>
<li><a href="pmd_languages_scala.html">Scala</a></li>
<li><a href="pmd_languages_swift.html">Swift</a></li>
<li><a href="pmd_languages_tsql.html">T-SQL</a></li>
<li><a href="pmd_languages_visualforce.html">Visualforce</a></li>
<li><a href="pmd_languages_velocity.html">Velocity Template Language (VTL)</a></li>
<li><a href="pmd_languages_xml.html">XML and XML dialects</a></li>
</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>
<li><a href="https://github.com/pmd/pmd/blob/main/CONTRIBUTING.md" target="_blank">Contributing</a></li>
<li><a href="pmd_devdocs_writing_documentation.html">Writing documentation</a></li>
<li><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>
<li><a href="pmd_devdocs_major_rule_guidelines.html">Rule Guidelines</a></li>
<li><a href="pmd_devdocs_major_adding_new_language_javacc.html">Adding a new language (JavaCC)</a></li>
<li><a href="pmd_devdocs_major_adding_new_language_antlr.html">Adding a new language (ANTLR)</a></li>
<li><a href="pmd_devdocs_major_adding_new_cpd_language.html">Adding a new CPD language</a></li>
</ul>
</li>
<li class="subfolders">
<a href="#">Experimental features</a>
<ul>
<li><a href="tag_experimental.html">List of experimental Features</a></li>
</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>
<li><a href="pmd_projectdocs_logo.html">Logo</a></li>
<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>
<li><a href="pmd_projectdocs_decisions.html">Decisions</a></li>
<li class="subfolders">
<a href="#">Project management</a>
<ul>
<li><a href="pmd_projectdocs_committers_infrastructure.html">Infrastructure</a></li>
<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>
</div>
<!-- Content Column -->
<div class="col-md-9" id="tg-sb-content">
<header>
<div class="row">
<div class="col-lg-12">
<a href="./" role="button"
><i class="fa fa-home fa-lg"></i
></a>
» Writing XPath rules
<a
target="_blank"
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/extending/writing_xpath_rules.md"
class="float-right"
role="button"
><i class="fab fa-github fa-lg"></i> Edit on GitHub</a
>
</div>
</div>
<hr />
</header>
<div class="post-header">
<h1 class="post-title-main">Writing XPath rules</h1>
</div>
<div class="post-content" data-github-edit-url="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/extending/writing_xpath_rules.md">
<div class="summary">This page describes XPath rule support in more details</div>
<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>
<p>This page describes some points of XPath rule support in more details. See
also <a href="pmd_userdocs_extending_your_first_rule.html">the tutorial about how to write a first (XPath) rule</a>.</p>
<!-- Later we can document the specific subset of XPath features our wrappers support -->
<h2 id="xpath-version">XPath version</h2>
<p>PMD uses XPath 3.1 for its XPath rules since PMD 7. Before then, the default version was XPath 1.0,
with opt-in support for XPath 2.0.</p>
<p>See <a href="https://www.saxonica.com/html/documentation/expressions/xpath31new.html">the Saxonica documentation</a>
for an introduction to new features in XPath 3.1.</p>
<p>The property <code class="language-plaintext highlighter-rouge">version</code> of <a href="https://docs.pmd-code.org/apidocs/pmd-core/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/rule/xpath/XPathRule.html#"><code>XPathRule</code></a> is deprecated and
has been removed with PMD 7.</p>
<h2 id="dom-representation-of-asts">DOM representation of ASTs</h2>
<p>XPath rules view the AST as an XML-like DOM, which is what the XPath language is
defined on. Concretely, this means:</p>
<ul>
<li>Every AST node is viewed as an XML element
<ul>
<li>The element has for local name the value of <a href="https://docs.pmd-code.org/apidocs/pmd-core/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/ast/Node.html#getXPathNodeName()"><code>getXPathNodeName</code></a>
for the given node</li>
</ul>
</li>
<li>Some Java getters are exposed as XML attributes on those elements
<ul>
<li>This means, that documentation for attributes can be found in our Javadocs. For
example, the attribute <code class="language-plaintext highlighter-rouge">@SimpleName</code> of the Java node <code class="language-plaintext highlighter-rouge">EnumDeclaration</code> is backed
by the Java getter <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTTypeDeclaration.html#getSimpleName()"><code>getSimpleName</code></a>.</li>
</ul>
</li>
</ul>
<h3 id="value-conversion">Value conversion</h3>
<p>To represent attributes, we must map Java values to <a href="https://www.w3.org/TR/xpath-datamodel/">XPath Data Model (XDM)</a>
values. In the following table we refer to the type conversion function as <code class="language-plaintext highlighter-rouge">conv</code>, a function from Java types
to XDM types.</p>
<table>
<thead>
<tr>
<th>Java type <code class="language-plaintext highlighter-rouge">T</code></th>
<th>XSD type <code class="language-plaintext highlighter-rouge">conv(T)</code></th>
</tr>
</thead>
<tbody>
<tr>
<td><code class="language-plaintext highlighter-rouge">int</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:integer</code></td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">long</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:integer</code></td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">double</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:decimal</code></td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">float</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:decimal</code></td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">boolean</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:boolean</code></td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">String</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:string</code></td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">Character</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:string</code></td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">Enum&lt;E&gt;</code></td>
<td><code class="language-plaintext highlighter-rouge">xs:string</code> (uses <code class="language-plaintext highlighter-rouge">Object::toString</code>)</td>
</tr>
<tr>
<td><code class="language-plaintext highlighter-rouge">Collection&lt;E&gt;</code></td>
<td><code class="language-plaintext highlighter-rouge">conv(E)*</code> (a sequence type)</td>
</tr>
</tbody>
</table>
<p>The same <code class="language-plaintext highlighter-rouge">conv</code> function is used to translate rule property values to XDM values.</p>
<p>Additionaly, PMDs own <code class="language-plaintext highlighter-rouge">net.sourceforge.pmd.lang.document.Chars</code> is also translated to a <code class="language-plaintext highlighter-rouge">xs:string</code></p>
<h2 id="rule-properties">Rule properties</h2>
<p><strong>See <a href="pmd_userdocs_extending_defining_properties.html#for-xpath-rules">Defining rule properties</a></strong></p>
<h2 id="pmd-extension-functions">PMD extension functions</h2>
<p>PMD provides some language-specific XPath functions to access semantic
information from the AST.</p>
<p>The namespace of custom PMD functions must be explicitly mentioned.</p>
<!-- Generates the documentation of XPath functions from file docs/_data/xpath_funs.yml -->
<h3 id="all-languages">All languages</h3>
<p>Functions available to all languages are in the namespace <code>pmd</code>.</p>
<div class="table-responsive">
<table width="100%">
<thead>
<tr>
<th>Function name</th>
<th>Description (click for details)</th>
<th></th>
</tr>
</thead>
<tr data-toggle="collapse" id="pmd-fileName" data-target="#pmd-fileName-expand" class="accordion-toggle">
<td>fileName</td>
<td>Returns the simple name of the current file</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-fileName-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-fileName">
<span class="fun-ns">pmd:</span><span class="fun-name">fileName</span><span class="fun-ns">() as xs:string</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns the current simple file name, without path but including the extension.
This can be used to write rules that check file naming conventions.
</dd>
<dt>Since</dt>
<dd>PMD 6.38.0</dd>
<dt>Remarks</dt>
<dd>The requires the context node to be an element</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//b[pmd:fileName() = 'Foo.xml']</code></dt>
<dd>Matches any <code>&lt;b&gt;</code> tags in files called <code>Foo.xml</code>.</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-startLine" data-target="#pmd-startLine-expand" class="accordion-toggle">
<td>startLine</td>
<td>Returns the start line of the given node</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-startLine-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-startLine">
<span class="fun-ns">pmd:</span><span class="fun-name">startLine</span><span class="fun-ns">(xs:element) as xs:int</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns the line where the node starts in the source file.
Line numbers are 1-based.
</dd>
<dt>Since</dt>
<dd>PMD 6.44.0</dd>
<dt>Remarks</dt>
<dd>The function is not context-dependent, but takes a node as its first parameter.
</dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">element</span>
<span class="param-type"> as xs:element</span>
</dt>
<dd>Any element node</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//b[pmd:startLine(.) &gt; 5]</code></dt>
<dd>Matches any <code>&lt;b&gt;</code> node which starts after the fifth line.</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-endLine" data-target="#pmd-endLine-expand" class="accordion-toggle">
<td>endLine</td>
<td>Returns the end line of the given node</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-endLine-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-endLine">
<span class="fun-ns">pmd:</span><span class="fun-name">endLine</span><span class="fun-ns">(xs:element) as xs:int</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns the line where the node ends in the source file.
Line numbers are 1-based.
</dd>
<dt>Since</dt>
<dd>PMD 6.44.0</dd>
<dt>Remarks</dt>
<dd>The function is not context-dependent, but takes a node as its first parameter.
</dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">element</span>
<span class="param-type"> as xs:element</span>
</dt>
<dd>Any element node</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//b[pmd:endLine(.) == pmd:startLine(.)]</code></dt>
<dd>Matches any <code>&lt;b&gt;</code> node which doesn't span more than one line.</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-startColumn" data-target="#pmd-startColumn-expand" class="accordion-toggle">
<td>startColumn</td>
<td>Returns the start column of the given node (inclusive)</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-startColumn-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-startColumn">
<span class="fun-ns">pmd:</span><span class="fun-name">startColumn</span><span class="fun-ns">(xs:element) as xs:int</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns the column number where the node starts in the source file.
Column numbers are 1-based. The start column is inclusive.
</dd>
<dt>Since</dt>
<dd>PMD 6.44.0</dd>
<dt>Remarks</dt>
<dd>The function is not context-dependent, but takes a node as its first parameter.
</dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">element</span>
<span class="param-type"> as xs:element</span>
</dt>
<dd>Any element node</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//b[pmd:startColumn(.) = 1]</code></dt>
<dd>Matches any <code>&lt;b&gt;</code> node which starts on the first column of a line</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-endColumn" data-target="#pmd-endColumn-expand" class="accordion-toggle">
<td>endColumn</td>
<td>Returns the end column of the given node (exclusive)</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-endColumn-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-endColumn">
<span class="fun-ns">pmd:</span><span class="fun-name">endColumn</span><span class="fun-ns">(xs:element) as xs:int</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns the column number where the node ends in the source file.
Column numbers are 1-based. The end column is exclusive.
</dd>
<dt>Since</dt>
<dd>PMD 6.44.0</dd>
<dt>Remarks</dt>
<dd>The function is not context-dependent, but takes a node as its first parameter.
</dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">element</span>
<span class="param-type"> as xs:element</span>
</dt>
<dd>Any element node</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//b[pmd:startLine(.) = pmd:endLine(.) and pmd:endColumn(.) - pmd:startColumn(.) = 1]</code></dt>
<dd>Matches any <code>&lt;b&gt;</code> node which spans exactly one character</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
</table>
</div>
<!-- Generates the documentation of XPath functions from file docs/_data/xpath_funs.yml -->
<h3 id="java">Java</h3>
<p>Java functions are in the namespace <code class="language-plaintext highlighter-rouge">pmd-java</code>.</p>
<div class="table-responsive">
<table width="100%">
<thead>
<tr>
<th>Function name</th>
<th>Description (click for details)</th>
<th></th>
</tr>
</thead>
<tr data-toggle="collapse" id="pmd-java-nodeIs" data-target="#pmd-java-nodeIs-expand" class="accordion-toggle">
<td>nodeIs</td>
<td>Tests the runtime type of the node instance</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-nodeIs-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-nodeIs">
<span class="fun-ns">pmd-java:</span><span class="fun-name">nodeIs</span><span class="fun-ns">(xs:string) as xs:boolean</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns true if the runtime type of the AST node is a subtype of the given class. Contrary to typeIs, this tests the type of the AST node. For example, the AST node for a literal (e.g. <code>5d</code>) has type ASTNumericLiteral, and this function will ignore the static type of the expression (double)</dd>
<dt>Remarks</dt>
<dd></dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">nodeClassName</span>
<span class="param-type"> as xs:string</span>
</dt>
<dd>Simple name of a class or interface in package <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/package-summary.html#"><code>net.sourceforge.pmd.lang.java.ast</code></a>, without the 'AST' prefix</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//*[pmd-java:nodeIs("Expression")]</code></dt>
<dd>Matches all nodes that implement <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTExpression.html#"><code>ASTExpression</code></a></dd>
<dt><code>//*[pmd-java:nodeIs("TypeDeclaration")]</code></dt>
<dd>Matches all nodes that implement <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTTypeDeclaration.html#"><code>ASTTypeDeclaration</code></a></dd>
<dt><code>//*[pmd-java:nodeIs("Foo")]</code></dt>
<dd>Runtime error, there's no class ASTFoo in the package</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-java-typeIs" data-target="#pmd-java-typeIs-expand" class="accordion-toggle">
<td>typeIs</td>
<td>Tests a node's static type</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-typeIs-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-typeIs">
<span class="fun-ns">pmd-java:</span><span class="fun-name">typeIs</span><span class="fun-ns">(xs:string) as xs:boolean</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns true if the context node's static Java type is a subtype of the given type. This tests for the resolved type of the Java construct, not the type of the AST node. For example, the AST node for a literal (e.g. <code>5d</code>) has type ASTNumericLiteral, however this function will compare the type of the literal (eg here, <code>double</code>) against the argument.</dd>
<dt>Remarks</dt>
<dd>The context node must be a <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/TypeNode.html#"><code>TypeNode</code></a></dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">javaQualifiedName</span>
<span class="param-type"> as xs:string</span>
</dt>
<dd>The qualified name of a Java class, possibly with pairs of brackets to indicate an array type. Can also be a primitive type name.</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//FormalParameter[pmd-java:typeIs("java.lang.String[]")]</code></dt>
<dd>Matches formal parameters of type <code>String[]</code> (including vararg parameters)</dd>
<dt><code>//VariableId[pmd-java:typeIs("java.lang.List")]</code></dt>
<dd>Matches variable declarators of type <code>List</code> or any of its subtypes (including e.g. <code>ArrayList</code>)</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-java-typeIsExactly" data-target="#pmd-java-typeIsExactly-expand" class="accordion-toggle">
<td>typeIsExactly</td>
<td>Tests a node's static type, ignoring subtypes</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-typeIsExactly-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-typeIsExactly">
<span class="fun-ns">pmd-java:</span><span class="fun-name">typeIsExactly</span><span class="fun-ns">(xs:string) as xs:boolean</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns true if the context node's static type is exactly the given type. In particular, returns false if the context node's type is a subtype of the given type.</dd>
<dt>Remarks</dt>
<dd>The context node must be a <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/TypeNode.html#"><code>TypeNode</code></a></dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">javaQualifiedName</span>
<span class="param-type"> as xs:string</span>
</dt>
<dd>The qualified name of a Java class, possibly with pairs of brackets to indicate an array type. Can also be a primitive type name.</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//VariableId[pmd-java:typeIsExactly("java.lang.List")]</code></dt>
<dd>Matches variable declarators of type <code>List</code> (but not e.g. <code>ArrayList</code>)</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-java-metric" data-target="#pmd-java-metric-expand" class="accordion-toggle">
<td>metric</td>
<td>Computes and returns the value of a metric</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-metric-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-metric">
<span class="fun-ns">pmd-java:</span><span class="fun-name">metric</span><span class="fun-ns">(xs:string) as xs:decimal?</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns the value of the metric as evaluated on the context node. If the metric cannot be computed on that node, returns an empty sequence (which is falsy).</dd>
<dt>Remarks</dt>
<dd></dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">metricKey</span>
<span class="param-type"> as xs:string</span>
</dt>
<dd>The name of a metric in <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/metrics/JavaMetrics.html#"><code>JavaMetrics</code></a> (or an alias thereof).</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//ClassDeclaration[metric('NCSS') &gt; 200]</code></dt>
<dd></dd>
<dt><code>//MethodDeclaration[metric('CYCLO') &gt; 10 and metric('NCSS') &gt; 20]</code></dt>
<dd></dd>
<dt><code>//TypeParameter[metric('idontexist') &gt; 50]</code></dt>
<dd>Error: no such metric</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-java-hasAnnotation" data-target="#pmd-java-hasAnnotation-expand" class="accordion-toggle">
<td>hasAnnotation</td>
<td>Tests whether an annotation is present on the node</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-hasAnnotation-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-hasAnnotation">
<span class="fun-ns">pmd-java:</span><span class="fun-name">hasAnnotation</span><span class="fun-ns">(xs:string) as xs:boolean</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns true if the node has an annotation with the given qualified name</dd>
<dt>Remarks</dt>
<dd>The context node must be an <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/Annotatable.html#"><code>Annotatable</code></a>, otherwise this returns false</dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">annotationClassName</span>
<span class="param-type"> as xs:string</span>
</dt>
<dd>Canonical name of an annotation type</dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//MethodDeclaration[pmd-java:hasAnnotation("java.lang.Override")]</code></dt>
<dd>Matches all method declarations that are annotated with @Override</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-java-modifiers" data-target="#pmd-java-modifiers-expand" class="accordion-toggle">
<td>modifiers</td>
<td>Produce the effective modifiers of a node</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-modifiers-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-modifiers">
<span class="fun-ns">pmd-java:</span><span class="fun-name">modifiers</span><span class="fun-ns">() as xs:string*</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns a sequence of the effective modifiers of a node as strings. This is documented on <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTModifierList.html#getEffectiveModifiers()"><code>getEffectiveModifiers</code></a>.</dd>
<dt>Remarks</dt>
<dd>The context node must be an <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ModifierOwner.html#"><code>ModifierOwner</code></a>, otherwise this returns an empty sequence</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//MethodDeclaration[pmd-java:modifiers() = "native"]</code></dt>
<dd>Matches native method declarations</dd>
<dt><code>//MethodDeclaration[pmd-java:modifiers() = ("native", "static")]</code></dt>
<dd>Matches method declarations that have a 'native' OR a 'static' modifier. This may be counter-intuitive.</dd>
<dt><code>//MethodDeclaration[pmd-java:modifiers() = "public"]</code></dt>
<dd>Matches method declarations that have a 'public' modifier, explicit or implicit. For example, this would match methods in interfaces, which implicitly have the modifier. Use the <code>explicitModifiers</code> function if you don't want the implicit part. Also note that <code>@Visibility = 'public'</code> is a better use of the API, in this particular instance.</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-java-explicitModifiers" data-target="#pmd-java-explicitModifiers-expand" class="accordion-toggle">
<td>explicitModifiers</td>
<td>Produce the explicit modifiers of a node</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-explicitModifiers-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-explicitModifiers">
<span class="fun-ns">pmd-java:</span><span class="fun-name">explicitModifiers</span><span class="fun-ns">() as xs:string*</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Returns a sequence of the explicit modifiers of a node as strings. This is documented on <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ASTModifierList.html#getExplicitModifiers()"><code>getExplicitModifiers</code></a>.</dd>
<dt>Remarks</dt>
<dd>The context node must be an <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/ModifierOwner.html#"><code>ModifierOwner</code></a>, otherwise this returns an empty sequence</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//MethodDeclaration[pmd-java:explicitModifiers() = "public"]</code></dt>
<dd>Matches method declarations that have an explicit 'public' modifier.</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
<tr data-toggle="collapse" id="pmd-java-matchesSig" data-target="#pmd-java-matchesSig-expand" class="accordion-toggle">
<td>matchesSig</td>
<td>Matches the signature called by a method or constructor call</td>
<td>
<button type="button" class="btn btn-link"><i class="fas fa-ellipsis-h"></i></button>
</td>
</tr>
<tr>
<td colspan="4" class="hiddenRow">
<div class="accordion-body collapse" id="pmd-java-matchesSig-expand">
<div style="margin-left: 15px" class="xpath-fun-doc">
<!-- Yeah the ID is duplicated but it's ok on my browser and makes -->
<!--links somehow work when details are collapsed -->
<h4 class="fun-details-header" id="pmd-java-matchesSig">
<span class="fun-ns">pmd-java:</span><span class="fun-name">matchesSig</span><span class="fun-ns">(xs:string) as xs:boolean</span>
</h4>
<div style="margin-left: 30px">
<dl>
<dd>Uses an <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/types/TypeTestUtil.InvocationMatcher.html#"><code>TypeTestUtil.InvocationMatcher</code></a> to test the method signature called by the context node. The format of the parameter is described on that class.</dd>
<dt>Remarks</dt>
<dd>The context node must be an <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/ast/InvocationNode.html#"><code>InvocationNode</code></a>, otherwise this returns false</dd>
<dt>Parameters</dt>
<dd>
<dl>
<dt>
<span class="param-name">sig</span>
<span class="param-type"> as xs:string</span>
</dt>
<dd>A signature, in the format described on <a href="https://docs.pmd-code.org/apidocs/pmd-java/7.8.0-SNAPSHOT/net/sourceforge/pmd/lang/java/types/TypeTestUtil.InvocationMatcher.html#"><code>TypeTestUtil.InvocationMatcher</code></a></dd>
</dl>
</dd>
<dt>Examples</dt>
<dd>
<dl class="code-examples">
<dt><code>//MethodCall[pmd-java:matchesSig("_#equals(java.lang.Object)")]</code></dt>
<dd>Matches calls to the method <code>equals</code> on any receiver type</dd>
<dt><code>//MethodCall[pmd-java:matchesSig("java.lang.Enum#equals(java.lang.Object)")]</code></dt>
<dd>Matches calls to the method <code>equals</code> on receiver that is a subtype of Enum</dd>
<dt><code>//MethodCall[pmd-java:matchesSig("java.lang.String#toString()")]</code></dt>
<dd>Matches calls to the method <code>toString</code> on String receivers</dd>
<dt><code>//MethodCall[pmd-java:matchesSig("_#_(int,int)")]</code></dt>
<dd>Matches calls to any method with 2 <code>int</code> parameters (!= argument)</dd>
<dt><code>//ConstructorCall[pmd-java:matchesSig("java.util.ArrayList#new(int)")]</code></dt>
<dd>Matches constructors calls of ArrayList with a single int parameter</dd>
</dl>
</dd>
</dl>
</div>
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="tags">
<b>Tags: </b>
<a href="tag_extending.html" class="btn btn-outline-secondary navbar-btn cursorNorm" role="button">extending</a>
<a href="tag_userdocs.html" class="btn btn-outline-secondary navbar-btn cursorNorm" role="button">userdocs</a>
</div>
</div>
<footer>
<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"
href="https://github.com/pmd/pmd/blob/main/docs/pages/pmd/userdocs/extending/writing_xpath_rules.md"
role="button"
><i class="fab fa-github fa-lg"></i> Edit on GitHub</a
>
</div>
<hr />
<div class="row">
<div class="col-lg-12 footer">
&copy;2024 PMD Open Source Project. All rights
reserved. <br />
<span>Page last updated:</span>
December 2023 (7.0.0)<br /> Site last generated: Nov 21, 2024 <br />
<p>
<img src="images/logo/pmd-logo-70px.png" alt="PMD
logo"/>
</p>
</div>
</div>
</footer>
</div>
<!-- /.row -->
</div>
<!-- /.container -->
</div>
<!-- Sticky TOC column -->
<div class="toc-col">
<div id="toc"></div>
</div>
<!-- /.toc-container-wrapper -->
</div>
</div>
<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>
</html>