81 lines
3.0 KiB
Python
81 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# javascript.py - sublimelint package for checking Javascript files
|
|
|
|
import json
|
|
import re
|
|
import subprocess
|
|
|
|
from base_linter import BaseLinter, INPUT_METHOD_TEMP_FILE
|
|
|
|
CONFIG = {
|
|
'language': 'JavaScript'
|
|
}
|
|
|
|
|
|
class Linter(BaseLinter):
|
|
GJSLINT_RE = re.compile(r'Line (?P<line>\d+),\s*E:(?P<errnum>\d+):\s*(?P<message>.+)')
|
|
|
|
def __init__(self, config):
|
|
super(Linter, self).__init__(config)
|
|
self.linter = None
|
|
|
|
def get_executable(self, view):
|
|
self.linter = view.settings().get('javascript_linter', 'jshint')
|
|
|
|
if (self.linter in ('jshint', 'jslint')):
|
|
return self.get_javascript_engine(view)
|
|
elif (self.linter == 'gjslint'):
|
|
try:
|
|
path = self.get_mapped_executable(view, 'gjslint')
|
|
subprocess.call([path, u'--help'], startupinfo=self.get_startupinfo())
|
|
self.input_method = INPUT_METHOD_TEMP_FILE
|
|
return (True, path, 'using gjslint')
|
|
except OSError:
|
|
return (False, '', 'gjslint cannot be found')
|
|
else:
|
|
return (False, '', '"{0}" is not a valid javascript linter'.format(self.linter))
|
|
|
|
def get_lint_args(self, view, code, filename):
|
|
if (self.linter == 'gjslint'):
|
|
args = []
|
|
gjslint_options = view.settings().get("gjslint_options", [])
|
|
args.extend(gjslint_options)
|
|
args.extend([u'--nobeep', filename])
|
|
return args
|
|
elif (self.linter in ('jshint', 'jslint')):
|
|
return self.get_javascript_args(view, self.linter, code)
|
|
else:
|
|
return []
|
|
|
|
def get_javascript_options(self, view):
|
|
if self.linter == 'jshint':
|
|
rc_options = self.find_file('.jshintrc', view)
|
|
|
|
if rc_options != None:
|
|
rc_options = self.strip_json_comments(rc_options)
|
|
return json.dumps(json.loads(rc_options))
|
|
|
|
def parse_errors(self, view, errors, lines, errorUnderlines, violationUnderlines, warningUnderlines, errorMessages, violationMessages, warningMessages):
|
|
if (self.linter == 'gjslint'):
|
|
ignore = view.settings().get('gjslint_ignore', [])
|
|
|
|
for line in errors.splitlines():
|
|
match = self.GJSLINT_RE.match(line)
|
|
|
|
if match:
|
|
line, errnum, message = match.group('line'), match.group('errnum'), match.group('message')
|
|
|
|
if (int(errnum) not in ignore):
|
|
self.add_message(int(line), lines, message, errorMessages)
|
|
|
|
elif (self.linter in ('jshint', 'jslint')):
|
|
try:
|
|
errors = json.loads(errors.strip() or '[]')
|
|
except ValueError:
|
|
raise ValueError("Error from {0}: {1}".format(self.linter, errors))
|
|
|
|
for error in errors:
|
|
lineno = error['line']
|
|
self.add_message(lineno, lines, error['reason'], errorMessages)
|
|
self.underline_range(view, lineno, error['character'] - 1, errorUnderlines)
|