Repository: Camelcade/Perl5-IDEA
Pull request #2984: Hurricup/cleanup
Author: login: hurricup
Created: 2025-05-19T06:35:53Z | Merged: 2025-05-19T08:07:44Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **Refactor**
  - Increased visibility of several classes and nested classes, making them publicly accessible in various modules.
  - Adjusted constructor access levels for improved encapsulation.
  - Updated method and class annotations, including interface implementations and override annotations.
  - Streamlined code by replacing explicit collectors with more concise list collection methods.
  - Minor improvements to string concatenation and method naming for clarity.

- **Chores**
  - Updated copyright years throughout the codebase.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java b/plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java
index ff534fd6f9..669b30c13d 100644
--- a/plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java
+++ b/plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2022 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -46,14 +46,14 @@ public YoutrackCustomFieldValue(String name) {
     }
   }
 
-  private abstract static class YoutrackCustomField {
+  public abstract static class YoutrackCustomField {
     @SuppressWarnings("unused") @Expose
     public final String name;
     @SuppressWarnings("unused") @Expose
     @SerializedName("$type")
     public final String type;
 
-    public YoutrackCustomField(String name, String type) {
+    protected YoutrackCustomField(String name, String type) {
       this.name = name;
       this.type = type;
     }
@@ -70,11 +70,11 @@ public YoutrackSingleCustomField(String name, String type, String value) {
   }
 
 
-  static final class YoutrackProject {
+  public static final class YoutrackProject {
     @SuppressWarnings("unused") @Expose
     public final String id;
 
-    public YoutrackProject(String id) {
+    YoutrackProject(String id) {
       this.id = id;
     }
   }
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArgumentsValue.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArgumentsValue.java
index 5d1c173f97..c302b889e5 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArgumentsValue.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArgumentsValue.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
 /**
  * Pseudo-value representing sub input arguments
  */
-final class PerlArgumentsValue extends PerlSpecialValue {
+public final class PerlArgumentsValue extends PerlSpecialValue {
   static final PerlArgumentsValue INSTANCE = new PerlArgumentsValue();
 
   private PerlArgumentsValue() {
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java
index 333fd3be7a..9220792fbc 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -118,7 +118,7 @@ public static PerlValue create(@NotNull PerlValue ... values){
     return new Builder();
   }
 
-  static class Builder extends PerlListValue.Builder<Builder> {
+  public static class Builder extends PerlListValue.Builder<Builder> {
     private Builder() {
     }
 
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java
index 17f3051a67..78c9b74fbb 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@ protected PerlMapValue(@NotNull List<PerlValue> elements) {
 
   @Override
   public String toString() {
-    return "Hash: " + getElements().toString();
+    return "Hash: " + getElements();
   }
 
   @Override
@@ -62,7 +62,7 @@ public String toString() {
    * @implNote we have two different maps: deterministic and deferred.
    * Deterministic means that all keys and values has scalar context
    */
-  static class Builder extends PerlListValue.Builder<Builder> {
+  public static class Builder extends PerlListValue.Builder<Builder> {
     private Builder() {
     }
 
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlScalarContextValue.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlScalarContextValue.java
index bcb575c7bf..2411d32c99 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlScalarContextValue.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlScalarContextValue.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2023 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,7 +80,7 @@ protected int getSerializationId() {
 
   @Override
   public String toString() {
-    return "scalar " + getBaseValue().toString();
+    return "scalar " + getBaseValue();
   }
 
   @Override
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUndefValue.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUndefValue.java
index 72c16dff7a..d7809b1618 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUndefValue.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUndefValue.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
 import com.perl5.lang.perl.psi.utils.PerlContextType;
 import org.jetbrains.annotations.NotNull;
 
-final class PerlUndefValue extends PerlSpecialValue {
+public final class PerlUndefValue extends PerlSpecialValue {
   static final PerlUndefValue INSTANCE = new PerlUndefValue();
 
   private PerlUndefValue() {
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUnknownValue.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUnknownValue.java
index e4058e6b9b..66931d19c6 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUnknownValue.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUnknownValue.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-final class PerlUnknownValue extends PerlSpecialValue {
+public final class PerlUnknownValue extends PerlSpecialValue {
   static final PerlUnknownValue INSTANCE = new PerlUnknownValue();
 
   private PerlUnknownValue() {
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlValueSerializer.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlValueSerializer.java
index 6518b012b9..8c9219a4d1 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlValueSerializer.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlValueSerializer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,11 +24,11 @@
 import java.io.IOException;
 import java.util.Collection;
 
-final class PerlValueSerializer {
+public final class PerlValueSerializer {
   private final @NotNull StubOutputStream myOutputStream;
   private final Object2IntOpenHashMap<PerlValue> myDryMap = new Object2IntOpenHashMap<>();
 
-  public PerlValueSerializer(@NotNull StubOutputStream outputStream) {
+  PerlValueSerializer(@NotNull StubOutputStream outputStream) {
     myOutputStream = outputStream;
   }
 
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/configuration/settings/sdk/Perl5SdkConfigurable.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/configuration/settings/sdk/Perl5SdkConfigurable.java
index dd54ebd7c7..bf554ac0e0 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/configuration/settings/sdk/Perl5SdkConfigurable.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/configuration/settings/sdk/Perl5SdkConfigurable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -149,7 +149,7 @@ public void update(@NotNull AnActionEvent e) {
         };
         hostActionGroup.getTemplatePresentation().setIcon(hostHandler.getIcon());
         return hostActionGroup;
-    }).collect(Collectors.toList());
+      }).toList();
 
     if (groups.size() == 1) {
       for (AnAction action : groups.getFirst().getChildren(null)) {
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/formatter/PerlDocumentBasedFormattingModel.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/formatter/PerlDocumentBasedFormattingModel.java
index 21f8e3f7cf..9a0fd0b8bb 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/formatter/PerlDocumentBasedFormattingModel.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/formatter/PerlDocumentBasedFormattingModel.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -83,7 +83,7 @@ private int shiftIndentInside(final TextRange elementRange, final int shift) {
           else {
             createWhiteSpace(whiteSpaceLength, buffer);
           }
-          buffer.append(afterWhiteSpace.toString());
+          buffer.append(afterWhiteSpace);
           insideWhiteSpace = true;
           whiteSpaceLength = 0;
           afterWhiteSpace = new StringBuilder();
@@ -114,7 +114,7 @@ private int shiftIndentInside(final TextRange elementRange, final int shift) {
     }
     if (line > 0 && !afterWhiteSpace.isEmpty()) {
       createWhiteSpace(whiteSpaceLength + shift, buffer);
-      buffer.append(afterWhiteSpace.toString());
+      buffer.append(afterWhiteSpace);
     }
     getDocument().replaceString(elementRange.getStartOffset(), elementRange.getEndOffset(), buffer.toString());
     return buffer.length();
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/hierarchy/namespace/PerlHierarchyNodeDescriptor.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/hierarchy/namespace/PerlHierarchyNodeDescriptor.java
index fd799a4320..7fc3965a03 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/hierarchy/namespace/PerlHierarchyNodeDescriptor.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/hierarchy/namespace/PerlHierarchyNodeDescriptor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -75,7 +75,7 @@ public boolean update() {
 
   protected void adjustAppearance(CompositeAppearance appearance, ItemPresentation presentation) {
     appearance.getEnding().addText(" "
-                                   + "(" + ((PerlNamespaceDefinitionElement)getPerlElement()).getMroType().toString() + "), "
+                                   + "(" + ((PerlNamespaceDefinitionElement)getPerlElement()).getMroType() + "), "
                                    + presentation.getLocationString(),
                                    HierarchyNodeDescriptor.getPackageNameAttributes());
   }
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java
index a134057e50..a7dab87f6b 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -92,7 +92,7 @@ public boolean isCellEditable(EventObject event) {
           if (cellEditor != null) {
             cellEditor.stopCellEditing();
           }
-          final MyModel model = getModel();
+            var model = getMyModel();
 
           int indexToEdit = -1;
 
@@ -118,14 +118,13 @@ public boolean isCellEditable(EventObject event) {
     return panel;
   }
 
-  @Override
-  public MyModel getModel() {
+  private MyModel getMyModel() {
     return (MyModel)super.getModel();
   }
 
   @Override
   public boolean isModified() {
-    return !new HashSet<>(computeItems()).equals(new HashSet<>(getModel().getItems()));
+    return !new HashSet<>(computeItems()).equals(new HashSet<>(getMyModel().getItems()));
   }
 
   private List<Item> computeItems() {
@@ -137,7 +136,7 @@ private List<Item> computeItems() {
 
   @Override
   public void reset() {
-    getModel().setItems(computeItems());
+    getMyModel().setItems(computeItems());
   }
 
   @Override
@@ -147,7 +146,7 @@ public void apply() {
     }
 
     Map<String, String> result = new HashMap<>();
-    getModel().getItems().forEach(item -> result.putIfAbsent(item.marker, item.languageId));
+    getMyModel().getItems().forEach(item -> result.putIfAbsent(item.marker, item.languageId));
     PerlInjectionMarkersService.getInstance(myProject).setCustomMarkersMap(result);
     FileContentUtil.reparseOpenedFiles();
   }
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/PerlIntroduceVariableHandler.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/PerlIntroduceVariableHandler.java
index aae7ad555a..0b9db2d8f6 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/PerlIntroduceVariableHandler.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/PerlIntroduceVariableHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -55,7 +55,6 @@
 import org.jetbrains.annotations.Nullable;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 public class PerlIntroduceVariableHandler implements RefactoringActionHandler {
   private static final Logger LOG = Logger.getInstance(PerlIntroduceVariableHandler.class);
@@ -185,7 +184,7 @@ private void performIntroduce(@NotNull PerlIntroduceTarget target,
     List<PsiElement> psiOccurrences = psiOccurrencesPointers.stream()
       .map(SmartPsiElementPointer::getElement)
       .filter(Objects::nonNull)
-      .collect(Collectors.toList());
+      .toList();
 
 
     if (!new PerlVariableIntroducer(variableDeclaration,
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlGenericStringTargetsHandler.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlGenericStringTargetsHandler.java
index 8c626ea7d6..9424587f77 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlGenericStringTargetsHandler.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlGenericStringTargetsHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -180,7 +180,7 @@ else if (target.isFullRange()) {
     }
 
     return prefix + openQuote +
-           target.getTextRangeInElement().subSequence(targetPlace.getNode().getChars()).toString() +
+           target.getTextRangeInElement().subSequence(targetPlace.getNode().getChars()) +
            PerlString.getQuoteCloseChar(openQuote);
   }
 
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlStringsTargetsHandler.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlStringsTargetsHandler.java
index a3d696c408..96f80ea8e4 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlStringsTargetsHandler.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlStringsTargetsHandler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -116,7 +116,7 @@ protected boolean shouldAddElementAsTarget() {
 
     PsiElement statement = PerlElementFactory.createStatement(elementToReplace.getProject(), result.toString());
     if (statement == null) {
-      LOG.error("Unable create a replacement statement from: " + elementToReplace.getText() + "\n text: " + result.toString());
+      LOG.error("Unable create a replacement statement from: " + elementToReplace.getText() + "\n text: " + result);
       replacementRanges.clear();
       return elementToReplace;
     }
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlSMTRunnerConsoleProperties.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlSMTRunnerConsoleProperties.java
index 8d9c3b205f..72406c087b 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlSMTRunnerConsoleProperties.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlSMTRunnerConsoleProperties.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,8 +26,8 @@
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-class PerlSMTRunnerConsoleProperties extends SMTRunnerConsoleProperties {
-  public PerlSMTRunnerConsoleProperties(@NotNull RunConfiguration config,
+public class PerlSMTRunnerConsoleProperties extends SMTRunnerConsoleProperties {
+  PerlSMTRunnerConsoleProperties(@NotNull RunConfiguration config,
                                         @NotNull String testFrameworkName,
                                         @NotNull Executor executor) {
     super(config, testFrameworkName, executor);
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfiguration.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfiguration.java
index 3dd4a10133..71194079ee 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfiguration.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfiguration.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2023 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -57,10 +57,12 @@ public PerlTestRunConfiguration(@NotNull Project project,
     super(project, factory, name);
   }
 
+  @Override
   protected @NotNull List<String> getDefaultTestRunnerArguments() {
     return PROVE_DEFAULT_ARGUMENTS;
   }
 
+  @Override
   protected @NotNull String getTestRunnerLocalPath() throws ExecutionException {
     Sdk perlSdk = getEffectiveSdk();
     VirtualFile proveScript = PerlRunUtil.findLibraryScriptWithNotification(perlSdk, getProject(), PROVE, PerlPackageUtil.TEST_HARNESS_MODULE);
@@ -101,6 +103,7 @@ else if (PROVE_FORMAT_ARGUMENT.equals(userParameter) || PROVE_JOBS_PARAMETER.equ
     return userArguments;
   }
 
+  @Override
   protected @NotNull String getFrameworkName() {
     return PROVE_FRAMEWORK_NAME;
   }
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfigurationEditor.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfigurationEditor.java
index 820e658c25..81ba58560c 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfigurationEditor.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfigurationEditor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -57,14 +57,14 @@ public PerlTestRunConfigurationEditor(@NotNull Project project,
   }
 
 
-  private class ArgumentsPanel extends GenericPerlRunConfigurationEditorPanel<PerlAbstractTestRunConfiguration> {
+  protected class ArgumentsPanel extends GenericPerlRunConfigurationEditorPanel<PerlAbstractTestRunConfiguration> {
     private JComboBox<Integer> myJobsCombobox;
     private LabeledComponent<JComboBox<Integer>> myLabeledJobsCombobox;
 
     private RawCommandLineEditor myTestScriptArgumentsEditor;
     private LabeledComponent<RawCommandLineEditor> myLabeledTestScriptArgumentsEditor;
 
-    public ArgumentsPanel(@NotNull Project project) {
+    protected ArgumentsPanel(@NotNull Project project) {
       super(project);
     }
 
@@ -103,7 +103,7 @@ protected void reset(PerlAbstractTestRunConfiguration runConfiguration) {
     protected void applyTo(PerlAbstractTestRunConfiguration runConfiguration) {
       super.applyTo(runConfiguration);
       Object item = myJobsCombobox.getSelectedItem();
-      runConfiguration.setJobsNumber(item instanceof Integer ? (Integer)item : PerlTestRunConfiguration.DEFAULT_JOBS_NUMBER);
+      runConfiguration.setJobsNumber(item instanceof Integer integer ? integer : PerlTestRunConfiguration.DEFAULT_JOBS_NUMBER);
       runConfiguration.setTestScriptParameters(myTestScriptArgumentsEditor.getText());
     }
 
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/idea/sdk/PerlSdkType.java b/plugin/core/src/main/java/com/perl5/lang/perl/idea/sdk/PerlSdkType.java
index 9b56b3e720..e2468439ee 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/idea/sdk/PerlSdkType.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/idea/sdk/PerlSdkType.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2023 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -56,7 +56,6 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.function.Consumer;
-import java.util.stream.Collectors;
 
 
 public class PerlSdkType extends SdkType {
@@ -109,7 +108,7 @@ public void setupSdkPaths(@NotNull Sdk sdk) {
       List<VirtualFile> filesToRefresh = pathsToRefresh.stream()
         .map(it -> VfsUtil.findFileByIoFile(new File(it), true))
         .filter(Objects::nonNull)
-        .collect(Collectors.toList());
+        .toList();
 
       if (!filesToRefresh.isEmpty()) {
         PerlRunUtil.setProgressText(PerlBundle.message("perl.progress.refreshing.filesystem"));
@@ -190,6 +189,7 @@ private static void syncAndCollectException(@NotNull PerlHostFileTransfer<?> fil
   }
 
 
+  @SuppressWarnings("deprecation")
   @Override
   public @Nullable String suggestHomePath() {
     throw new RuntimeException("unsupported");
@@ -332,10 +332,13 @@ public static void createSdk(@NotNull String interpreterPath,
     sdkConsumer.accept(newSdk);
   }
 
-  private static class VersionDescriptor {
+  public static class VersionDescriptor {
     private String version;
     private String platform;
 
+    private VersionDescriptor() {
+    }
+
     private static @Nullable VersionDescriptor create(@NotNull List<String> perlResponse) {
       if (perlResponse.size() != 3 || !StringUtil.equals("perl", perlResponse.get(0))) {
         LOG.warn("Got inappropriate response from perl: " + StringUtil.join(perlResponse, "\n"));
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/parser/moose/idea/inspections/MooseMultiAttributeAccessorInspection.java b/plugin/core/src/main/java/com/perl5/lang/perl/parser/moose/idea/inspections/MooseMultiAttributeAccessorInspection.java
index 01abbd5712..643763e87c 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/parser/moose/idea/inspections/MooseMultiAttributeAccessorInspection.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/parser/moose/idea/inspections/MooseMultiAttributeAccessorInspection.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -31,7 +31,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 public class MooseMultiAttributeAccessorInspection extends PerlInspection {
   @Override
@@ -64,7 +63,7 @@ public void visitSubCall(@NotNull PsiPerlSubCall o) {
         accessors.forEach(it -> registerProblem(holder, it.getNameIdentifier(), PerlBundle.message("perl.inspection.multiattr.accessor")));
         List<PsiElement> attributesIdentifiers = attributes.stream()
           .map(PerlDelegatingLightNamedElement::getNameIdentifier)
-          .distinct().collect(Collectors.toList());
+          .distinct().toList();
         if (attributesIdentifiers.size() == 1) {
           // same identifier looks like an accessor
           registerProblem(holder, attributesIdentifiers.getFirst(), PerlBundle.message("perl.inspection.multiattr.accessor"));
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/psi/PerlStubBasedPsiElementBase.java b/plugin/core/src/main/java/com/perl5/lang/perl/psi/PerlStubBasedPsiElementBase.java
index f08f0d75f7..35ad464363 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/psi/PerlStubBasedPsiElementBase.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/psi/PerlStubBasedPsiElementBase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,9 +20,11 @@
 import com.intellij.lang.ASTNode;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.ResolveState;
+import com.intellij.psi.StubBasedPsiElement;
 import com.intellij.psi.scope.PsiScopeProcessor;
 import com.intellij.psi.stubs.IStubElementType;
 import com.intellij.psi.stubs.StubElement;
+import com.intellij.psi.tree.IElementType;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.perl5.lang.perl.psi.utils.PerlResolveUtil;
 import org.jetbrains.annotations.NotNull;
@@ -30,7 +32,7 @@
 import java.util.List;
 
 
-public class PerlStubBasedPsiElementBase<T extends StubElement<?>> extends StubBasedPsiElementBase<T> {
+public class PerlStubBasedPsiElementBase<T extends StubElement<?>> extends StubBasedPsiElementBase<T> implements StubBasedPsiElement<T> {
   public PerlStubBasedPsiElementBase(@NotNull T stub, @NotNull IStubElementType nodeType) {
     super(stub, nodeType);
   }
@@ -41,7 +43,12 @@ public PerlStubBasedPsiElementBase(@NotNull ASTNode node) {
 
   @Override
   public String toString() {
-    return getClass().getSimpleName() + "(" + getElementType().toString() + ")";
+    return getClass().getSimpleName() + "(" + getIElementType() + ")";
+  }
+
+  @Override
+  public final IElementType getIElementType() {
+    return getElementTypeImpl();
   }
 
   @Override
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/psi/impl/PerlLeafPsiElement.java b/plugin/core/src/main/java/com/perl5/lang/perl/psi/impl/PerlLeafPsiElement.java
index 7ec3fd7feb..8eae802821 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/psi/impl/PerlLeafPsiElement.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/psi/impl/PerlLeafPsiElement.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2023 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -41,6 +41,6 @@ public final PsiReference getReference() {
 
   @Override
   public String toString() {
-    return getClass().getSimpleName() + "(" + getNode().getElementType().toString() + ")";
+    return getClass().getSimpleName() + "(" + getNode().getElementType() + ")";
   }
 }
diff --git a/plugin/core/src/main/java/com/perl5/lang/perl/psi/stubs/namespaces/PerlNamespaceDefinitionStub.java b/plugin/core/src/main/java/com/perl5/lang/perl/psi/stubs/namespaces/PerlNamespaceDefinitionStub.java
index d2ce0f5b3a..aae3d5af16 100644
--- a/plugin/core/src/main/java/com/perl5/lang/perl/psi/stubs/namespaces/PerlNamespaceDefinitionStub.java
+++ b/plugin/core/src/main/java/com/perl5/lang/perl/psi/stubs/namespaces/PerlNamespaceDefinitionStub.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2020 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,6 +80,6 @@ public PerlNamespaceDefinitionStub(@Nullable StubElement parent,
 
   @Override
   public String toString() {
-    return super.toString() + "\n" + myData.toString();
+    return super.toString() + "\n" + myData;
   }
 }
diff --git a/plugin/core/src/main/java/com/perl5/lang/pod/parser/psi/mixin/PodStubBasedSection.java b/plugin/core/src/main/java/com/perl5/lang/pod/parser/psi/mixin/PodStubBasedSection.java
index b3b873f79e..953222391d 100644
--- a/plugin/core/src/main/java/com/perl5/lang/pod/parser/psi/mixin/PodStubBasedSection.java
+++ b/plugin/core/src/main/java/com/perl5/lang/pod/parser/psi/mixin/PodStubBasedSection.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2019 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,12 +18,15 @@
 
 import com.intellij.extapi.psi.StubBasedPsiElementBase;
 import com.intellij.lang.ASTNode;
+import com.intellij.psi.StubBasedPsiElement;
 import com.intellij.psi.stubs.IStubElementType;
+import com.intellij.psi.tree.IElementType;
 import com.perl5.lang.pod.parser.psi.PodSection;
 import com.perl5.lang.pod.parser.psi.stubs.PodSectionStub;
 import org.jetbrains.annotations.NotNull;
 
-public abstract class PodStubBasedSection extends StubBasedPsiElementBase<PodSectionStub> implements PodSection {
+public abstract class PodStubBasedSection extends StubBasedPsiElementBase<PodSectionStub>
+  implements PodSection, StubBasedPsiElement<PodSectionStub> {
   public PodStubBasedSection(@NotNull PodSectionStub stub,
                              @NotNull IStubElementType nodeType) {
     super(stub, nodeType);
@@ -33,8 +36,13 @@ public PodStubBasedSection(@NotNull ASTNode node) {
     super(node);
   }
 
+  @Override
+  public final IElementType getIElementType() {
+    return getElementTypeImpl();
+  }
+
   @Override
   public String toString() {
-    return getClass().getSimpleName() + "(" + getElementType().toString() + ")";
+    return getClass().getSimpleName() + "(" + getIElementType() + ")";
   }
 }
diff --git a/plugin/cpanminus/src/main/java/com/perl5/lang/perl/cpanminus/runAnything/PerlCpanminusRunAnythingProvider.java b/plugin/cpanminus/src/main/java/com/perl5/lang/perl/cpanminus/runAnything/PerlCpanminusRunAnythingProvider.java
index 41a602e191..1b5472b9eb 100644
--- a/plugin/cpanminus/src/main/java/com/perl5/lang/perl/cpanminus/runAnything/PerlCpanminusRunAnythingProvider.java
+++ b/plugin/cpanminus/src/main/java/com/perl5/lang/perl/cpanminus/runAnything/PerlCpanminusRunAnythingProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2024 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -442,7 +442,7 @@ else if (allOptionsMap.containsKey(value)) {
     return commandsMap.isEmpty() ? Collections.emptySet() : Collections.unmodifiableSet(commandsMap);
   }
 
-  private static class OptionDescriptor {
+  public static class OptionDescriptor {
     private static final OptionDescriptor UNKNOWN = new OptionDescriptor("", null, null, null);
     final @NotNull String value;
     final @Nullable String placeholder;
@@ -504,7 +504,7 @@ public static class CommandElement {
     final @NotNull OptionDescriptor descriptor;
     final @NotNull List<String> parameters = new ArrayList<>();
 
-    public CommandElement(@NotNull OptionDescriptor descriptor) {
+    private CommandElement(@NotNull OptionDescriptor descriptor) {
       this.descriptor = descriptor;
     }
 
diff --git a/plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java b/plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java
index 43d025537d..b65166ae69 100644
--- a/plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java
+++ b/plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java
@@ -1378,7 +1378,7 @@ protected void doTestMassQuickFixes(@NotNull String fileName,
         previewBuilder.append(PREVIEW_SEPARATOR).append(getIntentionPreview(action));
         myFixture.launchAction(action);
       });
-    UsefulTestCase.assertSameLinesWithFile(getTestResultsFilePath(), getEditorTextWithCaretsAndSelections() + previewBuilder.toString());
+    UsefulTestCase.assertSameLinesWithFile(getTestResultsFilePath(), getEditorTextWithCaretsAndSelections() + previewBuilder);
   }
 
   protected void doTestAnnotationQuickFix(@NotNull String fileName,
@@ -2760,7 +2760,7 @@ protected void doTestSurrounders(Predicate<String> namePredicate, boolean should
       return;
     }
 
-    List<String> actionNames = actions.stream().map(AnAction::toString).filter(namePredicate).collect(Collectors.toList());
+    List<String> actionNames = actions.stream().map(AnAction::toString).filter(namePredicate).toList();
     if (actionNames.isEmpty()) {
       if (shouldHaveSurrounders) {
         fail("No suitable surrounders found: " + actions);
diff --git a/tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java b/tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java
index d9190b0395..0ce1b0287f 100644
--- a/tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java
+++ b/tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015-2023 Alexandr Evstigneev
+ * Copyright 2015-2025 Alexandr Evstigneev
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,11 +35,11 @@
 import static com.perl5.lang.tt2.elementTypes.TemplateToolkitElementTypes.TT2_PERL_CODE;
 import static com.perl5.lang.tt2.elementTypes.TemplateToolkitElementTypes.TT2_RAWPERL_CODE;
 import static com.perl5.lang.tt2.formatter.TemplateToolkitFormattingTokenSets.*;
-import static com.perl5.lang.tt2.parser.TemplateToolkitElementTypesGenerated.*;
 import static com.perl5.lang.tt2.lexer.TemplateToolkitSyntaxElements.ALL_OPERATORS_TOKENSET;
 import static com.perl5.lang.tt2.lexer.TemplateToolkitSyntaxElements.KEYWORDS_TOKENSET;
+import static com.perl5.lang.tt2.parser.TemplateToolkitElementTypesGenerated.*;
 
-final class TemplateToolkitFormattingContext extends PerlBaseFormattingContext {
+public final class TemplateToolkitFormattingContext extends PerlBaseFormattingContext {
   private final Map<ASTNode, Alignment> myAssignAlignmentMap = new HashMap<>();
   private final NotNullLazyValue<PurePerlFormattingContext> myPurePerlContextProvider = NotNullLazyValue.createValue(
     () -> new PurePerlFormattingContext(getFormattingContext()) {
@@ -54,7 +54,7 @@ final class TemplateToolkitFormattingContext extends PerlBaseFormattingContext {
       }
     });
 
-  public TemplateToolkitFormattingContext(@NotNull FormattingContext formattingContext) {
+  TemplateToolkitFormattingContext(@NotNull FormattingContext formattingContext) {
     super(formattingContext);
   }
 


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 5dbf6c00b6be4e97677acfb7d9406bec4b9c3efe and c68f16431e8d22813eaa147a38e894378cc01607.

</details>

<details>
<summary>📒 Files selected for processing (27)</summary>

* `plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java` (3 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArgumentsValue.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java` (3 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlScalarContextValue.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUndefValue.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUnknownValue.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlValueSerializer.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/configuration/settings/sdk/Perl5SdkConfigurable.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/formatter/PerlDocumentBasedFormattingModel.java` (3 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/hierarchy/namespace/PerlHierarchyNodeDescriptor.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java` (5 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/PerlIntroduceVariableHandler.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlGenericStringTargetsHandler.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlStringsTargetsHandler.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlSMTRunnerConsoleProperties.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfiguration.java` (3 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfigurationEditor.java` (3 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/idea/sdk/PerlSdkType.java` (4 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/parser/moose/idea/inspections/MooseMultiAttributeAccessorInspection.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/psi/PerlStubBasedPsiElementBase.java` (3 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/psi/impl/PerlLeafPsiElement.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/perl/psi/stubs/namespaces/PerlNamespaceDefinitionStub.java` (2 hunks)
* `plugin/core/src/main/java/com/perl5/lang/pod/parser/psi/mixin/PodStubBasedSection.java` (3 hunks)
* `plugin/cpanminus/src/main/java/com/perl5/lang/perl/cpanminus/runAnything/PerlCpanminusRunAnythingProvider.java` (3 hunks)
* `plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java` (2 hunks)
* `tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java` (3 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (1)</summary>

<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java (1)</summary><blockquote>

<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java (1)</summary>

* `Builder` (121-141)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: Build (ubuntu-latest)
* GitHub Check: Build (windows-latest)
* GitHub Check: Build (macos-latest)

</details>

<details>
<summary>🔇 Additional comments (75)</summary><blockquote>

<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/psi/stubs/namespaces/PerlNamespaceDefinitionStub.java (2)</summary>

`2-2`: **Approve updated copyright year.**

The header has been updated from 2020 to 2025, keeping it current and consistent with the project’s conventions.

---

`83-83`: **Approve `toString()` simplification.**

Using implicit `toString()` via string concatenation is idiomatic in Java and equivalent to the explicit call. It reduces verbosity without altering behavior.

</details>
<details>
<summary>tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java (3)</summary>

`2-2`: **Update copyright year**  
Correctly updated the copyright range to include 2025.

---

`40-40`: **Reorder static import for consistency**  
Moving the `TemplateToolkitElementTypesGenerated.*` static import after other static imports aligns with our import grouping guidelines.

---

`42-42`: **Class visibility increased to public**  
Exposing `TemplateToolkitFormattingContext` as a public class is consistent with the PR’s goal of broader API access.  
  
Please confirm that the module descriptor (e.g., `module-info.java`) exports `com.perl5.lang.tt2.formatter` so that external clients can see this class.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlGenericStringTargetsHandler.java (2)</summary>

`2-2`: **Copyright year updated.**

The copyright year has been updated to reflect the current year.

---

`183-183`: **Simplified string concatenation by removing unnecessary toString() call.**

The explicit `.toString()` call on the substring was redundant as Java implicitly converts CharSequence to String during string concatenation. This change improves code readability without affecting functionality.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/hierarchy/namespace/PerlHierarchyNodeDescriptor.java (2)</summary>

`2-2`: **Copyright year updated.**

The copyright year range has been extended to 2025.

---

`78-78`: **Simplified string concatenation by removing unnecessary toString() call.**

The explicit `.toString()` call on the result of `getMroType()` was redundant as Java implicitly converts objects to String during string concatenation. This change improves code readability while maintaining the same functionality.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlStringsTargetsHandler.java (2)</summary>

`2-2`: **Copyright year updated.**

The copyright year has been updated to reflect the current year.

---

`119-119`: **Simplified error logging by removing redundant toString() call.**

The explicit `.toString()` call on the StringBuilder instance `result` was unnecessary, as StringBuilder objects are automatically converted to strings in concatenation contexts. This change improves code readability without affecting functionality.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/PerlIntroduceVariableHandler.java (2)</summary>

`2-2`: **Copyright year updated.**

The copyright year has been updated to reflect the current year.

---

`187-187`: **Modernized stream API usage.**

The code now uses the more concise `.toList()` terminal operation instead of `.collect(Collectors.toList())`. This improves readability and follows modern Java practices. Note that `.toList()` returns an unmodifiable list, which seems appropriate in this context as the list is only used for reading.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/formatter/PerlDocumentBasedFormattingModel.java (3)</summary>

`2-2`: **Copyright year updated**

The copyright year has been updated to reflect the latest modifications.

---

`86-86`: **Simplification of StringBuilder usage**

Removed unnecessary explicit `.toString()` call since `StringBuilder.append()` can directly accept another `StringBuilder` object.

---

`117-117`: **Simplification of StringBuilder usage**

Removed unnecessary explicit `.toString()` call since `StringBuilder.append()` can directly accept another `StringBuilder` object.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/configuration/settings/sdk/Perl5SdkConfigurable.java (2)</summary>

`2-2`: **Copyright year updated**

The copyright year has been updated to reflect the latest modifications.

---

`152-152`: **Modernized stream terminal operation**

Changed from `collect(Collectors.toList())` to more concise `.toList()` method, which is available in newer Java versions.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUnknownValue.java (2)</summary>

`2-2`: **Copyright year updated**

The copyright year range has been updated from 2015-2020 to 2015-2025.

---

`24-24`: **Class visibility changed to public**

Changed class visibility from package-private to `public final`. This enables other packages to directly use this class.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUndefValue.java (2)</summary>

`2-2`: **Copyright year updated**

The copyright year range has been updated from 2015-2020 to 2015-2025.

---

`23-23`: **Class visibility changed to public**

Changed class visibility from package-private to `public final`. This enables other packages to directly use this class.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/parser/moose/idea/inspections/MooseMultiAttributeAccessorInspection.java (2)</summary>

`2-2`: **Update copyright year**  
The year range has been incremented to include 2025, matching other files in the repo.

---

`66-66`: **Modernize stream collection**  
Replaced `.collect(Collectors.toList())` with the built-in `.toList()` for brevity. Ensure the project’s Java language level is set to 16 or higher so this API is available.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java (6)</summary>

`2-2`: **Update copyright year**  
Synchronized the year range to include 2025.

---

`95-95`: **Cache the model reference**  
Extracting `getMyModel()` into a `var model` makes the code clearer and avoids repeated casts. Good use of `var` here.

---

`121-123`: **Add helper method `getMyModel()`**  
Encapsulating the unchecked cast behind a private helper improves readability and type safety.

---

`127-127`: **Improve `isModified` comparison**  
Switching to `HashSet` ensures order-independent equality on the items lists. Confirm that duplicate markers cannot introduce false negatives.

---

`139-139`: **Reset implementation**  
Using `getMyModel().setItems(computeItems())` cleanly reloads the table state.

---

`149-149`: **Preserve first occurrence in `apply()`**  
Using `putIfAbsent` ensures that earlier entries are not overwritten, which matches the intended behavior of custom marker precedence.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/sdk/PerlSdkType.java (4)</summary>

`2-2`: **Update copyright year**  
Brought the copyright range to 2025.

---

`111-111`: **Modernize stream terminal operation**  
Replaced `.collect(Collectors.toList())` with `.toList()` to leverage the newer Java API. Verify the minimum Java version supports this change.

---

`192-192`: **Suppress deprecation warning**  
The `@SuppressWarnings("deprecation")` on `suggestHomePath` is appropriate since the method deliberately throws an exception.

---

`335-341`: **Expose and initialize `VersionDescriptor` properly**  
Making the nested `VersionDescriptor` class public and adding a private no-arg constructor aligns with the visibility conventions used elsewhere.

</details>
<details>
<summary>plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java (3)</summary>

`2-2`: **Update copyright year**  
Aligned the header to 2025.

---

`1381-1381`: **Adjust mass quick-fix assertion**  
Appending `previewBuilder` to the editor text in the final assertion correctly includes the quick-fix previews in the test output.

---

`2763-2763`: **Simplify list construction**  
Replaced `.collect(Collectors.toList())` with the `.toList()` method on the stream. Confirm Java 16+ compatibility.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java (3)</summary>

`2-2`: **Updated copyright year.**

The copyright year has been updated from 2022 to 2025, reflecting current maintenance.

---

`49-60`: **Improved class accessibility.**

The nested class `YoutrackCustomField` has been changed from private to public, allowing external code to use this class. The constructor visibility has been appropriately restricted to protected, preventing direct instantiation while allowing subclasses to extend it.

---

`73-80`: **Improved class accessibility while maintaining encapsulation.**

The nested class `YoutrackProject` has been changed from package-private to public, making it accessible outside its package. The constructor remains package-private, preserving encapsulation by preventing direct instantiation from external code.

</details>
<details>
<summary>plugin/cpanminus/src/main/java/com/perl5/lang/perl/cpanminus/runAnything/PerlCpanminusRunAnythingProvider.java (3)</summary>

`2-2`: **Updated copyright year.**

The copyright year has been updated from 2024 to 2025, reflecting current maintenance.

---

`445-475`: **Improved class accessibility.**

The nested class `OptionDescriptor` has been changed from private to public, allowing external code to access this class. This is part of a broader pattern in the PR where class visibility is being increased.

---

`507-509`: **Enhanced encapsulation.**

The constructor visibility for `CommandElement` has been appropriately changed from public to private, restricting object creation to factory methods like `createBlank()` on line 547, improving encapsulation.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/psi/impl/PerlLeafPsiElement.java (2)</summary>

`2-2`: **Updated copyright year.**

The copyright year has been updated from 2023 to 2025, reflecting current maintenance.

---

`44-44`: **Simplified string concatenation.**

Removed unnecessary explicit call to `toString()` on the element type, as string concatenation will implicitly convert it to a string. This improves code readability.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java (2)</summary>

`2-2`: **Updated copyright year.**

The copyright year has been updated from 2024 to 2025, reflecting current maintenance.

---

`121-124`: **Improved class accessibility.**

The nested `Builder` class visibility has been changed from package-private to public, aligning with similar changes in other value classes. This enables external code to construct `PerlArrayValue` instances using the builder pattern.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java (3)</summary>

`2-2`: **Copyright year updated**

The copyright year has been updated to reflect the current year (2025).

---

`42-42`: **Simplified string concatenation**

Removed explicit `.toString()` call, which is automatically called during string concatenation. This change improves code readability while maintaining identical functionality.

---

`65-65`: **Increased visibility of Builder class**

Changed the visibility of the nested `Builder` class from package-private to public, making it accessible outside the package. This aligns with similar changes to other builder classes in the codebase like `PerlArrayValue.Builder`.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArgumentsValue.java (2)</summary>

`2-2`: **Copyright year updated**

The copyright year range has been updated from 2015-2020 to 2015-2025.

---

`29-29`: **Increased class visibility**

Changed the visibility of the `PerlArgumentsValue` class from package-private to public, making it accessible outside the package. This is part of a broader pattern of increasing API accessibility in this PR.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlScalarContextValue.java (2)</summary>

`2-2`: **Copyright year updated**

The copyright year range has been updated to include 2025.

---

`83-83`: **Simplified string concatenation**

Removed explicit `.toString()` call, which is automatically called during string concatenation. This change improves code readability while maintaining identical functionality.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlSMTRunnerConsoleProperties.java (2)</summary>

`2-2`: **Copyright year updated**

The copyright year range has been updated from 2015-2020 to 2015-2025.

---

`29-30`: **Modified class and constructor visibility**

Changed the class visibility from package-private to public, while restricting the constructor visibility from public to package-private. This pattern allows the class to be used more broadly but controls how instances are created, enforcing instantiation only within the package (likely through factory methods).

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlValueSerializer.java (3)</summary>

`2-2`: **Updated copyright year**

Copyright year updated from 2015-2020 to 2015-2025, keeping the metadata current.

---

`27-27`: **Class visibility improved**

Changed class visibility from package-private to `public final`, making it accessible outside the package while ensuring immutability. This improves API accessibility while maintaining proper encapsulation.

---

`31-31`: **Constructor visibility restricted**

Changed constructor visibility from `public` to package-private, restricting instantiation to within the package. This maintains encapsulation by controlling how instances are created while still allowing public access to the class itself.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfigurationEditor.java (4)</summary>

`2-2`: **Updated copyright year**

Copyright year updated to reflect current maintenance.

---

`60-60`: **Improved class extensibility**

Changed nested class `ArgumentsPanel` visibility from private to protected, allowing subclasses of `PerlTestRunConfigurationEditor` to access and extend it. This improves the extensibility of the codebase.

---

`67-67`: **Constructor visibility aligned with class visibility**

Changed constructor visibility from public to protected, matching the class's visibility and ensuring that instantiation is limited to the class and its subclasses.

---

`106-106`: **Modernized Java syntax**

Updated type check and cast to use Java's pattern matching for `instanceof`, which simplifies the code by combining the type check and variable assignment into a single operation. This is a modern Java feature that improves readability.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/pod/parser/psi/mixin/PodStubBasedSection.java (4)</summary>

`2-2`: **Updated copyright year and imports**

Updated copyright year and added imports for `StubBasedPsiElement` and `IElementType` to support interface implementation.



Also applies to: 21-21, 23-23

---

`28-29`: **Explicit interface implementation**

Added explicit implementation of `StubBasedPsiElement<PodSectionStub>` interface. This improves API clarity by making the contract more explicit.

---

`39-42`: **Added standard element type accessor**

Added a new `getIElementType()` method that returns the result of `getElementTypeImpl()`. This provides a standardized way to access the element type consistent with other PSI elements.

---

`46-46`: **Updated toString method**

Modified `toString()` to use the new `getIElementType()` method instead of `getElementType()`, maintaining consistency with other similar classes in the codebase.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/psi/PerlStubBasedPsiElementBase.java (4)</summary>

`2-2`: **Updated copyright year and imports**

Updated copyright year and added imports for `StubBasedPsiElement` and `IElementType` to support interface implementation.



Also applies to: 23-23, 27-27

---

`35-35`: **Explicit interface implementation**

Added explicit implementation of `StubBasedPsiElement<T>` interface, making the contract more explicit and improving API clarity.

---

`46-47`: **Updated toString method**

Updated the `toString()` method to use `getIElementType()` instead of `getElementType().toString()` for consistency with other similar classes in the codebase.

---

`49-52`: **Added standard element type accessor**

Added a new `getIElementType()` method that returns the result of `getElementTypeImpl()`. This provides a standardized way to access the element type and ensures consistency with other PSI element implementations.

</details>
<details>
<summary>plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfiguration.java (4)</summary>

`2-2`: **Update copyright to 2025**  
The copyright header has been correctly updated to span through 2025, aligning with the project’s versioning policy.

---

`60-63`: **Add @Override on getDefaultTestRunnerArguments**  
Marking this method with `@Override` enhances clarity and safeguards against accidental signature mismatches when the superclass evolves.

---

`65-73`: **Add @Override on getTestRunnerLocalPath**  
The new `@Override` annotation makes it explicit that this method implements the superclass contract. The `ExecutionException` handling remains appropriate.

---

`106-109`: **Add @Override on getFrameworkName**  
Explicitly annotating the overridden `getFrameworkName` method improves readability and ensures compiler checks for correct overriding.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-19T06:39:03Z
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-05-19T07:04:10Z

Review comments:
diff_hunk: @@ -54,7 +54,7 @@ final class TemplateToolkitFormattingContext extends PerlBaseFormattingContext {
       }
     });
 
-  public TemplateToolkitFormattingContext(@NotNull FormattingContext formattingContext) {
+  TemplateToolkitFormattingContext(@NotNull FormattingContext formattingContext) {
     super(formattingContext);
   }
path: tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Constructor visibility reduced to package-private**  
By removing `public` from the constructor, external instantiation is now blocked. If consumers outside this package need to create instances, this will break them.  
  
Either revert the constructor to `public` or provide a factory method in a public API. For example:
```diff
-  TemplateToolkitFormattingContext(@NotNull FormattingContext formattingContext) {
+  public TemplateToolkitFormattingContext(@NotNull FormattingContext formattingContext) {
     super(formattingContext);
   }
```
Alternatively, add a `public static create(...)` factory in this class.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In
tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java
around lines 57 to 59, the constructor visibility was reduced to
package-private, which prevents external code from instantiating this class. To
fix this, either revert the constructor to public or add a public static factory
method in this class that accepts the necessary parameters and returns a new
instance, ensuring external consumers can still create instances as needed.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T06:39:02Z
author_association: NONE
diff_hunk: @@ -70,11 +70,11 @@
   }
 
 
-  static final class YoutrackProject {
+  public static final class YoutrackProject {
     @SuppressWarnings("unused") @Expose
     public final String id;
 
-    public YoutrackProject(String id) {
+    YoutrackProject(String id) {
path: plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java
user: login: github-advanced-security[bot]
body: ## Method parameter always has the same value

Value of parameter 'id' is always 'YoutrackApi.PROJECT_ID'

[Show more details](https://github.com/Camelcade/Perl5-IDEA/security/code-scanning/9862)
created_at: 2025-05-19T07:04:09Z
author_association: NONE

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-05-19T06:36:01Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This update primarily increases the visibility of several classes and nested classes from package-private or private to public across multiple modules, making them accessible outside their original packages. It also adjusts some constructor visibilities, updates copyright years, and modernizes stream operations by replacing `Collectors.toList()` with `.toList()`. Minor method signature and annotation refinements are included, with no significant changes to logic or control flow.

## Changes

| File(s) / Path(s)                                                                                                   | Change Summary                                                                                                                                                                                                                                         |
|---------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| plugin/core/src/main/java/com/perl5/errorHandler/YoutrackApi.java                                                   | Increased visibility of nested classes (`YoutrackCustomField`, `YoutrackProject`), adjusted constructor visibility, and updated copyright.                                                                      |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArgumentsValue.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUndefValue.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlUnknownValue.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlValueSerializer.java | Changed class visibility from package-private to public; adjusted some constructor visibilities; updated copyright.                                                      |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlArrayValue.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlMapValue.java | Changed visibility of nested `Builder` classes from package-private to public; minor toString adjustment in `PerlMapValue`.                                              |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/codeInsight/typeInference/value/PerlScalarContextValue.java       | Updated copyright; changed string concatenation in `toString()` to use implicit conversion.                                                                               |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/configuration/settings/sdk/Perl5SdkConfigurable.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/PerlIntroduceVariableHandler.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/sdk/PerlSdkType.java<br>plugin/core/src/main/java/com/perl5/lang/perl/parser/moose/idea/inspections/MooseMultiAttributeAccessorInspection.java<br>plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java | Replaced `.collect(Collectors.toList())` with `.toList()` in stream operations; removed unnecessary imports; minor adjustments.                                          |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/formatter/PerlDocumentBasedFormattingModel.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/hierarchy/namespace/PerlHierarchyNodeDescriptor.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlGenericStringTargetsHandler.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/refactoring/introduce/target/PerlStringsTargetsHandler.java<br>plugin/core/src/main/java/com/perl5/lang/perl/psi/impl/PerlLeafPsiElement.java<br>plugin/core/src/main/java/com/perl5/lang/perl/psi/stubs/namespaces/PerlNamespaceDefinitionStub.java | Updated copyright and removed explicit `.toString()` calls in string concatenations, relying on implicit conversion.                                                     |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java                       | Changed a public override method to a private method with a new name; updated all internal calls accordingly.                                                            |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlSMTRunnerConsoleProperties.java<br>plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfigurationEditor.java<br>tt2/core/src/main/java/com/perl5/lang/tt2/formatter/TemplateToolkitFormattingContext.java | Changed class and/or constructor visibility for main and nested classes.                                                                                                 |
| plugin/core/src/main/java/com/perl5/lang/perl/idea/run/prove/PerlTestRunConfiguration.java                          | Added `@Override` annotations to three protected methods.                                                                                                                |
| plugin/core/src/main/java/com/perl5/lang/perl/psi/PerlStubBasedPsiElementBase.java<br>plugin/core/src/main/java/com/perl5/lang/pod/parser/psi/mixin/PodStubBasedSection.java | Added `StubBasedPsiElement` interface implementation, new `getIElementType()` method, and modified `toString()` to use it.                                               |
| plugin/cpanminus/src/main/java/com/perl5/lang/perl/cpanminus/runAnything/PerlCpanminusRunAnythingProvider.java       | Changed nested class `OptionDescriptor` to public; changed constructor of nested class `CommandElement` from public to private.                                          |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant PublicClass
    participant ExternalModule

    User->>PublicClass: Instantiate or use public class/nested class
    PublicClass->>ExternalModule: (If applicable) Interact with external modules
    ExternalModule-->>PublicClass: Response or data
    PublicClass-->>User: Return result or perform action
```

## Poem

> 🐇  
> A hop, a skip, new doors unlocked,  
> Classes leap from shade to sun,  
> Streams now flow with modern grace,  
> Constructors hide, but work gets done.  
> ToString? Implied, no need to shout—  
> This bunny cheers the changes out!  
> 🌱

<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ast-grep (0.38.1)</summary>
> 
> <details>
> <summary>plugin/testFixtures/src/testFixtures/java/base/PerlLightTestCaseBase.java</summary>
> 
> 
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->

<!-- announcements_start -->

> [!NOTE]
> <details>
> <summary>⚡️ AI Code Reviews for VS Code, Cursor, Windsurf</summary>
> 
> CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
> Learn more [here](http://coderabbit.ai/ide).
> 
> </details>

---

> [!NOTE]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Camelcade/Perl5-IDEA&utm_content=2984):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-05-19T07:03:56Z
body: # [Qodana](https://qodana.cloud/projects/Av1bK/reports/2VVNE) for JVM

**159 new problems** were found

| Inspection name | Severity | Problems |
| --- | --- | --- |
| `Usage of API marked for removal` | 🔴 Failure | 26 |
| `Unused declaration` | 🔶 Warning | 47 |
| `Pattern variable can be used` | 🔶 Warning | 21 |
| `Can use bounded wildcard` | 🔶 Warning | 12 |
| `Method parameter always has the same value` | 🔶 Warning | 10 |
| `Deprecated API usage` | 🔶 Warning | 5 |
| `Redundant semicolon` | 🔶 Warning | 4 |
| `Method always returns the same value` | 🔶 Warning | 4 |
| `Misordered 'assertEquals()' arguments` | 🔶 Warning | 3 |
| `@NotNull/@Nullable problems` | 🔶 Warning | 3 |
| `Declaration can have 'final' modifier` | 🔶 Warning | 2 |
| `Field may be 'final'` | 🔶 Warning | 2 |
| `A service can be converted to a light one` | 🔶 Warning | 2 |
| `Redundant qualifier name` | 🔶 Warning | 2 |
| `Unused symbol` | 🔶 Warning | 2 |
| `Empty method` | 🔶 Warning | 1 |
| `Use of deprecated 'kotlinOptions' DSL` | 🔶 Warning | 1 |
| `Unreachable code` | 🔶 Warning | 1 |
| `Redundant 'Collection' operation` | 🔶 Warning | 1 |
| `Redundant usage of unmodifiable collection wrappers` | 🔶 Warning | 1 |
| `Method can be made 'void'` | 🔶 Warning | 1 |
| `Plugin Logo check` | ◽️ Notice | 6 |
| `Duplicate branches in 'switch'` | ◽️ Notice | 1 |
| `Non-canonical modifier order` | ◽️ Notice | 1 |


💡 Qodana analysis was run in the pull request mode: only the changed files were checked
☁️ [View the detailed Qodana report](https://qodana.cloud/projects/Av1bK/reports/2VVNE)
<details>
<summary>Detected 13 dependencies</summary>

# Third-party software list

This page lists the third-party software dependencies used in perl5

| Dependency                                                              | Version          | Licenses                                                                                                                                |
|-------------------------------------------------------------------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------|
| [annotations](http://www.jetbrains.org)                                 | 13.0             | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| ant-launcher                                                            | 1.10.13          | [Apache-2.0](http://www.apache.org/licenses/) <br/> [W3C-19980720](http://www.w3.org/Consortium/Legal/copyright-software-19980720.html) |
| ant                                                                     | 1.10.13          | [Apache-2.0](http://www.apache.org/licenses/) <br/> [W3C-19980720](http://www.w3.org/Consortium/Legal/copyright-software-19980720.html) |
| [commons-codec](https://commons.apache.org/proper/commons-codec/)       | 1.17.1           | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| [commons-compress](https://commons.apache.org/proper/commons-compress/) | 1.27.1           | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| [commons-io](https://commons.apache.org/proper/commons-io/)             | 2.16.1           | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| [commons-lang3](https://commons.apache.org/proper/commons-lang/)        | 3.16.0           | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| [docker](https://github.com/docker-java/docker-java)                    | iu-251.23774.435 | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| grammar-kit                                                             | 2022.3.2         | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| [jflex](https://github.com/vbmacher/cup-maven-plugin)                   | 1.9.2            | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause)                                                                         |
| [jsr305](http://findbugs.sourceforge.net/)                              | 3.0.2            | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| kotlin-reflect                                                          | 1.9.24           | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
| kotlin-stdlib                                                           | 1.9.24           | [Apache-2.0](http://www.apache.org/licenses/)                                                                                           |
</details>
<details>
<summary>Contact Qodana team</summary>

Contact us at [qodana-support@jetbrains.com](mailto:qodana-support@jetbrains.com)
  - Or via our issue tracker: https://jb.gg/qodana-issue
  - Or share your feedback: https://jb.gg/qodana-discussions
</details>
<!-- JetBrains/qodana-action@v2025.1.1 : Qodana for JVM,  -->
author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-05-19T08:15:53Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=Camelcade_Perl5-IDEA&pullRequest=2984) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=Camelcade_Perl5-IDEA&pullRequest=2984&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=Camelcade_Perl5-IDEA&pullRequest=2984&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=Camelcade_Perl5-IDEA&pullRequest=2984&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [80.6% Coverage on New Code](https://sonarcloud.io/component_measures?id=Camelcade_Perl5-IDEA&pullRequest=2984&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=Camelcade_Perl5-IDEA&pullRequest=2984&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=Camelcade_Perl5-IDEA&pullRequest=2984)


author_association: NONE
user: login: coveralls
created_at: 2025-05-19T08:17:28Z
body: 
[![Coverage Status](https://coveralls.io/builds/73729843/badge)](https://coveralls.io/builds/73729843)

coverage: 82.219% (+0.02%) from 82.204%
when pulling **c68f16431e8d22813eaa147a38e894378cc01607 on hurricup/cleanup**
into **5dbf6c00b6be4e97677acfb7d9406bec4b9c3efe on master**.

author_association: NONE