mirror of
https://github.com/sstent/sublime-text-3.git
synced 2026-01-26 07:01:47 +00:00
70 lines
2.1 KiB
Python
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)}
|