From ed8394bf844ef1391e1784ccc771d8eee46337e4 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Tue, 25 Oct 2022 11:47:54 -0500 Subject: [PATCH] pybricksMicropython/lib: handle exceptions when parsing The new code parsing library raises exceptions when there are syntax errors, so this needs to be handled. Fixes: https://github.com/pybricks/support/issues/755 --- CHANGELOG.md | 5 +++++ src/pybricksMicropython/lib.ts | 36 ++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 12 deletions(-) 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; }