Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/CodingWithCalvin.MCPServer.Server/RpcClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public Task ShutdownAsync()
public Task<bool> SetSelectionAsync(string path, int startLine, int startColumn, int endLine, int endColumn)
=> Proxy.SetSelectionAsync(path, startLine, startColumn, endLine, endColumn);
public Task<bool> InsertTextAsync(string text) => Proxy.InsertTextAsync(text);
public Task<bool> ReplaceTextAsync(string oldText, string newText) => Proxy.ReplaceTextAsync(oldText, newText);
public Task<int> ReplaceTextAsync(string oldText, string newText) => Proxy.ReplaceTextAsync(oldText, newText);
public Task<bool> GoToLineAsync(int line) => Proxy.GoToLineAsync(line);
public Task<List<FindResult>> FindAsync(string searchText, bool matchCase, bool wholeWord)
=> Proxy.FindAsync(searchText, matchCase, wholeWord);
Expand Down
4 changes: 2 additions & 2 deletions src/CodingWithCalvin.MCPServer.Server/Tools/DocumentTools.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ public async Task<string> ReplaceTextAsync(
[Description("The exact text to find (case-sensitive).")] string oldText,
[Description("The replacement text. Use empty string to delete matches.")] string newText)
{
var success = await _rpcClient.ReplaceTextAsync(oldText, newText);
return success ? "Text replaced" : "Text not found or no active document";
var count = await _rpcClient.ReplaceTextAsync(oldText, newText);
return count > 0 ? $"Replaced {count} occurrence(s)" : "Text not found or no active document";
}

[McpServerTool(Name = "editor_goto_line", Destructive = false, Idempotent = true)]
Expand Down
2 changes: 1 addition & 1 deletion src/CodingWithCalvin.MCPServer.Shared/RpcContracts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public interface IVisualStudioRpc
Task<bool> SetSelectionAsync(string path, int startLine, int startColumn, int endLine, int endColumn);

Task<bool> InsertTextAsync(string text);
Task<bool> ReplaceTextAsync(string oldText, string newText);
Task<int> ReplaceTextAsync(string oldText, string newText);
Task<bool> GoToLineAsync(int line);
Task<List<FindResult>> FindAsync(string searchText, bool matchCase, bool wholeWord);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public interface IVisualStudioService
Task<bool> SetSelectionAsync(string path, int startLine, int startColumn, int endLine, int endColumn);

Task<bool> InsertTextAsync(string text);
Task<bool> ReplaceTextAsync(string oldText, string newText);
Task<int> ReplaceTextAsync(string oldText, string newText);
Task<bool> GoToLineAsync(int line);
Task<List<FindResult>> FindAsync(string searchText, bool matchCase = false, bool wholeWord = false);

Expand Down
2 changes: 1 addition & 1 deletion src/CodingWithCalvin.MCPServer/Services/RpcServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public async Task RequestShutdownAsync()
public Task<bool> SetSelectionAsync(string path, int startLine, int startColumn, int endLine, int endColumn)
=> _vsService.SetSelectionAsync(path, startLine, startColumn, endLine, endColumn);
public Task<bool> InsertTextAsync(string text) => _vsService.InsertTextAsync(text);
public Task<bool> ReplaceTextAsync(string oldText, string newText) => _vsService.ReplaceTextAsync(oldText, newText);
public Task<int> ReplaceTextAsync(string oldText, string newText) => _vsService.ReplaceTextAsync(oldText, newText);
public Task<bool> GoToLineAsync(int line) => _vsService.GoToLineAsync(line);
public Task<List<FindResult>> FindAsync(string searchText, bool matchCase, bool wholeWord)
=> _vsService.FindAsync(searchText, matchCase, wholeWord);
Expand Down
27 changes: 16 additions & 11 deletions src/CodingWithCalvin.MCPServer/Services/VisualStudioService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -371,35 +371,40 @@ public async Task<bool> InsertTextAsync(string text)
return true;
}

public async Task<bool> ReplaceTextAsync(string oldText, string newText)
public async Task<int> ReplaceTextAsync(string oldText, string newText)
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
var dte = await GetDteAsync();

var doc = dte.ActiveDocument;
if (doc == null)
{
return false;
return 0;
}

var textDoc = doc.Object("TextDocument") as TextDocument;
if (textDoc == null)
{
return false;
return 0;
}

var editPoint = textDoc.StartPoint.CreateEditPoint();
var content = editPoint.GetText(textDoc.EndPoint);
var newContent = content.Replace(oldText, newText);
var count = 0;
var searchPoint = textDoc.StartPoint.CreateEditPoint();
EditPoint matchEnd = null;

if (content != newContent)
while (searchPoint.FindPattern(oldText, (int)vsFindOptions.vsFindOptionsMatchCase, ref matchEnd))
{
editPoint.Delete(textDoc.EndPoint);
editPoint.Insert(newContent);
return true;
count++;
searchPoint = matchEnd;
}

return false;
if (count > 0)
{
TextRanges tags = null;
textDoc.ReplacePattern(oldText, newText, (int)vsFindOptions.vsFindOptionsMatchCase, ref tags);
}

return count;
}

public async Task<bool> GoToLineAsync(int line)
Expand Down
Loading