Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix; add test
  • Loading branch information
ijklam committed Jun 2, 2024
commit 749b57141337dee0bcf1e870db09b0ca78e8440e
20 changes: 10 additions & 10 deletions src/Compiler/Service/ServiceAssemblyContent.fs
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,17 @@ type IAssemblyContentCache =

module AssemblyContent =

let UnresolvedSymbol (nearestRequireQualifiedAccessParent: ShortIdents option) (cleanedIdents: ShortIdents) (fullName: string) ns =
let UnresolvedSymbol (topRequireQualifiedAccessParent: ShortIdents option) (cleanedIdents: ShortIdents) (fullName: string) ns =
let getNamespace (idents: ShortIdents) =
if idents.Length > 1 then Some idents[..idents.Length - 2] else None

// 1. get namespace/module to open from topRequireQualifiedAccessParent
// 2. if the topRequireQualifiedAccessParent is None, use the namespace, as we don't know whether an ident is namespace/module or not
let ns =
nearestRequireQualifiedAccessParent
|> Option.bind getNamespace
topRequireQualifiedAccessParent
|> Option.bind getNamespace
|> Option.orElse ns
|> Option.defaultValue [||]
|> Option.defaultWith (fun _ -> Array.empty)
|> Array.map PrettyNaming.NormalizeIdentifierBackticks

let displayName =
Expand All @@ -143,12 +145,11 @@ module AssemblyContent =
parent.FormatEntityFullName entity
|> Option.map (fun (fullName, cleanIdents) ->
let topRequireQualifiedAccessParent = parent.TopRequiresQualifiedAccess false |> Option.map parent.FixParentModuleSuffix
let nearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess false |> Option.map parent.FixParentModuleSuffix

{ FullName = fullName
CleanedIdents = cleanIdents
Namespace = ns
NearestRequireQualifiedAccessParent = nearestRequireQualifiedAccessParent
NearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess false |> Option.map parent.FixParentModuleSuffix
TopRequireQualifiedAccessParent = topRequireQualifiedAccessParent
AutoOpenParent = parent.AutoOpen |> Option.map parent.FixParentModuleSuffix
Symbol = entity
Expand All @@ -164,12 +165,11 @@ module AssemblyContent =
match entity with
| FSharpSymbolPatterns.Attribute -> EntityKind.Attribute
| _ -> EntityKind.Type
UnresolvedSymbol = UnresolvedSymbol nearestRequireQualifiedAccessParent cleanIdents fullName ns
UnresolvedSymbol = UnresolvedSymbol topRequireQualifiedAccessParent cleanIdents fullName ns
})

let traverseMemberFunctionAndValues ns (parent: Parent) (membersFunctionsAndValues: seq<FSharpMemberOrFunctionOrValue>) =
let topRequireQualifiedAccessParent = parent.TopRequiresQualifiedAccess false |> Option.map parent.FixParentModuleSuffix
let nearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess true |> Option.map parent.FixParentModuleSuffix
let autoOpenParent = parent.AutoOpen |> Option.map parent.FixParentModuleSuffix
membersFunctionsAndValues
|> Seq.filter (fun x -> not x.IsInstanceMember && not x.IsPropertyGetterMethod && not x.IsPropertySetterMethod)
Expand All @@ -179,12 +179,12 @@ module AssemblyContent =
{ FullName = fullName
CleanedIdents = cleanedIdents
Namespace = ns
NearestRequireQualifiedAccessParent = nearestRequireQualifiedAccessParent
NearestRequireQualifiedAccessParent = parent.ThisRequiresQualifiedAccess true |> Option.map parent.FixParentModuleSuffix
TopRequireQualifiedAccessParent = topRequireQualifiedAccessParent
AutoOpenParent = autoOpenParent
Symbol = func
Kind = fun _ -> EntityKind.FunctionOrValue func.IsActivePattern
UnresolvedSymbol = UnresolvedSymbol nearestRequireQualifiedAccessParent cleanedIdents fullName ns }
UnresolvedSymbol = UnresolvedSymbol topRequireQualifiedAccessParent cleanedIdents fullName ns }

[ yield! func.TryGetFullDisplayName()
|> Option.map (fun fullDisplayName ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,88 @@ let ``TopRequireQualifiedAccessParent property should be valid``() =
let actual = source |> getSymbolMap getTopRequireQualifiedAccessParentName

assertAreEqual (expectedResult, actual)


[<Fact>]
let ``Check Unresolved Symbols``() =
let source = """
namespace ``1 2 3``

module Test =
module M1 =
let v1 = 1

module M11 =
let v11 = 1

module M111 =
let v111 = 1

[<RequireQualifiedAccess>]
module M12 =
let v12 = 1

module M121 =
let v121 = 1

[<RequireQualifiedAccess>]
module M1211 =
let v1211 = 1

type A =
static member val B = 0
static member C() = ()
static member (++) s s2 = s + "/" + s2

type B =
abstract D: int -> int

let ``a.b.c`` = "999"

type E = { x: int; y: int }
type F =
| A = 1
| B = 2
type G =
| A of int
| B of string

let (|Is1|_|) x = x = 1
let (++) s s2 = s + "/" + s2
"""

let expectedResult =
[
"1 2 3.Test", "open ``1 2 3`` - Test";
"1 2 3.Test.M1", "open ``1 2 3`` - Test.M1";
"1 2 3.Test.M1.(++)", "open ``1 2 3`` - Test.M1.``(++)``";
"1 2 3.Test.M1.A", "open ``1 2 3`` - Test.M1.A";
"1 2 3.Test.M1.A.(++)", "open ``1 2 3`` - Test.M1.A.``(++)``";
"1 2 3.Test.M1.A.B", "open ``1 2 3`` - Test.M1.A.B";
"1 2 3.Test.M1.A.C", "open ``1 2 3`` - Test.M1.A.C";
"1 2 3.Test.M1.A.op_PlusPlus", "open ``1 2 3`` - Test.M1.A.op_PlusPlus";
"1 2 3.Test.M1.B", "open ``1 2 3`` - Test.M1.B";
"1 2 3.Test.M1.E", "open ``1 2 3`` - Test.M1.E";
"1 2 3.Test.M1.F", "open ``1 2 3`` - Test.M1.F";
"1 2 3.Test.M1.G", "open ``1 2 3`` - Test.M1.G";
"1 2 3.Test.M1.M11", "open ``1 2 3`` - Test.M1.M11";
"1 2 3.Test.M1.M11.M111", "open ``1 2 3`` - Test.M1.M11.M111";
"1 2 3.Test.M1.M11.M111.v111", "open ``1 2 3`` - Test.M1.M11.M111.v111";
"1 2 3.Test.M1.M11.v11", "open ``1 2 3`` - Test.M1.M11.v11";
"1 2 3.Test.M1.M12", "open ``1 2 3`` - Test.M1.M12";
"1 2 3.Test.M1.M12.M121", "open ``1 2 3``.Test.M1 - M12.M121";
"1 2 3.Test.M1.M12.M121.M1211", "open ``1 2 3``.Test.M1 - M12.M121.M1211";
"1 2 3.Test.M1.M12.M121.M1211.v1211", "open ``1 2 3``.Test.M1 - M12.M121.M1211.v1211";
"1 2 3.Test.M1.M12.M121.v121", "open ``1 2 3``.Test.M1 - M12.M121.v121";
"1 2 3.Test.M1.M12.v12", "open ``1 2 3``.Test.M1 - M12.v12";
"1 2 3.Test.M1.``a.b.c``", "open ``1 2 3`` - Test.M1.``a.b.c``";
"1 2 3.Test.M1.op_PlusPlus", "open ``1 2 3`` - Test.M1.op_PlusPlus";
"1 2 3.Test.M1.v1", "open ``1 2 3`` - Test.M1.v1";
]
|> Map.ofList

let actual = source |> getSymbolMap (fun i ->
let ns = i.UnresolvedSymbol.Namespace |> String.concat "."
$"open {ns} - {i.UnresolvedSymbol.DisplayName}")

assertAreEqual (expectedResult, actual)