
    	D,j>                     :   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
Z
d dlmZmZ d dlmZ d dlmZ d dlmZ  ej        de	            G d
 d          Ze G d d                      Zd Zd Zd Zd Zd Zd Zedk    r e             dS dS )    N)	dataclass)Path)TreeContextfilename_to_lang)
get_parser)dump)run_cmd_subprocessignore)categoryc                   B    e Zd ZddZd Zd Zd Zd ZddZd	 Z	d
 Z
dS )Linterutf-8Nc                 d    || _         || _        t          | j                  | _        d | _        d S )N)python)encodingrootdictpy_lint	languagesall_lint_cmd)selfr   r   s      [/home/rurouni/.local/share/uv/tools/aider-chat/lib/python3.11/site-packages/aider/linter.py__init__zLinter.__init__   s;     	<
 
 
 !    c                 0    |r|| j         |<   d S || _        d S N)r   r   )r   langcmds      r   
set_linterzLinter.set_linter   s)     	#&DN4 Fr   c                     | j         r8	 t          j                            || j                   S # t          $ r |cY S w xY w|S r   )r   ospathrelpath
ValueError)r   fnames     r   get_rel_fnamezLinter.get_rel_fname&   sT    9 	wudi888    Ls   $. ==c                 *   |dt          j        |          z   z  }d}d}	 t          || j        | j                  \  }}n*# t
          $ r}t          d|            Y d }~d S d }~ww xY w|}|dk    rd S d| d}||z  }|                     ||          S )N r    )cwdr   z Unable to execute lint command: ## Running: 

)oslexquoter	   r   r   OSErrorprinterrors_to_lint_result)	r   r   	rel_fnamecode
returncodestdouterrerrorsress	            r   run_cmdzLinter.run_cmd/   s    sU[++++
	!3I" " "J
  	 	 	:S::;;;FFFFF	 ??F&S&&&v)))S999s   A   
A'
A""A'c                     |sd S g }t          ||g          }|r=t          t          |                                                    \  }}d |D             }t	          ||          S )Nc                     g | ]}|d z
  S )    ).0nums     r   
<listcomp>z0Linter.errors_to_lint_result.<locals>.<listcomp>N   s    444Ca444r   textlines)find_filenames_and_linenumsnextiteritems
LintResult)r   r2   r7   linenumsfilenames_linenumsfilenames         r   r1   zLinter.errors_to_lint_resultF   s{     	F8)MM 	5!%d+=+C+C+E+E&F&F!G!GHh448444HvX6666r   c                 r   |                      |          }	 t          |                              | j        d          }n-# t          $ r }t          d| d|            Y d }~d S d }~ww xY w|r|                                }|s<t          |          }|sd S | j        r| j        }n| j	        
                    |          }t          |          r ||||          }n*|r|                     |||          }nt          ||          }|sd S d}||j        z  }|dz  }|t          |||j                  z  }|S )Nreplace)r   r7   zUnable to read z: z&# Fix any errors below, if possible.


)r&   r   	read_textr   r/   r0   stripr   r   r   getcallabler9   
basic_lintrB   tree_contextrC   )	r   r%   r   r2   r3   r6   r   lintresr8   s	            r   lintzLinter.lintR   s   &&u--		;;(($-	(RRDD 	 	 	2E22S22333FFFFF	  	))++C 	/#E**D   /'n((..C== 	2c%D11GG 	2ll3	488GG D11G 	F8w|t|ItW];;;
s   )A 
A+A&&A+c                 $   t          ||          }t          ||          }|                     |          }d}t                      }|||fD ]0}	|	s|r|dz  }||	j        z  }|                    |	j                   1|s|rt          ||          S d S )Nr)   rN   )rS   lint_python_compileflake8_lintsetrB   updaterC   rH   )
r   r%   r2   r3   	basic_rescompile_res	flake_resrB   rC   r8   s
             r   r   zLinter.py_lintv   s    y$//	)%66$$Y//	{I6 	$ 	$C  CHDLL#### 	+5 	+dE***	+ 	+r   c           	      `   d}t           j        ddd| dd|g}dd                    |           d	}	 t          j        |d
d
d| j        d| j                  }|j        |j        z   }n)# t          $ r}dt          |           }Y d }~nd }~ww xY w|sd S ||z  }|                     ||          S )Nz/E9,F821,F823,F831,F406,F407,F701,F702,F704,F706z-mflake8z	--select=z--show-sourcez
--isolatedr+   r(   r,   TFrM   )capture_outputrB   checkr   r7   r*   zError running flake8: )sys
executablejoin
subprocessrunr   r   r5   stderr	Exceptionstrr1   )r   r2   fatal
flake8_cmdrB   resultr7   es           r   rY   zLinter.flake8_lint   s    AN

 9chhz22888	7^# I  F ]V]2FF 	7 	7 	76c!ff66FFFFFF	7  	F)))T:::s   4A( (
B2B		B)r   Nr   )__name__
__module____qualname__r   r   r&   r9   r1   rV   r   rY   r=   r   r   r   r      s        ! ! ! !       : : :.
7 
7 
7" " " "H+ + +$ ;  ;  ;  ;  ;r   r   c                   $    e Zd ZU eed<   eed<   dS )rH   rB   rC   N)ro   rp   rq   rj   __annotations__listr=   r   r   rH   rH      s"         
IIIKKKKKr   rH   c                    	 t          || d           d S # t          $ r}t          |d|j                  }t	          t          |j        dz
  |                    }t          j        t          |          ||j	                  }d}d}|dz  }t          t          |                    D ]}|||         v r|} n|d d         ||dz   d          z   }Y d }~nd }~ww xY wd                    |          }	t          |	|          S )	Nexec
end_linenor<   r   z# USE TRACEBACKz BELOW HEREr)   rA   )compileri   getattrlinenort   range	tracebackformat_exceptiontype__traceback__lenre   rH   )
r%   r3   r6   rw   line_numberstb_lineslast_file_itargetir8   s
             r   rX   rX      s,   >eV$$$ > > >S,
;;
E#*q.*==>>-d3iic>OPP"-s8}}%% 	 	A!$$ % BQB<(;?+<+<"==>  ''(

C3l3333s    
CB1CCc                    t          |           }|sdS |dk    rdS 	 t          |          }n*# t          $ r}t          d|            Y d}~dS d}~ww xY w|                    t          |d                    }	 t          |j                  }n$# t          $ r t          d|  d           Y dS w xY w|sdS t          d|          S )	zT
    Use tree-sitter to look for syntax errors, display them with tree context.
    N
typescriptzUnable to load parser: r   zUnable to lint z due to RecursionErrorr)   rA   )
r   r   ri   r0   parsebytestraverse_tree	root_nodeRecursionErrorrH   )r%   r3   r   parserr6   treer7   s          r   rS   rS      s   
 E""D  |D!!   ---... <<dG,,--Dt~..   ====>>>  2V,,,,s&   - 
AAA;B B10B1c                     t          | |dddddddd
  
        }t          |          }|                    |           |                                 t	          |          dk    rdnd}d	| d
}|| dz   z  }||                                z  }|S )NFTr      )colorline_numberchild_context	last_linemargin	mark_loisloi_padshow_top_of_file_parent_scoper<   sr)   z## See relevant lineu    below marked with █.

z:
)r   rZ   add_lines_of_interestadd_contextr   format)r%   r3   	line_numscontextr   outputs         r   rT   rT      s    &+  G II!!),,,9~~!!rABABBBF
eemF
gnnFMr   c                     g }| j         dk    s| j        r"| j        d         }|                    |           | j        D ]}|t          |          z  }|S )NERRORr   )r~   
is_missingstart_pointappendchildrenr   )noder7   line_nochilds       r   r   r     sd    FyGt"1%g ' '-&&&Mr   c                 X   t          j        dd                    d |D                       z   dz             }|                    |           }i }|D ]X}|                    dd          \  }}||vrt                      ||<   ||                             t          |                     Y|S )z
    Search text for all occurrences of <filename>:\d+ and make a list of them
    where <filename> is one of the filenames in the list `fnames`.
    z(\b(?:|c              3   >   K   | ]}t          j        |          V  d S r   )reescape)r>   r%   s     r   	<genexpr>z.find_filenames_and_linenums.<locals>.<genexpr>  s,      -S-S5bi.>.>-S-S-S-S-S-Sr   z):\d+\b):r<   )r   rx   re   findallrsplitrZ   addint)rB   fnamespatternmatchesrm   matchr%   linenums           r   rD   rD     s    
 jSXX-S-SF-S-S-S%S%SSVaabbGood##GF ( (c1--wEEF5Mu#g,,''''Mr   c                  B   t          t          j                  dk     r#t          d           t          j        d           t          t          j                              } t          j        dd         D ](}|                     |          }|rt          |           )dS )zJ
    Main function to parse files provided as command line arguments.
       z+Usage: python linter.py <file1> <file2> ...r<   )r   N)	r   rc   argvr0   exitr   r!   getcwdrV   )linter	file_pathr7   s      r   mainr      s     38}}q;<<<%%%FXabb\  	Y'' 	&MMM r   __main__)r!   r   rf   rc   r|   warningsdataclassesr   pathlibr   r-   grep_astr   r   grep_ast.tslr   
aider.dumpr   aider.run_cmdr	   simplefilterFutureWarningr   rH   rX   rS   rT   r   rD   r   ro   r=   r   r   <module>r      s   				 				     



      ! ! ! ! ! !        2 2 2 2 2 2 2 2 # # # # # #       , , , , , ,  h 7 7 7 7S; S; S; S; S; S; S; S;l        
4 4 40- - -B  4	 	 	      zDFFFFF r   