Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: try to resolve failed mapping edit range
close #2155
- Loading branch information
1 parent
47dcaae
commit 710a6a3
Showing
9 changed files
with
166 additions
and
102 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,19 @@ | ||
import type * as vscode from 'vscode-languageserver-types'; | ||
import { transform as transformLocations } from './locationsLike'; | ||
import * as vscode from 'vscode-languageserver-types'; | ||
import { transform as transformTextEdit } from './textEdit'; | ||
import * as shared from '@volar/shared'; | ||
|
||
export function transform<T extends vscode.CompletionItem>(item: T, getOtherRange: (range: vscode.Range) => vscode.Range | undefined): T { | ||
export function transform<T extends vscode.CompletionItem>( | ||
item: T, | ||
getOtherRange: (range: vscode.Range) => vscode.Range | undefined, | ||
document: vscode.TextDocument, | ||
): T { | ||
return { | ||
...item, | ||
additionalTextEdits: item.additionalTextEdits | ||
? transformLocations(item.additionalTextEdits, getOtherRange) | ||
: undefined, | ||
?.map(edit => transformTextEdit(edit, getOtherRange, document)) | ||
.filter(shared.notEmpty), | ||
textEdit: item.textEdit | ||
? transformTextEdit(item.textEdit, getOtherRange) | ||
? transformTextEdit(item.textEdit, getOtherRange, document) | ||
: undefined, | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,84 @@ | ||
import * as vscode from 'vscode-languageserver-types'; | ||
|
||
export function transform<T extends vscode.TextEdit | vscode.InsertReplaceEdit>(textEdit: T, getOtherRange: (range: vscode.Range) => vscode.Range | undefined): T | undefined { | ||
export function transform<T extends vscode.TextEdit | vscode.InsertReplaceEdit>( | ||
textEdit: T, | ||
getOtherRange: (range: vscode.Range) => vscode.Range | undefined, | ||
document: vscode.TextDocument, | ||
): T | undefined { | ||
if (vscode.TextEdit.is(textEdit)) { | ||
|
||
const range = getOtherRange(textEdit.range); | ||
if (!range) return; | ||
|
||
return { | ||
...textEdit, | ||
range, | ||
let range = getOtherRange(textEdit.range); | ||
if (range) { | ||
return { | ||
...textEdit, | ||
range, | ||
}; | ||
}; | ||
|
||
const cover = tryRecover(getOtherRange, textEdit.range, textEdit.newText, document); | ||
if (cover) { | ||
return { | ||
...textEdit, | ||
range: cover.range, | ||
newText: cover.newText, | ||
}; | ||
} | ||
} | ||
else if (vscode.InsertReplaceEdit.is(textEdit)) { | ||
|
||
const insert = getOtherRange(textEdit.insert); | ||
if (!insert) return; | ||
const replace = insert ? getOtherRange(textEdit.replace) : undefined; | ||
if (insert && replace) { | ||
return { | ||
...textEdit, | ||
insert, | ||
replace, | ||
}; | ||
} | ||
|
||
const replace = getOtherRange(textEdit.replace); | ||
if (!replace) return; | ||
const recoverInsert = tryRecover(getOtherRange, textEdit.insert, textEdit.newText, document); | ||
const recoverReplace = recoverInsert ? tryRecover(getOtherRange, textEdit.replace, textEdit.newText, document) : undefined; | ||
if (recoverInsert && recoverReplace && recoverInsert.newText === recoverReplace.newText) { | ||
return { | ||
...textEdit, | ||
insert: recoverInsert.range, | ||
replace: recoverReplace.range, | ||
newText: recoverInsert.newText, | ||
}; | ||
} | ||
} | ||
} | ||
|
||
return { | ||
...textEdit, | ||
insert, | ||
replace, | ||
}; | ||
/** | ||
* update edit text from ". foo" to " foo" | ||
* fix https://github.com/johnsoncodehk/volar/issues/2155 | ||
*/ | ||
function tryRecover( | ||
getOtherRange: (range: vscode.Range) => vscode.Range | undefined, | ||
replaceRange: vscode.Range, | ||
newText: string, | ||
document: vscode.TextDocument, | ||
): vscode.TextEdit | undefined { | ||
if (replaceRange.start.line === replaceRange.end.line && replaceRange.end.character > replaceRange.start.character) { | ||
|
||
let character = replaceRange.start.character; | ||
|
||
while (newText.length && replaceRange.end.character > character) { | ||
const newStart = { line: replaceRange.start.line, character: replaceRange.start.character + 1 }; | ||
if (document.getText({ start: replaceRange.start, end: newStart }) === newText[0]) { | ||
newText = newText.slice(1); | ||
character++; | ||
const otherRange = getOtherRange({ start: newStart, end: replaceRange.end }); | ||
if (otherRange) { | ||
return { | ||
newText, | ||
range: otherRange, | ||
}; | ||
} | ||
} | ||
else { | ||
break; | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.