Migrate to Biome for linting and formatting (#7033)

This commit is contained in:
Mats Jun Larsen
2025-02-03 02:54:31 +09:00
committed by GitHub
parent 7adb9f3b3e
commit 5eea63328f
367 changed files with 2437 additions and 6217 deletions

View File

@@ -2,11 +2,11 @@
"name": "compiler-explorer", "name": "compiler-explorer",
"dockerFile": "Dockerfile", "dockerFile": "Dockerfile",
"build": { "build": {
"args": {"NODE_MAJOR_VERSION": "20"} "args": { "NODE_MAJOR_VERSION": "20" }
}, },
"postCreateCommand": [".devcontainer/post-create.sh"], "postCreateCommand": [".devcontainer/post-create.sh"],
"portsAttributes": { "portsAttributes": {
"10240": {"label": "Compiler Explorer"} "10240": { "label": "Compiler Explorer" }
}, },
"customizations": { "customizations": {
"vscode": { "vscode": {

View File

@@ -1,32 +0,0 @@
---
plugins:
- eslint-plugin-header
rules:
header/header:
- off
- line
- - pattern: '^ Copyright \\(c\\) \\d{4}, .*$'
template: ' Copyright (c) 2022, Compiler Explorer Authors'
- ' All rights reserved.'
- ''
- ' Redistribution and use in source and binary forms, with or without'
- ' modification, are permitted provided that the following conditions are met:'
- ''
- ' * Redistributions of source code must retain the above copyright notice,'
- ' this list of conditions and the following disclaimer.'
- ' * Redistributions in binary form must reproduce the above copyright'
- ' notice, this list of conditions and the following disclaimer in the'
- ' documentation and/or other materials provided with the distribution.'
- ''
- ' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"'
- ' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE'
- ' IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE'
- ' ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE'
- ' LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR'
- ' CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF'
- ' SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS'
- ' INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN'
- ' CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)'
- ' ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE'
- ' POSSIBILITY OF SUCH DAMAGE.'
- 1

View File

@@ -1,12 +0,0 @@
# If you change this file, please also modify .prettierignore
# Uninteresting folders (node_modules and dotfiles/dotfolders ignored by default)
coverage
docs
etc
examples
out
views
# Autogenerated files
lib/asm-docs/generated/asm-docs-*
etc/scripts/docenizer/vendor/jvms.html

View File

@@ -1,181 +0,0 @@
---
root: true
plugins:
- import
- jsdoc
- n
- promise
- sonarjs
- prettier
- unicorn
- '@typescript-eslint'
- unused-imports
extends:
- ./.eslint-license-header.yml
- eslint:recommended
- plugin:import/recommended
- plugin:n/recommended
- plugin:unicorn/recommended
- prettier
- plugin:@typescript-eslint/eslint-recommended
- plugin:@typescript-eslint/recommended
- plugin:import/typescript
env:
node: true
es6: true
rules:
prettier/prettier: error
comma-dangle:
- error
- arrays: always-multiline
objects: always-multiline
imports: always-multiline
exports: always-multiline
functions: always-multiline
eol-last:
- error
- always
eqeqeq:
- error
- smart
import/default: off # fs-extra trips this. the ts compiler catches actual errors
import/extensions: error
import/first: error
import/newline-after-import: error
import/no-absolute-path: error
#import/no-cycle: error # TODO(jeremy-rifkin) disabled for now due to compilation types
import/no-default-export: error
import/no-deprecated: error
import/no-mutable-exports: error
import/no-named-as-default-member: off # Far too many things (express, morgan, fs) trip this
import/no-self-import: error
import/no-useless-path-segments: error
import/no-webpack-loader-syntax: error
import/no-unresolved: off # Doesn't like .js files
import/order:
- error
- alphabetize:
order: asc
caseInsensitive: true
newlines-between: always
max-len:
- error
- 120
- ignoreRegExpLiterals: true
max-statements:
- error
- 100 # TODO reduce...was 50
no-console: error
no-control-regex: 0
no-duplicate-imports: error
no-useless-call: error
no-useless-computed-key: error
no-useless-concat: error
'@typescript-eslint/no-useless-constructor': error
no-useless-escape: error
no-useless-rename: error
no-useless-return: error
no-empty:
- error
- allowEmptyCatch: true
quote-props:
- error
- as-needed
quotes:
- error
- single
- allowTemplateLiterals: true
avoidEscape: true
semi:
- error
- always
space-before-function-paren:
- error
- anonymous: always
asyncArrow: always
named: never
keyword-spacing:
- error
- after: true
yoda:
- error
- never
- onlyEquality: true
prefer-const:
- error
- destructuring: all
jsdoc/check-alignment: error
jsdoc/check-param-names: error
jsdoc/check-syntax: error
jsdoc/check-tag-names: off
jsdoc/check-types: error
jsdoc/empty-tags: error
jsdoc/require-hyphen-before-param-description: error
jsdoc/valid-types: error
no-multiple-empty-lines:
- error
- max: 1
maxBOF: 0
maxEOF: 0
n/no-process-exit: off
promise/catch-or-return: error
promise/no-new-statics: error
promise/no-return-wrap: error
promise/param-names: error
promise/valid-params: error
sonarjs/no-collection-size-mischeck: error
sonarjs/no-redundant-boolean: error
sonarjs/no-unused-collection: error
sonarjs/prefer-immediate-return: error
sonarjs/prefer-object-literal: error
sonarjs/prefer-single-boolean-return: error
sort-imports:
- error
- ignoreCase: true
ignoreDeclarationSort: true
unicorn/catch-error-name: off
unicorn/consistent-function-scoping: off
unicorn/empty-brace-spaces: off
unicorn/no-fn-reference-in-iterator: off
unicorn/no-hex-escape: off
unicorn/no-null: off
unicorn/no-reduce: off
unicorn/numeric-separators-style: off
unicorn/prefer-add-event-listener: off
unicorn/prefer-flat-map: error
unicorn/prefer-optional-catch-binding: off
unicorn/prefer-node-protocol: off # until we get node 16+
unicorn/prefer-number-properties: off
unicorn/prefer-string-slice: off
unicorn/prevent-abbreviations: off
# things we'd like to turn on but need fairly extensive code changes:
unicorn/prefer-ternary: off
unicorn/prefer-array-some: off
unicorn/prefer-spread: off
unicorn/no-lonely-if: off
unicorn/no-array-reduce: off
unicorn/prefer-array-flat: off # can't turn off yet without tests blowing up; lodash vs underscore?
unicorn/no-array-callback-reference: off
unicorn/prefer-switch: off
unicorn/no-static-only-class: off
unicorn/no-process-exit: off
unicorn/no-useless-undefined:
- error
- checkArguments: false
'unused-imports/no-unused-imports': error
'@typescript-eslint/no-empty-function': off
'@typescript-eslint/no-unused-vars': off
'@typescript-eslint/no-explicit-any': off
unicorn/prefer-at: off
unicorn/prefer-negative-index: off
parserOptions:
sourceType: module
ecmaVersion: 2020
globals:
BigInt: true
settings:
node:
tryExtensions: [.js, .ts]
import/parsers:
'@typescript-eslint/parser': [.ts, .tsx]
import/resolver: 'typescript'

View File

@@ -17,6 +17,9 @@
<MarkdownNavigatorCodeStyleSettings> <MarkdownNavigatorCodeStyleSettings>
<option name="RIGHT_MARGIN" value="72" /> <option name="RIGHT_MARGIN" value="72" />
</MarkdownNavigatorCodeStyleSettings> </MarkdownNavigatorCodeStyleSettings>
<ScalaCodeStyleSettings>
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
</ScalaCodeStyleSettings>
<TypeScriptCodeStyleSettings version="0"> <TypeScriptCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" /> <option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" /> <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4"> <module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager" inherit-compiler-output="true"> <component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output /> <exclude-output />
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">

View File

@@ -4,7 +4,7 @@
<inspection_tool class="ES6ConvertVarToLetConst" enabled="true" level="WARNING" enabled_by_default="false"> <inspection_tool class="ES6ConvertVarToLetConst" enabled="true" level="WARNING" enabled_by_default="false">
<scope name="Server" level="WARNING" enabled="true" /> <scope name="Server" level="WARNING" enabled="true" />
</inspection_tool> </inspection_tool>
<inspection_tool class="Eslint" enabled="true" level="ERROR" enabled_by_default="true" /> <inspection_tool class="Eslint" enabled="false" level="ERROR" enabled_by_default="false" />
<inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true"> <inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues"> <option name="myValues">
<value> <value>

8
.idea/prettier.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PrettierConfiguration">
<option name="myConfigurationMode" value="AUTOMATIC" />
<option name="myRunOnSave" value="true" />
<option name="myRunOnReformat" value="true" />
</component>
</project>

View File

@@ -1,49 +0,0 @@
#########################
# From .gitignore
# build generated files
/.node-bin
/.npm-updated
/node_modules
/out
/coverage
# generated from opcode docenzier.py scripts
/asm-docs*
# user local customizations
/etc/config/*.local.properties
/lib/storage/data
# IDE project files
/nbproject
*.vscode
*.code-workspace
# random bits
f.out
newrelic_agent.log
*.heapsnapshot
*.swp
# approval tests
*.received.*
#########################
# From .eslintignore
# Uninteresting folders (node_modules and dotfiles/dotfolders ignored by default)
etc
examples
out
cypress
# Autogenerated files
lib/asm-docs/generated/asm-docs-*
#########################
# Files we ought to ignore
static/policies/*.html
test/**/*.json

View File

@@ -1,17 +0,0 @@
module.exports = {
trailingComma: 'all',
printWidth: 120,
singleQuote: true,
arrowParens: 'avoid',
tabWidth: 4,
bracketSpacing: false,
proseWrap: 'always',
overrides: [
{
files: '*.{yml,json,md}',
options: {
tabWidth: 2,
},
},
],
};

View File

@@ -57,10 +57,6 @@ lint: $(NODE_MODULES) ## Checks if the source currently matches code convention
lint-fix: $(NODE_MODULES) ## Checks if everything matches code conventions & fixes those which are trivial to do so lint-fix: $(NODE_MODULES) ## Checks if everything matches code conventions & fixes those which are trivial to do so
$(NPM) run lint $(NPM) run lint
.PHONY: ci-lint
ci-lint: $(NODE_MODULES)
$(NPM) run ci-lint
.PHONY: test .PHONY: test
test: $(NODE_MODULES) ## Runs the tests test: $(NODE_MODULES) ## Runs the tests
$(NPM) run test $(NPM) run test

49
app.ts
View File

@@ -22,11 +22,11 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import child_process from 'child_process'; import child_process from 'node:child_process';
import os from 'os'; import os from 'node:os';
import path from 'path'; import path from 'node:path';
import process from 'process'; import process from 'node:process';
import url from 'url'; import url from 'node:url';
import * as Sentry from '@sentry/node'; import * as Sentry from '@sentry/node';
import compression from 'compression'; import compression from 'compression';
@@ -67,7 +67,7 @@ import {cached, csp} from './lib/handlers/middleware.js';
import {NoScriptHandler} from './lib/handlers/noscript.js'; import {NoScriptHandler} from './lib/handlers/noscript.js';
import {RouteAPI, ShortLinkMetaData} from './lib/handlers/route-api.js'; import {RouteAPI, ShortLinkMetaData} from './lib/handlers/route-api.js';
import {languages as allLanguages} from './lib/languages.js'; import {languages as allLanguages} from './lib/languages.js';
import {logger, logToLoki, logToPapertrail, makeLogStream, suppressConsoleLog} from './lib/logger.js'; import {logToLoki, logToPapertrail, logger, makeLogStream, suppressConsoleLog} from './lib/logger.js';
import {setupMetricsServer} from './lib/metrics-server.js'; import {setupMetricsServer} from './lib/metrics-server.js';
import {ClientOptionsHandler} from './lib/options-handler.js'; import {ClientOptionsHandler} from './lib/options-handler.js';
import * as props from './lib/properties.js'; import * as props from './lib/properties.js';
@@ -270,13 +270,14 @@ const isDevMode = () => process.env.NODE_ENV !== 'production';
function getFaviconFilename() { function getFaviconFilename() {
if (isDevMode()) { if (isDevMode()) {
return 'favicon-dev.ico'; return 'favicon-dev.ico';
} else if (opts.env && opts.env.includes('beta')) {
return 'favicon-beta.ico';
} else if (opts.env && opts.env.includes('staging')) {
return 'favicon-staging.ico';
} else {
return 'favicon.ico';
} }
if (opts.env?.includes('beta')) {
return 'favicon-beta.ico';
}
if (opts.env?.includes('staging')) {
return 'favicon-staging.ico';
}
return 'favicon.ico';
} }
const propHierarchy = [ const propHierarchy = [
@@ -318,9 +319,8 @@ const languages = (() => {
// Always keep cmake for IDE mode, just in case // Always keep cmake for IDE mode, just in case
filteredLangs[allLanguages.cmake.id] = allLanguages.cmake; filteredLangs[allLanguages.cmake.id] = allLanguages.cmake;
return filteredLangs; return filteredLangs;
} else {
return allLanguages;
} }
return allLanguages;
})(); })();
if (Object.keys(languages).length === 0) { if (Object.keys(languages).length === 0) {
@@ -426,10 +426,9 @@ async function setupStaticMiddleware(router: express.Router) {
pugRequireHandler = path => { pugRequireHandler = path => {
if (Object.prototype.hasOwnProperty.call(staticManifest, path)) { if (Object.prototype.hasOwnProperty.call(staticManifest, path)) {
return urljoin(staticRoot, staticManifest[path]); return urljoin(staticRoot, staticManifest[path]);
} else { }
logger.error(`failed to locate static asset '${path}' in manifest`); logger.error(`failed to locate static asset '${path}' in manifest`);
return ''; return '';
}
}; };
} }
@@ -471,7 +470,7 @@ function startListening(server: express.Express) {
if (ss) { if (ss) {
// ms (5 min default) // ms (5 min default)
const idleTimeout = process.env.IDLE_TIMEOUT; const idleTimeout = process.env.IDLE_TIMEOUT;
const timeout = (idleTimeout === undefined ? 300 : parseInt(idleTimeout)) * 1000; const timeout = (idleTimeout === undefined ? 300 : Number.parseInt(idleTimeout)) * 1000;
if (idleTimeout) { if (idleTimeout) {
const exit = () => { const exit = () => {
logger.info('Inactivity timeout reached, exiting.'); logger.info('Inactivity timeout reached, exiting.');
@@ -496,7 +495,7 @@ function startListening(server: express.Express) {
}); });
startupGauge.set(process.uptime()); startupGauge.set(process.uptime());
const startupDurationMs = Math.floor(process.uptime() * 1000); const startupDurationMs = Math.floor(process.uptime() * 1000);
if (isNaN(parseInt(_port))) { if (Number.isNaN(Number.parseInt(_port))) {
// unix socket, not a port number... // unix socket, not a port number...
logger.info(` Listening on socket: //${_port}/`); logger.info(` Listening on socket: //${_port}/`);
logger.info(` Startup duration: ${startupDurationMs}ms`); logger.info(` Startup duration: ${startupDurationMs}ms`);
@@ -522,8 +521,8 @@ const awsProps = props.propsFor('aws');
async function main() { async function main() {
await aws.initConfig(awsProps); await aws.initConfig(awsProps);
// Initialise express and then sentry. Sentry as early as possible to catch errors during startup. // Initialise express and then sentry. Sentry as early as possible to catch errors during startup.
const webServer = express(), const webServer = express();
router = express.Router(); const router = express.Router();
SetupSentry(aws.getConfig('sentryDsn'), ceProps, releaseBuildNumber, gitReleaseName, defArgs); SetupSentry(aws.getConfig('sentryDsn'), ceProps, releaseBuildNumber, gitReleaseName, defArgs);
@@ -587,9 +586,8 @@ async function main() {
if (initialFindResults.foundClash) { if (initialFindResults.foundClash) {
// If we are forced to have no clashes, throw an error with some explanation // If we are forced to have no clashes, throw an error with some explanation
throw new Error('Clashing compilers in the current environment found!'); throw new Error('Clashing compilers in the current environment found!');
} else {
logger.info('No clashing ids found, continuing normally...');
} }
logger.info('No clashing ids found, continuing normally...');
} }
} }
@@ -688,8 +686,7 @@ async function main() {
.use(Sentry.Handlers.errorHandler) .use(Sentry.Handlers.errorHandler)
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
.use((err: any, req: express.Request, res: express.Response, _next: express.NextFunction) => { .use((err: any, req: express.Request, res: express.Response, _next: express.NextFunction) => {
const status = const status = err.status || err.statusCode || err.status_code || err.output?.statusCode || 500;
err.status || err.statusCode || err.status_code || (err.output && err.output.statusCode) || 500;
const message = err.message || 'Internal Server Error'; const message = err.message || 'Internal Server Error';
res.status(status); res.status(status);
res.render('error', renderConfig({error: {code: status, message: message}})); res.render('error', renderConfig({error: {code: status, message: message}}));
@@ -736,7 +733,7 @@ async function main() {
req: express.Request, req: express.Request,
res: express.Response, res: express.Response,
) { ) {
const embedded = req.query.embedded === 'true' ? true : false; const embedded = req.query.embedded === 'true';
res.render( res.render(
embedded ? 'embed' : 'index', embedded ? 'embed' : 'index',
@@ -753,7 +750,7 @@ async function main() {
); );
} }
const embeddedHandler = function (req: express.Request, res: express.Response) { const embeddedHandler = (req: express.Request, res: express.Response) => {
res.render( res.render(
'embed', 'embed',
renderConfig( renderConfig(

76
biome.json Normal file
View File

@@ -0,0 +1,76 @@
{
"$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
"files": {
"ignore": [
"examples/**/*",
"node_modules/**/*",
"out/**/*",
"coverage/**/*",
"etc/**/*",
"static/policies/*.html",
"lib/storage/data/**/*",
"lib/asm-docs/generated/**/*",
"test/**/*.json",
"tsconfig*.json"
]
},
"linter": {
"rules": {
"suspicious": {
"noExplicitAny": "off",
"noImplicitAnyLet": "off",
"noAssignInExpressions": "off",
"noControlCharactersInRegex": "off",
"noShadowRestrictedNames": "off",
"noFallthroughSwitchClause": "off",
"noDoubleEquals": "off",
"noConfusingVoidType": "off"
},
"style": {
"noParameterAssign": "off",
"noNonNullAssertion": "off",
"useLiteralEnumMembers": "off",
"useImportType": "off",
"useTemplate": "off"
},
"correctness": {
"noVoidTypeReturn": "off",
"noUnsafeOptionalChaining": "off"
},
"performance": {
"noAccumulatingSpread": "off",
"noDelete": "off"
},
"complexity": {
"noStaticOnlyClass": "off",
"noForEach": "off",
"noBannedTypes": "off",
"useLiteralKeys": "off"
}
}
},
"formatter": {
"enabled": true,
"attributePosition": "auto",
"indentStyle": "space",
"indentWidth": 4,
"lineWidth": 120,
"lineEnding": "lf"
},
"javascript": {
"formatter": {
"arrowParentheses": "asNeeded",
"bracketSameLine": false,
"bracketSpacing": false,
"quoteProperties": "asNeeded",
"semicolons": "always",
"trailingCommas": "all",
"quoteStyle": "single"
}
},
"json": {
"formatter": {
"indentWidth": 2
}
}
}

View File

@@ -22,9 +22,6 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
/* eslint-disable unicorn/prefer-top-level-await */
/* eslint-disable no-console */
import nopt from 'nopt'; import nopt from 'nopt';
import _ from 'underscore'; import _ from 'underscore';
@@ -109,11 +106,10 @@ class CompilerArgsApp {
getParser() { getParser() {
if (compilerParsers[this.parserName as keyof typeof compilerParsers]) { if (compilerParsers[this.parserName as keyof typeof compilerParsers]) {
return compilerParsers[this.parserName as keyof typeof compilerParsers]; return compilerParsers[this.parserName as keyof typeof compilerParsers];
} else { }
console.error('Unknown parser type'); console.error('Unknown parser type');
process.exit(1); process.exit(1);
} }
}
async doTheParsing() { async doTheParsing() {
const parser = this.getParser(); const parser = this.getParser();

View File

@@ -1,7 +1,5 @@
// eslint-disable-next-line n/no-unpublished-import
import {defineConfig} from 'cypress'; import {defineConfig} from 'cypress';
// eslint-disable-next-line import/no-default-export
export default defineConfig({ export default defineConfig({
viewportWidth: 1000, viewportWidth: 1000,
viewportHeight: 700, viewportHeight: 700,

View File

@@ -92,7 +92,7 @@ describe('Known good state test', () => {
cy.visit( cy.visit(
// This URL manually created. If you need to update, run a local server like the docs/UsingCypress.md say, // This URL manually created. If you need to update, run a local server like the docs/UsingCypress.md say,
// then paste this into your browser, make the changes, and then re-share as a full link. // then paste this into your browser, make the changes, and then re-share as a full link.
// eslint-disable-next-line max-len
'/#z:OYLghAFBqd5TB8IAsQGMD2ATApgUWwEsAXTAJwBoiQIAzIgG1wDsBDAW1xAHIBGHpTqYWJAMro2zEHwAsQkSQCqAZ1wAFAB68ADIIBWMyozYtQ6AKQAmAELWblNc3QkiI2q2wBhTIwCuHCwgVpSeADJELLgAcgEARrjkIPIADpgqpG4sPv6BwZRpGa4iEVGxHAlJ8k64LlliJGzkJDkBQSE1dSINTSSlMfGJyY6Nza15HaN9kQMVQ7IAlI6YfuTo3DwA9JsA1AAqAJ4puDsHK%2BQ7WHg7KIm4lDsUO4yYbNg7pju4mpwpzAB0Fh0AEFIiQdioAI5%2BJq4CBgnYsAILHYWADsdhBO2xO3IuBIqxYiICOwAVMSOBYAMyY4HogAiPCWjF4AFZBEEeHpKJheF57PYIed1qirFSBJQSLomUsANYgVk6Yy8WSCDgKpWc7m8niCFQgJVSrlMyhwWBoLAsYTkDimdbUDzEMjkIjYIwmMwASTdlls9mWq3WvG2%2ByOJzOq0uOBOtzxDyeLzeHyJ31%2BAKBoNEEOhsPhWaRHBR6NpONx%2BMJFLJFOptIZJpZPHZlC1gh1PitFFtLBFADUiLgAO6JHYQQikJ7WcULQRGvQLJa3N5DCDMlVq4Ks5vSnm8PUGyXSpZmqBoch%2BFQkFBEKg0CBYDgpJiJaKcDbAAW2HZ4OhsPyMEiCLgToUK6RjCKIEhSNwcgKKIqgaNoxqUIYfCOLgzjFEEECeOMQSoeEMzlJURiFJkIi4SR6RkSw/REUMqGdJhPRjL4bRGIx9RTLRgxJAxUwUXxvTcXMvFLCQeK4KBOiro2HLbjqABK57ggAEp6Ck7H2g7Du%2Bfqft%2Bv7/iOY7OqK4oPD4D5Phck58NOB7GvOlCLngSQrsqPCqpQ6pWJuLY7rqjj7rOMqUPKshKg2VJyUhOozoepqIMeqAYJgVnMDetD3o%2BGUgMABl/iQlB4AAbkQ6xaQOADyxz%2BQw/6JPqEBxNucSRE0By8BKbXsOQBxVXE%2Bi1EaEr3lwohVSwjCdUheBxH4wBeFIjD6vwgh4F2wDSLN17DUQJW4Kt3LfLUfgkBsEpguh26MEQcTkB1Ph4Nu4lEOqa1LHQJjAColU1awXWCOB4iSNIMHA/BWjbihximOYH4OLdcT6pASyYCkmGra2B3kC6eAo%2B5HHuNhLDeKxeT4aTwnEahpGYQJBRUZh1P0WhGGcb0DNEywzHTGUPHsfx5N4SMQmEQLdkBms0GUAOpgkDVJCeh2CUNk2/k6jsul2PpuA/oVxnATZYp2fFjkLrgS5uXKGoeV5Pl%2BfJu5BYaCXJWgF5sOgsrnmwwD3Le2XWS%2BXC8NrgoFf%2BgFG6BqEwyowobCGhzHKc5xRtcsb3I8FyJu8nypg%2B6YggiUIwniebggWRYYhmpZ4gS5BEgWVYFjWGZ1pKElSTJ6tOzwPTezsqh%2ByclU6QjX564Z4KjkbZmoTslk5cOtn2SFTkucuMn2xuW6xc7%2Bqu45iXIGgKwkCkZ0OneaUr%2BQIdvpPkcAaEMduqhwOQWD8gQ2oUNIRhgOB6KRAa9xitqXgVUzpX3BJgOgWtn7TwNhAZe1kF7r0PBbK2tAd7rl8vvSBgUj4OTnKfc0IAzwXltOgcgmBvgpBvkHDKj8w5IP1lHN%2B448ZgUUN/aCv9FCQ0QtyeO6E9rExwsLIwBF%2BYiUokULIDM6ZZBZrxNmEieZC1yCLbmvM1GC05tIwSzQDGS3ErgSSbppIeT7gfHgSkLw7AALJezoTsfAmgUimAyCITS/YhwXHDrrDhs8TIThNhZO%2B6C15mznNg1yuC7b4MdvYvcx94lhRAAANkirwaKhDWzOw3jbKkaJ/hijFGiVkABONENS%2BB8CsFYNEHkrDrj4DoTU/c4kmmSklAZZ8QAnXQGdCgN8mg/XUKYdCYgUCYAHJyUa0STCYWmVERgcyFn%2BWYUMfKyD/yUF2Q/V8ztjnQPEPMxZ24RnAnID9Z2IyGjEE5EDPhoMBGwWUP/ERBh3RwwwAjYwd0CZowxlkLGPIcZ40OvAJYCdAwywvC89ZsyrlLJnBJQGssQFgNsRAopPBPGnVMsEmwU9Qkjn5HpBwHj56xNIaFLe1ssmKmSd5PeGtD7BTdklNAwB2AkDmgtCxAcsorOfKcngZKKUz2jtw2OXz%2BEyEEXBH50N2LiK6FhKROiZFU3FvI2mTMlHGMZookohqaYaO1bzLmWqmJcStazT2LE9UmL5rMGmYlu7WPAYUgKABxaIwI9g7HpLgeawB9gSX8dpIJ7CZ6G24QvKJ6VV4m0webZyltEnuQbLvAhXLiE8pPu7EA14mESpOaHaVibCryudIq%2BOidgy7BTuGdOVwYx3HjLnV4%2BcUw/CLrgQEJcsxl1zAiauqJa5YhxA3CsLdyRtxpB3NEjIu6WNAh9fFAadRhDCD2ZxOx1JxsCYgmlsqUHhONuZJe1aMG9M3rm7e7KHb7u5RkvpfKQAoDYCoWU6FGA%2BDjIHatrC61Xpfo2kCH8lUfJVV84RGqGIOqyB4UmDNZFetZio8iZr8M0WdeovR2i2JofZt0J1cjrWupaGa%2BjZifXbr9Xu4tgaVJeAfXic9E9oMHLCfSyJD7013tNoyl9OD81rg5UWnpLtJM2zZVFAlAVn3kKQBQ9GRVwNicgzKmDXCm3wZbYittoZU4RguN2m4vac7PAHcmL4w6/ijozKXHMFdp3IlnSWBd5Ym6VhXQEduIJO6ip3QIf1xbFZ8YTQJylc8U22TTffJ9Smc3SeU3kzyKTP0lu/UeX9Aq2BCsjQtKt%2BmpWGcE7Bnhn93lQSQ3/BCqGbWYUw2Td1oQDW0bwyagjPWiNmI6xzN1FGxvUbFv10j5GKai1MSRmQLGrEGhi/3YNobw0VejePBLOtyUv2TaZVLon0sMpKVlvNeC5OpKIekyTmmUqMEYCVDgit1BEGOLdKIlUb48AALR0BYJgQHxAVCSHINgQHJUpB%2BFwID9gXAVA8G3Mcgz9bOEbThswQHKgDgVF8EddaAQUjA7/IwQHHAcB/guvVxV9VzrkEB5ES0ahoSsFcFIQH3iVBqFWhKL%2BiHwZCPVUhNAr33ufe%2B%2BhGY/2xEYSAgAMT8N2TrxCHVAWVngbQSoMhzSaAAdVdJeDchpfV4rVmpg9R6T1xa%2Bz9mY8XL2HevUZZLp2RNoIyhlq7zKkkFvy8Wx7G9ntoH/YB4DDRgBVfvpjxLcrjNwd4RBEXqrvltcAZqqjOqsNmpw3RdRRHlGDeI7NnPmi7WMfQ9NpbFePVcxo7h0SW61s2OtwVzj3GxB7EDS72rSXb2pvOzEzNz6ElvqD3dgroesGstywUkPmX5SslkP8Pg2St/b539v%2BQDZ2kcs6d0tJT3%2BlDJSIwwOHpgDA87GV7FQEFXwaZ4kQHzKScIea6LtVWfRFGEizdF3U72LXUDxBSDoXWH5yeAuVgVdwjkExOwiXvR9wzSnAn2uzfXlCsBqQ3133wK3wAA531OUFMSEw9y10A6BY89N48assdX4n8TMjBFdhoVc1dtVeBJ1vNRAFheA28e52N%2B4vBld%2B9B8k1PdkDF5UDxMs1MkA8ZM8sZ9l9yDeUhlSpyoxUIANCgxAomCU9Gs09v8M8UNs9KNNEutsM%2BsW8FFqJS8LVy8bDzDbV5tdFa8tEZsnDFsGMesmNltzFLdgC2QbdeAI0ypewAl%2BM3djtJDxM0sx90DMsFDbsP0VDS0yFy1I8gNXsvAOAOA49g56DE8G1k8Gsv8f5kNxd/9nDOsSZutJtC8JZzU7DCMy9RsyMjFfD3D9F/DvCm9PCi8VsBC2MQDNsuMl48iB8GCkC4jR9fdLt59kiSD5NT9VDs1sDCCN8rBGlCDZAykdi9i0QqQPIl8FMKDBkKEANdNxVqta1xCSj9CyizNpYLMO005IxbMs4%2B1HMkwC5XNi5MxwRuC4QfNCw/M64AtG5m4SQQtKQ11wsN1MVWMrdgiCtgQnF9t4CQkJDh8zsZC/dFjX0WVp91Q2U0iitw9KFlIOBK1aDCi7iGCGcX8msKjWsAFqips896iFtGijVmj6ZWiHD2jujXDK8XCBimj6N%2Bj68nDVtBDRj7FHFwRnEz1MT7iPdcTvdH0Fjs0liSTghsl/gdAxQqQGlCCmlCDsk18aliDySz8St0B0BsAycJlsBsA8R%2BdFYMM1pKBlovT3AfS4gXhvYVB/SMUjk0ouxsAAB9CAvWIgbQdyDHIo6IurYqfENgJgUM8FAMiUR4xnJ8ZHXAaMlQPwOgBgRMz6Fkz5Nk35agbxekMndrX7VgTAMM7FIspJB6aqHM8M5oRgRsh8bcRiICaZfnJJbmSwgvawwY41Bw%2Bw6iYU3PavLo5c5vWcvoxjdciWeFW6D7Xs7FT2EgbMjXCUUVQc0BJCQA/cPwV0dsn0kqdGE8706LIQ%2BxQNLwbjPYCSTYBSPYMIKY4ojU4TFA7U8fJIokwPWTHyKkf4OpLfHQc0wgtEPgKkWQRUEIO0q7eUPgcpFC7Y2QQgmpbJAioikik4kIwKbCnJKwf4NEbJeiqwCKKwRC5CtEffXgQ/dUY/WfTLA/SijAnGXxIIWQIAA%3D%3D', '/#z:OYLghAFBqd5TB8IAsQGMD2ATApgUWwEsAXTAJwBoiQIAzIgG1wDsBDAW1xAHIBGHpTqYWJAMro2zEHwAsQkSQCqAZ1wAFAB68ADIIBWMyozYtQ6AKQAmAELWblNc3QkiI2q2wBhTIwCuHCwgVpSeADJELLgAcgEARrjkIPIADpgqpG4sPv6BwZRpGa4iEVGxHAlJ8k64LlliJGzkJDkBQSE1dSINTSSlMfGJyY6Nza15HaN9kQMVQ7IAlI6YfuTo3DwA9JsA1AAqAJ4puDsHK%2BQ7WHg7KIm4lDsUO4yYbNg7pju4mpwpzAB0Fh0AEFIiQdioAI5%2BJq4CBgnYsAILHYWADsdhBO2xO3IuBIqxYiICOwAVMSOBYAMyY4HogAiPCWjF4AFZBEEeHpKJheF57PYIed1qirFSBJQSLomUsANYgVk6Yy8WSCDgKpWc7m8niCFQgJVSrlMyhwWBoLAsYTkDimdbUDzEMjkIjYIwmMwASTdlls9mWq3WvG2%2ByOJzOq0uOBOtzxDyeLzeHyJ31%2BAKBoNEEOhsPhWaRHBR6NpONx%2BMJFLJFOptIZJpZPHZlC1gh1PitFFtLBFADUiLgAO6JHYQQikJ7WcULQRGvQLJa3N5DCDMlVq4Ks5vSnm8PUGyXSpZmqBoch%2BFQkFBEKg0CBYDgpJiJaKcDbAAW2HZ4OhsPyMEiCLgToUK6RjCKIEhSNwcgKKIqgaNoxqUIYfCOLgzjFEEECeOMQSoeEMzlJURiFJkIi4SR6RkSw/REUMqGdJhPRjL4bRGIx9RTLRgxJAxUwUXxvTcXMvFLCQeK4KBOiro2HLbjqABK57ggAEp6Ck7H2g7Du%2Bfqft%2Bv7/iOY7OqK4oPD4D5Phck58NOB7GvOlCLngSQrsqPCqpQ6pWJuLY7rqjj7rOMqUPKshKg2VJyUhOozoepqIMeqAYJgVnMDetD3o%2BGUgMABl/iQlB4AAbkQ6xaQOADyxz%2BQw/6JPqEBxNucSRE0By8BKbXsOQBxVXE%2Bi1EaEr3lwohVSwjCdUheBxH4wBeFIjD6vwgh4F2wDSLN17DUQJW4Kt3LfLUfgkBsEpguh26MEQcTkB1Ph4Nu4lEOqa1LHQJjAColU1awXWCOB4iSNIMHA/BWjbihximOYH4OLdcT6pASyYCkmGra2B3kC6eAo%2B5HHuNhLDeKxeT4aTwnEahpGYQJBRUZh1P0WhGGcb0DNEywzHTGUPHsfx5N4SMQmEQLdkBms0GUAOpgkDVJCeh2CUNk2/k6jsul2PpuA/oVxnATZYp2fFjkLrgS5uXKGoeV5Pl%2BfJu5BYaCXJWgF5sOgsrnmwwD3Le2XWS%2BXC8NrgoFf%2BgFG6BqEwyowobCGhzHKc5xRtcsb3I8FyJu8nypg%2B6YggiUIwniebggWRYYhmpZ4gS5BEgWVYFjWGZ1pKElSTJ6tOzwPTezsqh%2ByclU6QjX564Z4KjkbZmoTslk5cOtn2SFTkucuMn2xuW6xc7%2Bqu45iXIGgKwkCkZ0OneaUr%2BQIdvpPkcAaEMduqhwOQWD8gQ2oUNIRhgOB6KRAa9xitqXgVUzpX3BJgOgWtn7TwNhAZe1kF7r0PBbK2tAd7rl8vvSBgUj4OTnKfc0IAzwXltOgcgmBvgpBvkHDKj8w5IP1lHN%2B448ZgUUN/aCv9FCQ0QtyeO6E9rExwsLIwBF%2BYiUokULIDM6ZZBZrxNmEieZC1yCLbmvM1GC05tIwSzQDGS3ErgSSbppIeT7gfHgSkLw7AALJezoTsfAmgUimAyCITS/YhwXHDrrDhs8TIThNhZO%2B6C15mznNg1yuC7b4MdvYvcx94lhRAAANkirwaKhDWzOw3jbKkaJ/hijFGiVkABONENS%2BB8CsFYNEHkrDrj4DoTU/c4kmmSklAZZ8QAnXQGdCgN8mg/XUKYdCYgUCYAHJyUa0STCYWmVERgcyFn%2BWYUMfKyD/yUF2Q/V8ztjnQPEPMxZ24RnAnID9Z2IyGjEE5EDPhoMBGwWUP/ERBh3RwwwAjYwd0CZowxlkLGPIcZ40OvAJYCdAwywvC89ZsyrlLJnBJQGssQFgNsRAopPBPGnVMsEmwU9Qkjn5HpBwHj56xNIaFLe1ssmKmSd5PeGtD7BTdklNAwB2AkDmgtCxAcsorOfKcngZKKUz2jtw2OXz%2BEyEEXBH50N2LiK6FhKROiZFU3FvI2mTMlHGMZookohqaYaO1bzLmWqmJcStazT2LE9UmL5rMGmYlu7WPAYUgKABxaIwI9g7HpLgeawB9gSX8dpIJ7CZ6G24QvKJ6VV4m0webZyltEnuQbLvAhXLiE8pPu7EA14mESpOaHaVibCryudIq%2BOidgy7BTuGdOVwYx3HjLnV4%2BcUw/CLrgQEJcsxl1zAiauqJa5YhxA3CsLdyRtxpB3NEjIu6WNAh9fFAadRhDCD2ZxOx1JxsCYgmlsqUHhONuZJe1aMG9M3rm7e7KHb7u5RkvpfKQAoDYCoWU6FGA%2BDjIHatrC61Xpfo2kCH8lUfJVV84RGqGIOqyB4UmDNZFetZio8iZr8M0WdeovR2i2JofZt0J1cjrWupaGa%2BjZifXbr9Xu4tgaVJeAfXic9E9oMHLCfSyJD7013tNoyl9OD81rg5UWnpLtJM2zZVFAlAVn3kKQBQ9GRVwNicgzKmDXCm3wZbYittoZU4RguN2m4vac7PAHcmL4w6/ijozKXHMFdp3IlnSWBd5Ym6VhXQEduIJO6ip3QIf1xbFZ8YTQJylc8U22TTffJ9Smc3SeU3kzyKTP0lu/UeX9Aq2BCsjQtKt%2BmpWGcE7Bnhn93lQSQ3/BCqGbWYUw2Td1oQDW0bwyagjPWiNmI6xzN1FGxvUbFv10j5GKai1MSRmQLGrEGhi/3YNobw0VejePBLOtyUv2TaZVLon0sMpKVlvNeC5OpKIekyTmmUqMEYCVDgit1BEGOLdKIlUb48AALR0BYJgQHxAVCSHINgQHJUpB%2BFwID9gXAVA8G3Mcgz9bOEbThswQHKgDgVF8EddaAQUjA7/IwQHHAcB/guvVxV9VzrkEB5ES0ahoSsFcFIQH3iVBqFWhKL%2BiHwZCPVUhNAr33ufe%2B%2BhGY/2xEYSAgAMT8N2TrxCHVAWVngbQSoMhzSaAAdVdJeDchpfV4rVmpg9R6T1xa%2Bz9mY8XL2HevUZZLp2RNoIyhlq7zKkkFvy8Wx7G9ntoH/YB4DDRgBVfvpjxLcrjNwd4RBEXqrvltcAZqqjOqsNmpw3RdRRHlGDeI7NnPmi7WMfQ9NpbFePVcxo7h0SW61s2OtwVzj3GxB7EDS72rSXb2pvOzEzNz6ElvqD3dgroesGstywUkPmX5SslkP8Pg2St/b539v%2BQDZ2kcs6d0tJT3%2BlDJSIwwOHpgDA87GV7FQEFXwaZ4kQHzKScIea6LtVWfRFGEizdF3U72LXUDxBSDoXWH5yeAuVgVdwjkExOwiXvR9wzSnAn2uzfXlCsBqQ3133wK3wAA531OUFMSEw9y10A6BY89N48assdX4n8TMjBFdhoVc1dtVeBJ1vNRAFheA28e52N%2B4vBld%2B9B8k1PdkDF5UDxMs1MkA8ZM8sZ9l9yDeUhlSpyoxUIANCgxAomCU9Gs09v8M8UNs9KNNEutsM%2BsW8FFqJS8LVy8bDzDbV5tdFa8tEZsnDFsGMesmNltzFLdgC2QbdeAI0ypewAl%2BM3djtJDxM0sx90DMsFDbsP0VDS0yFy1I8gNXsvAOAOA49g56DE8G1k8Gsv8f5kNxd/9nDOsSZutJtC8JZzU7DCMy9RsyMjFfD3D9F/DvCm9PCi8VsBC2MQDNsuMl48iB8GCkC4jR9fdLt59kiSD5NT9VDs1sDCCN8rBGlCDZAykdi9i0QqQPIl8FMKDBkKEANdNxVqta1xCSj9CyizNpYLMO005IxbMs4%2B1HMkwC5XNi5MxwRuC4QfNCw/M64AtG5m4SQQtKQ11wsN1MVWMrdgiCtgQnF9t4CQkJDh8zsZC/dFjX0WVp91Q2U0iitw9KFlIOBK1aDCi7iGCGcX8msKjWsAFqips896iFtGijVmj6ZWiHD2jujXDK8XCBimj6N%2Bj68nDVtBDRj7FHFwRnEz1MT7iPdcTvdH0Fjs0liSTghsl/gdAxQqQGlCCmlCDsk18aliDySz8St0B0BsAycJlsBsA8R%2BdFYMM1pKBlovT3AfS4gXhvYVB/SMUjk0ouxsAAB9CAvWIgbQdyDHIo6IurYqfENgJgUM8FAMiUR4xnJ8ZHXAaMlQPwOgBgRMz6Fkz5Nk35agbxekMndrX7VgTAMM7FIspJB6aqHM8M5oRgRsh8bcRiICaZfnJJbmSwgvawwY41Bw%2Bw6iYU3PavLo5c5vWcvoxjdciWeFW6D7Xs7FT2EgbMjXCUUVQc0BJCQA/cPwV0dsn0kqdGE8706LIQ%2BxQNLwbjPYCSTYBSPYMIKY4ojU4TFA7U8fJIokwPWTHyKkf4OpLfHQc0wgtEPgKkWQRUEIO0q7eUPgcpFC7Y2QQgmpbJAioikik4kIwKbCnJKwf4NEbJeiqwCKKwRC5CtEffXgQ/dUY/WfTLA/SijAnGXxIIWQIAA%3D%3D',
{ {
onBeforeLoad: win => { onBeforeLoad: win => {

View File

@@ -2,9 +2,11 @@
"use_appcontainer": true, "use_appcontainer": true,
"pids_max": 72, "pids_max": 72,
"mem_max": 1342177280, "mem_max": 1342177280,
"allowed_paths": [{ "allowed_paths": [
{
"path": "NUL", "path": "NUL",
"rw": true "rw": true
}], }
],
"allowed_registry": [] "allowed_registry": []
} }

View File

@@ -1,94 +0,0 @@
---
plugins:
- jsdoc
- sonarjs
- unicorn
- prettier
extends:
- ../.eslint-license-header.yml
- eslint:recommended
env:
browser: true
node: true
es6: false
rules:
comma-dangle:
- error
- arrays: always-multiline
objects: always-multiline
imports: always-multiline
exports: always-multiline
functions: always-multiline
eol-last:
- error
- always
eqeqeq:
- error
- smart
indent:
- off
#- 4
#- SwitchCase: 1
max-len:
- error
- 120
- ignoreRegExpLiterals: true
ignoreComments: true
# TODO: Disabled for now
#max-statements:
# - error
# - 50
no-console: error
no-control-regex: 0
no-useless-call: error
no-useless-computed-key: error
no-useless-concat: error
no-useless-escape: error
no-useless-rename: error
no-useless-return: error
no-empty:
- error
- allowEmptyCatch: true
quote-props:
- error
- as-needed
quotes:
- error
- single
- allowTemplateLiterals: true
avoidEscape: true
semi:
- error
- always
space-before-function-paren:
- error
- anonymous: always
asyncArrow: always
named: never
yoda:
- error
- never
- onlyEquality: true
prefer-const:
- error
- destructuring: all
jsdoc/check-alignment: warn
jsdoc/check-param-names: warn
jsdoc/check-syntax: warn
jsdoc/check-tag-names: off
jsdoc/check-types: warn
jsdoc/empty-tags: warn
jsdoc/require-hyphen-before-param-description: warn
jsdoc/valid-types: warn
sonarjs/no-collection-size-mischeck: error
sonarjs/no-redundant-boolean: error
sonarjs/no-unused-collection: error
sonarjs/prefer-immediate-return: error
sonarjs/prefer-object-literal: error
sonarjs/prefer-single-boolean-return: error
unicorn/filename-case: error
parserOptions:
ecmaVersion: 6
globals:
define: false
__webpack_public_path__: true

View File

@@ -1,76 +0,0 @@
// Copyright (c) 2023, Compiler Explorer Authors
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
module.exports = {
root: false,
plugins: ['promise', 'requirejs', 'unused-imports'],
extends: ['./.eslint-ce-lib.yml'],
rules: {
'promise/catch-or-return': 'off',
'promise/no-new-statics': 'error',
'promise/no-return-wrap': 'error',
'promise/param-names': 'error',
'promise/valid-params': 'error',
},
overrides: [
{
files: ['*.ts'],
plugins: ['import', '@typescript-eslint'],
extends: [
'./.eslint-ce-lib.yml',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:import/recommended',
'plugin:import/typescript',
],
env: {
browser: true,
es6: true,
node: false,
},
parser: '@typescript-eslint/parser',
parserOptions: {
sourceType: 'module',
ecmaVersion: 'latest',
tsconfigRootDir: __dirname,
project: '../tsconfig.json',
},
rules: {
'import/no-unresolved': 'off',
'n/no-missing-imports': 'off',
'unused-imports/no-unused-imports': 'error',
'@typescript-eslint/await-thenable': 'error',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-var-requires': 'error',
'@typescript-eslint/no-explicit-any': 'off', // Too much js code still exists
'@typescript-eslint/ban-ts-comment': 'error',
// TODO: Disabled for now
//'@typescript-eslint/no-unnecessary-condition': 'error',
//'@typescript-eslint/no-unnecessary-type-assertion': 'error',
//'@typescript-eslint/prefer-includes': 'error',
},
},
],
};

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
@@ -56,10 +56,10 @@ export async function addArtifactToResult(
} }
export async function addHeaptrackResults(result: CompilationResult, dirPath?: string): Promise<void> { export async function addHeaptrackResults(result: CompilationResult, dirPath?: string): Promise<void> {
let dirPathToUse: string = ''; let dirPathToUse = '';
if (dirPath) { if (dirPath) {
dirPathToUse = dirPath; dirPathToUse = dirPath;
} else if (result.buildResult && result.buildResult.dirPath) { } else if (result.buildResult?.dirPath) {
dirPathToUse = result.buildResult.dirPath; dirPathToUse = result.buildResult.dirPath;
} }

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import * as fs from 'fs'; import * as fs from 'node:fs';
import path from 'path'; import path from 'node:path';
import {isString} from '../shared/common-utils.js'; import {isString} from '../shared/common-utils.js';
import {parse} from '../shared/stacktrace.js'; import {parse} from '../shared/stacktrace.js';
@@ -33,9 +33,8 @@ const filePrefix = 'file://';
function removeFileProtocol(path: string) { function removeFileProtocol(path: string) {
if (path.startsWith(filePrefix)) { if (path.startsWith(filePrefix)) {
return path.slice(filePrefix.length); return path.slice(filePrefix.length);
} else {
return path;
} }
return path;
} }
function check_path(parent: URL, directory: string) { function check_path(parent: URL, directory: string) {
@@ -43,13 +42,12 @@ function check_path(parent: URL, directory: string) {
const relative = path.relative(parent.pathname, directory); const relative = path.relative(parent.pathname, directory);
if (relative && !relative.startsWith('..') && !path.isAbsolute(relative)) { if (relative && !relative.startsWith('..') && !path.isAbsolute(relative)) {
return relative; return relative;
} else {
return false;
} }
return false;
} }
function get_diagnostic() { function get_diagnostic() {
const e = new Error(); // eslint-disable-line unicorn/error-message const e = new Error();
const trace = parse(e); const trace = parse(e);
if (trace.length >= 4) { if (trace.length >= 4) {
const invoker_frame = trace[3]; const invoker_frame = trace[3];
@@ -90,9 +88,8 @@ function fail(fail_message: string, user_message: string | undefined, args: any[
const diagnostic = get_diagnostic(); const diagnostic = get_diagnostic();
if (diagnostic) { if (diagnostic) {
throw new Error(assert_line + `, at ${diagnostic.file}:${diagnostic.line} \`${diagnostic.src}\``); throw new Error(assert_line + `, at ${diagnostic.file}:${diagnostic.line} \`${diagnostic.src}\``);
} else {
throw new Error(assert_line);
} }
throw new Error(assert_line);
} }
// Using `unknown` instead of generic implementation due to: // Using `unknown` instead of generic implementation due to:

View File

@@ -25,7 +25,7 @@
import {EC2, Instance} from '@aws-sdk/client-ec2'; import {EC2, Instance} from '@aws-sdk/client-ec2';
import {SSM} from '@aws-sdk/client-ssm'; import {SSM} from '@aws-sdk/client-ssm';
import {fromNodeProviderChain} from '@aws-sdk/credential-providers'; import {fromNodeProviderChain} from '@aws-sdk/credential-providers';
// eslint-disable-next-line import/extensions, n/no-missing-import
import {AwsCredentialIdentityProvider} from '@smithy/types/dist-types/identity/awsCredentialIdentity.js'; import {AwsCredentialIdentityProvider} from '@smithy/types/dist-types/identity/awsCredentialIdentity.js';
import {unwrap} from './assert.js'; import {unwrap} from './assert.js';

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import os from 'os'; import os from 'node:os';
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import * as PromClient from 'prom-client'; import * as PromClient from 'prom-client';
@@ -40,8 +40,6 @@ import {
BuildResult, BuildResult,
BuildStep, BuildStep,
BypassCache, BypassCache,
bypassCompilationCache,
bypassExecutionCache,
CacheKey, CacheKey,
CmakeCacheKey, CmakeCacheKey,
CompilationCacheKey, CompilationCacheKey,
@@ -53,6 +51,8 @@ import {
FiledataPair, FiledataPair,
GccDumpOptions, GccDumpOptions,
LibsAndOptions, LibsAndOptions,
bypassCompilationCache,
bypassExecutionCache,
} from '../types/compilation/compilation.interfaces.js'; } from '../types/compilation/compilation.interfaces.js';
import { import {
CompilerOverrideOption, CompilerOverrideOption,
@@ -89,8 +89,8 @@ import {CompilerArguments} from './compiler-arguments.js';
import { import {
BaseParser, BaseParser,
ClangCParser, ClangCParser,
ClangirParser,
ClangParser, ClangParser,
ClangirParser,
GCCCParser, GCCCParser,
GCCParser, GCCParser,
ICCParser, ICCParser,
@@ -214,7 +214,7 @@ export class BaseCompiler {
protected packager: Packager; protected packager: Packager;
protected executionType: string; protected executionType: string;
protected sandboxType: string; protected sandboxType: string;
protected defaultRpathFlag: string = '-Wl,-rpath,'; protected defaultRpathFlag = '-Wl,-rpath,';
private static objdumpAndParseCounter = new PromClient.Counter({ private static objdumpAndParseCounter = new PromClient.Counter({
name: 'ce_objdumpandparsetime_total', name: 'ce_objdumpandparsetime_total',
help: 'Time spent on objdump and parsing of objdumps', help: 'Time spent on objdump and parsing of objdumps',
@@ -324,12 +324,11 @@ export class BaseCompiler {
id: match[1], id: match[1],
version: match[2], version: match[2],
}; };
} else { }
return { return {
id: lib, id: lib,
version: false, version: false,
}; };
}
}); });
const filterLibIds = new Set(); const filterLibIds = new Set();
@@ -564,9 +563,8 @@ export class BaseCompiler {
if (this.compiler.instructionSet) { if (this.compiler.instructionSet) {
return this.compiler.instructionSet; return this.compiler.instructionSet;
} else {
return 'amd64';
} }
return 'amd64';
} }
async runCompiler( async runCompiler(
@@ -655,7 +653,7 @@ export class BaseCompiler {
if (this.externalparser) { if (this.externalparser) {
const objResult = await this.externalparser.objdumpAndParseAssembly(result.dirPath, args, filters); const objResult = await this.externalparser.objdumpAndParseAssembly(result.dirPath, args, filters);
if (objResult.parsingTime !== undefined) { if (objResult.parsingTime !== undefined) {
objResult.objdumpTime = parseInt(result.execTime) - parseInt(result.parsingTime); objResult.objdumpTime = Number.parseInt(result.execTime) - Number.parseInt(result.parsingTime);
delete objResult.execTime; delete objResult.execTime;
} }
@@ -771,7 +769,7 @@ export class BaseCompiler {
optionsForBackend(backendOptions: Record<string, any>, outputFilename: string): string[] { optionsForBackend(backendOptions: Record<string, any>, outputFilename: string): string[] {
let addOpts: string[] = []; let addOpts: string[] = [];
if (backendOptions.produceGccDump && backendOptions.produceGccDump.opened && this.compiler.supportsGccDump) { if (backendOptions.produceGccDump?.opened && this.compiler.supportsGccDump) {
addOpts = addOpts.concat(this.getGccDumpOptions(backendOptions.produceGccDump, outputFilename)); addOpts = addOpts.concat(this.getGccDumpOptions(backendOptions.produceGccDump, outputFilename));
} }
@@ -806,7 +804,7 @@ export class BaseCompiler {
foundLib.versions, foundLib.versions,
(o: VersionInfo, versionId: string): boolean => { (o: VersionInfo, versionId: string): boolean => {
if (versionId === selectedLib.version) return true; if (versionId === selectedLib.version) return true;
return !!(o.alias && o.alias.includes(selectedLib.version)); return !!o.alias?.includes(selectedLib.version);
}, },
); );
@@ -822,11 +820,7 @@ export class BaseCompiler {
findAutodetectStaticLibLink(linkname: string): SelectedLibraryVersion | false { findAutodetectStaticLibLink(linkname: string): SelectedLibraryVersion | false {
const foundLib = _.findKey(this.supportedLibraries!, lib => { const foundLib = _.findKey(this.supportedLibraries!, lib => {
return ( return lib.versions.autodetect?.staticliblink?.includes(linkname);
lib.versions.autodetect &&
lib.versions.autodetect.staticliblink &&
lib.versions.autodetect.staticliblink.includes(linkname)
);
}); });
if (!foundLib) return false; if (!foundLib) return false;
@@ -848,9 +842,8 @@ export class BaseCompiler {
if (lib) { if (lib) {
dictionary[lib] = foundVersion; dictionary[lib] = foundVersion;
return [lib, foundVersion.dependencies]; return [lib, foundVersion.dependencies];
} else {
return false;
} }
return false;
}); });
}) })
.flat(3), .flat(3),
@@ -873,14 +866,14 @@ export class BaseCompiler {
) { ) {
idxToInsert = idx; idxToInsert = idx;
break; break;
} else if (libToInsertObj && libToInsertObj.dependencies.includes(libCompareName)) { }
if (libToInsertObj?.dependencies.includes(libCompareName)) {
idxToInsert = idx; idxToInsert = idx;
break; break;
} else if (libCompareObj && libCompareObj.dependencies.includes(libToInsertName)) { }
continue; if (libCompareObj?.dependencies.includes(libToInsertName)) {
} else if ( } else if (
libToInsertObj && libToInsertObj?.staticliblink.includes(libToInsertName) &&
libToInsertObj.staticliblink.includes(libToInsertName) &&
libToInsertObj.staticliblink.includes(libCompareName) libToInsertObj.staticliblink.includes(libCompareName)
) { ) {
if ( if (
@@ -888,13 +881,11 @@ export class BaseCompiler {
libToInsertObj.staticliblink.indexOf(libCompareName) libToInsertObj.staticliblink.indexOf(libCompareName)
) { ) {
continue; continue;
} else {
idxToInsert = idx;
} }
idxToInsert = idx;
break; break;
} else if ( } else if (
libCompareObj && libCompareObj?.staticliblink.includes(libToInsertName) &&
libCompareObj.staticliblink.includes(libToInsertName) &&
libCompareObj.staticliblink.includes(libCompareName) libCompareObj.staticliblink.includes(libCompareName)
) { ) {
if ( if (
@@ -902,9 +893,8 @@ export class BaseCompiler {
libCompareObj.staticliblink.indexOf(libCompareName) libCompareObj.staticliblink.indexOf(libCompareName)
) { ) {
continue; continue;
} else {
idxToInsert = idx;
} }
idxToInsert = idx;
break; break;
} }
} }
@@ -939,9 +929,8 @@ export class BaseCompiler {
return foundVersion.liblink.map(lib => { return foundVersion.liblink.map(lib => {
if (lib) { if (lib) {
return linkFlag + lib; return linkFlag + lib;
} else {
return false;
} }
return false;
}); });
}) })
.filter(Boolean) as string[]; .filter(Boolean) as string[];
@@ -1533,13 +1522,12 @@ export class BaseCompiler {
compileTime: compileEnd - compileStart, compileTime: compileEnd - compileStart,
parseTime: parseEnd - parseStart, parseTime: parseEnd - parseStart,
}; };
} else { }
return { return {
results: optPipeline, results: optPipeline,
compileTime: compileEnd - compileStart, compileTime: compileEnd - compileStart,
parseTime: parseEnd - parseStart, parseTime: parseEnd - parseStart,
}; };
}
} catch (e: any) { } catch (e: any) {
return { return {
error: e.toString(), error: e.toString(),
@@ -1680,9 +1668,8 @@ export class BaseCompiler {
if (dirPath) { if (dirPath) {
return path.join(dirPath, filename); return path.join(dirPath, filename);
} else {
return filename;
} }
return filename;
} }
getExecutableFilename(dirPath: string, outputFilebase: string, key?: CacheKey | CompilationCacheKey) { getExecutableFilename(dirPath: string, outputFilebase: string, key?: CacheKey | CompilationCacheKey) {
@@ -1779,7 +1766,7 @@ export class BaseCompiler {
name: match[2] + ' (' + match[1] + ')', name: match[2] + ' (' + match[1] + ')',
command_prefix: `-fdump-${match[1]}-${match[2]}`, command_prefix: `-fdump-${match[1]}-${match[2]}`,
}; };
else return null; return null;
} }
async checkOutputFileAndDoPostProcess( async checkOutputFileAndDoPostProcess(
@@ -1846,9 +1833,8 @@ export class BaseCompiler {
if (this.buildenvsetup) { if (this.buildenvsetup) {
const libraryDetails = await this.getRequiredLibraryVersions(key.libraries); const libraryDetails = await this.getRequiredLibraryVersions(key.libraries);
return this.buildenvsetup.setup(key, dirPath, libraryDetails, binary); return this.buildenvsetup.setup(key, dirPath, libraryDetails, binary);
} else {
return [];
} }
return [];
} }
protected async writeMultipleFiles(files: FiledataPair[], dirPath: string) { protected async writeMultipleFiles(files: FiledataPair[], dirPath: string) {
@@ -2167,7 +2153,7 @@ export class BaseCompiler {
didExecute: true, didExecute: true,
buildResult: buildResult, buildResult: buildResult,
}); });
} else { }
return { return {
code: -1, code: -1,
didExecute: false, didExecute: false,
@@ -2178,7 +2164,6 @@ export class BaseCompiler {
timedOut: false, timedOut: false,
}; };
} }
}
const result = await this.runExecutable( const result = await this.runExecutable(
buildResult.executableFilename, buildResult.executableFilename,
@@ -2293,9 +2278,8 @@ export class BaseCompiler {
libsAndOptions.libraries = _.union(libsAndOptions.libraries, detectedLibs); libsAndOptions.libraries = _.union(libsAndOptions.libraries, detectedLibs);
return true; return true;
} else {
return false;
} }
return false;
} }
sanitizeCompilerOverrides(overrides: ConfiguredOverrides): ConfiguredOverrides { sanitizeCompilerOverrides(overrides: ConfiguredOverrides): ConfiguredOverrides {
@@ -2372,8 +2356,7 @@ export class BaseCompiler {
const makeHaskellCore = backendOptions.produceHaskellCore && this.compiler.supportsHaskellCoreView; const makeHaskellCore = backendOptions.produceHaskellCore && this.compiler.supportsHaskellCoreView;
const makeHaskellStg = backendOptions.produceHaskellStg && this.compiler.supportsHaskellStgView; const makeHaskellStg = backendOptions.produceHaskellStg && this.compiler.supportsHaskellStgView;
const makeHaskellCmm = backendOptions.produceHaskellCmm && this.compiler.supportsHaskellCmmView; const makeHaskellCmm = backendOptions.produceHaskellCmm && this.compiler.supportsHaskellCmmView;
const makeGccDump = const makeGccDump = backendOptions.produceGccDump?.opened && this.compiler.supportsGccDump;
backendOptions.produceGccDump && backendOptions.produceGccDump.opened && this.compiler.supportsGccDump;
const [ const [
asmResult, asmResult,
@@ -2394,7 +2377,7 @@ export class BaseCompiler {
inputFilename, inputFilename,
options, options,
backendOptions.produceIr, backendOptions.produceIr,
backendOptions.produceCfg && backendOptions.produceCfg.ir, backendOptions.produceCfg?.ir,
filters, filters,
) )
: undefined, : undefined,
@@ -2504,13 +2487,14 @@ export class BaseCompiler {
getCompilerEnvironmentVariables(compilerflags: string) { getCompilerEnvironmentVariables(compilerflags: string) {
if (this.lang.id === 'c++') { if (this.lang.id === 'c++') {
return {...this.cmakeBaseEnv, CXXFLAGS: compilerflags}; return {...this.cmakeBaseEnv, CXXFLAGS: compilerflags};
} else if (this.lang.id === 'fortran') {
return {...this.cmakeBaseEnv, FFLAGS: compilerflags};
} else if (this.lang.id === 'cuda') {
return {...this.cmakeBaseEnv, CUDAFLAGS: compilerflags};
} else {
return {...this.cmakeBaseEnv, CFLAGS: compilerflags};
} }
if (this.lang.id === 'fortran') {
return {...this.cmakeBaseEnv, FFLAGS: compilerflags};
}
if (this.lang.id === 'cuda') {
return {...this.cmakeBaseEnv, CUDAFLAGS: compilerflags};
}
return {...this.cmakeBaseEnv, CFLAGS: compilerflags};
} }
async doBuildstep(command: string, args: string[], execParams: ExecutionOptions) { async doBuildstep(command: string, args: string[], execParams: ExecutionOptions) {
@@ -2620,13 +2604,14 @@ export class BaseCompiler {
getUsedEnvironmentVariableFlags(makeExecParams: ExecutionOptionsWithEnv) { getUsedEnvironmentVariableFlags(makeExecParams: ExecutionOptionsWithEnv) {
if (this.lang.id === 'c++') { if (this.lang.id === 'c++') {
return splitArguments(makeExecParams.env.CXXFLAGS); return splitArguments(makeExecParams.env.CXXFLAGS);
} else if (this.lang.id === 'fortran') {
return splitArguments(makeExecParams.env.FFLAGS);
} else if (this.lang.id === 'cuda') {
return splitArguments(makeExecParams.env.CUDAFLAGS);
} else {
return splitArguments(makeExecParams.env.CFLAGS);
} }
if (this.lang.id === 'fortran') {
return splitArguments(makeExecParams.env.FFLAGS);
}
if (this.lang.id === 'cuda') {
return splitArguments(makeExecParams.env.CUDAFLAGS);
}
return splitArguments(makeExecParams.env.CFLAGS);
} }
async cmake( async cmake(
@@ -2791,7 +2776,7 @@ export class BaseCompiler {
fullResult.code = 0; fullResult.code = 0;
if (fullResult.buildsteps) { if (fullResult.buildsteps) {
_.each(fullResult.buildsteps, function (step) { _.each(fullResult.buildsteps, step => {
fullResult.code += step.code; fullResult.code += step.code;
}); });
} }
@@ -2960,7 +2945,7 @@ export class BaseCompiler {
{abandonIfStale: true}, {abandonIfStale: true},
); );
if (result.execResult && result.execResult.buildResult) { if (result.execResult?.buildResult) {
this.doTempfolderCleanup(result.execResult.buildResult); this.doTempfolderCleanup(result.execResult.buildResult);
} }
} }
@@ -2977,7 +2962,7 @@ export class BaseCompiler {
if (backendOptions.executorRequest) { if (backendOptions.executorRequest) {
const execResult = await this.handleExecution(key, executeOptions, bypassCache); const execResult = await this.handleExecution(key, executeOptions, bypassCache);
if (execResult && execResult.buildResult) { if (execResult?.buildResult) {
this.doTempfolderCleanup(execResult.buildResult); this.doTempfolderCleanup(execResult.buildResult);
} }
return execResult; return execResult;
@@ -3079,7 +3064,8 @@ export class BaseCompiler {
result.filteredCount = res.filteredCount; result.filteredCount = res.filteredCount;
if (res.languageId) result.languageId = res.languageId; if (res.languageId) result.languageId = res.languageId;
if (result.objdumpTime) { if (result.objdumpTime) {
const dumpAndParseTime = parseInt(result.objdumpTime) + parseInt(result.parsingTime); const dumpAndParseTime =
Number.parseInt(result.objdumpTime) + Number.parseInt(result.parsingTime);
BaseCompiler.objdumpAndParseCounter.inc(dumpAndParseTime); BaseCompiler.objdumpAndParseCounter.inc(dumpAndParseTime);
} }
} else { } else {
@@ -3191,8 +3177,8 @@ export class BaseCompiler {
DebugLoc: { DebugLoc: {
File: file, File: file,
// Could use line.tag for these too: // Could use line.tag for these too:
Line: parseInt(lineNum, 10), Line: Number.parseInt(lineNum, 10),
Column: parseInt(colNum, 10), Column: Number.parseInt(colNum, 10),
}, },
optType: mapOptType(type, line), optType: mapOptType(type, line),
displayString: message, displayString: message,
@@ -3274,7 +3260,7 @@ export class BaseCompiler {
const versionMatch = versionRegex.exec(version); const versionMatch = versionRegex.exec(version);
if (versionMatch) { if (versionMatch) {
const versionNum = parseFloat(versionMatch[1]); const versionNum = Number.parseFloat(versionMatch[1]);
return version.toLowerCase().includes('clang') && versionNum >= 3.3; return version.toLowerCase().includes('clang') && versionNum >= 3.3;
} }
@@ -3406,7 +3392,6 @@ but nothing was dumped. Possible causes are:
return output; return output;
} }
// eslint-disable-next-line no-unused-vars
async extractDeviceCode( async extractDeviceCode(
result: CompilationResult, result: CompilationResult,
_filters: ParseFiltersAndOutputOptions, _filters: ParseFiltersAndOutputOptions,
@@ -3464,11 +3449,10 @@ but nothing was dumped. Possible causes are:
} }
if (postProcess.length > 0) { if (postProcess.length > 0) {
return await this.execPostProcess(result, postProcess, outputFilename, maxSize); return await this.execPostProcess(result, postProcess, outputFilename, maxSize);
} else { }
const contents = await fs.readFile(outputFilename); const contents = await fs.readFile(outputFilename);
result.asm = contents.toString(); result.asm = contents.toString();
return result; return result;
}
})(); })();
return Promise.all([asmPromise, optPromise, stackUsagePromise]); return Promise.all([asmPromise, optPromise, stackUsagePromise]);
} }
@@ -3509,16 +3493,21 @@ but nothing was dumped. Possible causes are:
const exeFilename = path.basename(exe); const exeFilename = path.basename(exe);
if (exeFilename.includes('icc')) { if (exeFilename.includes('icc')) {
return ICCParser; return ICCParser;
} else if (exe.includes('clangir')) { }
if (exe.includes('clangir')) {
return ClangirParser; return ClangirParser;
} else if (exeFilename.includes('clang++') || exeFilename.includes('icpx')) { }
if (exeFilename.includes('clang++') || exeFilename.includes('icpx')) {
// check this first as "clang++" matches "g++" // check this first as "clang++" matches "g++"
return ClangParser; return ClangParser;
} else if (exeFilename.includes('clang') || exeFilename.includes('icx')) { }
if (exeFilename.includes('clang') || exeFilename.includes('icx')) {
return ClangCParser; return ClangCParser;
} else if (exeFilename.includes('gcc')) { }
if (exeFilename.includes('gcc')) {
return GCCCParser; return GCCCParser;
} else if (exeFilename.includes('g++')) { }
if (exeFilename.includes('g++')) {
return GCCParser; return GCCParser;
} }
//there is a lot of code around that makes this assumption. //there is a lot of code around that makes this assumption.
@@ -3564,9 +3553,8 @@ but nothing was dumped. Possible causes are:
value: target, value: target,
}; };
}); });
} else {
return [];
} }
return [];
} }
async getPossibleStdversAsOverrideValues(): Promise<CompilerOverrideOption[]> { async getPossibleStdversAsOverrideValues(): Promise<CompilerOverrideOption[]> {
@@ -3751,7 +3739,7 @@ but nothing was dumped. Possible causes are:
delete this.compiler.cachedPossibleArguments; delete this.compiler.cachedPossibleArguments;
} }
return this; return this;
} else { }
const initResult = await this.getArgumentParserClass().parse(this); const initResult = await this.getArgumentParserClass().parse(this);
this.possibleArguments.possibleArguments = {}; this.possibleArguments.possibleArguments = {};
@@ -3761,7 +3749,6 @@ but nothing was dumped. Possible causes are:
logger.info(`${compiler} ${version} is ready`); logger.info(`${compiler} ${version} is ready`);
return initResult; return initResult;
} }
}
getModificationTime(): number | undefined { getModificationTime(): number | undefined {
return this.mtime ? this.mtime.getTime() : undefined; return this.mtime ? this.mtime.getTime() : undefined;

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import os from 'os'; import os from 'node:os';
import {InstructionSet} from '../../types/instructionsets.js'; import {InstructionSet} from '../../types/instructionsets.js';
import {executeDirect} from '../exec.js'; import {executeDirect} from '../exec.js';
@@ -85,8 +85,8 @@ export class BinaryInfoLinux {
} }
static removeComments(value: string): string { static removeComments(value: string): string {
let filtered: string = ''; let filtered = '';
let inComment: boolean = false; let inComment = false;
for (const c of value) { for (const c of value) {
if (!inComment && c === '(') { if (!inComment && c === '(') {
inComment = true; inComment = true;
@@ -106,16 +106,17 @@ export class BinaryInfoLinux {
if (isElf) { if (isElf) {
return { return {
os: OSType.linux, os: OSType.linux,
instructionSet: this.getInstructionSetForArchText(csv[1]), instructionSet: BinaryInfoLinux.getInstructionSetForArchText(csv[1]),
}; };
} else if (isPE) { }
const filteredLine = this.removeComments(csv[0]); if (isPE) {
const filteredLine = BinaryInfoLinux.removeComments(csv[0]);
const lastWordPos = filteredLine.lastIndexOf(' '); const lastWordPos = filteredLine.lastIndexOf(' ');
const lastWord = filteredLine.substring(lastWordPos + 1); const lastWord = filteredLine.substring(lastWordPos + 1);
return { return {
os: OSType.windows, os: OSType.windows,
instructionSet: this.getInstructionSetForArchText(lastWord), instructionSet: BinaryInfoLinux.getInstructionSetForArchText(lastWord),
}; };
} }
@@ -128,10 +129,9 @@ export class BinaryInfoLinux {
os: OSType.windows, os: OSType.windows,
instructionSet: 'amd64', instructionSet: 'amd64',
}; };
} else {
const info = await executeDirect('/usr/bin/file', ['-b', filepath], {});
if (info.code === 0) return this.parseFileInfo(info.stdout);
} }
const info = await executeDirect('/usr/bin/file', ['-b', filepath], {});
if (info.code === 0) return BinaryInfoLinux.parseFileInfo(info.stdout);
return undefined; return undefined;
} }
} }

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import * as fs from 'fs-extra'; import * as fs from 'fs-extra';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import _ from 'underscore'; import _ from 'underscore';
@@ -79,9 +79,11 @@ export class BuildEnvSetupBase {
let searchFor = arch as string; let searchFor = arch as string;
if (this.compiler.exe.includes('icpx')) { if (this.compiler.exe.includes('icpx')) {
return arch === 'x86' || arch === 'x86_64'; return arch === 'x86' || arch === 'x86_64';
} else if (this.compiler.exe.includes('circle')) { }
if (this.compiler.exe.includes('circle')) {
return arch === 'x86' || arch === 'x86_64'; return arch === 'x86' || arch === 'x86_64';
} else if (this.compiler.group === 'icc') { }
if (this.compiler.group === 'icc') {
result = await execCompilerCached(this.compiler.exe, ['--help']); result = await execCompilerCached(this.compiler.exe, ['--help']);
if (arch === 'x86') { if (arch === 'x86') {
searchFor = '-m32'; searchFor = '-m32';
@@ -91,9 +93,8 @@ export class BuildEnvSetupBase {
} else if (this.compilerTypeOrGCC === 'gcc') { } else if (this.compilerTypeOrGCC === 'gcc') {
if (this.compiler.exe.includes('/icpx')) { if (this.compiler.exe.includes('/icpx')) {
return arch === 'x86' || arch === 'x86_64'; return arch === 'x86' || arch === 'x86_64';
} else {
result = await execCompilerCached(this.compiler.exe, ['--target-help']);
} }
result = await execCompilerCached(this.compiler.exe, ['--target-help']);
} else if (this.compilerTypeOrGCC === 'clang') { } else if (this.compilerTypeOrGCC === 'clang') {
const binpath = path.dirname(this.compiler.exe); const binpath = path.dirname(this.compiler.exe);
const llc = path.join(binpath, 'llc'); const llc = path.join(binpath, 'llc');
@@ -143,13 +144,11 @@ export class BuildEnvSetupBase {
if (target && arch) { if (target && arch) {
if (arch.length < target.length) { if (arch.length < target.length) {
return arch; return arch;
} else { }
return target; return target;
} }
} else {
if (target) return target; if (target) return target;
if (arch) return arch; if (arch) return arch;
}
return false; return false;
} }
@@ -158,7 +157,7 @@ export class BuildEnvSetupBase {
const match = this.compiler.options.match(/-stdlib=(\S*)/i); const match = this.compiler.options.match(/-stdlib=(\S*)/i);
if (match) { if (match) {
return match[1]; return match[1];
} else { }
const stdlibOption: string | undefined = _.find(key.options, option => { const stdlibOption: string | undefined = _.find(key.options, option => {
return option.startsWith('-stdlib='); return option.startsWith('-stdlib=');
}); });
@@ -169,7 +168,6 @@ export class BuildEnvSetupBase {
return this.defaultLibCxx; return this.defaultLibCxx;
} }
}
getTarget(key: CacheKey): string { getTarget(key: CacheKey): string {
if (!this.compilerSupportsX86) return ''; if (!this.compilerSupportsX86) return '';
@@ -177,7 +175,7 @@ export class BuildEnvSetupBase {
if (key.options.includes('-m32')) { if (key.options.includes('-m32')) {
return 'x86'; return 'x86';
} else { }
const target: string | undefined = _.find(key.options, option => { const target: string | undefined = _.find(key.options, option => {
return option.startsWith('-target=') || option.startsWith('--target='); return option.startsWith('-target=') || option.startsWith('--target=');
}); });
@@ -185,7 +183,6 @@ export class BuildEnvSetupBase {
if (target) { if (target) {
return target.substring(target.indexOf('=') + 1); return target.substring(target.indexOf('=') + 1);
} }
}
return 'x86_64'; return 'x86_64';
} }

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import _ from 'underscore'; import _ from 'underscore';
@@ -61,17 +61,15 @@ export class BuildEnvSetupCeConanRustDirect extends BuildEnvSetupCeConanDirect {
} }
getArchFromTriple(triple: string) { getArchFromTriple(triple: string) {
if (triple && triple.split) { if (triple?.split) {
const arr = triple.split('-'); const arr = triple.split('-');
if (arr && arr[0]) { if (arr?.[0]) {
return arr[0]; return arr[0];
} else { }
return triple; return triple;
} }
} else {
return ''; return '';
} }
}
override getTarget(key: CacheKey) { override getTarget(key: CacheKey) {
if (!this.compilerSupportsX86) return ''; if (!this.compilerSupportsX86) return '';
@@ -84,13 +82,12 @@ export class BuildEnvSetupCeConanRustDirect extends BuildEnvSetupCeConanDirect {
if (target) { if (target) {
const triple = target.substring(target.indexOf('=') + 1); const triple = target.substring(target.indexOf('=') + 1);
return this.getArchFromTriple(triple); return this.getArchFromTriple(triple);
} else { }
const idx = key.options.indexOf('--target'); const idx = key.options.indexOf('--target');
if (idx !== -1) { if (idx !== -1) {
const triple = key.options[idx + 1]; const triple = key.options[idx + 1];
return this.getArchFromTriple(triple); return this.getArchFromTriple(triple);
} }
}
return 'x86_64'; return 'x86_64';
} }

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import zlib from 'zlib'; import zlib from 'node:zlib';
import fs, {mkdirp} from 'fs-extra'; import fs, {mkdirp} from 'fs-extra';
import request from 'request'; import request from 'request';
@@ -126,9 +126,8 @@ export class BuildEnvSetupCeConanDirect extends BuildEnvSetupBase {
if (this.extractAllToRoot) { if (this.extractAllToRoot) {
const filename = path.basename(zippedPath); const filename = path.basename(zippedPath);
return path.join(downloadPath, filename); return path.join(downloadPath, filename);
} else {
return path.join(downloadPath, libId, zippedPath);
} }
return path.join(downloadPath, libId, zippedPath);
} }
async downloadAndExtractPackage( async downloadAndExtractPackage(
@@ -245,11 +244,11 @@ export class BuildEnvSetupCeConanDirect extends BuildEnvSetupBase {
return _.all(buildProperties, (val, key) => { return _.all(buildProperties, (val, key) => {
if ((key === 'compiler' || key === 'compiler.version') && elem.settings[key] === 'cshared') { if ((key === 'compiler' || key === 'compiler.version') && elem.settings[key] === 'cshared') {
return true; return true;
} else if (key === 'compiler.libcxx' && elem.settings['compiler'] === 'cshared') {
return true;
} else {
return val === elem.settings[key];
} }
if (key === 'compiler.libcxx' && elem.settings['compiler'] === 'cshared') {
return true;
}
return val === elem.settings[key];
}); });
}); });
} }

View File

@@ -32,8 +32,8 @@ import {OnDiskCache} from './on-disk.js';
import {S3Cache} from './s3.js'; import {S3Cache} from './s3.js';
function paramInt(config: string, param: string): number { function paramInt(config: string, param: string): number {
const result = parseInt(param); const result = Number.parseInt(param);
if (isNaN(result)) throw new Error(`Bad params: ${config}`); if (Number.isNaN(result)) throw new Error(`Bad params: ${config}`);
return result; return result;
} }

View File

@@ -23,8 +23,8 @@
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import {Buffer} from 'buffer'; import {Buffer} from 'buffer';
import crypto from 'crypto'; import crypto from 'node:crypto';
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import {LRUCache} from 'lru-cache'; import {LRUCache} from 'lru-cache';
@@ -85,11 +85,10 @@ export class OnDiskCache extends BaseCache {
.filter(Boolean); .filter(Boolean);
// Sort oldest first // Sort oldest first
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore filter(Boolean) should have sufficed but doesn't // @ts-ignore filter(Boolean) should have sufficed but doesn't
info.sort((x, y) => x.sort - y.sort); info.sort((x, y) => x.sort - y.sort);
for (const i of info) { for (const i of info) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore // @ts-ignore
this.cache.set(i.key, i.data); this.cache.set(i.key, i.data);
} }

View File

@@ -74,7 +74,7 @@ export class BaseCFGParser {
public filterData(assembly: AssemblyLine[]) { public filterData(assembly: AssemblyLine[]) {
const jmpLabelRegex = /\.L\d+:/; const jmpLabelRegex = /\.L\d+:/;
const isCode = (x: AssemblyLine) => const isCode = (x: AssemblyLine) =>
x && x.text && (x.source !== null || jmpLabelRegex.test(x.text) || this.isFunctionName(x)); x?.text && (x.source !== null || jmpLabelRegex.test(x.text) || this.isFunctionName(x));
return this.filterTextSection(assembly).map(_.clone).filter(isCode); return this.filterTextSection(assembly).map(_.clone).filter(isCode);
} }
@@ -108,9 +108,12 @@ export class BaseCFGParser {
let rangeBb: BBRange = {nameId: functionName, start: first, end: 0, actionPos: []}; let rangeBb: BBRange = {nameId: functionName, start: first, end: 0, actionPos: []};
const result: BBRange[] = []; const result: BBRange[] = [];
const newRangeWith = function (oldRange: BBRange, nameId: string, start: number) { const newRangeWith = (oldRange: BBRange, nameId: string, start: number) => ({
return {nameId: nameId, start: start, actionPos: [], end: oldRange.end}; nameId: nameId,
}; start: start,
actionPos: [],
end: oldRange.end,
});
while (first < last) { while (first < last) {
const inst = asmArr[first].text; const inst = asmArr[first].text;
@@ -194,12 +197,12 @@ export class BaseCFGParser {
end: basicBlock.end, end: basicBlock.end,
}, },
]; ];
else if (actPosSz === 1) if (actPosSz === 1)
return [ return [
{nameId: basicBlock.nameId, start: basicBlock.start, end: actionPos[0] + 1}, {nameId: basicBlock.nameId, start: basicBlock.start, end: actionPos[0] + 1},
{nameId: basicBlock.nameId + '@' + (actionPos[0] + 1), start: actionPos[0] + 1, end: basicBlock.end}, {nameId: basicBlock.nameId + '@' + (actionPos[0] + 1), start: actionPos[0] + 1, end: basicBlock.end},
]; ];
else {
let first = 0; let first = 0;
const last = actPosSz; const last = actPosSz;
const blockName = basicBlock.nameId; const blockName = basicBlock.nameId;
@@ -219,7 +222,6 @@ export class BaseCFGParser {
return result; return result;
} }
}
protected concatInstructions(asmArr: AssemblyLine[], first: number, last: number) { protected concatInstructions(asmArr: AssemblyLine[], first: number, last: number) {
return asmArr return asmArr
@@ -250,7 +252,7 @@ export class BaseCFGParser {
return asm ? this.isBasicBlockEnd(asm.text, '') : false; return asm ? this.isBasicBlockEnd(asm.text, '') : false;
}; };
const generateName = function (name: string, suffix: number) { const generateName = (name: string, suffix: number) => {
const pos = name.indexOf('@'); const pos = name.indexOf('@');
if (pos === -1) return `${name}@${suffix}`; if (pos === -1) return `${name}@${suffix}`;

View File

@@ -36,7 +36,7 @@ export class ClangCFGParser extends BaseCFGParser {
override filterData(assembly: ResultLine[]) { override filterData(assembly: ResultLine[]) {
const jmpLabelRegex = /\.LBB\d+_\d+:/; const jmpLabelRegex = /\.LBB\d+_\d+:/;
const isCode = (x: ResultLine) => const isCode = (x: ResultLine) =>
x && x.text && (x.source !== null || jmpLabelRegex.test(x.text) || this.isFunctionName(x)); x?.text && (x.source !== null || jmpLabelRegex.test(x.text) || this.isFunctionName(x));
const removeComments = (x: ResultLine) => { const removeComments = (x: ResultLine) => {
const pos_x86 = x.text.indexOf('# '); const pos_x86 = x.text.indexOf('# ');

View File

@@ -36,7 +36,7 @@ export class GccCFGParser extends BaseCFGParser {
override filterData(assembly: ResultLine[]) { override filterData(assembly: ResultLine[]) {
const jmpLabelRegex = /\.L\d+:/; const jmpLabelRegex = /\.L\d+:/;
const isCode = (x: AssemblyLine) => const isCode = (x: AssemblyLine) =>
x && x.text && (x.source !== null || jmpLabelRegex.test(x.text) || this.isFunctionName(x)); x?.text && (x.source !== null || jmpLabelRegex.test(x.text) || this.isFunctionName(x));
return this.filterTextSection(assembly).map(_.clone).filter(isCode); return this.filterTextSection(assembly).map(_.clone).filter(isCode);
} }

View File

@@ -83,7 +83,7 @@ export class LlvmIrCfgParser extends BaseCFGParser {
const result: BBRange[] = []; const result: BBRange[] = [];
let i = fn.start + 1; let i = fn.start + 1;
let bbStart = i; let bbStart = i;
let currentName: string = ''; let currentName = '';
let namePrefix: string = fnName + '\n\n'; let namePrefix: string = fnName + '\n\n';
while (i < fn.end) { while (i < fn.end) {
const match = code[i].text.match(this.labelRe); const match = code[i].text.match(this.labelRe);
@@ -160,7 +160,8 @@ export class LlvmIrCfgParser extends BaseCFGParser {
lastInst--; lastInst--;
} }
return this.concatInstructions(asmArr, lastInst, end + 1); return this.concatInstructions(asmArr, lastInst, end + 1);
} else if ( }
if (
lastInst >= 1 && lastInst >= 1 &&
asmArr[lastInst].text.includes('unwind label') && asmArr[lastInst].text.includes('unwind label') &&
asmArr[lastInst - 1].text.trim().includes('invoke ') asmArr[lastInst - 1].text.trim().includes('invoke ')
@@ -169,7 +170,8 @@ export class LlvmIrCfgParser extends BaseCFGParser {
// invoke void @__cxa_throw(ptr nonnull %exception, ptr nonnull @typeinfo for int, ptr null) #3 // invoke void @__cxa_throw(ptr nonnull %exception, ptr nonnull @typeinfo for int, ptr null) #3
// to label %unreachable unwind label %lpad // to label %unreachable unwind label %lpad
return this.concatInstructions(asmArr, lastInst - 1, lastInst + 1); return this.concatInstructions(asmArr, lastInst - 1, lastInst + 1);
} else if ( }
if (
lastInst >= 1 && lastInst >= 1 &&
asmArr[lastInst - 1].text.includes('landingpad') && asmArr[lastInst - 1].text.includes('landingpad') &&
asmArr[lastInst].text.includes('catch') asmArr[lastInst].text.includes('catch')
@@ -178,7 +180,8 @@ export class LlvmIrCfgParser extends BaseCFGParser {
// %0 = landingpad { ptr, i32 } // %0 = landingpad { ptr, i32 }
// catch ptr null // catch ptr null
return this.concatInstructions(asmArr, lastInst - 1, lastInst + 1); return this.concatInstructions(asmArr, lastInst - 1, lastInst + 1);
} else if ( }
if (
lastInst >= 1 && lastInst >= 1 &&
asmArr[lastInst - 1].text.includes('callbr') && asmArr[lastInst - 1].text.includes('callbr') &&
asmArr[lastInst].text.trim().startsWith('to label') asmArr[lastInst].text.trim().startsWith('to label')
@@ -187,9 +190,8 @@ export class LlvmIrCfgParser extends BaseCFGParser {
// %2 = callbr i32 asm "mov ${1:l}, $0", "=r,!i,~{dirflag},~{fpsr},~{flags}"() #2 // %2 = callbr i32 asm "mov ${1:l}, $0", "=r,!i,~{dirflag},~{fpsr},~{flags}"() #2
// to label %asm.fallthrough1 [label %err.split2] // to label %asm.fallthrough1 [label %err.split2]
return this.concatInstructions(asmArr, lastInst - 1, lastInst + 1); return this.concatInstructions(asmArr, lastInst - 1, lastInst + 1);
} else {
return asmArr[lastInst].text;
} }
return asmArr[lastInst].text;
})(); })();
let terminator; let terminator;
if (terminatingInstruction.includes('invoke ')) { if (terminatingInstruction.includes('invoke ')) {

View File

@@ -28,7 +28,7 @@ import {EdgeColor} from '../../../types/compilation/cfg.interfaces.js';
import {logger} from '../../logger.js'; import {logger} from '../../logger.js';
import {BaseInstructionSetInfo, InstructionType} from '../instruction-sets/base.js'; import {BaseInstructionSetInfo, InstructionType} from '../instruction-sets/base.js';
import {AssemblyLine, BaseCFGParser, BBRange, CanonicalBB, Edge, Range} from './base.js'; import {AssemblyLine, BBRange, BaseCFGParser, CanonicalBB, Edge, Range} from './base.js';
// This currently only covers the default arm64 output. To support dex2oat's // This currently only covers the default arm64 output. To support dex2oat's
// other ISAs, we just need to make sure the correct isJmpInstruction() is being // other ISAs, we just need to make sure the correct isJmpInstruction() is being
@@ -153,14 +153,12 @@ export class OatCFGParser extends BaseCFGParser {
actionPos: [], actionPos: [],
}; };
const newRangeWith = function (oldRange: BBRange, nameId: string, start: number) { const newRangeWith = (oldRange: BBRange, nameId: string, start: number) => ({
return {
nameId: nameId, nameId: nameId,
start: start, start: start,
actionPos: [], actionPos: [],
end: oldRange.end, end: oldRange.end,
}; });
};
const result: BBRange[] = []; const result: BBRange[] = [];
while (first < last) { while (first < last) {
@@ -212,7 +210,7 @@ export class OatCFGParser extends BaseCFGParser {
end: basicBlock.end, end: basicBlock.end,
}, },
]; ];
else if (actPosSz === 1) if (actPosSz === 1)
return [ return [
{nameId: basicBlock.nameId, start: basicBlock.start, end: actionPos[0] + 1}, {nameId: basicBlock.nameId, start: basicBlock.start, end: actionPos[0] + 1},
{ {
@@ -221,7 +219,7 @@ export class OatCFGParser extends BaseCFGParser {
end: basicBlock.end, end: basicBlock.end,
}, },
]; ];
else {
let first = 0; let first = 0;
const last = actPosSz; const last = actPosSz;
const blockName = basicBlock.nameId; const blockName = basicBlock.nameId;
@@ -245,7 +243,6 @@ export class OatCFGParser extends BaseCFGParser {
return result; return result;
} }
}
override makeEdges(asmArr: AssemblyLine[], arrOfCanonicalBasicBlock: CanonicalBB[]) { override makeEdges(asmArr: AssemblyLine[], arrOfCanonicalBasicBlock: CanonicalBB[]) {
const edges: Edge[] = []; const edges: Edge[] = [];

View File

@@ -24,7 +24,7 @@
import type {CompilerInfo} from '../../types/compiler.interfaces.js'; import type {CompilerInfo} from '../../types/compiler.interfaces.js';
import {AssemblyLine, Edge, getParserByKey, Node} from './cfg-parsers/index.js'; import {AssemblyLine, Edge, Node, getParserByKey} from './cfg-parsers/index.js';
import {OatCFGParser} from './cfg-parsers/oat.js'; import {OatCFGParser} from './cfg-parsers/oat.js';
import {getInstructionSetByKey} from './instruction-sets/index.js'; import {getInstructionSetByKey} from './instruction-sets/index.js';
@@ -60,8 +60,7 @@ export function generateStructure(compilerInfo: CompilerInfo, asmArr: AssemblyLi
// dex2oat is a special case because it can output different instruction // dex2oat is a special case because it can output different instruction
// sets. Create an OAT parser instead of searching by ISA. // sets. Create an OAT parser instead of searching by ISA.
const parser = const parser = compilerGroup?.includes('dex2oat')
compilerGroup && compilerGroup.includes('dex2oat')
? new OatCFGParser(instructionSet) ? new OatCFGParser(instructionSet)
: new (getParserByKey(compilerGroup))(instructionSet); : new (getParserByKey(compilerGroup))(instructionSet);

View File

@@ -63,24 +63,24 @@ export class ArmInstructionSetInfo extends BaseInstructionSetInfo {
`b\\.?${ArmInstructionSetInfo.conditions}(?:\\.w)?`, `b\\.?${ArmInstructionSetInfo.conditions}(?:\\.w)?`,
`bx${ArmInstructionSetInfo.conditions}`, `bx${ArmInstructionSetInfo.conditions}`,
`bxj${ArmInstructionSetInfo.conditions}`, `bxj${ArmInstructionSetInfo.conditions}`,
`cbz`, 'cbz',
`cbnz`, 'cbnz',
`tbz`, 'tbz',
`tbnz`, 'tbnz',
] ]
.map(re => `(?:${re})`) .map(re => `(?:${re})`)
.join('|') + .join('|') +
')\\b', ')\\b',
); );
static unconditionalJumps = new RegExp( static unconditionalJumps = new RegExp(
'\\b(?:' + [`b(?:\\.w)?`, `bx`, `bxj`].map(re => `(?:${re})`).join('|') + ')\\b', '\\b(?:' + ['b(?:\\.w)?', 'bx', 'bxj'].map(re => `(?:${re})`).join('|') + ')\\b',
); );
static returnInstruction = new RegExp( static returnInstruction = new RegExp(
'(?:' + '(?:' +
[`bx`, `ret`].map(re => `(?:${re})`).join('|') + ['bx', 'ret'].map(re => `(?:${re})`).join('|') +
')\\b.*' + ')\\b.*' +
`|pop\\s*\\{(?:r(?:\\d{2,}|[4-9]),\\s*)*pc\\}.*` + '|pop\\s*\\{(?:r(?:\\d{2,}|[4-9]),\\s*)*pc\\}.*' +
`|mov\\s*pc\\s*,.*`, '|mov\\s*pc\\s*,.*',
); );
static override get key(): InstructionSet[] { static override get key(): InstructionSet[] {
@@ -97,11 +97,10 @@ export class ArmInstructionSetInfo extends BaseInstructionSetInfo {
override getInstructionType(instruction: string) { override getInstructionType(instruction: string) {
const opcode = instruction.trim().split(' ')[0].toLowerCase(); const opcode = instruction.trim().split(' ')[0].toLowerCase();
if (ArmInstructionSetInfo.conditionalJumps.test(opcode)) return InstructionType.conditionalJmpInst; if (ArmInstructionSetInfo.conditionalJumps.test(opcode)) return InstructionType.conditionalJmpInst;
else if (ArmInstructionSetInfo.unconditionalJumps.test(opcode)) return InstructionType.jmp; if (ArmInstructionSetInfo.unconditionalJumps.test(opcode)) return InstructionType.jmp;
else if (ArmInstructionSetInfo.returnInstruction.test(instruction.trim().toLocaleLowerCase())) { if (ArmInstructionSetInfo.returnInstruction.test(instruction.trim().toLocaleLowerCase())) {
return InstructionType.retInst; return InstructionType.retInst;
} else { }
return InstructionType.notRetInst; return InstructionType.notRetInst;
} }
}
} }

View File

@@ -25,10 +25,10 @@
import {InstructionSet} from '../../../types/instructionsets.js'; import {InstructionSet} from '../../../types/instructionsets.js';
export enum InstructionType { export enum InstructionType {
jmp, jmp = 0,
conditionalJmpInst, conditionalJmpInst = 1,
notRetInst, notRetInst = 2,
retInst, retInst = 3,
} }
export class BaseInstructionSetInfo { export class BaseInstructionSetInfo {
@@ -46,11 +46,10 @@ export class BaseInstructionSetInfo {
getInstructionType(inst: string) { getInstructionType(inst: string) {
if (inst.includes('jmp') || inst.includes(' b ')) return InstructionType.jmp; if (inst.includes('jmp') || inst.includes(' b ')) return InstructionType.jmp;
else if (this.isJmpInstruction(inst)) return InstructionType.conditionalJmpInst; if (this.isJmpInstruction(inst)) return InstructionType.conditionalJmpInst;
else if (inst.includes(' ret')) { if (inst.includes(' ret')) {
return InstructionType.retInst; return InstructionType.retInst;
} else { }
return InstructionType.notRetInst; return InstructionType.notRetInst;
} }
}
} }

View File

@@ -378,9 +378,8 @@ class GoldenLayoutComponents {
filename: session.filename, filename: session.filename,
}, },
}; };
} else {
return editor;
} }
return editor;
} }
createTreeComponent(tree: ClientStateTree, customTreeId?: number): GoldenLayoutComponentStruct { createTreeComponent(tree: ClientStateTree, customTreeId?: number): GoldenLayoutComponentStruct {
@@ -885,13 +884,12 @@ export class ClientStateGoldenifier extends GoldenLayoutComponents {
createSourceContentArray(state: ClientState, leftSession: number, rightSession: number): BasicGoldenLayoutStruct[] { createSourceContentArray(state: ClientState, leftSession: number, rightSession: number): BasicGoldenLayoutStruct[] {
if (leftSession === rightSession) { if (leftSession === rightSession) {
return [this.createPresentationModeComponents(state.sessions[leftSession], 1, 100)]; return [this.createPresentationModeComponents(state.sessions[leftSession], 1, 100)];
} else { }
return [ return [
this.createPresentationModeComponents(state.sessions[leftSession], 1), this.createPresentationModeComponents(state.sessions[leftSession], 1),
this.createPresentationModeComponents(state.sessions[rightSession], 2), this.createPresentationModeComponents(state.sessions[rightSession], 2),
]; ];
} }
}
getPresentationModeEmptyLayout() { getPresentationModeEmptyLayout() {
return { return {

View File

@@ -121,7 +121,7 @@ export class ClientStateCompiler {
export class ClientStateExecutor { export class ClientStateExecutor {
compilerVisible = false; compilerVisible = false;
compilerOutputVisible = false; compilerOutputVisible = false;
arguments: string = ''; arguments = '';
argumentsVisible = false; argumentsVisible = false;
stdin = ''; stdin = '';
stdinVisible = false; stdinVisible = false;

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import child_process from 'child_process'; import child_process from 'node:child_process';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';
@@ -39,7 +39,7 @@ import {FormattingService} from './formatting-service.js';
import {logger} from './logger.js'; import {logger} from './logger.js';
import type {PropertyGetter} from './properties.interfaces.js'; import type {PropertyGetter} from './properties.interfaces.js';
import {CompilerProps, PropFunc} from './properties.js'; import {CompilerProps, PropFunc} from './properties.js';
import {createStatsNoter, IStatsNoter} from './stats.js'; import {IStatsNoter, createStatsNoter} from './stats.js';
export class CompilationEnvironment { export class CompilationEnvironment {
ceProps: PropertyGetter; ceProps: PropertyGetter;
@@ -146,7 +146,7 @@ export class CompilationEnvironment {
const key = BaseCache.hash(object); const key = BaseCache.hash(object);
const result = await this.compilerCache.get(key); const result = await this.compilerCache.get(key);
if (this.logCompilerCacheAccesses) { if (this.logCompilerCacheAccesses) {
logger.info(`hash ${key} (${(object && object['compiler']) || '???'}) ${result.hit ? 'hit' : 'miss'}`); logger.info(`hash ${key} (${object?.['compiler'] || '???'}) ${result.hit ? 'hit' : 'miss'}`);
logger.debug(`Cache get ${JSON.stringify(object)}`); logger.debug(`Cache get ${JSON.stringify(object)}`);
} }
if (!result.hit) return null; if (!result.hit) return null;

View File

@@ -22,8 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
// eslint-disable-next-line n/no-unsupported-features/node-builtins import {executionAsyncId} from 'node:async_hooks';
import {executionAsyncId} from 'async_hooks';
import {default as Queue} from 'p-queue'; import {default as Queue} from 'p-queue';
import PromClient from 'prom-client'; import PromClient from 'prom-client';
@@ -90,7 +89,7 @@ export class CompilationQueue {
() => { () => {
const dequeuedAt = Date.now(); const dequeuedAt = Date.now();
queueDequeued.inc(); queueDequeued.inc();
if (options && options.abandonIfStale && dequeuedAt > enqueuedAt + this._staleAfterMs) { if (options?.abandonIfStale && dequeuedAt > enqueuedAt + this._staleAfterMs) {
queueCompleted.inc(); queueCompleted.inc();
queueStale.inc(); queueStale.inc();
const queueTimeSecs = (dequeuedAt - enqueuedAt) / 1000; const queueTimeSecs = (dequeuedAt - enqueuedAt) / 1000;

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';
@@ -124,15 +124,20 @@ export class CompilerArguments implements ICompilerArguments {
// prefer optimization flags or standard if statistics are not available // prefer optimization flags or standard if statistics are not available
if (a[1].description.includes('optimization')) { if (a[1].description.includes('optimization')) {
return -1; return -1;
} else if (b[1].description.includes('optimization')) { }
if (b[1].description.includes('optimization')) {
return 1; return 1;
} else if (a[1].description.includes('optimize')) { }
if (a[1].description.includes('optimize')) {
return -1; return -1;
} else if (b[1].description.includes('optimize')) { }
if (b[1].description.includes('optimize')) {
return 1; return 1;
} else if (a[1].description.includes('std')) { }
if (a[1].description.includes('std')) {
return -1; return -1;
} else if (b[1].description.includes('std')) { }
if (b[1].description.includes('std')) {
return 1; return 1;
} }
} }

View File

@@ -22,10 +22,10 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import http from 'http'; import http from 'node:http';
import https from 'https'; import https from 'node:https';
import path from 'path'; import path from 'node:path';
import {promisify} from 'util'; import {promisify} from 'node:util';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';
@@ -358,7 +358,7 @@ export class CompilerFinder {
const pathParts = bits[1].split('/'); const pathParts = bits[1].split('/');
return { return {
host: bits[0], host: bits[0],
port: parseInt(unwrap(pathParts.shift())), port: Number.parseInt(unwrap(pathParts.shift())),
uriBase: pathParts.join('/'), uriBase: pathParts.join('/'),
}; };
} }

View File

@@ -23,7 +23,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import {splitArguments} from '../../shared/common-utils.js'; import {splitArguments} from '../../shared/common-utils.js';
import type {ConfiguredOverrides} from '../../types/compilation/compiler-overrides.interfaces.js'; import type {ConfiguredOverrides} from '../../types/compilation/compiler-overrides.interfaces.js';
@@ -72,13 +72,13 @@ export class AdaCompiler extends BaseCompiler {
// - "foo.o" may be used by intermediary file, so "-o foo.o" will not // - "foo.o" may be used by intermediary file, so "-o foo.o" will not
// work if building an executable. // work if building an executable.
if (key && key.filters && key.filters.binary) { if (key?.filters?.binary) {
return path.join(dirPath, 'example'); return path.join(dirPath, 'example');
} else if (key && key.filters && key.filters.binaryObject) {
return path.join(dirPath, 'example.o');
} else {
return path.join(dirPath, 'example.s');
} }
if (key?.filters?.binaryObject) {
return path.join(dirPath, 'example.o');
}
return path.join(dirPath, 'example.s');
} }
override prepareArguments( override prepareArguments(
@@ -174,13 +174,16 @@ export class AdaCompiler extends BaseCompiler {
if (a === '-cargs') { if (a === '-cargs') {
part = 1; part = 1;
continue; continue;
} else if (a === '-largs') { }
if (a === '-largs') {
part = 2; part = 2;
continue; continue;
} else if (a === '-bargs') { }
if (a === '-bargs') {
part = 3; part = 3;
continue; continue;
} else if (a === '-margs') { }
if (a === '-margs') {
part = 0; part = 0;
continue; continue;
} }

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import process from 'process'; import process from 'node:process';
import * as Sentry from '@sentry/node'; import * as Sentry from '@sentry/node';
import fs from 'fs-extra'; import fs from 'fs-extra';
@@ -59,7 +59,7 @@ export class BaseParser {
} }
static getExampleFilepath(): string { static getExampleFilepath(): string {
let filename = path.join(this.getExamplesRoot(), this.getDefaultExampleFilename()); let filename = path.join(BaseParser.getExamplesRoot(), BaseParser.getDefaultExampleFilename());
if (!path.isAbsolute(filename)) filename = path.join(process.cwd(), filename); if (!path.isAbsolute(filename)) filename = path.join(process.cwd(), filename);
return filename; return filename;
@@ -71,18 +71,19 @@ export class BaseParser {
utils.eachLine(stdout, line => { utils.eachLine(stdout, line => {
const match1 = line.match(optionWithDescRegex); const match1 = line.match(optionWithDescRegex);
if (match1 && match1[1] && match1[2]) { if (match1?.[1] && match1[2]) {
previousOption = match1[1].trim(); previousOption = match1[1].trim();
if (previousOption) { if (previousOption) {
options[previousOption] = { options[previousOption] = {
description: this.spaceCompress(match1[2].trim()), description: BaseParser.spaceCompress(match1[2].trim()),
timesused: 0, timesused: 0,
}; };
} }
return; return;
} else if (optionWithoutDescRegex) { }
if (optionWithoutDescRegex) {
const match2 = line.match(optionWithoutDescRegex); const match2 = line.match(optionWithoutDescRegex);
if (match2 && match2[1]) { if (match2?.[1]) {
previousOption = match2[1].trim(); previousOption = match2[1].trim();
if (previousOption) { if (previousOption) {
@@ -107,7 +108,7 @@ export class BaseParser {
} }
} }
options[previousOption].description = this.spaceCompress(options[previousOption].description); options[previousOption].description = BaseParser.spaceCompress(options[previousOption].description);
} else { } else {
previousOption = false; previousOption = false;
} }
@@ -134,11 +135,11 @@ export class BaseParser {
} }
static async getOptions(compiler: BaseCompiler, helpArg: string) { static async getOptions(compiler: BaseCompiler, helpArg: string) {
const optionFinder1 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) +(.*)/i; const optionFinder1 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) {2,}(.*)/i;
const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i; const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]); const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
const options = const options =
result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {}; result.code === 0 ? BaseParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {};
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -166,21 +167,21 @@ export class GCCParser extends BaseParser {
static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) { static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
const keys = _.keys(options); const keys = _.keys(options);
logger.debug(`gcc-like compiler options: ${keys.join(' ')}`); logger.debug(`gcc-like compiler options: ${keys.join(' ')}`);
if (this.hasSupport(options, '-masm=')) { if (GCCParser.hasSupport(options, '-masm=')) {
await this.checkAndSetMasmIntelIfSupported(compiler); await GCCParser.checkAndSetMasmIntelIfSupported(compiler);
} }
if (this.hasSupport(options, '-fstack-usage')) { if (GCCParser.hasSupport(options, '-fstack-usage')) {
compiler.compiler.stackUsageArg = '-fstack-usage'; compiler.compiler.stackUsageArg = '-fstack-usage';
compiler.compiler.supportsStackUsageOutput = true; compiler.compiler.supportsStackUsageOutput = true;
} }
if (this.hasSupport(options, '-fdiagnostics-color')) { if (GCCParser.hasSupport(options, '-fdiagnostics-color')) {
if (compiler.compiler.options) compiler.compiler.options += ' '; if (compiler.compiler.options) compiler.compiler.options += ' ';
compiler.compiler.options += '-fdiagnostics-color=always'; compiler.compiler.options += '-fdiagnostics-color=always';
} }
if (this.hasSupport(options, '-fverbose-asm')) { if (GCCParser.hasSupport(options, '-fverbose-asm')) {
compiler.compiler.supportsVerboseAsm = true; compiler.compiler.supportsVerboseAsm = true;
} }
if (this.hasSupport(options, '-fopt-info')) { if (GCCParser.hasSupport(options, '-fopt-info')) {
compiler.compiler.optArg = '-fopt-info-all'; compiler.compiler.optArg = '-fopt-info-all';
compiler.compiler.supportsOptOutput = true; compiler.compiler.supportsOptOutput = true;
} }
@@ -193,22 +194,22 @@ export class GCCParser extends BaseParser {
// not produce anything. // not produce anything.
compiler.compiler.removeEmptyGccDump = true; compiler.compiler.removeEmptyGccDump = true;
} }
if (this.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true; if (GCCParser.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true;
if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true; if (GCCParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true; if (GCCParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
} }
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([ const results = await Promise.all([
this.getOptions(compiler, '-fsyntax-only --help'), GCCParser.getOptions(compiler, '-fsyntax-only --help'),
this.getOptions(compiler, '-fsyntax-only --target-help'), GCCParser.getOptions(compiler, '-fsyntax-only --target-help'),
this.getOptions(compiler, '-fsyntax-only --help=common'), GCCParser.getOptions(compiler, '-fsyntax-only --help=common'),
this.getOptions(compiler, '-fsyntax-only --help=warnings'), GCCParser.getOptions(compiler, '-fsyntax-only --help=warnings'),
this.getOptions(compiler, '-fsyntax-only --help=optimizers'), GCCParser.getOptions(compiler, '-fsyntax-only --help=optimizers'),
this.getOptions(compiler, '-fsyntax-only --help=target'), GCCParser.getOptions(compiler, '-fsyntax-only --help=target'),
]); ]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
await this.setCompilerSettingsFromOptions(compiler, options); await GCCParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
@@ -218,9 +219,8 @@ export class GCCParser extends BaseParser {
const match = result.stdout.match(re); const match = result.stdout.match(re);
if (match) { if (match) {
return match[1].split(' '); return match[1].split(' ');
} else {
return [];
} }
return [];
} }
static getLanguageSpecificHelpFlags(): string[] { static getLanguageSpecificHelpFlags(): string[] {
@@ -229,7 +229,7 @@ export class GCCParser extends BaseParser {
static override async getPossibleStdvers(compiler: BaseCompiler): Promise<CompilerOverrideOptions> { static override async getPossibleStdvers(compiler: BaseCompiler): Promise<CompilerOverrideOptions> {
const possible: CompilerOverrideOptions = []; const possible: CompilerOverrideOptions = [];
const options = await this.getOptionsStrict(compiler, this.getLanguageSpecificHelpFlags()); const options = await GCCParser.getOptionsStrict(compiler, GCCParser.getLanguageSpecificHelpFlags());
for (const opt in options) { for (const opt in options) {
if (opt.startsWith('-std=') && !options[opt].description?.startsWith('Deprecated')) { if (opt.startsWith('-std=') && !options[opt].description?.startsWith('Deprecated')) {
const stdver = opt.substring(5); const stdver = opt.substring(5);
@@ -243,11 +243,11 @@ export class GCCParser extends BaseParser {
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string) { static override async getOptions(compiler: BaseCompiler, helpArg: string) {
const optionFinder1 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) +(.*)/i; const optionFinder1 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) {2,}(.*)/i;
const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i; const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' ')); const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
const options = const options =
result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {}; result.code === 0 ? GCCParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2) : {};
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -255,7 +255,7 @@ export class GCCParser extends BaseParser {
static async getOptionsStrict(compiler: BaseCompiler, helpArgs: string[]) { static async getOptionsStrict(compiler: BaseCompiler, helpArgs: string[]) {
const optionFinder = /^ {2}(--?[\d+,<=>[\]a-z|-]*) *(.*)/i; const optionFinder = /^ {2}(--?[\d+,<=>[\]a-z|-]*) *(.*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArgs); const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArgs);
return result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {}; return result.code === 0 ? GCCParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
} }
} }
@@ -270,51 +270,52 @@ export class ClangParser extends BaseParser {
logger.error(`compiler options appear empty for ${compiler.compiler.id}`); logger.error(`compiler options appear empty for ${compiler.compiler.id}`);
} }
if (this.hasSupport(options, '-fsave-optimization-record')) { if (ClangParser.hasSupport(options, '-fsave-optimization-record')) {
compiler.compiler.optArg = '-fsave-optimization-record'; compiler.compiler.optArg = '-fsave-optimization-record';
compiler.compiler.supportsOptOutput = true; compiler.compiler.supportsOptOutput = true;
} }
if (this.hasSupport(options, '-fstack-usage')) { if (ClangParser.hasSupport(options, '-fstack-usage')) {
compiler.compiler.stackUsageArg = '-fstack-usage'; compiler.compiler.stackUsageArg = '-fstack-usage';
compiler.compiler.supportsStackUsageOutput = true; compiler.compiler.supportsStackUsageOutput = true;
} }
if (this.hasSupport(options, '-fverbose-asm')) { if (ClangParser.hasSupport(options, '-fverbose-asm')) {
compiler.compiler.supportsVerboseAsm = true; compiler.compiler.supportsVerboseAsm = true;
} }
if (this.hasSupport(options, '-emit-llvm')) { if (ClangParser.hasSupport(options, '-emit-llvm')) {
compiler.compiler.supportsIrView = true; compiler.compiler.supportsIrView = true;
compiler.compiler.irArg = ['-Xclang', '-emit-llvm', '-fsyntax-only']; compiler.compiler.irArg = ['-Xclang', '-emit-llvm', '-fsyntax-only'];
compiler.compiler.minIrArgs = ['-emit-llvm']; compiler.compiler.minIrArgs = ['-emit-llvm'];
} }
if (this.hasSupport(options, '-emit-cir')) { if (ClangParser.hasSupport(options, '-emit-cir')) {
compiler.compiler.supportsClangirView = true; compiler.compiler.supportsClangirView = true;
} }
if ( if (
this.hasSupport(options, '-mllvm') && ClangParser.hasSupport(options, '-mllvm') &&
this.mllvmOptions.has('--print-before-all') && ClangParser.mllvmOptions.has('--print-before-all') &&
this.mllvmOptions.has('--print-after-all') ClangParser.mllvmOptions.has('--print-after-all')
) { ) {
compiler.compiler.optPipeline = { compiler.compiler.optPipeline = {
arg: ['-mllvm', '--print-before-all', '-mllvm', '--print-after-all'], arg: ['-mllvm', '--print-before-all', '-mllvm', '--print-after-all'],
moduleScopeArg: [], moduleScopeArg: [],
noDiscardValueNamesArg: [], noDiscardValueNamesArg: [],
}; };
if (this.mllvmOptions.has('--print-module-scope')) { if (ClangParser.mllvmOptions.has('--print-module-scope')) {
compiler.compiler.optPipeline.moduleScopeArg = ['-mllvm', '-print-module-scope']; compiler.compiler.optPipeline.moduleScopeArg = ['-mllvm', '-print-module-scope'];
} }
if (this.hasSupport(options, '-fno-discard-value-names')) { if (ClangParser.hasSupport(options, '-fno-discard-value-names')) {
compiler.compiler.optPipeline.noDiscardValueNamesArg = ['-fno-discard-value-names']; compiler.compiler.optPipeline.noDiscardValueNamesArg = ['-fno-discard-value-names'];
} }
} }
if (this.hasSupport(options, '-fcolor-diagnostics')) compiler.compiler.options += ' -fcolor-diagnostics'; if (ClangParser.hasSupport(options, '-fcolor-diagnostics')) compiler.compiler.options += ' -fcolor-diagnostics';
if (this.hasSupport(options, '-fno-crash-diagnostics')) compiler.compiler.options += ' -fno-crash-diagnostics'; if (ClangParser.hasSupport(options, '-fno-crash-diagnostics'))
compiler.compiler.options += ' -fno-crash-diagnostics';
if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true; if (ClangParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true; if (ClangParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
} }
static getMainHelpOptions(): string[] { static getMainHelpOptions(): string[] {
@@ -335,14 +336,21 @@ export class ClangParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
try { try {
const options = await this.getOptions(compiler, this.getMainHelpOptions().join(' ')); const options = await ClangParser.getOptions(compiler, ClangParser.getMainHelpOptions().join(' '));
const filename = this.getExampleFilepath(); const filename = ClangParser.getExampleFilepath();
this.mllvmOptions = new Set( ClangParser.mllvmOptions = new Set(
_.keys(await this.getOptions(compiler, this.getHiddenHelpOptions(filename).join(' '), false, true)), _.keys(
await ClangParser.getOptions(
compiler,
ClangParser.getHiddenHelpOptions(filename).join(' '),
false,
true,
),
),
); );
this.setCompilerSettingsFromOptions(compiler, options); ClangParser.setCompilerSettingsFromOptions(compiler, options);
} catch (error) { } catch (error) {
const err = `Error while trying to generate llvm backend arguments for ${compiler.compiler.id}: ${error}`; const err = `Error while trying to generate llvm backend arguments for ${compiler.compiler.id}: ${error}`;
logger.error(err); logger.error(err);
@@ -377,22 +385,22 @@ export class ClangParser extends BaseParser {
const re4 = /note: use '([\w+:]*)', '([\w+:]*)', '([\w+:]*)', or '([\w+:]*)' for '(.*)' standard/; const re4 = /note: use '([\w+:]*)', '([\w+:]*)', '([\w+:]*)', or '([\w+:]*)' for '(.*)' standard/;
for (const line of lines) { for (const line of lines) {
let match = line.match(re1); let match = line.match(re1);
let stdvers = this.getRegexMatchesAsStdver(match, 2); let stdvers = ClangParser.getRegexMatchesAsStdver(match, 2);
possible.push(...stdvers); possible.push(...stdvers);
if (stdvers.length > 0) continue; if (stdvers.length > 0) continue;
match = line.match(re2); match = line.match(re2);
stdvers = this.getRegexMatchesAsStdver(match, 3); stdvers = ClangParser.getRegexMatchesAsStdver(match, 3);
possible.push(...stdvers); possible.push(...stdvers);
if (stdvers.length > 0) continue; if (stdvers.length > 0) continue;
match = line.match(re3); match = line.match(re3);
stdvers = this.getRegexMatchesAsStdver(match, 4); stdvers = ClangParser.getRegexMatchesAsStdver(match, 4);
possible.push(...stdvers); possible.push(...stdvers);
if (stdvers.length > 0) continue; if (stdvers.length > 0) continue;
match = line.match(re4); match = line.match(re4);
stdvers = this.getRegexMatchesAsStdver(match, 5); stdvers = ClangParser.getRegexMatchesAsStdver(match, 5);
possible.push(...stdvers); possible.push(...stdvers);
} }
return possible; return possible;
@@ -402,16 +410,20 @@ export class ClangParser extends BaseParser {
let possible: CompilerOverrideOptions = []; let possible: CompilerOverrideOptions = [];
// clang doesn't have a --help option to get the std versions, we'll have to compile with a fictional stdversion to coax a response // clang doesn't have a --help option to get the std versions, we'll have to compile with a fictional stdversion to coax a response
const filename = this.getExampleFilepath(); const filename = ClangParser.getExampleFilepath();
const result = await compiler.execCompilerCached(compiler.compiler.exe, this.getStdVersHelpOptions(filename), { const result = await compiler.execCompilerCached(
compiler.compiler.exe,
ClangParser.getStdVersHelpOptions(filename),
{
...compiler.getDefaultExecOptions(), ...compiler.getDefaultExecOptions(),
createAndUseTempDir: true, createAndUseTempDir: true,
}); },
);
if (result.stderr) { if (result.stderr) {
const lines = utils.splitLines(result.stderr); const lines = utils.splitLines(result.stderr);
possible = this.extractPossibleStdvers(lines); possible = ClangParser.extractPossibleStdvers(lines);
possible.sort((a, b) => { possible.sort((a, b) => {
return a.value === b.value ? 0 : a.value > b.value ? 1 : -1; return a.value === b.value ? 0 : a.value > b.value ? 1 : -1;
}); });
@@ -427,16 +439,15 @@ export class ClangParser extends BaseParser {
const match = line.match(re); const match = line.match(re);
if (match) { if (match) {
return match[1]; return match[1];
} else {
return false;
} }
return false;
}) })
.filter(Boolean) as string[]; .filter(Boolean) as string[];
} }
static override async getPossibleTargets(compiler: BaseCompiler): Promise<string[]> { static override async getPossibleTargets(compiler: BaseCompiler): Promise<string[]> {
const result = await compiler.execCompilerCached(compiler.compiler.exe, this.getTargetsHelpOptions()); const result = await compiler.execCompilerCached(compiler.compiler.exe, ClangParser.getTargetsHelpOptions());
return this.extractPossibleTargets(utils.splitLines(result.stdout)); return ClangParser.extractPossibleTargets(utils.splitLines(result.stdout));
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string, populate = true, isolate = false) { static override async getOptions(compiler: BaseCompiler, helpArg: string, populate = true, isolate = false) {
@@ -447,7 +458,7 @@ export class ClangParser extends BaseParser {
const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '), execOptions); const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '), execOptions);
const options = const options =
result.code === 0 result.code === 0
? this.parseLines(result.stdout + result.stderr, optionFinderWithDesc, optionFinderWithoutDesc) ? ClangParser.parseLines(result.stdout + result.stderr, optionFinderWithDesc, optionFinderWithoutDesc)
: {}; : {};
if (populate) compiler.possibleArguments.populateOptions(options); if (populate) compiler.possibleArguments.populateOptions(options);
return options; return options;
@@ -496,10 +507,10 @@ export class ClangCParser extends ClangParser {
export class CircleParser extends ClangParser { export class CircleParser extends ClangParser {
static override async getOptions(compiler: BaseCompiler, helpArg: string) { static override async getOptions(compiler: BaseCompiler, helpArg: string) {
const optionFinder1 = /^ +(--?[\w#,.<=>[\]|-]*) +- (.*)/i; const optionFinder1 = /^ +(--?[\w#,.<=>[\]|-]*) {2,}- (.*)/i;
const optionFinder2 = /^ +(--?[\w#,.<=>[\]|-]*)/i; const optionFinder2 = /^ +(--?[\w#,.<=>[\]|-]*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' ')); const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
const options = result.code === 0 ? this.parseLines(result.stdout, optionFinder1, optionFinder2) : {}; const options = result.code === 0 ? CircleParser.parseLines(result.stdout, optionFinder1, optionFinder2) : {};
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -513,7 +524,8 @@ export class CircleParser extends ClangParser {
if (!isInStdVerSection && line.startsWith(' --std=')) { if (!isInStdVerSection && line.startsWith(' --std=')) {
isInStdVerSection = true; isInStdVerSection = true;
continue; continue;
} else if (isInStdVerSection && line.startsWith(' --')) { }
if (isInStdVerSection && line.startsWith(' --')) {
break; break;
} }
@@ -535,44 +547,44 @@ export class CircleParser extends ClangParser {
export class LDCParser extends BaseParser { export class LDCParser extends BaseParser {
static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) { static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
if (this.hasSupport(options, '--fsave-optimization-record')) { if (LDCParser.hasSupport(options, '--fsave-optimization-record')) {
compiler.compiler.optArg = '--fsave-optimization-record'; compiler.compiler.optArg = '--fsave-optimization-record';
compiler.compiler.supportsOptOutput = true; compiler.compiler.supportsOptOutput = true;
} }
if (this.hasSupport(options, '-fverbose-asm')) { if (LDCParser.hasSupport(options, '-fverbose-asm')) {
compiler.compiler.supportsVerboseAsm = true; compiler.compiler.supportsVerboseAsm = true;
} }
if (this.hasSupport(options, '--print-before-all') && this.hasSupport(options, '--print-after-all')) { if (LDCParser.hasSupport(options, '--print-before-all') && LDCParser.hasSupport(options, '--print-after-all')) {
compiler.compiler.optPipeline = { compiler.compiler.optPipeline = {
arg: ['--print-before-all', '--print-after-all'], arg: ['--print-before-all', '--print-after-all'],
moduleScopeArg: [], moduleScopeArg: [],
noDiscardValueNamesArg: [], noDiscardValueNamesArg: [],
}; };
if (this.hasSupport(options, '--print-module-scope')) { if (LDCParser.hasSupport(options, '--print-module-scope')) {
compiler.compiler.optPipeline.moduleScopeArg = ['--print-module-scope']; compiler.compiler.optPipeline.moduleScopeArg = ['--print-module-scope'];
} }
if (this.hasSupport(options, '--fno-discard-value-names')) { if (LDCParser.hasSupport(options, '--fno-discard-value-names')) {
compiler.compiler.optPipeline.noDiscardValueNamesArg = ['--fno-discard-value-names']; compiler.compiler.optPipeline.noDiscardValueNamesArg = ['--fno-discard-value-names'];
} }
} }
if (this.hasSupport(options, '--enable-color')) { if (LDCParser.hasSupport(options, '--enable-color')) {
compiler.compiler.options += ' --enable-color'; compiler.compiler.options += ' --enable-color';
} }
} }
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const options = await this.getOptions(compiler, '--help-hidden'); const options = await LDCParser.getOptions(compiler, '--help-hidden');
this.setCompilerSettingsFromOptions(compiler, options); LDCParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string, populate = true) { static override async getOptions(compiler: BaseCompiler, helpArg: string, populate = true) {
const optionFinder = /^\s*(--?[\d+,<=>[\]a-z|-]*)\s*(.*)/i; const optionFinder = /^\s*(--?[\d+,<=>[\]a-z|-]*)\s*(.*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' ')); const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
const options = result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {}; const options = result.code === 0 ? LDCParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
if (populate) { if (populate) {
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
} }
@@ -582,21 +594,21 @@ export class LDCParser extends BaseParser {
export class ElixirParser extends BaseParser { export class ElixirParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '--help'); await ElixirParser.getOptions(compiler, '--help');
return compiler; return compiler;
} }
} }
export class ErlangParser extends BaseParser { export class ErlangParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '-help'); await ErlangParser.getOptions(compiler, '-help');
return compiler; return compiler;
} }
} }
export class PascalParser extends BaseParser { export class PascalParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '-help'); await PascalParser.getOptions(compiler, '-help');
return compiler; return compiler;
} }
} }
@@ -604,11 +616,11 @@ export class PascalParser extends BaseParser {
export class ICCParser extends GCCParser { export class ICCParser extends GCCParser {
static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) { static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
const keys = _.keys(options); const keys = _.keys(options);
if (this.hasSupport(options, '-masm=')) { if (ICCParser.hasSupport(options, '-masm=')) {
compiler.compiler.intelAsm = '-masm=intel'; compiler.compiler.intelAsm = '-masm=intel';
compiler.compiler.supportsIntel = true; compiler.compiler.supportsIntel = true;
} }
if (this.hasSupport(options, '-fdiagnostics-color')) { if (ICCParser.hasSupport(options, '-fdiagnostics-color')) {
if (compiler.compiler.options) compiler.compiler.options += ' '; if (compiler.compiler.options) compiler.compiler.options += ' ';
compiler.compiler.options += '-fdiagnostics-color=always'; compiler.compiler.options += '-fdiagnostics-color=always';
} }
@@ -616,9 +628,9 @@ export class ICCParser extends GCCParser {
compiler.compiler.supportsGccDump = true; compiler.compiler.supportsGccDump = true;
compiler.compiler.removeEmptyGccDump = true; compiler.compiler.removeEmptyGccDump = true;
} }
if (this.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true; if (ICCParser.hasSupportStartsWith(options, '-march=')) compiler.compiler.supportsMarch = true;
if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true; if (ICCParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true; if (ICCParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
} }
static extractPossibleStdvers(lines: string[]): CompilerOverrideOptions { static extractPossibleStdvers(lines: string[]): CompilerOverrideOptions {
@@ -658,35 +670,35 @@ export class ICCParser extends GCCParser {
const result = await compiler.execCompilerCached(compiler.compiler.exe, ['--help']); const result = await compiler.execCompilerCached(compiler.compiler.exe, ['--help']);
const lines = utils.splitLines(result.stdout); const lines = utils.splitLines(result.stdout);
return this.extractPossibleStdvers(lines); return ICCParser.extractPossibleStdvers(lines);
} }
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([this.getOptions(compiler, '-fsyntax-only --help')]); const results = await Promise.all([ICCParser.getOptions(compiler, '-fsyntax-only --help')]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
await this.setCompilerSettingsFromOptions(compiler, options); await ICCParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
} }
export class ISPCParser extends BaseParser { export class ISPCParser extends BaseParser {
static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) { static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
if (this.hasSupport(options, '--x86-asm-syntax')) { if (ISPCParser.hasSupport(options, '--x86-asm-syntax')) {
compiler.compiler.intelAsm = '--x86-asm-syntax=intel'; compiler.compiler.intelAsm = '--x86-asm-syntax=intel';
compiler.compiler.supportsIntel = true; compiler.compiler.supportsIntel = true;
} }
} }
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const options = await this.getOptions(compiler, '--help'); const options = await ISPCParser.getOptions(compiler, '--help');
await this.setCompilerSettingsFromOptions(compiler, options); await ISPCParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string) { static override async getOptions(compiler: BaseCompiler, helpArg: string) {
const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]); const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
const optionFinder = /^\s*\[(--?[\d\s()+,/<=>a-z{|}-]*)]\s*(.*)/i; const optionFinder = /^\s*\[(--?[\d\s()+,/<=>a-z{|}-]*)]\s*(.*)/i;
const options = result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {}; const options = result.code === 0 ? ISPCParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -694,28 +706,28 @@ export class ISPCParser extends BaseParser {
export class JavaParser extends BaseParser { export class JavaParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '-help'); await JavaParser.getOptions(compiler, '-help');
return compiler; return compiler;
} }
} }
export class KotlinParser extends BaseParser { export class KotlinParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '-help'); await KotlinParser.getOptions(compiler, '-help');
return compiler; return compiler;
} }
} }
export class ScalaParser extends BaseParser { export class ScalaParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '-help'); await ScalaParser.getOptions(compiler, '-help');
return compiler; return compiler;
} }
} }
export class VCParser extends BaseParser { export class VCParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '/help'); await VCParser.getOptions(compiler, '/help');
return compiler; return compiler;
} }
@@ -807,13 +819,13 @@ export class VCParser extends BaseParser {
const result = await compiler.execCompilerCached(compiler.compiler.exe, ['/help']); const result = await compiler.execCompilerCached(compiler.compiler.exe, ['/help']);
const lines = utils.splitLines(result.stdout); const lines = utils.splitLines(result.stdout);
return this.extractPossibleStdvers(lines); return VCParser.extractPossibleStdvers(lines);
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string) { static override async getOptions(compiler: BaseCompiler, helpArg: string) {
const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]); const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
const optionFinder = /^\s*(\/[\w#+,.:<=>[\]{|}-]*)\s*(.*)/i; const optionFinder = /^\s*(\/[\w#+,.:<=>[\]{|}-]*)\s*(.*)/i;
const options = result.code === 0 ? this.parseLines(result.stdout, optionFinder) : {}; const options = result.code === 0 ? VCParser.parseLines(result.stdout, optionFinder) : {};
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -821,22 +833,22 @@ export class VCParser extends BaseParser {
export class RustParser extends BaseParser { export class RustParser extends BaseParser {
static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) { static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
if (this.hasSupport(options, '--color')) { if (RustParser.hasSupport(options, '--color')) {
if (compiler.compiler.options) compiler.compiler.options += ' '; if (compiler.compiler.options) compiler.compiler.options += ' ';
compiler.compiler.options += '--color=always'; compiler.compiler.options += '--color=always';
} }
if (this.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true; if (RustParser.hasSupportStartsWith(options, '--target=')) compiler.compiler.supportsTargetIs = true;
if (this.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true; if (RustParser.hasSupportStartsWith(options, '--target ')) compiler.compiler.supportsTarget = true;
} }
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([ const results = await Promise.all([
this.getOptions(compiler, '--help'), RustParser.getOptions(compiler, '--help'),
this.getOptions(compiler, '-C help'), RustParser.getOptions(compiler, '-C help'),
this.getOptions(compiler, '--help -v'), RustParser.getOptions(compiler, '--help -v'),
]); ]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
await this.setCompilerSettingsFromOptions(compiler, options); await RustParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
@@ -845,7 +857,7 @@ export class RustParser extends BaseParser {
const re = /--edition ([\d|]*)/; const re = /--edition ([\d|]*)/;
const match = result.stdout.match(re); const match = result.stdout.match(re);
if (match && match[1]) { if (match?.[1]) {
return match[1].split('|'); return match[1].split('|');
} }
@@ -884,7 +896,7 @@ export class RustParser extends BaseParser {
previousOption = false; previousOption = false;
} }
return; return;
} else { }
if (match1) { if (match1) {
previousOption = match1[1].trim(); previousOption = match1[1].trim();
if (match1[2]) description = match1[2].trim(); if (match1[2]) description = match1[2].trim();
@@ -895,7 +907,6 @@ export class RustParser extends BaseParser {
previousOption = match3[1].trim(); previousOption = match3[1].trim();
if (match3[2]) description = match3[2].trim(); if (match3[2]) description = match3[2].trim();
} }
}
if (previousOption) { if (previousOption) {
options[previousOption] = { options[previousOption] = {
@@ -915,9 +926,9 @@ export class RustParser extends BaseParser {
if (helpArg === '-C help') { if (helpArg === '-C help') {
const optionFinder = /^\s*(-c\s*[\d=a-z-]*)\s--\s(.*)/i; const optionFinder = /^\s*(-c\s*[\d=a-z-]*)\s--\s(.*)/i;
options = this.parseLines(result.stdout + result.stderr, optionFinder); options = RustParser.parseLines(result.stdout + result.stderr, optionFinder);
} else { } else {
options = this.parseRustHelpLines(result.stdout + result.stderr); options = RustParser.parseRustHelpLines(result.stdout + result.stderr);
} }
} }
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
@@ -927,29 +938,29 @@ export class RustParser extends BaseParser {
export class ZksolcParser extends RustParser { export class ZksolcParser extends RustParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const options = await this.getOptions(compiler, '--help'); const options = await ZksolcParser.getOptions(compiler, '--help');
await this.setCompilerSettingsFromOptions(compiler, options); await ZksolcParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
} }
export class MrustcParser extends BaseParser { export class MrustcParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '--help'); await MrustcParser.getOptions(compiler, '--help');
return compiler; return compiler;
} }
} }
export class NimParser extends BaseParser { export class NimParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '-help'); await NimParser.getOptions(compiler, '-help');
return compiler; return compiler;
} }
} }
export class CrystalParser extends BaseParser { export class CrystalParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, 'build'); await CrystalParser.getOptions(compiler, 'build');
return compiler; return compiler;
} }
} }
@@ -957,7 +968,7 @@ export class CrystalParser extends BaseParser {
export class TableGenParser extends BaseParser { export class TableGenParser extends BaseParser {
static async getPossibleActions(compiler: BaseCompiler): Promise<CompilerOverrideOptions> { static async getPossibleActions(compiler: BaseCompiler): Promise<CompilerOverrideOptions> {
const result = await compiler.execCompilerCached(compiler.compiler.exe, ['--help']); const result = await compiler.execCompilerCached(compiler.compiler.exe, ['--help']);
return this.extractPossibleActions(utils.splitLines(result.stdout)); return TableGenParser.extractPossibleActions(utils.splitLines(result.stdout));
} }
static extractPossibleActions(lines: string[]): CompilerOverrideOptions { static extractPossibleActions(lines: string[]): CompilerOverrideOptions {
@@ -991,21 +1002,21 @@ export class TableGenParser extends BaseParser {
export class TypeScriptNativeParser extends BaseParser { export class TypeScriptNativeParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '--help'); await TypeScriptNativeParser.getOptions(compiler, '--help');
return compiler; return compiler;
} }
} }
export class TurboCParser extends BaseParser { export class TurboCParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, ''); await TurboCParser.getOptions(compiler, '');
return compiler; return compiler;
} }
} }
export class ToitParser extends BaseParser { export class ToitParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '-help'); await ToitParser.getOptions(compiler, '-help');
return compiler; return compiler;
} }
} }
@@ -1018,13 +1029,13 @@ export class JuliaParser extends BaseParser {
compiler.compilerWrapperPath, compiler.compilerWrapperPath,
helpArg, helpArg,
]); ]);
const options = result.code === 0 ? this.parseLines(result.stdout + result.stderr, optionFinder) : {}; const options = result.code === 0 ? JuliaParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
static override async parse(compiler: JuliaCompiler) { static override async parse(compiler: JuliaCompiler) {
await this.getOptions(compiler, '--help'); await JuliaParser.getOptions(compiler, '--help');
return compiler; return compiler;
} }
} }
@@ -1045,7 +1056,7 @@ export class Z88dkParser extends BaseParser {
export class WasmtimeParser extends BaseParser { export class WasmtimeParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '--help'); await WasmtimeParser.getOptions(compiler, '--help');
return compiler; return compiler;
} }
} }
@@ -1084,12 +1095,12 @@ export class FlangParser extends ClangParser {
} }
static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) { static override async setCompilerSettingsFromOptions(compiler: BaseCompiler, options: Record<string, Argument>) {
super.setCompilerSettingsFromOptions(compiler, options); ClangParser.setCompilerSettingsFromOptions(compiler, options);
// flang does not allow -emit-llvm to be used as it is with clang // flang does not allow -emit-llvm to be used as it is with clang
// as -Xflang -emit-llvm. Instead you just give -emit-llvm to flang // as -Xflang -emit-llvm. Instead you just give -emit-llvm to flang
// directly. // directly.
if (this.hasSupport(options, '-emit-llvm')) { if (FlangParser.hasSupport(options, '-emit-llvm')) {
compiler.compiler.supportsIrView = true; compiler.compiler.supportsIrView = true;
compiler.compiler.irArg = ['-emit-llvm']; compiler.compiler.irArg = ['-emit-llvm'];
compiler.compiler.minIrArgs = ['-emit-llvm']; compiler.compiler.minIrArgs = ['-emit-llvm'];
@@ -1111,7 +1122,7 @@ export class FlangParser extends ClangParser {
const re1 = /error: Only -std=([\w+]*) is allowed currently./; const re1 = /error: Only -std=([\w+]*) is allowed currently./;
for (const line of lines) { for (const line of lines) {
const match = line.match(re1); const match = line.match(re1);
if (match && match[1]) { if (match?.[1]) {
possible.push({ possible.push({
name: match[1], name: match[1],
value: match[1], value: match[1],
@@ -1124,9 +1135,9 @@ export class FlangParser extends ClangParser {
export class GHCParser extends GCCParser { export class GHCParser extends GCCParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([this.getOptions(compiler, '--help')]); const results = await Promise.all([GHCParser.getOptions(compiler, '--help')]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
await this.setCompilerSettingsFromOptions(compiler, options); await GHCParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
@@ -1134,7 +1145,7 @@ export class GHCParser extends GCCParser {
const optionFinder1 = /^ {4}(-[\w[\]]+)\s+(.*)/i; const optionFinder1 = /^ {4}(-[\w[\]]+)\s+(.*)/i;
const optionFinder2 = /^ {4}(-[\w[\]]+)/; const optionFinder2 = /^ {4}(-[\w[\]]+)/;
const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' ')); const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
const options = result.code === 0 ? this.parseLines(result.stdout, optionFinder1, optionFinder2) : {}; const options = result.code === 0 ? GHCParser.parseLines(result.stdout, optionFinder1, optionFinder2) : {};
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
@@ -1143,9 +1154,9 @@ export class GHCParser extends GCCParser {
export class SwiftParser extends ClangParser { export class SwiftParser extends ClangParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([this.getOptions(compiler, '--help')]); const results = await Promise.all([SwiftParser.getOptions(compiler, '--help')]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
this.setCompilerSettingsFromOptions(compiler, options); SwiftParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
@@ -1160,16 +1171,16 @@ export class SwiftParser extends ClangParser {
export class TendraParser extends GCCParser { export class TendraParser extends GCCParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([this.getOptions(compiler, '--help')]); const results = await Promise.all([TendraParser.getOptions(compiler, '--help')]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
await this.setCompilerSettingsFromOptions(compiler, options); await TendraParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string) { static override async getOptions(compiler: BaseCompiler, helpArg: string) {
const optionFinder = /^ *(-[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) : +(.*)/i; const optionFinder = /^ *(-[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) : +(.*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' ')); const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
const options = this.parseLines(result.stdout + result.stderr, optionFinder); const options = TendraParser.parseLines(result.stdout + result.stderr, optionFinder);
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -1190,10 +1201,13 @@ export class GolangParser extends GCCParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([ const results = await Promise.all([
this.getOptions(compiler, 'build -o ./output.s "-gcflags=-S --help" ' + this.getExampleFilepath()), GolangParser.getOptions(
compiler,
'build -o ./output.s "-gcflags=-S --help" ' + GolangParser.getExampleFilepath(),
),
]); ]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
await this.setCompilerSettingsFromOptions(compiler, options); await GolangParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
@@ -1204,7 +1218,7 @@ export class GolangParser extends GCCParser {
...compiler.getDefaultExecOptions(), ...compiler.getDefaultExecOptions(),
createAndUseTempDir: true, createAndUseTempDir: true,
}); });
const options = this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2); const options = GolangParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2);
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -1217,7 +1231,7 @@ export class GnuCobolParser extends GCCParser {
static override async getPossibleStdvers(compiler: BaseCompiler): Promise<CompilerOverrideOptions> { static override async getPossibleStdvers(compiler: BaseCompiler): Promise<CompilerOverrideOptions> {
const possible: CompilerOverrideOptions = []; const possible: CompilerOverrideOptions = [];
const options = await this.getOptionsStrict(compiler, this.getLanguageSpecificHelpFlags()); const options = await GnuCobolParser.getOptionsStrict(compiler, GnuCobolParser.getLanguageSpecificHelpFlags());
for (const opt in options) { for (const opt in options) {
if (opt.startsWith('-std=')) { if (opt.startsWith('-std=')) {
const vers = options[opt].description const vers = options[opt].description
@@ -1240,16 +1254,16 @@ export class GnuCobolParser extends GCCParser {
export class MadpascalParser extends GCCParser { export class MadpascalParser extends GCCParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
const results = await Promise.all([this.getOptions(compiler, '')]); const results = await Promise.all([MadpascalParser.getOptions(compiler, '')]);
const options = Object.assign({}, ...results); const options = Object.assign({}, ...results);
await this.setCompilerSettingsFromOptions(compiler, options); await MadpascalParser.setCompilerSettingsFromOptions(compiler, options);
return compiler; return compiler;
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string) { static override async getOptions(compiler: BaseCompiler, helpArg: string) {
const optionFinder = /^(-[\w:<>]*) *(.*)/i; const optionFinder = /^(-[\w:<>]*) *(.*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, []); const result = await compiler.execCompilerCached(compiler.compiler.exe, []);
const options = this.parseLines(result.stdout + result.stderr, optionFinder); const options = MadpascalParser.parseLines(result.stdout + result.stderr, optionFinder);
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }
@@ -1265,16 +1279,16 @@ export class MadpascalParser extends GCCParser {
export class GlslangParser extends BaseParser { export class GlslangParser extends BaseParser {
static override async parse(compiler: BaseCompiler) { static override async parse(compiler: BaseCompiler) {
await this.getOptions(compiler, '--help'); await GlslangParser.getOptions(compiler, '--help');
return compiler; return compiler;
} }
static override async getOptions(compiler: BaseCompiler, helpArg: string) { static override async getOptions(compiler: BaseCompiler, helpArg: string) {
const optionFinder1 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) +(.*)/i; const optionFinder1 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*) {2,}(.*)/i;
const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i; const optionFinder2 = /^ *(--?[\d#+,<=>[\]a-z|-]* ?[\d+,<=>[\]a-z|-]*)/i;
const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]); const result = await compiler.execCompilerCached(compiler.compiler.exe, [helpArg]);
// glslang will return a return code of 1 when calling --help (since it means nothing was compiled) // glslang will return a return code of 1 when calling --help (since it means nothing was compiled)
const options = this.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2); const options = GlslangParser.parseLines(result.stdout + result.stderr, optionFinder1, optionFinder2);
compiler.possibleArguments.populateOptions(options); compiler.possibleArguments.populateOptions(options);
return options; return options;
} }

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import fs from 'fs'; import fs from 'node:fs';
import path from 'path'; import path from 'node:path';
import _ from 'underscore'; import _ from 'underscore';
@@ -101,9 +101,11 @@ export class AssemblyCompiler extends BaseCompiler {
const output = result.stdout.map(line => line.text).join('\n'); const output = result.stdout.map(line => line.text).join('\n');
if (output.includes('ELF32') && output.includes('80386')) { if (output.includes('ELF32') && output.includes('80386')) {
return 'x86'; return 'x86';
} else if (output.includes('ELF64') && output.includes('X86-64')) { }
if (output.includes('ELF64') && output.includes('X86-64')) {
return 'x86_64'; return 'x86_64';
} else if (output.includes('Mach-O 64-bit x86-64')) { }
if (output.includes('Mach-O 64-bit x86-64')) {
// note: this is to support readelf=objdump on Mac // note: this is to support readelf=objdump on Mac
return 'x86_64'; return 'x86_64';
} }

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
@@ -50,7 +50,7 @@ export class AvrGcc6502Compiler extends BaseCompiler {
public override getOutputFilename(dirPath: string, outputFilebase: string, key?: any) { public override getOutputFilename(dirPath: string, outputFilebase: string, key?: any) {
let filename; let filename;
if (key && key.backendOptions && key.backendOptions.customOutputFilename) { if (key?.backendOptions?.customOutputFilename) {
filename = key.backendOptions.customOutputFilename; filename = key.backendOptions.customOutputFilename;
} else { } else {
filename = `${outputFilebase}.6502.asm`; filename = `${outputFilebase}.6502.asm`;
@@ -58,9 +58,8 @@ export class AvrGcc6502Compiler extends BaseCompiler {
if (dirPath) { if (dirPath) {
return path.join(dirPath, filename); return path.join(dirPath, filename);
} else {
return filename;
} }
return filename;
} }
protected override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string): string[] { protected override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string): string[] {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';

View File

@@ -1,4 +1,4 @@
import path from 'path'; import path from 'node:path';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -83,7 +83,7 @@ export class CarbonCompiler extends BaseCompiler {
// Hook to parse out the "result: 123" line at the end of the interpreted execution run. // Hook to parse out the "result: 123" line at the end of the interpreted execution run.
const re = /^result: (\d+)$/; const re = /^result: (\d+)$/;
const match = re.exec(this.lastLine(result.asm as ResultLine[])); const match = re.exec(this.lastLine(result.asm as ResultLine[]));
const code = match ? parseInt(match[1]) : -1; const code = match ? Number.parseInt(match[1]) : -1;
result.execResult = { result.execResult = {
stdout: result.stdout, stdout: result.stdout,
stderr: [], stderr: [],

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';
@@ -67,9 +67,8 @@ export class Cc65Compiler extends BaseCompiler {
override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string) { override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string) {
if (filters.binary) { if (filters.binary) {
return ['-g', '-o', this.filename(outputFilename)]; return ['-g', '-o', this.filename(outputFilename)];
} else {
return ['-g', '-S', '-c', '-o', this.filename(outputFilename)];
} }
return ['-g', '-S', '-c', '-o', this.filename(outputFilename)];
} }
override getCompilerEnvironmentVariables(compilerflags: string) { override getCompilerEnvironmentVariables(compilerflags: string) {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import {ParsedAsmResult} from '../../types/asmresult/asmresult.interfaces.js'; import {ParsedAsmResult} from '../../types/asmresult/asmresult.interfaces.js';
import {BypassCache, CacheKey, ExecutionOptions} from '../../types/compilation/compilation.interfaces.js'; import {BypassCache, CacheKey, ExecutionOptions} from '../../types/compilation/compilation.interfaces.js';
@@ -106,7 +106,7 @@ export class CerberusCompiler extends BaseCompiler {
didExecute: true, didExecute: true,
buildResult: compileResult, buildResult: compileResult,
}; };
} else { }
return { return {
stdout: compileResult.stdout, stdout: compileResult.stdout,
stderr: compileResult.stderr, stderr: compileResult.stderr,
@@ -116,7 +116,6 @@ export class CerberusCompiler extends BaseCompiler {
timedOut: false, timedOut: false,
}; };
} }
}
override async processAsm(result): Promise<ParsedAsmResult> { override async processAsm(result): Promise<ParsedAsmResult> {
// Handle "error" documents. // Handle "error" documents.

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import {BaseCompiler} from '../base-compiler.js'; import {BaseCompiler} from '../base-compiler.js';

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import fs from 'fs'; import fs from 'node:fs';
import path from 'path'; import path from 'node:path';
import _ from 'underscore'; import _ from 'underscore';
@@ -298,9 +298,8 @@ export class ClangCompiler extends BaseCompiler {
} }
return fs.readFileSync(llvmirFile, 'utf8'); return fs.readFileSync(llvmirFile, 'utf8');
} else {
return '<error: no llvm-dis found to disassemble bitcode>';
} }
return '<error: no llvm-dis found to disassemble bitcode>';
} }
async processDeviceAssembly(deviceName: string, deviceAsm: string, filters, compilationInfo: CompilationInfo) { async processDeviceAssembly(deviceName: string, deviceAsm: string, filters, compilationInfo: CompilationInfo) {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import {LLVMIrBackendOptions} from '../../types/compilation/ir.interfaces.js'; import {LLVMIrBackendOptions} from '../../types/compilation/ir.interfaces.js';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
@@ -39,9 +39,8 @@ export class CleanCompiler extends BaseCompiler {
override optionsForFilter(filters: ParseFiltersAndOutputOptions) { override optionsForFilter(filters: ParseFiltersAndOutputOptions) {
if (filters.binary) { if (filters.binary) {
return []; return [];
} else {
return ['-S'];
} }
return ['-S'];
} }
override getOutputFilename(dirPath: string) { override getOutputFilename(dirPath: string) {
@@ -80,11 +79,8 @@ export class CleanCompiler extends BaseCompiler {
if (matches) { if (matches) {
if (matches[3] === '') { if (matches[3] === '') {
return '<source>:' + matches[1] + ',' + matches[2] + ': error: ' + matches[4]; return '<source>:' + matches[1] + ',' + matches[2] + ': error: ' + matches[4];
} else {
return (
'<source>:' + matches[1] + ',' + matches[2] + ': error: (' + matches[3] + ') ' + matches[4]
);
} }
return '<source>:' + matches[1] + ',' + matches[2] + ': error: (' + matches[3] + ') ' + matches[4];
} }
return line; return line;

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import {BaseCompiler} from '../base-compiler.js'; import {BaseCompiler} from '../base-compiler.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import semverParser from 'semver'; import semverParser from 'semver';
import _ from 'underscore'; import _ from 'underscore';
@@ -80,17 +80,15 @@ export class CrystalCompiler extends BaseCompiler {
override getIrOutputFilename(inputFilename: string, filters: ParseFiltersAndOutputOptions): string { override getIrOutputFilename(inputFilename: string, filters: ParseFiltersAndOutputOptions): string {
if (this.usesNewEmitFilenames()) { if (this.usesNewEmitFilenames()) {
return this.getOutputFilename(path.dirname(inputFilename), this.outputFilebase).replace('.s', '.ll'); return this.getOutputFilename(path.dirname(inputFilename), this.outputFilebase).replace('.s', '.ll');
} else {
return super.getIrOutputFilename(inputFilename, filters);
} }
return super.getIrOutputFilename(inputFilename, filters);
} }
override getOutputFilename(dirPath: string, outputFilebase: string) { override getOutputFilename(dirPath: string, outputFilebase: string) {
if (this.usesNewEmitFilenames()) { if (this.usesNewEmitFilenames()) {
return path.join(dirPath, `${outputFilebase}.s`); return path.join(dirPath, `${outputFilebase}.s`);
} else {
return path.join(dirPath, `${path.basename(this.compileFilename, this.lang.extensions[0])}.s`);
} }
return path.join(dirPath, `${path.basename(this.compileFilename, this.lang.extensions[0])}.s`);
} }
override getExecutableFilename(dirPath: string, outputFilebase: string) { override getExecutableFilename(dirPath: string, outputFilebase: string) {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import Semver from 'semver'; import Semver from 'semver';
@@ -80,9 +80,8 @@ export class DartCompiler extends BaseCompiler {
const dartCompileIntroduction = '2.10.0'; const dartCompileIntroduction = '2.10.0';
if (Semver.lt(utils.asSafeVer(this.compiler.semver), dartCompileIntroduction, true)) { if (Semver.lt(utils.asSafeVer(this.compiler.semver), dartCompileIntroduction, true)) {
return ['-k', 'aot', '-o', this.filename(outputFilename)]; return ['-k', 'aot', '-o', this.filename(outputFilename)];
} else {
return ['compile', 'aot-snapshot', '-o', this.filename(outputFilename)];
} }
return ['compile', 'aot-snapshot', '-o', this.filename(outputFilename)];
} }
override getArgumentParserClass() { override getArgumentParserClass() {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';
@@ -106,7 +106,7 @@ export class Dex2OatCompiler extends BaseCompiler {
this.methodRegex = /^\s+\d+:\s+(.*)\s+\(dex_method_idx=\d+\)$/; this.methodRegex = /^\s+\d+:\s+(.*)\s+\(dex_method_idx=\d+\)$/;
this.methodSizeRegex = /^\s+CODE:\s+\(code_offset=(0x\w+)\s+size=(\d+).*$/; this.methodSizeRegex = /^\s+CODE:\s+\(code_offset=(0x\w+)\s+size=(\d+).*$/;
this.insnRegex = /^\s+(0x\w+):\s+\w+\s+(.*)$/; this.insnRegex = /^\s+(0x\w+):\s+\w+\s+(.*)$/;
// eslint-disable-next-line unicorn/better-regex
this.stackMapRegex = /^\s+(StackMap\[\d+\])\s+\((.*)\).*$/; this.stackMapRegex = /^\s+(StackMap\[\d+\])\s+\((.*)\).*$/;
// Similar to insnRegex above, but this applies after oatdump output has // Similar to insnRegex above, but this applies after oatdump output has
@@ -253,7 +253,7 @@ export class Dex2OatCompiler extends BaseCompiler {
let match; let match;
if (this.versionPrefixRegex.test(this.compiler.id)) { if (this.versionPrefixRegex.test(this.compiler.id)) {
match = this.compiler.id.match(this.versionPrefixRegex); match = this.compiler.id.match(this.versionPrefixRegex);
versionPrefix = parseInt(match![2]); versionPrefix = Number.parseInt(match![2]);
} else if (this.latestVersionRegex.test(this.compiler.id)) { } else if (this.latestVersionRegex.test(this.compiler.id)) {
isLatest = true; isLatest = true;
} }
@@ -582,7 +582,7 @@ export class Dex2OatCompiler extends BaseCompiler {
} }
override async processAsm(result, filters: ParseFiltersAndOutputOptions) { override async processAsm(result, filters: ParseFiltersAndOutputOptions) {
let asm: string = ''; let asm = '';
if (typeof result.asm === 'string') { if (typeof result.asm === 'string') {
const asmLines = utils.splitLines(result.asm); const asmLines = utils.splitLines(result.asm);
@@ -590,15 +590,13 @@ export class Dex2OatCompiler extends BaseCompiler {
return { return {
asm: [{text: asmLines[0], source: null}], asm: [{text: asmLines[0], source: null}],
}; };
} else { }
return { return {
asm: [{text: JSON.stringify(asmLines), source: null}], asm: [{text: JSON.stringify(asmLines), source: null}],
}; };
} }
} else {
// result.asm is an array, but we only expect it to have one value. // result.asm is an array, but we only expect it to have one value.
asm = result.asm[0].text; asm = result.asm[0].text;
}
const segments: ParsedAsmResultLine[] = []; const segments: ParsedAsmResultLine[] = [];
if (this.fullOutput || !filters.directives) { if (this.fullOutput || !filters.directives) {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
@@ -121,7 +121,7 @@ export class DosboxCompiler extends BaseCompiler {
result = await (this.env.enqueue(async () => result = await (this.env.enqueue(async () =>
this.exec(compiler, args, options), this.exec(compiler, args, options),
) as Promise<UnprocessedExecResult>); ) as Promise<UnprocessedExecResult>);
if (result && result.okToCache) { if (result?.okToCache) {
this.env this.env
.compilerCachePut(key as any, result, undefined) .compilerCachePut(key as any, result, undefined)
.then(() => { .then(() => {
@@ -170,9 +170,8 @@ export class DosboxCompiler extends BaseCompiler {
options.map(option => { options.map(option => {
if (option === inputFilename) { if (option === inputFilename) {
return path.basename(option); return path.basename(option);
} else {
return option;
} }
return option;
}), }),
inputFilename, inputFilename,
execOptions, execOptions,

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
@@ -771,9 +771,8 @@ do()
if (fs.existsSync(versionFilePath)) { if (fs.existsSync(versionFilePath)) {
const versionString = await fs.readFile(versionFilePath); const versionString = await fs.readFile(versionFilePath);
return versionString.toString(); return versionString.toString();
} else {
return '<unknown version>';
} }
return '<unknown version>';
} }
async runCorerunForDisasm( async runCorerunForDisasm(
@@ -833,7 +832,6 @@ do()
const targetFramework = targetFrameworkDirs[0]; const targetFramework = targetFrameworkDirs[0];
const ilspyPath = path.join(ilspyToolsDir, targetFramework, 'any', 'ilspycmd.dll'); const ilspyPath = path.join(ilspyToolsDir, targetFramework, 'any', 'ilspycmd.dll');
// prettier-ignore
const ilspyOptions = [ilspyPath, dllPath, '--disable-updatecheck', '-r', this.clrBuildDir].concat(options); const ilspyOptions = [ilspyPath, dllPath, '--disable-updatecheck', '-r', this.clrBuildDir].concat(options);
const compilerPath = useDotNetHost ? this.compiler.exe : this.corerunPath; const compilerPath = useDotNetHost ? this.compiler.exe : this.corerunPath;
const compilerExecResult = await this.exec(compilerPath, ilspyOptions, execOptions); const compilerExecResult = await this.exec(compilerPath, ilspyOptions, execOptions);
@@ -850,7 +848,6 @@ do()
} }
async runIlDasm(execOptions: ExecutionOptions, dllPath: string, options: string[], outputPath: string) { async runIlDasm(execOptions: ExecutionOptions, dllPath: string, options: string[], outputPath: string) {
// prettier-ignore
const ildasmOptions = [dllPath, '-utf8'].concat(options); const ildasmOptions = [dllPath, '-utf8'].concat(options);
const compilerExecResult = await this.exec(this.ildasmPath, ildasmOptions, execOptions); const compilerExecResult = await this.exec(this.ildasmPath, ildasmOptions, execOptions);
@@ -876,12 +873,14 @@ do()
options: string[], options: string[],
outputPath: string, outputPath: string,
) { ) {
// prettier-ignore
const crossgen2Options = [ const crossgen2Options = [
'-r', path.join(bclPath, '/'), '-r',
'-r', this.disassemblyLoaderPath, path.join(bclPath, '/'),
'-r',
this.disassemblyLoaderPath,
dllPath, dllPath,
'-o', `${AssemblyName}.r2r.dll`, '-o',
`${AssemblyName}.r2r.dll`,
].concat(options); ].concat(options);
const corelibPath = path.join(this.clrBuildDir, 'corelib', arch, 'System.Private.CoreLib.dll'); const corelibPath = path.join(this.clrBuildDir, 'corelib', arch, 'System.Private.CoreLib.dll');
@@ -920,13 +919,16 @@ do()
outputPath: string, outputPath: string,
buildToBinary: boolean, buildToBinary: boolean,
) { ) {
// prettier-ignore
const ilcOptions = [ const ilcOptions = [
dllPath, dllPath,
'-o', `${AssemblyName}.obj`, '-o',
'-r', this.disassemblyLoaderPath, `${AssemblyName}.obj`,
'-r', path.join(this.clrBuildDir, 'aotsdk', '*.dll'), '-r',
'-r', path.join(this.clrBuildDir, '*.dll'), this.disassemblyLoaderPath,
'-r',
path.join(this.clrBuildDir, 'aotsdk', '*.dll'),
'-r',
path.join(this.clrBuildDir, '*.dll'),
'--initassembly:System.Private.CoreLib', '--initassembly:System.Private.CoreLib',
'--initassembly:System.Private.StackTraceMetadata', '--initassembly:System.Private.StackTraceMetadata',
'--initassembly:System.Private.TypeLoader', '--initassembly:System.Private.TypeLoader',

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
import {BaseCompiler} from '../base-compiler.js'; import {BaseCompiler} from '../base-compiler.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
import {BaseCompiler} from '../base-compiler.js'; import {BaseCompiler} from '../base-compiler.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
import {BaseCompiler} from '../base-compiler.js'; import {BaseCompiler} from '../base-compiler.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
import {BaseCompiler} from '../base-compiler.js'; import {BaseCompiler} from '../base-compiler.js';

View File

@@ -33,6 +33,7 @@ import {
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
import {SelectedLibraryVersion} from '../../types/libraries/libraries.interfaces.js'; import {SelectedLibraryVersion} from '../../types/libraries/libraries.interfaces.js';
import {BaseCompiler} from '../base-compiler.js';
import {CompilerArguments} from '../compiler-arguments.js'; import {CompilerArguments} from '../compiler-arguments.js';
export class FakeCompiler { export class FakeCompiler {
@@ -59,9 +60,8 @@ export class FakeCompiler {
this.possibleArguments = new CompilerArguments('fake-for-test'); this.possibleArguments = new CompilerArguments('fake-for-test');
} }
initialise(mtime: Date, clientOptions: any, isPrediscovered: boolean) { initialise(mtime: Date, clientOptions: any, isPrediscovered: boolean): Promise<BaseCompiler | null> {
throw new Error('Method not implemented.'); throw new Error('Method not implemented.');
return Promise.resolve(null);
} }
getInfo() { getInfo() {

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import * as fs from 'fs'; import * as fs from 'node:fs';
import path from 'path'; import path from 'node:path';
import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import {SelectedLibraryVersion} from '../../types/libraries/libraries.interfaces.js'; import {SelectedLibraryVersion} from '../../types/libraries/libraries.interfaces.js';

View File

@@ -21,7 +21,7 @@
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import {BaseCompiler} from '../base-compiler.js'; import {BaseCompiler} from '../base-compiler.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ExecutionOptions} from '../../types/compilation/compilation.interfaces.js'; import type {ExecutionOptions} from '../../types/compilation/compilation.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
@@ -101,7 +101,7 @@ export class GnuCobolCompiler extends BaseCompiler {
override getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string { override getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string {
let filename; let filename;
if (key && key.backendOptions && key.backendOptions.customOutputFilename) { if (key?.backendOptions?.customOutputFilename) {
filename = key.backendOptions.customOutputFilename; filename = key.backendOptions.customOutputFilename;
} else if (key.filters.binary) { } else if (key.filters.binary) {
// note: interesting fact about gnucobol, if you name the outputfile output.s it will always output assembly // note: interesting fact about gnucobol, if you name the outputfile output.s it will always output assembly
@@ -114,9 +114,8 @@ export class GnuCobolCompiler extends BaseCompiler {
if (dirPath) { if (dirPath) {
return path.join(dirPath, filename); return path.join(dirPath, filename);
} else {
return filename;
} }
return filename;
} }
override getExecutableFilename(dirPath: string, outputFilebase: string) { override getExecutableFilename(dirPath: string, outputFilebase: string) {

View File

@@ -243,11 +243,10 @@ export class GolangCompiler extends BaseCompiler {
if (filters.binary) { if (filters.binary) {
return ['build', '-o', outputFilename, '-gcflags=' + unwrap(userOptions).join(' ')]; return ['build', '-o', outputFilename, '-gcflags=' + unwrap(userOptions).join(' ')];
} else { }
// Add userOptions to -gcflags to preserve previous behavior. // Add userOptions to -gcflags to preserve previous behavior.
return ['build', '-o', outputFilename, '-gcflags=-S ' + unwrap(userOptions).join(' ')]; return ['build', '-o', outputFilename, '-gcflags=-S ' + unwrap(userOptions).join(' ')];
} }
}
override filterUserOptions(userOptions: string[]) { override filterUserOptions(userOptions: string[]) {
if (this.compiler.id === '6g141') { if (this.compiler.id === '6g141') {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -65,7 +65,6 @@ export class HLSLCompiler extends BaseCompiler {
return version.includes('libdxcompiler'); return version.includes('libdxcompiler');
} }
/* eslint-disable no-unused-vars */
override optionsForFilter( override optionsForFilter(
filters: ParseFiltersAndOutputOptions, filters: ParseFiltersAndOutputOptions,
outputFilename: string, outputFilename: string,

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type { import type {
CacheKey, CacheKey,
@@ -96,7 +96,7 @@ export class HookCompiler extends BaseCompiler {
} }
const match = text.match(instructionRegex); const match = text.match(instructionRegex);
if (match) { if (match) {
const lineNo = parseInt(match[1]); const lineNo = Number.parseInt(match[1]);
item.source = {line: lineNo, file: null}; item.source = {line: lineNo, file: null};
lastLineNo = lineNo; lastLineNo = lineNo;
continue; continue;

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import Semver from 'semver'; import Semver from 'semver';
@@ -199,7 +199,7 @@ export class JavaCompiler extends BaseCompiler implements SimpleOutputFilenameCo
didExecute: true, didExecute: true,
buildResult: compileResult, buildResult: compileResult,
}; };
} else { }
return { return {
stdout: compileResult.stdout, stdout: compileResult.stdout,
stderr: compileResult.stderr, stderr: compileResult.stderr,
@@ -209,7 +209,6 @@ export class JavaCompiler extends BaseCompiler implements SimpleOutputFilenameCo
timedOut: false, timedOut: false,
}; };
} }
}
async getMainClassName(dirPath: string) { async getMainClassName(dirPath: string) {
const maxSize = this.env.ceProps('max-asm-size', 64 * 1024 * 1024); const maxSize = this.env.ceProps('max-asm-size', 64 * 1024 * 1024);
@@ -448,9 +447,8 @@ export class JavaCompiler extends BaseCompiler implements SimpleOutputFilenameCo
firstSourceLine: methods.reduce((prev, method) => { firstSourceLine: methods.reduce((prev, method) => {
if (method.startLine) { if (method.startLine) {
return prev === -1 ? method.startLine : Math.min(prev, method.startLine); return prev === -1 ? method.startLine : Math.min(prev, method.startLine);
} else {
return prev;
} }
return prev;
}, -1), }, -1),
methods: methods, methods: methods,
textsBeforeMethod, textsBeforeMethod,

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import _ from 'underscore'; import _ from 'underscore';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import semverParser from 'semver'; import semverParser from 'semver';
@@ -70,13 +70,13 @@ export class LDCCompiler extends BaseCompiler {
} }
override getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string { override getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string {
if (key && key.filters && key.filters.binary) { if (key?.filters?.binary) {
return path.join(dirPath, 'output'); return path.join(dirPath, 'output');
} else if (key && key.filters && key.filters.binaryObject) {
return path.join(dirPath, 'output.o');
} else {
return path.join(dirPath, 'output.s');
} }
if (key?.filters?.binaryObject) {
return path.join(dirPath, 'output.o');
}
return path.join(dirPath, 'output.s');
} }
override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string) { override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string) {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {CompilationResult, FiledataPair} from '../../types/compilation/compilation.interfaces.js'; import type {CompilationResult, FiledataPair} from '../../types/compilation/compilation.interfaces.js';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
@@ -57,27 +57,24 @@ export class MadPascalCompiler extends BaseCompiler {
const filename = `${outputFilebase}.a65`; const filename = `${outputFilebase}.a65`;
if (dirPath) { if (dirPath) {
return path.join(dirPath, filename); return path.join(dirPath, filename);
} else {
return filename;
} }
return filename;
} }
getAssemblerOutputFilename(dirPath: string, outputFilebase: string) { getAssemblerOutputFilename(dirPath: string, outputFilebase: string) {
const filename = `${outputFilebase}.obx`; const filename = `${outputFilebase}.obx`;
if (dirPath) { if (dirPath) {
return path.join(dirPath, filename); return path.join(dirPath, filename);
} else {
return filename;
} }
return filename;
} }
getListingFilename(dirPath: string, outputFilebase: string) { getListingFilename(dirPath: string, outputFilebase: string) {
const filename = `${outputFilebase}.lst`; const filename = `${outputFilebase}.lst`;
if (dirPath) { if (dirPath) {
return path.join(dirPath, filename); return path.join(dirPath, filename);
} else {
return filename;
} }
return filename;
} }
override getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string { override getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';
@@ -71,14 +71,14 @@ export class NimCompiler extends BaseCompiler {
} }
expectedExtensionFromCommand(command: string) { expectedExtensionFromCommand(command: string) {
const isC = ['compile', 'compileToC', 'c'], const isC = ['compile', 'compileToC', 'c'];
isCpp = ['compileToCpp', 'cpp', 'cc'], const isCpp = ['compileToCpp', 'cpp', 'cc'];
isObjC = ['compileToOC', 'objc']; const isObjC = ['compileToOC', 'objc'];
if (isC.includes(command)) return '.c.o'; if (isC.includes(command)) return '.c.o';
else if (isCpp.includes(command)) return '.cpp.o'; if (isCpp.includes(command)) return '.cpp.o';
else if (isObjC.includes(command)) return '.m.o'; if (isObjC.includes(command)) return '.m.o';
else return null; return null;
} }
getCacheFile(options: string[], inputFilename: string, cacheDir: string) { getCacheFile(options: string[], inputFilename: string, cacheDir: string) {

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import * as fs from 'fs/promises'; import * as fs from 'node:fs/promises';
import Path from 'path'; import Path from 'node:path';
import Semver from 'semver'; import Semver from 'semver';
import _ from 'underscore'; import _ from 'underscore';
@@ -121,11 +121,10 @@ export class NvccCompiler extends BaseCompiler {
} }
if (postProcess.length > 0) { if (postProcess.length > 0) {
return await this.execPostProcess(result, postProcess, outputFilename, maxSize); return await this.execPostProcess(result, postProcess, outputFilename, maxSize);
} else { }
const contents = await fs.readFile(outputFilename, {encoding: 'utf8'}); const contents = await fs.readFile(outputFilename, {encoding: 'utf8'});
result.asm = contents.toString(); result.asm = contents.toString();
return result; return result;
}
})() })()
).then(asm => { ).then(asm => {
result.asm = typeof asm === 'string' ? asm : asm.asm; result.asm = typeof asm === 'string' ? asm : asm.asm;

View File

@@ -22,8 +22,8 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import * as fs from 'fs/promises'; import * as fs from 'node:fs/promises';
import path from 'path'; import path from 'node:path';
import {CompilationInfo, CompilationResult} from '../../types/compilation/compilation.interfaces.js'; import {CompilationInfo, CompilationResult} from '../../types/compilation/compilation.interfaces.js';
import {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import Path from 'path'; import Path from 'node:path';
import Semver from 'semver'; import Semver from 'semver';

View File

@@ -1,4 +1,4 @@
import path from 'path'; import path from 'node:path';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
import type {CompilerOutputOptions, ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import type {CompilerOutputOptions, ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js';
@@ -167,7 +167,7 @@ export class OdinCompiler extends BaseCompiler {
for (const line of asmLines) { for (const line of asmLines) {
const match = line.match(fileFind); const match = line.match(fileFind);
if (match) { if (match) {
const lineNum = parseInt(match[1]); const lineNum = Number.parseInt(match[1]);
if (match[4] && !line.includes('.cv_file')) { if (match[4] && !line.includes('.cv_file')) {
// Clang-style file directive '.file X "dir" "filename"' // Clang-style file directive '.file X "dir" "filename"'
if (match[4].startsWith('/')) { if (match[4].startsWith('/')) {

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
@@ -86,9 +86,8 @@ export class PascalWinCompiler extends BaseCompiler {
override filename(fn: string) { override filename(fn: string) {
if (process.platform === 'linux' || process.platform === 'darwin') { if (process.platform === 'linux' || process.platform === 'darwin') {
return 'Z:' + fn; return 'Z:' + fn;
} else {
return super.filename(fn);
} }
return super.filename(fn);
} }
override async objdump(outputFilename: string, result, maxSize: number, intelAsm: boolean) { override async objdump(outputFilename: string, result, maxSize: number, intelAsm: boolean) {
@@ -114,11 +113,11 @@ export class PascalWinCompiler extends BaseCompiler {
} }
async saveDummyProjectFile(filename: string, unitName: string, unitPath: string) { async saveDummyProjectFile(filename: string, unitName: string, unitPath: string) {
// biome-ignore format: keep as-is for readability
await fs.writeFile( await fs.writeFile(
filename, filename,
// prettier-ignore
'program prog;\n' + 'program prog;\n' +
'uses ' + unitName + ' in \'' + unitPath + '\';\n' + 'uses ' + unitName + " in '" + unitPath + "';\n" +
'begin\n' + 'begin\n' +
'end.\n', 'end.\n',
); );

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import _ from 'underscore'; import _ from 'underscore';
@@ -92,8 +92,7 @@ export class FPCCompiler extends BaseCompiler {
for (let j = 0; j < result.asm.length; ++j) { for (let j = 0; j < result.asm.length; ++j) {
result.asm[j].text = this.demangler.demangleIfNeeded(result.asm[j].text); result.asm[j].text = this.demangler.demangleIfNeeded(result.asm[j].text);
if ( if (
result.asm[j].source && result.asm[j].source?.file &&
result.asm[j].source.file &&
!result.asm[j].source.mainsource && !result.asm[j].source.mainsource &&
this.isTheSameFileProbably(result.inputFilename, result.asm[j].source.file) this.isTheSameFileProbably(result.inputFilename, result.asm[j].source.file)
) { ) {
@@ -178,9 +177,8 @@ export class FPCCompiler extends BaseCompiler {
if (endOfProc === -1) { if (endOfProc === -1) {
newSource = newSource + input.substring(furtherLookback) + '\n'; newSource = newSource + input.substring(furtherLookback) + '\n';
break; break;
} else {
newSource = newSource + input.substring(furtherLookback, endOfProc + 3) + '\n';
} }
newSource = newSource + input.substring(furtherLookback, endOfProc + 3) + '\n';
foundSourceAt = input.indexOf('/app/', endOfProc + 3); foundSourceAt = input.indexOf('/app/', endOfProc + 3);
} }
@@ -193,11 +191,11 @@ export class FPCCompiler extends BaseCompiler {
} }
async saveDummyProjectFile(filename: string, unitName: string, unitPath: string) { async saveDummyProjectFile(filename: string, unitName: string, unitPath: string) {
// biome-ignore format: keep as-is for readability
await fs.writeFile( await fs.writeFile(
filename, filename,
// prettier-ignore
'program prog;\n' + 'program prog;\n' +
'uses ' + unitName + ' in \'' + unitPath + '\';\n' + 'uses ' + unitName + " in '" + unitPath + "';\n" +
'begin\n' + 'begin\n' +
'end.\n', 'end.\n',
); );
@@ -298,14 +296,13 @@ export class FPCCompiler extends BaseCompiler {
if (Number.isNaN(Number(valueInBrackets))) { if (Number.isNaN(Number(valueInBrackets))) {
return ` .file ${currentFileId} "${valueInBrackets}"`; return ` .file ${currentFileId} "${valueInBrackets}"`;
} else { }
return ` .loc ${currentFileId} ${valueInBrackets} 0`; return ` .loc ${currentFileId} ${valueInBrackets} 0`;
} }
} else if (asm.startsWith('.Le')) { if (asm.startsWith('.Le')) {
return ' .cfi_endproc'; return ' .cfi_endproc';
} else {
return false;
} }
return false;
} }
tryGetFilenumber(asm: string, files: Record<string, number>) { tryGetFilenumber(asm: string, files: Record<string, number>) {
@@ -324,7 +321,7 @@ export class FPCCompiler extends BaseCompiler {
if (Number.isNaN(Number(valueInBrackets))) { if (Number.isNaN(Number(valueInBrackets))) {
if (!files[valueInBrackets]) { if (!files[valueInBrackets]) {
let maxFileId = _.max(files); let maxFileId = _.max(files);
if (maxFileId === -Infinity) { if (maxFileId === Number.NEGATIVE_INFINITY) {
maxFileId = 0; maxFileId = 0;
} }

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import {LLVMIrBackendOptions} from '../../types/compilation/ir.interfaces.js'; import {LLVMIrBackendOptions} from '../../types/compilation/ir.interfaces.js';

View File

@@ -22,7 +22,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
import path from 'path'; import path from 'node:path';
import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import type {CompilationResult, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js';
import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js';
@@ -49,7 +49,7 @@ export class PtxAssembler extends BaseCompiler {
parsePtxOutput(lines: string, inputFilename: string, pathPrefix: string) { parsePtxOutput(lines: string, inputFilename: string, pathPrefix: string) {
const re = /^ptxas\s*<source>, line (\d+);(.*)/; const re = /^ptxas\s*<source>, line (\d+);(.*)/;
const result: ResultLine[] = []; const result: ResultLine[] = [];
utils.eachLine(lines, function (line) { utils.eachLine(lines, line => {
if (pathPrefix) line = line.replace(pathPrefix, ''); if (pathPrefix) line = line.replace(pathPrefix, '');
if (inputFilename) { if (inputFilename) {
line = line.split(inputFilename).join('<source>'); line = line.split(inputFilename).join('<source>');
@@ -66,7 +66,7 @@ export class PtxAssembler extends BaseCompiler {
lineObj.text = `<source>:${match[1]} ${match[2].trim()}`; lineObj.text = `<source>:${match[1]} ${match[2].trim()}`;
lineObj.tag = { lineObj.tag = {
severity: 0, severity: 0,
line: parseInt(match[1]), line: Number.parseInt(match[1]),
column: 0, column: 0,
text: match[2].trim(), text: match[2].trim(),
}; };

View File

@@ -60,7 +60,7 @@ export class PythonCompiler extends BaseCompiler {
const match = line.match(lineRe); const match = line.match(lineRe);
if (match) { if (match) {
const lineno = parseInt(match[1]); const lineno = Number.parseInt(match[1]);
sourceLoc = {line: lineno, file: null}; sourceLoc = {line: lineno, file: null};
lastLineNo = lineno; lastLineNo = lineno;
} else if (line) { } else if (line) {

Some files were not shown because too many files have changed in this diff Show More