コード例 #1
0
        public static string GenericName(GenericNameSyntax name)
        {
            //TODO: replace the screwed up Action<>/Func<> conversions w/ DNSwift implementations
            switch (name.Identifier.Text)
            {
            case "Action":
                //Action<string, int> converts to (String, Int) -> Void
                return(": (" + SyntaxNode(name.TypeArgumentList) + ")");

            case "Func":
                //Func<string, int, string> converts to (String, Int) -> String
                var output = ": (";

                //The last generic argument in Func<> is used as a return type
                var allButLastArguments =
                    name.TypeArgumentList.Arguments.Take(name.TypeArgumentList.Arguments.Count - 1);

                output += allButLastArguments.ConvertSyntaxNodes(", ");

                return(output + ") -> " + SyntaxNode(name.TypeArgumentList.Arguments.Last()));

            case "Unwrapped":
                return(SyntaxNode(name.TypeArgumentList.Arguments.First()).TrimEnd('!') + "!");

            case "Optional":
                return(SyntaxNode(name.TypeArgumentList.Arguments.First()).TrimEnd('!') + "?");

            case "AmbiguousWrapping":
                return(SyntaxNode(name.TypeArgumentList.Arguments.First()).TrimEnd('!'));
            }

            //Something<another, thing> converts to Something<another, thing> :D
            if (name.IsTypeList())
            {
                switch (Builder.Instance.Language)
                {
                case Languages.Swift:
                    return("[" + SyntaxNode(name.TypeArgumentList).Trim('<', '>').Trim() + "]");

                case Languages.Kotlin:
                    return("ArrayList<" + SyntaxNode(name.TypeArgumentList).Trim('<', '>').Trim() + ">");

                case Languages.TypeScript:
                    return("Array<" + SyntaxNode(name.TypeArgumentList).Trim('<', '>').Trim() + ">");

                case Languages.Php:
                    return(SyntaxNode(name.TypeArgumentList).Trim('<', '>').Trim() + "[]");

                default:
                    throw new ArgumentException();
                }
            }
            else if (name.IsTypeDictionary())
            {
                switch (Builder.Instance.Language)
                {
                case Languages.Swift:
                    return("[" + SyntaxNode(name.TypeArgumentList).Trim('<', '>').Replace(",", ":") + "]");

                case Languages.Kotlin:
                    return("HashMap<" + SyntaxNode(name.TypeArgumentList).Trim('<', '>') + ">");

                case Languages.TypeScript:
                    return("Map<" + SyntaxNode(name.TypeArgumentList).Trim('<', '>') + ">");

                case Languages.Php:
                    return("array");

                default:
                    throw new ArgumentException();
                }
            }
            else
            {
                return(Type(name.Identifier.Text) + SyntaxNode(name.TypeArgumentList));
            }
        }