Skip to content

Commit 4382d31

Browse files
authored
Merge pull request #518 from fortran-lang:gnikit/issue517
Gnikit/issue517
2 parents 18cafd9 + 4b614e2 commit 4382d31

File tree

6 files changed

+57
-10
lines changed

6 files changed

+57
-10
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
7777

7878
### Fixed
7979

80+
- Fixed formatter output mixes stdout and stderr
81+
([#517](https://github.com/fortran-lang/vscode-fortran-support/issues/517))
8082
- Fixed `error stop variable` syntax highlighting
8183
([#486](https://github.com/fortran-lang/vscode-fortran-support/issues/486))
8284
- Fixed issue with linter cache containing outdated folders

src/features/formatting-provider.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ export class FortranFormattingProvider implements vscode.DocumentFormattingEditP
6464

6565
const args: string[] = ['--stdout', ...this.getFormatterArgs()];
6666
const edits: vscode.TextEdit[] = [];
67-
const output = await spawnAsPromise(formatter, args, undefined, document.getText());
68-
edits.push(new vscode.TextEdit(getWholeFileRange(document), output));
67+
const [stdout, stderr] = await spawnAsPromise(formatter, args, undefined, document.getText());
68+
edits.push(new vscode.TextEdit(getWholeFileRange(document), stdout));
69+
if (stderr) this.logger.logInfo(`fprettify error output: ${stderr}`);
6970
return edits;
7071
}
7172

@@ -88,8 +89,9 @@ export class FortranFormattingProvider implements vscode.DocumentFormattingEditP
8889

8990
const args: string[] = this.getFormatterArgs();
9091
const edits: vscode.TextEdit[] = [];
91-
const output = await spawnAsPromise(formatter, args, undefined, document.getText());
92-
edits.push(new vscode.TextEdit(getWholeFileRange(document), output));
92+
const [stdout, stderr] = await spawnAsPromise(formatter, args, undefined, document.getText());
93+
edits.push(new vscode.TextEdit(getWholeFileRange(document), stdout));
94+
if (stderr) this.logger.logInfo(`findent error output: ${stderr}`);
9395
return edits;
9496
}
9597

src/lib/tools.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -264,18 +264,18 @@ export async function spawnAsPromise(
264264
options: cp.SpawnOptions | undefined,
265265
input: string | undefined
266266
) {
267-
return new Promise<string>((resolve, reject) => {
268-
// You could separate STDOUT and STDERR if your heart so desires...
269-
let output = '';
267+
return new Promise<[string, string]>((resolve, reject) => {
268+
let stdout = '';
269+
let stderr = '';
270270
const child = cp.spawn(cmd, args, options);
271271
child.stdout.on('data', data => {
272-
output += data;
272+
stdout += data;
273273
});
274274
child.stderr.on('data', data => {
275-
output += data;
275+
stderr += data;
276276
});
277277
child.on('close', code => {
278-
code === 0 ? resolve(output) : reject(output);
278+
code === 0 ? resolve([stdout, stderr]) : reject([stdout, stderr]);
279279
});
280280
child.on('error', err => {
281281
reject(err.toString());

test/formatting-provider.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@ end program main
5555
end do
5656
end do
5757
end program main
58+
`;
59+
strictEqual(edits[0].newText.toString(), ref);
60+
});
61+
62+
test(`Using fprettify with stderr`, async () => {
63+
doc = await vscode.workspace.openTextDocument(
64+
vscode.Uri.file(
65+
path.resolve(__dirname, '../../test/resources/formatting_test_fprettify_long_lines.f90')
66+
)
67+
);
68+
const edits = await fmt['doFormatFprettify'](doc);
69+
const ref = `program demo
70+
71+
write(*, "('Just a very long line. Just a very long line. Just a very long line. Just a very long line. Just a very long line. Just a very long line. ',i0)") 100
72+
73+
end program
5874
`;
5975
strictEqual(edits[0].newText.toString(), ref);
6076
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
program demo
2+
3+
write(*, "('Just a very long line. Just a very long line. Just a very long line. Just a very long line. Just a very long line. Just a very long line. ',i0)") 100
4+
5+
endprogram
6+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
>program demo
2+
#^^^^^^^ source.fortran.free meta.program.fortran keyword.control.program.fortran
3+
# ^ source.fortran.free meta.program.fortran
4+
# ^^^^ source.fortran.free meta.program.fortran entity.name.program.fortran
5+
>
6+
> write(*, "('Just a very long line. Just a very long line. Just a very long line. Just a very long line. Just a very long line. Just a very long line. ',i0)") 100
7+
#^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran
8+
# ^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran keyword.control.write.fortran
9+
# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran punctuation.parentheses.left.fortran
10+
# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran keyword.operator.power.fortran
11+
# ^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran
12+
# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran string.quoted.double.fortran punctuation.definition.string.begin.fortran
13+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran string.quoted.double.fortran
14+
# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran string.quoted.double.fortran punctuation.definition.string.end.fortran
15+
# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran punctuation.parentheses.right.fortran
16+
# ^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran meta.name-list.fortran
17+
# ^^^ source.fortran.free meta.program.fortran meta.block.specification.program.fortran meta.statement.IO.fortran meta.name-list.fortran constant.numeric.fortran
18+
>
19+
>endprogram
20+
#^^^^^^^^^^ source.fortran.free meta.program.fortran keyword.control.endprogram.fortran
21+
>

0 commit comments

Comments
 (0)