// Path: core/common/src/main/java/tech/harmonysoft/oss/traute/common/instrumentation/InstrumentationType.java
// public enum InstrumentationType {
// 
//     /**
//      * Before:
//      * <pre>
//      *     public void test(&#064;NotNull String s) {
//      *         // body
//      *     }
//      * </pre>
//      * After:
//      * <pre>
//      *     public void test(&#064;NotNull String s) {
//      *         if (s == null) {
//      *             throw new NullPointerException("[problem details]");
//      *         }
//      *         // body
//      *     }
//      * </pre>
//      */
//     METHOD_PARAMETER("parameter"),
// 
//     /**
//      * Before:
//      * <pre>
//      *     &#064;NotNull
//      *     public String compute() {
//      *         return doCompute();
//      *     }
//      * </pre>
//      * After:
//      * <pre>
//      *     &#064;NotNull
//      *     public String compute() {
//      *         String tmpVar = doCompute();
//      *         if (tmpVar == null) {
//      *             throw new NullPointerException("[problem details]");
//      *         }
//      *         return tmpVar;
//      *     }
//      * </pre>
//      */
//     METHOD_RETURN("return");
// 
//     private static Map<String, InstrumentationType> BY_SHORT_NAME = new HashMap<>();
//     static {
//         for (InstrumentationType type : values()) {
//             BY_SHORT_NAME.put(type.getShortName(), type);
//         }
//     }
// 
//     @NotNull private final String shortName;
// 
//     InstrumentationType(@NotNull String shortName) {
//         this.shortName = shortName;
//     }
// 
//     @Nullable
//     public static InstrumentationType byShortName(@NotNull String shortName) {
//         return BY_SHORT_NAME.get(shortName);
//     }
// 
//     @NotNull
//     public String getShortName() {
//         return shortName;
//     }
// }
// 
// Path: core/javac/src/main/java/tech/harmonysoft/oss/traute/javac/instrumentation/InstrumentationInfo.java
// public interface InstrumentationInfo {
// 
//     /**
//      * @return  instrumentation type of the data stored in the current object
//      */
//     @NotNull
//     InstrumentationType getType();
// 
//     /**
//      * @return current compilation unit processing context
//      */
//     @NotNull
//     CompilationUnitProcessingContext getContext();
// 
//     /**
//      * @return {@code NotNull} annotation for which an instrumentation should happen (if any)
//      */
//     String getNotNullAnnotation();
// 
//     /**
//      * @return {@code NotNullByDefault} annotation description which implies the instrumentation (if any)
//      */
//     String getNotNullByDefaultAnnotationDescription();
// }
// 
// Path: core/javac/src/main/java/tech/harmonysoft/oss/traute/javac/common/CompilationUnitProcessingContext.java
// public class CompilationUnitProcessingContext {
// 
//     private final Set<String> imports = new HashSet<>();
// 
//     @NotNull private final TrautePluginSettings          pluginSettings;
//     @NotNull private final TreeMaker                     astFactory;
//     @NotNull private final Names                         symbolsTable;
//     @NotNull private final TrautePluginLogger            logger;
//     @NotNull private final StatsCollector                statsCollector;
//     @NotNull private final ExceptionTextGeneratorManager exceptionTextGeneratorManager;
//     @NotNull private final PackageInfoManager            packageInfoManager;
// 
//     public CompilationUnitProcessingContext(
//             @NotNull TrautePluginSettings pluginSettings,
//             @NotNull TreeMaker astFactory,
//             @NotNull Names symbolsTable,
//             @NotNull TrautePluginLogger logger,
//             @NotNull StatsCollector statsCollector,
//             @NotNull ExceptionTextGeneratorManager exceptionTextGeneratorManager,
//             @NotNull PackageInfoManager packageInfoManager)
//     {
//         this.pluginSettings = pluginSettings;
//         this.statsCollector = statsCollector;
//         this.astFactory = astFactory;
//         this.symbolsTable = symbolsTable;
//         this.logger = logger;
//         this.exceptionTextGeneratorManager = exceptionTextGeneratorManager;
//         this.packageInfoManager = packageInfoManager;
//     }
// 
//     public void addImport(@NotNull String importText) {
//         imports.add(importText);
//     }
// 
//     @NotNull
//     public TrautePluginSettings getPluginSettings() {
//         return pluginSettings;
//     }
// 
//     @NotNull
//     public Set<String> getImports() {
//         return imports;
//     }
// 
//     @NotNull
//     public TreeMaker getAstFactory() {
//         return astFactory;
//     }
// 
//     @NotNull
//     public Names getSymbolsTable() {
//         return symbolsTable;
//     }
// 
//     @NotNull
//     public TrautePluginLogger getLogger() {
//         return logger;
//     }
// 
//     @NotNull
//     public StatsCollector getStatsCollector() {
//         return statsCollector;
//     }
// 
//     @NotNull
//     public ExceptionTextGeneratorManager getExceptionTextGeneratorManager() {
//         return exceptionTextGeneratorManager;
//     }
// 
//     @NotNull
//     public PackageInfoManager getPackageInfoManager() {
//         return packageInfoManager;
//     }
// }


import com.sun.source.tree.VariableTree;
import com.sun.tools.javac.tree.JCTree;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import tech.harmonysoft.oss.traute.common.instrumentation.InstrumentationType;
import tech.harmonysoft.oss.traute.javac.instrumentation.InstrumentationInfo;
import tech.harmonysoft.oss.traute.javac.common.CompilationUnitProcessingContext;
package tech.harmonysoft.oss.traute.javac.instrumentation.parameter;


/**
 * A utility data class for describing a method parameter marked by a {@code NotNull} annotation.
 */
public class ParameterToInstrumentInfo implements InstrumentationInfo {

    @NotNull private final CompilationUnitProcessingContext compilationUnitProcessingContext;
    @NotNull private final VariableTree                     methodParameter;
    @NotNull private final JCTree.JCBlock                   body;

    private final String notNullAnnotation;
    private final String notNullByDefaultAnnotationDescription;

    @Nullable private final String qualifiedMethodName;

    private final int     methodParameterIndex;
    private final int     methodParametersNumber;
    private final boolean constructor;

// Path: core/common/src/main/java/tech/harmonysoft/oss/traute/common/instrumentation/InstrumentationType.java
// public enum InstrumentationType {
// 
//     /**
//      * Before:
//      * <pre>
//      *     public void test(&#064;NotNull String s) {
//      *         // body
//      *     }
//      * </pre>
//      * After:
//      * <pre>
//      *     public void test(&#064;NotNull String s) {
//      *         if (s == null) {
//      *             throw new NullPointerException("[problem details]");
//      *         }
//      *         // body
//      *     }
//      * </pre>
//      */
//     METHOD_PARAMETER("parameter"),
// 
//     /**
//      * Before:
//      * <pre>
//      *     &#064;NotNull
//      *     public String compute() {
//      *         return doCompute();
//      *     }
//      * </pre>
//      * After:
//      * <pre>
//      *     &#064;NotNull
//      *     public String compute() {
//      *         String tmpVar = doCompute();
//      *         if (tmpVar == null) {
//      *             throw new NullPointerException("[problem details]");
//      *         }
//      *         return tmpVar;
//      *     }
//      * </pre>
//      */
//     METHOD_RETURN("return");
// 
//     private static Map<String, InstrumentationType> BY_SHORT_NAME = new HashMap<>();
//     static {
//         for (InstrumentationType type : values()) {
//             BY_SHORT_NAME.put(type.getShortName(), type);
//         }
//     }
// 
//     @NotNull private final String shortName;
// 
//     InstrumentationType(@NotNull String shortName) {
//         this.shortName = shortName;
//     }
// 
//     @Nullable
//     public static InstrumentationType byShortName(@NotNull String shortName) {
//         return BY_SHORT_NAME.get(shortName);
//     }
// 
//     @NotNull
//     public String getShortName() {
//         return shortName;
//     }
// }
// 
// Path: core/javac/src/main/java/tech/harmonysoft/oss/traute/javac/instrumentation/InstrumentationInfo.java
// public interface InstrumentationInfo {
// 
//     /**
//      * @return  instrumentation type of the data stored in the current object
//      */
//     @NotNull
//     InstrumentationType getType();
// 
//     /**
//      * @return current compilation unit processing context
//      */
//     @NotNull
//     CompilationUnitProcessingContext getContext();
// 
//     /**
//      * @return {@code NotNull} annotation for which an instrumentation should happen (if any)
//      */
//     String getNotNullAnnotation();
// 
//     /**
//      * @return {@code NotNullByDefault} annotation description which implies the instrumentation (if any)
//      */
//     String getNotNullByDefaultAnnotationDescription();
// }
// 
// Path: core/javac/src/main/java/tech/harmonysoft/oss/traute/javac/common/CompilationUnitProcessingContext.java
// public class CompilationUnitProcessingContext {
// 
//     private final Set<String> imports = new HashSet<>();
// 
//     @NotNull private final TrautePluginSettings          pluginSettings;
//     @NotNull private final TreeMaker                     astFactory;
//     @NotNull private final Names                         symbolsTable;
//     @NotNull private final TrautePluginLogger            logger;
//     @NotNull private final StatsCollector                statsCollector;
//     @NotNull private final ExceptionTextGeneratorManager exceptionTextGeneratorManager;
//     @NotNull private final PackageInfoManager            packageInfoManager;
// 
//     public CompilationUnitProcessingContext(
//             @NotNull TrautePluginSettings pluginSettings,
//             @NotNull TreeMaker astFactory,
//             @NotNull Names symbolsTable,
//             @NotNull TrautePluginLogger logger,
//             @NotNull StatsCollector statsCollector,
//             @NotNull ExceptionTextGeneratorManager exceptionTextGeneratorManager,
//             @NotNull PackageInfoManager packageInfoManager)
//     {
//         this.pluginSettings = pluginSettings;
//         this.statsCollector = statsCollector;
//         this.astFactory = astFactory;
//         this.symbolsTable = symbolsTable;
//         this.logger = logger;
//         this.exceptionTextGeneratorManager = exceptionTextGeneratorManager;
//         this.packageInfoManager = packageInfoManager;
//     }
// 
//     public void addImport(@NotNull String importText) {
//         imports.add(importText);
//     }
// 
//     @NotNull
//     public TrautePluginSettings getPluginSettings() {
//         return pluginSettings;
//     }
// 
//     @NotNull
//     public Set<String> getImports() {
//         return imports;
//     }
// 
//     @NotNull
//     public TreeMaker getAstFactory() {
//         return astFactory;
//     }
// 
//     @NotNull
//     public Names getSymbolsTable() {
//         return symbolsTable;
//     }
// 
//     @NotNull
//     public TrautePluginLogger getLogger() {
//         return logger;
//     }
// 
//     @NotNull
//     public StatsCollector getStatsCollector() {
//         return statsCollector;
//     }
// 
//     @NotNull
//     public ExceptionTextGeneratorManager getExceptionTextGeneratorManager() {
//         return exceptionTextGeneratorManager;
//     }
// 
//     @NotNull
//     public PackageInfoManager getPackageInfoManager() {
//         return packageInfoManager;
//     }
// }


// Path: core/javac/src/main/java/tech/harmonysoft/oss/traute/javac/instrumentation/parameter/ParameterToInstrumentInfo.java
import com.sun.source.tree.VariableTree;
import com.sun.tools.javac.tree.JCTree;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import tech.harmonysoft.oss.traute.common.instrumentation.InstrumentationType;
import tech.harmonysoft.oss.traute.javac.instrumentation.InstrumentationInfo;
import tech.harmonysoft.oss.traute.javac.common.CompilationUnitProcessingContext;

package tech.harmonysoft.oss.traute.javac.instrumentation.parameter;


/**
 * A utility data class for describing a method parameter marked by a {@code NotNull} annotation.
 */
public class ParameterToInstrumentInfo implements InstrumentationInfo {

    @NotNull private final CompilationUnitProcessingContext compilationUnitProcessingContext;
    @NotNull private final VariableTree                     methodParameter;
    @NotNull private final JCTree.JCBlock                   body;

    private final String notNullAnnotation;
    private final String notNullByDefaultAnnotationDescription;

    @Nullable private final String qualifiedMethodName;

    private final int     methodParameterIndex;
    private final int     methodParametersNumber;
    private final boolean constructor;

    public ParameterToInstrumentInfo(@NotNull CompilationUnitProcessingContext compilationUnitProcessingContext,