void WriteMemberDeclarationName(IMember member, IOutputFormatter formatter, CSharpFormattingOptions formattingPolicy)
            {
                TypeSystemAstBuilder astBuilder = CreateAstBuilder();

                if ((ConversionFlags & ConversionFlags.ShowDeclaringType) == ConversionFlags.ShowDeclaringType)
                {
                    ConvertType(member.DeclaringType, formatter, formattingPolicy);
                    formatter.WriteToken(".");
                }
                switch (member.SymbolKind)
                {
                case SymbolKind.Indexer:
                    formatter.WriteKeyword("this");
                    break;

                case SymbolKind.Constructor:
                    formatter.WriteIdentifier(member.DeclaringType.Name);
                    break;

                case SymbolKind.Destructor:
                    formatter.WriteToken("~");
                    formatter.WriteIdentifier(member.DeclaringType.Name);
                    break;

                case SymbolKind.Operator:
                    switch (member.Name)
                    {
                    case "op_Implicit":
                        formatter.WriteKeyword("implicit");
                        formatter.Space();
                        formatter.WriteKeyword("operator");
                        formatter.Space();
                        ConvertType(member.ReturnType, formatter, formattingPolicy);
                        break;

                    case "op_Explicit":
                        formatter.WriteKeyword("explicit");
                        formatter.Space();
                        formatter.WriteKeyword("operator");
                        formatter.Space();
                        ConvertType(member.ReturnType, formatter, formattingPolicy);
                        break;

                    default:
                        formatter.WriteKeyword("operator");
                        formatter.Space();
                        var operatorType = OperatorDeclaration.GetOperatorType(member.Name);
                        if (operatorType.HasValue)
                        {
                            formatter.WriteToken(OperatorDeclaration.GetToken(operatorType.Value));
                        }
                        else
                        {
                            formatter.WriteIdentifier(member.Name);
                        }
                        break;
                    }
                    break;

                default:
                    formatter.WriteIdentifier(member.Name);
                    break;
                }
                if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList && member.SymbolKind == SymbolKind.Method)
                {
                    var outputVisitor = new CSharpOutputVisitor(formatter, formattingPolicy);
                    outputVisitor.WriteTypeParameters(astBuilder.ConvertEntity(member).GetChildrenByRole(Roles.TypeParameter));
                }
            }
예제 #2
0
        void WriteMemberDeclarationName(IMember member, TokenWriter writer, CSharpFormattingOptions formattingPolicy)
        {
            TypeSystemAstBuilder astBuilder = CreateAstBuilder();
            EntityDeclaration    node       = astBuilder.ConvertEntity(member);

            if ((ConversionFlags & ConversionFlags.ShowDeclaringType) == ConversionFlags.ShowDeclaringType && member.DeclaringType != null)
            {
                ConvertType(member.DeclaringType, writer, formattingPolicy);
                writer.WriteToken(Roles.Dot, ".");
            }
            switch (member.SymbolKind)
            {
            case SymbolKind.Indexer:
                writer.WriteKeyword(Roles.Identifier, "this");
                break;

            case SymbolKind.Constructor:
                WriteQualifiedName(member.DeclaringType.Name, writer, formattingPolicy);
                break;

            case SymbolKind.Destructor:
                writer.WriteToken(DestructorDeclaration.TildeRole, "~");
                WriteQualifiedName(member.DeclaringType.Name, writer, formattingPolicy);
                break;

            case SymbolKind.Operator:
                switch (member.Name)
                {
                case "op_Implicit":
                    writer.WriteKeyword(OperatorDeclaration.ImplicitRole, "implicit");
                    writer.Space();
                    writer.WriteKeyword(OperatorDeclaration.OperatorKeywordRole, "operator");
                    writer.Space();
                    ConvertType(member.ReturnType, writer, formattingPolicy);
                    break;

                case "op_Explicit":
                    writer.WriteKeyword(OperatorDeclaration.ExplicitRole, "explicit");
                    writer.Space();
                    writer.WriteKeyword(OperatorDeclaration.OperatorKeywordRole, "operator");
                    writer.Space();
                    ConvertType(member.ReturnType, writer, formattingPolicy);
                    break;

                default:
                    writer.WriteKeyword(OperatorDeclaration.OperatorKeywordRole, "operator");
                    writer.Space();
                    var operatorType = OperatorDeclaration.GetOperatorType(member.Name);
                    if (operatorType.HasValue)
                    {
                        writer.WriteToken(OperatorDeclaration.GetRole(operatorType.Value), OperatorDeclaration.GetToken(operatorType.Value));
                    }
                    else
                    {
                        writer.WriteIdentifier(node.NameToken);
                    }
                    break;
                }
                break;

            default:
                writer.WriteIdentifier(Identifier.Create(member.Name));
                break;
            }
            WriteTypeParameters(node, writer, formattingPolicy);
        }
예제 #3
0
        SearchScope GetSearchScopeForOperator(IMethod op)
        {
            OperatorType?opType = OperatorDeclaration.GetOperatorType(op.Name);

            if (opType == null)
            {
                return(new FindMethodReferences(op));
            }
            switch (opType.Value)
            {
            case OperatorType.LogicalNot:
                return(new FindUnaryOperator(op, UnaryOperatorType.Not));

            case OperatorType.OnesComplement:
                return(new FindUnaryOperator(op, UnaryOperatorType.BitNot));

            case OperatorType.UnaryPlus:
                return(new FindUnaryOperator(op, UnaryOperatorType.Plus));

            case OperatorType.UnaryNegation:
                return(new FindUnaryOperator(op, UnaryOperatorType.Minus));

            case OperatorType.Increment:
                return(new FindUnaryOperator(op, UnaryOperatorType.Increment));

            case OperatorType.Decrement:
                return(new FindUnaryOperator(op, UnaryOperatorType.Decrement));

            case OperatorType.True:
            case OperatorType.False:
                // TODO: implement search for op_True/op_False correctly
                return(new FindMethodReferences(op));

            case OperatorType.Addition:
                return(new FindBinaryOperator(op, BinaryOperatorType.Add));

            case OperatorType.Subtraction:
                return(new FindBinaryOperator(op, BinaryOperatorType.Subtract));

            case OperatorType.Multiply:
                return(new FindBinaryOperator(op, BinaryOperatorType.Multiply));

            case OperatorType.Division:
                return(new FindBinaryOperator(op, BinaryOperatorType.Divide));

            case OperatorType.Modulus:
                return(new FindBinaryOperator(op, BinaryOperatorType.Modulus));

            case OperatorType.BitwiseAnd:
                // TODO: an overloaded bitwise operator can also be called using the corresponding logical operator
                // (if op_True/op_False is defined)
                return(new FindBinaryOperator(op, BinaryOperatorType.BitwiseAnd));

            case OperatorType.BitwiseOr:
                return(new FindBinaryOperator(op, BinaryOperatorType.BitwiseOr));

            case OperatorType.ExclusiveOr:
                return(new FindBinaryOperator(op, BinaryOperatorType.ExclusiveOr));

            case OperatorType.LeftShift:
                return(new FindBinaryOperator(op, BinaryOperatorType.ShiftLeft));

            case OperatorType.RightShift:
                return(new FindBinaryOperator(op, BinaryOperatorType.ShiftRight));

            case OperatorType.Equality:
                return(new FindBinaryOperator(op, BinaryOperatorType.Equality));

            case OperatorType.Inequality:
                return(new FindBinaryOperator(op, BinaryOperatorType.InEquality));

            case OperatorType.GreaterThan:
                return(new FindBinaryOperator(op, BinaryOperatorType.GreaterThan));

            case OperatorType.LessThan:
                return(new FindBinaryOperator(op, BinaryOperatorType.LessThan));

            case OperatorType.GreaterThanOrEqual:
                return(new FindBinaryOperator(op, BinaryOperatorType.GreaterThanOrEqual));

            case OperatorType.LessThanOrEqual:
                return(new FindBinaryOperator(op, BinaryOperatorType.LessThanOrEqual));

            case OperatorType.Implicit:
                return(new FindImplicitOperator(op));

            case OperatorType.Explicit:
                return(new FindExplicitOperator(op));

            default:
                throw new InvalidOperationException("Invalid value for OperatorType");
            }
        }
예제 #4
0
        void WriteMemberDeclarationName(IMember member, TokenWriter writer, CSharpFormattingOptions formattingPolicy)
        {
            TypeSystemAstBuilder astBuilder = CreateAstBuilder();
            EntityDeclaration    node       = astBuilder.ConvertEntity(member);

            switch (member.SymbolKind)
            {
            case SymbolKind.Indexer:
                writer.WriteKeyword(Roles.Identifier, "this");
                break;

            case SymbolKind.Constructor:
                WriteQualifiedName(member.DeclaringType.Name, writer, formattingPolicy);
                var typeNode = astBuilder.ConvertEntity(member.DeclaringTypeDefinition);
                WriteTypeParameters(writer, typeNode.GetChildrenByRole(Roles.TypeParameter));
                break;

            case SymbolKind.Destructor:
                writer.WriteToken(DestructorDeclaration.TildeRole, "~");
                WriteQualifiedName(member.DeclaringType.Name, writer, formattingPolicy);
                break;

            case SymbolKind.Operator:
                switch (member.Name)
                {
                case "op_Implicit":
                    writer.WriteKeyword(OperatorDeclaration.ImplicitRole, "implicit");
                    writer.Space();
                    writer.WriteKeyword(OperatorDeclaration.OperatorKeywordRole, "operator");
                    writer.Space();
                    ConvertType(member.ReturnType, writer, formattingPolicy);
                    break;

                case "op_Explicit":
                    writer.WriteKeyword(OperatorDeclaration.ExplicitRole, "explicit");
                    writer.Space();
                    writer.WriteKeyword(OperatorDeclaration.OperatorKeywordRole, "operator");
                    writer.Space();
                    ConvertType(member.ReturnType, writer, formattingPolicy);
                    break;

                default:
                    writer.WriteKeyword(OperatorDeclaration.OperatorKeywordRole, "operator");
                    writer.Space();
                    var operatorType = OperatorDeclaration.GetOperatorType(member.Name);
                    if (operatorType.HasValue)
                    {
                        writer.WriteToken(OperatorDeclaration.GetRole(operatorType.Value), OperatorDeclaration.GetToken(operatorType.Value));
                    }
                    else
                    {
                        writer.WriteIdentifier(node.NameToken);
                    }
                    break;
                }
                break;

            default:
                writer.WriteIdentifier(Identifier.Create(member.Name));
                if (member is IMethod)
                {
                    var method = ((IMethod)member);

                    var methodParameterTypeArguments =
                        from p in method.Parameters
                        from type in ExpandIntersections(p.Type)
                        from typeArgument in type.TypeArguments
                        select typeArgument.Name;

                    IEnumerable <AstNode> typeArgs = node.GetChildrenByRole(Roles.TypeParameter).Where(arg => !methodParameterTypeArguments.Contains(arg.Name));
                    WriteTypeParameters(writer, typeArgs);
                }
                break;
            }
        }
예제 #5
0
        public static string GetKey(EnvDTE.CodeElement member)
        {
            StringBuilder b = new StringBuilder();

            if ((member.Kind == EnvDTE.vsCMElement.vsCMElementDelegate) ||
                (member.Kind == EnvDTE.vsCMElement.vsCMElementEnum) ||
                (member.Kind == EnvDTE.vsCMElement.vsCMElementInterface) ||
                (member.Kind == EnvDTE.vsCMElement.vsCMElementStruct) ||
                (member.Kind == EnvDTE.vsCMElement.vsCMElementClass))
            {
                b.Append("T:");
                AppendTypeName(b, member.FullName, true, false);
            }
            else if (member.Kind == EnvDTE.vsCMElement.vsCMElementNamespace)
            {
                b.Append("N:");
                b.Append(member.FullName);
            }
            else
            {
                if (member.Kind == EnvDTE.vsCMElement.vsCMElementVariable)
                {
                    b.Append("F:");
                }
                else if (member.Kind == EnvDTE.vsCMElement.vsCMElementProperty)
                {
                    b.Append("P:");
                }
                else if (member.Kind == EnvDTE.vsCMElement.vsCMElementEvent)
                {
                    b.Append("E:");
                }
                else if (member.Kind == EnvDTE.vsCMElement.vsCMElementFunction)
                {
                    b.Append("M:");
                }

                int    nameIndex  = member.FullName.LastIndexOf(member.Name);
                string typeName   = member.FullName.Substring(0, nameIndex - 1);
                string memberName = member.FullName.Substring(nameIndex);

                // Name substitutions for special cases.
                if (member.Kind == EnvDTE.vsCMElement.vsCMElementFunction)
                {
                    EnvDTE80.CodeFunction2 mr = (EnvDTE80.CodeFunction2)member;
                    if (mr.FunctionKind == EnvDTE.vsCMFunction.vsCMFunctionConstructor)
                    {
                        memberName = memberName.Replace(member.Name, "#ctor");
                    }
                    else if (mr.FunctionKind == EnvDTE.vsCMFunction.vsCMFunctionDestructor)
                    {
                        memberName = memberName.Replace(member.Name, "Finalize");
                    }
                    else if (mr.FunctionKind == EnvDTE.vsCMFunction.vsCMFunctionOperator)
                    {
                        if (memberName.StartsWith("implicit operator"))
                        {
                            memberName = "op_Implicit";
                        }
                        else if (memberName.StartsWith("explicit operator"))
                        {
                            memberName = "op_Explicit";
                        }
                        else
                        {
                            // NRefactory has a handy mapping we can make use of, just need to extract the operator symbol first.
                            string[] memberNameWords = member.Name.Split(' ');
                            if (memberNameWords.Length >= 2)
                            {
                                string operatorSymbol = memberNameWords[1];
                                string operatorName   = OperatorDeclaration.GetName(OperatorDeclaration.GetOperatorType(operatorSymbol));
                                if (operatorName != null)
                                {
                                    memberName = memberName.Replace(member.Name, operatorName);
                                }
                            }
                        }
                    }
                }
                else if (member.Kind == EnvDTE.vsCMElement.vsCMElementProperty)
                {
                    if (member.Name == "this")
                    {
                        memberName = memberName.Replace(member.Name, "Item");
                    }
                }

                string[] genericTypeParameters = AppendTypeName(b, typeName, true, false);
                b.Append('.');
                string[]            genericMethodParameters = AppendTypeName(b, memberName.Replace('.', '#'), true, true);
                EnvDTE.CodeElements parameters;
                EnvDTE.CodeTypeRef  explicitReturnType = null;
                if (member.Kind == EnvDTE.vsCMElement.vsCMElementProperty)
                {
                    parameters = ((EnvDTE.CodeProperty)member).Getter.Parameters;
                }
                else if (member.Kind == EnvDTE.vsCMElement.vsCMElementFunction)
                {
                    EnvDTE80.CodeFunction2 mr = (EnvDTE80.CodeFunction2)member;
                    parameters = mr.Parameters;
                    if (memberName == "op_Implicit" || memberName == "op_Explicit")
                    {
                        explicitReturnType = mr.Type;
                    }
                }
                else
                {
                    parameters = null;
                }
                if (parameters != null && parameters.Count > 0)
                {
                    b.Append('(');
                    int i = 0;
                    foreach (EnvDTE80.CodeParameter2 parameter in parameters)
                    {
                        if (i > 0)
                        {
                            b.Append(',');
                        }
                        AppendParameterTypeName(b, parameter, genericTypeParameters, genericMethodParameters);
                        ++i;
                    }
                    b.Append(')');
                }
                if (explicitReturnType != null)
                {
                    b.Append('~');
                    AppendTypeName(b, explicitReturnType.AsFullName, true, false);
                }
            }
            return(b.ToString());
        }