diff --git a/src/exchange.ts b/src/exchange.ts index 58dfed5..ae8e605 100644 --- a/src/exchange.ts +++ b/src/exchange.ts @@ -222,7 +222,7 @@ export interface SerializedProjectEvent { project: ProjectState; } export const serializeProjectEvent = (project: ProjectEvent): SerializedProjectEvent => { - return {path: project.getUri().path, project: Project.serialize(project)}; + return {path: project.getUri().toString(), project: Project.serialize(project)}; }; export const deserializeProjectEvent = ( value: SerializedProjectEvent, diff --git a/src/extension/tasks/toolprovider.ts b/src/extension/tasks/toolprovider.ts index 6f3de38..d2fd7f0 100644 --- a/src/extension/tasks/toolprovider.ts +++ b/src/extension/tasks/toolprovider.ts @@ -1,15 +1,15 @@ -import {type ProjectTarget, type WorkerStep} from 'edacation'; +import { type ProjectTarget, type WorkerStep } from 'edacation'; import path from 'path'; import * as vscode from 'vscode'; -import type {ExtensionMessage, MessageFile} from '../../common/messages.js'; +import type { ExtensionMessage, MessageFile } from '../../common/messages.js'; import * as node from '../../common/node-modules.js'; -import {UniversalWorker} from '../../common/universal-worker.js'; -import {type Project} from '../projects/index.js'; -import {type NativeToolExecutionOptions, ToolRepository} from '../tools'; +import { UniversalWorker } from '../../common/universal-worker.js'; +import { type Project } from '../projects/index.js'; +import { type NativeToolExecutionOptions, ToolRepository } from '../tools'; -import {type TaskOutputFile, TerminalMessageEmitter} from './messaging.js'; -import type {TaskIOFile} from './task.js'; +import { type TaskOutputFile, TerminalMessageEmitter } from './messaging.js'; +import type { TaskIOFile } from './task.js'; interface ToolInfoStatusOk { status: 'ok'; @@ -81,9 +81,17 @@ export class WebAssemblyToolProvider extends ToolProvider { await stepCallback('start', step); + let rawInputFiles: MessageFile[]; + try { + rawInputFiles = await this.readFiles(ctx.project, ctx.inputFiles); + } catch { + await stepCallback('end', step); + return; + } + // build input files const fileMap = new Map(); - for (const file of await this.readFiles(ctx.project, ctx.inputFiles)) { + for (const file of rawInputFiles) { // files from workspace fileMap.set(file.path, file); } @@ -141,14 +149,21 @@ export class WebAssemblyToolProvider extends ToolProvider { for (const file of inputFiles) { if (file.data) { files.push({path: file.path, data: file.data}); - } else { - const data = await vscode.workspace.fs.readFile(project.getFileUri(file.path)); + continue; + } - files.push({ - path: file.path, - data - }); + let data: Uint8Array; + try { + data = await vscode.workspace.fs.readFile(project.getFileUri(file.path)); + } catch { + this.error(`Failed to read input file: ${file.path}`); + continue; } + + files.push({ + path: file.path, + data + }); } return files; diff --git a/src/workers/tool.ts b/src/workers/tool.ts index 1820b18..46f35ea 100644 --- a/src/workers/tool.ts +++ b/src/workers/tool.ts @@ -108,7 +108,7 @@ export class WorkerTool { 'nextpnr-ecp5': '@yowasp/nextpnr-ecp5', 'nextpnr-ice40': '@yowasp/nextpnr-ice40', ecppack: '@yowasp/nextpnr-ecp5', - openFPGALoader: '@yowasp/openfpgaloader' + openFPGALoader: '@yowasp/openfpgaloader@1.0.0-16.156' }; constructor() {