/// <summary> /// Same as GetTypeString, but without containing type/namespace. /// </summary> private string BuildTypeStringHelper(TypeSymbol symbol, out string typeArgumentsOpt, out string assemblyNameSuffix) { if (symbol.GetMemberArity() > 0) { PooledStringBuilder pool = PooledStringBuilder.GetInstance(); StringBuilder builder = pool.Builder; bool first = true; foreach (TypeSymbol typeArg in symbol.GetMemberTypeArgumentsNoUseSiteDiagnostics()) { if (!first) { builder.Append(","); } first = false; builder.Append(BuildTypeArgumentString(typeArg)); } typeArgumentsOpt = pool.ToStringAndFree(); } else { typeArgumentsOpt = null; } assemblyNameSuffix = ", " + symbol.ContainingAssembly.Identity.GetDisplayName(); return(symbol.MetadataName); //should include backtick+arity if required }
internal BoundExpression CreateReturnConversion( CSharpSyntaxNode syntax, DiagnosticBag diagnostics, BoundExpression argument, TypeSymbol returnType) { // If the return type is not void then the expression must be implicitly convertible. Conversion conversion; bool badAsyncReturnAlreadyReported = false; HashSet<DiagnosticInfo> useSiteDiagnostics = null; if (IsInAsyncMethod()) { if (!IsGenericTaskReturningAsyncMethod()) { conversion = Conversion.NoConversion; badAsyncReturnAlreadyReported = true; } else { returnType = returnType.GetMemberTypeArgumentsNoUseSiteDiagnostics().Single(); conversion = this.Conversions.ClassifyConversionFromExpression(argument, returnType, ref useSiteDiagnostics); } } else { conversion = this.Conversions.ClassifyConversionFromExpression(argument, returnType, ref useSiteDiagnostics); } diagnostics.Add(syntax, useSiteDiagnostics); if ((!conversion.IsImplicit || !conversion.IsValid) && !argument.HasAnyErrors) { if (!badAsyncReturnAlreadyReported) { if (IsGenericTaskReturningAsyncMethod() && argument.Type == this.GetCurrentReturnType()) { // Since this is an async method, the return expression must be of type '{0}' rather than 'Task<{0}>' Error(diagnostics, ErrorCode.ERR_BadAsyncReturnExpression, argument.Syntax, returnType); } else { GenerateImplicitConversionError(diagnostics, argument.Syntax, conversion, argument, returnType); if (this.ContainingMemberOrLambda is LambdaSymbol) { ReportCantConvertLambdaReturn(argument.Syntax, diagnostics); } } } } return CreateConversion(argument.Syntax, argument, conversion, false, returnType, diagnostics); }
/// <summary> /// Same as GetTypeString, but without containing type/namespace. /// </summary> private string BuildTypeStringHelper(TypeSymbol symbol, out string typeArgumentsOpt, out string assemblyNameSuffix) { if (symbol.GetMemberArity() > 0) { PooledStringBuilder pool = PooledStringBuilder.GetInstance(); StringBuilder builder = pool.Builder; bool first = true; foreach (TypeSymbol typeArg in symbol.GetMemberTypeArgumentsNoUseSiteDiagnostics()) { if (!first) { builder.Append(","); } first = false; builder.Append(BuildTypeArgumentString(typeArg)); } typeArgumentsOpt = pool.ToStringAndFree(); } else { typeArgumentsOpt = null; } assemblyNameSuffix = ", " + symbol.ContainingAssembly.Identity.GetDisplayName(); return symbol.MetadataName; //should include backtick+arity if required }