Skip to content

Commit b1b02d1

Browse files
committed
Fixes for latest SublimeLinter
Includes some regex fixes for latest PHP versions and some improved error message filtering.
1 parent 804a20f commit b1b02d1

File tree

4 files changed

+98
-7
lines changed

4 files changed

+98
-7
lines changed

Diff for: .gitattributes

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
/.gitattributes export-ignore
99
/.gitignore export-ignore
1010
/.travis.yml export-ignore
11+
/tests/

Diff for: linter.py

+21-7
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,20 @@
1414
from SublimeLinter.lint import Linter, util
1515

1616

17-
logger = logging.getLogger('SublimeLinter.plugin.eslint')
17+
logger = logging.getLogger('SublimeLinter.plugin.php')
18+
19+
20+
def _filter_message(message):
21+
if not message:
22+
message = 'parse error'
23+
else:
24+
message = message.replace('Standard input code', '')
25+
message = message.replace(' on ', '')
26+
message = message.replace(' in -', '')
27+
message = message.replace(' in ', '')
28+
message = message.strip()
29+
30+
return message
1831

1932

2033
class PHP(Linter):
@@ -24,18 +37,19 @@ class PHP(Linter):
2437
'selector': 'source.php, text.html.basic'
2538
}
2639
regex = (
27-
r'^(?:Parse|Fatal) (?P<error>error):(\s*(?P<type>parse|syntax) error,?)?\s*'
28-
r'(?P<message>(?:unexpected \'(?P<near>[^\']+)\')?.*) (?:in - )?on line (?P<line>\d+)'
40+
r'^(?P<error>Parse|Fatal) error:\s*'
41+
r'(?P<message>((?:parse|syntax) error,?)?\s*(?:unexpected \'(?P<near>[^\']+)\')?.*) '
42+
r'(?:in - )?on line (?P<line>\d+)'
2943
)
3044
error_stream = util.STREAM_STDOUT
3145

3246
def split_match(self, match):
3347
"""Return the components of the error."""
34-
match, line, col, error, warning, message, near = super().split_match(match)
48+
result = super().split_match(match)
49+
50+
match, line, col, error, warning, message, near = result
3551

36-
# message might be empty, we have to supply a value
37-
if match and match.group('type') == 'parse' and not message:
38-
message = 'parse error'
52+
message = _filter_message(message)
3953

4054
return match, line, col, error, warning, message, near
4155

Diff for: tests/test_regex.py

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# flake8: noqa
2+
import unittest
3+
import re
4+
import importlib
5+
6+
# Damn you dash separated module names!!!
7+
LinterModule = importlib.import_module('SublimeLinter-php.linter')
8+
Linter = LinterModule.PHP
9+
_filter_message = LinterModule._filter_message
10+
regex = Linter.regex
11+
12+
13+
class TestRegex(unittest.TestCase):
14+
15+
def assertMatch(self, string, expected):
16+
match = re.match(regex, string)
17+
self.assertIsNotNone(match)
18+
19+
# Hack to test message filtering.
20+
actual = match.groupdict()
21+
if 'message' in actual:
22+
actual['message'] = _filter_message(actual['message'])
23+
24+
self.assertEqual(actual, expected)
25+
26+
def assertNoMatch(self, string):
27+
self.assertIsNone(re.match(regex, string))
28+
29+
def test_no_errors(self):
30+
self.assertNoMatch('No syntax errors detected in - ')
31+
self.assertNoMatch('No syntax errors detected in - file.php')
32+
self.assertNoMatch('No syntax errors detected in - /path/to/file.php')
33+
self.assertNoMatch('No syntax errors detected in Standard input code')
34+
35+
def test_errors(self):
36+
self.assertMatch(
37+
'Parse error: syntax error, unexpected \'$this\' (T_VARIABLE) in - on line 14', {
38+
'error': 'Parse',
39+
'line': '14',
40+
'message': 'syntax error, unexpected \'$this\' (T_VARIABLE)',
41+
'near': '$this'
42+
})
43+
44+
self.assertMatch(
45+
'Parse error: syntax error, unexpected end of file in - on line 23', {
46+
'error': 'Parse',
47+
'line': '23',
48+
'message': 'syntax error, unexpected end of file',
49+
'near': None
50+
})
51+
52+
def test_issue_29(self):
53+
self.assertMatch(
54+
'Parse error: syntax error, unexpected \'endwhile\' (T_ENDWHILE), expecting end of file in Standard input code on line 16', {
55+
'error': 'Parse',
56+
'line': '16',
57+
'message': 'syntax error, unexpected \'endwhile\' (T_ENDWHILE), expecting end of file',
58+
'near': 'endwhile'
59+
})
60+
61+
self.assertMatch(
62+
'Parse error: parse error in - on line 16', {
63+
'error': 'Parse',
64+
'line': '16',
65+
'message': 'parse error',
66+
'near': None
67+
})

Diff for: unittesting.json

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"tests_dir" : "tests",
3+
"pattern" : "test*.py",
4+
"async": false,
5+
"deferred": true,
6+
"verbosity": 2,
7+
"capture_console": true,
8+
"output": null
9+
}

0 commit comments

Comments
 (0)