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