@@ -20,11 +20,59 @@ def run(self, edit, **args):
20
20
21
21
if inputs ["scope" ] == "Class method" :
22
22
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 )
26
74
27
- view . insert ( edit , region_class . end () - 1 , new_text )
75
+ break
28
76
29
77
elif inputs ["scope" ] == "Current scope" :
30
78
@@ -68,9 +116,9 @@ def run(self, edit, **args):
68
116
region = None
69
117
70
118
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
74
122
last_item = item
75
123
76
124
if last_block_statement :
@@ -79,6 +127,10 @@ def run(self, edit, **args):
79
127
if r .contains (selection ):
80
128
region = r
81
129
break
130
+
131
+ if not region :
132
+ region = last_block_statement
133
+
82
134
else :
83
135
for item in body :
84
136
r = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
@@ -88,18 +140,18 @@ def run(self, edit, **args):
88
140
89
141
if region :
90
142
prev_line_is_empty = Util .prev_line_is_empty (view , selection )
91
- next_line_is_empty = Util .next_line_is_empty (view , selection )
92
143
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 )
95
146
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" )
96
148
97
149
view .erase (edit , selection )
98
- if Util . region_contains_scope ( view , selection , "variable.language.this.js" ) :
150
+ if contains_this :
99
151
view .insert (edit , selection .begin (), function_name + ".call(this" + (", " + parameters [1 :- 1 ] if parameters [1 :- 1 ].strip () else "" )+ ")" )
100
152
else :
101
153
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 )
103
155
104
156
elif inputs ["scope" ] == "Global scope" :
105
157
@@ -137,15 +189,18 @@ def run(self, edit, **args):
137
189
if result [0 ]:
138
190
if "body" in result [1 ]:
139
191
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 )
141
193
region = None
142
194
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 :
149
204
for item in body :
150
205
r = sublime .Region (int (item ["range" ][0 ]), int (item ["range" ][1 ]))
151
206
if r .contains (selection ) or r .intersects (selection ):
@@ -155,17 +210,16 @@ def run(self, edit, **args):
155
210
if region :
156
211
157
212
prev_line_is_empty = Util .prev_line_is_empty (view , region )
158
- next_line_is_empty = Util .next_line_is_empty (view , region )
159
213
space_before = ("\n " if not prev_line_is_empty else "" )
160
-
161
214
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" )
162
216
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 "" )+ ")" )
167
220
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 )
169
223
170
224
windowViewManager .close (view .id ())
171
225
0 commit comments