@@ -47,14 +47,14 @@ module InspectSln =
4747
4848 let private tryLoadSolutionModel ( slnFilePath : string ) =
4949 // use the VS library to parse the solution
50- match SolutionSerializers.GetSerializerByMoniker( slnFilePath) with
51- | null -> Error ( exn $" Unsupported solution file format %s {Path.GetExtension(slnFilePath)}" )
52- | serializer ->
53- try
54- let model = serializer.OpenAsync( slnFilePath, CancellationToken.None) .GetAwaiter() .GetResult()
55- Ok( model)
56- with
57- | ex -> Error ex
50+ match SolutionSerializers.GetSerializerByMoniker( slnFilePath) with
51+ | null -> Error( exn $" Unsupported solution file format %s {Path.GetExtension(slnFilePath)}" )
52+ | serializer ->
53+ try
54+ let model = serializer.OpenAsync( slnFilePath, CancellationToken.None) .GetAwaiter() .GetResult()
55+ Ok( model)
56+ with ex ->
57+ Error ex
5858
5959 /// Parses a file on disk and returns data about its contents. Supports sln, slnf, and slnx files.
6060 let tryParseSln ( slnFilePath : string ) =
@@ -74,41 +74,55 @@ module InspectSln =
7474 normalizeDirSeparators
7575 >> makeAbs
7676
77- let parseItem ( item : Model.SolutionItemModel ): SolutionItem =
78- {
79- Guid = item.Id
80- Name = " "
81- Kind = SolutionItemKind.Unknown
82- }
83-
84- let parseProject ( project : Model.SolutionProjectModel ): SolutionItem =
85- { Guid = project.Id
86- Name= makeAbsoluteFromSlnDir project.FilePath
87- Kind = SolutionItemKind.MSBuildFormat [] // TODO: could theoretically parse configurations here
88- }
89-
90- let parseFolder ( folder : Model.SolutionFolderModel ): SolutionItem =
91- {
92- Guid = folder.Id
93- Name = makeAbsoluteFromSlnDir folder.Path
94- Kind =
95- SolutionItemKind.Folder (
96- sln.SolutionItems |> Seq.filter ( fun item -> not ( isNull item.Parent) && item.Parent.Id = folder.Id) |> Seq.map ( fun p -> parseItem p, string p.Id) |> List.ofSeq |> List.unzip)
97- }
77+ let parseItem ( item : Model.SolutionItemModel ) : SolutionItem = {
78+ Guid = item.Id
79+ Name = " "
80+ Kind = SolutionItemKind.Unknown
81+ }
82+
83+ let parseProject ( project : Model.SolutionProjectModel ) : SolutionItem = {
84+ Guid = project.Id
85+ Name = makeAbsoluteFromSlnDir project.FilePath
86+ Kind = SolutionItemKind.MSBuildFormat [] // TODO: could theoretically parse configurations here
87+ }
88+
89+ let parseFolder ( folder : Model.SolutionFolderModel ) : SolutionItem = {
90+ Guid = folder.Id
91+ Name = makeAbsoluteFromSlnDir folder.Path
92+ Kind =
93+ SolutionItemKind.Folder(
94+ sln.SolutionItems
95+ |> Seq.filter ( fun item ->
96+ not ( isNull item.Parent)
97+ && item.Parent.Id = folder.Id
98+ )
99+ |> Seq.map ( fun p -> parseItem p, string p.Id)
100+ |> List.ofSeq
101+ |> List.unzip
102+ )
103+ }
98104
99105 // three kinds of items - projects, folders, items
100106 // yield them all here
101107 let projectsWeCareAbout =
102108 match projectsToRead with
103109 | None -> sln.SolutionProjects :> seq<_>
104- | Some filteredProjects -> sln.SolutionProjects |> Seq.filter ( fun slnProject -> filteredProjects.Contains( makeAbsoluteFromSlnDir slnProject.FilePath))
105-
106- let allItems =
107- [
108- yield ! projectsWeCareAbout |> Seq.map parseProject
109- yield ! sln.SolutionFolders |> Seq.map parseFolder
110- yield ! sln.SolutionItems |> Seq.filter ( fun item -> isNull item.Parent) |> Seq.map parseItem
111- ]
110+ | Some filteredProjects ->
111+ sln.SolutionProjects
112+ |> Seq.filter ( fun slnProject -> filteredProjects.Contains( makeAbsoluteFromSlnDir slnProject.FilePath))
113+
114+ let allItems = [
115+ yield !
116+ projectsWeCareAbout
117+ |> Seq.map parseProject
118+ yield !
119+ sln.SolutionFolders
120+ |> Seq.map parseFolder
121+ yield !
122+ sln.SolutionItems
123+ |> Seq.filter ( fun item -> isNull item.Parent)
124+ |> Seq.map parseItem
125+ ]
112126
113127 let data = {
114128 Items = allItems
@@ -122,18 +136,18 @@ module InspectSln =
122136 let options = new JsonDocumentOptions( AllowTrailingCommas = true , CommentHandling = JsonCommentHandling.Skip)
123137 let text = JsonDocument.Parse( File.ReadAllText( slnfPath), options)
124138 let solutionElement = text.RootElement.GetProperty( " solution" )
125- let slnPath = solutionElement.GetProperty( " path" ) .GetString();
139+ let slnPath = solutionElement.GetProperty( " path" ) .GetString()
140+
126141 let projects =
127142 solutionElement.GetProperty( " projects" ) .EnumerateArray()
128143 |> Seq.map ( fun p -> p.GetString())
129144 |> Set.ofSeq
145+
130146 slnPath, projects
131147
132148 match tryLoadSolutionModel slnFilePath with
133- | Ok sln ->
134- Ok ( parseSln sln ( Some projectsToRead))
135- | Error ex ->
136- Error ex
149+ | Ok sln -> Ok( parseSln sln ( Some projectsToRead))
150+ | Error ex -> Error ex
137151
138152 if slnFilePath.EndsWith( " .slnf" ) then
139153 parseSlnf slnFilePath
0 commit comments