Skip to content

Commit cd42e58

Browse files
authored
Merge branch 'main' into fix-17107-allowmultiple-inherited-csharp
2 parents 60bbec7 + e6f00ee commit cd42e58

249 files changed

Lines changed: 7594 additions & 6201 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.config/service-branch-merge.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@
1616
"release/dev18.0": {
1717
"MergeToBranch": "main",
1818
"ExtraSwitches": "-QuietComments"
19+
},
20+
"main": {
21+
"MergeToBranch": "feature/net11-scouting",
22+
"ExtraSwitches": "-QuietComments",
23+
"ResetToTargetPaths": [
24+
"global.json",
25+
"eng/Version.Details.xml",
26+
"eng/Version.Details.props",
27+
"eng/Versions.props",
28+
"eng/common/**",
29+
"eng/TargetFrameworks.props"
30+
]
1931
}
2032
}
2133
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
---
2+
name: F# Release Announcement
3+
description: Craft F# release announcements for .NET preview/release milestones by tracing SDK→VMR→dotnet/fsharp commit ranges, analyzing release notes, PRs, and issues, then producing a markdown article.
4+
---
5+
6+
# 0. Resolve SDK branch names
7+
8+
User provides only a target release name (e.g., ".NET 11 Preview 2"). Derive everything else.
9+
10+
```bash
11+
# List all release branches in dotnet/sdk
12+
gh api repos/dotnet/sdk/branches --paginate -q '.[].name' | grep '^release/' | sort -V
13+
```
14+
15+
Branch naming pattern: `release/<major>.0.<band>xx-preview<N>` or `release/<major>.0.<band>xx`
16+
17+
From the listing, identify:
18+
1. **Target branch**: match release name to branch (e.g., ".NET 11 Preview 2" → `release/11.0.1xx-preview2`)
19+
2. **Previous branch**: prior preview or prior milestone (e.g., preview1 for preview2, or last stable for preview1)
20+
3. **Parallel stable branch**: highest `<major-1>.0.Xxx` branch (for exclusivity check)
21+
22+
# 1. Fetch previous announcement — DO NOT REPEAT
23+
24+
```
25+
gh api repos/dotnet/core/contents/release-notes -q '.[].name'
26+
```
27+
28+
Navigate to latest published `fsharp.md` under `release-notes/<major>/preview/*/`. Fetch it. Every item in it is excluded from output.
29+
30+
# 2. Resolve F# commit range
31+
32+
**CRITICAL**: Use SDK, not VMR branch. VMR branch may have newer F# than what SDK locked in.
33+
34+
### Get F# end commit (target release)
35+
36+
```
37+
# 1. SDK → VMR hash (find the Dependency for Microsoft.FSharp.Compiler, extract its Sha)
38+
gh api repos/dotnet/sdk/contents/eng/Version.Details.xml?ref=release/11.0.1xx-preview2 | jq -r '.content' | base64 -d | grep -A2 'Microsoft.FSharp.Compiler' | grep Sha | sed 's/.*>\([a-f0-9]*\)<.*/\1/'
39+
# Result: VMR_HASH
40+
41+
# 2. VMR → F# hash
42+
gh api repos/dotnet/dotnet/contents/src/source-manifest.json?ref=VMR_HASH | jq -r '.content' | base64 -d | jq -r '.repositories[] | select(.path=="fsharp") | .commitSha'
43+
# Result: FSHARP_END
44+
```
45+
46+
### Get F# start commit (previous release)
47+
48+
Repeat above with previous SDK branch (e.g., `release/11.0.1xx-preview1`).
49+
Result: `FSHARP_START`
50+
51+
### Cross-check with parallel SDK branch
52+
53+
Repeat for `release/10.0.3xx` (or current stable band). Compare F# hash. Determine if features are shared or exclusive.
54+
55+
# 3. Diff release notes
56+
57+
```bash
58+
git diff FSHARP_START..FSHARP_END -- docs/release-notes/ | grep '^+' | grep -v '^+++'
59+
```
60+
61+
Source files:
62+
- `docs/release-notes/.FSharp.Compiler.Service/*.md`
63+
- `docs/release-notes/.FSharp.Core/*.md`
64+
- `docs/release-notes/.Language/*.md`
65+
- `docs/release-notes/.VisualStudio/*.md`
66+
67+
### EXCLUDE
68+
69+
- Already in previous announcement
70+
- CI, infra, test-only, repo maintenance, dependency updates, localization
71+
- FCS-internal API (unless enables user scenario)
72+
- xUnit migration, build scripts, baseline updates
73+
74+
# 4. Investigate each entry via sub-agents
75+
76+
For each user-facing release note entry, spawn a sub-agent (explore or general-purpose) to investigate it independently. Each sub-agent writes its findings to a temp file.
77+
78+
```
79+
For each entry with PR #NUMBER:
80+
81+
Launch sub-agent with prompt:
82+
"""
83+
Investigate dotnet/fsharp PR #NUMBER.
84+
1. Get PR author, title, description, linked issues
85+
2. Get files changed — classify as: feature / bugfix / test-only / infra
86+
3. If feature or significant bugfix:
87+
- Find test files: git diff-tree --no-commit-id -r <MERGE_SHA> --name-only | grep -i test
88+
- Extract the most illustrative code sample from the tests (real F# code, not test harness)
89+
- Note benchmark data if PR description has any
90+
4. If author is NOT T-Gro, Copilot, or abonie → mark as community contributor
91+
5. Write findings to /tmp/release-notes/pr-NUMBER.md in this format:
92+
93+
## PR #NUMBER: <title>
94+
- Author: <login> (community: yes/no)
95+
- Type: feature | bugfix | api | perf | infra
96+
- One-line summary: <what changed for users>
97+
- Issue(s): #X, #Y
98+
- Code sample (if feature/api):
99+
```fsharp
100+
<code from tests>
101+
```
102+
- Benchmark (if perf):
103+
<table or numbers from PR>
104+
"""
105+
```
106+
107+
Run sub-agents in parallel (up to 5). Wait for all to complete. Read all `/tmp/release-notes/pr-*.md` files to assemble the full picture.
108+
109+
Skip entries where sub-agent classified as `infra` or `test-only`.
110+
111+
# 5. Write the article
112+
113+
## Attribution
114+
115+
- Community contributors: `Thanks to [**user**](https://github.com/user)` with link
116+
- NEVER mention: T-Gro, Copilot, abonie (internal)
117+
- Credit community even if their PR was superseded (e.g., "Inspired by [**user**]'s work in #XXXX")
118+
119+
## Structure
120+
121+
```markdown
122+
# F# in .NET XX Preview Y - Release Notes
123+
124+
Here's a summary of what's new in F# in this Preview Y release:
125+
126+
- [Highlight 1](#anchor)
127+
- [Highlight 2](#anchor)
128+
- [Category 1](#anchor)
129+
- [Category 2](#anchor)
130+
- [Bug fixes](#bug-fixes-and-other-improvements)
131+
132+
## Highlight 1 ← 1-3 sections, CODE SAMPLES from tests, minimal prose
133+
## Highlight 2
134+
## Category: Query fixes ← bullet list with issue links, no code
135+
## Category: IDE fixes ← bullet list
136+
## Bug fixes ← flat bullet list, prefixed by area (Nullness:, Scripts:, etc.)
137+
138+
F# updates:
139+
- [F# release notes](https://fsharp.github.io/fsharp-compiler-docs/release-notes/About.html)
140+
- [dotnet/fsharp repository](https://github.com/dotnet/fsharp)
141+
```
142+
143+
## Highlight selection (pick 1-3)
144+
145+
Rank by: language feature > new API > perf win with numbers > significant bug fix area
146+
Each MUST have code sample extracted from PR tests. No invented examples.
147+
148+
## Style
149+
150+
- One-sentence intro max, then code block or table
151+
- No fluff, no "we are excited", no "this release brings"
152+
- Bold key terms in bullet lists
153+
- Link every issue and PR number
154+
155+
# SDK branch naming
156+
157+
| Release | Branch |
158+
|---|---|
159+
| .NET 11 Preview N | `release/11.0.1xx-previewN` |
160+
| .NET 10.0.X00 | `release/10.0.Xxx` |
161+
162+
# Key files
163+
164+
| Repo | Path | Contains |
165+
|---|---|---|
166+
| dotnet/sdk | `eng/Version.Details.xml` | VMR commit SHA |
167+
| dotnet/dotnet | `src/source-manifest.json` | F# commit SHA |
168+
| dotnet/fsharp | `docs/release-notes/` | Per-version changelogs |
169+
| dotnet/core | `release-notes/` | Published announcements |

.github/skills/pr-build-status/scripts/Get-PrBuildIds.ps1

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@
1919
./Get-PrBuildIds.ps1 -PrNumber 33251 -Repo "dotnet/fsharp"
2020
2121
.OUTPUTS
22-
Array of objects with Pipeline, BuildId, State, and Link properties.
22+
Array of objects with Pipeline, BuildId, State, Detail, and Link properties.
23+
The State represents the worst-case state across all jobs in the build:
24+
- FAILURE if any job failed
25+
- IN_PROGRESS if any job is still running or queued
26+
- SUCCESS if all jobs completed successfully
27+
The Detail field shows the count of jobs in each state.
2328
#>
2429

2530
[CmdletBinding()]
@@ -60,6 +65,30 @@ $builds = $checks | Where-Object { $_.link -match "dev\.azure\.com" } | ForEach-
6065
State = $_.state
6166
Link = $_.link
6267
}
63-
} | Sort-Object -Property Pipeline, BuildId -Unique
68+
} | Group-Object BuildId | ForEach-Object {
69+
$jobs = $_.Group
70+
$states = $jobs | Select-Object -ExpandProperty State -Unique
71+
72+
# Determine overall state (worst case wins)
73+
$overall = if ($states -contains "FAILURE") {
74+
"FAILURE"
75+
}
76+
elseif ($states -contains "IN_PROGRESS" -or $states -contains "QUEUED") {
77+
"IN_PROGRESS"
78+
}
79+
else {
80+
"SUCCESS"
81+
}
82+
83+
$first = $jobs | Select-Object -First 1
84+
85+
[PSCustomObject]@{
86+
Pipeline = $first.Pipeline
87+
BuildId = $first.BuildId
88+
State = $overall
89+
Detail = ($jobs | Group-Object State | ForEach-Object { "$($_.Count) $($_.Name)" }) -join ", "
90+
Link = ($first.Link -replace "\&view=.*", "")
91+
}
92+
}
6493

6594
$builds

VisualFSharp.sln

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 17
4-
VisualStudioVersion = 17.1.32113.165
3+
# Visual Studio Version 18
4+
VisualStudioVersion = 18.3.11210.18 main
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{CFE3259A-2D30-4EB0-80D5-E8B5F3D01449}"
77
EndProject
88
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VisualFSharp.UnitTests Support", "VisualFSharp.UnitTests Support", "{3F044931-FB83-4433-B934-AE66AB27B278}"
99
EndProject
1010
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VisualFSharp", "VisualFSharp", "{4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D}"
1111
ProjectSection(SolutionItems) = preProject
12+
vsintegration\Directory.Build.props = vsintegration\Directory.Build.props
13+
vsintegration\Directory.Build.targets = vsintegration\Directory.Build.targets
1214
vsintegration\readme.md = vsintegration\readme.md
15+
vsintegration\Templates.Directory.Build.props = vsintegration\Templates.Directory.Build.props
16+
vsintegration\Templates.Directory.Build.targets = vsintegration\Templates.Directory.Build.targets
1317
EndProjectSection
1418
EndProject
1519
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Compiler", "Compiler", "{3881429D-A97A-49EB-B7AE-A82BA5FE9C77}"

docs/release-notes/.FSharp.Compiler.Service/10.0.300.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
### Fixed
22

3+
* Fix strong name signature size to align with Roslyn for public signing ([Issue #17451](https://github.com/dotnet/fsharp/issues/17451), [PR #19242](https://github.com/dotnet/fsharp/pull/19242))
34
* Nullness: Fix UoM ToString returning `string | null` for value types. ([Issue #17539](https://github.com/dotnet/fsharp/issues/17539), [PR #19262](https://github.com/dotnet/fsharp/pull/19262))
45
* Nullness: Fix pipe operator nullness warning location to point at nullable argument. ([Issue #18013](https://github.com/dotnet/fsharp/issues/18013), [PR #19262](https://github.com/dotnet/fsharp/pull/19262))
56
* Nullness: Fix false positive warning when passing non-null AllowNullLiteral constructor result. ([Issue #18021](https://github.com/dotnet/fsharp/issues/18021), [PR #19262](https://github.com/dotnet/fsharp/pull/19262))
@@ -29,9 +30,13 @@
2930
### Added
3031
* FSharpType: add ImportILType ([PR #19300](https://github.com/dotnet/fsharp/pull/19300))
3132
* Type checker: recover on argument/overload checking ([PR #19314](https://github.com/dotnet/fsharp/pull/19314))
33+
* FSharpType: add more predefined type checks ([PR #19325](https://github.com/dotnet/fsharp/pull/19325))
34+
* Introduced a separate `NotifyRelatedSymbolUse` sink and `[<Flags>] RelatedSymbolUseKind` enum for related symbol lookups (union case testers, copy-and-update record types). `GetUsesOfSymbolInFile` and `GetSemanticClassification` accept an optional `relatedSymbolKinds` parameter to opt in. ([PR #19361](https://github.com/dotnet/fsharp/pull/19361))
3235

3336
* Support `#exit;;` as alias to `#quit;;` in F# Interactive. ([PR #19329](https://github.com/dotnet/fsharp/pull/19329))
3437

38+
* FCS: capture additional types during analysis ([PR #19305](https://github.com/dotnet/fsharp/pull/19305))
39+
3540
### Changed
3641

3742
* Centralized product TFM (Target Framework Moniker) into MSBuild props file `eng/TargetFrameworks.props`. Changing the target framework now only requires editing one file, and it integrates with MSBuild's `--getProperty` for scripts.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
### Fixed
2+
3+
* Fix codegen to produce IL passing ILVerify: specialized stelem/ldelem for primitives, callvirt→call on value types, castclass at interface join points, filter→catch inside finally handlers, witness field alignment in state machine structs. ([PR #19372](https://github.com/dotnet/fsharp/pull/19372))
4+
* Fix outref parameter compiled as byref. (Issue [#13468](https://github.com/dotnet/fsharp/issues/13468), [PR #19340](https://github.com/dotnet/fsharp/pull/19340))
5+
* Fix static abstract interface members with byref params. (Issue [#18135](https://github.com/dotnet/fsharp/issues/18135), [PR #19340](https://github.com/dotnet/fsharp/pull/19340))
6+
* Fix object expressions in struct types no longer generate invalid IL with byref fields. (Issue [#19068](https://github.com/dotnet/fsharp/issues/19068), [PR #19339](https://github.com/dotnet/fsharp/pull/19339))
7+
* Avoid duplicate parameter names in closure constructors. (Issue [#17692](https://github.com/dotnet/fsharp/issues/17692), [PR #19339](https://github.com/dotnet/fsharp/pull/19339))
8+
* Improve let-rec codegen: reorder bindings to allocate lambda closures before non-lambda values that reference them. ([PR #19339](https://github.com/dotnet/fsharp/pull/19339))
9+
* Fix `YieldFromFinal`/`ReturnFromFinal` being incorrectly called in non-tail positions (`for`, `use`, `use!`, `try/with` handler). ([Issue #19402](https://github.com/dotnet/fsharp/issues/19402), [PR #19403](https://github.com/dotnet/fsharp/pull/19403))
10+
* Fixed how the source ranges of warn directives are reported (as trivia) in the parser output (by not reporting leading spaces). ([Issue #19405](https://github.com/dotnet/fsharp/issues/19405), [PR #19408]((https://github.com/dotnet/fsharp/pull/19408)))
11+
12+
### Added
13+
14+
* Added warning FS3884 when a function or delegate value is used as an interpolated string argument. ([PR #19289](https://github.com/dotnet/fsharp/pull/19289))
15+
* Add `#version;;` directive to F# Interactive to display version and environment information. ([Issue #13307](https://github.com/dotnet/fsharp/issues/13307), [PR #19332](https://github.com/dotnet/fsharp/pull/19332))

docs/release-notes/.FSharp.Core/10.0.300.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
### Fixed
22

3+
* Optimize Set.intersect performance symmetry and preserve identity from the first set argument. ([PR #19291](https://github.com/dotnet/fsharp/pull/19291)) (Fixes #19139)
34
* Fix anonymous record field ordering in LINQ expression conversion to produce consistent expression trees regardless of field declaration order. ([Issue #11131](https://github.com/dotnet/fsharp/issues/11131), [Issue #15648](https://github.com/dotnet/fsharp/issues/15648))
45
* Fix array indexing in LINQ expressions to generate proper array index expressions instead of GetArray method calls, enabling LINQ providers like Azure Cosmos DB to translate array access. ([Issue #16918](https://github.com/dotnet/fsharp/issues/16918))
56
* Fix tuple join conditions and groupBy operations to properly compare tuple keys using structural equality. AnonymousObject types now implement Equals and GetHashCode, enabling inline tuple joins like `join b on ((a.Id1, a.Id2) = (b.Id1, b.Id2))` to work correctly. ([Issue #7885](https://github.com/dotnet/fsharp/issues/7885), [Issue #47](https://github.com/dotnet/fsharp/issues/47))
67
* Fix tuple/multi-value projections in queries to use Queryable.Select instead of Enumerable.Select when the source is IQueryable, preserving query composition and enabling async operations like ToListAsync() in Entity Framework Core. ([Issue #3782](https://github.com/dotnet/fsharp/issues/3782), [Issue #15133](https://github.com/dotnet/fsharp/issues/15133))
78
* Fix EvaluateQuotation to handle Sequential expressions, void method calls (unit return), and other patterns that were previously throwing NotSupportedException. Also properly handles unit-returning expressions by using Action delegates instead of Func delegates. ([Issue #19099](https://github.com/dotnet/fsharp/issues/19099))
89
* Fix query conditionals without else branch (if-then only) that were causing type mismatch errors. Now properly extracts element type from IQueryable for creating empty sequences. ([Issue #3445](https://github.com/dotnet/fsharp/issues/3445))
10+
* Fix `Seq.empty` rendering as `"EmptyEnumerable"` in serializers by delegating to `System.Linq.Enumerable.Empty<'T>()` instead of using a custom DU type. ([Issue #17864](https://github.com/dotnet/fsharp/issues/17864), [PR #19317](https://github.com/dotnet/fsharp/pull/19317))
11+
* Ensure culture-independent parsing of .NET-style interpolated string holes. ([Issue #19367](https://github.com/dotnet/fsharp/issues/19367), [PR #19370](https://github.com/dotnet/fsharp/pull/19370))
912

1013
### Added
1114

docs/release-notes/.Language/preview.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
### Added
22

3+
* Warn (FS3884) when a function or delegate value is used as an interpolated string argument, since it will be formatted via `ToString` rather than being applied. ([PR #19289](https://github.com/dotnet/fsharp/pull/19289))
34
* Added `MethodOverloadsCache` language feature (preview) that caches overload resolution results for repeated method calls, significantly improving compilation performance. ([PR #19072](https://github.com/dotnet/fsharp/pull/19072))
45

56
### Fixed

docs/release-notes/.VisualStudio/18.vNext.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@
66
* Improve static compilation of state machines. ([PR #19297](https://github.com/dotnet/fsharp/pull/19297))
77

88
### Changed
9+
10+
* Rename "inline hints" to "inlay hints" in VS options for consistency with industry terminology. ([PR #19318](https://github.com/dotnet/fsharp/pull/19318))

0 commit comments

Comments
 (0)