{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-event-sourcing/src/client/dependency-graph/graph.js"],"names":["babelDefault","range","isAExpr","leakingBindings","types","t","babel","DependencyGraph","programPath","capabilities","constructor","memberAssignments","Map","finishedEnrichment","enrich","getAexprAtCursor","location","aexprPath","traverse","CallExpression","path","node","loc","contains","skip","stop","getAllActiveExpressions","allAExpr","push","hasActiveExpressionsDirective","directives","some","value","ensureEnrichment","err","console","error","self","enter","extra","visited","returnVisited","Scopable","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","callExpressions","objects","returns","objExpr","Set","add","ReturnStatement","ret","has","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","resolveDependenciesAtLocation","dep","dependencyGraph","dependencies","log","_resolveDependencies","resolveDependenciesForMember","memberName","deps","Function","key","resolveDependencies","AssignmentExpression","left","isThisExpression","object","UpdateExpression","argument","map","callExpression","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 programPath() { return this.capabilities.programPath }\n\n\tconstructor(capabilities) {\n    this.capabilities = capabilities;\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    this.finishedEnrichment = false;\n\t\tthis.enrich();\n\t}\n  \n  getAexprAtCursor(location) {\n    let aexprPath;\n    this.programPath.traverse({\n      CallExpression(path) {\n        if (!range(path.node.loc).contains(location)) {\n          path.skip();\n        } else if (isAExpr(path)) {\n          aexprPath = path;\n          path.stop();\n        }\n      }\n    });\n    return aexprPath;\n  }\n  \n  getAllActiveExpressions () {\n    if(!this.programPath) return [];\n    const allAExpr = [];\n    this.programPath.traverse({\n      CallExpression(path) {\n        if (isAExpr(path) ) {\n          allAExpr.push(path);\n        }\n      }\n    });    \n    return allAExpr;    \n  }\n\n  get hasActiveExpressionsDirective() {\n    if(!this.programPath) return false;\n    return this.programPath.node.directives.some(node => {\n      return node.value.value === \"enable aexpr\";\n    });\n  }\n\n  ensureEnrichment() {\n    if (this.finishedEnrichment) return true;\n    if (!this.programPath || !this.hasActiveExpressionsDirective) return false;\n    try {\n      this.enrich();\n    } catch (err) {\n      console.error(\"Unable to process source code\", err);\n      return false;\n    }\n    return true;\n  }\n\n\tenrich() {\n    if(!this.programPath) return;\n\t\tlet self = this;\n\t\tthis.programPath.traverse({\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.programPath.traverse({\n\t\t\tScopable(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.programPath.traverse({\n\t\t\tExpression(expr) {\n\t\t\t\tself.collectExpressionInformation(expr);\n\t\t\t}\n\t\t});\n    this.finishedEnrichment = true;\n\t}\n  \n\t// Filters every memberassignment and registers it in `this.memberAssignments`\n  extractMemberAssignments(){\n    let self = this;\n    this.programPath.traverse({\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.programPath.traverse({\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\t\tif (path.node.extra.results) {\n\t\t\treturn path.node.extra.results\n\t\t}\n    \n\t\tif (path.node.extra.returnVisited <= 0) {\n      path.node.extra.resolvedObjects = [];\n      path.node.extra.results = [];\n\t\t\treturn [];\n\t\t}\n\n\t\tpath.node.extra.returnVisited -= 1;\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      if(val && val.node) {        \n        this.collectExpressionInformation(val);\n        results = val.node.extra.results;\n        resolvedObjects = val.node.extra.resolvedObjects;\n      }\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    if(!bindings) return [];\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\tresolveDependenciesAtLocation(location) {\n\t\tlet node;\n\t\tlet dep;\n\t\tlet dependencyGraph = this;\n\t\tthis.programPath.traverse({\n\t\t\tCallExpression(path) {\n\t\t\t\tif (isAExpr(path) && range(path.node.loc).contains(location.node.loc)) {\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  resolveDependenciesForMember(memberName) {\n\t\tlet deps = [];\n    const self = this;\n\t\tlet dependencyGraph = this;\n\t\tthis.programPath.traverse({\n\t\t\tFunction(path) {\n        if(!path.node.key || path.node.key.name !== memberName) return;\n        if (!path.node.extra.dependencies) {\n          path.node.extra.dependencies = dependencyGraph.resolveDependencies(path);\n        }\n        deps.push(...(path.node.extra.dependencies || []), path.get(\"key\"));\n\t\t\t},\n      AssignmentExpression(path) {\n        const left = path.node.left;\n        if(t.isMemberExpression(left), t.isThisExpression(left.object) && left.property.name === memberName) {\n          deps.push(path);\n        }\n      },\n      UpdateExpression(path) {\n        const argument = path.node.argument;\n        if(t.isMemberExpression(argument), t.isThisExpression(argument.object) && argument.property.name === memberName) {\n          deps.push(path);\n        }\n      }\n      //Todo: Array stuff??\n\t\t});\n\t\treturn deps;\n\t}\n  \n\tresolveDependencies(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 ?[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}"]}