|
8 | 8 | PROJECT_FROM_CONFIG,
|
9 | 9 | createAdaTaskProvider,
|
10 | 10 | createSparkTaskProvider,
|
| 11 | + getEnclosingSymbol, |
| 12 | + getSelectedRegion, |
11 | 13 | } from '../../../src/taskProviders';
|
12 | 14 | import { activate } from '../utils';
|
13 | 15 |
|
@@ -277,6 +279,79 @@ ada: Build and run main - src/test.adb - kind: buildAndRunMain`.trim();
|
277 | 279 | assert(resolved);
|
278 | 280 | assert.equal(await runTaskAndGetResult(resolved), 2);
|
279 | 281 | });
|
| 282 | + |
| 283 | + test('current regions and subprograms', async () => { |
| 284 | + assert(vscode.workspace.workspaceFolders); |
| 285 | + const testAdbUri = vscode.Uri.joinPath( |
| 286 | + vscode.workspace.workspaceFolders[0].uri, |
| 287 | + 'src', |
| 288 | + 'test.adb' |
| 289 | + ); |
| 290 | + |
| 291 | + /** |
| 292 | + * Position the cursor within the nested P3 subprogram |
| 293 | + */ |
| 294 | + await vscode.window.showTextDocument(testAdbUri, { |
| 295 | + selection: new vscode.Range(17, 13, 17, 13), |
| 296 | + }); |
| 297 | + assert.deepEqual( |
| 298 | + (await getEnclosingSymbol(vscode.window.activeTextEditor, [vscode.SymbolKind.Function])) |
| 299 | + ?.range, |
| 300 | + // The expected range is that of the inner-most subprogram P3 |
| 301 | + new vscode.Range(13, 9, 18, 16) |
| 302 | + ); |
| 303 | + assert.equal(getSelectedRegion(vscode.window.activeTextEditor), '18:18'); |
| 304 | + |
| 305 | + /** |
| 306 | + * Select a multi-line range |
| 307 | + */ |
| 308 | + await vscode.window.showTextDocument(testAdbUri, { |
| 309 | + selection: new vscode.Range(15, 13, 17, 13), |
| 310 | + }); |
| 311 | + assert.equal(getSelectedRegion(vscode.window.activeTextEditor), '16:18'); |
| 312 | + }); |
| 313 | + |
| 314 | + test('spark tasks on current location', async () => { |
| 315 | + assert(vscode.workspace.workspaceFolders); |
| 316 | + const testAdbUri = vscode.Uri.joinPath( |
| 317 | + vscode.workspace.workspaceFolders[0].uri, |
| 318 | + 'src', |
| 319 | + 'test.adb' |
| 320 | + ); |
| 321 | + |
| 322 | + { |
| 323 | + await vscode.window.showTextDocument(testAdbUri, { |
| 324 | + selection: new vscode.Range(17, 13, 17, 13), |
| 325 | + }); |
| 326 | + const tasks = await vscode.tasks.fetchTasks({ type: 'spark' }); |
| 327 | + const subPTask = tasks.find((t) => t.name == 'Prove subprogram'); |
| 328 | + assert(subPTask); |
| 329 | + assert(subPTask.execution); |
| 330 | + assert.equal( |
| 331 | + getCmdLine(subPTask.execution as vscode.ShellExecution), |
| 332 | + `gnatprove -j0 -P ${await getProjectFile()} ` + |
| 333 | + `--limit-subp=\${fileBasename}:14 -cargs:ada -gnatef` |
| 334 | + ); |
| 335 | + } |
| 336 | + |
| 337 | + { |
| 338 | + await vscode.window.showTextDocument(testAdbUri, { |
| 339 | + selection: new vscode.Range(20, 0, 23, 0), |
| 340 | + }); |
| 341 | + /** |
| 342 | + * Compute the tasks again after the change of selection |
| 343 | + */ |
| 344 | + const tasks = await vscode.tasks.fetchTasks({ type: 'spark' }); |
| 345 | + const regionTask = tasks.find((t) => t.name == 'Prove selected region'); |
| 346 | + assert(regionTask); |
| 347 | + assert(regionTask.execution); |
| 348 | + assert.equal( |
| 349 | + getCmdLine(regionTask.execution as vscode.ShellExecution), |
| 350 | + `gnatprove -j0 -u \${fileBasename} -P ${await getProjectFile()} ` + |
| 351 | + `--limit-region=\${fileBasename}:21:24 -cargs:ada -gnatef` |
| 352 | + ); |
| 353 | + } |
| 354 | + }); |
280 | 355 | });
|
281 | 356 |
|
282 | 357 | async function runTaskAndGetResult(task: vscode.Task): Promise<number | undefined> {
|
|
0 commit comments