From b825f7f9c98b62f4c5e912c65f87b601f0f46c03 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 3 Mar 2022 22:00:58 +0100 Subject: [PATCH] [modelica] Rename rules and fix rulesets --- docs/pages/release_notes.md | 5 ++ pmd-modelica/pom.xml | 6 +++ .../rule/AmbiguousResolutionRule.java | 25 +++------ .../rule/ConnectUsingNonConnector.java | 50 +++--------------- .../AmbiguousResolutionRule.java | 27 ++++++++++ .../ConnectUsingNonConnectorRule.java | 51 +++++++++++++++++++ .../category/modelica/bestpractices.xml | 7 ++- 7 files changed, 108 insertions(+), 63 deletions(-) create mode 100644 pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/AmbiguousResolutionRule.java create mode 100644 pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/ConnectUsingNonConnectorRule.java diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 8b6e8ffc93..89a2e399e1 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -65,6 +65,11 @@ The CLI itself remains compatible, if you run PMD via command-line, no action is * {% jdoc !!core::PMDConfiguration#prependClasspath(java.lang.String) %} is deprecated in favour of {% jdoc core::PMDConfiguration#prependAuxClasspath(java.lang.String) %}. +* In modelica, the rule classes {% jdoc modelica::lang.modelica.rule.AmbiguousResolutionRule %} + and {% jdoc modelica::lang.modelica.rule.ConnectUsingNonConnector %} have been deprecated, + since they didn't comply to the usual rule class naming conventions yet. + The replacements are in the subpackage `bestpractices`. + #### Experimental APIs * Together with the [new programmatic API](#new-programmatic-api) the interface diff --git a/pmd-modelica/pom.xml b/pmd-modelica/pom.xml index 063371ff4f..3b94ff1440 100644 --- a/pmd-modelica/pom.xml +++ b/pmd-modelica/pom.xml @@ -12,6 +12,12 @@ + + + ${basedir}/src/main/resources + true + + maven-resources-plugin diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AmbiguousResolutionRule.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AmbiguousResolutionRule.java index fcc1213d47..05e2d2302a 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AmbiguousResolutionRule.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/AmbiguousResolutionRule.java @@ -1,26 +1,13 @@ -/** +/* * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ + package net.sourceforge.pmd.lang.modelica.rule; -import net.sourceforge.pmd.lang.modelica.ast.ASTName; -import net.sourceforge.pmd.lang.modelica.resolver.ResolutionResult; -import net.sourceforge.pmd.lang.modelica.resolver.ResolvableEntity; +/** + * @deprecated Use {@link net.sourceforge.pmd.lang.modelica.rule.bestpractices.AmbiguousResolutionRule} + */ +public class AmbiguousResolutionRule extends net.sourceforge.pmd.lang.modelica.rule.bestpractices.AmbiguousResolutionRule { -public class AmbiguousResolutionRule extends AbstractModelicaRule { - @Override - public Object visit(ASTName node, Object data) { - ResolutionResult candidates = node.getResolutionCandidates(); - if (candidates.isClashed()) { - StringBuilder sb = new StringBuilder(); - sb.append("Candidate resolutions: "); - for (ResolvableEntity candidate: candidates.getBestCandidates()) { - sb.append(candidate.getDescriptiveName()); - sb.append(", "); - } - addViolation(data, node, sb.substring(0, sb.length() - 2)); - } - return super.visit(node, data); - } } diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/ConnectUsingNonConnector.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/ConnectUsingNonConnector.java index af444d5ba7..8698df8b36 100644 --- a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/ConnectUsingNonConnector.java +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/ConnectUsingNonConnector.java @@ -1,50 +1,16 @@ -/** +/* * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ + package net.sourceforge.pmd.lang.modelica.rule; -import net.sourceforge.pmd.lang.modelica.ast.ASTComponentReference; -import net.sourceforge.pmd.lang.modelica.ast.ASTConnectClause; -import net.sourceforge.pmd.lang.modelica.resolver.ModelicaClassSpecialization; -import net.sourceforge.pmd.lang.modelica.resolver.ModelicaClassType; -import net.sourceforge.pmd.lang.modelica.resolver.ModelicaComponentDeclaration; -import net.sourceforge.pmd.lang.modelica.resolver.ResolutionResult; -import net.sourceforge.pmd.lang.modelica.resolver.ResolvableEntity; +import net.sourceforge.pmd.lang.modelica.rule.bestpractices.ConnectUsingNonConnectorRule; -public class ConnectUsingNonConnector extends AbstractModelicaRule { - private void reportIfViolated(ASTComponentReference ref, Object data) { - ResolutionResult resolution = ref.getResolutionCandidates(); - if (!resolution.isUnresolved()) { // no false positive if not resolved at all - ResolvableEntity firstDecl = resolution.getBestCandidates().get(0); - if (firstDecl instanceof ModelicaComponentDeclaration) { - ModelicaComponentDeclaration componentDecl = (ModelicaComponentDeclaration) firstDecl; - ResolutionResult componentTypes = componentDecl.getTypeCandidates(); - if (!componentTypes.isUnresolved()) { - if (componentTypes.getBestCandidates().get(0) instanceof ModelicaClassType) { - ModelicaClassType classDecl = (ModelicaClassType) componentTypes.getBestCandidates().get(0); - ModelicaClassSpecialization restriction = classDecl.getSpecialization(); - if (!classDecl.isConnectorLike()) { - addViolation(data, ref, restriction.toString()); - } - } else { - addViolation(data, ref, firstDecl.getDescriptiveName()); - } - } - } else { - addViolation(data, ref, firstDecl.getDescriptiveName()); - } - } - } +/** + * @deprecated Use {@link ConnectUsingNonConnectorRule} + */ +@Deprecated +public class ConnectUsingNonConnector extends ConnectUsingNonConnectorRule { - @Override - public Object visit(ASTConnectClause node, Object data) { - ASTComponentReference lhs = (ASTComponentReference) node.getChild(0); - ASTComponentReference rhs = (ASTComponentReference) node.getChild(1); - - reportIfViolated(lhs, data); - reportIfViolated(rhs, data); - - return super.visit(node, data); - } } diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/AmbiguousResolutionRule.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/AmbiguousResolutionRule.java new file mode 100644 index 0000000000..724018ca62 --- /dev/null +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/AmbiguousResolutionRule.java @@ -0,0 +1,27 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.modelica.rule.bestpractices; + +import net.sourceforge.pmd.lang.modelica.ast.ASTName; +import net.sourceforge.pmd.lang.modelica.resolver.ResolutionResult; +import net.sourceforge.pmd.lang.modelica.resolver.ResolvableEntity; +import net.sourceforge.pmd.lang.modelica.rule.AbstractModelicaRule; + +public class AmbiguousResolutionRule extends AbstractModelicaRule { + @Override + public Object visit(ASTName node, Object data) { + ResolutionResult candidates = node.getResolutionCandidates(); + if (candidates.isClashed()) { + StringBuilder sb = new StringBuilder(); + sb.append("Candidate resolutions: "); + for (ResolvableEntity candidate: candidates.getBestCandidates()) { + sb.append(candidate.getDescriptiveName()); + sb.append(", "); + } + addViolation(data, node, sb.substring(0, sb.length() - 2)); + } + return super.visit(node, data); + } +} diff --git a/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/ConnectUsingNonConnectorRule.java b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/ConnectUsingNonConnectorRule.java new file mode 100644 index 0000000000..5712bca82f --- /dev/null +++ b/pmd-modelica/src/main/java/net/sourceforge/pmd/lang/modelica/rule/bestpractices/ConnectUsingNonConnectorRule.java @@ -0,0 +1,51 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.modelica.rule.bestpractices; + +import net.sourceforge.pmd.lang.modelica.ast.ASTComponentReference; +import net.sourceforge.pmd.lang.modelica.ast.ASTConnectClause; +import net.sourceforge.pmd.lang.modelica.resolver.ModelicaClassSpecialization; +import net.sourceforge.pmd.lang.modelica.resolver.ModelicaClassType; +import net.sourceforge.pmd.lang.modelica.resolver.ModelicaComponentDeclaration; +import net.sourceforge.pmd.lang.modelica.resolver.ResolutionResult; +import net.sourceforge.pmd.lang.modelica.resolver.ResolvableEntity; +import net.sourceforge.pmd.lang.modelica.rule.AbstractModelicaRule; + +public class ConnectUsingNonConnectorRule extends AbstractModelicaRule { + private void reportIfViolated(ASTComponentReference ref, Object data) { + ResolutionResult resolution = ref.getResolutionCandidates(); + if (!resolution.isUnresolved()) { // no false positive if not resolved at all + ResolvableEntity firstDecl = resolution.getBestCandidates().get(0); + if (firstDecl instanceof ModelicaComponentDeclaration) { + ModelicaComponentDeclaration componentDecl = (ModelicaComponentDeclaration) firstDecl; + ResolutionResult componentTypes = componentDecl.getTypeCandidates(); + if (!componentTypes.isUnresolved()) { + if (componentTypes.getBestCandidates().get(0) instanceof ModelicaClassType) { + ModelicaClassType classDecl = (ModelicaClassType) componentTypes.getBestCandidates().get(0); + ModelicaClassSpecialization restriction = classDecl.getSpecialization(); + if (!classDecl.isConnectorLike()) { + addViolation(data, ref, restriction.toString()); + } + } else { + addViolation(data, ref, firstDecl.getDescriptiveName()); + } + } + } else { + addViolation(data, ref, firstDecl.getDescriptiveName()); + } + } + } + + @Override + public Object visit(ASTConnectClause node, Object data) { + ASTComponentReference lhs = (ASTComponentReference) node.getChild(0); + ASTComponentReference rhs = (ASTComponentReference) node.getChild(1); + + reportIfViolated(lhs, data); + reportIfViolated(rhs, data); + + return super.visit(node, data); + } +} diff --git a/pmd-modelica/src/main/resources/category/modelica/bestpractices.xml b/pmd-modelica/src/main/resources/category/modelica/bestpractices.xml index fb1bcfde9e..bb896cca2d 100644 --- a/pmd-modelica/src/main/resources/category/modelica/bestpractices.xml +++ b/pmd-modelica/src/main/resources/category/modelica/bestpractices.xml @@ -10,6 +10,7 @@ Rules which enforce generally accepted best practices. @@ -41,9 +42,10 @@ end SomeOtherName /* should be SomeName */; + class="net.sourceforge.pmd.lang.modelica.rule.bestpractices.ConnectUsingNonConnectorRule"> Modelica specification requires passing connectors to the `connect` clause, while some implementations tolerate using it on plain variables, etc.. @@ -75,8 +77,9 @@ end Example; + class="net.sourceforge.pmd.lang.modelica.rule.bestpractices.AmbiguousResolutionRule"> There is multiple candidates for this type resolution. While generally this is not an error, this may indicate a bug.