@zzzen/pyright-internal 1.2.0-dev.20260422 → 1.2.0-dev.20260426

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ /*
3
+ * parserBenchmark.test.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ *
6
+ * Microbenchmark for the Python parser.
7
+ * Measures nodes/sec, parse time, AST node count across representative corpora.
8
+ *
9
+ * Run with:
10
+ * cd packages/pyright/packages/pyright-internal
11
+ * node node_modules\jest\bin\jest parserBenchmark.test --runInBand --detectOpenHandles --forceExit --testTimeout=300000
12
+ *
13
+ * Results are written as JSON to:
14
+ * src/tests/benchmarks/.generated/benchmark-results/parser/
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const fs = __importStar(require("fs"));
41
+ const os = __importStar(require("os"));
42
+ const path = __importStar(require("path"));
43
+ const diagnosticSink_1 = require("../../common/diagnosticSink");
44
+ const parser_1 = require("../../parser/parser");
45
+ // --- Configuration ---
46
+ const WARMUP_ITERATIONS = 3;
47
+ const BENCHMARK_ITERATIONS = 10;
48
+ const BENCHMARK_OUTPUT_DIR = path.join(__dirname, '.generated', 'benchmark-results', 'parser');
49
+ // --- Helpers ---
50
+ function calculateStats(times) {
51
+ const sorted = [...times].sort((a, b) => a - b);
52
+ const len = sorted.length;
53
+ const median = len % 2 === 0 ? (sorted[len / 2 - 1] + sorted[len / 2]) / 2 : sorted[Math.floor(len / 2)];
54
+ const p95Index = Math.ceil(len * 0.95) - 1;
55
+ const p95 = sorted[Math.min(p95Index, len - 1)];
56
+ const min = sorted[0];
57
+ const max = sorted[len - 1];
58
+ const avg = times.reduce((a, b) => a + b, 0) / len;
59
+ return { median, p95, min, max, avg };
60
+ }
61
+ function loadCorpus(filename) {
62
+ const filePath = path.resolve(__dirname, '..', 'benchmarkData', filename);
63
+ return fs.readFileSync(filePath, 'utf-8');
64
+ }
65
+ function getSystemInfo() {
66
+ const cpus = os.cpus();
67
+ return {
68
+ platform: os.platform(),
69
+ arch: os.arch(),
70
+ cpus: cpus[0]?.model ?? 'unknown',
71
+ cpuCount: cpus.length,
72
+ totalMemoryMB: Math.round(os.totalmem() / (1024 * 1024)),
73
+ nodeVersion: process.version,
74
+ };
75
+ }
76
+ function writeReport(report) {
77
+ fs.mkdirSync(BENCHMARK_OUTPUT_DIR, { recursive: true });
78
+ const filename = `parser-benchmark-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
79
+ const outputPath = path.join(BENCHMARK_OUTPUT_DIR, filename);
80
+ fs.writeFileSync(outputPath, JSON.stringify(report, undefined, 2), 'utf-8');
81
+ console.log(`\nBenchmark results written to: ${outputPath}`);
82
+ }
83
+ function printResultTable(results) {
84
+ console.log('\n=== Parser Benchmark Results ===\n');
85
+ console.log(`${'Corpus'.padEnd(25)} ${'Size'.padStart(8)} ${'Nodes'.padStart(8)} ${'Stmts'.padStart(7)} ${'Errors'.padStart(7)} ${'Median'.padStart(10)} ${'Min'.padStart(10)} ${'Max'.padStart(10)} ${'Avg'.padStart(10)} ${'Nodes/s'.padStart(12)}`);
86
+ console.log('-'.repeat(117));
87
+ for (const r of results) {
88
+ const sizeKB = `${(r.fileSizeBytes / 1024).toFixed(1)}KB`;
89
+ console.log(`${r.corpus.padEnd(25)} ${sizeKB.padStart(8)} ${String(r.nodeCount).padStart(8)} ${String(r.statementCount).padStart(7)} ${String(r.errorCount).padStart(7)} ${r.medianMs.toFixed(2).padStart(10)} ${r.minMs
90
+ .toFixed(2)
91
+ .padStart(10)} ${r.maxMs.toFixed(2).padStart(10)} ${r.avgMs.toFixed(2).padStart(10)} ${Math.round(r.nodesPerSec)
92
+ .toLocaleString()
93
+ .padStart(12)}`);
94
+ }
95
+ console.log('');
96
+ }
97
+ /**
98
+ * Count all AST nodes by walking the tree recursively.
99
+ * Pyright parse nodes have: { nodeType, d: { ...children }, ... }
100
+ */
101
+ function countNodes(node) {
102
+ if (!node || typeof node !== 'object' || !('nodeType' in node)) {
103
+ return 0;
104
+ }
105
+ let count = 1;
106
+ // Walk the .d data bag where child nodes live
107
+ const data = node.d;
108
+ if (data && typeof data === 'object') {
109
+ for (const key of Object.keys(data)) {
110
+ const val = data[key];
111
+ if (val && typeof val === 'object') {
112
+ if ('nodeType' in val) {
113
+ count += countNodes(val);
114
+ }
115
+ else if (Array.isArray(val)) {
116
+ for (const item of val) {
117
+ if (item && typeof item === 'object' && 'nodeType' in item) {
118
+ count += countNodes(item);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+ return count;
126
+ }
127
+ function benchmarkParse(corpusName, code) {
128
+ const times = [];
129
+ let nodeCount = 0;
130
+ let statementCount = 0;
131
+ let errorCount = 0;
132
+ const parseOptions = new parser_1.ParseOptions();
133
+ // Warmup
134
+ for (let i = 0; i < WARMUP_ITERATIONS; i++) {
135
+ const parser = new parser_1.Parser();
136
+ const diagSink = new diagnosticSink_1.DiagnosticSink();
137
+ parser.parseSourceFile(code, parseOptions, diagSink);
138
+ }
139
+ // Benchmark
140
+ for (let i = 0; i < BENCHMARK_ITERATIONS; i++) {
141
+ const parser = new parser_1.Parser();
142
+ const diagSink = new diagnosticSink_1.DiagnosticSink();
143
+ const start = performance.now();
144
+ const result = parser.parseSourceFile(code, parseOptions, diagSink);
145
+ const elapsed = performance.now() - start;
146
+ times.push(elapsed);
147
+ statementCount = result.parserOutput.parseTree.d.statements.length;
148
+ errorCount = diagSink.getErrors().length;
149
+ // Count nodes on the last iteration only (it's expensive)
150
+ if (i === BENCHMARK_ITERATIONS - 1) {
151
+ nodeCount = countNodes(result.parserOutput.parseTree);
152
+ }
153
+ }
154
+ const stats = calculateStats(times);
155
+ return {
156
+ corpus: corpusName,
157
+ fileSizeBytes: Buffer.byteLength(code, 'utf-8'),
158
+ iterations: BENCHMARK_ITERATIONS,
159
+ timesMs: times,
160
+ medianMs: stats.median,
161
+ p95Ms: stats.p95,
162
+ minMs: stats.min,
163
+ maxMs: stats.max,
164
+ avgMs: stats.avg,
165
+ nodeCount,
166
+ nodesPerSec: nodeCount / (stats.median / 1000),
167
+ statementCount,
168
+ errorCount,
169
+ };
170
+ }
171
+ // --- Corpus definitions ---
172
+ const corpora = [
173
+ { name: 'large_stdlib', file: 'large_stdlib.py' },
174
+ { name: 'fstring_heavy', file: 'fstring_heavy.py' },
175
+ { name: 'comment_heavy', file: 'comment_heavy.py' },
176
+ { name: 'large_class', file: 'large_class.py' },
177
+ { name: 'import_heavy', file: 'import_heavy.py' },
178
+ { name: 'union_heavy', file: 'union_heavy.py' },
179
+ ];
180
+ // --- Tests ---
181
+ describe('Parser Benchmark', () => {
182
+ const allResults = [];
183
+ for (const { name, file } of corpora) {
184
+ test(`parse ${name}`, () => {
185
+ const code = loadCorpus(file);
186
+ const result = benchmarkParse(name, code);
187
+ allResults.push(result);
188
+ console.log(` ${name}: median=${result.medianMs.toFixed(2)}ms, nodes=${result.nodeCount}, stmts=${result.statementCount}, nodes/sec=${Math.round(result.nodesPerSec).toLocaleString()}`);
189
+ // Sanity: parser should produce statements
190
+ expect(result.statementCount).toBeGreaterThan(0);
191
+ // Sanity: should complete in reasonable time (< 10s per file)
192
+ expect(result.medianMs).toBeLessThan(10000);
193
+ });
194
+ }
195
+ test('scaled corpus (10x large_stdlib)', () => {
196
+ const base = loadCorpus('large_stdlib.py');
197
+ const scaled = Array(10).fill(base).join('\n');
198
+ const result = benchmarkParse('large_stdlib_10x', scaled);
199
+ allResults.push(result);
200
+ console.log(` large_stdlib_10x: median=${result.medianMs.toFixed(2)}ms, nodes=${result.nodeCount}, nodes/sec=${Math.round(result.nodesPerSec).toLocaleString()}`);
201
+ expect(result.statementCount).toBeGreaterThan(0);
202
+ });
203
+ afterAll(() => {
204
+ if (allResults.length === 0) {
205
+ return;
206
+ }
207
+ printResultTable(allResults);
208
+ const report = {
209
+ timestamp: new Date().toISOString(),
210
+ system: getSystemInfo(),
211
+ config: {
212
+ warmupIterations: WARMUP_ITERATIONS,
213
+ benchmarkIterations: BENCHMARK_ITERATIONS,
214
+ },
215
+ results: allResults,
216
+ };
217
+ writeReport(report);
218
+ });
219
+ });
220
+ //# sourceMappingURL=parserBenchmark.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parserBenchmark.test.js","sourceRoot":"","sources":["../../../../../../src/tests/benchmarks/parserBenchmark.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /*
3
+ * tokenizerBenchmark.test.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ *
6
+ * Microbenchmark for the Python tokenizer.
7
+ * Measures tokens/sec and time-to-tokenize across representative corpora.
8
+ *
9
+ * Run with:
10
+ * cd packages/pyright-internal
11
+ * node node_modules\jest\bin\jest tokenizerBenchmark.test --runInBand --detectOpenHandles --forceExit --testTimeout=300000
12
+ *
13
+ * Results are written as JSON to:
14
+ * src/tests/benchmarks/.generated/benchmark-results/tokenizer/
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const child_process_1 = require("child_process");
41
+ const fs = __importStar(require("fs"));
42
+ const os = __importStar(require("os"));
43
+ const path = __importStar(require("path"));
44
+ const tokenizer_1 = require("../../parser/tokenizer");
45
+ // --- Configuration ---
46
+ const WARMUP_ITERATIONS = 3;
47
+ const BENCHMARK_ITERATIONS = 10;
48
+ const BENCHMARK_OUTPUT_DIR = path.join(__dirname, '.generated', 'benchmark-results', 'tokenizer');
49
+ const JEST_BIN_PATH = path.resolve(__dirname, '..', '..', '..', 'node_modules', 'jest', 'bin', 'jest.js');
50
+ const CHILD_RESULT_PREFIX = '__TOKENIZER_BENCHMARK_RESULT__';
51
+ const CHILD_MODE_ENV = 'PYRIGHT_TOKENIZER_BENCH_CHILD';
52
+ const RUN_BENCHMARKS_ENV = 'PYRIGHT_RUN_BENCHMARKS';
53
+ // --- Helpers ---
54
+ function calculateStats(times) {
55
+ const sorted = [...times].sort((a, b) => a - b);
56
+ const len = sorted.length;
57
+ const median = len % 2 === 0 ? (sorted[len / 2 - 1] + sorted[len / 2]) / 2 : sorted[Math.floor(len / 2)];
58
+ const p95Index = Math.ceil(len * 0.95) - 1;
59
+ const p95 = sorted[Math.min(p95Index, len - 1)];
60
+ const min = sorted[0];
61
+ const max = sorted[len - 1];
62
+ const avg = times.reduce((a, b) => a + b, 0) / len;
63
+ return { median, p95, min, max, avg };
64
+ }
65
+ function loadCorpus(filename) {
66
+ const filePath = path.resolve(__dirname, '..', 'benchmarkData', filename);
67
+ return fs.readFileSync(filePath, 'utf-8');
68
+ }
69
+ function getSystemInfo() {
70
+ const cpus = os.cpus();
71
+ return {
72
+ platform: os.platform(),
73
+ arch: os.arch(),
74
+ cpus: cpus[0]?.model ?? 'unknown',
75
+ cpuCount: cpus.length,
76
+ totalMemoryMB: Math.round(os.totalmem() / (1024 * 1024)),
77
+ nodeVersion: process.version,
78
+ };
79
+ }
80
+ function writeReport(report) {
81
+ fs.mkdirSync(BENCHMARK_OUTPUT_DIR, { recursive: true });
82
+ const filename = `tokenizer-benchmark-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
83
+ const outputPath = path.join(BENCHMARK_OUTPUT_DIR, filename);
84
+ fs.writeFileSync(outputPath, JSON.stringify(report, undefined, 2), 'utf-8');
85
+ console.log(`\nBenchmark results written to: ${outputPath}`);
86
+ }
87
+ function printResultTable(results) {
88
+ console.log('\n=== Tokenizer Benchmark Results ===\n');
89
+ console.log(`${'Corpus'.padEnd(25)} ${'Size'.padStart(8)} ${'Tokens'.padStart(8)} ${'Median'.padStart(10)} ${'Min'.padStart(10)} ${'Max'.padStart(10)} ${'Avg'.padStart(10)} ${'p95'.padStart(10)} ${'Tok/sec'.padStart(12)}`);
90
+ console.log('-'.repeat(113));
91
+ for (const result of results) {
92
+ const sizeKB = `${(result.fileSizeBytes / 1024).toFixed(1)}KB`;
93
+ console.log(`${result.corpus.padEnd(25)} ${sizeKB.padStart(8)} ${String(result.tokenCount).padStart(8)} ${result.medianMs.toFixed(2).padStart(10)} ${result.minMs.toFixed(2).padStart(10)} ${result.maxMs
94
+ .toFixed(2)
95
+ .padStart(10)} ${result.avgMs.toFixed(2).padStart(10)} ${result.p95Ms
96
+ .toFixed(2)
97
+ .padStart(10)} ${Math.round(result.tokensPerSec).toLocaleString().padStart(12)}`);
98
+ }
99
+ console.log('');
100
+ }
101
+ function emitChildResult(result) {
102
+ process.stdout.write(`${CHILD_RESULT_PREFIX}${JSON.stringify(result)}\n`);
103
+ }
104
+ function getChildOutput(error) {
105
+ if (!(error instanceof Error)) {
106
+ return '';
107
+ }
108
+ const stdout = 'stdout' in error && typeof error.stdout === 'string' ? error.stdout : '';
109
+ const stderr = 'stderr' in error && typeof error.stderr === 'string' ? error.stderr : '';
110
+ return [stdout, stderr].filter((part) => part.length > 0).join('\n');
111
+ }
112
+ function escapeRegExp(text) {
113
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
114
+ }
115
+ function runBenchmarkInFreshProcess(testName) {
116
+ try {
117
+ const output = (0, child_process_1.execFileSync)(process.execPath, [
118
+ JEST_BIN_PATH,
119
+ __filename,
120
+ '--runInBand',
121
+ '--forceExit',
122
+ '--testTimeout=300000',
123
+ '--testNamePattern',
124
+ `^Tokenizer Benchmark ${escapeRegExp(testName)}$`,
125
+ ], {
126
+ cwd: path.resolve(__dirname, '..', '..', '..'),
127
+ encoding: 'utf-8',
128
+ env: {
129
+ ...process.env,
130
+ [CHILD_MODE_ENV]: '1',
131
+ },
132
+ });
133
+ const resultLine = output.split(/\r?\n/).find((line) => line.startsWith(CHILD_RESULT_PREFIX));
134
+ if (!resultLine) {
135
+ throw new Error(`Child benchmark for "${testName}" did not emit a result.\n${output}`);
136
+ }
137
+ return JSON.parse(resultLine.slice(CHILD_RESULT_PREFIX.length));
138
+ }
139
+ catch (error) {
140
+ const output = getChildOutput(error);
141
+ const message = error instanceof Error ? error.message : String(error);
142
+ throw new Error(`Child benchmark for "${testName}" failed.\n${message}${output ? `\n${output}` : ''}`);
143
+ }
144
+ }
145
+ function benchmarkTokenize(corpusName, code) {
146
+ const times = [];
147
+ let tokenCount = 0;
148
+ for (let i = 0; i < WARMUP_ITERATIONS; i++) {
149
+ const tokenizer = new tokenizer_1.Tokenizer();
150
+ tokenizer.tokenize(code);
151
+ }
152
+ for (let i = 0; i < BENCHMARK_ITERATIONS; i++) {
153
+ const tokenizer = new tokenizer_1.Tokenizer();
154
+ const start = performance.now();
155
+ const results = tokenizer.tokenize(code);
156
+ const elapsed = performance.now() - start;
157
+ times.push(elapsed);
158
+ tokenCount = results.tokens.count;
159
+ }
160
+ const stats = calculateStats(times);
161
+ return {
162
+ corpus: corpusName,
163
+ fileSizeBytes: Buffer.byteLength(code, 'utf-8'),
164
+ iterations: BENCHMARK_ITERATIONS,
165
+ timesMs: times,
166
+ medianMs: stats.median,
167
+ p95Ms: stats.p95,
168
+ minMs: stats.min,
169
+ maxMs: stats.max,
170
+ avgMs: stats.avg,
171
+ tokenCount,
172
+ tokensPerSec: tokenCount / (stats.median / 1000),
173
+ };
174
+ }
175
+ // --- Corpus definitions ---
176
+ const corpora = [
177
+ { name: 'large_stdlib', file: 'large_stdlib.py' },
178
+ { name: 'fstring_heavy', file: 'fstring_heavy.py' },
179
+ { name: 'comment_heavy', file: 'comment_heavy.py' },
180
+ { name: 'large_class', file: 'large_class.py' },
181
+ { name: 'import_heavy', file: 'import_heavy.py' },
182
+ { name: 'union_heavy', file: 'union_heavy.py' },
183
+ { name: 'repetitive_identifiers', file: 'repetitive_identifiers.py' },
184
+ ];
185
+ // --- Tests ---
186
+ const benchmarkSuite = process.env[RUN_BENCHMARKS_ENV] === '1' ? describe : describe.skip;
187
+ benchmarkSuite('Tokenizer Benchmark', () => {
188
+ const allResults = [];
189
+ const isChildProcess = process.env[CHILD_MODE_ENV] === '1';
190
+ for (const { name, file } of corpora) {
191
+ test(`tokenize ${name}`, () => {
192
+ const result = isChildProcess
193
+ ? benchmarkTokenize(name, loadCorpus(file))
194
+ : runBenchmarkInFreshProcess(`tokenize ${name}`);
195
+ if (!isChildProcess) {
196
+ allResults.push(result);
197
+ }
198
+ console.log(` ${name}: median=${result.medianMs.toFixed(2)}ms, tokens=${result.tokenCount}, tok/sec=${Math.round(result.tokensPerSec).toLocaleString()}`);
199
+ if (isChildProcess) {
200
+ emitChildResult(result);
201
+ }
202
+ expect(result.tokenCount).toBeGreaterThan(0);
203
+ expect(result.medianMs).toBeLessThan(5000);
204
+ });
205
+ }
206
+ test('scaled corpus (10x large_stdlib)', () => {
207
+ const result = isChildProcess
208
+ ? benchmarkTokenize('large_stdlib_10x', Array(10).fill(loadCorpus('large_stdlib.py')).join('\n'))
209
+ : runBenchmarkInFreshProcess('scaled corpus (10x large_stdlib)');
210
+ if (!isChildProcess) {
211
+ allResults.push(result);
212
+ }
213
+ console.log(` large_stdlib_10x: median=${result.medianMs.toFixed(2)}ms, tokens=${result.tokenCount}, tok/sec=${Math.round(result.tokensPerSec).toLocaleString()}`);
214
+ if (isChildProcess) {
215
+ emitChildResult(result);
216
+ }
217
+ expect(result.tokenCount).toBeGreaterThan(0);
218
+ });
219
+ afterAll(() => {
220
+ if (isChildProcess || allResults.length === 0) {
221
+ return;
222
+ }
223
+ printResultTable(allResults);
224
+ const report = {
225
+ timestamp: new Date().toISOString(),
226
+ system: getSystemInfo(),
227
+ config: {
228
+ warmupIterations: WARMUP_ITERATIONS,
229
+ benchmarkIterations: BENCHMARK_ITERATIONS,
230
+ },
231
+ results: allResults,
232
+ };
233
+ writeReport(report);
234
+ });
235
+ });
236
+ //# sourceMappingURL=tokenizerBenchmark.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizerBenchmark.test.js","sourceRoot":"","sources":["../../../../../../src/tests/benchmarks/tokenizerBenchmark.test.ts"],"names":[],"mappings":"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"}
@@ -1410,7 +1410,8 @@ test('Lines1', () => {
1410
1410
  });
1411
1411
  test('Comments1', () => {
1412
1412
  const t = new tokenizer_1.Tokenizer();
1413
- const results = t.tokenize('# hello\n# good bye\n\n\n""" test """ # another\n\n\npass');
1413
+ const text = '# hello\n# good bye\n\n\n""" test """ # another\n\n\npass';
1414
+ const results = t.tokenize(text);
1414
1415
  assert_1.default.equal(results.tokens.count, 4 + _implicitTokenCount);
1415
1416
  const token0 = results.tokens.getItemAt(0);
1416
1417
  assert_1.default.equal(token0.type, 2 /* TokenType.NewLine */);
@@ -1439,7 +1440,8 @@ test('Comments1', () => {
1439
1440
  });
1440
1441
  test('Comments2', () => {
1441
1442
  const t = new tokenizer_1.Tokenizer();
1442
- const results = t.tokenize('class A:\n def func(self):\n pass\n # comment\n ');
1443
+ const text = 'class A:\n def func(self):\n pass\n # comment\n ';
1444
+ const results = t.tokenize(text);
1443
1445
  assert_1.default.equal(results.tokens.count, 16 + _implicitTokenCount);
1444
1446
  const token17 = results.tokens.getItemAt(17);
1445
1447
  assert_1.default.equal(token17.type, 1 /* TokenType.EndOfStream */);
@@ -1524,6 +1526,19 @@ test('TypeIgnoreLine2', () => {
1524
1526
  assert_1.default.equal(results.tokens.contains(41), true);
1525
1527
  assert_1.default.equal(results.tokens.contains(42), false);
1526
1528
  });
1529
+ test('TypeIgnoreLineMalformedBracket', () => {
1530
+ const t = new tokenizer_1.Tokenizer();
1531
+ const results = t.tokenize('a = 3 # type: ignore[broken');
1532
+ assert_1.default.equal(results.typeIgnoreLines.size, 0);
1533
+ });
1534
+ // A space-separated unclosed bracket (e.g. `# type: ignore [broken`) is also
1535
+ // rejected entirely. The tokenizer does not fall back to treating the
1536
+ // directive as "ignore all" when the bracket list is present but malformed.
1537
+ test('TypeIgnoreLineMalformedBracketWithSpace', () => {
1538
+ const t = new tokenizer_1.Tokenizer();
1539
+ const results = t.tokenize('a = 3 # type: ignore [broken');
1540
+ assert_1.default.equal(results.typeIgnoreLines.size, 0);
1541
+ });
1527
1542
  // Regression test for https://github.com/microsoft/pyright/issues/11345.
1528
1543
  // type: ignore comments containing tool-namespaced codes (e.g. "ty:rule-name")
1529
1544
  // must be recognised as type: ignore comments.