Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 62 additions & 17 deletions subclim_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,14 +201,23 @@ def check_eclim(view=None):

def get_context(view):
s = view.settings()
project = s.get('subclim.project', None)
relative_path = s.get('subclim.project_relative_path', None)
if project is None:
project, relative_path = eclim.get_context(view.file_name())
if project is not None:
s.set('subclim.project', project)
project = s.get('subclim.view.project', None)
relative_path = s.get('subclim.view.project_relative_path', None)
if project is None or relative_path is None:
p, relative_path = eclim.get_context(view.file_name())

if project is None:
project = s.get('subclim_eclipse_project_name', None) or p

if relative_path is None:
root_path = s.get('subclim_eclipse_root_path', None)
if root_path:
relative_path = os.path.relpath(view.file_name(), root_path)

if project is not None:
s.set('subclim.view.project', project)
if relative_path is not None:
s.set('subclim.project_relative_path', relative_path)
s.set('subclim.view.project_relative_path', relative_path)
return project, relative_path


Expand Down Expand Up @@ -484,10 +493,20 @@ def __init__(self, name, insert=None, type="None"):
self.insert = insert
else:
self.insert = name
if ')' in self.name: # tokenize method params
self.insert = self.name.split(')', 1)[0] + ')'
op = self.insert.index('(') + 1
cp = self.insert.index(')')
args = self.insert[op:cp].split(',')
toks = []
for a in args:
toks.append("${%d:%s}" % (len(toks) + 1, a.strip()))
args = ", ".join(toks)
self.insert = self.insert[:op] + args + self.insert[cp:]
self.type = "None"

def __repr__(self):
return "CompletionProposal: %s %s" % (self.name, self.insert)
return "CompletionProposal: [%s] [%s]" % (self.name, self.insert)


class ManualCompletionRequest(sublime_plugin.TextCommand):
Expand Down Expand Up @@ -526,6 +545,7 @@ def on_query_completions(self, view, prefix, locations):
pos = offset_of_location(view, locations[0])

proposals = self.to_proposals(c_func(project, fn, pos))
proposals.sort(key=lambda x: x.display)
return [(p.display, p.insert) for p in proposals]

def queue_completions(self, view):
Expand Down Expand Up @@ -610,13 +630,18 @@ def __init__(self, *args, **kwargs):

def validation_func(self, view):
syntax = view.settings().get("syntax")
if not syntax:
return None
if "Java.tmLanguage" in syntax:
return eclim.update_java_src
elif "Scala.tmLanguage" in syntax:
return eclim.update_scala_src
else:
return None

def on_activated(self, view):
self.on_post_save(view)

def on_load(self, view):
validation_func = self.validation_func(view)
if validation_func:
Expand Down Expand Up @@ -669,33 +694,47 @@ def on_validation_finished():
tasks.put(async_validate_task)

def visualize(self, view):
views = []
if view.window():
views = [v for v in view.window().views() if v.buffer_id() is view.buffer_id()];
for v in views or [view]:
self._view_visualize(v, view)

def _view_visualize(self, view, first_view):
view.erase_regions('subclim-errors')
view.erase_regions('subclim-warnings')
lines = JavaValidation.line_messages[view.id()]
lines = JavaValidation.line_messages[first_view.id()]

outlines = [view.line(view.text_point(lineno - 1, 0))
for lineno in lines.keys()
if len(list(filter(lambda x: x['error'], lines[lineno]))) > 0]
view.add_regions(
'subclim-errors', outlines, 'keyword', 'dot', JavaValidation.drawType)
'subclim-errors', outlines, 'invalid', 'dot')

outlines = [view.line(view.text_point(lineno - 1, 0))
for lineno in lines.keys()
if len(list(filter(lambda x: x['error'], lines[lineno]))) <= 0]
view.add_regions(
'subclim-warnings', outlines, 'comment', 'dot', JavaValidation.drawType)
'subclim-warnings', outlines, 'comment', 'bookmark')

def on_selection_modified(self, view):
views = [v for v in view.window().views() if v.buffer_id() is view.buffer_id()] if view.window() else None
for v in views or [view]:
if self._view_on_selection_modified(v, view):
return
view.erase_status('subclim')

def _view_on_selection_modified(self, view, first_view):
validation_func = self.validation_func(view)
if validation_func:
line_messages = JavaValidation.line_messages
vid = view.id()
vid = first_view.id()
lineno = view.rowcol(view.sel()[0].end())[0] + 1
if vid in line_messages and lineno in line_messages[vid]:
view.set_status(
'subclim', '; '.join([e['message'] for e in line_messages[vid][lineno]]))
else:
view.erase_status('subclim')
return True
return False


class JavaImportClassUnderCursor(sublime_plugin.TextCommand):
Expand All @@ -710,7 +749,8 @@ def run(self, edit, block=False):
pos = self.view.sel()[0]
word = self.view.word(pos)
offset = offset_of_location(self.view, word.a)
self.view.run_command("save")
if self.view.is_dirty():
self.view.run_command("save")

class_names = []
message = []
Expand All @@ -720,7 +760,10 @@ def async_find_imports_task():
if isinstance(import_result, list):
class_names.extend(import_result)
elif isinstance(import_result, dict):
message.append(import_result['message'])
if import_result['message']:
message.append(import_result['message'])
else:
mesage = ''
elif isinstance(import_result, str):
message.append(import_result)
sublime.set_timeout(on_find_imports_finished, 0)
Expand All @@ -732,7 +775,9 @@ def on_find_imports_finished():
elif len(class_names) > 1:
self.possible_imports = class_names
self.show_import_menu()

elif not message:
sublime.message_dialog("Import likely succeeded with a single option.")
pass
tasks.put(async_find_imports_task)

def call_eclim(self, project, _file, offset):
Expand Down