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); }
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); } }
internal bool TryGetGeneric(out GenericTypeName genericTypeName) { return(GenericTypeName.TryParse(this.Value, out genericTypeName)); }
internal GenericTypeName?TryGetGeneric() { return(GenericTypeName.TryParse(this.Value)); }