Skip to content
This repository was archived by the owner on Apr 27, 2026. It is now read-only.

Commit 3ddc440

Browse files
committed
fix a magic command completion case
1 parent 2fe8d8d commit 3ddc440

3 files changed

Lines changed: 53 additions & 13 deletions

File tree

src/Microsoft.DotNet.Interactive.CSharp/CSharpKernel.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ This Kernel can compile and execute C# code and display the results.
9898

9999
public ScriptState ScriptState { get; private set; }
100100

101-
private Task<bool> IsCompleteSubmissionAsync(string code)
101+
private bool IsCompleteSubmissionAsync(string code)
102102
{
103103
var syntaxTree = SyntaxFactory.ParseSyntaxTree(code, _csharpParseOptions);
104-
return Task.FromResult(SyntaxFactory.IsCompleteSubmission(syntaxTree));
104+
return SyntaxFactory.IsCompleteSubmission(syntaxTree);
105105
}
106106

107107
Task IKernelCommandHandler<RequestValueInfos>.HandleAsync(RequestValueInfos command, KernelInvocationContext context)
@@ -257,7 +257,7 @@ async Task IKernelCommandHandler<SubmitCode>.HandleAsync(SubmitCode submitCode,
257257
context.Publish(codeSubmissionReceived);
258258

259259
var code = submitCode.Code;
260-
var isComplete = await IsCompleteSubmissionAsync(submitCode.Code);
260+
var isComplete = IsCompleteSubmissionAsync(submitCode.Code);
261261

262262
if (isComplete)
263263
{

src/Microsoft.DotNet.Interactive.Parsing.Tests/PolyglotSyntaxParserTests.Completions.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,34 @@ public async Task produce_completions_for_parameter_names(string markupCode)
8181

8282
var completions = await node.GetCompletionsAtPositionAsync(position.Value);
8383

84-
completions.Select(c => c.DisplayText).Should().Contain(["--kernel-name"]);
84+
completions.Select(c => c.DisplayText).Should().Contain("--kernel-name");
85+
}
86+
87+
[Theory]
88+
[InlineData("#!connect jupyter --kernel-name asdf $$")]
89+
[InlineData("#!connect jupyter --kernel-name @input $$")]
90+
[InlineData("""#!connect jupyter --kernel-name @input:{"saveAs":"xyz"} $$""")]
91+
[InlineData("#!connect jupyter $$ --kernel-name")]
92+
public async Task produce_completions_for_parameter_names_2(string markupCode)
93+
{
94+
MarkupTestFile.GetPosition(markupCode, out var code, out var position);
95+
96+
var tree = Parse(code, PolyglotParserConfigurationTests.GetDefaultConfiguration());
97+
98+
var node = tree.RootNode.FindNode(position.Value)
99+
.AncestorsAndSelf()
100+
.OfType<DirectiveNode>()
101+
.First();
102+
103+
var completions = await node.GetCompletionsAtPositionAsync(position.Value);
104+
105+
completions.Select(c => c.DisplayText).Should().Contain([
106+
"--url",
107+
"--kernel-spec",
108+
"--init-script",
109+
"--conda-env",
110+
"--bearer"
111+
]);
85112
}
86113

87114
[Fact]

src/Microsoft.DotNet.Interactive/Parsing/DirectiveNode.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -568,20 +568,33 @@ public async Task<IReadOnlyList<CompletionItem>> GetCompletionsAtPositionAsync(i
568568

569569
case DirectiveParameterValueNode directiveParameterValueNode:
570570
{
571-
if (directiveParameterValueNode.Parent is DirectiveParameterNode pn &&
572-
currentToken is not { Kind: TokenKind.Whitespace } &&
573-
pn.TryGetParameter(out var parameter))
571+
if (directiveParameterValueNode.Parent is DirectiveParameterNode pn)
574572
{
575-
var completions = await parameter.GetValueCompletionsAsync();
576-
return completions;
573+
if (currentToken is not { Kind: TokenKind.Whitespace })
574+
{
575+
if (pn.TryGetParameter(out var parameter))
576+
{
577+
var completions = await parameter.GetValueCompletionsAsync();
578+
return completions;
579+
}
580+
}
581+
else
582+
{
583+
}
577584
}
578585

579586
if (TryGetDirective(out var directive))
580587
{
581-
// This could also be a partial subcommand, so...
582-
var completions = await directive.GetChildCompletionsAsync();
583-
584-
return FilterOutCompletionsWithMaxOccurrencesReached(completions);
588+
if (TryGetSubcommand(directive, out var subcommand))
589+
{
590+
var completions = await subcommand.GetChildCompletionsAsync();
591+
return FilterOutCompletionsWithMaxOccurrencesReached(completions);
592+
}
593+
else
594+
{
595+
var completions = await directive.GetChildCompletionsAsync();
596+
return FilterOutCompletionsWithMaxOccurrencesReached(completions);
597+
}
585598
}
586599
}
587600

0 commit comments

Comments
 (0)