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
This commit is contained in:
David Lechner
2022-10-25 11:50:06 -05:00
parent d07cbf6d93
commit ed8394bf84
2 changed files with 29 additions and 12 deletions
+5
View File
@@ -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
+24 -12
View File
@@ -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<string> {
const modules = new Set<string>();
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;
}