ref: 193dcbb9a1412067b126aeffaf84bb66ee7027ba
dir: /waflib/Tools/d_scan.py/
#! /usr/bin/env python # encoding: utf-8 # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file import re from waflib import Utils,Logs def filter_comments(filename): txt=Utils.readf(filename) i=0 buf=[] max=len(txt) begin=0 while i<max: c=txt[i] if c=='"'or c=="'": buf.append(txt[begin:i]) delim=c i+=1 while i<max: c=txt[i] if c==delim:break elif c=='\\': i+=1 i+=1 i+=1 begin=i elif c=='/': buf.append(txt[begin:i]) i+=1 if i==max:break c=txt[i] if c=='+': i+=1 nesting=1 c=None while i<max: prev=c c=txt[i] if prev=='/'and c=='+': nesting+=1 c=None elif prev=='+'and c=='/': nesting-=1 if nesting==0:break c=None i+=1 elif c=='*': i+=1 c=None while i<max: prev=c c=txt[i] if prev=='*'and c=='/':break i+=1 elif c=='/': i+=1 while i<max and txt[i]!='\n': i+=1 else: begin=i-1 continue i+=1 begin=i buf.append(' ') else: i+=1 buf.append(txt[begin:]) return buf class d_parser(object): def __init__(self,env,incpaths): self.allnames=[] self.re_module=re.compile("module\s+([^;]+)") self.re_import=re.compile("import\s+([^;]+)") self.re_import_bindings=re.compile("([^:]+):(.*)") self.re_import_alias=re.compile("[^=]+=(.+)") self.env=env self.nodes=[] self.names=[] self.incpaths=incpaths def tryfind(self,filename): found=0 for n in self.incpaths: found=n.find_resource(filename.replace('.','/')+'.d') if found: self.nodes.append(found) self.waiting.append(found) break if not found: if not filename in self.names: self.names.append(filename) def get_strings(self,code): self.module='' lst=[] mod_name=self.re_module.search(code) if mod_name: self.module=re.sub('\s+','',mod_name.group(1)) import_iterator=self.re_import.finditer(code) if import_iterator: for import_match in import_iterator: import_match_str=re.sub('\s+','',import_match.group(1)) bindings_match=self.re_import_bindings.match(import_match_str) if bindings_match: import_match_str=bindings_match.group(1) matches=import_match_str.split(',') for match in matches: alias_match=self.re_import_alias.match(match) if alias_match: match=alias_match.group(1) lst.append(match) return lst def start(self,node): self.waiting=[node] while self.waiting: nd=self.waiting.pop(0) self.iter(nd) def iter(self,node): path=node.abspath() code="".join(filter_comments(path)) names=self.get_strings(code) for x in names: if x in self.allnames:continue self.allnames.append(x) self.tryfind(x) def scan(self): env=self.env gruik=d_parser(env,self.generator.includes_nodes) node=self.inputs[0] gruik.start(node) nodes=gruik.nodes names=gruik.names if Logs.verbose: Logs.debug('deps: deps for %s: %r; unresolved %r'%(str(node),nodes,names)) return(nodes,names)