import * as t from "@babel/types" ; import traverse , { Scope , NodePath } from "@babel/traverse" ; import { DependencyType } from "../utils/VariableStatementDependencyManager" ; import { PROP_VAR } from "../constants" ; import { isElementVar } from "../utils/variableNames" ; export function getImpactfulIdentifiers ( node , scope , parentPath ) { const impactfulIdentifiers = [ ] ; if ( t . isIdentifier ( node ) && ! isElementVar ( node . name ) ) { impactfulIdentifiers . push ( [ "local" , node . name ] ) ; } traverse ( node , { Identifier ( p ) { if ( t . isMemberExpression ( p . container ) ) { const parentNode = p . container as t . MemberExpression ; if ( t . isIdentifier ( parentNode . object ) ) { if ( p . node . name !== PROP_VAR ) { if ( parentNode . object . name === PROP_VAR ) { impactfulIdentifiers . push ( [ "prop" , parentNode . property . name ] ) ; } else if ( parentNode . object . name === p . node . name && p . node . name !== "Object" && ! isElementVar ( p . node . name ) ) { impactfulIdentifiers . push ( [ "local" , p . node . name ] ) ; } } } } else { if ( t . isCallExpression ( p . container ) ) { const parentNode = p . container as t . CallExpression ; if ( t . isIdentifier ( parentNode . callee ) && parentNode . callee . name === "addPropTransaction" ) { return ; } } if ( t . isObjectProperty ( p . container ) || ( parentPath . scope !== p . scope && ! parentPath . scope . hasBinding ( p . node . name ) ) ) { p . skip ( ) ; } else if ( ! isElementVar ( p . node . name ) ) { impactfulIdentifiers . push ( [ "local" , p . node . name ] ) ; } } } } , scope , { } , parentPath ) ; return impactfulIdentifiers ; }