3

U'ícá)ã@s ddlZddlmZddlmZdZdZdZdZ	dej
ejejd	d	d
œdd„Z
dejejd	d	d
œdd„ZGdd	„d	ƒZGdd„deƒZGdd„deƒZdS)éNé)Únodes)ÚNodeVisitorÚparamÚresolveÚaliasZ	undefinedÚSymbols)rÚparent_symbolsÚreturncCs.t|d}t|ƒ}x|D]}|j|ƒqW|S)N)Úparent)rÚFrameSymbolVisitorÚvisit)rr	ÚsymÚvisitorÚnode©rú3/tmp/pip-build-gk9425m9/Jinja2/jinja2/idtracking.pyÚfind_symbolss


r)rr	r
cCst|d}|j|ƒ|S)N)r)rÚanalyze_node)rr	rrrrÚsymbols_for_nodes

rc@s*eZdZd#ejdejeddœdd„Zejej	ddœdd„Z
d$eejejeejefedœd	d
„Z
eejej	dœdd
„Zeejedœdd„Zeedœdd„Zddœdd„Zeddœdd„Zeedœdd„Zeddœdd„Zejdddœdd„Zejeefdœdd „Zejedœd!d"„ZdS)%rN)rÚlevelr
cCsD|dkr |dkrd}n
|jd}||_||_i|_i|_tƒ|_dS)Nrr)rrÚrefsÚloadsÚsetÚstores)ÚselfrrrrrÚ__init__s
zSymbols.__init__)rÚkwargsr
cKst|ƒ}|j|f|ŽdS)N)ÚRootVisitorr
)rrrrrrrr.szSymbols.analyze_node)ÚnameÚloadr
cCs2d|j›d|›}||j|<|dk	r.||j|<|S)NZl_Ú_)rrr)rrr ÚidentrrrÚ_define_ref2s


zSymbols._define_ref)Útargetr
cCs.||jkr|j|S|jdk	r*|jj|ƒSdS)N)rrÚ	find_load)rr$rrrr%;s



zSymbols.find_load)rr
cCs.||jkr|j|S|jdk	r*|jj|ƒSdS)N)rrÚfind_ref)rrrrrr&Ds



zSymbols.find_refcCs&|j|ƒ}|dkr"td|›dƒ‚|S)NzFTried to resolve a name to a reference that was unknown to the frame (ú))r&ÚAssertionError)rrÚrvrrrÚrefMs

zSymbols.ref)r
cCsJtjttj|jƒƒ}|jj|jƒ|jj	ƒ|_|j
j	ƒ|_
|jj	ƒ|_|S)N)ÚtÚcastrÚobjectÚ__new__Ú	__class__Ú__dict__ÚupdaterÚcopyrr)rr)rrrr2VszSymbols.copycCs`|jj|ƒ||jkr\|jdk	rJ|jj|ƒ}|dk	rJ|j|t|fddS|j|tdfddS)N)r )rÚaddrrr&r#ÚVAR_LOAD_ALIASÚVAR_LOAD_UNDEFINED)rrZ	outer_refrrrÚstore^s

z
Symbols.storecCs|jj|ƒ|j|tdfdS)N)r )rr3r#ÚVAR_LOAD_PARAMETER)rrrrrÚdeclare_parameterpszSymbols.declare_parametercCs$|j|ƒdkr |j|t|fddS)N)r )r&r#ÚVAR_LOAD_RESOLVE)rrrrrr tszSymbols.load)Úbranch_symbolsr
c	Csøi}x<|D]4}x.|jD]$}||jkr&q|j|dƒd||<qWq
Wx6|D].}|jj|jƒ|jj|jƒ|jj|jƒqHWxx|jƒD]l\}}|t|ƒkršq„|j|ƒ}|dk	s´tdƒ‚|j	dk	râ|j	j|ƒ}|dk	rât
|f|j|<q„t|f|j|<q„WdS)Nrrzshould not happen)rÚgetrr1rÚitemsÚlenr&r(rr4r9)	rr:rÚbranchr$rrZbranch_countZouter_targetrrrÚ
branch_updatexs*




zSymbols.branch_updatecCsJi}|}x<|dk	rDx(t|jƒD]}||kr|j|ƒ||<qW|j}q
W|S)N)Úsortedrr&r)rr)rrrrrÚdump_stores“s

zSymbols.dump_storescCsPtƒ}|}x@|dk	rJx,|jjƒD]\}\}}|tkr |j|ƒq W|j}qW|S)N)rrr<r7r3r)rr)rr$Úinstrr!rrrÚdump_param_targets s

zSymbols.dump_param_targets)NN)N)Ú__name__Ú
__module__Ú__qualname__r+ÚOptionalÚintrrÚNodeÚAnyrÚstrÚTupler#r%r&r*r2r6r8r ÚSequencer?ÚDictrAÚSetrCrrrrrs
			
c@sÚeZdZdddœdd„Zejejddœdd„ZeZ	eZ
eZeZeZ
eZeZejejddœd	d
„Zejejddœdd„Zejejddœd
d„Zdejeejddœdd„Zejejddœdd„Zejejejddœdd„ZdS)rrN)Úsymbolsr
cCst|ƒ|_dS)N)rÚsym_visitor)rrPrrrr¯szRootVisitor.__init__)rrr
cKs"x|jƒD]}|jj|ƒq
WdS)N)Úiter_child_nodesrQr
)rrrÚchildrrrÚ
_simple_visit²szRootVisitor._simple_visitcKs x|jD]}|jj|ƒqWdS)N)ÚbodyrQr
)rrrrSrrrÚvisit_AssignBlock¾szRootVisitor.visit_AssignBlockcKs&x |jddD]}|jj|ƒqWdS)NÚcall)Úexclude)rW)rRrQr
)rrrrSrrrÚvisit_CallBlockÂszRootVisitor.visit_CallBlockcKs x|jD]}|jj|ƒqWdS)N)rUrQr
)rrrrSrrrÚvisit_OverlayScopeÆszRootVisitor.visit_OverlayScoperU)rÚ
for_branchrr
cKs’|dkr"|jj|jdd|j}nN|dkr2|j}n>|dkrh|jj|jdd|jdk	rd|jj|jƒdStdƒ‚|rŽx|D]}|jj|ƒqzWdS)NrUT)Ústore_as_paramÚelseÚtestzUnknown for branch)rQr
r$rUÚelse_r^ÚRuntimeError)rrr[rr>ÚitemrrrÚ	visit_ForÊs

zRootVisitor.visit_ForcKs<x|jD]}|jj|ƒqWx|jD]}|jj|ƒq$WdS)N)ÚtargetsrQr
rU)rrrr$rSrrrÚ
visit_WithÞszRootVisitor.visit_With)rÚargsrr
cOstdt|ƒj›ƒ‚dS)NzCannot find symbols for )ÚNotImplementedErrorÚtyperD)rrrerrrrÚ
generic_visitäszRootVisitor.generic_visit)rU)rDrErFrrrIr+rJrTZvisit_TemplateÚvisit_BlockÚvisit_MacroÚvisit_FilterBlockÚvisit_ScopeÚvisit_IfZvisit_ScopedEvalContextModifierÚAssignBlockrVÚ	CallBlockrYÚOverlayScoperZÚForrKrbÚWithrdrhrrrrr®s rc@sneZdZdZdddœdd„Zd(ejeej	ddœd	d
„Z
ejej	ddœdd
„Zej
ej	ddœdd„Zejej	ddœdd„Zejej	ddœdd„Zejej	ddœdd„Zejej	ddœdd„Zejej	ddœdd„Zejej	ddœdd„Zejej	ddœdd„Zejej	ddœdd„Zejej	ddœd d!„Z ej!ej	ddœd"d#„Z"ej#ej	ddœd$d%„Z$ej%ej	ddœd&d'„Z&dS))rzA visitor for `Frame.inspect`.rN)rPr
cCs
||_dS)N)rP)rrPrrrrëszFrameSymbolVisitor.__init__F)rr\rr
cKsT|s|jdkr|jj|jƒn2|jdkr8|jj|jƒn|jdkrP|jj|jƒdS)z2All assignments to names go through this function.rr6r N)ÚctxrPr8rr6r )rrr\rrrrÚ
visit_Nameîs

zFrameSymbolVisitor.visit_Name)rrr
cKs|jj|jƒdS)N)rPr r)rrrrrrÚvisit_NSRefùszFrameSymbolVisitor.visit_NSRefcsnˆj|jfˆŽˆj‰tjtjddœ‡‡‡fdd„}||jƒ}||jƒ}||j	pTfƒ}ˆjj
|||gƒdS)Nr)rr
cs4ˆjƒˆ_}x|D]}ˆj|fˆŽqWˆˆ_|S)N)r2rPr
)rr)Zsubnode)rÚoriginal_symbolsrrrÚinner_visits

z0FrameSymbolVisitor.visit_If.<locals>.inner_visit)r
r^rPr+ÚIterablerrIrUZelif_r_r?)rrrrwZbody_symbolsZelif_symbolsZelse_symbolsr)rrvrrrmüs 	

zFrameSymbolVisitor.visit_IfcKs|jj|jƒdS)N)rPr6r)rrrrrrrjszFrameSymbolVisitor.visit_MacrocKs |j|f|Ž|jj|jƒdS)N)rhrPr6r$)rrrrrrÚvisit_ImportszFrameSymbolVisitor.visit_ImportcKsJ|j|f|Žx6|jD],}t|tƒr6|jj|dƒq|jj|ƒqWdS)Nr)rhÚnamesÚ
isinstanceÚtuplerPr6)rrrrrrrÚvisit_FromImports

z#FrameSymbolVisitor.visit_FromImportcKs$|j|jf|Ž|j|jf|ŽdS)z'Visit assignments in the correct order.N)r
rr$)rrrrrrÚvisit_AssignszFrameSymbolVisitor.visit_AssigncKs|j|jf|ŽdS)zqVisiting stops at for blocks.  However the block sequence
        is visited as part of the outer scope.
        N)r
Úiter)rrrrrrrb#szFrameSymbolVisitor.visit_ForcKs|j|jf|ŽdS)N)r
rW)rrrrrrrY)sz"FrameSymbolVisitor.visit_CallBlockcKs|j|jf|ŽdS)N)r
Úfilter)rrrrrrrk,sz$FrameSymbolVisitor.visit_FilterBlockcKsx|jD]}|j|ƒqWdS)N)Úvaluesr
)rrrr$rrrrd/szFrameSymbolVisitor.visit_WithcKs|j|jf|ŽdS)zStop visiting at block assigns.N)r
r$)rrrrrrrV3sz$FrameSymbolVisitor.visit_AssignBlockcKsdS)zStop visiting at scopes.Nr)rrrrrrrl7szFrameSymbolVisitor.visit_ScopecKsdS)zStop visiting at blocks.Nr)rrrrrrri:szFrameSymbolVisitor.visit_BlockcKsdS)z!Do not visit into overlay scopes.Nr)rrrrrrrZ=sz%FrameSymbolVisitor.visit_OverlayScope)F)'rDrErFÚ__doc__rrÚNameÚboolr+rJrtZNSRefruÚIfrmZMacrorjÚImportryZ
FromImportr}ÚAssignr~rqrbrorYZFilterBlockrkrrrdrnrVZScoperlZBlockrirprZrrrrrès$		r)N)N)Útypingr+Úrrrr7r9r4r5rxrIrGrrrrrrrrrÚ<module>s	: