From 8cfc3db7c6ab45258d1d21587870a25cd9242265 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Tue, 22 Mar 2022 13:56:50 +0300 Subject: [PATCH 1/3] CheckDeclarations: don't add environment for checked top-level module --- src/fsharp/CheckDeclarations.fs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index 7378c62a142..495ab5476a4 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -233,13 +233,16 @@ let AddLocalSubModule g amap m env (modul: ModuleOrNamespace) = eNameResEnv = AddModuleOrNamespaceRefToNameEnv g amap m false env.eAccessRights env.eNameResEnv (mkLocalModRef modul) eUngeneralizableItems = addFreeItemOfModuleTy modul.ModuleOrNamespaceType env.eUngeneralizableItems } env - + /// Add a "module X = ..." definition to the TcEnv and report it to the sink let AddLocalSubModuleAndReport tcSink scopem g amap m env (modul: ModuleOrNamespace) = - let env = AddLocalSubModule g amap m env modul - CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights) + let env = AddLocalSubModule g amap m env modul + if not (equals scopem m) then + // Don't report another environment for top-level module at its own range, + // so it doesn't overwrite inner environment used by features like code completion. + CallEnvSink tcSink (scopem, env.NameEnv, env.eAccessRights) env - + /// Given an inferred module type, place that inside a namespace path implied by a "namespace X.Y.Z" definition let BuildRootModuleType enclosingNamespacePath (cpath: CompilationPath) mtyp = (enclosingNamespacePath, (cpath, (mtyp, []))) From dc475f02e9e89c410160b7082177de48fe89b7db Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Tue, 22 Mar 2022 16:11:39 +0300 Subject: [PATCH 2/3] Remove test as requested by comment --- .../Tests.LanguageService.Completion.fs | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs index c59602db4cd..83f3a87487c 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs @@ -978,48 +978,6 @@ for i in 0..a."] printfn "%s" (String.concat "\r\n" code) AssertCtrlSpaceCompleteContains code marker should ["abs"] - [] - [] - member public this.``Records.WRONG.MissingBindings``() = - // this test should be removed after fixing 279738 - let prologue = - [ - "type R = {AAA : int; BBB : bool}" - ] - let useCases = - [ - ["let _ = {A = 1; _; }"], "; _;", ["AAA"; "BBB"] - ["let _ = {A = 1; _=; }"], " _=;", ["AAA"; "BBB"] - ] - - for (code, marker, shouldNot) in useCases do - let code = prologue @ code - printfn "running:" - printfn "%s" (String.concat "\r\n" code) - AssertCtrlSpaceCompleteContains code marker [] shouldNot - - - - [] - [] - member public this.``Records.WRONG.IncorrectNameResEnv``() = - // this test should be removed after fixing 279738 - let prologue = - [ - "type R = {AAA : int; BBB : bool; CCC : int}" - ] - let useCases = - [ - ["let _ = {A}"], "_ = {A", ["AAA"; "BBB"; "CCC"] - ["let _ = {AAA = 1; }"], "_ = {AAA = 1;", ["AAA"; "BBB"; "CCC"] - ] - - for (code, marker, shouldNot) in useCases do - let code = prologue @ code - printfn "running:" - printfn "%s" (String.concat "\r\n" code) - AssertCtrlSpaceCompleteContains code marker [] shouldNot - [] [] member public this.``Records.WRONG.ErrorsInFirstBinding``() = From bd9f7004a5b8725bbc4dc7cfdb72f3520290837f Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 23 Mar 2022 16:27:00 +0300 Subject: [PATCH 3/3] Add test --- .../FSharp.Compiler.Service.Tests.fsproj | 3 +++ tests/service/CompletionTests.fs | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 tests/service/CompletionTests.fs diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj index 02bb8e64750..3c23e512471 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -67,6 +67,9 @@ PatternMatchCompilationTests.fs + + CompletionTests.fs + ScriptOptionsTests.fs diff --git a/tests/service/CompletionTests.fs b/tests/service/CompletionTests.fs new file mode 100644 index 00000000000..432633dc16e --- /dev/null +++ b/tests/service/CompletionTests.fs @@ -0,0 +1,18 @@ +module FSharp.Compiler.Service.Tests.CompletionTests + +open FSharp.Compiler.EditorServices +open FsUnit +open NUnit.Framework + +[] +let ``Expr - record - field 01 - anon module`` () = + let parseResults, checkResults = getParseAndCheckResults """ +type Record = { Field: int} + +{ Fi } +""" + let lineText = "{ Fi }" + let plid = QuickParse.GetPartialLongNameEx(lineText, 3) + let info = checkResults.GetDeclarationListInfo(Some parseResults, 4, lineText, plid) + + info.Items |> Array.exists (fun item -> item.Name = "Field") |> shouldEqual true