Skip to content

Commit

Permalink
fix(language-server): cannot restore uri from untitled document fileN…
Browse files Browse the repository at this point in the history
…ame (#135)
  • Loading branch information
johnsoncodehk committed Feb 16, 2024
1 parent e273f09 commit 552b907
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 30 deletions.
26 changes: 1 addition & 25 deletions packages/language-server/browser.ts
@@ -1,8 +1,8 @@
import { FileType } from '@volar/language-service';
import * as vscode from 'vscode-languageserver/browser';
import { URI } from 'vscode-uri';
import httpSchemaRequestHandler from './lib/schemaRequestHandlers/http';
import { createServerBase } from './lib/server';
import { fileNameToUri, uriToFileName } from './lib/uri';
import { FsReadDirectoryRequest, FsReadFileRequest, FsStatRequest } from './protocol';

export * from 'vscode-languageserver/browser';
Expand Down Expand Up @@ -99,27 +99,3 @@ export function createServer(connection: vscode.Connection) {
},
}));
}

function uriToFileName(uri: string) {
const parsed = URI.parse(uri);
if (parsed.scheme === '__invalid__') {
return parsed.path;
}
return `/${parsed.scheme}${parsed.authority ? '@' + parsed.authority : ''}${parsed.path}`;
}

function fileNameToUri(fileName: string) {
const parts = fileName.split('/');
if (parts.length <= 1) {
return URI.from({
scheme: '__invalid__',
path: fileName,
}).toString();
}
const firstParts = parts[1].split('@');
return URI.from({
scheme: firstParts[0],
authority: firstParts.length > 1 ? firstParts[1] : undefined,
path: '/' + parts.slice(2).join('/'),
}).toString();
}
21 changes: 21 additions & 0 deletions packages/language-server/lib/uri.ts
@@ -0,0 +1,21 @@
import { URI } from 'vscode-uri';

export function uriToFileName(uri: string) {
const parsed = URI.parse(uri);
if (parsed.scheme === 'file') {
return parsed.fsPath.replace(/\\/g, '/');
}
return `${parsed.scheme}@@${parsed.authority}@@${parsed.path}`;
}

export function fileNameToUri(fileName: string) {
if (fileName.includes('@@')) {
const parts = fileName.split('@@');
return URI.from({
scheme: parts[0],
authority: parts[1],
path: parts[2],
}).toString();
}
return URI.file(fileName).toString();
}
6 changes: 1 addition & 5 deletions packages/language-server/node.ts
@@ -1,20 +1,16 @@
import { FileSystem, FileType } from '@volar/language-service';
import * as fs from 'fs';
import * as vscode from 'vscode-languageserver/node';
import { URI } from 'vscode-uri';
import httpSchemaRequestHandler from './lib/schemaRequestHandlers/http';
import { createServerBase } from './lib/server';
import type { InitializationOptions } from './lib/types';
import { fileNameToUri, uriToFileName } from './lib/uri';

export * from 'vscode-languageserver/node';
export * from './index';
export * from './lib/project/simpleProjectProvider';
export * from './lib/project/typescriptProjectProvider';

export const uriToFileName = (uri: string) => URI.parse(uri).fsPath.replace(/\\/g, '/');

export const fileNameToUri = (fileName: string) => URI.file(fileName).toString();

export function createFs(options: InitializationOptions): FileSystem {
return {
stat(uri) {
Expand Down
21 changes: 21 additions & 0 deletions packages/language-server/tests/uri.spec.ts
@@ -0,0 +1,21 @@
import { describe, expect, test } from 'vitest';
import { URI } from 'vscode-uri';
import { fileNameToUri, uriToFileName } from '../lib/uri';

describe('URI', () => {

test('recoverable', () => {

const cases = [
'file:///a/b/c',
'test://test/test.html',
'file:///c:/a/b/c',
'file:///C:/a/b/c',
'untitled:Untitled-1',
];

for (const uri of cases) {
expect(fileNameToUri(uriToFileName(uri))).toBe(URI.parse(uri).toString());
}
});
});

0 comments on commit 552b907

Please sign in to comment.