package org.smoothbuild.lang.expr; import static java.util.Arrays.asList; import javax.inject.Inject; import org.smoothbuild.lang.function.Functions; import org.smoothbuild.lang.function.base.Function; import org.smoothbuild.lang.function.base.Name; import org.smoothbuild.lang.type.Conversions; import org.smoothbuild.lang.type.Type; import org.smoothbuild.lang.value.Value; public class ImplicitConverter { private final Functions functions; @Inject public ImplicitConverter(Functions functions) { this.functions = functions; } public <T extends Value> Expression apply(Type destinationType, Expression source) { Type sourceType = source.type(); if (sourceType == destinationType) { return source; } Name functionName = Conversions.convertFunctionName(sourceType, destinationType); Function function = functions.get(functionName); return function.createCallExpression(asList(source), true, source.codeLocation()); } }