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)); } }
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); }
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"); } }
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; } }
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()); }