diff --git a/subclim_plugin.py b/subclim_plugin.py index 552b718..5dd8cdc 100644 --- a/subclim_plugin.py +++ b/subclim_plugin.py @@ -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 @@ -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): @@ -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): @@ -610,6 +630,8 @@ 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: @@ -617,6 +639,9 @@ def validation_func(self, view): 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: @@ -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): @@ -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 = [] @@ -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) @@ -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):