presto-main/src/main/java/io/prestosql/operator/annotations/ImplementationDependency.java/Factory/createDependency
class Factory:        public static ImplementationDependency createDependency(Annotation annotation, Set<String> literalParameters)
        {
            if (annotation instanceof TypeParameter) {
                return new TypeImplementationDependency(((TypeParameter) annotation).value());
            }
            if (annotation instanceof LiteralParameter) {
                return new LiteralImplementationDependency(((LiteralParameter) annotation).value());
            }

            if (annotation instanceof FunctionDependency) {
                FunctionDependency functionDependency = (FunctionDependency) annotation;
                return new FunctionImplementationDependency(
                        QualifiedName.of(functionDependency.name()),
                        Arrays.stream(functionDependency.argumentTypes())
                                .map(signature -> parseTypeSignature(signature, literalParameters))
                                .collect(toImmutableList()),
                        toInvocationConvention(functionDependency.convention()));
            }
            if (annotation instanceof OperatorDependency) {
                OperatorDependency operatorDependency = (OperatorDependency) annotation;
                OperatorType operator = operatorDependency.operator();
                checkArgument(operator != OperatorType.CAST && operator != OperatorType.SATURATED_FLOOR_CAST, "%s not supported for OperatorDependency", operator);
                return new OperatorImplementationDependency(
                        operator,
                        Arrays.stream(operatorDependency.argumentTypes())
                                .map(signature -> parseTypeSignature(signature, literalParameters))
                                .collect(toImmutableList()),
                        toInvocationConvention(operatorDependency.convention()));
            }
            if (annotation instanceof CastDependency) {
                CastDependency castDependency = (CastDependency) annotation;
                return new CastImplementationDependency(
                        parseTypeSignature(castDependency.fromType(), literalParameters),
                        parseTypeSignature(castDependency.toType(), literalParameters),
                        toInvocationConvention(castDependency.convention()));
            }

            throw new IllegalArgumentException("Unsupported annotation " + annotation.getClass().getSimpleName());
        }