protected NodeOutput OutputNode(int indentLevel, AstNode node, bool startWithNewLine = false) { var stringWriter = new StringWriter(); var formatter = new SegmentTrackingOutputFormatter(stringWriter); formatter.Indentation = indentLevel; formatter.IndentationString = Options.TabsToSpaces ? new string (' ', Options.IndentSize) : "\t"; stringWriter.NewLine = Options.EolMarker; if (startWithNewLine) { formatter.NewLine(); } var visitor = new CSharpOutputVisitor(formatter, formattingOptions); node.AcceptVisitor(visitor); string text = stringWriter.ToString().TrimEnd(); return(new NodeOutput(text, formatter.NewSegments)); }
protected NodeOutput OutputNode(int indentLevel, AstNode node, bool startWithNewLine = false) { var stringWriter = new StringWriter(); var formatter = new SegmentTrackingOutputFormatter(stringWriter); formatter.Indentation = indentLevel; stringWriter.NewLine = eolMarker; if (startWithNewLine) { formatter.NewLine(); } var visitor = new CSharpOutputVisitor(formatter, formattingOptions); node.AcceptVisitor(visitor); string text = stringWriter.ToString().TrimEnd(); if (node is FieldDeclaration) { text += eolMarker; } return(new NodeOutput(text, formatter.NewSegments)); }
protected NodeOutput OutputNode(int indentLevel, AstNode node, bool startWithNewLine = false) { var result = new NodeOutput(); var stringWriter = new StringWriter(); var formatter = new SegmentTrackingOutputFormatter(result, stringWriter); formatter.Indentation = indentLevel; stringWriter.NewLine = Context.EolMarker; if (startWithNewLine) { formatter.NewLine(); } var visitor = new CppOutputVisitor(formatter, Context.FormattingOptions); node.AcceptVisitor(visitor, null); result.Text = stringWriter.ToString().TrimEnd(); if (node is FieldDeclaration) { result.Text += Context.EolMarker; } return(result); }
protected NodeOutput OutputNode(int indentLevel, AstNode node, bool startWithNewLine = false) { var stringWriter = new StringWriter (); var formatter = new SegmentTrackingOutputFormatter (stringWriter); formatter.Indentation = indentLevel; formatter.IndentationString = Options.TabsToSpaces ? new string (' ', Options.IndentSize) : "\t"; stringWriter.NewLine = Options.EolMarker; if (startWithNewLine) formatter.NewLine (); var visitor = new CSharpOutputVisitor (formatter, formattingOptions); node.AcceptVisitor (visitor); string text = stringWriter.ToString().TrimEnd(); return new NodeOutput(text, formatter.NewSegments); }
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(); }
protected NodeOutput OutputNode (int indentLevel, AstNode node, bool startWithNewLine = false) { var result = new NodeOutput (); var stringWriter = new StringWriter (); var formatter = new SegmentTrackingOutputFormatter (result, stringWriter); formatter.Indentation = indentLevel; stringWriter.NewLine = Context.EolMarker; if (startWithNewLine) formatter.NewLine (); var visitor = new CSharpOutputVisitor (formatter, Context.FormattingOptions); node.AcceptVisitor (visitor, null); result.Text = stringWriter.ToString ().TrimEnd (); if (node is FieldDeclaration) result.Text += Context.EolMarker; return result; }
protected NodeOutput OutputNode(int indentLevel, AstNode node, bool startWithNewLine = false) { var stringWriter = new StringWriter (); var formatter = new SegmentTrackingOutputFormatter (stringWriter); formatter.Indentation = indentLevel; stringWriter.NewLine = eolMarker; if (startWithNewLine) formatter.NewLine (); var visitor = new CSharpOutputVisitor (formatter, formattingOptions); node.AcceptVisitor (visitor); string text = stringWriter.ToString().TrimEnd(); if (node is FieldDeclaration) text += eolMarker; return new NodeOutput(text, formatter.NewSegments); }