Vim errorformat для phpunit - PullRequest
       4

Vim errorformat для phpunit

10 голосов
/ 09 марта 2011

Я работаю над плагином компилятора Vim для PHPUnit.

Я написал следующее errorformat. Сообщение об ошибке извлечено правильно, но номера файлов и строк - нет.

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

Вывод PHPUnit выглядит примерно так:

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

Я рад, что указанный файл и строка являются первой или последней записью в трассировке стека. Самый глубокий вызов - фактический источник проблемы. Переход к вызову верхнего уровня означает, что я могу использовать для перехода в стек вызовов. Я бы предпочел последнее, SomeClassTest.php:15 в приведенном выше примере.

1 Ответ

5 голосов
/ 14 марта 2011

Я думаю, что проблема в формулировке правила %Z. Сначала я придумал это:

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

Это перехватит имя файла first и свяжет это с сообщением об ошибке.

По какой-то причине ассоциация с упомянутым именем last оказалась намного сложнее. Я не смог сделать это с efm, но вместо этого взломал этот фильтр 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])

Это позволит фиксировать все ошибки и выводить их в однострочном формате. Соответствующее имя файла и номер строки являются последними , упомянутыми для ошибки. Этот сценарий перекрывает все остальные выходные данные, но это можно решить, добавив, например, print line после line = line.strip().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...