From 43b8c40aebe87e71370c9d1490f3b06a261134ac Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 9 Jul 2018 20:22:16 +0200 Subject: [PATCH] Fix output of out and ref parameters in CSharpLanguage. --- ILSpy/Languages/CSharpLanguage.cs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index cc84718d7..30e8e3800 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -416,17 +416,30 @@ namespace ICSharpCode.ILSpy return TypeToStringInternal(type, includeNamespace, false); } - string TypeToStringInternal(IType t, bool includeNamespace, bool useBuiltinTypeNames = true) + string TypeToStringInternal(IType t, bool includeNamespace, bool useBuiltinTypeNames = true, bool? isOutParameter = null) { TypeSystemAstBuilder builder = new TypeSystemAstBuilder(); builder.AlwaysUseShortTypeNames = !includeNamespace; builder.AlwaysUseBuiltinTypeNames = useBuiltinTypeNames; AstType astType = builder.ConvertType(t); + if (isOutParameter != null && astType is ComposedType ct && ct.HasRefSpecifier) { + ct.HasRefSpecifier = false; + } else { + isOutParameter = null; + } + StringWriter w = new StringWriter(); astType.AcceptVisitor(new CSharpOutputVisitor(w, TypeToStringFormattingOptions)); - return w.ToString(); + string output = w.ToString(); + + if (isOutParameter == true) + output = "out " + output; + else if (isOutParameter == false) + output = "ref " + output; + + return output; } public override string FieldToString(IField field, bool includeTypeName, bool includeNamespace) @@ -461,7 +474,7 @@ namespace ICSharpCode.ILSpy foreach (var param in parameters) { if (i > 0) buffer.Append(", "); - buffer.Append(TypeToStringInternal(param.Type, includeNamespace)); + buffer.Append(TypeToStringInternal(param.Type, includeNamespace, isOutParameter: param.IsOut)); i++; } @@ -511,7 +524,7 @@ namespace ICSharpCode.ILSpy foreach (var param in parameters) { if (i > 0) buffer.Append(", "); - buffer.Append(TypeToStringInternal(param.Type, includeNamespace)); + buffer.Append(TypeToStringInternal(param.Type, includeNamespace, isOutParameter: param.IsOut)); i++; }