{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stephelm/src/client/dependency-graph/graph.js"],"names":["babelDefault","range","types","t","babel","DependencyGraph","inner","_inner","constructor","code","toAST","memberAssignments","Map","enrich","self","traverseAsAST","enter","path","node","extra","visited","returnVisited","Scope","Object","entries","scope","bindings","forEach","_name","binding","referencePaths","extractMemberAssignments","enrichFunctionNodes","Expression","expr","collectExpressionInformation","MemberExpression","computed","parentPath","isAssignmentExpression","assignment","assignedValue","obj","get","objKey","property","name","entry","newMap","set","objEntry","push","leakingBindings","callExpressions","objects","returns","traverse","objExpr","Set","add","ReturnStatement","ret","has","CallExpression","call","results","resolvedObjects","isObjectExpression","objectExpression","isIdentifier","constantViolations","item","isVariableDeclarator","val","isFunction","isConditionalExpression","isCallExpression","callee","resolvedCallees","func","body","isBlockStatement","returnStatement","flat","isMemberExpression","tmp","result","assignmentsOf","shadowedBindings","propertyEntry","memberDependencies","find","isObjectProperty","isObjectMethod","isFunctionDeclaration","id","isPattern","resolveDependencies","location","dep","dependencyGraph","isAExpr","loc","contains","dependencies","console","log","_resolveDependencies","map","callExpression","value","isArrowFunctionExpression","size","members","member","AEXPR_IDENTIFIER_NAME","ReferencedIdentifier","outerBinding","getBinding","actualBinding","hasBinding"],"mappings":"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","file":"graph.js","sourcesContent":["import babelDefault from 'systemjs-babel-build';\n\nimport { range } from 'utils';\nconst { types: t } = babelDefault.babel;\n\nexport class DependencyGraph {\n  \n\tget inner() { return this._inner }\n\n\tconstructor(code) {\n\t\tthis._inner = code.toAST();\n\n\t\t//Stores globally a `map` of properties (`String`) to objectbindings of the objects, that have a property of that name. \n\t\tthis.memberAssignments = new Map();\n\t\tthis.enrich();\n\t}\n\n\tenrich() {\n\t\tlet self = this;\n\t\tthis._inner.traverseAsAST({\n\t\t\tenter(path) {\n\t\t\t\tpath.node.extra = {\n\t\t\t\t\t// this in necessary due to possible circles\n\t\t\t\t\t// this collects the correct dependencies\n\t\t\t\t\t// breaks as soon as a node is contained by more than one circle (but this turned out to be unlikely)\n\t\t\t\t\tvisited: 2,\n\t\t\t\t\t//same for return recursion\n\t\t\t\t\treturnVisited: 2\n\t\t\t\t};\n\t\t\t}\n\t\t});\n\n\t\t// adds the corresponding binding to every identifier\n\t\tthis._inner.traverseAsAST({\n\t\t\tScope(path) {\n\t\t\t\tObject.entries(path.scope.bindings).forEach(([_name, binding]) => {\n\t\t\t\t\tbinding.referencePaths.forEach(path => {\n\t\t\t\t\t\tpath.node.extra.binding = binding;\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t});\n\n\t\tthis.extractMemberAssignments();\n    \n    this.enrichFunctionNodes();\n\n\t\tthis._inner.traverseAsAST({\n\t\t\tExpression(expr) {\n\t\t\t\tself.collectExpressionInformation(expr);\n\t\t\t}\n\t\t});\n\t}\n  \n\t// Filters every memberassignment and registers it in `this.memberAssignments`\n  extractMemberAssignments(){\n    let self = this;\n    this._inner.traverseAsAST({\n\t\t\tMemberExpression(expr) {\n\t\t\t\tif (expr.node.computed) return;\n\t\t\t\tif (!expr.parentPath.isAssignmentExpression()) return;\n        let assignment = self.assignedValue(expr.parentPath);\n\n\t\t\t\tlet obj = expr.get(\"object\");\n\t\t\t\tlet objKey = obj.node.extra.binding || 'misc';\n\t\t\t\tlet property = expr.get(\"property\").node.name;\n\n\t\t\t\tlet entry = self.memberAssignments.get(property);\n\t\t\t\tif (!entry) {\n\t\t\t\t\t// property unknown, adding new property and its accesses to the map\n\t\t\t\t\tlet newMap = new Map();\n\n\t\t\t\t\tnewMap.set(objKey, [assignment]);\n\t\t\t\t\tself.memberAssignments.set(property, newMap);\n\t\t\t\t} else {\n\t\t\t\t\tlet objEntry = entry.get(objKey);\n\t\t\t\t\tif (!objEntry) {\n\t\t\t\t\t\tobjEntry = [];\n\t\t\t\t\t\tentry.set(objKey, objEntry);\n\t\t\t\t\t}\n\t\t\t\t\tobjEntry.push(assignment);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n  }\n  \n  enrichFunctionNodes(){\n    // adds bindings definend outside of the current scope(e.g. Function) to the scope\n\t\tthis._inner.traverseAsAST({\n\t\t\t'Function|ArrowFunctionExpression|Program'(path) {\n\t\t\t\tpath.node.extra.leakingBindings = leakingBindings(path);\n\t\t\t\tconst callExpressions = path.node.extra.callExpressions = [];\n\t\t\t\tconst objects = path.node.extra.objects = new Map();\n\t\t\t\tconst returns = path.node.extra.returns = [];\n\n\t\t\t\tpath.traverse({\n\t\t\t\t\tMemberExpression(expr) {\n\t\t\t\t\t\tif (expr.parentPath.isAssignmentExpression()) return;\n\t\t\t\t\t\tlet objExpr = expr.get(\"object\").node;\n\t\t\t\t\t\tlet property = expr.get(\"property\").node.name;\n\n\t\t\t\t\t\tlet entry = objects.get(objExpr);\n\t\t\t\t\t\tif (!entry) {\n\t\t\t\t\t\t\tobjects.set(objExpr, new Set([property]));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tentry.add(property);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tpath.traverse({\n\t\t\t\t\tReturnStatement(ret) {\n\t\t\t\t\t\tif (ret.has(\"argument\")) {\n\t\t\t\t\t\t\treturns.push(ret.get(\"argument\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tCallExpression(call) {\n\t\t\t\t\t\tcallExpressions.push(call)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t});\n  }\n\n  /* Main recursion for enriching AST \n  *  Resolves Expression nodes and follows their children in order to find\n  *  - resolvedObjects - the {ObjExpression, [Bindings]} in which the expression may result\n  *  - resolvedCallees - the [Function] which callepressions may actually be\n  *  - results         - the [Function] which may be returned by an expression or Identifier\n  *\n  */\n\tcollectExpressionInformation(path) {\n    //debugger;\n\t\tif (path.node.extra.returnVisited <= 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tpath.node.extra.returnVisited -= 1;\n\n\t\tif (path.node.extra.results) {\n\t\t\treturn path.node.extra.results\n\t\t}\n\n\t\tlet results = [];\n    let resolvedObjects = [];\n\n\t\tif (path.isObjectExpression()) {\n      resolvedObjects = [{objectExpression:path, bindings:new Set()}];\n\n\t\t} else if (path.isIdentifier()) {\n\t\t\tlet binding = path.node.extra.binding;\n\t\t\tif (binding) {\n\t\t\t\t[binding.path, ...binding.constantViolations].forEach(item => {\n\t\t\t\t\tthis.collectExpressionInformation(item);\n\t\t\t\t\tresults.push(item.node.extra.results);\n          item.node.extra.resolvedObjects.forEach(obj =>{\n            obj.bindings.add(binding);            \n            resolvedObjects.push(obj);            \n          })\n\t\t\t\t})\n\t\t\t}\n    \n    } else if (path.isAssignmentExpression() || path.isVariableDeclarator()) {\n          \n\t\t\tlet val = this.assignedValue(path);\n\t\t\tthis.collectExpressionInformation(val);\n\t\t\tresults = val.node.extra.results;\n      resolvedObjects = val.node.extra.resolvedObjects;\n\n\t\t} else if (path.isFunction()) {\n\t\t\tresults = [path];\n\n\t\t} else if (path.isConditionalExpression()) {\n\t\t\t[path.get(\"consequent\"), path.get(\"alternate\")].forEach(expr => {\n\t\t\t\tthis.collectExpressionInformation(expr);\n\t\t\t\tresults.push(expr.node.extra.results);\n        resolvedObjects.push(expr.node.extra.resolvedObjects);\n\t\t\t})\n\n\t\t} else if (path.isCallExpression()) {\n\t\t\tconst callee = path.get(\"callee\");\n\t\t\tlet resolvedCallees = [];\n\t\t\tthis.collectExpressionInformation(callee);\n\t\t\tcallee.node.extra.results.forEach(func => {\n\t\t\t\tthis.collectExpressionInformation(func);\n\t\t\t\tconst body = func.get(\"body\");\n\t\t\t\tif (!body.isBlockStatement()) {\n\t\t\t\t\t// slim arrow function        \n\t\t\t\t\tthis.collectExpressionInformation(body);\n\t\t\t\t\tresults.push(body.node.extra.results);\n\t\t\t\t} else {\n\t\t\t\t\tfunc.node.extra.returns.forEach(returnStatement => {\n\t\t\t\t\t\tthis.collectExpressionInformation(returnStatement);\n\t\t\t\t\t\tresults.push(returnStatement.node.extra.results);\n            resolvedObjects.push(returnStatement.node.extra.resolvedObjects);\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t// hey we found a callee as well. \n\t\t\t\tresolvedCallees.push(func);\n\t\t\t})\n\t\t\tpath.node.extra.resolvedCallees = resolvedCallees.flat();\n\n\t\t} else if (path.isMemberExpression()) {\n\t\t\tconst objExpr = path.get(\"object\");\n\t\t\tthis.collectExpressionInformation(objExpr);\n\n\t\t\tlet tmp = objExpr.node.extra.resolvedObjects.flat();\n\t\t\ttmp.forEach(result => {\n\t\t\t\tthis.assignmentsOf(path.get(\"property\").node.name, result).forEach(assignment => {\n\t\t\t\t\tthis.collectExpressionInformation(assignment);\n\t\t\t\t\tresults.push(assignment.node.extra.results);\n          resolvedObjects.push(assignment.node.extra.resolvedObjects);\n\t\t\t\t})\n\t\t\t});\n\t\t}\n    path.node.extra.resolvedObjects = resolvedObjects.flat();\n\t\tpath.node.extra.results = results.flat();\n\t}\n\n  // Returns for a given 'property' and {ObjExpression, [Binding]} all known assignments including the declaration\n\tassignmentsOf(property, obj) {\n    \n    let result = [];\n    this.shadowedBindings(obj.bindings).forEach(binding=>{\n    \n      let propertyEntry = this.memberAssignments.get(property) || new Map();\n      let memberDependencies = propertyEntry.get(\"misc\") || [];\n      memberDependencies.forEach(assignment => result.push(assignment));\n\n      let objEntry = propertyEntry.get(binding);\n      if (objEntry) {\n        objEntry.forEach(assignment => result.push(assignment))\n      }\n    });    \n    \n    // try to read as much from the given ObjectExpression as possible\n\n\t\tlet objExpr = obj.objectExpression; // the nodePath\n    if (objExpr && objExpr.isObjectExpression()){\n      let tmp = objExpr\n        .get(\"properties\")\n        .find(path => path.get(\"key\").node.name === property);\n      if(tmp) {\n        if (tmp.isObjectProperty()) {\n          result.push(tmp.get(\"value\"));\n        } else if (tmp.isObjectMethod()) {\n          result.push(tmp);\n        }\n      }\n    }\n\t\treturn result;\n\t}\n\n\tassignedValue(path) {\n\t\tif (path.isFunctionDeclaration()) return path;\n\t\tif (path.isAssignmentExpression()) return path.get(\"right\");\n\t\tif (path.isVariableDeclarator()) {\n\t\t\tconst id = path.get(\"id\");\n\t\t\tif (id.isPattern()) return; // #TODO\n\t\t\treturn path.get(\"init\");\n\t\t}\n\t\treturn;\n\t}\n  \n    /* returns all [binding] that the input [binding] may be assigned to.\n     * ATTENTION: this only works for object bindings, since literal values are copied in javascript\n     * `let a = 4; let b = a` `b` is not shadowed\n     *\n     *\n     * But if `a` is an object it is, so instead of using the actual binding `b`, we use every binding `b` resolves to (including `b`)\n     * \n     * //Where is b changed?\n     * let a = {x:1};\n     * let b = a; // a is shadowed binding\n     * a.x = 2; //<--!!!\n     * //b is equal to {x:2}\n     */\n  shadowedBindings(bindings) {\n    \n    /* this should be stored in the members map or in an extra property. \n    * DOES NOT DETECT DEPENDENCIES THROUGH SIMPLE ASSIGNMENTS (a la `a = b`)\n    * do this with extra sweep as last enrichment step, when the new property in there\n    */\n    let result = bindings;\n    bindings.forEach(binding=>{\n      binding.path.node.extra.resolvedObjects.forEach(obj=>{\n        if(obj.bindings) {\n          obj.bindings.forEach(item => result.add(item));\n        }\n      })\n    });\n    \n    return result;\n  }\n\n  /* returns a [Node] of nodes where the active Expression on this location may be changed\n  * DOES NOT care for execution order of the code\n  * uses heuristics e.g. fixed recursion depth\n  */\n\tresolveDependencies(location) {\n\n\t\tlet node;\n\t\tlet dep;\n\t\tlet dependencyGraph = this;\n\t\tthis._inner.traverseAsAST({\n\t\t\tCallExpression(path) {\n\t\t\t\tif (isAExpr(path) && range(path.node.loc).contains(location)) {\n\t\t\t\t\tif (path.node.dependencies != null) {\n\t\t\t\t\t\tdep = path.node.dependencies;\n\t\t\t\t\t\tconsole.log(\"dependencies already collected: \", dep);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tpath.node.extra.dependencies = dependencyGraph._resolveDependencies(path.get(\"arguments\")[0]);\n\t\t\t\t\tnode = path.node;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (dep) {\n\t\t\treturn dep\n\t\t}\n\t\treturn node.extra.dependencies;\n\t}\n\n\t_resolveDependencies(path) {\n\t\tconst self = this;\n\t\tif ((path.node.extra.visited -= 1) <= 0) {\n\t\t\treturn path.node.extra.dependencies || new Set();\n\t\t}\n\n\t\tif (path.node.extra.dependencies) {\n\t\t\t// the dependencies were already collected... just return them\n\t\t\treturn path.node.extra.dependencies\n\t\t}\n\n\t\tlet dependencies = new Set([...this.shadowedBindings(path.node.extra.leakingBindings)].map(binding => [...binding.constantViolations]).flat());\n\t\tpath.node.extra.callExpressions.forEach(callExpression => {\n\t\t\tcallExpression.node.extra.resolvedCallees.forEach(callee => {\n\t\t\t\tif (t.isFunction(callee)) {\n\t\t\t\t\tthis._resolveDependencies(callee).forEach(dep => dependencies.add(dep));\n\t\t\t\t}\n\n\t\t\t\tif (t.isAssignmentExpression(callee)) {\n\t\t\t\t\tconst value = this.assignedValue(callee);\n\t\t\t\t\tif (t.isFunction(value) || t.isArrowFunctionExpression(value)) {\n\t\t\t\t\t\tthis._resolveDependencies(value).forEach(dep => dependencies.add(dep));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (t.isVariableDeclarator(callee)) {\n\t\t\t\t\t//we should not end up here\n\t\t\t\t}\n\t\t\t})\n\t\t});\n\n\t\tif (path.node.extra.objects.size) {\n\t\t\tfor (const [objExpr, members] of path.node.extra.objects.entries()) {\n\t\t\t\tfor (const member of members) {\n            self.assignmentsOf(member, {bindings: new Set([objExpr.extra.binding])}).forEach(assignment => {\n\t\t\t\t\t\tdependencies.add(assignment)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpath.node.extra.dependencies = dependencies;\n\t\treturn dependencies;\n\t}\n}\n/*MD\n# Helper\nMD*/\nconst AEXPR_IDENTIFIER_NAME = 'aexpr';\n\nfunction leakingBindings(path) {\n\tconst bindings = new Set;\n\tpath.traverse({\n\t\tReferencedIdentifier(id) {\n\t\t\tconst outerBinding = path.scope.getBinding(id.node.name);\n\t\t\tif (!outerBinding) return;\n\t\t\tconst actualBinding = id.scope.getBinding(id.node.name);\n\t\t\tif (outerBinding === actualBinding) {\n\t\t\t\tbindings.add(actualBinding);\n\t\t\t}\n\t\t}\n\t});\n\treturn bindings;\n}\n\nfunction isAExpr(path) {\n\treturn t.isCallExpression(path)\n\t\t&& t.isIdentifier(path.node.callee)\n\t\t&& path.node.callee.name === AEXPR_IDENTIFIER_NAME\n\t\t&& !path.scope.hasBinding(AEXPR_IDENTIFIER_NAME, true);\n}"]}