Skip to content

Commit 954f05a

Browse files
committed
Merge remote-tracking branch 'upstream/main'
2 parents de919ff + f5ccf43 commit 954f05a

13,968 files changed

Lines changed: 204033 additions & 164856 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.

.devcontainer/devcontainer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
// Use 'postCreateCommand' to run commands after the container is created.
1717
"postCreateCommand": {
18-
"Configure Build Tools": "sudo corepack enable npm; sudo npm install -g hereby; npm ci",
18+
"Configure Build Tools": "sudo npm install -g hereby; npm ci",
1919
"Install pprof": "go install github.com/google/pprof@latest",
2020
"Install Graphviz": "sudo apt install graphviz"
2121
},

.github/copilot-instructions.md

Lines changed: 315 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,322 @@
1-
## Documentation MCP server
1+
# Guide for Copilot
22

3-
The repo is large and the project is complex.
4-
This document contains information you'll need no matter what the task is, but we have a separate library of content that you'll need to consult depending on the issue.
3+
This document provides a concise guide for writing TypeScript fourslash tests and compiler tests, along with build instructions.
54

6-
You have been given the `md-fragments` MCP server.
7-
Before doing anything, query its `list-topics` endpoint and remember all the topics you saw.
8-
Consult these topics often, as they contain important information relevant to the work.
9-
MOST OPERATIONS (adding tests, running them, etc) HAVE RELEVANT DOCUMENTATION.
5+
## Build Instructions Summary
106

11-
YOU MUST FOLLOW DIRECTIONS FROM THE "HOW TO FINISH A SESSION" TOPIC BEFORE FINISHING A PULL REQUEST.
7+
### Setup
8+
1. Install Node.js (current or LTS)
9+
2. Clone the repository: `git clone --depth=1 https://github.com/microsoft/TypeScript`
10+
3. Install dependencies: `npm ci`
1211

13-
## Information About This Repo
12+
### Common Build Tasks
13+
```bash
14+
npx hereby local # Build the compiler into built/local
15+
npx hereby clean # Delete the built compiler
16+
npx hereby tests # Build the test infrastructure
17+
npx hereby runtests # Run all tests
18+
npx hereby runtests-parallel # Run tests in parallel 🚨 MANDATORY BEFORE FINISHING!
19+
npx hereby runtests --runner=fourslash # Run only fourslash tests
20+
npx hereby runtests --runner=compiler # Run only compiler tests
21+
npx hereby runtests --tests=<testPath> # Run specific test
22+
npx hereby baseline-accept # Accept new test baselines
23+
npx hereby lint # Run eslint 🚨 MANDATORY BEFORE FINISHING!
24+
npx hereby format # Run code formatting 🚨 MANDATORY BEFORE FINISHING!
25+
```
26+
27+
## Fourslash Test Syntax Guide
28+
29+
Fourslash tests are interactive TypeScript language service tests. They validate IDE features like completions, quick info, navigation, and refactoring.
30+
31+
### Basic Structure
32+
```typescript
33+
/// <reference path='fourslash.ts'/>
34+
35+
////code goes here with /*markers*/
36+
37+
// Test assertions go here
38+
```
39+
40+
### Key Syntax Elements
41+
42+
#### 1. Source Code Definition
43+
Use `////` to define source code lines:
44+
```typescript
45+
////function foo(x: number) {
46+
//// return x + 1;
47+
////}
48+
////let result = foo(/*marker*/42);
49+
```
50+
51+
#### 2. Markers for Positioning
52+
Use `/**/` for anonymous markers or `/*name*/` for named markers:
53+
```typescript
54+
////let x = /*1*/someValue;
55+
////let y = /*cursor*/anotherValue;
56+
```
57+
58+
#### 3. Multi-file Tests
59+
Use `// @Filename:` to define multiple files:
60+
```typescript
61+
// @Filename: /a.ts
62+
////export const value = 42;
63+
64+
// @Filename: /b.ts
65+
////import { value } from './a';
66+
////console.log(/*marker*/value);
67+
```
68+
69+
#### 4. Ranges
70+
Use `[|text|]` to define text ranges:
71+
```typescript
72+
////function test() {
73+
//// [|return 42;|]
74+
////}
75+
```
76+
77+
### Common API Patterns
78+
79+
#### Navigation & Positioning
80+
```typescript
81+
goTo.marker("markerName"); // Navigate to marker
82+
goTo.marker(); // Navigate to anonymous marker /**/
83+
```
84+
85+
#### Verification (Prefer these over baselines)
86+
```typescript
87+
verify.currentLineContentIs("expected content");
88+
verify.completions({ includes: "itemName" });
89+
verify.completions({ excludes: "itemName" });
90+
verify.quickInfoIs("expected info");
91+
verify.codeFix({
92+
description: "Fix description",
93+
newFileContent: "expected content after fix"
94+
});
95+
```
96+
97+
#### Completions Testing
98+
```typescript
99+
verify.completions({
100+
marker: "1",
101+
includes: { name: "foo", source: "/a", hasAction: true },
102+
isNewIdentifierLocation: true,
103+
preferences: { includeCompletionsForModuleExports: true }
104+
});
105+
```
106+
107+
#### Code Fixes Testing
108+
```typescript
109+
verify.codeFix({
110+
description: "Add missing property",
111+
index: 0,
112+
newFileContent: `class C {
113+
property: string;
114+
method() { this.property = "value"; }
115+
}`
116+
});
117+
```
118+
119+
#### Formatting
120+
```typescript
121+
format.document();
122+
verify.currentLineContentIs("formatted content");
123+
```
124+
125+
### Simple Example
126+
```typescript
127+
/// <reference path='fourslash.ts'/>
128+
129+
////interface User {
130+
//// name: string;
131+
////}
132+
////
133+
////const user: User = {
134+
//// /*completion*/
135+
////};
136+
137+
verify.completions({
138+
marker: "completion",
139+
includes: { name: "name", sortText: "0" }
140+
});
141+
```
142+
143+
## Compiler Test Syntax Guide
144+
145+
Compiler tests validate TypeScript compilation behavior, type checking, and error reporting.
146+
147+
### Basic Structure
148+
- Simple `.ts` files in `tests/cases/compiler/`
149+
- Use comments to indicate expected behavior
150+
- No special test harness - just TypeScript code
151+
152+
### Compiler Directives
153+
Use `// @directive: value` for compiler options:
154+
```typescript
155+
// @strict: true
156+
// @target: ES2015
157+
// @lib: ES2015,DOM
158+
159+
let x: string = 42; // Error expected
160+
```
161+
162+
### Common Directives
163+
```typescript
164+
// @strict: true/false
165+
// @noImplicitAny: true/false
166+
// @target: ES5/ES2015/ES2020/ESNext
167+
// @module: commonjs/amd/es6/esnext
168+
// @lib: ES5,DOM/ES2015/ES2020
169+
// @declaration: true/false
170+
// @skipLibCheck: true/false
171+
```
172+
173+
### Multi-file Tests
174+
```typescript
175+
// @Filename: helper.ts
176+
export function helper(x: number): string {
177+
return x.toString();
178+
}
179+
180+
// @Filename: main.ts
181+
import { helper } from "./helper";
182+
const result = helper(42);
183+
```
184+
185+
### Error Expectations
186+
Use comments to document expected behavior:
187+
```typescript
188+
abstract class Base {
189+
abstract method(): void;
190+
}
14191

15-
Facts you should know and remember:
16-
* All tests can run and pass in this environment. There are no "unrelated" test failures!
17-
* Test "failures" due to baseline changes are normal as a result of your changes, but they MUST BE ADDRESSED. Read the "Dealing with Baselines" topic to learn more.
18-
* Maintainer comments in the issue should generally take priority over OP's comments
19-
* Maintainers might give you hints on where to start. They are not always right, but a good place to start
192+
class Derived extends Base {
193+
// Missing implementation - should error
194+
}
20195

21-
## Mandatory Workflow
196+
new Base(); // Should error - cannot instantiate abstract class
197+
```
198+
199+
### Type Testing Patterns
200+
```typescript
201+
// Test type inference
202+
let inferred = [1, 2, 3]; // Should infer number[]
203+
204+
// Test type compatibility
205+
type A = { x: number };
206+
type B = { x: number; y: string };
207+
let a: A = { x: 1 };
208+
let b: B = { x: 1, y: "hello" };
209+
a = b; // Should work - B is assignable to A
210+
b = a; // Should error - A missing property y
211+
```
212+
213+
### Simple Example
214+
```typescript
215+
// Test that optional properties work correctly
216+
interface Config {
217+
required: string;
218+
optional?: number;
219+
}
220+
221+
const config1: Config = { required: "test" }; // Should work
222+
const config2: Config = { required: "test", optional: 42 }; // Should work
223+
const config3: Config = { optional: 42 }; // Should error - missing required
224+
```
225+
226+
## Test Writing Best Practices
227+
228+
### For Fourslash Tests
229+
1. **Prefer validation over baselines** - Use `verify.currentLineContentIs()` instead of `verify.baseline*()`
230+
2. **Use simple, focused examples** - Test one feature at a time
231+
3. **Name markers clearly** - Use descriptive marker names like `/*completion*/`
232+
4. **Test the simplest form first** - Start with basic cases before complex scenarios
233+
234+
### For Compiler Tests
235+
1. **Use clear file names** - Name tests after the feature being tested
236+
2. **Add explanatory comments** - Document expected behavior with comments
237+
3. **Test error cases** - Include both valid and invalid code examples
238+
4. **Keep tests focused** - One primary feature per test file
239+
240+
### General Guidelines
241+
1. **Make tests deterministic** - Avoid random or environment-dependent behavior
242+
2. **Use realistic examples** - Test scenarios developers actually encounter
243+
3. **Start simple** - Begin with the most basic case of a feature
244+
4. **Test edge cases** - Include boundary conditions and error scenarios
245+
246+
## Running Specific Tests
247+
248+
```bash
249+
# Run a specific fourslash test
250+
npx hereby runtests --tests=tests/cases/fourslash/completionForObjectProperty.ts
251+
252+
# Run a specific compiler test
253+
npx hereby runtests --tests=tests/cases/compiler/abstractClassUnionInstantiation.ts
254+
255+
# Run tests matching a pattern
256+
npx hereby runtests --tests=tests/cases/fourslash/completion*.ts
257+
```
258+
259+
## Important Guidelines
260+
261+
### 🚨 CRITICAL: Before Finishing Your Work 🚨
262+
263+
**THESE STEPS ARE MANDATORY BEFORE COMMITTING/PUSHING ANY CHANGES:**
264+
265+
1. **MUST RUN:** `npx hereby runtests-parallel` (even though it takes 10-15 minutes)
266+
2. **MUST RUN:** `npx hereby lint` and fix ALL lint issues
267+
3. **MUST RUN:** `npx hereby format` as the final step
268+
269+
**❌ PRs that fail these checks will be rejected without review.**
270+
271+
### Keeping Things Tidy
272+
273+
- You can assume lint, tests, and formatting are clean on a fresh clone
274+
- Only run these verification steps AFTER making changes to code
275+
- Run `npx hereby lint` and fix ALL issues after making changes
276+
- Run `npx hereby format` as your final step after making changes
22277

23-
When you clone this repo, ALL THE TESTS ARE PASSING. There are no "unrelated" test failures here; if a test is failing, it's because of your change, and you need to address that one way or another.
278+
### Test Locations
24279

25-
This repo uses test-driven development. When fixing bugs or implementing features, you must follow this workflow:
280+
- Only add testcases in `tests/cases/compiler` or `tests/cases/fourslash`
281+
- Filenames in `tests/cases/compiler` must always end with `.ts`, not `.d.ts`
282+
- Do not write direct unit tests as they are almost never the correct test format for our repo
283+
284+
### Performance Expectations
285+
286+
- Running a set of tests may take up to 4 minutes
287+
- A full test run may take up to 15 minutes
288+
289+
### Working with Issues
290+
291+
- Maintainer comments in the issue should generally take priority over OP's comments
292+
- Maintainers might give you hints on where to start. They are not always right, but a good place to start
293+
294+
### Debugging Tips
295+
296+
printf debugging is going to be very useful as you are figuring things out.
297+
To do this, use `console.log`, but you'll need to `ts-ignore` it.
298+
Write something like this:
299+
```ts,diff
300+
function checkSomething(n: Node) {
301+
doSomething(n);
302+
+ // @ts-ignore DEBUG CODE ONLY, REMOVE ME WHEN DONE
303+
+ console.log(`Got node with pos = ${n.pos}`);
304+
doSomethingElse(n);
305+
}
306+
```
307+
We have a lot of enums so you might want to print back their symbolic name, to do this, index back into the name of the enum
308+
```ts
309+
// @ts-ignore DEBUG CODE ONLY, REMOVE ME WHEN DONE
310+
console.log(`Got node with kind = ${SyntaxKind[n.kind]}`);
311+
```
312+
313+
## Recommended Workflow
314+
315+
When fixing bugs or implementing features, follow this workflow:
26316

27317
1. **Make a testcase that demonstrates the behavior**
28318
- Run it (by itself) and review the baselines it generates to ensure it demonstrates the bug
29319
- Add the test and its baselines in one commit
30-
- You may need to debug in order to figure out how to write a testcase; this is normal
31-
- DO NOT TRY TO FIX A BUG UNTIL YOU HAVE A TESTCASE THAT CORRECTLY DEMONSTRATES THE PROBLEM
32320

33321
2. **Fix the bug by changing code as appropriate**
34322
- Put this fix in another commit
@@ -41,40 +329,14 @@ This repo uses test-driven development. When fixing bugs or implementing feature
41329
- Once you've got the basics figured out, enhance your test to cover edge cases and other variations
42330
- Run the test again and commit the baseline diff along with the test edit
43331

44-
5. **Run all other tests to ensure you didn't break anything**
45-
- Run `npx hereby runtests-parallel` and wait for it to finish (10-15 minutes is normal!)
332+
5. **🚨 MANDATORY: Run all other tests to ensure you didn't break anything**
333+
- **REQUIRED:** Run `npx hereby runtests-parallel` and wait for it to finish (10-15 minutes is normal!)
334+
- **THIS STEP CANNOT BE SKIPPED** - patience is essential!
46335
- Some collateral baseline changes are normal, but review for correctness
47336
- Put these diffs in another commit
48337

49-
## Due Diligence
50-
51-
As part of your summary, you will need to provide an extensive root cause analysis of why the bug has occurred.
52-
You should investigate the provided repro thoroughly, and provide "adjacent" testcases that *don't* demonstrate the bug to prove your theory of what the root cause of the bug is.
53-
54-
In particular, pay attention to which phase the bug occurs in. For example:
55-
* If the bug is in the parser, you should be able to demonstrate that the syntax tree is wrong
56-
* If the bug is in the checker, you should be able to explain why the logic is wrong with constrasting examples
57-
* If the bug is in the emitter, you should be able to demonstrate that the syntax tree is correct, but that the emit logic is wrong and why
58-
59-
## Time Constraints
60-
61-
If you're running out of time, consult the "How to give up" documentation topic.
62-
63-
## Asking Questions
64-
65-
We want to make you smarter over time.
66-
If you encounter a situation where you think a developer on this project would be able to provide a useful answer *and* it's not something offered by the Documentation MCP server, add a question to the file `.github/copilot-questions.md`
67-
Explain what you searched for so that we can put the right search terms in the documentation library.
68-
69-
## Common Commands
70-
71-
You'll need to run these commands often. Always use `npx` to run `hereby` commands.
72-
73-
```bash
74-
npx hereby local # Build the compiler into built/local
75-
npx hereby runtests-parallel # Run all tests; this will take 10-15 minutes
76-
npx hereby runtests -t <grep> # Run testcases matching a specific pattern
77-
npx hereby baseline-accept # Accept new test baselines
78-
npx hereby lint # Run lint. Always do this before submitting
79-
npx hereby format # Run code formatting. Always do this before submitting
80-
```
338+
6. **🚨 MANDATORY: Lint and format your changes**
339+
- **REQUIRED:** Run `npx hereby lint` and fix ALL issues
340+
- **REQUIRED:** Run `npx hereby format` before you're done
341+
- **YOU CANNOT FINISH WITHOUT THESE STEPS**
342+
- Double-check your line endings. Source files in this repo typically use CRLF line endings. Fix all line endings to be consistent before you wrap up

0 commit comments

Comments
 (0)