ast: Rewrite analysis

Analysis now also flattens the dependedProcedures list
This commit is contained in:
Thomas Weber committed 2020-08-22 14:03:40 -05:00
1 parent f422b68ec9
commit b07c8c5609
1 file changed
+22 -21
+22 -21
View File
@@ -14,7 +14,7 @@ const compatBlocks = require('./compat-blocks');
* @property {boolean} hasArguments
* @property {boolean} isWarp
* @property {boolean} yields
* @property {Array<string>} dependedProcedures The list of procedure codes that this tree directly depends on. These procedures may have additional dependencies, and so on.
* @property {Array<string>} dependedProcedures The full list of procedure codes that this tree directly depends on.
* @property {*} cachedCompileResult
*/
@@ -1310,7 +1310,7 @@ class ASTGenerator {
/** @type {Object.<string, Tree>} */
this.procedures = {};
this.procedureAnalysisStack = [];
this.procedureStack = [];
}
addProcedureDependencies (dependencies) {
@@ -1340,31 +1340,31 @@ class ASTGenerator {
return result;
}
analyzeProcedures () {
for (const procedureCode of Object.keys(this.procedures)) {
const procedureData = this.procedures[procedureCode];
if (procedureData.yields) {
/**
* Recursively analyze a script tree and its dependencies.
* @param {Tree} tree Root script tree.
*/
analyzeScript (tree) {
for (const procedureCode of tree.dependedProcedures) {
if (this.procedureStack.includes(procedureCode)) {
continue;
}
this.procedureStack.push(procedureCode);
const visited = [];
const procedureData = this.procedures[procedureCode];
this.analyzeScript(procedureData);
for (const dependedProcedureCode of procedureData.dependedProcedures) {
if (visited.includes(dependedProcedureCode)) {
continue;
}
// TODO: also have to check dependencies of dependencies
const dependedProcedureData = this.procedures[dependedProcedureCode];
visited.push(dependedProcedureCode);
if (dependedProcedureData.yields) {
procedureData.yields = true;
break;
if (!tree.dependedProcedures.includes(dependedProcedureCode)) {
tree.dependedProcedures.push(dependedProcedureCode);
}
}
if (procedureData.yields) {
tree.yields = true;
}
this.procedureStack.pop();
}
}
@@ -1412,7 +1412,8 @@ class ASTGenerator {
}
}
this.analyzeProcedures();
// This will recursively analyze procedures as well.
this.analyzeScript(entry);
return {
entry: entry,