-
{name}
-
- {children}
+const ConfigElement: React.FC
= ({ name, isDefault, aside, children }) => {
+ const actuallyDefault = isDefault ?? true;
+ const defaultStyle = actuallyDefault ? styles.name : styles.notDefault;
+
+ return (
+
- {aside}
-
-);
+ {aside}
+
+ );
+};
diff --git a/ui/frontend/reducers/configuration.ts b/ui/frontend/reducers/configuration.ts
index 37752074..23fb9b4c 100644
--- a/ui/frontend/reducers/configuration.ts
+++ b/ui/frontend/reducers/configuration.ts
@@ -1,6 +1,7 @@
import { PayloadAction, createSlice } from '@reduxjs/toolkit';
import {
+ AliasingModel,
AssemblyFlavor,
Backtrace,
Channel,
@@ -36,6 +37,7 @@ interface State {
mode: Mode;
edition: Edition;
backtrace: Backtrace;
+ aliasingModel: AliasingModel;
}
const initialState: State = {
@@ -58,6 +60,7 @@ const initialState: State = {
mode: Mode.Debug,
edition: Edition.Rust2024,
backtrace: Backtrace.Disabled,
+ aliasingModel: AliasingModel.Stacked,
};
const slice = createSlice({
@@ -76,6 +79,10 @@ const slice = createSlice({
state.backtrace = action.payload;
},
+ changeAliasingModel: (state, action: PayloadAction
) => {
+ state.aliasingModel = action.payload;
+ },
+
changeChannel: (state, action: PayloadAction) => {
state.channel = action.payload;
},
@@ -146,6 +153,7 @@ export const {
changeAceTheme,
changeAssemblyFlavor,
changeBacktrace,
+ changeAliasingModel,
changeChannel,
changeDemangleAssembly,
changeEdition,
diff --git a/ui/frontend/reducers/output/miri.ts b/ui/frontend/reducers/output/miri.ts
index 0c52f12d..0ba94e84 100644
--- a/ui/frontend/reducers/output/miri.ts
+++ b/ui/frontend/reducers/output/miri.ts
@@ -4,6 +4,7 @@ import * as z from 'zod';
import { jsonPost, routes } from '../../api';
import { State as RootState } from '../../reducers';
import { miriRequestSelector } from '../../selectors';
+import { AliasingModel } from '../../types';
const sliceName = 'output/miri';
@@ -21,6 +22,7 @@ interface State {
interface MiriRequestBody {
code: string;
edition: string;
+ aliasingModel: AliasingModel;
}
const MiriResponseBody = z.object({
diff --git a/ui/frontend/selectors/index.ts b/ui/frontend/selectors/index.ts
index 09805f1a..69b93912 100644
--- a/ui/frontend/selectors/index.ts
+++ b/ui/frontend/selectors/index.ts
@@ -6,6 +6,7 @@ import {
Backtrace,
Channel,
Edition,
+ AliasingModel,
Focus,
Orientation,
PrimaryActionAuto,
@@ -147,6 +148,7 @@ export const rustfmtVersionDetailsText = createSelector(getRustfmt, versionDetai
export const miriVersionDetailsText = createSelector(getMiri, versionDetails);
const editionSelector = (state: State) => state.configuration.edition;
+export const aliasingModelSelector = (state: State) => state.configuration.aliasingModel;
export const isNightlyChannel = createSelector(
channelSelector,
@@ -172,18 +174,23 @@ export const getChannelLabel = createSelector(channelSelector, (channel) => `${c
export const isEditionDefault = createSelector(
editionSelector,
- edition => edition == Edition.Rust2024,
+ edition => edition === Edition.Rust2024,
);
-export const getBacktraceSet = (state: State) => (
- state.configuration.backtrace !== Backtrace.Disabled
+export const isBacktraceDefault = (state: State) => (
+ state.configuration.backtrace === Backtrace.Disabled
+);
+
+export const getBacktraceSet = createSelector(isBacktraceDefault, (b) => !b);
+
+export const isAliasingModelDefault = createSelector(
+ aliasingModelSelector,
+ aliasingModel => aliasingModel == AliasingModel.Stacked,
);
export const getAdvancedOptionsSet = createSelector(
- isEditionDefault, getBacktraceSet,
- (editionDefault, backtraceSet) => (
- !editionDefault || backtraceSet
- ),
+ isEditionDefault, isBacktraceDefault, isAliasingModelDefault,
+ (...areDefault) => !areDefault.every(n => n),
);
export const hasProperties = (obj: object) => Object.values(obj).some(val => !!val);
@@ -391,7 +398,8 @@ export const formatRequestSelector = createSelector(
export const miriRequestSelector = createSelector(
editionSelector,
codeSelector,
- (edition, code) => ({ edition, code }),
+ aliasingModelSelector,
+ (edition, code, aliasingModel) => ({ edition, code, aliasingModel }),
);
export const macroExpansionRequestSelector = createSelector(
diff --git a/ui/frontend/types.ts b/ui/frontend/types.ts
index 4b49511c..eb06e7ab 100644
--- a/ui/frontend/types.ts
+++ b/ui/frontend/types.ts
@@ -150,6 +150,11 @@ export enum Backtrace {
Enabled = 'enabled',
}
+export enum AliasingModel {
+ Stacked = 'stacked',
+ Tree = 'tree',
+}
+
export enum Focus {
Clippy = 'clippy',
Miri = 'miri',
diff --git a/ui/src/metrics.rs b/ui/src/metrics.rs
index b1d7ab9a..973e5d4e 100644
--- a/ui/src/metrics.rs
+++ b/ui/src/metrics.rs
@@ -361,6 +361,7 @@ impl HasLabelsCore for coordinator::MiriRequest {
channel,
crate_type,
edition,
+ aliasing_model: _,
code: _,
} = *self;
diff --git a/ui/src/public_http_api.rs b/ui/src/public_http_api.rs
index 6f6a32b4..6ca71b9f 100644
--- a/ui/src/public_http_api.rs
+++ b/ui/src/public_http_api.rs
@@ -103,6 +103,8 @@ pub(crate) struct MiriRequest {
pub(crate) code: String,
#[serde(default)]
pub(crate) edition: String,
+ #[serde(default, rename = "aliasingModel")]
+ pub(crate) aliasing_model: Option,
}
#[derive(Debug, Clone, Serialize)]
diff --git a/ui/src/server_axum.rs b/ui/src/server_axum.rs
index ec65ba46..f4d38393 100644
--- a/ui/src/server_axum.rs
+++ b/ui/src/server_axum.rs
@@ -1285,12 +1285,22 @@ pub(crate) mod api_orchestrator_integration_impls {
type Error = ParseMiriRequestError;
fn try_from(other: api::MiriRequest) -> std::result::Result {
- let api::MiriRequest { code, edition } = other;
+ let api::MiriRequest {
+ code,
+ edition,
+ aliasing_model,
+ } = other;
+
+ let aliasing_model = match aliasing_model {
+ Some(am) => parse_aliasing_model(&am)?,
+ None => AliasingModel::Stacked,
+ };
Ok(MiriRequest {
channel: Channel::Nightly, // TODO: use what user has submitted
crate_type: CrateType::Binary, // TODO: use what user has submitted
edition: parse_edition(&edition)?,
+ aliasing_model,
code,
})
}
@@ -1300,6 +1310,8 @@ pub(crate) mod api_orchestrator_integration_impls {
pub(crate) enum ParseMiriRequestError {
#[snafu(transparent)]
Edition { source: ParseEditionError },
+ #[snafu(transparent)]
+ AliasingMode { source: ParseAliasingModelError },
}
impl From> for api::MiriResponse {
@@ -1521,6 +1533,20 @@ pub(crate) mod api_orchestrator_integration_impls {
value: String,
}
+ pub(crate) fn parse_aliasing_model(s: &str) -> Result {
+ Ok(match s {
+ "stacked" => AliasingModel::Stacked,
+ "tree" => AliasingModel::Tree,
+ value => return ParseAliasingModelSnafu { value }.fail(),
+ })
+ }
+
+ #[derive(Debug, Snafu)]
+ #[snafu(display("'{value}' is not a valid aliasing model"))]
+ pub(crate) struct ParseAliasingModelError {
+ value: String,
+ }
+
impl From for api::MetaGistResponse {
fn from(me: gist::Gist) -> Self {
api::MetaGistResponse {