Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
1799aaf
make attribute targets mismatches a warning and not an error.
edgarfgp Apr 23, 2025
55507e9
release notes
edgarfgp Apr 23, 2025
1738018
update tests
edgarfgp Apr 23, 2025
65f5bb6
Merge branch 'main' into fix-attr-targets
edgarfgp Apr 24, 2025
0c97b9d
Merge branch 'main' into fix-attr-targets
edgarfgp Apr 27, 2025
6f2b706
update baselines
edgarfgp Apr 29, 2025
e8f1bb0
Merge branch 'main' into fix-attr-targets
edgarfgp Apr 29, 2025
75d8f5e
Update baselines
edgarfgp Apr 29, 2025
4f2e97e
Merge branch 'fix-attr-targets' of github.com:edgarfgp/fsharp into fi…
edgarfgp Apr 29, 2025
63be5d5
Merge branch 'main' into fix-attr-targets
edgarfgp Apr 30, 2025
4248f2a
Move attribute form logic to an AP
edgarfgp Apr 30, 2025
cc96217
Merge branch 'main' into fix-attr-targets
edgarfgp May 1, 2025
e270b88
Merge branch 'main' into fix-attr-targets
edgarfgp May 1, 2025
e0cc65a
Merge branch 'main' into fix-attr-targets
edgarfgp May 2, 2025
1e29d58
Merge branch 'main' into fix-attr-targets
edgarfgp May 5, 2025
1470bf9
Merge branch 'main' into fix-attr-targets
edgarfgp May 6, 2025
8988215
Merge branch 'main' into fix-attr-targets
edgarfgp May 7, 2025
74712e8
Merge branch 'main' into fix-attr-targets
edgarfgp May 12, 2025
967c4a9
Merge branch 'main' of github.com:edgarfgp/fsharp
edgarfgp May 13, 2025
a30cef4
Merge branch 'dotnet:main' into main
edgarfgp May 22, 2025
5fa0480
Merge branch 'dotnet:main' into main
edgarfgp May 24, 2025
15e3d34
Merge branch 'dotnet:main' into main
edgarfgp May 29, 2025
b7ffcf8
Merge branch 'dotnet:main' into main
edgarfgp Jun 6, 2025
5bde641
Merge branch 'dotnet:main' into main
edgarfgp Jul 26, 2025
0f7c23c
Merge branch 'dotnet:main' into main
edgarfgp Jul 29, 2025
bae03c7
Reuse `SynBinding` to model `and!`
edgarfgp Aug 1, 2025
47d37d7
Update baselines
edgarfgp Aug 1, 2025
efcb1c1
release notes
edgarfgp Aug 1, 2025
b8dd071
Merge branch 'main' into reuse-synbinding-to-model-and-bang
edgarfgp Aug 1, 2025
ec3abb7
update baseline
edgarfgp Aug 1, 2025
b8f5b70
Merge branch 'reuse-synbinding-to-model-and-bang' of github.com:edgar…
edgarfgp Aug 1, 2025
6a6843c
Merge branch 'dotnet:main' into main
edgarfgp Aug 4, 2025
5f0add3
Merge branch 'main' into reuse-synbinding-to-model-and-bang
edgarfgp Aug 4, 2025
3dc02c8
update baselines
edgarfgp Aug 4, 2025
4da0c72
Merge branch 'main' into reuse-synbinding-to-model-and-bang
edgarfgp Aug 4, 2025
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
1 change: 1 addition & 0 deletions docs/release-notes/.FSharp.Compiler.Service/10.0.100.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@
* Simplify creation of `FSharpDiagnostics`. In a few cases, errors without ranges were assigned to the currently checked file, while in other cases they carried an empty range. The latter is now true in all cases. In a few cases, ranges at eof were corrected, while in others they were not. They are now always left uncorrected. This is a prerequisit for [#18553](https://github.com/dotnet/fsharp/issues/18553). ([PR #18610](https://github.com/dotnet/fsharp/pull/18610)).
* `SynExprRecordField` now includes a `range` field ([PR #18617](https://github.com/dotnet/fsharp/pull/18617))
* Mark `Range.Zero` as obsolete in favor of `Range.range0` ([PR #18664](https://github.com/dotnet/fsharp/pull/18664))
* Use `Synbinding` to model `and!` ([PR #18805](https://github.com/dotnet/fsharp/pull/18805))
Original file line number Diff line number Diff line change
Expand Up @@ -1860,7 +1860,7 @@ let rec TryTranslateComputationExpression
let m =
match andBangs with
| [] -> comp.Range
| h :: _ -> h.Trivia.AndBangKeyword
| h :: _ -> h.Trivia.LeadingKeyword.Range

error (Error(FSComp.SR.tcInvalidUseBangBindingNoAndBangs (), m))

Expand Down Expand Up @@ -1912,20 +1912,19 @@ let rec TryTranslateComputationExpression
let andBangRange =
match andBangBindings with
| [] -> comp.Range
| h :: _ -> h.Trivia.AndBangKeyword
| h :: _ -> h.Trivia.LeadingKeyword.Range

error (Error(FSComp.SR.tcAndBangNotSupported (), andBangRange))

if ceenv.isQuery then
error (Error(FSComp.SR.tcBindMayNotBeUsedInQueries (), mBind))

let sources =
(letRhsExpr
:: [ for SynExprAndBang(body = andExpr) in andBangBindings -> andExpr ])
(letRhsExpr :: [ for SynBinding(expr = andExpr) in andBangBindings -> andExpr ])
|> List.map (fun expr -> mkSourceExprConditional isFromSource expr ceenv.sourceMethInfo ceenv.builderValName)

let pats =
letPat :: [ for SynExprAndBang(pat = andPat) in andBangBindings -> andPat ]
letPat :: [ for SynBinding(headPat = andPat) in andBangBindings -> andPat ]

let sourcesRange = sources |> List.map (fun e -> e.Range) |> List.reduce unionRanges

Expand Down
4 changes: 2 additions & 2 deletions src/Compiler/Driver/GraphChecking/FileContentMapping.fs
Original file line number Diff line number Diff line change
Expand Up @@ -507,14 +507,14 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
| SynExpr.YieldOrReturnFrom(expr = expr) -> visit expr continuation
| SynExpr.LetOrUseBang(pat = pat; rhs = rhs; andBangs = andBangs; body = body) ->
let continuations =
let andBangExprs = List.map (fun (SynExprAndBang(body = body)) -> body) andBangs
let andBangExprs = List.map (fun (SynBinding(expr = body)) -> body) andBangs
List.map visit (body :: rhs :: andBangExprs)

let finalContinuation nodes =
[
yield! List.concat nodes
yield! visitPat pat
for SynExprAndBang(pat = pat) in andBangs do
for SynBinding(headPat = pat) in andBangs do
yield! visitPat pat
]
|> continuation
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/FSharpParseFileResults.fs
Original file line number Diff line number Diff line change
Expand Up @@ -766,7 +766,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
yield! walkBindSeqPt spBind
yield! walkExpr true rhsExpr

for SynExprAndBang(debugPoint = andBangSpBind; body = eAndBang) in andBangs do
for SynBinding(debugPoint = andBangSpBind; expr = eAndBang) in andBangs do
yield! walkBindSeqPt andBangSpBind
yield! walkExpr true eAndBang

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/ServiceInterfaceStubGenerator.fs
Original file line number Diff line number Diff line change
Expand Up @@ -959,7 +959,7 @@ module InterfaceStubGenerator =
| SynExpr.LetOrUseBang(rhs = synExpr1; andBangs = synExprAndBangs; body = synExpr2) ->
[
yield synExpr1
for SynExprAndBang(body = eAndBang) in synExprAndBangs do
for SynBinding(expr = eAndBang) in synExprAndBangs do
yield eAndBang
yield synExpr2
]
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/ServiceParseTreeWalk.fs
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,7 @@ module SyntaxTraversal =
yield dive synExpr synExpr.Range traverseSynExpr
yield!
[
for SynExprAndBang(pat = andBangSynPat; body = andBangSynExpr) in andBangSynExprs do
for SynBinding(headPat = andBangSynPat; expr = andBangSynExpr) in andBangSynExprs do
yield (dive andBangSynPat andBangSynPat.Range traversePat)
yield (dive andBangSynExpr andBangSynExpr.Range traverseSynExpr)
]
Expand Down
4 changes: 2 additions & 2 deletions src/Compiler/Service/ServiceParsedInputOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -851,7 +851,7 @@ module ParsedInput =
| SynExpr.LetOrUseBang(rhs = e1; andBangs = es; body = e2) ->
[
yield e1
for SynExprAndBang(body = eAndBang) in es do
for SynBinding(expr = eAndBang) in es do
yield eAndBang
yield e2
]
Expand Down Expand Up @@ -2159,7 +2159,7 @@ module ParsedInput =
walkPat pat
walkExpr e1

for SynExprAndBang(pat = patAndBang; body = eAndBang) in es do
for SynBinding(headPat = patAndBang; expr = eAndBang) in es do
walkPat patAndBang
walkExpr eAndBang

Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/Service/ServiceStructure.fs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ module Structure =
let exprs =
[
eLet
for SynExprAndBang(body = eAndBang) in es do
for SynBinding(expr = eAndBang) in es do
eAndBang
]

Expand Down
27 changes: 20 additions & 7 deletions src/Compiler/SyntaxTree/ParseHelpers.fs
Original file line number Diff line number Diff line change
Expand Up @@ -871,15 +871,28 @@ let mkClassMemberLocalBindings
let mkAndBang (mKeyword: range, pat: SynPat, rhs: SynExpr, mWhole: range, mEquals: range, mIn: range option) =
let spBind = DebugPointAtBinding.Yes(unionRanges mKeyword rhs.Range)

let trivia: SynExprAndBangTrivia =
let trivia: SynBindingTrivia =
{
AndBangKeyword = mKeyword
EqualsRange = mEquals
InKeyword = mIn
LeadingKeyword = SynLeadingKeyword.And mKeyword
InlineKeyword = mIn
EqualsRange = Some mEquals
}

// For and!, isUse is always true, isFromSource is always true
SynExprAndBang(spBind, false, true, pat, rhs, mWhole, trivia)
SynBinding(
accessibility = None,
kind = SynBindingKind.Normal,
isInline = false,
isMutable = false,
attributes = [],
xmlDoc = PreXmlDoc.Empty,
valData = SynInfo.emptySynValData,
headPat = pat,
returnInfo = None,
expr = rhs,
range = mWhole,
debugPoint = spBind,
trivia = trivia
)

let mkDefnBindings (mWhole, BindingSetPreAttrs(_, isRec, isUse, declsPreAttrs, _bindingSetRange), attrs, vis, attrsm) =
if isUse then
Expand Down Expand Up @@ -1063,7 +1076,7 @@ let mkLetExpression
mWhole: range,
body: SynExpr,
bindingInfo: (bool * BindingSet) option,
bangInfo: (SynPat * SynExpr * SynExprAndBang list * range option * bool) option
bangInfo: (SynPat * SynExpr * SynBinding list * range option * bool) option
) =
if isBang then
match bangInfo with
Expand Down
4 changes: 2 additions & 2 deletions src/Compiler/SyntaxTree/ParseHelpers.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -205,11 +205,11 @@ val mkLetExpression:
mWhole: range *
body: SynExpr *
bindingInfo: (bool * BindingSet) option *
bangInfo: (SynPat * SynExpr * SynExprAndBang list * range option * bool) option ->
bangInfo: (SynPat * SynExpr * SynBinding list * range option * bool) option ->
SynExpr

val mkAndBang:
mKeyword: range * pat: SynPat * rhs: SynExpr * mWhole: range * mEquals: range * mIn: range option -> SynExprAndBang
mKeyword: range * pat: SynPat * rhs: SynExpr * mWhole: range * mEquals: range * mIn: range option -> SynBinding

val mkDefnBindings:
mWhole: range * BindingSet * attrs: SynAttributes * vis: SynAccess option * attrsm: range -> SynModuleDecl list
Expand Down
27 changes: 5 additions & 22 deletions src/Compiler/SyntaxTree/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -627,8 +627,6 @@ type SynExpr =
typeArgsRange: range *
range: range

| LetOrUse of isRecursive: bool * isUse: bool * bindings: SynBinding list * body: SynExpr * range: range * trivia: SynExprLetOrUseTrivia

| TryWith of
tryExpr: SynExpr *
withCases: SynMatchClause list *
Expand Down Expand Up @@ -720,13 +718,15 @@ type SynExpr =

| YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnFromTrivia

| LetOrUse of isRecursive: bool * isUse: bool * bindings: SynBinding list * body: SynExpr * range: range * trivia: SynExprLetOrUseTrivia

| LetOrUseBang of
bindDebugPoint: DebugPointAtBinding *
isUse: bool *
isFromSource: bool *
pat: SynPat *
rhs: SynExpr *
andBangs: SynExprAndBang list *
andBangs: SynBinding list *
body: SynExpr *
range: range *
trivia: SynExprLetOrUseTrivia
Expand Down Expand Up @@ -871,25 +871,6 @@ type SynExpr =
| SynExpr.ArbitraryAfterError _ -> true
| _ -> false

[<NoEquality; NoComparison>]
type SynExprAndBang =
| SynExprAndBang of
debugPoint: DebugPointAtBinding *
isUse: bool *
isFromSource: bool *
pat: SynPat *
body: SynExpr *
range: range *
trivia: SynExprAndBangTrivia

member x.Range =
match x with
| SynExprAndBang(range = range) -> range

member this.Trivia =
match this with
| SynExprAndBang(trivia = trivia) -> trivia

[<NoEquality; NoComparison>]
type SynExprRecordField =
| SynExprRecordField of
Expand Down Expand Up @@ -1126,6 +1107,8 @@ type SynBinding =

member x.RangeOfHeadPattern = let (SynBinding(headPat = headPat)) = x in headPat.Range

member x.Trivia = let (SynBinding(trivia = trivia)) = x in trivia

[<NoEquality; NoComparison>]
type SynBindingReturnInfo =
| SynBindingReturnInfo of typeName: SynType * range: range * attributes: SynAttributes * trivia: SynBindingReturnInfoTrivia
Expand Down
45 changes: 15 additions & 30 deletions src/Compiler/SyntaxTree/SyntaxTree.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -726,18 +726,6 @@ type SynExpr =
typeArgsRange: range *
range: range

/// F# syntax: let pat = expr in expr
/// F# syntax: let f pat1 .. patN = expr in expr
/// F# syntax: let rec f pat1 .. patN = expr in expr
/// F# syntax: use pat = expr in expr
| LetOrUse of
isRecursive: bool *
isUse: bool *
bindings: SynBinding list *
body: SynExpr *
range: range *
trivia: SynExprLetOrUseTrivia

/// F# syntax: try expr with pat -> expr
| TryWith of
tryExpr: SynExpr *
Expand Down Expand Up @@ -886,6 +874,18 @@ type SynExpr =
/// Computation expressions only
| YieldOrReturnFrom of flags: (bool * bool) * expr: SynExpr * range: range * trivia: SynExprYieldOrReturnFromTrivia

/// F# syntax: let pat = expr in expr
/// F# syntax: let f pat1 .. patN = expr in expr
/// F# syntax: let rec f pat1 .. patN = expr in expr
/// F# syntax: use pat = expr in expr
| LetOrUse of
isRecursive: bool *
isUse: bool *
bindings: SynBinding list *
body: SynExpr *
range: range *
trivia: SynExprLetOrUseTrivia

/// F# syntax: let! pat = expr in expr
/// F# syntax: use! pat = expr in expr
/// F# syntax: let! pat = expr and! ... and! ... and! pat = expr in expr
Expand All @@ -896,7 +896,7 @@ type SynExpr =
isFromSource: bool *
pat: SynPat *
rhs: SynExpr *
andBangs: SynExprAndBang list *
andBangs: SynBinding list *
body: SynExpr *
range: range *
trivia: SynExprLetOrUseTrivia
Expand Down Expand Up @@ -976,23 +976,6 @@ type SynExpr =
/// Indicates if this expression arises from error recovery
member IsArbExprAndThusAlreadyReportedError: bool

[<NoEquality; NoComparison>]
type SynExprAndBang =
| SynExprAndBang of
debugPoint: DebugPointAtBinding *
isUse: bool *
isFromSource: bool *
pat: SynPat *
body: SynExpr *
range: range *
trivia: SynExprAndBangTrivia

/// Gets the syntax range of this construct
member Range: range

/// Gets the trivia associated with this construct
member Trivia: SynExprAndBangTrivia

[<NoEquality; NoComparison>]
type SynExprRecordField =
| SynExprRecordField of
Expand Down Expand Up @@ -1254,6 +1237,8 @@ type SynBinding =

member RangeOfHeadPattern: range

member Trivia: SynBindingTrivia

/// Represents the return information in a binding for a 'let' or 'member' declaration
[<NoEquality; NoComparison>]
type SynBindingReturnInfo =
Expand Down
2 changes: 1 addition & 1 deletion src/Compiler/SyntaxTree/SyntaxTreeOps.fs
Original file line number Diff line number Diff line change
Expand Up @@ -985,7 +985,7 @@ let rec synExprContainsError inpExpr =
walkExpr e1
|| walkExprs
[
for SynExprAndBang(body = e) in es do
for SynBinding(expr = e) in es do
yield e
]
|| walkExpr e2
Expand Down
8 changes: 0 additions & 8 deletions src/Compiler/SyntaxTree/SyntaxTrivia.fs
Original file line number Diff line number Diff line change
Expand Up @@ -292,14 +292,6 @@ type SynBindingTrivia =
EqualsRange = None
}

[<NoEquality; NoComparison>]
type SynExprAndBangTrivia =
{
AndBangKeyword: range
EqualsRange: range
InKeyword: range option
}

[<NoEquality; NoComparison>]
type SynModuleDeclNestedModuleTrivia =
{
Expand Down
12 changes: 0 additions & 12 deletions src/Compiler/SyntaxTree/SyntaxTrivia.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -349,18 +349,6 @@ type SynBindingTrivia =

static member Zero: SynBindingTrivia

/// Represents additional information for SynExprAndBang
[<NoEquality; NoComparison>]
type SynExprAndBangTrivia =
{
/// The syntax range of the `and!` keyword
AndBangKeyword: range
/// The syntax range of the `=` token.
EqualsRange: range
/// The syntax range of the `in` keyword.
InKeyword: range option
}

/// Represents additional information for SynModuleDecl.NestedModule
[<NoEquality; NoComparison>]
type SynModuleDeclNestedModuleTrivia =
Expand Down
Loading
Loading