fix(completion): scan nested commands in unfinished braced args
Make the completion parser inspect nested command segments when an unfinished braced argument is the active context, instead of treating the entire braced body as opaque. This resolves cases where inner commands (e.g. command substitutions) were ignored and improves suggestion accuracy. Tests were added to cover nested commands inside braced conditions and to ensure closed braced arguments do not change context. Also add Linux-specific launch and task configurations to IDE settings to simplify local extension development and debugging. - Recursively scan inner context when a braced body is unfinished - Add tests for nested commands and closed-brace behavior - Add Linux launch/task entries for easier development
This commit is contained in:
Vendored
+26
@@ -17,6 +17,19 @@
|
||||
],
|
||||
"cwd": "${env:TEMP}/nx-post-support-vscode-debug",
|
||||
"outFiles": ["${env:TEMP}/nx-post-support-vscode-debug/dist/**/*.js"],
|
||||
"linux": {
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"${workspaceFolder}",
|
||||
"${workspaceFolder}/test/test.tcl"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"outFiles": ["${workspaceFolder}/dist/**/*.js"],
|
||||
"resolveSourceMapLocations": [
|
||||
"${workspaceFolder}/dist/**/*.js",
|
||||
"!**/node_modules/**"
|
||||
]
|
||||
},
|
||||
"sourceMaps": true,
|
||||
"resolveSourceMapLocations": [
|
||||
"${env:TEMP}/nx-post-support-vscode-debug/dist/**/*.js",
|
||||
@@ -50,6 +63,19 @@
|
||||
],
|
||||
"cwd": "${env:TEMP}/nx-post-support-vscode-debug",
|
||||
"outFiles": ["${env:TEMP}/nx-post-support-vscode-debug/dist/**/*.js"],
|
||||
"linux": {
|
||||
"args": [
|
||||
"--extensionDevelopmentPath=${workspaceFolder}",
|
||||
"${workspaceFolder}",
|
||||
"${workspaceFolder}/test/test.tcl"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"outFiles": ["${workspaceFolder}/dist/**/*.js"],
|
||||
"resolveSourceMapLocations": [
|
||||
"${workspaceFolder}/dist/**/*.js",
|
||||
"!**/node_modules/**"
|
||||
]
|
||||
},
|
||||
"sourceMaps": true,
|
||||
"resolveSourceMapLocations": [
|
||||
"${env:TEMP}/nx-post-support-vscode-debug/dist/**/*.js",
|
||||
|
||||
Vendored
+7
@@ -15,6 +15,13 @@
|
||||
"${workspaceFolder}",
|
||||
"${env:TEMP}\\nx-post-support-vscode-debug"
|
||||
],
|
||||
"linux": {
|
||||
"command": "npm",
|
||||
"args": ["run", "compile:debug"],
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
}
|
||||
},
|
||||
"problemMatcher": [],
|
||||
"presentation": {
|
||||
"reveal": "always",
|
||||
|
||||
@@ -1009,7 +1009,13 @@ def _current_command_segment(line_prefix: str) -> str:
|
||||
starts.append(brace_starts[-1] + 1)
|
||||
if bracket_starts:
|
||||
starts.append(bracket_starts[-1] + 1)
|
||||
return line_prefix[max(starts) :]
|
||||
start = max(starts)
|
||||
if brace_starts and start == brace_starts[-1] + 1:
|
||||
# An unfinished braced body or expression can itself contain commands
|
||||
# (for example, ``if {[string compare ...``). Scan that inner context
|
||||
# independently, while keeping completed braced arguments opaque.
|
||||
return _current_command_segment(line_prefix[start:])
|
||||
return line_prefix[start:]
|
||||
|
||||
|
||||
def _tokenize_command_segment(segment: str) -> list[str]:
|
||||
|
||||
@@ -204,6 +204,29 @@ def test_string_completion_handles_nested_commands_and_is_values():
|
||||
}
|
||||
|
||||
|
||||
def test_string_completion_inside_braced_conditions_and_bodies():
|
||||
for prefix in ("if {", "while {", "proc example {} { if {"):
|
||||
subcommands = _argument_completion_labels(prefix + "[string ")
|
||||
assert subcommands is not None
|
||||
assert {"compare", "equal", "is"} <= subcommands
|
||||
assert _argument_completion_labels(prefix + "[string compare -") == {
|
||||
"-length", "-nocase"
|
||||
}
|
||||
assert _argument_completion_labels(
|
||||
prefix + "[string compare -nocase "
|
||||
) == {"-length"}
|
||||
|
||||
|
||||
def test_closed_braced_arguments_do_not_change_completion_context():
|
||||
assert _argument_completion_labels("puts {[string compare }") is None
|
||||
assert _argument_completion_labels(
|
||||
"if {[string equal a b]} {string compare "
|
||||
) == {"-length", "-nocase"}
|
||||
assert _argument_completion_labels(
|
||||
"if {[string equal a b] && [string is integer "
|
||||
) == {"-failindex", "-strict"}
|
||||
|
||||
|
||||
def test_dict_array_namespace_file_and_info_subcommands():
|
||||
dict_items = _argument_completion_labels("dict ")
|
||||
assert dict_items is not None
|
||||
|
||||
Reference in New Issue
Block a user