aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler-args-app.ts1
-rw-r--r--lib/compilers/argument-parsers.ts19
-rw-r--r--lib/compilers/haskell.ts6
3 files changed, 23 insertions, 3 deletions
diff --git a/compiler-args-app.ts b/compiler-args-app.ts
index 9392f226c..c743e7db2 100644
--- a/compiler-args-app.ts
+++ b/compiler-args-app.ts
@@ -62,6 +62,7 @@ const compilerParsers = {
turboc: Parsers.TurboCParser,
toit: Parsers.ToitParser,
circle: Parsers.CircleParser,
+ ghc: Parsers.GHCParser,
};
class CompilerArgsApp {
diff --git a/lib/compilers/argument-parsers.ts b/lib/compilers/argument-parsers.ts
index 414d29880..9593f2376 100644
--- a/lib/compilers/argument-parsers.ts
+++ b/lib/compilers/argument-parsers.ts
@@ -950,3 +950,22 @@ export class FlangParser extends ClangParser {
return possible;
}
}
+
+export class GHCParser extends GCCParser {
+ static override async parse(compiler) {
+ const results = await Promise.all([this.getOptions(compiler, '--help')]);
+ const options = Object.assign({}, ...results);
+ await this.setCompilerSettingsFromOptions(compiler, options);
+ return compiler;
+ }
+
+ static override async getOptions(compiler, helpArg) {
+ const optionFinder1 = /^ {4}(-[\w[\]]+)\s+(.*)/i;
+ const optionFinder2 = /^ {4}(-[\w[\]]+)/;
+ const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
+ const options = result.code === 0 ? this.parseLines(result.stdout, optionFinder1, optionFinder2) : {};
+
+ compiler.possibleArguments.populateOptions(options);
+ return options;
+ }
+}
diff --git a/lib/compilers/haskell.ts b/lib/compilers/haskell.ts
index 4446127e7..de5f054d8 100644
--- a/lib/compilers/haskell.ts
+++ b/lib/compilers/haskell.ts
@@ -28,7 +28,7 @@ import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
import {BaseCompiler} from '../base-compiler.js';
-import {ClangParser} from './argument-parsers.js';
+import {GHCParser} from './argument-parsers.js';
export class HaskellCompiler extends BaseCompiler {
static get key() {
@@ -76,7 +76,7 @@ export class HaskellCompiler extends BaseCompiler {
return [libPathFlag + '.', ...this.getSharedLibraryPaths(libraries).map(path => libPathFlag + path)];
}
- override getArgumentParser() {
- return ClangParser;
+ override getArgumentParser(): any {
+ return GHCParser;
}
}