String visitorVarName = visitorParam.getSimpleName().toString();
String adtLambdaParam = uncapitalize(adt.typeConstructor().declaredType().asElement().getSimpleName());
NameAllocator nameAllocator = new NameAllocator();
nameAllocator.newName(mapperFieldName(currentConstructor), "case arg");
nameAllocator.newName(adtLambdaParam, "adt var");
<BUG>nameAllocator.newName(visitorVarName, "visitor var");
return CodeBlock.builder()</BUG>
.addStatement("$T $L = $T.$L($L)", TypeName.get(visitorType), nameAllocator.get("visitor var"),
adt.deriveConfig().targetClass().className(), MapperDerivator.visitorLambdaFactoryName(adt), joinStringsAsArguments(
<BUG>Stream.concat(previousConstructors.stream().map(dc -> "super." + mapperFieldName(dc)),
Stream.of(mapperFieldName(currentConstructor)))))</BUG>
.addStatement("return $1L -> $1L.$2L($3L)", nameAllocator.get("adt var"), adt.matchMethod().element().getSimpleName(),

String visitorVarName = visitorParam.getSimpleName().toString();
String adtLambdaParam = uncapitalize(adt.typeConstructor().declaredType().asElement().getSimpleName());
NameAllocator nameAllocator = new NameAllocator();
nameAllocator.newName(mapperFieldName(currentConstructor), "case arg");
nameAllocator.newName(adtLambdaParam, "adt var");
nameAllocator.newName(visitorVarName, "visitor var");
ParameterizedTypeName otherwiseMatcherTypeName = otherwiseMatcherTypeName(adt);
return CodeBlock.builder()
.addStatement("$T $L = $T.$L($L)", TypeName.get(visitorType), nameAllocator.get("visitor var"),
adt.deriveConfig().targetClass().className(), MapperDerivator.visitorLambdaFactoryName(adt), joinStringsAsArguments(
Stream.concat(previousConstructors.stream()
.map(dc -> "((" + otherwiseMatcherTypeName.toString() + ") this)." + mapperFieldName(dc)),
Stream.of(mapperFieldName(currentConstructor)))))
.addStatement("return $1L -> $1L.$2L($3L)", nameAllocator.get("adt var"), adt.matchMethod().element().getSimpleName(),
