diff --git a/CHANGELOG.md b/CHANGELOG.md index 470d5749..00c02193 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ ## [Unreleased] +### Fixed +- Fixed crash when user program contains syntax error ([support#755]). + +[support#755]: https://github.com/pybricks/support/issues/755 + ## [2.0.0-beta.7] - 2022-10-24 ### Fixed diff --git a/src/pybricksMicropython/lib.ts b/src/pybricksMicropython/lib.ts index 585b37b9..6b8bf635 100644 --- a/src/pybricksMicropython/lib.ts +++ b/src/pybricksMicropython/lib.ts @@ -74,25 +74,37 @@ export function validateFileName( /** * Finds modules imported by a Python script. * + * Returns an empty list if there are syntax errors. + * * @param py A Python Script. * @returns A list of the names of modules imported by this file. */ export function findImportedModules(py: string): ReadonlySet { const modules = new Set(); - const tree = parse(py); - // find all import statements in the syntax tree and collect imported modules - walk(tree, { - onEnterNode(node, _ancestors) { - if (node.type === 'import') { - for (const name of node.names) { - modules.add(name.path); + try { + const tree = parse(py); + + // find all import statements in the syntax tree and collect imported modules + walk(tree, { + onEnterNode(node, _ancestors) { + if (node.type === 'import') { + for (const name of node.names) { + modules.add(name.path); + } + } else if (node.type === 'from') { + modules.add(node.base); } - } else if (node.type === 'from') { - modules.add(node.base); - } - }, - }); + }, + }); + } catch (err) { + // istanbul ignore if + if (process.env.NODE_ENV === 'development') { + console.debug(err); + } + + // files with syntax errors are ignored + } return modules; }