diff --git a/src/commands/compile.ts b/src/commands/compile.ts index 1c421af4..4dd7ecc8 100644 --- a/src/commands/compile.ts +++ b/src/commands/compile.ts @@ -19,7 +19,6 @@ import { cspAppsForUri, CurrentBinaryFile, currentFile, - CurrentFile, currentFileFromContent, CurrentTextFile, exportedUris, @@ -231,7 +230,16 @@ export async function loadChanges(files: (CurrentTextFile | CurrentBinaryFile)[] const content = await api.getDoc(file.name, file.uri).then((data) => data.result.content); exportedUris.add(file.uri.toString()); // Set optimistically await vscode.workspace.fs - .writeFile(file.uri, Buffer.isBuffer(content) ? content : new TextEncoder().encode(content.join("\n"))) + .writeFile( + file.uri, + Buffer.isBuffer(content) + ? content + : new TextEncoder().encode( + content.join( + ((file)?.eol ?? vscode.EndOfLine.LF) == vscode.EndOfLine.CRLF ? "\r\n" : "\n" + ) + ) + ) .then(undefined, (e) => { // Save failed, so remove this URI from the set exportedUris.delete(file.uri.toString()); @@ -251,12 +259,15 @@ export async function loadChanges(files: (CurrentTextFile | CurrentBinaryFile)[] ); } -export async function compile(docs: CurrentFile[], flags?: string): Promise { +export async function compile(docs: (CurrentTextFile | CurrentBinaryFile)[], flags?: string): Promise { const wsFolder = vscode.workspace.getWorkspaceFolder(docs[0].uri); const conf = vscode.workspace.getConfiguration("objectscript", wsFolder || docs[0].uri); flags = flags || conf.get("compileFlags"); const api = new AtelierAPI(docs[0].uri); const docNames = docs.map((d) => d.name); + // Determine the line ending to use for other documents affected + // by compilation so we don't need to read their contents + const eol = (docs.find((d) => (d)?.eol))?.eol ?? vscode.EndOfLine.LF; return vscode.window .withProgress( { @@ -284,9 +295,11 @@ export async function compile(docs: CurrentFile[], flags?: string): Promise name: f.name, uri: u, uniqueId: `${wsFolder.name}:${f.name}`, - // These two keys aren't used by loadChanges() + eol, + // These three keys aren't used by loadChanges() workspaceFolder: wsFolder.name, fileName: u.fsPath, + content: "", }); }); }); @@ -416,7 +429,7 @@ export async function namespaceCompile(askFlags = false): Promise { } async function importFiles(files: vscode.Uri[], noCompile = false) { - const toCompile: CurrentFile[] = []; + const toCompile: (CurrentTextFile | CurrentBinaryFile)[] = []; const rateLimiter = new RateLimiter(50); await Promise.allSettled( files.map((uri) => diff --git a/src/extension.ts b/src/extension.ts index 8adac4d3..17fc4171 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1297,7 +1297,7 @@ export async function activate(context: vscode.ExtensionContext): Promise { wsEdit.replace( uri, new vscode.Range(0, 0, newContent.content.length + 1, 0), - newContent.content.join("\n"), + newContent.content.join(newContent.eol == vscode.EndOfLine.CRLF ? "\r\n" : "\n"), { label: "ObjectScript autoAdjustName", needsConfirmation: false, diff --git a/src/providers/FileSystemProvider/FileSystemProvider.ts b/src/providers/FileSystemProvider/FileSystemProvider.ts index 24be83ca..c263610f 100644 --- a/src/providers/FileSystemProvider/FileSystemProvider.ts +++ b/src/providers/FileSystemProvider/FileSystemProvider.ts @@ -68,8 +68,9 @@ export function generateFileContent( uri: vscode.Uri, fileName: string, sourceContent: Uint8Array -): { content: string[]; enc: boolean } { +): { content: string[]; enc: boolean; eol: vscode.EndOfLine } { const sourceLines = sourceContent.length ? new TextDecoder().decode(sourceContent).split("\n") : []; + const eol = sourceLines.length && sourceLines[0].slice(-1) == "\r" ? vscode.EndOfLine.CRLF : vscode.EndOfLine.LF; const fileExt = fileName.split(".").pop().toLowerCase(); const csp = fileName.startsWith("/"); if (fileExt === "cls" && !csp) { @@ -108,6 +109,7 @@ export function generateFileContent( return { content, enc: false, + eol, }; } else if (["int", "inc", "mac"].includes(fileExt) && !csp) { if (sourceLines.length && notIsfs(uri) && (fileName.includes(path.sep) || fileName.includes(" "))) { @@ -116,6 +118,7 @@ export function generateFileContent( return { content: sourceLines, enc: false, + eol, }; } else { sourceLines.shift(); @@ -137,12 +140,14 @@ export function generateFileContent( return { content: [`ROUTINE ${routineName} ${routineType}`, ...sourceLines], enc: false, + eol, }; } } return { content: base64EncodeContent(Buffer.from(sourceContent)), enc: true, + eol, }; }