from __future__ import generators
from bike.query.common import Match,globalScanForMatches,getScopeForLine,MatchFinder
from getTypeOf import getTypeOf,getTypeOfExpr
import compiler
import re
def getReferencesToModule(root, fqn):
modulename = fqn.split(".")[-1]
moduleobj = getTypeOf(root, fqn)
moduleRefFinder = ModuleRefFinder(moduleobj)
for ref in globalScanForMatches(moduleRefFinder, modulename):
yield ref
class ModuleRefFinder(MatchFinder):
def __init__(self, targetmodule):
self.targetmodule = targetmodule
def visitName(self, node):
if node.name == self.targetmodule.name:
if getTypeOfExpr(self.scope, node) == self.targetmodule:
self.appendMatch(node.name)
self.popWordsUpTo(node.name)
def visitImport(self, node):
for name, alias in node.names:
if name.split(".")[-1] == self.targetmodule.name:
if getTypeOf(self.scope, name) == self.targetmodule:
self.appendMatch(self.targetmodule.name)
for nameelem in name.split("."):
self.popWordsUpTo(nameelem)
if alias is not None:
self.popWordsUpTo(alias)
def visitGetattr(self, node):
for c in node.getChildNodes():
self.visit(c)
if node.attrname == self.targetmodule.name:
if getTypeOfExpr(self.scope, node) == self.targetmodule:
self.appendMatch(self.targetmodule.name)
self.popWordsUpTo(node.attrname)
def visitFrom(self, node):
for elem in node.modname.split("."):
if elem == self.targetmodule.name:
getTypeOf(self.scope, elem) == self.targetmodule
self.appendMatch(self.targetmodule.name)
self.popWordsUpTo(elem)
for name, alias in node.names:
if name == self.targetmodule.name:
if alias and \
getTypeOf(self.scope, alias) == self.targetmodule:
self.appendMatch(self.targetmodule.name)
elif getTypeOf(self.scope, name) == self.targetmodule:
self.appendMatch(self.targetmodule.name)
if name != "*":
self.popWordsUpTo(name)
if alias is not None:
self.popWordsUpTo(alias)
|