Skip to content

Commit c607c3f

Browse files
committed
feat(robotlangserver): Create undefined keywords in the same file
1 parent b34c8bf commit c607c3f

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

robotcode/language_server/robotframework/parts/code_action_fixes.py

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,17 @@
3636

3737

3838
KEYWORD_WITH_ARGS_TEMPLATE = Template(
39-
"""\n
39+
"""\
4040
${name}
4141
[Arguments] ${args}
42-
Fail Not implemented
42+
Fail
4343
"""
4444
)
4545

4646
KEYWORD_TEMPLATE = Template(
47-
"""\n
47+
"""\
4848
${name}
49-
Fail Not implemented
49+
Fail
5050
"""
5151
)
5252

@@ -117,6 +117,7 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
117117
TestTemplate,
118118
)
119119
from robot.utils.escaping import split_from_equals
120+
from robot.variables.search import contains_variable
120121

121122
document = await self.parent.documents.get(document_uri)
122123
if document is None:
@@ -142,7 +143,7 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
142143

143144
for t in node.get_tokens(RobotToken.ARGUMENT):
144145
name, value = split_from_equals(cast(Token, t).value)
145-
if value is not None:
146+
if value is not None and not contains_variable(name, "$@&%"):
146147
arguments.append(f"${{{name}}}")
147148
else:
148149
arguments.append(f"${{arg{len(arguments)+1}}}")
@@ -159,10 +160,24 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
159160
if keyword_section is not None:
160161
node_range = range_from_node(keyword_section)
161162

162-
insert_range = Range(node_range.end, node_range.end)
163+
insert_pos = Position(node_range.end.line + 1, 0)
164+
insert_range = Range(insert_pos, insert_pos)
165+
166+
insert_text = f"\n{insert_text}"
163167
else:
164-
insert_text = f"\n\n\n*** Keywords ***\n{insert_text}"
165-
doc_pos = Position(len(document.get_lines()), 0)
168+
if namespace.languages is None or not namespace.languages.languages:
169+
keywords_text = "Keywords"
170+
else:
171+
keywords_text = namespace.languages.languages[-1].keywords_header
172+
173+
insert_text = f"\n\n*** {keywords_text} ***\n{insert_text}"
174+
175+
lines = document.get_lines()
176+
end_line = len(lines) - 1
177+
while end_line >= 0 and not lines[end_line].strip():
178+
end_line -= 1
179+
doc_pos = Position(end_line + 1, 0)
180+
166181
insert_range = Range(doc_pos, doc_pos)
167182

168183
we = WorkspaceEdit(
@@ -176,3 +191,10 @@ async def create_keyword(self, document_uri: DocumentUri, range: Range, context:
176191
)
177192

178193
await self.parent.workspace.apply_edit(we, "Rename Keyword")
194+
195+
lines = insert_text.rstrip().splitlines()
196+
insert_range.start.line += len(lines) - 1
197+
insert_range.start.character = 4
198+
insert_range.end = Position(insert_range.start.line, insert_range.start.character)
199+
insert_range.end.character += len(lines[-1])
200+
await self.parent.window.show_document(str(document.uri), take_focus=True, selection=insert_range)

0 commit comments

Comments
 (0)