Browse Source

DocumentScript bugfixes.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
bcad2e12f7
  1. 2
      ICSharpCode.NRefactory.CSharp/Analysis/ControlFlow.cs
  2. 1
      ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/SplitDeclarationAndAssignment.cs
  3. 50
      ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs
  4. 72
      ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs
  5. 17
      ICSharpCode.NRefactory/Editor/ISegment.cs
  6. 10
      ICSharpCode.NRefactory/Editor/TextSourceVersionProvider.cs
  7. 2
      ICSharpCode.NRefactory/Utils/EmptyList.cs

2
ICSharpCode.NRefactory.CSharp/Analysis/ControlFlow.cs

@ -113,7 +113,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis @@ -113,7 +113,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis
/// Gets the try-finally statements that this control flow edge is leaving.
/// </summary>
public IEnumerable<TryCatchStatement> TryFinallyStatements {
get { return jumpOutOfTryFinally ?? EmptyList<TryCatchStatement>.Instance; }
get { return jumpOutOfTryFinally ?? Enumerable.Empty<TryCatchStatement>(); }
}
}

1
ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/SplitDeclarationAndAssignment.cs

@ -46,6 +46,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -46,6 +46,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
var assign = new AssignmentExpression (new IdentifierExpression (varDecl.Variables.First ().Name), AssignmentOperatorType.Assign, varDecl.Variables.First ().Initializer.Clone ());
var newVarDecl = (VariableDeclarationStatement)varDecl.Clone ();
newVarDecl.Role = BlockStatement.StatementRole;
if (newVarDecl.Type.IsMatch (new SimpleType ("var")))
newVarDecl.Type = type;

50
ICSharpCode.NRefactory.CSharp/Refactoring/DocumentScript.cs

@ -28,7 +28,15 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -28,7 +28,15 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
public class DocumentScript : Script
{
readonly IDocument currentDocument;
public IDocument CurrentDocument {
get { return currentDocument; }
}
readonly IDocument originalDocument;
public IDocument OriginalDocument {
get { return originalDocument; }
}
readonly IDisposable undoGroup;
public DocumentScript(IDocument document, CSharpFormattingOptions formattingOptions) : base(formattingOptions)
@ -46,19 +54,33 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -46,19 +54,33 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
base.Dispose();
}
public override void Replace(int offset, int length, string newText)
{
currentDocument.Replace(offset, length, newText);
}
public override string GetText(int offset, int length)
public override void Remove(AstNode node, bool removeEmptyLine)
{
return currentDocument.GetText(offset, length);
var segment = GetSegment (node);
int startOffset = segment.Offset;
int endOffset = segment.EndOffset;
var startLine = currentDocument.GetLineByOffset (startOffset);
var endLine = currentDocument.GetLineByOffset (endOffset);
if (startLine != null && endLine != null) {
bool removeStart = string.IsNullOrWhiteSpace (currentDocument.GetText (startLine.Offset, startOffset - startLine.Offset));
if (removeStart)
startOffset = startLine.Offset;
bool removeEnd = string.IsNullOrWhiteSpace (currentDocument.GetText (endOffset, endLine.EndOffset - endOffset));
if (removeEnd)
endOffset = endLine.EndOffset;
// Remove delimiter if the whole line get's removed.
if (removeStart && removeEnd)
endOffset += endLine.DelimiterLength;
}
Replace (startOffset, endOffset - startOffset, string.Empty);
}
public override IDocumentLine GetLineByOffset(int offset)
public override void Replace(int offset, int length, string newText)
{
return currentDocument.GetLineByOffset(offset);
currentDocument.Replace(offset, length, newText);
}
public override int GetCurrentOffset(TextLocation originalDocumentLocation)
@ -72,21 +94,21 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -72,21 +94,21 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return originalDocument.Version.MoveOffsetTo(currentDocument.Version, originalDocumentOffset, AnchorMovementType.Default);
}
public override void FormatText(int offset, int length)
public override void FormatText(AstNode node)
{
var segment = GetSegment(node);
var cu = CompilationUnit.Parse(currentDocument, "dummy.cs");
var formatter = new AstFormattingVisitor(this.FormattingOptions, currentDocument);
cu.AcceptVisitor(formatter);
formatter.ApplyChanges(offset, length);
formatter.ApplyChanges(segment.Offset, segment.Length);
}
protected override int GetIndentLevelAt(int offset)
{
int oldOffset = currentDocument.Version.MoveOffsetTo(originalDocument.Version, offset, AnchorMovementType.Default);
var line = currentDocument.GetLineByOffset(oldOffset);
var line = currentDocument.GetLineByOffset(offset);
int spaces = 0;
int indentationLevel = 0;
for (int i = line.Offset; i < offset; i++) {
for (int i = line.Offset; i < currentDocument.TextLength; i++) {
char c = currentDocument.GetCharAt(i);
if (c == '\t') {
spaces = 0;

72
ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs

@ -131,12 +131,6 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -131,12 +131,6 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
get { return formattingOptions; }
}
public void Remove (AstNode node)
{
var segment = GetSegment(node);
Replace(segment.Offset, segment.Length, string.Empty);
}
public void InsertBefore (AstNode node, AstNode insertNode)
{
var startOffset = GetCurrentOffset (new TextLocation(node.StartLocation.Line, 1));
@ -175,73 +169,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -175,73 +169,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
output.RegisterTrackedSegments(this, startOffset);
}
/// <summary>
/// Gets a document line by it's current offset.
/// </summary>
public abstract IDocumentLine GetLineByOffset (int offset);
public abstract void Remove (AstNode node, bool removeEmptyLine = true);
/// <summary>
/// Gets text from the current document.
/// </summary>
public abstract string GetText(int offset, int length);
public void Remove (AstNode node, bool removeEmptyLine = true)
{
var segment = GetSegment (node);
int startOffset = segment.Offset;
int endOffset = segment.EndOffset;
var startLine = GetLineByOffset (startOffset);
var endLine = GetLineByOffset (endOffset);
if (startLine != null && endLine != null) {
bool removeStart = string.IsNullOrWhiteSpace (GetText (startLine.Offset, startOffset - startLine.Offset));
if (removeStart)
startOffset = startLine.Offset;
bool removeEnd = string.IsNullOrWhiteSpace (GetText (endOffset, endLine.EndOffset - endOffset));
if (removeEnd)
endOffset = endLine.EndOffset;
// Remove delimiter if the whole line get's removed.
if (removeStart && removeEnd)
endOffset += endLine.DelimiterLength;
}
Replace (startOffset, endOffset - startOffset, string.Empty);
}
/// <summary>
/// Format the specified node and surrounding whitespace.
/// </summary>
public virtual void FormatTextAround (AstNode node)
{
int startOffset;
if (node.PrevSibling != null)
startOffset = GetSegment(node.PrevSibling).EndOffset;
else
startOffset = GetSegment(node).Offset;
int endOffset;
if (node.NextSibling != null)
endOffset = GetSegment(node.NextSibling).Offset;
else
endOffset = GetSegment(node).EndOffset;
FormatText(startOffset, endOffset - startOffset);
}
public virtual void FormatText (AstNode node)
{
var segment = GetSegment(node);
Select(segment.Offset, segment.Length);
}
public abstract void FormatText (int offset, int length);
public abstract void FormatText (AstNode node);
public virtual void Select (AstNode node)
{
var segment = GetSegment(node);
Select(segment.Offset, segment.Length);
}
public virtual void Select (int offset, int length)
{
// default implementation: do nothing
// Derived classes are supposed to set the text editor's selection

17
ICSharpCode.NRefactory/Editor/ISegment.cs

@ -49,22 +49,23 @@ namespace ICSharpCode.NRefactory.Editor @@ -49,22 +49,23 @@ namespace ICSharpCode.NRefactory.Editor
public static class ISegmentExtensions
{
/// <summary>
/// Gets whether the segment contains the offset.
/// Gets whether <paramref name="segment"/> fully contains the specified segment.
/// </summary>
/// <returns>
/// True, if offset is between segment.Start and segment.End (inclusive); otherwise, false.
/// </returns>
public static bool Contains (this ISegment segment, int offset)
/// <remarks>
/// Use <c>segment.Contains(offset, 0)</c> to detect whether a segment (end inclusive) contains offset;
/// use <c>segment.Contains(offset, 1)</c> to detect whether a segment (end exclusive) contains offset.
/// </remarks>
public static bool Contains (this ISegment segment, int offset, int length)
{
return segment.Offset <= offset && offset <= segment.EndOffset;
return segment.Offset <= offset && offset + length <= segment.EndOffset;
}
/// <summary>
/// True, if the segment contains the specified segment, false otherwise.
/// Gets whether <paramref name="thisSegment"/> fully contains the specified segment.
/// </summary>
public static bool Contains (this ISegment thisSegment, ISegment segment)
{
return segment != null && thisSegment.Offset <= segment.Offset && segment.EndOffset <= thisSegment.EndOffset;
return segment != null && thisSegment.Offset <= segment.Offset && segment.EndOffset <= thisSegment.EndOffset;
}
}
}

10
ICSharpCode.NRefactory/Editor/TextSourceVersionProvider.cs

@ -34,10 +34,17 @@ namespace ICSharpCode.NRefactory.Editor @@ -34,10 +34,17 @@ namespace ICSharpCode.NRefactory.Editor
this.currentVersion = new Version(this);
}
/// <summary>
/// Gets the current version.
/// </summary>
public ITextSourceVersion CurrentVersion {
get { return currentVersion; }
}
/// <summary>
/// Replaces the current version with a new version.
/// </summary>
/// <param name="change">Change from current version to new version</param>
public void AppendChange(TextChangeEventArgs change)
{
if (change == null)
@ -52,9 +59,10 @@ namespace ICSharpCode.NRefactory.Editor @@ -52,9 +59,10 @@ namespace ICSharpCode.NRefactory.Editor
// Reference back to the provider.
// Used to determine if two checkpoints belong to the same document.
readonly TextSourceVersionProvider provider;
// ID used for CompareAge()
readonly int id;
// the change this version to the next version
// the change from this version to the next version
internal TextChangeEventArgs change;
internal Version next;

2
ICSharpCode.NRefactory/Utils/EmptyList.cs

@ -26,7 +26,7 @@ namespace ICSharpCode.NRefactory @@ -26,7 +26,7 @@ namespace ICSharpCode.NRefactory
[Serializable]
public sealed class EmptyList<T> : IList<T>, IEnumerator<T>
{
public static readonly IList<T> Instance = new EmptyList<T>();
public static readonly EmptyList<T> Instance = new EmptyList<T>();
private EmptyList() {}

Loading…
Cancel
Save