コード例 #1
0
        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 (
        }
コード例 #2
0
        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(";");
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
            }
        }