Skip to content

Commit 4a1d11c

Browse files
authored
Enhance GitHub Copilot instructions for F# development (#18932)
1 parent ee49288 commit 4a1d11c

File tree

1 file changed

+157
-63
lines changed

1 file changed

+157
-63
lines changed

.github/copilot-instructions.md

Lines changed: 157 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,160 @@
11
# GitHub Copilot Instructions for F# Compiler
22

3-
## Build and test steps (only on Linux)
4-
5-
Always build and test the project before submitting your final solution.
6-
7-
In order to build and test, run `./build.sh -c Release --testcoreclr` .
8-
9-
If the build fails with errors or non-zero exit code, fix it based on the error messages given and repeat the build step.
10-
11-
If either of the steps 3 fails, fix the errors and repeat - up to 3 times.
12-
After that, report all relevant build errors, error messages and specific details about failing tests and their test test failure details.
13-
14-
### Fixing tests
15-
16-
- If any of the tests fail: Check if the test, test expectation (either inline in the test or a reference file configured for the test) or implementation needs updating, and fix it
17-
- If you see test failures for Surface area baselines: Refer to "Updating FCS surface area baselines" in devguide.md
18-
- If you see test failures for IL baselines: Refer to "Updating ILVerify baselines" in devguide.md
19-
20-
21-
## Acceptance criteria
22-
23-
- Code is formatted using `dotnet fantomas .` executed at the repo root.
24-
- Builds without errors.
25-
- Runs tests without errors. If some tests needed adjustments, those test expectations/baseline adjustments were done.
26-
- Follow the docs/release-notes folder by adding release notes. The guidelines are in docs/release-notes/About.md.
27-
- If the acceptance criteria was not met, collect the error messages (build failures or failing tests) and report them.
28-
29-
## Release notes
30-
- Each PR must have release notes attached. Those are saved in the `docs` folder, split by version and product aspect. Follow the existing notes to figure out the right format.
31-
- Follow the docs/release-notes structure and writing style. The guidelines are in docs/release-notes/About.md.
32-
33-
## Coding standards
34-
35-
### Language and Environment
36-
- Use modern F# with functional-first approach
3+
## STRUCTURE YOUR CHANGE (BEFORE EDITING)
4+
Keep scope tight.
5+
General guide:
6+
- Use F#
377
- Target .NET Standard 2.0 for compatibility
38-
- Avoid external dependencies - the codebase is self-contained
39-
40-
### Code Style and Standards
41-
- Follow docs/coding-standards.md, especially:
42-
- Prefer immutability and pure functions
43-
- Use consistent naming (see abbreviation guide)
44-
- Process complex types recursively with pattern matching
45-
- Avoid single-character identifiers except in established patterns
46-
- This project uses .fsi signature files. When adding a new public API to a namespace/module which will be consumed from other file, add it to the respective .fsi signature file as well
47-
- Follow docs/overview.md for key compiler data formats and representations
48-
49-
### Type System Handling
50-
- When working with `TType` instances, use appropriate stripping functions:
51-
- `stripTyparEqns` - Removes inference equations from type parameters
52-
- `stripTyEqns` - Removes type equations and type abbreviations
53-
- `stripTyEqnsAndErase` - Also erases compilation representations
54-
- Match the appropriate stripper to the context (e.g., display vs compilation)
55-
- Check equality with `typeEquiv` after stripping rather than direct comparison
56-
57-
### Core Data Structures
58-
- Use F# discriminated unions for type representations
59-
- Respect representation hiding through access control
60-
- Use `remapX` functions when transforming types across boundaries
61-
- Be aware of performance implications for recursive type operations
62-
63-
### Documentation and Naming
64-
- Document public APIs with XML comments
65-
- Use descriptive function names that indicate transformation direction
66-
- Follow established naming conventions for error messages based on FSComp.txt file. Put all error messages into the FSComp.txt file to ensure localisation
8+
- Avoid external dependencies – the codebase is self-contained (do NOT add new NuGet packages)
9+
- Follow docs/coding-standards.md and docs/overview.md
10+
11+
Plan your task:
12+
1. Write a 1–2 sentence intent (bug fix / API add / language tweak).
13+
2. Identify domain: Language (`LanguageFeature.fsi` touched) vs `src/FSharp.Core/` vs `vsintegration/` vs compiler/service.
14+
3. Public API? Edit matching `.fsi` simultaneously.
15+
4. New/changed diagnostics? Update FSComp.txt.
16+
5. IL shape change expected? Plan ILVerify baseline update.
17+
6. Expect baseline diffs? Plan `TEST_UPDATE_BSL=1` run.
18+
7. Add/adjust tests in existing projects.
19+
8. Decide release-notes sink now (Section 8).
20+
9. Run formatting only at the end.
21+
22+
---
23+
24+
# AFTER CHANGING CODE ( Agent-only. Ubuntu only )
25+
26+
Always run the core command. Always verify exit codes. No assumptions.
27+
28+
## 1. Core Command
29+
```
30+
./build.sh -c Release --testcoreclr
31+
```
32+
Non‑zero → classify & stop.
33+
34+
## 2. Bootstrap (Failure Detection Only)
35+
Two-phase build. No separate bootstrap command.
36+
Early proto/tool errors (e.g. "Error building tools") → `BootstrapFailure` (capture key lines). Stop.
37+
38+
## 3. Build Failure
39+
Proto ok but solution build fails → `BuildFailure`.
40+
Capture exit code, ≤15 error lines (`error FS`, `error F#`, `error MSB`), binlog path: `artifacts/log/Release/Build.*.binlog`.
41+
Do not proceed to tests.
42+
43+
## 4. Tests
44+
Core command runs CoreCLR tests:
45+
- FSharp.Test.Utilities
46+
- FSharp.Compiler.ComponentTests
47+
- FSharp.Compiler.Service.Tests
48+
- FSharp.Compiler.Private.Scripting.UnitTests
49+
- FSharp.Build.UnitTests
50+
- FSharp.Core.UnitTests
51+
Failures → `TestFailure` (projects + failing lines + baseline hints).
52+
53+
## 5. Baselines
54+
Drift → update then re-run.
55+
56+
General/component:
57+
```
58+
TEST_UPDATE_BSL=1
59+
./build.sh -c Release --testcoreclr
60+
```
61+
Surface area:
62+
```
63+
TEST_UPDATE_BSL=1
64+
dotnet test tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --filter "SurfaceAreaTest" -c Release /p:BUILDING_USING_DOTNET=true
65+
```
66+
ILVerify:
67+
```
68+
TEST_UPDATE_BSL=1
69+
pwsh tests/ILVerify/ilverify.ps1
70+
```
71+
Classify: `BaselineDrift(SurfaceArea|ILVerify|GeneralBSL)` + changed files.
72+
73+
## 6. Formatting
74+
```
75+
dotnet fantomas . --check
76+
```
77+
If fail:
78+
```
79+
dotnet fantomas .
80+
dotnet fantomas . --check
81+
```
82+
Still failing → `FormattingFailure`.
83+
84+
## 7. Public API / IL
85+
If new/changed public symbol (`.fsi` touched or public addition):
86+
1. Update `.fsi`.
87+
2. Surface area baseline flow.
88+
3. ILVerify if IL shape changed.
89+
4. Release notes (Section 8).
90+
Missed baseline update → `BaselineDrift`.
91+
92+
## 8. Release Notes (Sink Rules – Compact)
93+
Most fixes → FSharp.Compiler.Service.
94+
95+
| Condition | Sink |
96+
|-----------|------|
97+
| `LanguageFeature.fsi` changed | Language |
98+
| Public API/behavior/perf change under `src/FSharp.Core/` | FSharp.Core |
99+
| Only `vsintegration/` impacted | VisualStudio |
100+
| Otherwise | FSharp.Compiler.Service |
101+
102+
Action each needed sink:
103+
- Append bullet in latest version file under `docs/release-notes/<Sink>/`
104+
- Format: `* Description. ([PR #NNNNN](https://github.com/dotnet/fsharp/pull/NNNNN))`
105+
- Optional issue link before PR.
106+
Missing required entry → `ReleaseNotesMissing`.
107+
108+
## 9. Classifications
109+
Use one or more exactly:
110+
- `BootstrapFailure`
111+
- `BuildFailure`
112+
- `TestFailure`
113+
- `FormattingFailure`
114+
- `BaselineDrift(SurfaceArea|ILVerify|GeneralBSL)`
115+
- `ReleaseNotesMissing`
116+
117+
Schema:
118+
```
119+
Classification:
120+
Command:
121+
ExitCode:
122+
KeySnippets:
123+
ActionTaken:
124+
Result:
125+
OutstandingIssues:
126+
```
127+
128+
## 10. Decision Flow
129+
1. Format check
130+
2. Core command
131+
3. If fail classify & stop
132+
4. Tests → `TestFailure` if any
133+
5. Baseline drift? update → re-run → classify if persists
134+
6. Public surface/IL? Section 7
135+
7. Release notes sink (Section 8)
136+
8. If no unresolved classifications → success summary
137+
138+
## 11. Success Example
139+
```
140+
AllChecksPassed:
141+
Formatting: OK
142+
Bootstrap: OK
143+
Build: OK
144+
Tests: Passed
145+
Baselines: Clean
146+
ReleaseNotes: FSharp.Compiler.Service
147+
```
148+
149+
## 12. Failure Example
150+
```
151+
BootstrapFailure:
152+
Command: ./build.sh -c Release --testcoreclr
153+
ExitCode: 1
154+
KeySnippets:
155+
- "Error building tools"
156+
ActionTaken: None
157+
Result: Stopped
158+
OutstandingIssues: Bootstrap must be fixed
159+
```
160+
(eof)

0 commit comments

Comments
 (0)