From 25cc2d206c57073f6919f18d4978c8e93462558f Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 27 Oct 2026 14:37:25 +0200 Subject: [PATCH 1/3] ci: make PMD a zero-findings gate The PMD gate failed only on a fixed list of rules, so an unlisted one (AvoidUsingHardCodedIP in OtlpTestCollector, from #6114) reached master while the report showed it in red. Any PMD finding now fails the build, matching SpotBugs; the one finding gets a NOPMD with its reason. Co-Authored-By: Claude Opus 5.5 --- .github/scripts/generate-quality-report.py | 65 +++---------------- CLAUDE.md | 10 +-- .../backend/test/OtlpTestCollector.java | 2 +- 3 files changed, 16 insertions(+), 61 deletions(-) diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index c2842de07ec..6a5a632f683 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -950,62 +950,15 @@ def main() -> None: pmd = parse_pmd() if pmd: - forbidden_pmd_rules = { - "UnparseableReport", - "ClassWithOnlyPrivateConstructorsShouldBeFinal", - "CompareObjectsWithEquals", - "FormalParameterNamingConventions", - "LiteralsFirstInComparisons", - "LocalVariableNamingConventions", - "MethodNamingConventions", - "OneDeclarationPerLine", - "MissingOverride", - "ControlStatementBraces", - "UnnecessaryFullyQualifiedName", - "UseCollectionIsEmpty", - "UnusedPrivateField", - "UnnecessaryLocalBeforeReturn", - "PreserveStackTrace", - "CloseResource", - "AssignmentInOperand", - "EmptyControlStatement", - "ForLoopCanBeForeach", - "UnusedFormalParameter", - "SwitchStmtsShouldHaveDefault", - "UnconditionalIfStatement", - "SimplifyConditional", - "UselessOverridingMethod", - "UselessQualifiedThis", - "AvoidBranchingStatementAsLastInLoop", - "AvoidUsingVolatile", - "DoNotCallGarbageCollectionExplicitly", - "SuspiciousEqualsMethodName", - "UseUtilityClass", - "EmptyCatchBlock", - "SimplifyBooleanReturns", - "UnusedLocalVariable", - "UnnecessaryConstructor", - "UnnecessaryImport", - "AvoidStringBufferField", - "LogicInversion", - "DefaultLabelNotLastInSwitchStmt", - "SingularField", - "InstantiationToGetClass", - "UnnecessaryModifier", - "FinalFieldCouldBeStatic", - "AvoidInstanceofChecksInCatchClause", - "AvoidUsingOctalValues", - "NonThreadSafeSingleton", - "ComparisonWithNaN", - "DontUseFloatTypeForLoopIndices", - "MissingStaticMethodInNonInstantiatableClass", - "OverrideBothEqualsAndHashcode", - "UnnecessarySemicolon" - } - violations = [f for f in pmd.findings if f.rule in forbidden_pmd_rules] - if violations: - print("\n❌ Build failed due to forbidden PMD violations:") - for v in violations: + # Zero findings, like SpotBugs: ANY rule fails the build. This used to + # be a list of forbidden rules, and a rule nobody had listed + # (AvoidUsingHardCodedIP) reached master while the report showed it + # in red. An intentional exception is a `//NOPMD - ` + # on the line, never a gap in this gate. UnparseableReport is a + # finding too, so a corrupt report also fails here. + if pmd.findings: + print("\n\u274c Build failed due to PMD findings (the gate is zero findings):") + for v in pmd.findings: print(f" - {v.rule}: {v.location} - {v.message}") sys.exit(1) diff --git a/CLAUDE.md b/CLAUDE.md index d5d36659cb7..fed52d92802 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -136,7 +136,10 @@ any of them cannot skip it. `maven/cil-translator/`, `maven/unity-compat/`), scoped to the class or method it applies to and with a comment explaining why. Keep the generated report at zero rather than tolerating known noise. -- PMD and Checkstyle still gate on their own lists in the same script. +- **PMD is a zero-findings gate too**, in the same script: any rule fails the + build. An intentional exception is a `//NOPMD - ` on the line. + It once gated a fixed list of rules, and an unlisted one reached master. +- Checkstyle gates on errors in the same script. To reproduce the SpotBugs gate locally: @@ -443,12 +446,11 @@ The backend is held to the client's gates: - `///` markdown comments only, no `package.html` (`validate-java25-markdown-docs.sh` covers `vm/backend/src` and `impl/`); `package-info.java` per package; no since markers. -- SpotBugs (zero findings, `maven/backend/spotbugs-exclude.xml`), PMD (the core's - forbidden list) and Checkstyle (zero errors) run in `maven/backend`'s `verify`, +- SpotBugs (zero findings, `maven/backend/spotbugs-exclude.xml`), PMD (zero findings) and Checkstyle (zero errors) run in `maven/backend`'s `verify`, using the core's own `pmd.xml` and `checkstyle.xml`. Only two of the three fail a local build: SpotBugs, and Checkstyle through its `check` execution (`checkstyle-zero-errors`). **PMD writes `maven/backend/target/pmd.xml` and - judges nothing** -- its forbidden list lives in + judges nothing** -- the zero-findings gate lives in `.github/scripts/generate-quality-report.py`, which PR CI runs afterwards. A green `mvn verify` therefore says nothing about PMD: read the report. Both reports once sat at seven and fifteen findings behind green local builds. diff --git a/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java b/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java index e65a7dbadfa..32565ffbe82 100644 --- a/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java +++ b/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java @@ -51,7 +51,7 @@ public final class OtlpTestCollector { private final List bodies = new ArrayList(); private OtlpTestCollector(int port) throws IOException { - server = HttpServer.start("127.0.0.1", port, 64, 2, new HttpServer.Handler() { + server = HttpServer.start("127.0.0.1", port, 64, 2, new HttpServer.Handler() { //NOPMD AvoidUsingHardCodedIP - the test collector binds loopback only @Override public HttpServer.Response handle(HttpServer.Request request) { record(request.getTarget(), request.getBodyBytes()); From 1054a5911f5779f9a908a16491e6a09fb6855246 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 27 Oct 2026 15:09:44 +0200 Subject: [PATCH 2/3] unity-compat: mark the C#-shaped PMD findings the gate now enforces ClassNamingConventions (Action_1, Int32_, TMP_Text: names the translator binds to), AbstractClassWithoutAnyMethod (abstract in C#) and ExtendsObject (UnityEngine.Object, which PMD mistakes for java.lang.Object). Co-Authored-By: Claude Opus 5.5 --- .../main/java/com/codename1/unitycompat/system/Action_1.java | 2 +- .../main/java/com/codename1/unitycompat/system/Action_2.java | 2 +- .../main/java/com/codename1/unitycompat/system/Action_3.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Array_.java | 2 +- .../main/java/com/codename1/unitycompat/system/Boolean_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Byte_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Char_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Double_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Enum_.java | 2 +- .../java/com/codename1/unitycompat/system/EventHandler_1.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Func_1.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Func_2.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Func_3.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Func_4.java | 2 +- .../java/com/codename1/unitycompat/system/IComparable_1.java | 2 +- .../java/com/codename1/unitycompat/system/IEquatable_1.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Int16_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Int32_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Int64_.java | 2 +- .../com/codename1/unitycompat/system/MulticastDelegate.java | 1 + .../src/main/java/com/codename1/unitycompat/system/Object_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/SByte_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/Single_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/String_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/UInt16_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/UInt32_.java | 2 +- .../src/main/java/com/codename1/unitycompat/system/UInt64_.java | 2 +- .../java/com/codename1/unitycompat/system/ValueTuple_2.java | 2 +- .../java/com/codename1/unitycompat/system/ValueTuple_3.java | 2 +- .../unitycompat/system/collections/generic/Dictionary_2.java | 2 +- .../unitycompat/system/collections/generic/ICollection_1.java | 2 +- .../unitycompat/system/collections/generic/IDictionary_2.java | 2 +- .../unitycompat/system/collections/generic/IEnumerable_1.java | 2 +- .../unitycompat/system/collections/generic/IEnumerator_1.java | 1 + .../unitycompat/system/collections/generic/KeyValuePair_2.java | 2 +- .../unitycompat/system/collections/generic/List_1.java | 2 +- .../src/main/java/com/codename1/unitycompat/tmpro/TMP_Text.java | 2 +- .../com/codename1/unitycompat/unityengine/AnimationClip.java | 2 +- .../java/com/codename1/unitycompat/unityengine/AudioClip.java | 2 +- .../java/com/codename1/unitycompat/unityengine/Component.java | 2 +- .../java/com/codename1/unitycompat/unityengine/GameObject.java | 2 +- .../unitycompat/unityengine/RuntimeAnimatorController.java | 2 +- .../com/codename1/unitycompat/unityengine/ScriptableObject.java | 2 +- .../main/java/com/codename1/unitycompat/unityengine/Sprite.java | 2 +- .../java/com/codename1/unitycompat/unityengine/TextAsset.java | 2 +- .../java/com/codename1/unitycompat/unityengine/Texture.java | 2 +- .../unitycompat/unityengine/eventsystems/UIBehaviour.java | 1 + .../codename1/unitycompat/unityengine/ui/MaskableGraphic.java | 1 + 48 files changed, 48 insertions(+), 44 deletions(-) diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_1.java index feb24b80258..1a140e6be7a 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_1.java @@ -28,7 +28,7 @@ /// class, which `$sameType` cannot tell apart; the closed type a delegate /// was made as travels in `Delegate.$typeKey`, and `Delegate.Combine` /// compares that as well. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class Action_1 extends MulticastDelegate { public abstract void Invoke(Object a0); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_2.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_2.java index 21f8f99fb1f..c94ea4a3255 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_2.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_2.java @@ -25,7 +25,7 @@ /// `System.Action`2`. Type arguments are erased, so every parameter is an /// `Object` and the generated subclass unboxes what the method it calls /// takes as a primitive. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class Action_2 extends MulticastDelegate { public abstract void Invoke(Object a0, Object a1); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_3.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_3.java index a7f3fd3b8f7..23299b3d029 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_3.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Action_3.java @@ -25,7 +25,7 @@ /// `System.Action`3`. Type arguments are erased, so every parameter is an /// `Object` and the generated subclass unboxes what the method it calls /// takes as a primitive. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class Action_3 extends MulticastDelegate { public abstract void Invoke(Object a0, Object a1, Object a2); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Array_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Array_.java index a3543dc2c75..766d8cff39e 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Array_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Array_.java @@ -25,7 +25,7 @@ /// The members of `System.Array`, for the arrays that have no class of /// their own to put them on: a JVM array for one dimension, an [MdArray] /// for more. Which one an `Array` is, is only known when it gets here. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Array_ { private Array_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Boolean_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Boolean_.java index 03995100d49..396e00e082a 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Boolean_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Boolean_.java @@ -24,7 +24,7 @@ /// The methods of `System.Boolean`, which is the primitive `boolean` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Boolean_ { private Boolean_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Byte_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Byte_.java index d8d1b8c95d9..06f043943a3 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Byte_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Byte_.java @@ -24,7 +24,7 @@ /// The methods of `System.Byte`. A C# `byte` is unsigned and a JVM `byte` /// is not, so the value is masked on the way in. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Byte_ { private Byte_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Char_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Char_.java index f945432e6ec..d05bcbf6ac0 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Char_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Char_.java @@ -24,7 +24,7 @@ /// The methods of `System.Char`, which is the primitive `char` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Char_ { private Char_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Double_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Double_.java index 0c5efbb4003..9e40d011e92 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Double_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Double_.java @@ -24,7 +24,7 @@ /// The methods of `System.Double`, which is the primitive `double` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Double_ { private Double_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Enum_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Enum_.java index 68261375814..653a64bdbcb 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Enum_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Enum_.java @@ -30,7 +30,7 @@ /// so is this: `IsDefined`, `HasFlag` and `CompareTo` refuse a value of /// another enum, where `GetName` reads the number out of any enum or /// integer. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Enum_ { private Enum_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/EventHandler_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/EventHandler_1.java index 330eec71568..a254de80693 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/EventHandler_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/EventHandler_1.java @@ -23,7 +23,7 @@ package com.codename1.unitycompat.system; /// ``System.EventHandler`1``. The event argument is erased. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class EventHandler_1 extends MulticastDelegate { public abstract void Invoke(Object sender, Object e); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_1.java index 76166771547..a98907c1a83 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_1.java @@ -25,7 +25,7 @@ /// `System.Func`1`. Type arguments are erased, so every parameter is an /// `Object` and the generated subclass unboxes what the method it calls /// takes as a primitive. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class Func_1 extends MulticastDelegate { public abstract Object Invoke(); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_2.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_2.java index 44085c5d060..5ad6635def8 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_2.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_2.java @@ -25,7 +25,7 @@ /// `System.Func`2`. Type arguments are erased, so every parameter is an /// `Object` and the generated subclass unboxes what the method it calls /// takes as a primitive. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class Func_2 extends MulticastDelegate { public abstract Object Invoke(Object a0); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_3.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_3.java index b1b119ad361..1faa312b4cc 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_3.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_3.java @@ -25,7 +25,7 @@ /// `System.Func`3`. Type arguments are erased, so every parameter is an /// `Object` and the generated subclass unboxes what the method it calls /// takes as a primitive. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class Func_3 extends MulticastDelegate { public abstract Object Invoke(Object a0, Object a1); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_4.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_4.java index 755716b9233..9c9fada5c34 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_4.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Func_4.java @@ -25,7 +25,7 @@ /// `System.Func`4`. Type arguments are erased, so every parameter is an /// `Object` and the generated subclass unboxes what the method it calls /// takes as a primitive. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class Func_4 extends MulticastDelegate { public abstract Object Invoke(Object a0, Object a1, Object a2); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IComparable_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IComparable_1.java index f2f02425148..c7da0462c94 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IComparable_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IComparable_1.java @@ -23,7 +23,7 @@ package com.codename1.unitycompat.system; /// `System.IComparable`. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public interface IComparable_1 { int CompareTo(Object other); } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IEquatable_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IEquatable_1.java index 5ae0a9f5ae8..18a7009208f 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IEquatable_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/IEquatable_1.java @@ -23,7 +23,7 @@ package com.codename1.unitycompat.system; /// `System.IEquatable`. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public interface IEquatable_1 { boolean Equals(Object other); } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int16_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int16_.java index b4b2fd7fafa..0268e091c19 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int16_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int16_.java @@ -24,7 +24,7 @@ /// The methods of `System.Int16`, which is the primitive `short` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Int16_ { private Int16_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int32_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int32_.java index 18ce3e60bf2..0b004db7c2b 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int32_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int32_.java @@ -24,7 +24,7 @@ /// The methods of `System.Int32`, which is the primitive `int` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Int32_ { private Int32_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int64_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int64_.java index 3b4ba137295..bd9d1344fa9 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int64_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Int64_.java @@ -24,7 +24,7 @@ /// The methods of `System.Int64`, which is the primitive `long` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Int64_ { private Int64_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/MulticastDelegate.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/MulticastDelegate.java index 4cb7257b61f..bbce7684a50 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/MulticastDelegate.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/MulticastDelegate.java @@ -23,5 +23,6 @@ package com.codename1.unitycompat.system; /// `System.MulticastDelegate`: the base of every delegate type. +@SuppressWarnings("PMD.AbstractClassWithoutAnyMethod") // abstract in C#, so never instantiated here either public abstract class MulticastDelegate extends Delegate { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Object_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Object_.java index 2484316b98d..2be665b9ab1 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Object_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Object_.java @@ -26,7 +26,7 @@ /// class written in C# overrides `ToString`, `Equals` and `GetHashCode` as /// the Java methods of the same meaning, so these mostly forward; what they /// add is the .NET spelling of the values that are JDK boxes. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Object_ { private Object_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/SByte_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/SByte_.java index d1ae69d9db6..96a8d833ece 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/SByte_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/SByte_.java @@ -24,7 +24,7 @@ /// The methods of `System.SByte`, which is the primitive `byte` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class SByte_ { private SByte_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Single_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Single_.java index 48cf2241f63..54b6ed070e2 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Single_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/Single_.java @@ -24,7 +24,7 @@ /// The methods of `System.Single`, which is the primitive `float` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class Single_ { private Single_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/String_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/String_.java index 0d4518ba3b1..b6247f37e4c 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/String_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/String_.java @@ -25,7 +25,7 @@ /// The methods of `System.String`, which is `java.lang.String` here. The /// string comes first. Comparisons are ordinal and case changes are per /// character: translated code has no culture. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class String_ { public static final String Empty = ""; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt16_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt16_.java index d42a128cf0a..895892a8116 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt16_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt16_.java @@ -24,7 +24,7 @@ /// The methods of `System.UInt16`, which is the primitive `char` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class UInt16_ { private UInt16_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt32_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt32_.java index e149071e1e8..6f60c9f6ac4 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt32_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt32_.java @@ -24,7 +24,7 @@ /// The methods of `System.UInt32`, which is the primitive `int` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class UInt32_ { private UInt32_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt64_.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt64_.java index 90376bef65a..b50ec26762b 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt64_.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/UInt64_.java @@ -24,7 +24,7 @@ /// The methods of `System.UInt64`, which is the primitive `long` here and so /// cannot carry them itself. The value comes first. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class UInt64_ { private UInt64_() { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_2.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_2.java index dff2a790a87..89c27bec9ee 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_2.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_2.java @@ -27,7 +27,7 @@ /// constructor, `$new`, `$copy`, `$assign`, `$clear` and the array helpers /// -- written out by hand because this type comes from the base library and /// not from translated C#. The items are erased, like every type argument. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class ValueTuple_2 implements Struct { public Object Item1; public Object Item2; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_3.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_3.java index 5cb520fb2be..acb133f2b1e 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_3.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/ValueTuple_3.java @@ -27,7 +27,7 @@ /// constructor, `$new`, `$copy`, `$assign`, `$clear` and the array helpers /// -- written out by hand because this type comes from the base library and /// not from translated C#. The items are erased, like every type argument. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class ValueTuple_3 implements Struct { public Object Item1; public Object Item2; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/Dictionary_2.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/Dictionary_2.java index b9b7f46fc7a..121c44abcc2 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/Dictionary_2.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/Dictionary_2.java @@ -46,7 +46,7 @@ /// were added in, with an entry added after a removal taking the slot most /// recently freed. A `HashMap` alone would hand them out by hash code, /// which for an object is whatever the virtual machine made up. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public class Dictionary_2 implements IDictionary_2 { /// In `next`, a slot that holds an entry. private static final int LIVE = -2; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/ICollection_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/ICollection_1.java index 5bf4887dc41..b1dc4a83537 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/ICollection_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/ICollection_1.java @@ -28,7 +28,7 @@ /// this interface and a key through its own, and both are one `Object` /// once erased, so a call meant for the pair would be answered about the /// key; left out, such a call is named when the project is built. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public interface ICollection_1 extends IEnumerable_1 { int get_Count(); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IDictionary_2.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IDictionary_2.java index ce55229f2ac..4014c87264d 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IDictionary_2.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IDictionary_2.java @@ -26,7 +26,7 @@ /// script reaches a dictionary through it: the members below, the count /// of [ICollection_1], and the constructor of [Dictionary_2] that copies /// one. `Keys` and `Values` are read from the dictionary itself. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public interface IDictionary_2 extends ICollection_1 { void Add(Object key, Object value); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerable_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerable_1.java index b3ab334bd9d..fa966c762c0 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerable_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerable_1.java @@ -25,7 +25,7 @@ import com.codename1.unitycompat.system.collections.IEnumerable; /// `System.Collections.Generic.IEnumerable`. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public interface IEnumerable_1 extends IEnumerable { @Override IEnumerator_1 GetEnumerator(); diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerator_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerator_1.java index 5ad6dd6e475..a9134e2dbe0 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerator_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/IEnumerator_1.java @@ -27,5 +27,6 @@ /// `System.Collections.Generic.IEnumerator`. Erased, `Current` has the /// same shape as the non-generic one, so the two are one method. +@SuppressWarnings("PMD.ClassNamingConventions") // C# type names: the translator binds to them by name public interface IEnumerator_1 extends IEnumerator, IDisposable { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/KeyValuePair_2.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/KeyValuePair_2.java index 53474e0c642..a4e393b9175 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/KeyValuePair_2.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/KeyValuePair_2.java @@ -30,7 +30,7 @@ /// dictionary, which is what a `foreach` over one hands out. A struct, so /// it follows the protocol the translator expects of one, written out by /// hand because the type comes from the base library. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public final class KeyValuePair_2 implements Struct { Object key; Object value; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/List_1.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/List_1.java index f08b355d50b..e507f0c5973 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/List_1.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/system/collections/generic/List_1.java @@ -32,7 +32,7 @@ /// `System.Collections.Generic.List`. Elements are `Object`: the /// translator boxes a primitive and copies a struct on the way in. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public class List_1 implements ICollection_1 { private Object[] items; private int size; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/tmpro/TMP_Text.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/tmpro/TMP_Text.java index bdc87759c52..9a5e0686c94 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/tmpro/TMP_Text.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/tmpro/TMP_Text.java @@ -34,7 +34,7 @@ /// platform's font at the size asked for. The font asset, its material, /// outlines, gradients, character and line spacing, and rich text tags /// are not read; tags are drawn as written. -@SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name +@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.ClassNamingConventions"}) // C# member and type names: translated code binds to them by name public abstract class TMP_Text extends MaskableGraphic { private String text = ""; private float fontSize = 36f; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AnimationClip.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AnimationClip.java index 0b317180617..bb865ddf7c7 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AnimationClip.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AnimationClip.java @@ -35,7 +35,7 @@ /// its ancestors down from the one holding the [Animator] -- and a kind, /// one of the constants here. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public final class AnimationClip extends Object { +public final class AnimationClip extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object /// The transform's local position. public static final int POSITION_X = 0; public static final int POSITION_Y = 1; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AudioClip.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AudioClip.java index 3d47524a301..c756bb656b1 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AudioClip.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/AudioClip.java @@ -30,7 +30,7 @@ /// answer without the sound being opened here. A compressed file's length /// is not known until something decodes it and reads as zero. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public final class AudioClip extends Object { +public final class AudioClip extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object /// The resource the sound ships as. public final String resource; private final float length; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Component.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Component.java index ec5b49eab83..97bb6cc97a7 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Component.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Component.java @@ -24,7 +24,7 @@ /// `UnityEngine.Component`: something attached to a [GameObject]. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public class Component extends Object { +public class Component extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object GameObject gameObject; public GameObject get_gameObject() { diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/GameObject.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/GameObject.java index 82476930391..5c01788171f 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/GameObject.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/GameObject.java @@ -27,7 +27,7 @@ /// `UnityEngine.GameObject`: a named bag of components with a transform. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public final class GameObject extends Object { +public final class GameObject extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object final ArrayList components = new ArrayList(); final Transform transform; boolean active = true; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/RuntimeAnimatorController.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/RuntimeAnimatorController.java index 057c3ee4dc0..82c9a933d4f 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/RuntimeAnimatorController.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/RuntimeAnimatorController.java @@ -34,7 +34,7 @@ /// Only the first layer of a controller is run, and a state plays one clip: /// a blend tree plays its first. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public class RuntimeAnimatorController extends Object { +public class RuntimeAnimatorController extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object /// Parameter types, by the numbers a controller file uses. public static final int FLOAT = 1; public static final int INT = 3; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ScriptableObject.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ScriptableObject.java index 2e9d7edbe20..42fe71af2e9 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ScriptableObject.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ScriptableObject.java @@ -24,5 +24,5 @@ /// `UnityEngine.ScriptableObject`: an asset that is an object of a class /// and belongs to no scene. A tile of a tilemap is one. -public class ScriptableObject extends Object { +public class ScriptableObject extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Sprite.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Sprite.java index cddb4ac69d1..0d2f3d82ee8 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Sprite.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Sprite.java @@ -34,7 +34,7 @@ /// draw list can be worked out with no image loaded -- which is what lets /// that half run where there is no display. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public final class Sprite extends Object { +public final class Sprite extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object final String resource; /// The rectangle of the image this sprite is, in pixels from the /// image's top left. A sheet's sprites differ only in this. diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/TextAsset.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/TextAsset.java index 4f068950efe..8a240da4353 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/TextAsset.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/TextAsset.java @@ -31,7 +31,7 @@ /// decoded as UTF-8 if its text is asked for; any other is kept as its /// text, a byte order mark left out, and encoded as UTF-8 if its bytes are. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public final class TextAsset extends Object { +public final class TextAsset extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object private String text; private byte[] bytes; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Texture.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Texture.java index 64959e5b949..1983f76a691 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Texture.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/Texture.java @@ -24,7 +24,7 @@ /// `UnityEngine.Texture`: an image, known here by its size alone. @SuppressWarnings("PMD.MethodNamingConventions") // C# member names: translated code binds to them by name -public class Texture extends Object { +public class Texture extends Object { // NOPMD ExtendsObject - UnityEngine.Object, not java.lang.Object int width; int height; diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/eventsystems/UIBehaviour.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/eventsystems/UIBehaviour.java index 4281b6a57cb..a4d8492062f 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/eventsystems/UIBehaviour.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/eventsystems/UIBehaviour.java @@ -27,5 +27,6 @@ /// `UnityEngine.EventSystems.UIBehaviour`: what every user interface /// component derives from. It adds nothing a script can use; it is here /// because the classes that derive from it say so in their signatures. +@SuppressWarnings("PMD.AbstractClassWithoutAnyMethod") // abstract in C#, so never instantiated here either public abstract class UIBehaviour extends MonoBehaviour { } diff --git a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ui/MaskableGraphic.java b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ui/MaskableGraphic.java index a89bfe7f7c8..61acbc4cade 100644 --- a/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ui/MaskableGraphic.java +++ b/maven/unity-compat/src/main/java/com/codename1/unitycompat/unityengine/ui/MaskableGraphic.java @@ -24,5 +24,6 @@ /// `UnityEngine.UI.MaskableGraphic`: a graphic a mask can clip. Masks are /// not implemented; the class is the base Unity gives [Text]. +@SuppressWarnings("PMD.AbstractClassWithoutAnyMethod") // abstract in C#, so never instantiated here either public abstract class MaskableGraphic extends Graphic { } From 1617be9fd4f840659f0cda0778da45961839e53a Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 27 Oct 2026 15:27:14 +0200 Subject: [PATCH 3/3] Drop the remaining references to the old PMD forbidden list Co-Authored-By: Claude Opus 5.5 --- .github/scripts/generate-quality-report.py | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/unity-compat.yml | 6 +++--- CLAUDE.md | 7 +++++-- .../src/com/codename1/backend/test/OtlpTestCollector.java | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index 6a5a632f683..22334161efb 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -485,7 +485,7 @@ def parse_pmd() -> Optional[AnalysisReport]: root = ET.parse(report_path).getroot() except ET.ParseError: # Unreadable is not clean. Reported as a finding of its own so the - # forbidden-rule gate below cannot mistake it for an empty report. + # PMD gate below cannot mistake it for an empty report. findings.append(Finding(severity="P1", location=str(report_path), message="PMD report could not be parsed", rule="UnparseableReport")) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 194431d2822..c1f925931e2 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -782,7 +782,7 @@ jobs: # SpotBugs run that silently stops running is not mistaken for clean. QUALITY_REPORT_REQUIRED_SPOTBUGS: core-unittests:android:ios:ByteCodeTranslator:codenameone-maven-plugin:build-engine:project-model:codenameone-gradle-plugin:build-hint-catalog:build-hint-tools:backend:backend-test:javac:android-res-compiler:android-compat:swing-compat:javafx-compat:fxml-compiler:desktop-compat-runtime # PMD and Checkstyle run on the core and on the backend runtime, and each - # must produce its report: without one, the forbidden-rule gate below it + # must produce its report: without one, the PMD gate below it # has nothing to read and passes. QUALITY_REPORT_REQUIRED_PMD: core-unittests:backend:backend-test:backend-parparvm QUALITY_REPORT_REQUIRED_CHECKSTYLE: core-unittests:backend:backend-test diff --git a/.github/workflows/unity-compat.yml b/.github/workflows/unity-compat.yml index 58850cde64a..81600bdabb4 100644 --- a/.github/workflows/unity-compat.yml +++ b/.github/workflows/unity-compat.yml @@ -20,8 +20,8 @@ name: Unity compatibility # built by the application's own Maven build and # staged for every target, then converted to # Gradle and staged again: the same entries -# static analysis SpotBugs (zero findings), PMD (the forbidden -# list) and Checkstyle (zero errors) over both +# static analysis SpotBugs (zero findings), PMD (zero +# findings) and Checkstyle (zero errors) over both # modules, enforced by the script PR CI uses for # the rest of the tree, and the ClassCastException # gate over the runtime, which ParparVM translates @@ -180,7 +180,7 @@ jobs: rm -f cil-translator/target/spotbugsXml.xml cil-translator/target/pmd.xml cil-translator/target/checkstyle-result.xml rm -f unity-compat/target/spotbugsXml.xml unity-compat/target/pmd.xml unity-compat/target/checkstyle-result.xml xvfb-run -a mvn -B -Plocal-dev-javase -Dunity-compat -DskipTests -pl cil-translator,unity-compat verify - # The same script, with the same forbidden PMD list, that judges the rest + # The same script, with the same zero-findings PMD gate, that judges the rest # of the tree in pr.yml. PMD only writes a report, so this step is what # enforces it; every module named must have produced each report. - name: Enforce the quality gates diff --git a/CLAUDE.md b/CLAUDE.md index fed52d92802..3978f627c1f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -910,8 +910,11 @@ exceptions, so that the next finding is fixed rather than added to them: `get_position`, `GetComponent` and `Item1` are what translated bytecode calls, so SpotBugs' `NM_*` patterns are excluded for `com.codename1.unitycompat.{system,unityengine}` and each class with such - members carries `@SuppressWarnings("PMD.MethodNamingConventions")`. A new - runtime class needs that annotation; a Java-named helper never does. + members carries `@SuppressWarnings("PMD.MethodNamingConventions")` -- plus + `"PMD.ClassNamingConventions"` when the type itself has a C# name + (`Action_1`, `Int32_`, `TMP_Text`). A new runtime class needs that + annotation; a Java-named helper never does. An `extends Object` in + `unityengine` is `UnityEngine.Object`, so it carries `// NOPMD ExtendsObject`. - **The translated classes are left out of SpotBugs by name** (`UnityEngine.*`): they are generated bytecode in `target/classes` with no Java source. PMD and Checkstyle read sources and never see them. A finding diff --git a/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java b/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java index 32565ffbe82..5a323e9b309 100644 --- a/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java +++ b/vm/backend/test/src/com/codename1/backend/test/OtlpTestCollector.java @@ -51,7 +51,7 @@ public final class OtlpTestCollector { private final List bodies = new ArrayList(); private OtlpTestCollector(int port) throws IOException { - server = HttpServer.start("127.0.0.1", port, 64, 2, new HttpServer.Handler() { //NOPMD AvoidUsingHardCodedIP - the test collector binds loopback only + server = HttpServer.start("127.0.0.1", port, 64, 2, new HttpServer.Handler() { // NOPMD AvoidUsingHardCodedIP - the test collector binds loopback only @Override public HttpServer.Response handle(HttpServer.Request request) { record(request.getTarget(), request.getBodyBytes());