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