private static void WriteAsExtensionMethodCall( InvocationExpressionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context, IMethodSymbol symbol) { textWriter.Write("(({0} % _M.DOT).", context.SemanticAdaptor.GetFullName(symbol.ContainingType)); var signatureTextWriter = textWriter.CreateTextWriterAtSameIndent(); var signatureHasGenerics = context.SignatureWriter.WriteSignature( symbol.ReducedFrom.Parameters.Select(p => p.Type).ToArray(), signatureTextWriter); if (signatureHasGenerics) { textWriter.Write("['"); } textWriter.Write("{0}_M_{1}_", symbol.Name, symbol.TypeArguments.Length); if (signatureHasGenerics) { textWriter.Write("'..("); } textWriter.AppendTextWriter(signatureTextWriter); if (signatureHasGenerics) { textWriter.Write(")]"); } if (symbol.TypeArguments.Any()) { context.TypeReferenceWriter.WriteTypeReferences(symbol.TypeArguments.ToArray(), textWriter); } textWriter.Write(" % _M.DOT)"); var argWriter = textWriter.CreateTextWriterAtSameIndent(); syntax.ArgumentList.Write(argWriter, context); var targetWriter = textWriter.CreateTextWriterAtSameIndent(); syntax.Expression.Write(targetWriter, context); var targetStr = targetWriter.ToString(); textWriter.Write(targetStr.Substring(0, targetStr.LastIndexOf(" % _M.DOT)"))); var argStr = argWriter.ToString(); if (argStr.Length > 2) { textWriter.Write(", "); } textWriter.Write(argStr.Substring(1)); // Skip the opening ( }
public static void Write(this ConstructorInitializerSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context) { var symbol = (IMethodSymbol)context.SemanticModel.GetSymbolInfo(syntax).Symbol; if (syntax.Kind() == SyntaxKind.BaseConstructorInitializer) { textWriter.Write("(element % _M.DOT_LVL(typeObject.Level - 1))._C_0_"); context.SignatureWriter.WriteSignature(symbol.Parameters.Select(p => p.Type).ToArray(), textWriter); } else if (syntax.Kind() == SyntaxKind.ThisConstructorInitializer) { textWriter.Write("(element % _M.DOT_LVL(typeObject.Level))"); var signatureWriter = textWriter.CreateTextWriterAtSameIndent(); var hasGenericComponents = context.SignatureWriter.WriteSignature(symbol.Parameters.Select(p => p.Type).ToArray(), signatureWriter); if (hasGenericComponents) { textWriter.Write("['_C_0_'..("); textWriter.AppendTextWriter(signatureWriter); textWriter.Write(")]"); } else { textWriter.Write("._C_0_"); textWriter.AppendTextWriter(signatureWriter); } } syntax.ArgumentList.Write(textWriter, context); textWriter.WriteLine(";"); }
public static void Write( this InvocationExpressionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context) { var symbolInfo = ModelExtensions.GetSymbolInfo(context.SemanticModel, syntax); var symbol = (IMethodSymbol)symbolInfo.Symbol; if (symbol == null) { if (symbolInfo.CandidateSymbols.Any()) { throw new Exception($"Could not find symbol to InvocationExpressionSyntax. Candidates was available but not choosen. Reason: {symbolInfo.CandidateReason}."); } TryWriteNameOfOrTypeOf(syntax, textWriter, context); return; } if (symbol.IsExtensionMethod && symbol.MethodKind == MethodKind.ReducedExtension) { WriteAsExtensionMethodCall(syntax, textWriter, context, symbol); return; } textWriter.Write("("); if (symbol.MethodKind != MethodKind.DelegateInvoke) { var signatureTextWriter = textWriter.CreateTextWriterAtSameIndent(); var signatureHasGenerics = context.SignatureWriter.WriteSignature( symbol.ConstructedFrom.Parameters.Select(p => p.Type).ToArray(), signatureTextWriter); if (signatureHasGenerics) { var targetWriter = textWriter.CreateTextWriterAtSameIndent(); syntax.Expression.Write(targetWriter, context); var expectedEnd = $".{symbol.Name}."; if (targetWriter.ToString().EndsWith(expectedEnd)) { throw new Exception($"Expect index visitor to end with '{expectedEnd}'. Got '{targetWriter}'"); } var targetString = targetWriter.ToString(); textWriter.Write(targetString.Remove(targetString.Length - expectedEnd.Length + 1)); textWriter.Write($"['{symbol.Name}"); } else { syntax.Expression.Write(textWriter, context); } var fullNamespace = context.SemanticAdaptor.GetFullNamespace(symbol.ContainingType); if (!namespacesWithNoAmbigiousMethods.Contains(fullNamespace)) { textWriter.Write("_M_{0}_", symbol.TypeArguments.Length); if (signatureHasGenerics) { textWriter.Write("'..("); } textWriter.AppendTextWriter(signatureTextWriter); if (signatureHasGenerics) { textWriter.Write(")]"); } } } else { syntax.Expression.Write(textWriter, context); } if (symbol.TypeArguments.Any()) { context.TypeReferenceWriter.WriteTypeReferences(symbol.TypeArguments.ToArray(), textWriter); } textWriter.Write(" % _M.DOT)"); syntax.ArgumentList.Write(textWriter, context); }
public static void Write( this ObjectCreationExpressionSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context) { var symbol = (IMethodSymbol)context.SemanticModel.GetSymbolInfo(syntax).Symbol; textWriter.Write(syntax.Initializer != null ? "(" : ""); ITypeSymbol[] parameterTypes = null; IDictionary <ITypeSymbol, ITypeSymbol> appliedClassGenerics = null; if (symbol != null) { context.TypeReferenceWriter.WriteInteractionElementReference(symbol.ContainingType, textWriter); parameterTypes = symbol.OriginalDefinition.Parameters.Select(p => p.Type).ToArray(); appliedClassGenerics = ((TypeSymbolSemanticAdaptor)context.SemanticAdaptor).GetAppliedClassGenerics(symbol.ContainingType); } else { // Special case for missing symbol. Roslyn issue 3825. https://github.com/dotnet/roslyn/issues/3825 var namedTypeSymbol = (ITypeSymbol)context.SemanticModel.GetSymbolInfo(syntax.Type).Symbol; context.TypeReferenceWriter.WriteInteractionElementReference(namedTypeSymbol, textWriter); if (namedTypeSymbol.TypeKind == TypeKind.Delegate) { parameterTypes = new ITypeSymbol[] { namedTypeSymbol }; } else { if (syntax.ArgumentList.Arguments.Count == 0) { parameterTypes = new ITypeSymbol[] { }; } else { throw new Exception($"Could not guess constructor for {namedTypeSymbol}."); } } } var signatureWiter = textWriter.CreateTextWriterAtSameIndent(); var hasGenricComponents = context.SignatureWriter.WriteSignature( parameterTypes, signatureWiter, appliedClassGenerics); if (hasGenricComponents) { textWriter.Write("['_C_0_'.."); } else { textWriter.Write("._C_0_"); } textWriter.AppendTextWriter(signatureWiter); if (hasGenricComponents) { textWriter.Write("]"); } if (syntax.ArgumentList != null) { syntax.ArgumentList.Write(textWriter, context); } else { textWriter.Write("()"); } if (syntax.Initializer != null) { textWriter.Write(" % _M.DOT)"); syntax.Initializer.Write(textWriter, context); } }