2011-03-09 9 views
10

Estoy trabajando en un plugin de compilador de Vim para PHPUnit.Vim errorformat for phpunit

He escrito el siguiente errorformat. El mensaje de error se extrae correctamente, pero los números de archivo y línea no. salida

CompilerSet errorformat=%E%n)\ %.%#, 
         \%C%m, 
         \%+C%$, 
         \%C%f:%l, 
         \%Z%$ 

de PHPUnit es como la siguiente:

PHPUnit 3.5.12 by Sebastian Bergmann. 

............................................................... 63/134 (47%) 
.........................E..... 

Time: 0 seconds, Memory: 11.25Mb 

There was 1 error: 

1) SomeClassTest::testSomething 
Undefined property: SomeClass::$var 

/path/to/SomeClass.php:99 
/path/to/SomeClassTest.php:15 

FAILURES! 
Tests: 94, Assertions: 170, Errors: 1. 

Press ENTER or type command to continue 

estoy feliz por el archivo y la línea notificado a ser la primera o la última entrada en el seguimiento de la pila. La llamada más profunda es la fuente real del problema. Saltar a la llamada de nivel superior significa que puedo usar para bajar a la pila de llamadas. Preferiría este último, SomeClassTest.php:15 en el ejemplo anterior.

Respuesta

5

Creo que el problema es la redacción de la regla %Z. Primero se me ocurrió esto:

:set errorformat=%E%n)\ %.%#,%Z%f:%l,%C%m,%-G%.%# 

que va a coger el nombre del archivo primera y asociada que con el mensaje de error.

Por alguna razón, la asociación última nombre del archivo mencionado fue mucho más difícil. Yo no era capaz de hacerlo con efm, pero en vez hackeado este filtro Python:

import sys                 
import re 
errors = [] 
OTHER = 0 
MESSAGE = 1 
FILE_LINE = 2 
next_is = OTHER 
lines = sys.stdin.readlines() 
for line in lines: 
    line = line.strip() 
    if (next_is == OTHER): 
     if (re.search("^[0-9]+\)", line)): 
      next_is = MESSAGE 
    elif (next_is == MESSAGE): 
     errors.append([line, '']) 
     next_is = FILE_LINE 
    elif (next_is == FILE_LINE): 
     if (re.search("^.+:[0-9]+", line)): 
      errors[-1][1] = line 
     elif (len(line) == 0 and len(errors[-1][1]) > 0): 
      next_is = OTHER 

for error in errors: 
    print "{0}:{1}".format(error[1], error[0]) 

Esto captura todos los errores y salida de ellos, en un formato de una sola línea. El nombre de archivo asociado y el número de línea son últimos mencionados para el error. Este script elimina todos los demás resultados, pero eso se resolvería agregando, p. Ej. a print line después de line = line.strip().

+0

Gracias Ilkka! Esto funciona como un regalo. – afternoon

+1

He publicado el código en un plugin en Github: https://github.com/afternoon/vim-phpunit – afternoon

+0

Viéndolo de nuevo, tal vez la razón por la que no funcionó fue que '% + C% $ 'siempre coincidiría antes que'% Z% $ 'y, por lo tanto, el mensaje de varias líneas nunca se" cerró "correctamente. – Ilkka