Files
sublime-text-3/Packages/User/linters/eclim.py

70 lines
2.1 KiB
Python

import json
import os
import tempfile
from lint import Linter
from lint.util import find
class Eclim(Linter):
language = 'java'
cmd = ('eclim', '-command', 'java_src_update')
regex = r'.'
defaults = {
'disable': True,
}
def run(self, cmd, code):
project = find(os.path.dirname(self.filename), '.project', True)
if not project:
return
filename = self.filename.replace(project, '', 1).lstrip(os.sep)
project = os.path.basename(project)
# can't stdin or temp use file - hack time?
# this *could* become a tmp directory
# but I'd need to know all files to copy
# from the source project
tmp = tempfile.mktemp()
os.rename(self.filename, tmp)
# at least we get some inode protection on posix
inode = None
with open(self.filename, 'wb') as f:
f.write(code)
if os.name == 'posix':
inode = os.stat(self.filename).st_ino
try:
cmd = cmd + ('-p', project, '-f', filename, '-v')
output = self.communicate(cmd, '')
finally:
if inode is not None:
new_inode = os.stat(self.filename).st_ino
if new_inode != inode:
# they saved over our tmp file, bail
return output
os.unlink(self.filename)
os.rename(tmp, self.filename)
return output
def find_errors(self, output):
try:
obj = json.loads(output)
for item in obj:
# TODO: highlight warnings in a different color?
# warning = item['warning']
line, col = item['line']-1, item['column']-1
message = item['message']
yield True, line, col, message, None
except Exception:
error = 'eclim error'
if 'Connection refused' in output:
error += ' Connection Refused'
yield True, 0, None, error, None
# maybe do this on line one?
# yield {"eclim_exception": str(e)}