コード例 #1
0
        public static bool TryParse(string text, out GenericTypeName genericTypeName)
        {
            if (text.IndexOf('[') is var index &&
                index > 0)
            {
                var metadataName = text.Substring(0, index);
                if (TryParseArity(metadataName, out var arity) &&
                    GenericTypeArgument.TryParseBracketedList(text, index, arity, out var typeArguments) &&
                    arity == typeArguments.Length)
                {
                    genericTypeName = new GenericTypeName(metadataName, typeArguments);
                    return(true);
                }
            }

            genericTypeName = default(GenericTypeName);
            return(false);
        }
コード例 #2
0
        private static INamedTypeSymbol GetTypeByMetadataName(this Compilation compilation, GenericTypeName genericTypeName, bool ignoreCase)
        {
            if (TryGetArgsTypes(out var args))
            {
                return(compilation.GetTypeByMetadataName(genericTypeName.MetadataName, ignoreCase).Construct(args));
            }

            return(null);

            bool TryGetArgsTypes(out ITypeSymbol[] result)
            {
                result = new ITypeSymbol[genericTypeName.TypeArguments.Length];
                for (var i = 0; i < genericTypeName.TypeArguments.Length; i++)
                {
                    var argument = genericTypeName.TypeArguments[i];
                    if (argument.TypeArguments is IReadOnlyList <GenericTypeArgument> typeArguments)
                    {
                        var type = GetTypeByMetadataName(compilation, new GenericTypeName(argument.MetadataName, typeArguments.ToImmutableArray()), ignoreCase);
                        if (type == null)
                        {
                            return(false);
                        }

                        result[i] = type;
                    }
                    else
                    {
                        var type = GetTypeByMetadataName(compilation, argument.MetadataName, ignoreCase);
                        if (type == null)
                        {
                            return(false);
                        }

                        result[i] = type;
                    }
                }

                return(true);
            }
        }
コード例 #3
0
 internal bool TryGetGeneric(out GenericTypeName genericTypeName)
 {
     return(GenericTypeName.TryParse(this.Value, out genericTypeName));
 }
コード例 #4
0
 internal GenericTypeName?TryGetGeneric()
 {
     return(GenericTypeName.TryParse(this.Value));
 }