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);
}
}