diff --git a/Dockerfile b/Dockerfile
index f6462ee..0ce50a5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,16 +1,18 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.201-alpine3.19-amd64 AS build
+FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0.103-alpine3.23 AS build
+ARG TARGETARCH
+
WORKDIR /app
# Copy fsproj and restore as distinct layers
COPY src/Exercism.Representers.FSharp/Exercism.Representers.FSharp.fsproj ./
-RUN dotnet restore -r linux-musl-x64
+RUN dotnet restore -a $TARGETARCH
# Copy everything else and build
COPY src/Exercism.Representers.FSharp/ ./
-RUN dotnet publish -r linux-musl-x64 -c Release -o /opt/representer --no-restore --self-contained true
+RUN dotnet publish -a $TARGETARCH --no-restore --self-contained true --output /opt/representer
# Build runtime image
-FROM mcr.microsoft.com/dotnet/runtime-deps:8.0.2-alpine3.19-amd64 AS runtime
+FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/runtime-deps:10.0.3-alpine3.23 AS runtime
WORKDIR /opt/representer
COPY --from=build /opt/representer/ .
diff --git a/Exercism.Representers.FSharp.sln b/Exercism.Representers.FSharp.sln
deleted file mode 100644
index 840d46a..0000000
--- a/Exercism.Representers.FSharp.sln
+++ /dev/null
@@ -1,17 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-#
-Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Exercism.Representers.FSharp", "src\Exercism.Representers.FSharp\Exercism.Representers.FSharp.fsproj", "{9428D8F1-00A3-4246-85DE-F0D31978D853}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {9428D8F1-00A3-4246-85DE-F0D31978D853}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9428D8F1-00A3-4246-85DE-F0D31978D853}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9428D8F1-00A3-4246-85DE-F0D31978D853}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9428D8F1-00A3-4246-85DE-F0D31978D853}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
-EndGlobal
diff --git a/Exercism.Representers.FSharp.slnx b/Exercism.Representers.FSharp.slnx
new file mode 100644
index 0000000..abcbb66
--- /dev/null
+++ b/Exercism.Representers.FSharp.slnx
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/Exercism.Representers.FSharp/Exercism.Representers.FSharp.fsproj b/src/Exercism.Representers.FSharp/Exercism.Representers.FSharp.fsproj
index b11b375..e91c19e 100644
--- a/src/Exercism.Representers.FSharp/Exercism.Representers.FSharp.fsproj
+++ b/src/Exercism.Representers.FSharp/Exercism.Representers.FSharp.fsproj
@@ -1,8 +1,9 @@
+ net10.0
Exe
- net8.0
+ true
@@ -12,11 +13,11 @@
-
-
-
-
+
+
+
+
diff --git a/src/Exercism.Representers.FSharp/Visitor.fs b/src/Exercism.Representers.FSharp/Visitor.fs
index 48595ba..a7b4c9a 100644
--- a/src/Exercism.Representers.FSharp/Visitor.fs
+++ b/src/Exercism.Representers.FSharp/Visitor.fs
@@ -159,8 +159,8 @@ type SyntaxVisitor() =
SynExpr.TryFinally
(this.VisitSynExpr tryExpr, this.VisitSynExpr finallyExpr, range, trySeqPoint, withSeqPoint, trivia)
| SynExpr.Lazy(ex, range) -> SynExpr.Lazy(this.VisitSynExpr ex, range)
- | SynExpr.Sequential(seqPoint, isTrueSeq, expr1, expr2, range) ->
- SynExpr.Sequential(seqPoint, isTrueSeq, this.VisitSynExpr expr1, this.VisitSynExpr expr2, range)
+ | SynExpr.Sequential(seqPoint, isTrueSeq, expr1, expr2, range, trivia) ->
+ SynExpr.Sequential(seqPoint, isTrueSeq, this.VisitSynExpr expr1, this.VisitSynExpr expr2, range, trivia)
| SynExpr.SequentialOrImplicitYield(seqPoint, expr1, expr2, ifNotStmt, range) ->
SynExpr.SequentialOrImplicitYield
(seqPoint, this.VisitSynExpr expr1, this.VisitSynExpr expr2, this.VisitSynExpr ifNotStmt, range)
@@ -328,7 +328,7 @@ type SyntaxVisitor() =
| SynMemberDefn.ImplicitCtor(access, attrs, ctorArgs, selfIdentifier, doc, range, trivia) ->
SynMemberDefn.ImplicitCtor
(Option.map this.VisitSynAccess access, attrs |> List.map this.VisitSynAttributeList,
- this.VisitSynSimplePats ctorArgs, Option.map this.VisitIdent selfIdentifier, this.VisitPreXmlDoc(doc), range, trivia)
+ this.VisitSynPat ctorArgs, Option.map this.VisitIdent selfIdentifier, this.VisitPreXmlDoc(doc), range, trivia)
| SynMemberDefn.ImplicitInherit(inheritType, inheritArgs, inheritAlias, range) ->
SynMemberDefn.ImplicitInherit
(this.VisitSynType inheritType, this.VisitSynExpr inheritArgs, Option.map this.VisitIdent inheritAlias,
@@ -348,7 +348,7 @@ type SyntaxVisitor() =
| SynMemberDefn.AutoProperty(attrs, isStatic, ident, typeOpt, propKind, flags, flagsForSet, doc, access, synExpr, range, trivia) ->
SynMemberDefn.AutoProperty
(attrs |> List.map this.VisitSynAttributeList, isStatic, this.VisitIdent ident,
- Option.map this.VisitSynType typeOpt, propKind, flags, flagsForSet, this.VisitPreXmlDoc(doc), Option.map this.VisitSynAccess access,
+ Option.map this.VisitSynType typeOpt, propKind, flags, flagsForSet, this.VisitPreXmlDoc(doc), this.VisitSynValSigAccess access,
this.VisitSynExpr synExpr, range, trivia)
abstract VisitSynSimplePat: SynSimplePat -> SynSimplePat
@@ -384,8 +384,8 @@ type SyntaxVisitor() =
default this.VisitSynValData(svd: SynValData): SynValData =
match svd with
- | SynValData(flags, svi, ident, transformedFromProperty) ->
- SynValData(flags, this.VisitSynValInfo svi, Option.map this.VisitIdent ident, Option.map this.VisitIdent transformedFromProperty)
+ | SynValData(flags, svi, ident) ->
+ SynValData(flags, this.VisitSynValInfo svi, Option.map this.VisitIdent ident)
abstract VisitSynValSig: SynValSig -> SynValSig
@@ -395,7 +395,7 @@ type SyntaxVisitor() =
SynValSig
(attrs |> List.map this.VisitSynAttributeList, this.VisitSynIdent ident,
this.VisitSynValTyparDecls explicitValDecls, this.VisitSynType synType, this.VisitSynValInfo arity,
- isInline, isMutable, this.VisitPreXmlDoc(doc), Option.map this.VisitSynAccess access, Option.map this.VisitSynExpr expr,
+ isInline, isMutable, this.VisitPreXmlDoc(doc), this.VisitSynValSigAccess access, Option.map this.VisitSynExpr expr,
range, trivia)
abstract VisitSynValTyparDecls: SynValTyparDecls -> SynValTyparDecls
@@ -632,6 +632,8 @@ type SyntaxVisitor() =
SynType.SignatureParameter(List.map this.VisitSynAttributeList synAttributeLists, optional, Option.map this.VisitIdent identOption, this.VisitSynType usedType, range)
| SynType.FromParseError range -> SynType.FromParseError range
| SynType.Intersection(typar, types, range, trivia) -> SynType.Intersection(Option.map this.VisitSynTypar typar, types |> List.map this.VisitSynType, range, trivia)
+ | SynType.StaticConstantNull range -> SynType.StaticConstantNull range
+ | SynType.WithNull(innerType, ambivalent, range, trivia) -> SynType.WithNull(this.VisitSynType(innerType), ambivalent, range, trivia)
abstract VisitSynTypeOrTrivia: SynTypeOrTrivia -> SynTypeOrTrivia
default this.VisitSynTypeOrTrivia(synTypeOrTrivia: SynTypeOrTrivia): SynTypeOrTrivia = synTypeOrTrivia
@@ -664,6 +666,10 @@ type SyntaxVisitor() =
abstract VisitSynAccess: SynAccess -> SynAccess
default this.VisitSynAccess(a: SynAccess): SynAccess = a
+
+ abstract VisitSynValSigAccess: SynValSigAccess -> SynValSigAccess
+
+ default this.VisitSynValSigAccess(a: SynValSigAccess): SynValSigAccess = a
abstract VisitSynBindingKind: SynBindingKind -> SynBindingKind