eae5d8c807
These conflicts will be resolved in the following commits. We do it this way so that PR review is possible.
206 lines
5.0 KiB
TypeScript
206 lines
5.0 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import * as assert from 'assert';
|
|
import { WorkspaceEdit, TextDocument, getLanguageModes, ClientCapabilities } from '../modes/languageModes';
|
|
import { getNodeFSRequestService } from '../node/nodeFs';
|
|
|
|
|
|
async function testRename(value: string, newName: string, expectedDocContent: string): Promise<void> {
|
|
const offset = value.indexOf('|');
|
|
value = value.substr(0, offset) + value.substr(offset + 1);
|
|
|
|
const document = TextDocument.create('test://test/test.html', 'html', 0, value);
|
|
const workspace = {
|
|
settings: {},
|
|
folders: [{ name: 'foo', uri: 'test://foo' }]
|
|
};
|
|
const languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST, getNodeFSRequestService());
|
|
const javascriptMode = languageModes.getMode('javascript')
|
|
const position = document.positionAt(offset);
|
|
|
|
if (javascriptMode) {
|
|
const workspaceEdit: WorkspaceEdit | null = await javascriptMode.doRename!(document, position, newName);
|
|
|
|
if (!workspaceEdit || !workspaceEdit.changes) {
|
|
assert.fail('No workspace edits');
|
|
}
|
|
|
|
const edits = workspaceEdit.changes[document.uri.toString()];
|
|
if (!edits) {
|
|
assert.fail(`No edits for file at ${document.uri.toString()}`);
|
|
}
|
|
|
|
const newDocContent = TextDocument.applyEdits(document, edits);
|
|
assert.equal(newDocContent, expectedDocContent, `Expected: ${expectedDocContent}\nActual: ${newDocContent}`);
|
|
} else {
|
|
assert.fail('should have javascriptMode but no')
|
|
}
|
|
}
|
|
|
|
async function testNoRename(value: string, newName: string): Promise<void> {
|
|
const offset = value.indexOf('|');
|
|
value = value.substr(0, offset) + value.substr(offset + 1);
|
|
|
|
const document = TextDocument.create('test://test/test.html', 'html', 0, value);
|
|
const workspace = {
|
|
settings: {},
|
|
folders: [{ name: 'foo', uri: 'test://foo' }]
|
|
};
|
|
const languageModes = getLanguageModes({ css: true, javascript: true }, workspace, ClientCapabilities.LATEST, getNodeFSRequestService());
|
|
const javascriptMode = languageModes.getMode('javascript')
|
|
const position = document.positionAt(offset);
|
|
|
|
if (javascriptMode) {
|
|
const workspaceEdit: WorkspaceEdit | null = await javascriptMode.doRename!(document, position, newName);
|
|
|
|
assert.ok(workspaceEdit?.changes === undefined, 'Should not rename but rename happened')
|
|
} else {
|
|
assert.fail('should have javascriptMode but no')
|
|
}
|
|
}
|
|
|
|
suite('HTML Javascript Rename', () => {
|
|
test('Rename Variable', async () => {
|
|
const input = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
'const |a = 2;',
|
|
'const b = a + 2',
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
const output = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
'const h = 2;',
|
|
'const b = h + 2',
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
await testRename(input.join('\n'), 'h', output.join('\n'))
|
|
})
|
|
|
|
test('Rename Function', async () => {
|
|
const input = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`const name = 'cjg';`,
|
|
'function |sayHello(name) {',
|
|
`console.log('hello', name)`,
|
|
'}',
|
|
'sayHello(name)',
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
const output = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`const name = 'cjg';`,
|
|
'function sayName(name) {',
|
|
`console.log('hello', name)`,
|
|
'}',
|
|
'sayName(name)',
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
await testRename(input.join('\n'), 'sayName', output.join('\n'))
|
|
})
|
|
|
|
test('Rename Function Params', async () => {
|
|
const input = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`const name = 'cjg';`,
|
|
'function sayHello(|name) {',
|
|
`console.log('hello', name)`,
|
|
'}',
|
|
'sayHello(name)',
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
const output = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`const name = 'cjg';`,
|
|
'function sayHello(newName) {',
|
|
`console.log('hello', newName)`,
|
|
'}',
|
|
'sayHello(name)',
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
await testRename(input.join('\n'), 'newName', output.join('\n'))
|
|
})
|
|
|
|
test('Rename Class', async () => {
|
|
const input = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`class |Foo {}`,
|
|
`const foo = new Foo()`,
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
const output = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`class Bar {}`,
|
|
`const foo = new Bar()`,
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
await testRename(input.join('\n'), 'Bar', output.join('\n'))
|
|
})
|
|
|
|
test('Cannot Rename literal', async () => {
|
|
const stringLiteralInput = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`const name = |'cjg';`,
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
const numberLiteralInput = [
|
|
'<html>',
|
|
'<head>',
|
|
'<script>',
|
|
`const num = |2;`,
|
|
'</script>',
|
|
'</head>',
|
|
'</html>'
|
|
]
|
|
|
|
await testNoRename(stringLiteralInput.join('\n'), 'something')
|
|
await testNoRename(numberLiteralInput.join('\n'), 'hhhh')
|
|
})
|
|
});
|