Skip to content

Commit 0c494f2

Browse files
authored
Update fcs 43.9.300 + Misc build/formatting fixes (#232)
* Add build scripts * Update package versions for FSharp.Core, FSharp.Compiler.Service, Expecto, and YoloDev.Expecto.TestSdk * Fixup Fantomas/FsLibLog issue * Ensure fail on focus enabled in CI * Formatting * Fix test command to correctly pass failedOnFocus parameter
1 parent 89d54a1 commit 0c494f2

File tree

10 files changed

+121
-93
lines changed

10 files changed

+121
-93
lines changed

.config/dotnet-tools.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"isRoot": true,
44
"tools": {
55
"fantomas": {
6-
"version": "7.0.0",
6+
"version": "7.0.1",
77
"commands": [
88
"fantomas"
99
],

Directory.Packages.props

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
<FSharpCoreVersion>6.0.0</FSharpCoreVersion>
88
<!-- However for the FCS project, FSharpCoreCompilerVersion needs to match whats specified in
99
the FSharp.Compiler.Service dependency -->
10-
<FSharpCoreCompilerVersion>9.0.201</FSharpCoreCompilerVersion>
11-
<FSharpCompilerVersion>43.9.201</FSharpCompilerVersion>
12-
<ExpectoVersion>10.2.1</ExpectoVersion>
10+
<FSharpCoreCompilerVersion>9.0.300</FSharpCoreCompilerVersion>
11+
<FSharpCompilerVersion>43.9.300</FSharpCompilerVersion>
12+
<ExpectoVersion>10.2.3</ExpectoVersion>
1313
<FakeVersion>6.1.3</FakeVersion>
1414
<NuGetAuditMode>direct</NuGetAuditMode>
1515
</PropertyGroup>
@@ -38,7 +38,7 @@
3838
<PackageVersion Include="Expecto" Version="$(ExpectoVersion)" />
3939
<PackageVersion Include="Expecto.Diff" Version="$(ExpectoVersion)" />
4040
<PackageVersion Include="MedallionShell" Version="1.5.1" />
41-
<PackageVersion Include="YoloDev.Expecto.TestSdk" Version="0.14.3" />
41+
<PackageVersion Include="YoloDev.Expecto.TestSdk" Version="0.15.3" />
4242
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
4343
<PackageVersion Include="GitHubActionsTestLogger" Version="2.4.1" />
4444
<!-- Build Dependencies-->

build.cmd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
dotnet run --project ./build/build.fsproj -- -t %*

build.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env bash
2+
3+
set -eu
4+
set -o pipefail
5+
6+
FAKE_DETAILED_ERRORS=true dotnet run --project ./build/build.fsproj -- -t "$@"

build/Program.fs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,26 @@ System.Environment.CurrentDirectory <- (Path.combine __SOURCE_DIRECTORY__ "..")
1111
// --------------------------------------------------------------------------------------
1212
let isNullOrWhiteSpace = System.String.IsNullOrWhiteSpace
1313

14+
let environVarAsBoolOrDefault varName defaultValue =
15+
let truthyConsts = [
16+
"1"
17+
"Y"
18+
"YES"
19+
"T"
20+
"TRUE"
21+
]
22+
23+
try
24+
let envvar = (Environment.environVar varName).ToUpper()
25+
26+
truthyConsts
27+
|> List.exists ((=) envvar)
28+
with _ ->
29+
defaultValue
30+
31+
32+
let isCI = lazy (environVarAsBoolOrDefault "CI" false)
33+
1434
let exec cmd args dir env =
1535
let proc =
1636
CreateProcess.fromRawCommandLine cmd args
@@ -49,7 +69,7 @@ let init args =
4969
| true, v -> v
5070
| _ -> false
5171

52-
let packages () = !! "src/**/*.nupkg"
72+
let packages () = !!"src/**/*.nupkg"
5373

5474
Target.create
5575
"Clean"
@@ -86,9 +106,15 @@ let init args =
86106
try
87107
exec "dotnet" $"new globaljson --force --sdk-version {tfmToSdkMap.[tfm]} --roll-forward LatestMinor" "test" Map.empty
88108

109+
let failedOnFocus =
110+
if isCI.Value then
111+
"Expecto.fail-on-focused-tests=true"
112+
else
113+
""
114+
89115
exec
90116
"dotnet"
91-
$"test --blame --blame-hang-timeout 60s --framework {tfm} --logger trx --logger GitHubActions -c {configuration} .\\Ionide.ProjInfo.Tests\\Ionide.ProjInfo.Tests.fsproj"
117+
$"test --blame --blame-hang-timeout 60s --framework {tfm} --logger trx --logger GitHubActions -c %s{configuration} .\\Ionide.ProjInfo.Tests\\Ionide.ProjInfo.Tests.fsproj -- %s{failedOnFocus}"
92118
"test"
93119
(Map.ofSeq [ "BuildNet9", tfmToBuildNet9Map.[tfm].ToString() ])
94120
|> ignore
@@ -173,17 +199,12 @@ let init args =
173199

174200
[<EntryPoint>]
175201
let main args =
176-
init (
177-
(args
178-
|> List.ofArray)
179-
)
202+
List.ofArray args
203+
|> init
180204

181205
try
182-
match args with
183-
| [| target |] -> Target.runOrDefaultWithArguments target
184-
| _ -> Target.runOrDefaultWithArguments "Default"
185-
206+
Target.runOrDefaultWithArguments "Default"
186207
0
187208
with e ->
188-
printfn "%A" e
209+
eprintfn "%A" e
189210
1

src/Ionide.ProjInfo.ProjectSystem/WorkspacePeek.fs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ module WorkspacePeek =
2323
| Slnx
2424
| Fsx
2525

26-
[<return:Struct>]
26+
[<return: Struct>]
2727
let inline (|HasExt|_|) (ext: string) (file: FileInfo) =
28-
if file.Extension = ext then ValueSome() else ValueNone
28+
if file.Extension = ext then
29+
ValueSome()
30+
else
31+
ValueNone
2932

3033
let private partitionByChoice3 =
3134
let foldBy (a, b, c) t =

src/Ionide.ProjInfo/FsLibLog.fs

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -546,9 +546,7 @@ module Providers =
546546
let pushPropertyMethodCall = Expression.Call(null, pushPropertyMethod, nameParam, valueParam, destructureObjectParam)
547547

548548
let pushProperty =
549-
Expression
550-
.Lambda<Func<string, obj, bool, IDisposable>>(pushPropertyMethodCall, nameParam, valueParam, destructureObjectParam)
551-
.Compile()
549+
Expression.Lambda<Func<string, obj, bool, IDisposable>>(pushPropertyMethodCall, nameParam, valueParam, destructureObjectParam).Compile()
552550

553551
fun key value destructure -> pushProperty.Invoke(key, value, destructure)
554552

@@ -581,9 +579,7 @@ module Providers =
581579
let methodCall = Expression.Call(null, method, exrs)
582580

583581
let func =
584-
Expression
585-
.Lambda<Func<string, obj, bool, obj>>(methodCall, propertyNameParam, valueParam, destructureObjectsParam)
586-
.Compile()
582+
Expression.Lambda<Func<string, obj, bool, obj>>(methodCall, propertyNameParam, valueParam, destructureObjectsParam).Compile()
587583

588584
fun name -> func.Invoke("SourceContext", name, false)
589585

@@ -646,10 +642,7 @@ module Providers =
646642

647643
let isEnabledMethodCall = Expression.Call(instanceCast, isEnabledMethodInfo, levelCast)
648644

649-
let isEnabled =
650-
Expression
651-
.Lambda<Func<obj, obj, bool>>(isEnabledMethodCall, instanceParam, levelParam)
652-
.Compile()
645+
let isEnabled = Expression.Lambda<Func<obj, obj, bool>>(isEnabledMethodCall, instanceParam, levelParam).Compile()
653646

654647
let writeMethodInfo =
655648
loggerType.GetMethod(
@@ -688,9 +681,7 @@ module Providers =
688681
Expression.Call(instanceCast, writeExceptionMethodInfo, levelCast, exceptionParam, messageParam, propertyValuesParam)
689682

690683
let writeException =
691-
Expression
692-
.Lambda<Action<obj, obj, exn, string, obj[]>>(writeMethodExp, instanceParam, levelParam, exceptionParam, messageParam, propertyValuesParam)
693-
.Compile()
684+
Expression.Lambda<Action<obj, obj, exn, string, obj[]>>(writeMethodExp, instanceParam, levelParam, exceptionParam, messageParam, propertyValuesParam).Compile()
694685

695686
{
696687
Write = (fun logger level message formattedParmeters -> write.Invoke(logger, level, message, formattedParmeters))
@@ -779,9 +770,7 @@ module Providers =
779770
let createLoggerMethodExp = Expression.Call(instanceCast, createLoggerMethodInfo, nameParam)
780771

781772
let createLogger =
782-
Expression
783-
.Lambda<Func<ILoggerFactory, string, ILogger>>(createLoggerMethodExp, instanceParam, nameParam)
784-
.Compile()
773+
Expression.Lambda<Func<ILoggerFactory, string, ILogger>>(createLoggerMethodExp, instanceParam, nameParam).Compile()
785774

786775
createLogger
787776
|> FuncConvert.FromFunc
@@ -814,9 +803,7 @@ module Providers =
814803
let isEnabledMethodCall = Expression.Call(instanceCast, isEnabledMethodInfo, levelCast)
815804

816805

817-
Expression
818-
.Lambda<Func<ILogger, MicrosoftLogLevel, bool>>(isEnabledMethodCall, instanceParam, levelParam)
819-
.Compile()
806+
Expression.Lambda<Func<ILogger, MicrosoftLogLevel, bool>>(isEnabledMethodCall, instanceParam, levelParam).Compile()
820807
|> FuncConvert.FromFunc
821808

822809
let write, writeError =
@@ -909,9 +896,7 @@ module Providers =
909896
let stateParam = Expression.Parameter(typedefof<obj>)
910897
let beginScopeMethodCall = Expression.Call(instanceCast, beginScopeMethodInfo, stateParam)
911898

912-
Expression
913-
.Lambda<Func<ILogger, obj, IDisposable>>(beginScopeMethodCall, instanceParam, stateParam)
914-
.Compile()
899+
Expression.Lambda<Func<ILogger, obj, IDisposable>>(beginScopeMethodCall, instanceParam, stateParam).Compile()
915900
|> FuncConvert.FromFunc
916901

917902
{
@@ -991,12 +976,13 @@ module LogProvider =
991976

992977
let mutable private currentLogProvider = None
993978

994-
let private knownProviders = [
979+
let private knownProviders =
980+
[
995981
#if !FABLE_COMPILER
996-
(SerilogProvider.isAvailable, SerilogProvider.create)
997-
(MicrosoftExtensionsLoggingProvider.isAvailable, MicrosoftExtensionsLoggingProvider.create)
982+
(SerilogProvider.isAvailable, SerilogProvider.create)
983+
(MicrosoftExtensionsLoggingProvider.isAvailable, MicrosoftExtensionsLoggingProvider.create)
998984
#endif
999-
]
985+
]
1000986

1001987
/// Greedy search for first available LogProvider. Order of known providers matters.
1002988
let private resolvedLogger =

src/Ionide.ProjInfo/InspectSln.fs

Lines changed: 56 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/Ionide.ProjInfo/Types.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ module Types =
6969
Properties: Property list
7070
CustomProperties: Property list
7171
} with
72+
7273
/// ResolvedTargetPath is the path to the primary reference assembly for this project.
7374
/// For projects that produce ReferenceAssemblies, this is the path to the reference assembly.
7475
/// For other projects, this is the same as TargetPath.
75-
member x.ResolvedTargetPath =
76-
defaultArg x.TargetRefPath x.TargetPath
76+
member x.ResolvedTargetPath = defaultArg x.TargetRefPath x.TargetPath
7777

7878
/// Represents a `<Compile>` node within an fsproj file.
7979
type CompileItem = {

test/Ionide.ProjInfo.Tests/Program.fs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,8 @@ let main argv =
1919
let toolsPath = Init.init (IO.DirectoryInfo Environment.CurrentDirectory) None
2020

2121
let args = [
22-
CLIArguments.Printer (TestPrinters.summaryPrinter defaultConfig.printer)
22+
CLIArguments.Printer(TestPrinters.summaryPrinter defaultConfig.printer)
2323
CLIArguments.Verbosity LogLevel.Verbose
2424
]
2525

26-
Tests.runTestsWithCLIArgs
27-
args
28-
argv
29-
tests
26+
Tests.runTestsWithCLIArgs args argv tests

0 commit comments

Comments
 (0)