private static ParameterGenerator getOrCreateGenerator()

in src/jvm/main/org/jetbrains/kotlinx/lincheck/CTestStructure.java [275:322]


    private static ParameterGenerator<?> getOrCreateGenerator(
            Method m,
            Parameter p,
            String nameInOperation,
            Map<String, ParameterGenerator<?>> namedGens,
            Map<Class<?>, ParameterGenerator<?>> defaultGens,
            RandomProvider randomProvider
    ) {
        // Parse @Param annotation on the parameter
        ParamConfig paramConfig = parseParamAnnotationFromParameter(p);
        // If this annotation not presented use named generator based on name presented in @Operation or parameter name.
        if (paramConfig == null) {
            // If name in @Operation is presented, return the generator with this name,
            // otherwise return generator with parameter's name
            String name = nameInOperation != null ? nameInOperation :
                (p.isNamePresent() ? p.getName() : null);
            if (name != null)
                return checkAndGetNamedGenerator(namedGens, name);
            // Parameter generator is not specified, try to create a default one
            ParameterGenerator<?> defaultGenerator = defaultGens.get(p.getType());
            if (defaultGenerator != null)
                return defaultGenerator;
            if (p.getType().isEnum()) {
                @SuppressWarnings("unchecked")
                EnumGen<?> generator = createEnumGenerator("", randomProvider, (Class<? extends Enum<?>>) p.getType());
                defaultGens.put(p.getType(), generator);
                return generator;
            }
            // Cannot create default parameter generator, throw an exception
            throw new IllegalStateException("Generator for parameter \"" + p + "\" in method \""
                + m.getName() + "\" should be specified.");
        }
        // If the @Param annotation is presented check its correctness firstly
        if (!paramConfig.getName().isEmpty() && !(paramConfig.getGen() == DummyParameterGenerator.class))
            throw new IllegalStateException("@Param should have either name or gen with optionally configuration");
        // If @Param annotation specifies generator's name then return the specified generator
        if (!paramConfig.getName().isEmpty())
            return checkAndGetNamedGenerator(namedGens, paramConfig.getName());
        // Otherwise create new parameter generator
        if (p.getType().isEnum()) {
            @SuppressWarnings("unchecked")
            Class<? extends Enum<?>> enumClass = (Class<? extends Enum<?>>) (p.getType());

            return createEnumGenerator(paramConfig.getConf(), randomProvider, enumClass);
        } else {
            return createGenerator(paramConfig, randomProvider);
        }
    }