diff --git a/src/LanguageServer/Impl/Completion/CompletionItemSource.cs b/src/LanguageServer/Impl/Completion/CompletionItemSource.cs index f202be5c4..60e43e7a2 100644 --- a/src/LanguageServer/Impl/Completion/CompletionItemSource.cs +++ b/src/LanguageServer/Impl/Completion/CompletionItemSource.cs @@ -28,13 +28,14 @@ internal class CompletionItemSource { public static readonly CompletionItem Star = CreateCompletionItem("*", CompletionItemKind.Keyword); private readonly IDocumentationSource _docSource; - private readonly ServerSettings.PythonCompletionOptions _options; public CompletionItemSource(IDocumentationSource docSource, ServerSettings.PythonCompletionOptions options) { _docSource = docSource; - _options = options; + Options = options; } + public ServerSettings.PythonCompletionOptions Options { get; set; } + public CompletionItem CreateCompletionItem(string text, IMember member, IPythonType self = null, string label = null) => CreateCompletionItem(text, ToCompletionItemKind(member?.MemberType ?? PythonMemberType.Class), member, self, label); @@ -42,7 +43,8 @@ public CompletionItemEx CreateCompletionItem(string text, CompletionItemKind kin var t = member?.GetPythonType(); var docFormat = _docSource.DocumentationFormat; - if (_options.addBrackets && (kind == CompletionItemKind.Constructor || kind == CompletionItemKind.Function || kind == CompletionItemKind.Method)) { + if (Options.addBrackets && (kind == CompletionItemKind.Constructor || kind == CompletionItemKind.Function || kind == CompletionItemKind.Method)) { + label = text; text += "($0)"; docFormat = InsertTextFormat.Snippet; } diff --git a/src/LanguageServer/Impl/Completion/CompletionSource.cs b/src/LanguageServer/Impl/Completion/CompletionSource.cs index 7f635c5c3..7b9d51cf4 100644 --- a/src/LanguageServer/Impl/Completion/CompletionSource.cs +++ b/src/LanguageServer/Impl/Completion/CompletionSource.cs @@ -29,6 +29,11 @@ public CompletionSource(IDocumentationSource docSource, ServerSettings.PythonCom _itemSource = new CompletionItemSource(docSource, completionSettings); } + public ServerSettings.PythonCompletionOptions Options { + get => _itemSource.Options; + set => _itemSource.Options = value; + } + public CompletionResult GetCompletions(IDocumentAnalysis analysis, SourceLocation location) { if(analysis.Document.ModuleType != ModuleType.User) { return CompletionResult.Empty; diff --git a/src/LanguageServer/Impl/Completion/ExpressionCompletion.cs b/src/LanguageServer/Impl/Completion/ExpressionCompletion.cs index d95d8366d..a199acae7 100644 --- a/src/LanguageServer/Impl/Completion/ExpressionCompletion.cs +++ b/src/LanguageServer/Impl/Completion/ExpressionCompletion.cs @@ -76,6 +76,7 @@ private static IEnumerable GetClassItems(IPythonClassType cls, E if (m is IVariable v && v.Source != VariableSource.Declaration) { continue; } + // If this is class member completion, unmangle private member names. var unmangledName = cls.UnmangleMemberName(t); if (!string.IsNullOrEmpty(unmangledName)) { diff --git a/src/LanguageServer/Impl/Implementation/Server.cs b/src/LanguageServer/Impl/Implementation/Server.cs index 39b1720d4..61324ece6 100644 --- a/src/LanguageServer/Impl/Implementation/Server.cs +++ b/src/LanguageServer/Impl/Implementation/Server.cs @@ -209,6 +209,7 @@ private bool HandleConfigurationChanges(ServerSettings newSettings) { Settings = newSettings; _symbolHierarchyMaxSymbols = Settings.analysis.symbolsHierarchyMaxSymbols; + _completionSource.Options = Settings.completion; if (oldSettings == null) { return true; diff --git a/src/LanguageServer/Test/CompletionTests.cs b/src/LanguageServer/Test/CompletionTests.cs index 93eb1e189..8b0416bb2 100644 --- a/src/LanguageServer/Test/CompletionTests.cs +++ b/src/LanguageServer/Test/CompletionTests.cs @@ -1194,5 +1194,25 @@ def test(x: Foo = func()): var comps = cs.GetCompletions(analysis, new SourceLocation(13, 7)); comps.Should().HaveLabels("name", "z"); } + + [TestMethod, Priority(0)] + public async Task AddBrackets() { + const string code = @"prin"; + var analysis = await GetAnalysisAsync(code, PythonVersions.LatestAvailable3X); + + ServerSettings.completion.addBrackets = true; + var cs = new CompletionSource(new PlainTextDocumentationSource(), ServerSettings.completion); + + var comps = cs.GetCompletions(analysis, new SourceLocation(1, 5)); + var print = comps.Completions.FirstOrDefault(x => x.label == "print"); + print.Should().NotBeNull(); + print.insertText.Should().Be("print($0)"); + + cs.Options.addBrackets = false; + comps = cs.GetCompletions(analysis, new SourceLocation(1, 5)); + print = comps.Completions.FirstOrDefault(x => x.label == "print"); + print.Should().NotBeNull(); + print.insertText.Should().Be("print"); + } } }