Esempio n. 1
0
        internal static string GenerateMemberCode(MDRefactoringContext ctx, TypeSystemAstBuilder builder, IMember member)
        {
            var method = builder.ConvertEntity(member) as MethodDeclaration;

            if (method != null)
            {
                method.Body = new BlockStatement {
                    new ThrowStatement(new ObjectCreateExpression(ctx.CreateShortType("System", "NotImplementedException")))
                };
                method.Modifiers &= ~Modifiers.Virtual;
                method.Modifiers &= ~Modifiers.Abstract;
                method.Attributes.Add(new AttributeSection {
                    Attributes =
                    {
                        GenerateExportAttribute(ctx, member)
                    }
                });
                return(method.ToString(ctx.FormattingOptions));
            }
            var property = builder.ConvertEntity(member) as PropertyDeclaration;

            if (property == null)
            {
                return(null);
            }
            var p = (IProperty)member;

            property.Modifiers &= ~Modifiers.Virtual;
            property.Modifiers &= ~Modifiers.Abstract;
            if (p.CanGet)
            {
                property.Getter.Body = new BlockStatement {
                    new ThrowStatement(new ObjectCreateExpression(ctx.CreateShortType("System", "NotImplementedException")))
                };
                property.Getter.Attributes.Add(new AttributeSection {
                    Attributes =
                    {
                        GenerateExportAttribute(ctx, p.Getter)
                    }
                });
            }
            if (p.CanSet)
            {
                property.Setter.Body = new BlockStatement {
                    new ThrowStatement(new ObjectCreateExpression(ctx.CreateShortType("System", "NotImplementedException")))
                };
                property.Setter.Attributes.Add(new AttributeSection {
                    Attributes =
                    {
                        GenerateExportAttribute(ctx, p.Setter)
                    }
                });
            }
            return(property.ToString(ctx.FormattingOptions));
        }
Esempio n. 2
0
        void ConvertTypeDeclaration(ITypeDefinition typeDef, StringWriter writer)
        {
            TypeSystemAstBuilder astBuilder      = CreateAstBuilder();
            TypeDeclaration      typeDeclaration = (TypeDeclaration)astBuilder.ConvertEntity(typeDef);

            PrintModifiers(typeDeclaration.Modifiers, writer);
            if ((ConversionFlags & ConversionFlags.ShowDefinitionKeyWord) == ConversionFlags.ShowDefinitionKeyWord)
            {
                switch (typeDeclaration.ClassType)
                {
                case ClassType.Class:
                    writer.Write("class");
                    break;

                case ClassType.Struct:
                    writer.Write("struct");
                    break;

                case ClassType.Interface:
                    writer.Write("interface");
                    break;

                case ClassType.Enum:
                    writer.Write("enum");
                    break;

                default:
                    throw new Exception("Invalid value for ClassType");
                }
                writer.Write(' ');
            }
            WriteTypeDeclarationName(typeDef, writer);
        }
Esempio n. 3
0
        public override void Complete(CompletionContext context)
        {
            if (declarationBegin > context.StartOffset)
            {
                base.Complete(context);
                return;
            }

            TypeSystemAstBuilder b = new TypeSystemAstBuilder(contextAtCaret);

            b.GenerateBody = true;

            var entityDeclaration = b.ConvertEntity(this.Entity);

            entityDeclaration.Modifiers &= ~Modifiers.VisibilityMask;             // remove visiblity
            entityDeclaration.Modifiers |= Modifiers.Shared;

            var          document          = context.Editor.Document;
            StringWriter w                 = new StringWriter();
            var          formattingOptions = AlFormattingPolicies.Instance.GetProjectOptions(contextAtCaret.Compilation.GetProject());
            var          segmentDict       = SegmentTrackingOutputFormatter.WriteNode(
                w, entityDeclaration, formattingOptions.OptionsContainer.GetEffectiveOptions(), context.Editor.Options);

            using (document.OpenUndoGroup()) {
                string newText = w.ToString().TrimEnd();
                document.Replace(declarationBegin, context.EndOffset - declarationBegin, newText);
                var throwStatement = entityDeclaration.Descendants.FirstOrDefault(n => n is ThrowStatement);
                if (throwStatement != null)
                {
                    var segment = segmentDict[throwStatement];
                    context.Editor.Select(declarationBegin + segment.Offset, segment.Length);
                }
                AlFormatterHelper.Format(context.Editor, declarationBegin, newText.Length, formattingOptions.OptionsContainer);
            }
        }
Esempio n. 4
0
        void WriteTypeDeclarationName(ITypeDefinition typeDef, TokenWriter writer, CSharpFormattingOptions formattingPolicy)
        {
            TypeSystemAstBuilder astBuilder = CreateAstBuilder();
            EntityDeclaration    node       = astBuilder.ConvertEntity(typeDef);

            if (typeDef.DeclaringTypeDefinition != null)
            {
                WriteTypeDeclarationName(typeDef.DeclaringTypeDefinition, writer, formattingPolicy);
                writer.WriteToken(Roles.Dot, ".");
            }
            else if ((ConversionFlags & ConversionFlags.UseFullyQualifiedEntityNames) == ConversionFlags.UseFullyQualifiedEntityNames)
            {
                if (!string.IsNullOrEmpty(typeDef.Namespace))
                {
                    WriteQualifiedName(typeDef.Namespace, writer, formattingPolicy);
                    writer.WriteToken(Roles.Dot, ".");
                }
            }
            writer.WriteIdentifier(node.NameToken);
            if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList)
            {
                var outputVisitor = new CSharpOutputVisitor(writer, formattingPolicy);
                outputVisitor.WriteTypeParameters(node.GetChildrenByRole(Roles.TypeParameter));
            }
        }
Esempio n. 5
0
        public static string GetOverrideTargetName
            (IMember m, CSharpTypeResolveContext resolveContext)
        {
            var builder = new TypeSystemAstBuilder
                              (new CSharpResolver(resolveContext));

            return(builder.ConvertEntity(m).ToString()
                   // Builder automatically adds a trailing newline
                   .TrimEnd(Environment.NewLine.ToCharArray()));
        }
        static string GeneratePartialClassContextStub(DebuggerCompletionContext context)
        {
            var compilation = SD.ParserService.GetCompilationForFile(context.FileName);
            var file        = SD.ParserService.GetExistingUnresolvedFile(context.FileName);

            if (compilation == null || file == null)
            {
                return("");
            }
            var member = file.GetMember(context.Location);

            if (member == null)
            {
                return("");
            }
            var builder            = new TypeSystemAstBuilder();
            EntityDeclaration decl = builder.ConvertEntity(member.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly)));

            decl.Name       = "__DebuggerStub_" + decl.Name;
            decl.Modifiers &= (Modifiers.Static);
            switch (member.SymbolKind)
            {
            case SymbolKind.Property:
                break;

            case SymbolKind.Indexer:
                break;

            case SymbolKind.Event:
                break;

            case SymbolKind.Method:
                GenerateBodyFromContext(builder, context, (MethodDeclaration)decl);
                break;

            case SymbolKind.Operator:
                break;

            case SymbolKind.Constructor:
                break;

            case SymbolKind.Destructor:
                break;

            case SymbolKind.Accessor:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(WrapInType(member.DeclaringTypeDefinition, decl.ToString()));
        }
Esempio n. 7
0
        void WriteTypeDeclarationName(ITypeDefinition typeDef, TokenWriter writer, CSharpFormattingOptions formattingPolicy)
        {
            var astBuilder         = new TypeSystemAstBuilder();
            EntityDeclaration node = astBuilder.ConvertEntity(typeDef);

            if (typeDef.DeclaringTypeDefinition != null)
            {
                WriteTypeDeclarationName(typeDef.DeclaringTypeDefinition, writer, formattingPolicy);
                writer.WriteToken(Roles.Dot, ".");
            }
            writer.WriteIdentifier(node.NameToken);
            WriteTypeParameters(writer, node.GetChildrenByRole(Roles.TypeParameter));
        }
Esempio n. 8
0
		public override void InsertEventHandler(ITypeDefinition target, string name, IEvent eventDefinition, bool jumpTo)
		{
			IUnresolvedTypeDefinition match = null;
			
			foreach (var part in target.Parts) {
				if (match == null || EntityModelContextUtils.IsBetterPart(part, match, ".cs"))
					match = part;
			}
			
			if (match == null) return;
			
			var view = SD.FileService.OpenFile(new FileName(match.Region.FileName), jumpTo);
			var editor = view.GetRequiredService<ITextEditor>();
			var last = match.Members.LastOrDefault() ?? (IUnresolvedEntity)match;
			editor.Caret.Location = last.BodyRegion.End;
			var context = SDRefactoringContext.Create(editor, CancellationToken.None);
			
			var node = context.RootNode.GetNodeAt<EntityDeclaration>(last.Region.Begin);
			var resolver = context.GetResolverStateAfter(node);
			var builder = new TypeSystemAstBuilder(resolver);
			var invokeMethod = eventDefinition.ReturnType.GetDelegateInvokeMethod();
			if (invokeMethod == null) return;
			var importedMethod = resolver.Compilation.Import(invokeMethod);
			var delegateDecl = builder.ConvertEntity(importedMethod) as MethodDeclaration;
			if (delegateDecl == null) return;
			var throwStmt = new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")));
			var decl = new MethodDeclaration() {
				ReturnType = delegateDecl.ReturnType.Clone(),
				Name = name,
				Body = new BlockStatement() {
					throwStmt
				}
			};
			var param = delegateDecl.Parameters.Select(p => p.Clone()).ToArray();
			decl.Parameters.AddRange(param);
			
			using (Script script = context.StartScript()) {
				// FIXME : will not work properly if there are no members.
				if (last == match) {
					throw new NotImplementedException();
					// TODO InsertWithCursor not implemented!
					//script.InsertWithCursor("Insert event handler", Script.InsertPosition.End, decl).RunSynchronously();
				} else {
					// TODO does not jump correctly...
					script.InsertAfter(node, decl);
					editor.JumpTo(throwStmt.StartLocation.Line, throwStmt.StartLocation.Column);
				}
			}
		}
        static string GeneratePartialClassContextStub(DebuggerCompletionContext context)
        {
            var compilation = SD.ParserService.GetCompilationForFile(context.FileName);
            var file        = SD.ParserService.GetExistingUnresolvedFile(context.FileName);

            if (compilation == null || file == null)
            {
                return("");
            }
            var unresolvedMember = file.GetMember(context.Location);

            if (unresolvedMember == null)
            {
                return("");
            }
            var member = unresolvedMember.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly));

            if (member == null)
            {
                return("");
            }
            var builder = new TypeSystemAstBuilder();
            MethodDeclaration decl;

            if (unresolvedMember is IMethod)
            {
                // If it's a method, convert it directly (including parameters + type parameters)
                decl = (MethodDeclaration)builder.ConvertEntity(member);
            }
            else
            {
                // Otherwise, create a method anyways, and copy the parameters
                decl = new MethodDeclaration();
                if (member is IParameterizedMember)
                {
                    foreach (var p in ((IParameterizedMember)member).Parameters)
                    {
                        decl.Parameters.Add(builder.ConvertParameter(p));
                    }
                }
            }
            decl.Name       = "__DebuggerStub__";
            decl.ReturnType = builder.ConvertType(member.ReturnType);
            decl.Modifiers  = unresolvedMember.IsStatic ? Modifiers.Static : Modifiers.None;
            // Make the method look like an explicit interface implementation so that it doesn't appear in CC
            decl.PrivateImplementationType = new SimpleType("__DummyType__");
            decl.Body = GenerateBodyFromContext(builder, context);
            return(WrapInType(unresolvedMember.DeclaringTypeDefinition, decl).ToString());
        }
Esempio n. 10
0
        void WriteTypeDeclarationName(ITypeDefinition typeDef, StringWriter writer)
        {
            TypeSystemAstBuilder astBuilder = CreateAstBuilder();

            if (typeDef.DeclaringTypeDefinition != null)
            {
                WriteTypeDeclarationName(typeDef.DeclaringTypeDefinition, writer);
                writer.Write('.');
            }
            else if ((ConversionFlags & ConversionFlags.UseFullyQualifiedMemberNames) == ConversionFlags.UseFullyQualifiedMemberNames)
            {
                writer.Write(typeDef.Namespace);
                writer.Write('.');
            }
            writer.Write(typeDef.Name);
            if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList)
            {
                CreatePrinter(writer).WriteTypeParameters(((TypeDeclaration)astBuilder.ConvertEntity(typeDef)).TypeParameters);
            }
        }
            void WriteTypeDeclarationName(ITypeDefinition typeDef, IOutputFormatter formatter, CSharpFormattingOptions formattingPolicy)
            {
                TypeSystemAstBuilder astBuilder = CreateAstBuilder();

                if (typeDef.DeclaringTypeDefinition != null)
                {
                    WriteTypeDeclarationName(typeDef.DeclaringTypeDefinition, formatter, formattingPolicy);
                    formatter.WriteToken(".");
                }
                else if ((ConversionFlags & ConversionFlags.UseFullyQualifiedTypeNames) == ConversionFlags.UseFullyQualifiedTypeNames)
                {
                    formatter.WriteIdentifier(typeDef.Namespace);
                    formatter.WriteToken(".");
                }
                formatter.WriteIdentifier(typeDef.Name);
                if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList)
                {
                    var outputVisitor = new CSharpOutputVisitor(formatter, formattingPolicy);
                    outputVisitor.WriteTypeParameters(astBuilder.ConvertEntity(typeDef).GetChildrenByRole(Roles.TypeParameter));
                }
            }
Esempio n. 12
0
        /// <summary>
        ///   Takes an editing context. Inserts an override
        ///   declaration of the chosen member in the context. Returns
        ///   the new context.
        /// </summary>
        /// <remarks>
        ///   The text editor cursor stays in the same line and column
        ///   it originally was.
        /// </remarks>
        public RunOverrideTargetResponse RunOverrideTarget
            (RunOverrideTargetRequest request)
        {
            var overrideContext    = new OverrideContext(request, _parser);
            var refactoringContext = OmniSharpRefactoringContext.GetContext
                                         (overrideContext.BufferParser, request);

            var memberToOverride = overrideContext.GetOverridableMembers()
                                   .First(ot => {
                var memberSignature =
                    GetOverrideTargetsResponse.GetOverrideTargetName
                        (ot, overrideContext.CompletionContext.ResolveContext);

                return(memberSignature == request.OverrideTargetName);
            });

            var builder = new TypeSystemAstBuilder
                              (new CSharpResolver
                                  (overrideContext.CompletionContext.ResolveContext))
                          // Will generate a "throw new
                          // NotImplementedException();" statement in the
                          // bodies
            {
                GenerateBody = true
            };

            var newEditorContents = runOverrideTargetWorker
                                        (request
                                        , refactoringContext
                                        , overrideContext.CompletionContext.ParsedContent
                                        , script: new OmniSharpScript(refactoringContext, _config)
                                        , memberDeclaration:
                                        builder.ConvertEntity(memberToOverride));

            return(new RunOverrideTargetResponse
                       (fileName: request.FileName
                       , buffer: newEditorContents.Text
                       , line: request.Line
                       , column: request.Column));
        }
Esempio n. 13
0
        void WriteTypeDeclarationName(ITypeDefinition typeDef, TokenWriter writer, CSharpFormattingOptions formattingPolicy)
        {
            TypeSystemAstBuilder astBuilder = CreateAstBuilder();
            EntityDeclaration    node       = astBuilder.ConvertEntity(typeDef);

            if (typeDef.DeclaringTypeDefinition != null &&
                ((ConversionFlags & ConversionFlags.ShowDeclaringType) == ConversionFlags.ShowDeclaringType ||
                 (ConversionFlags & ConversionFlags.UseFullyQualifiedEntityNames) == ConversionFlags.UseFullyQualifiedEntityNames))
            {
                WriteTypeDeclarationName(typeDef.DeclaringTypeDefinition, writer, formattingPolicy);
                writer.WriteToken(Roles.Dot, ".");
            }
            else if ((ConversionFlags & ConversionFlags.UseFullyQualifiedEntityNames) == ConversionFlags.UseFullyQualifiedEntityNames)
            {
                if (!string.IsNullOrEmpty(typeDef.Namespace))
                {
                    WriteQualifiedName(typeDef.Namespace, writer, formattingPolicy);
                    writer.WriteToken(Roles.Dot, ".");
                }
            }
            writer.WriteIdentifier(node.NameToken);
            WriteTypeParameters(node, writer, formattingPolicy);
        }
Esempio n. 14
0
        static string GeneratePartialClassContextStub(ICodeContext context)
        {
            var member = context.CurrentMember;

            if (member == null)
            {
                return("");
            }
            var builder = new TypeSystemAstBuilder();
            MethodDeclaration decl;

            if (member is IMethod)
            {
                // If it's a method, convert it directly (including parameters + type parameters)
                decl = (MethodDeclaration)builder.ConvertEntity(member);
            }
            else
            {
                // Otherwise, create a method anyways, and copy the parameters
                decl = new MethodDeclaration();
                if (member is IParameterizedMember)
                {
                    foreach (var p in ((IParameterizedMember)member).Parameters)
                    {
                        decl.Parameters.Add(builder.ConvertParameter(p));
                    }
                }
            }
            decl.Name       = "__DebuggerStub__";
            decl.ReturnType = builder.ConvertType(member.ReturnType);
            decl.Modifiers  = member.IsStatic ? Modifiers.Static : Modifiers.None;
            // Make the method look like an explicit interface implementation so that it doesn't appear in CC
            decl.PrivateImplementationType = new SimpleType("__DummyType__");
            decl.Body = GenerateBodyFromContext(builder, context.LocalVariables.ToArray());
            return(WrapInType(context.CurrentTypeDefinition, decl).ToString());
        }
Esempio n. 15
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;
            }
        }
Esempio n. 16
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;
            }
            if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList && member.SymbolKind == SymbolKind.Method)
            {
                var outputVisitor = new CSharpOutputVisitor(writer, formattingPolicy);
                outputVisitor.WriteTypeParameters(node.GetChildrenByRole(Roles.TypeParameter));
            }
        }
Esempio n. 17
0
        public override void Complete(CompletionContext context)
        {
            if (declarationBegin > context.StartOffset)
            {
                base.Complete(context);
                return;
            }

            TypeSystemAstBuilder b = new TypeSystemAstBuilder(contextAtCaret);

            b.ShowTypeParameterConstraints = false;
            b.GenerateBody = true;

            var entityDeclaration = b.ConvertEntity(this.Entity);

            entityDeclaration.Modifiers &= ~(Modifiers.Virt | Modifiers.Abstract);
            entityDeclaration.Modifiers |= Modifiers.Override;

            var       body = entityDeclaration.GetChildByRole(Roles.Body);
            Statement baseCallStatement = body.Children.OfType <Statement>().FirstOrDefault();

            if (!this.Entity.IsAbstract)
            {
                // modify body to call the base method
                if (this.Entity.SymbolKind == SymbolKind.Method)
                {
                    var baseCall = new BaseReferenceExpression().Invoke(this.Entity.Name, new Expression[] { });
                    if (((IMethod)this.Entity).ReturnType.IsKnownType(KnownTypeCode.Void))
                    {
                        baseCallStatement = new ExpressionStatement(baseCall);
                    }
                    else
                    {
                        baseCallStatement = new ReturnStatement(baseCall);
                    }

                    // Clear body of inserted method
                    entityDeclaration.GetChildByRole(Roles.Body).Statements.Clear();
                }
            }

            var          document          = context.Editor.Document;
            StringWriter w                 = new StringWriter();
            var          formattingOptions = AlFormattingPolicies.Instance.GetProjectOptions(contextAtCaret.Compilation.GetProject());
            var          segmentDict       = SegmentTrackingOutputFormatter.WriteNode(
                w, entityDeclaration, formattingOptions.OptionsContainer.GetEffectiveOptions(), context.Editor.Options);

            using (document.OpenUndoGroup()) {
                InsertionContext insertionContext = new InsertionContext(context.Editor.GetService(typeof(TextArea)) as TextArea, declarationBegin);
                insertionContext.InsertionPosition = context.Editor.Caret.Offset;

                string newText = w.ToString().TrimEnd();
                document.Replace(declarationBegin, context.EndOffset - declarationBegin, newText);
                var throwStatement = entityDeclaration.Descendants.FirstOrDefault(n => n is ThrowStatement);
                if (throwStatement != null)
                {
                    var segment = segmentDict[throwStatement];
                    context.Editor.Select(declarationBegin + segment.Offset, segment.Length);
                }
                AlFormatterHelper.Format(context.Editor, declarationBegin, newText.Length, formattingOptions.OptionsContainer);

                var refactoringContext = SDRefactoringContext.Create(context.Editor, CancellationToken.None);
                var typeResolveContext = refactoringContext.GetTypeResolveContext();
                if (typeResolveContext == null)
                {
                    return;
                }
                var resolvedCurrent        = typeResolveContext.CurrentTypeDefinition;
                IEditorUIService uiService = context.Editor.GetService(typeof(IEditorUIService)) as IEditorUIService;

                ITextAnchor endAnchor = context.Editor.Document.CreateAnchor(context.Editor.Caret.Offset);
                endAnchor.MovementType = AnchorMovementType.AfterInsertion;

                ITextAnchor startAnchor = context.Editor.Document.CreateAnchor(context.Editor.Caret.Offset);
                startAnchor.MovementType = AnchorMovementType.BeforeInsertion;

                ITextAnchor insertionPos = context.Editor.Document.CreateAnchor(endAnchor.Offset);
                insertionPos.MovementType = AnchorMovementType.BeforeInsertion;

                var current = typeResolveContext.CurrentTypeDefinition;
                AbstractInlineRefactorDialog dialog = new OverrideEqualsGetHashCodeMethodsDialog(insertionContext, context.Editor, endAnchor, insertionPos, current, Entity as IMethod, baseCallStatement);

                dialog.Element = uiService.CreateInlineUIElement(insertionPos, dialog);

                insertionContext.RegisterActiveElement(new InlineRefactorSnippetElement(cxt => null, ""), dialog);
                insertionContext.RaiseInsertionCompleted(EventArgs.Empty);
            }
        }
Esempio n. 18
0
        public override void InsertEventHandler(ITypeDefinition target, string name, IEvent eventDefinition, bool jumpTo, InsertEventHandlerBodyKind bodyKind = InsertEventHandlerBodyKind.ThrowNotImplementedException)
        {
            IUnresolvedTypeDefinition match = null;

            foreach (var part in target.Parts)
            {
                if (match == null || EntityModelContextUtils.IsBetterPart(part, match, ".cs"))
                {
                    match = part;
                }
            }

            if (match == null)
            {
                return;
            }

            var view   = SD.FileService.OpenFile(new FileName(match.Region.FileName), jumpTo);
            var editor = view.GetRequiredService <ITextEditor>();
            var last   = match.Members.LastOrDefault() ?? (IUnresolvedEntity)match;

            editor.Caret.Location = last.BodyRegion.End;
            var context = SDRefactoringContext.Create(editor, CancellationToken.None);

            var node         = context.RootNode.GetNodeAt <EntityDeclaration>(last.Region.Begin);
            var resolver     = context.GetResolverStateAfter(node);
            var builder      = new TypeSystemAstBuilder(resolver);
            var invokeMethod = eventDefinition.ReturnType.GetDelegateInvokeMethod();

            if (invokeMethod == null)
            {
                return;
            }
            var importedMethod = resolver.Compilation.Import(invokeMethod);
            var delegateDecl   = builder.ConvertEntity(importedMethod) as MethodDeclaration;

            if (delegateDecl == null)
            {
                return;
            }
            var throwStmt = new ThrowStatement(new ObjectCreateExpression(context.CreateShortType("System", "NotImplementedException")));
            var decl      = new MethodDeclaration()
            {
                ReturnType = delegateDecl.ReturnType.Clone(),
                Name       = name,
                Body       = new BlockStatement()
                {
                    throwStmt
                }
            };
            var param = delegateDecl.Parameters.Select(p => p.Clone()).ToArray();

            decl.Parameters.AddRange(param);
            try
            {
                using (Script script = context.StartScript())
                {
                    int eolLen = 0;
                    if (last == match)
                    {
                        eolLen = 2;
                        script.AddTo((TypeDeclaration)node, decl);
                    }
                    else
                    {
                        script.InsertAfter(node, decl);
                    }
                    switch (bodyKind)
                    {
                    case InsertEventHandlerBodyKind.TodoComment:
                        Comment comment = new Comment(" TODO: Implement " + name);
                        script.Replace(throwStmt, comment);
                        script.Select(comment);
                        break;

                    case InsertEventHandlerBodyKind.Nothing:
                        var segment = script.GetSegment(throwStmt);
                        if (script is DocumentScript && eolLen > 0)
                        {
                            eolLen = ((DocumentScript)script).CurrentDocument.GetLineByOffset(segment.Offset).DelimiterLength;
                        }
                        script.RemoveText(segment.Offset, segment.Length - eolLen);
                        script.Select(segment.Offset, segment.Offset);
                        break;

                    case InsertEventHandlerBodyKind.ThrowNotImplementedException:
                        script.Select(throwStmt);
                        break;
                    }
                }
            }
            catch
            {
            }
        }
            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.EntityType)
                {
                case EntityType.Indexer:
                    formatter.WriteKeyword("this");
                    break;

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

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

                case EntityType.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.EntityType == EntityType.Method)
                {
                    var outputVisitor = new CSharpOutputVisitor(formatter, formattingPolicy);
                    outputVisitor.WriteTypeParameters(astBuilder.ConvertEntity(member).GetChildrenByRole(Roles.TypeParameter));
                }
            }
            public void ConvertEntity(IEntity entity, IOutputFormatter formatter, CSharpFormattingOptions formattingPolicy)
            {
                if (entity == null)
                {
                    throw new ArgumentNullException("entity");
                }
                if (formatter == null)
                {
                    throw new ArgumentNullException("formatter");
                }
                if (formattingPolicy == null)
                {
                    throw new ArgumentNullException("options");
                }

                TypeSystemAstBuilder astBuilder = CreateAstBuilder();
                EntityDeclaration    node       = astBuilder.ConvertEntity(entity);

                PrintModifiers(node.Modifiers, formatter);

                if ((ConversionFlags & ConversionFlags.ShowDefinitionKeyword) == ConversionFlags.ShowDefinitionKeyword)
                {
                    if (node is TypeDeclaration)
                    {
                        switch (((TypeDeclaration)node).ClassType)
                        {
                        case ClassType.Class:
                            formatter.WriteKeyword("class");
                            break;

                        case ClassType.Struct:
                            formatter.WriteKeyword("struct");
                            break;

                        case ClassType.Interface:
                            formatter.WriteKeyword("interface");
                            break;

                        case ClassType.Enum:
                            formatter.WriteKeyword("enum");
                            break;

                        default:
                            throw new Exception("Invalid value for ClassType");
                        }
                        formatter.Space();
                    }
                    else if (node is DelegateDeclaration)
                    {
                        formatter.WriteKeyword("delegate");
                        formatter.Space();
                    }
                    else if (node is EventDeclaration)
                    {
                        formatter.WriteKeyword("event");
                        formatter.Space();
                    }
                }

                if ((ConversionFlags & ConversionFlags.ShowReturnType) == ConversionFlags.ShowReturnType)
                {
                    var rt = node.GetChildByRole(Roles.Type);
                    if (!rt.IsNull)
                    {
                        rt.AcceptVisitor(new CSharpOutputVisitor(formatter, formattingPolicy));
                        formatter.Space();
                    }
                }

                if (entity is ITypeDefinition)
                {
                    WriteTypeDeclarationName((ITypeDefinition)entity, formatter, formattingPolicy);
                }
                else
                {
                    WriteMemberDeclarationName((IMember)entity, formatter, formattingPolicy);
                }

                if ((ConversionFlags & ConversionFlags.ShowParameterList) == ConversionFlags.ShowParameterList && HasParameters(entity))
                {
                    formatter.WriteToken(entity.EntityType == EntityType.Indexer ? "[" : "(");
                    bool first = true;
                    foreach (var param in node.GetChildrenByRole(Roles.Parameter))
                    {
                        if (first)
                        {
                            first = false;
                        }
                        else
                        {
                            formatter.WriteToken(",");
                            formatter.Space();
                        }
                        param.AcceptVisitor(new CSharpOutputVisitor(formatter, formattingPolicy));
                    }
                    formatter.WriteToken(entity.EntityType == EntityType.Indexer ? "]" : ")");
                }

                if ((ConversionFlags & ConversionFlags.ShowBody) == ConversionFlags.ShowBody && !(node is TypeDeclaration))
                {
                    IProperty property = entity as IProperty;
                    if (property != null)
                    {
                        formatter.Space();
                        formatter.WriteToken("{");
                        formatter.Space();
                        if (property.CanGet)
                        {
                            formatter.WriteKeyword("get");
                            formatter.WriteToken(";");
                            formatter.Space();
                        }
                        if (property.CanSet)
                        {
                            formatter.WriteKeyword("set");
                            formatter.WriteToken(";");
                            formatter.Space();
                        }
                        formatter.WriteToken("}");
                    }
                    else
                    {
                        formatter.WriteToken(";");
                    }
                }
            }
        public override void Complete(TextArea textArea, ISegment completionSegment, EventArgs insertionRequestEventArgs)
        {
            if (declarationBegin > completionSegment.Offset)
            {
                base.Complete(textArea, completionSegment, insertionRequestEventArgs);
                return;
            }
            var b = new TypeSystemAstBuilder(new CSharpResolver(contextAtCaret))
            {
                ShowTypeParameterConstraints = false,
                GenerateBody = true
            };

            var entityDeclaration = b.ConvertEntity(this.Entity);

            entityDeclaration.Modifiers &= ~(Modifiers.Virtual | Modifiers.Abstract);
            entityDeclaration.Modifiers |= Modifiers.Override;

            if (!this.Entity.IsAbstract)
            {
                // modify body to call the base method
                if (this.Entity.SymbolKind == SymbolKind.Method)
                {
                    var baseCall = new BaseReferenceExpression().Invoke(this.Entity.Name, ParametersToExpressions(this.Entity));
                    var body     = entityDeclaration.GetChildByRole(Roles.Body);
                    body.Statements.Clear();
                    if (((IMethod)this.Entity).ReturnType.IsKnownType(KnownTypeCode.Void))
                    {
                        body.Statements.Add(new ExpressionStatement(baseCall));
                    }
                    else
                    {
                        body.Statements.Add(new ReturnStatement(baseCall));
                    }
                }
                else if (this.Entity.SymbolKind == SymbolKind.Indexer || this.Entity.SymbolKind == SymbolKind.Property)
                {
                    Expression baseCall;
                    if (this.Entity.SymbolKind == SymbolKind.Indexer)
                    {
                        baseCall = new BaseReferenceExpression().Indexer(ParametersToExpressions(this.Entity));
                    }
                    else
                    {
                        baseCall = new BaseReferenceExpression().Member(this.Entity.Name);
                    }
                    var getterBody = entityDeclaration.GetChildByRole(PropertyDeclaration.GetterRole).Body;
                    if (!getterBody.IsNull)
                    {
                        getterBody.Statements.Clear();
                        getterBody.Add(new ReturnStatement(baseCall.Clone()));
                    }
                    var setterBody = entityDeclaration.GetChildByRole(PropertyDeclaration.SetterRole).Body;
                    if (!setterBody.IsNull)
                    {
                        setterBody.Statements.Clear();
                        setterBody.Add(new AssignmentExpression(baseCall.Clone(), new IdentifierExpression("value")));
                    }
                }
            }

            var          document          = textArea.Document;
            StringWriter w                 = new StringWriter();
            var          formattingOptions = FormattingOptionsFactory.CreateSharpDevelop();
            var          segmentDict       = SegmentTrackingOutputFormatter.WriteNode(w, entityDeclaration, formattingOptions, textArea.Options);

            string newText = w.ToString().TrimEnd();

            document.Replace(declarationBegin, completionSegment.EndOffset - declarationBegin, newText);
            var throwStatement = entityDeclaration.Descendants.FirstOrDefault(n => n is ThrowStatement);

            if (throwStatement != null)
            {
                var segment = segmentDict[throwStatement];
                textArea.Selection = new RectangleSelection(textArea, new TextViewPosition(textArea.Document.GetLocation(declarationBegin + segment.Offset)), new TextViewPosition(textArea.Document.GetLocation(declarationBegin + segment.Offset + segment.Length)));
            }

            //format the inserted code nicely
            var formatter = new CSharpFormatter(formattingOptions);

            formatter.AddFormattingRegion(new DomRegion(document.GetLocation(declarationBegin), document.GetLocation(declarationBegin + newText.Length)));
            var syntaxTree = new CSharpParser().Parse(document);

            formatter.AnalyzeFormatting(document, syntaxTree).ApplyChanges();
        }
Esempio n. 22
0
        void ConvertMember(IMember member, StringWriter writer)
        {
            TypeSystemAstBuilder astBuilder = CreateAstBuilder();

            astBuilder.ShowParameterNames = (ConversionFlags & ConversionFlags.ShowParameterNames) == ConversionFlags.ShowParameterNames;

            AttributedNode node = (AttributedNode)astBuilder.ConvertEntity(member);

            PrintModifiers(node.Modifiers, writer);

            if ((ConversionFlags & ConversionFlags.ShowReturnType) == ConversionFlags.ShowReturnType)
            {
                var rt = node.GetChildByRole(AstNode.Roles.Type);
                if (rt != AstNode.Roles.Type.NullObject)
                {
                    writer.Write(rt.AcceptVisitor(CreatePrinter(writer), null));
                    writer.Write(' ');
                }
            }

            WriteMemberDeclarationName(member, writer);

            if ((ConversionFlags & ConversionFlags.ShowParameterList) == ConversionFlags.ShowParameterList &&
                member is IParameterizedMember && member.EntityType != EntityType.Property)
            {
                writer.Write((node is IndexerDeclaration) ? '[' : '(');
                bool first = true;
                foreach (var param in node.GetChildrenByRole(AstNode.Roles.Parameter))
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        writer.Write(", ");
                    }
                    param.AcceptVisitor(CreatePrinter(writer), null);
                }
                writer.Write((node is IndexerDeclaration) ? ']' : ')');
            }
            if ((ConversionFlags & ConversionFlags.ShowBody) == ConversionFlags.ShowBody)
            {
                IProperty property = member as IProperty;
                if (property != null)
                {
                    writer.Write(" { ");
                    if (property.CanGet)
                    {
                        writer.Write("get; ");
                    }
                    if (property.CanSet)
                    {
                        writer.Write("set; ");
                    }
                    writer.Write('}');
                }
                else
                {
                    writer.Write(';');
                }
            }
        }
Esempio n. 23
0
        void WriteMemberDeclarationName(IMember member, StringWriter writer)
        {
            TypeSystemAstBuilder astBuilder = CreateAstBuilder();

            if ((ConversionFlags & ConversionFlags.UseFullyQualifiedMemberNames) == ConversionFlags.UseFullyQualifiedMemberNames)
            {
                writer.Write(ConvertType(member.DeclaringType));
                writer.Write('.');
            }
            switch (member.EntityType)
            {
            case EntityType.Indexer:
                writer.Write("this");
                break;

            case EntityType.Constructor:
                writer.Write(member.DeclaringType.Name);
                break;

            case EntityType.Destructor:
                writer.Write('~');
                writer.Write(member.DeclaringType.Name);
                break;

            case EntityType.Operator:
                switch (member.Name)
                {
                case "op_Implicit":
                    writer.Write("implicit operator ");
                    writer.Write(ConvertType(member.ReturnType));
                    break;

                case "op_Explicit":
                    writer.Write("explicit operator ");
                    writer.Write(ConvertType(member.ReturnType));
                    break;

                default:
                    writer.Write("operator ");
                    var operatorType = OperatorDeclaration.GetOperatorType(member.Name);
                    if (operatorType.HasValue)
                    {
                        writer.Write(OperatorDeclaration.GetToken(operatorType.Value));
                    }
                    else
                    {
                        writer.Write(member.Name);
                    }
                    break;
                }
                break;

            default:
                writer.Write(member.Name);
                break;
            }
            if ((ConversionFlags & ConversionFlags.ShowTypeParameterList) == ConversionFlags.ShowTypeParameterList && member.EntityType == EntityType.Method)
            {
                CreatePrinter(writer).WriteTypeParameters(astBuilder.ConvertEntity(member).GetChildrenByRole(AstNode.Roles.TypeParameter));
            }
        }
        public override void Complete(CompletionContext context)
        {
            if (declarationBegin > context.StartOffset)
            {
                base.Complete(context);
                return;
            }

            TypeSystemAstBuilder b = new TypeSystemAstBuilder(contextAtCaret);

            b.ShowTypeParameterConstraints = false;
            b.GenerateBody = true;

            var entityDeclaration = b.ConvertEntity(this.Entity);

            entityDeclaration.Modifiers &= ~(Modifiers.Virtual | Modifiers.Abstract);
            entityDeclaration.Modifiers |= Modifiers.Override;

            if (!this.Entity.IsAbstract)
            {
                // modify body to call the base method
                if (this.Entity.SymbolKind == SymbolKind.Method)
                {
                    var baseCall = new BaseReferenceExpression().Invoke(this.Entity.Name, ParametersToExpressions(this.Entity));
                    var body     = entityDeclaration.GetChildByRole(Roles.Body);
                    body.Statements.Clear();
                    if (((IMethod)this.Entity).ReturnType.IsKnownType(KnownTypeCode.Void))
                    {
                        body.Statements.Add(new ExpressionStatement(baseCall));
                    }
                    else
                    {
                        body.Statements.Add(new ReturnStatement(baseCall));
                    }
                }
                else if (this.Entity.SymbolKind == SymbolKind.Indexer || this.Entity.SymbolKind == SymbolKind.Property)
                {
                    Expression baseCall;
                    if (this.Entity.SymbolKind == SymbolKind.Indexer)
                    {
                        baseCall = new BaseReferenceExpression().Indexer(ParametersToExpressions(this.Entity));
                    }
                    else
                    {
                        baseCall = new BaseReferenceExpression().Member(this.Entity.Name);
                    }
                    var getterBody = entityDeclaration.GetChildByRole(PropertyDeclaration.GetterRole).Body;
                    if (!getterBody.IsNull)
                    {
                        getterBody.Statements.Clear();
                        getterBody.Add(new ReturnStatement(baseCall.Clone()));
                    }
                    var setterBody = entityDeclaration.GetChildByRole(PropertyDeclaration.SetterRole).Body;
                    if (!setterBody.IsNull)
                    {
                        setterBody.Statements.Clear();
                        setterBody.Add(new AssignmentExpression(baseCall.Clone(), new IdentifierExpression("value")));
                    }
                }
            }

            var          document          = context.Editor.Document;
            StringWriter w                 = new StringWriter();
            var          formattingOptions = FormattingOptionsFactory.CreateSharpDevelop();
            var          segmentDict       = SegmentTrackingOutputFormatter.WriteNode(w, entityDeclaration, formattingOptions, context.Editor.Options);

            using (document.OpenUndoGroup()) {
                string newText = w.ToString().TrimEnd();
                document.Replace(declarationBegin, context.EndOffset - declarationBegin, newText);
                var throwStatement = entityDeclaration.Descendants.FirstOrDefault(n => n is ThrowStatement);
                if (throwStatement != null)
                {
                    var segment = segmentDict[throwStatement];
                    context.Editor.Select(declarationBegin + segment.Offset, segment.Length);
                }
                CSharpFormatterHelper.Format(context.Editor, declarationBegin, newText.Length, formattingOptions);
            }
        }
Esempio n. 25
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));
                IEnumerable <AstNode> typeArgs = node.GetChildrenByRole(Roles.TypeParameter);
                if (member is IMethod)
                {
                    var typeArguments = ((IMethod)member).TypeArguments;
                    if (typeArguments.Any() && typeArguments.First().Name == "TSource")
                    {
                        typeArgs = typeArgs.Skip(1);
                    }
                }
                WriteTypeParameters(writer, typeArgs);
                break;
            }
        }