From 6e1fc6974b4617434aea332930577b7d9291a609 Mon Sep 17 00:00:00 2001 From: Dimitry Polivaev Date: Thu, 21 Mar 2024 22:00:05 +0100 Subject: [PATCH 1/2] Handle $ at the end of class names for better Scala support See https://stackoverflow.com/questions/41570148/why-does-scala-place-a-dollar-sign-at-the-end-of-class-names Signed-off-by: Dimitry Polivaev --- .../java/com/tngtech/archunit/core/domain/Formatters.java | 6 +++++- .../com/tngtech/archunit/core/domain/FormattersTest.java | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java b/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java index a5a4628b31..9fb2930d6c 100644 --- a/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java +++ b/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java @@ -118,7 +118,11 @@ public static String ensureSimpleName(String name) { int lastIndexOfDot = name.lastIndexOf('.'); String partAfterDot = lastIndexOfDot >= 0 ? name.substring(lastIndexOfDot + 1) : name; - int lastIndexOf$ = partAfterDot.lastIndexOf('$'); + int lastFinalNon$ = partAfterDot.length() - 1; + while(lastFinalNon$ > 0 && partAfterDot.charAt(lastFinalNon$) == '$') { + lastFinalNon$--; + } + int lastIndexOf$ = lastFinalNon$ > 0 ? partAfterDot.lastIndexOf('$', lastFinalNon$ - 1): -1; String simpleNameCandidate = lastIndexOf$ >= 0 ? partAfterDot.substring(lastIndexOf$ + 1) : partAfterDot; for (int i = 0; i < simpleNameCandidate.length(); i++) { diff --git a/archunit/src/test/java/com/tngtech/archunit/core/domain/FormattersTest.java b/archunit/src/test/java/com/tngtech/archunit/core/domain/FormattersTest.java index 4eef0db7af..cc61796b8f 100644 --- a/archunit/src/test/java/com/tngtech/archunit/core/domain/FormattersTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/core/domain/FormattersTest.java @@ -62,8 +62,13 @@ public static Object[][] simple_name_test_cases() { $("", ""), $("Dummy", "Dummy"), $("org.example.Dummy", "Dummy"), + $("org.example.Dummy$", "Dummy$"), + $("org.example.Dummy$$", "Dummy$$"), + $("org.example.Dummy$$$", "Dummy$$$"), + $("org.example.$$$", "$$$"), $("org.example.Dummy$123", ""), $("org.example.Dummy$NestedClass", "NestedClass"), + $("org.example.Dummy$NestedClass$", "NestedClass$"), $("org.example.Dummy$NestedClass123", "NestedClass123"), $("org.example.Dummy$NestedClass$123", ""), $("org.example.Dummy$NestedClass$MoreNestedClass", "MoreNestedClass"), From e70fdd805c27b0cfbd61ace3fc3f51ae6b85873e Mon Sep 17 00:00:00 2001 From: Dimitry Polivaev Date: Thu, 21 Mar 2024 22:11:15 +0100 Subject: [PATCH 2/2] Handle $ at the end of class names for better Scala support See https://stackoverflow.com/questions/41570148/why-does-scala-place-a-dollar-sign-at-the-end-of-class-names Signed-off-by: Dimitry Polivaev --- .../java/com/tngtech/archunit/core/domain/Formatters.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java b/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java index 9fb2930d6c..4009de38bd 100644 --- a/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java +++ b/archunit/src/main/java/com/tngtech/archunit/core/domain/Formatters.java @@ -118,11 +118,11 @@ public static String ensureSimpleName(String name) { int lastIndexOfDot = name.lastIndexOf('.'); String partAfterDot = lastIndexOfDot >= 0 ? name.substring(lastIndexOfDot + 1) : name; - int lastFinalNon$ = partAfterDot.length() - 1; - while(lastFinalNon$ > 0 && partAfterDot.charAt(lastFinalNon$) == '$') { - lastFinalNon$--; + int lastIndexOfNon$ = partAfterDot.length() - 1; + while(lastIndexOfNon$ > 0 && partAfterDot.charAt(lastIndexOfNon$) == '$') { + lastIndexOfNon$--; } - int lastIndexOf$ = lastFinalNon$ > 0 ? partAfterDot.lastIndexOf('$', lastFinalNon$ - 1): -1; + int lastIndexOf$ = lastIndexOfNon$ > 0 ? partAfterDot.lastIndexOf('$', lastIndexOfNon$ - 1): -1; String simpleNameCandidate = lastIndexOf$ >= 0 ? partAfterDot.substring(lastIndexOf$ + 1) : partAfterDot; for (int i = 0; i < simpleNameCandidate.length(); i++) {