@@ -20,11 +20,59 @@ def run(self, edit, **args):
2020
2121 if inputs ["scope" ] == "Class method" :
2222
23- view .replace (edit , selection , "this." + function_name + parameters )
24- region_class = Util .get_region_scope_first_match (view , scope , selection , 'meta.class.js' )["region" ]
25- new_text = Util .replace_with_tab (view , selection , ("\t \n " if not Util .prev_line_is_empty (view , sublime .Region (region_class .end (), region_class .end ())) else "" )+ "\t " + function_name + " " + parameters + " {\n \t " , "\n \t }\n " )
23+ flow_cli = "flow"
24+ is_from_bin = True
25+ chdir = ""
26+ use_node = True
27+ bin_path = ""
28+
29+ settings = get_project_settings ()
30+ if settings and settings ["project_settings" ]["flow_cli_custom_path" ]:
31+ flow_cli = os .path .basename (settings ["project_settings" ]["flow_cli_custom_path" ])
32+ bin_path = os .path .dirname (settings ["project_settings" ]["flow_cli_custom_path" ])
33+ is_from_bin = False
34+ chdir = settings ["project_dir_name" ]
35+ use_node = False
36+
37+ node = NodeJS (check_local = True )
38+
39+ result = node .execute_check_output (
40+ flow_cli ,
41+ [
42+ 'ast' ,
43+ '--from' , 'sublime_text'
44+ ],
45+ is_from_bin = is_from_bin ,
46+ use_fp_temp = True ,
47+ fp_temp_contents = view .substr (sublime .Region (0 , view .size ())),
48+ is_output_json = True ,
49+ chdir = chdir ,
50+ bin_path = bin_path ,
51+ use_node = use_node
52+ )
53+
54+ if result [0 ]:
55+ if "body" in result [1 ]:
56+ body = result [1 ]["body" ]
57+ items = Util .nested_lookup ("type" , ["ClassBody" ], body )
58+ last_block_statement = None
59+ last_item = None
60+ region = None
61+
62+ for item in items :
63+ region = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
64+ if region .contains (selection ):
65+ prev_line_is_empty = Util .prev_line_is_empty (view , sublime .Region (region .end (), region .end ()))
66+ space = Util .get_whitespace_from_line_begin (view , selection )
67+ space_before = ("\n \t " if not prev_line_is_empty else "\t " )
68+ space_after = "\n \n "
69+ new_text = Util .replace_with_tab (view , selection , space_before + function_name + " " + parameters + " {\n " , "\n \t }" + space_after , add_to_each_line_before = "\t " , lstrip = True )
70+
71+ view .insert (edit , region .end () - 1 , new_text )
72+ view .erase (edit , selection )
73+ view .insert (edit , selection .begin (), "this." + function_name + parameters )
2674
27- view . insert ( edit , region_class . end () - 1 , new_text )
75+ break
2876
2977 elif inputs ["scope" ] == "Current scope" :
3078
@@ -68,9 +116,9 @@ def run(self, edit, **args):
68116 region = None
69117
70118 for item in items :
71- region = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
72- if region .contains (selection ):
73- last_block_statement = region
119+ r = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
120+ if r .contains (selection ):
121+ last_block_statement = r
74122 last_item = item
75123
76124 if last_block_statement :
@@ -79,6 +127,10 @@ def run(self, edit, **args):
79127 if r .contains (selection ):
80128 region = r
81129 break
130+
131+ if not region :
132+ region = last_block_statement
133+
82134 else :
83135 for item in body :
84136 r = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
@@ -88,18 +140,18 @@ def run(self, edit, **args):
88140
89141 if region :
90142 prev_line_is_empty = Util .prev_line_is_empty (view , selection )
91- next_line_is_empty = Util .next_line_is_empty (view , selection )
92143 space = Util .get_whitespace_from_line_begin (view , selection )
93- space_before = ("\n " + space if not prev_line_is_empty else "" )
94- space_after = "\n " + space
144+ space_before = ("\n " + space if not prev_line_is_empty else ( space if view . substr ( region ). startswith ( "{" ) else "" ) )
145+ space_after = (( "\n " + space if not view . substr ( region ). startswith ( "{" ) else " \n " ) if not prev_line_is_empty else " \n " + space )
95146 new_text = Util .replace_with_tab (view , selection , space_before + "function " + function_name + " " + parameters + " {\n " + space , "\n " + space + "}" + space_after )
147+ contains_this = Util .region_contains_scope (view , selection , "variable.language.this.js" )
96148
97149 view .erase (edit , selection )
98- if Util . region_contains_scope ( view , selection , "variable.language.this.js" ) :
150+ if contains_this :
99151 view .insert (edit , selection .begin (), function_name + ".call(this" + (", " + parameters [1 :- 1 ] if parameters [1 :- 1 ].strip () else "" )+ ")" )
100152 else :
101153 view .insert (edit , selection .begin (), function_name + parameters )
102- view .insert (edit , region .begin () + ( 1 if view .substr (region . begin ()) == "{" else 0 ), new_text )
154+ view .insert (edit , ( view . full_line ( region .begin ()). end () if view .substr (region ). startswith ( "{" ) else region . begin () ), new_text )
103155
104156 elif inputs ["scope" ] == "Global scope" :
105157
@@ -137,15 +189,18 @@ def run(self, edit, **args):
137189 if result [0 ]:
138190 if "body" in result [1 ]:
139191 body = result [1 ]["body" ]
140- items = Util .nested_lookup ("type" , ["BlockStatement" ], body , return_parent = True )[:: - 1 ]
192+ items = Util .nested_lookup ("type" , ["ClassBody" , " BlockStatement" ], body , return_parent = True )
141193 region = None
142194
143- for item in items :
144- r = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
145- if r .contains (selection ):
146- region = r
147- break
148- else :
195+ if items :
196+ items_sorted = sorted (items , key = lambda item : int (item ["range" ][0 ]))
197+ for item in items_sorted :
198+ r = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
199+ if r .contains (selection ):
200+ region = r
201+ break
202+
203+ if not region :
149204 for item in body :
150205 r = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
151206 if r .contains (selection ) or r .intersects (selection ):
@@ -155,17 +210,16 @@ def run(self, edit, **args):
155210 if region :
156211
157212 prev_line_is_empty = Util .prev_line_is_empty (view , region )
158- next_line_is_empty = Util .next_line_is_empty (view , region )
159213 space_before = ("\n " if not prev_line_is_empty else "" )
160-
161214 new_text = Util .replace_with_tab (view , selection , space_before + "function " + function_name + " " + parameters + " {\n " , "\n }\n \n " , lstrip = True )
215+ contains_this = Util .region_contains_scope (view , selection , "variable.language.this.js" )
162216
163- view .erase (edit , selection )
164- view .insert (edit , region .begin (), new_text )
165- if Util .region_contains_scope (view , selection , "variable.language.this.js" ):
166- view .insert (edit , selection .begin () + len (Util .convert_tabs_using_tab_size (view , new_text )), function_name + ".call(this" + (", " + parameters [1 :- 1 ] if parameters [1 :- 1 ].strip () else "" )+ ")" )
217+ view .erase (edit , selection )
218+ if contains_this :
219+ view .insert (edit , selection .begin (), function_name + ".call(this" + (", " + parameters [1 :- 1 ] if parameters [1 :- 1 ].strip () else "" )+ ")" )
167220 else :
168- view .insert (edit , selection .begin () + len (Util .convert_tabs_using_tab_size (view , new_text )), function_name + parameters )
221+ view .insert (edit , selection .begin (), function_name + parameters )
222+ view .insert (edit , region .begin (), new_text )
169223
170224 windowViewManager .close (view .id ())
171225
0 commit comments