Load build time index for search

- Adds referential XAML names to components of interest.
- Adds a script that generates the build time entries to be loaded
- Invokes the script in Editor.vcxproj
This commit is contained in:
Carlos Zamora 2025-10-15 15:42:43 -07:00
parent e01ff4faf0
commit 1b8c99dff8
7 changed files with 197 additions and 4 deletions

View File

@ -37,7 +37,8 @@
</Button> </Button>
</Border> </Border>
<StackPanel Margin="{StaticResource StandardControlMargin}"> <StackPanel Margin="{StaticResource StandardControlMargin}">
<local:SettingContainer x:Uid="AddProfile_Duplicate"> <local:SettingContainer x:Uid="AddProfile_Duplicate"
x:Name="DuplicateProfile">
<ComboBox x:Name="Profiles" <ComboBox x:Name="Profiles"
AutomationProperties.AccessibilityView="Content" AutomationProperties.AccessibilityView="Content"
ItemsSource="{x:Bind State.Settings.AllProfiles, Mode=OneWay}" ItemsSource="{x:Bind State.Settings.AllProfiles, Mode=OneWay}"

View File

@ -22,6 +22,7 @@
#include "NewTabMenu.h" #include "NewTabMenu.h"
#include "..\types\inc\utils.hpp" #include "..\types\inc\utils.hpp"
#include <..\WinRTUtils\inc\Utils.h> #include <..\WinRTUtils\inc\Utils.h>
#include "GeneratedSettingsIndex.g.h"
#include <LibraryResources.h> #include <LibraryResources.h>
#include <dwmapi.h> #include <dwmapi.h>

View File

@ -165,6 +165,7 @@
</ClInclude> </ClInclude>
<ClInclude Include="Utils.h" /> <ClInclude Include="Utils.h" />
<ClInclude Include="PreviewConnection.h" /> <ClInclude Include="PreviewConnection.h" />
<ClInclude Include="$(GeneratedFilesDir)GeneratedSettingsIndex.g.h" />
</ItemGroup> </ItemGroup>
<!-- ========================= XAML files ======================== --> <!-- ========================= XAML files ======================== -->
<ItemGroup> <ItemGroup>
@ -363,6 +364,7 @@
<ClCompile Include="PreviewConnection.cpp"> <ClCompile Include="PreviewConnection.cpp">
<DependentUpon>PreviewConnection.h</DependentUpon> <DependentUpon>PreviewConnection.h</DependentUpon>
</ClCompile> </ClCompile>
<ClCompile Include="$(GeneratedFilesDir)GeneratedSettingsIndex.g.cpp" />
</ItemGroup> </ItemGroup>
<!-- ========================= idl Files ======================== --> <!-- ========================= idl Files ======================== -->
<ItemGroup> <ItemGroup>
@ -534,4 +536,10 @@
<!-- This -must- go after cppwinrt.build.post.props because that includes many VS-provided props including appcontainer.common.props, which stomps on what cppwinrt.targets did. --> <!-- This -must- go after cppwinrt.build.post.props because that includes many VS-provided props including appcontainer.common.props, which stomps on what cppwinrt.targets did. -->
<Import Project="$(OpenConsoleDir)src\common.nugetversions.targets" /> <Import Project="$(OpenConsoleDir)src\common.nugetversions.targets" />
<Import Project="$(SolutionDir)build\rules\CollectWildcardResources.targets" /> <Import Project="$(SolutionDir)build\rules\CollectWildcardResources.targets" />
<Target Name="GenerateSettingsIndex"
Inputs="@(Page);$(OpenConsoleDir)tools\GenerateSettingsIndex.ps1"
Outputs="$(GeneratedFilesDir)GeneratedSettingsIndex.g.h;$(GeneratedFilesDir)GeneratedSettingsIndex.g.cpp"
BeforeTargets="ClCompile">
<Exec Command="pwsh.exe -NoProfile -ExecutionPolicy Unrestricted &quot;$(OpenConsoleDir)tools\GenerateSettingsIndex.ps1&quot; -SourceDir &quot;$(MSBuildThisFileDirectory).&quot; -OutputDir &quot;$(MSBuildThisFileDirectory)$(GeneratedFilesDir).&quot;" />
</Target>
</Project> </Project>

View File

@ -325,6 +325,7 @@
<!-- Name --> <!-- Name -->
<local:SettingContainer x:Uid="NewTabMenu_CurrentFolderName" <local:SettingContainer x:Uid="NewTabMenu_CurrentFolderName"
x:Name="CurrentFolderName"
Grid.Row="0" Grid.Row="0"
CurrentValue="{x:Bind ViewModel.CurrentFolderName, Mode=OneWay}" CurrentValue="{x:Bind ViewModel.CurrentFolderName, Mode=OneWay}"
Style="{StaticResource ExpanderSettingContainerStyle}"> Style="{StaticResource ExpanderSettingContainerStyle}">
@ -334,6 +335,7 @@
<!-- Inlining --> <!-- Inlining -->
<local:SettingContainer x:Uid="NewTabMenu_CurrentFolderInlining" <local:SettingContainer x:Uid="NewTabMenu_CurrentFolderInlining"
x:Name="CurrentFolderInlining"
Grid.Row="1"> Grid.Row="1">
<ToggleSwitch IsOn="{x:Bind ViewModel.CurrentFolderInlining, Mode=TwoWay}" <ToggleSwitch IsOn="{x:Bind ViewModel.CurrentFolderInlining, Mode=TwoWay}"
Style="{StaticResource ToggleSwitchInExpanderStyle}" /> Style="{StaticResource ToggleSwitchInExpanderStyle}" />
@ -341,6 +343,7 @@
<!-- Allow Empty --> <!-- Allow Empty -->
<local:SettingContainer x:Uid="NewTabMenu_CurrentFolderAllowEmpty" <local:SettingContainer x:Uid="NewTabMenu_CurrentFolderAllowEmpty"
x:Name="CurrentFolderAllowEmpty"
Grid.Row="2"> Grid.Row="2">
<ToggleSwitch IsOn="{x:Bind ViewModel.CurrentFolderAllowEmpty, Mode=TwoWay}" <ToggleSwitch IsOn="{x:Bind ViewModel.CurrentFolderAllowEmpty, Mode=TwoWay}"
Style="{StaticResource ToggleSwitchInExpanderStyle}" /> Style="{StaticResource ToggleSwitchInExpanderStyle}" />
@ -354,6 +357,7 @@
<!-- Add Profile --> <!-- Add Profile -->
<local:SettingContainer x:Uid="NewTabMenu_AddProfile" <local:SettingContainer x:Uid="NewTabMenu_AddProfile"
x:Name="AddProfile"
FontIconGlyph="&#xE756;" FontIconGlyph="&#xE756;"
Style="{StaticResource SettingContainerWithIcon}"> Style="{StaticResource SettingContainerWithIcon}">
@ -403,6 +407,7 @@
<!-- Add Separator --> <!-- Add Separator -->
<local:SettingContainer x:Uid="NewTabMenu_AddSeparator" <local:SettingContainer x:Uid="NewTabMenu_AddSeparator"
x:Name="AddSeparator"
FontIconGlyph="&#xE76f;" FontIconGlyph="&#xE76f;"
Style="{StaticResource SettingContainerWithIcon}"> Style="{StaticResource SettingContainerWithIcon}">
<Button x:Name="AddSeparatorButton" <Button x:Name="AddSeparatorButton"
@ -419,6 +424,7 @@
<!-- Add Folder --> <!-- Add Folder -->
<local:SettingContainer x:Uid="NewTabMenu_AddFolder" <local:SettingContainer x:Uid="NewTabMenu_AddFolder"
x:Name="AddFolder"
FontIconGlyph="&#xF12B;" FontIconGlyph="&#xF12B;"
Style="{StaticResource SettingContainerWithIcon}"> Style="{StaticResource SettingContainerWithIcon}">
<StackPanel Orientation="Horizontal" <StackPanel Orientation="Horizontal"
@ -445,6 +451,7 @@
<!-- Add Match Profiles --> <!-- Add Match Profiles -->
<local:SettingContainer x:Uid="NewTabMenu_AddMatchProfiles" <local:SettingContainer x:Uid="NewTabMenu_AddMatchProfiles"
x:Name="AddMatchProfiles"
FontIconGlyph="&#xE748;" FontIconGlyph="&#xE748;"
Style="{StaticResource ExpanderSettingContainerStyleWithIcon}"> Style="{StaticResource ExpanderSettingContainerStyleWithIcon}">
<StackPanel Spacing="8"> <StackPanel Spacing="8">

View File

@ -38,6 +38,7 @@
Style="{StaticResource SettingsStackStyle}"> Style="{StaticResource SettingsStackStyle}">
<!-- Antialiasing Mode --> <!-- Antialiasing Mode -->
<local:SettingContainer x:Uid="Profile_AntialiasingMode" <local:SettingContainer x:Uid="Profile_AntialiasingMode"
x:Name="AntialiasingMode"
ClearSettingValue="{x:Bind Profile.ClearAntialiasingMode}" ClearSettingValue="{x:Bind Profile.ClearAntialiasingMode}"
HasSettingValue="{x:Bind Profile.HasAntialiasingMode, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasAntialiasingMode, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.AntialiasingModeOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.AntialiasingModeOverrideSource, Mode=OneWay}">
@ -50,6 +51,7 @@
<!-- AltGr Aliasing --> <!-- AltGr Aliasing -->
<local:SettingContainer x:Uid="Profile_AltGrAliasing" <local:SettingContainer x:Uid="Profile_AltGrAliasing"
x:Name="AltGrAliasing"
ClearSettingValue="{x:Bind Profile.ClearAltGrAliasing}" ClearSettingValue="{x:Bind Profile.ClearAltGrAliasing}"
HasSettingValue="{x:Bind Profile.HasAltGrAliasing, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasAltGrAliasing, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.AltGrAliasingOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.AltGrAliasingOverrideSource, Mode=OneWay}">
@ -59,6 +61,7 @@
<!-- Snap On Input --> <!-- Snap On Input -->
<local:SettingContainer x:Uid="Profile_SnapOnInput" <local:SettingContainer x:Uid="Profile_SnapOnInput"
x:Name="SnapOnInput"
ClearSettingValue="{x:Bind Profile.ClearSnapOnInput}" ClearSettingValue="{x:Bind Profile.ClearSnapOnInput}"
HasSettingValue="{x:Bind Profile.HasSnapOnInput, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasSnapOnInput, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.SnapOnInputOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.SnapOnInputOverrideSource, Mode=OneWay}">
@ -68,6 +71,7 @@
<!-- History Size --> <!-- History Size -->
<local:SettingContainer x:Uid="Profile_HistorySize" <local:SettingContainer x:Uid="Profile_HistorySize"
x:Name="HistorySize"
ClearSettingValue="{x:Bind Profile.ClearHistorySize}" ClearSettingValue="{x:Bind Profile.ClearHistorySize}"
HasSettingValue="{x:Bind Profile.HasHistorySize, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasHistorySize, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.HistorySizeOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.HistorySizeOverrideSource, Mode=OneWay}">
@ -81,6 +85,7 @@
<!-- Close On Exit --> <!-- Close On Exit -->
<local:SettingContainer x:Uid="Profile_CloseOnExit" <local:SettingContainer x:Uid="Profile_CloseOnExit"
x:Name="CloseOnExit"
ClearSettingValue="{x:Bind Profile.ClearCloseOnExit}" ClearSettingValue="{x:Bind Profile.ClearCloseOnExit}"
HasSettingValue="{x:Bind Profile.HasCloseOnExit, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasCloseOnExit, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.CloseOnExitOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.CloseOnExitOverrideSource, Mode=OneWay}">
@ -93,6 +98,7 @@
<!-- Bell Style --> <!-- Bell Style -->
<local:SettingContainer x:Uid="Profile_BellStyle" <local:SettingContainer x:Uid="Profile_BellStyle"
x:Name="BellStyle"
ClearSettingValue="{x:Bind Profile.ClearBellStyle}" ClearSettingValue="{x:Bind Profile.ClearBellStyle}"
CurrentValue="{x:Bind Profile.BellStylePreview, Mode=OneWay}" CurrentValue="{x:Bind Profile.BellStylePreview, Mode=OneWay}"
HasSettingValue="{x:Bind Profile.HasBellStyle, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasBellStyle, Mode=OneWay}"
@ -110,6 +116,7 @@
<!-- Bell Sound --> <!-- Bell Sound -->
<local:SettingContainer x:Uid="Profile_BellSound" <local:SettingContainer x:Uid="Profile_BellSound"
x:Name="BellSound"
ClearSettingValue="{x:Bind Profile.ClearBellSound}" ClearSettingValue="{x:Bind Profile.ClearBellSound}"
CurrentValue="{x:Bind Profile.BellSoundPreview, Mode=OneWay}" CurrentValue="{x:Bind Profile.BellSoundPreview, Mode=OneWay}"
HasSettingValue="{x:Bind Profile.HasBellSound, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasBellSound, Mode=OneWay}"
@ -191,6 +198,7 @@
<!-- RightClickContextMenu --> <!-- RightClickContextMenu -->
<local:SettingContainer x:Uid="Profile_RightClickContextMenu" <local:SettingContainer x:Uid="Profile_RightClickContextMenu"
x:Name="RightClickContextMenu"
ClearSettingValue="{x:Bind Profile.ClearRightClickContextMenu}" ClearSettingValue="{x:Bind Profile.ClearRightClickContextMenu}"
HasSettingValue="{x:Bind Profile.HasRightClickContextMenu, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasRightClickContextMenu, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.RightClickContextMenuOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.RightClickContextMenuOverrideSource, Mode=OneWay}">
@ -200,6 +208,7 @@
<!-- ShowMarks --> <!-- ShowMarks -->
<local:SettingContainer x:Uid="Profile_ShowMarks" <local:SettingContainer x:Uid="Profile_ShowMarks"
x:Name="ShowMarks"
ClearSettingValue="{x:Bind Profile.ClearShowMarks}" ClearSettingValue="{x:Bind Profile.ClearShowMarks}"
HasSettingValue="{x:Bind Profile.HasShowMarks, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasShowMarks, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.ShowMarksOverrideSource, Mode=OneWay}" SettingOverrideSource="{x:Bind Profile.ShowMarksOverrideSource, Mode=OneWay}"
@ -210,6 +219,7 @@
<!-- AutoMarkPrompts --> <!-- AutoMarkPrompts -->
<local:SettingContainer x:Uid="Profile_AutoMarkPrompts" <local:SettingContainer x:Uid="Profile_AutoMarkPrompts"
x:Name="AutoMarkPrompts"
ClearSettingValue="{x:Bind Profile.ClearAutoMarkPrompts}" ClearSettingValue="{x:Bind Profile.ClearAutoMarkPrompts}"
HasSettingValue="{x:Bind Profile.HasAutoMarkPrompts, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasAutoMarkPrompts, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.AutoMarkPromptsOverrideSource, Mode=OneWay}" SettingOverrideSource="{x:Bind Profile.AutoMarkPromptsOverrideSource, Mode=OneWay}"
@ -220,6 +230,7 @@
<!-- ReloadEnvVars --> <!-- ReloadEnvVars -->
<local:SettingContainer x:Uid="Profile_ReloadEnvVars" <local:SettingContainer x:Uid="Profile_ReloadEnvVars"
x:Name="ReloadEnvVars"
ClearSettingValue="{x:Bind Profile.ClearReloadEnvironmentVariables}" ClearSettingValue="{x:Bind Profile.ClearReloadEnvironmentVariables}"
HasSettingValue="{x:Bind Profile.HasReloadEnvironmentVariables, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasReloadEnvironmentVariables, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.ReloadEnvironmentVariablesOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.ReloadEnvironmentVariablesOverrideSource, Mode=OneWay}">
@ -229,6 +240,7 @@
<!-- RepositionCursorWithMouse --> <!-- RepositionCursorWithMouse -->
<local:SettingContainer x:Uid="Profile_RepositionCursorWithMouse" <local:SettingContainer x:Uid="Profile_RepositionCursorWithMouse"
x:Name="RepositionCursorWithMouse"
ClearSettingValue="{x:Bind Profile.ClearRepositionCursorWithMouse}" ClearSettingValue="{x:Bind Profile.ClearRepositionCursorWithMouse}"
HasSettingValue="{x:Bind Profile.HasRepositionCursorWithMouse, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasRepositionCursorWithMouse, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.RepositionCursorWithMouseOverrideSource, Mode=OneWay}" SettingOverrideSource="{x:Bind Profile.RepositionCursorWithMouseOverrideSource, Mode=OneWay}"
@ -239,6 +251,7 @@
<!-- RainbowSuggestions --> <!-- RainbowSuggestions -->
<local:SettingContainer x:Uid="Profile_RainbowSuggestions" <local:SettingContainer x:Uid="Profile_RainbowSuggestions"
x:Name="RainbowSuggestions"
ClearSettingValue="{x:Bind Profile.ClearRainbowSuggestions}" ClearSettingValue="{x:Bind Profile.ClearRainbowSuggestions}"
HasSettingValue="{x:Bind Profile.HasRainbowSuggestions, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasRainbowSuggestions, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.RainbowSuggestionsOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.RainbowSuggestionsOverrideSource, Mode=OneWay}">
@ -248,6 +261,7 @@
<!-- Path Translation --> <!-- Path Translation -->
<local:SettingContainer x:Uid="Profile_PathTranslationStyle" <local:SettingContainer x:Uid="Profile_PathTranslationStyle"
x:Name="PathTranslationStyle"
ClearSettingValue="{x:Bind Profile.ClearPathTranslationStyle}" ClearSettingValue="{x:Bind Profile.ClearPathTranslationStyle}"
HasSettingValue="{x:Bind Profile.HasPathTranslationStyle, Mode=OneWay}" HasSettingValue="{x:Bind Profile.HasPathTranslationStyle, Mode=OneWay}"
SettingOverrideSource="{x:Bind Profile.PathTranslationStyleOverrideSource, Mode=OneWay}"> SettingOverrideSource="{x:Bind Profile.PathTranslationStyleOverrideSource, Mode=OneWay}">

View File

@ -23,7 +23,8 @@
<StackPanel Style="{StaticResource SettingsStackStyle}"> <StackPanel Style="{StaticResource SettingsStackStyle}">
<!-- Delete Button --> <!-- Delete Button -->
<local:SettingContainer x:Uid="Profile_Delete_Orphaned"> <local:SettingContainer x:Uid="Profile_Delete_Orphaned"
x:Name="DeleteOrphaned">
<local:SettingContainer.Content> <local:SettingContainer.Content>
<Button x:Name="DeleteButton" <Button x:Name="DeleteButton"
Click="DeleteConfirmation_Click" Click="DeleteConfirmation_Click"
@ -40,7 +41,8 @@
</local:SettingContainer.Content> </local:SettingContainer.Content>
</local:SettingContainer> </local:SettingContainer>
<local:SettingContainer x:Uid="Profile_Name"> <local:SettingContainer x:Uid="Profile_Name"
x:Name="Name">
<local:SettingContainer.Content> <local:SettingContainer.Content>
<TextBlock FontFamily="Segoe UI, Segoe Fluent Icons, Segoe MDL2 Assets" <TextBlock FontFamily="Segoe UI, Segoe Fluent Icons, Segoe MDL2 Assets"
Style="{StaticResource SettingsPageItemDescriptionStyle}" Style="{StaticResource SettingsPageItemDescriptionStyle}"
@ -48,7 +50,8 @@
</local:SettingContainer.Content> </local:SettingContainer.Content>
</local:SettingContainer> </local:SettingContainer>
<local:SettingContainer x:Uid="Profile_Source_Orphaned"> <local:SettingContainer x:Uid="Profile_Source_Orphaned"
x:Name="Source">
<local:SettingContainer.Content> <local:SettingContainer.Content>
<TextBlock FontFamily="Segoe UI, Segoe Fluent Icons, Segoe MDL2 Assets" <TextBlock FontFamily="Segoe UI, Segoe Fluent Icons, Segoe MDL2 Assets"
Style="{StaticResource SettingsPageItemDescriptionStyle}" Style="{StaticResource SettingsPageItemDescriptionStyle}"

View File

@ -0,0 +1,159 @@
<#
Copyright (c) Microsoft Corporation.
Licensed under the MIT license.
.SYNOPSIS
Scans XAML files for local:SettingContainer entries and generates GeneratedSettingsIndex.g.h / .g.cpp.
.PARAMETER SourceDir
Directory to scan recursively for .xaml files.
.PARAMETER OutputDir
Directory to place generated C++ files.
#>
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][string]$SourceDir,
[Parameter(Mandatory=$true)][string]$OutputDir
)
# Prohibited UIDs (exact match, case-insensitive by default)
$ProhibitedUids = @(
'NewTabMenu_AddRemainingProfiles'
)
# Prohibited XAML files (full paths preferred)
$ProhibitedXamlFiles = @(
# 'd:\projects\terminal\src\cascadia\TerminalSettingsEditor\SomePage.xaml'
)
if (-not (Test-Path $SourceDir)) { throw "SourceDir not found: $SourceDir" }
if (-not (Test-Path $OutputDir)) { New-Item -ItemType Directory -Path $OutputDir | Out-Null }
$entries = @()
Get-ChildItem -Path $SourceDir -Recurse -Filter *.xaml | ForEach-Object {
$file = $_.FullName
# Skip whole file if prohibited
if ($ProhibitedXamlFiles -contains $file) { return }
$text = Get-Content -Raw -LiteralPath $file
# Extract Page x:Class
$pageClass = $null
if ($text -match '<Page\b[^>]*\bx:Class="([^"]+)"') {
$pageClass = $matches[1]
} elseif ($text -match '<UserControl\b[^>]*\bx:Class="([^"]+)"') {
# Needed for Appearances.xaml
$pageClass = $matches[1]
} else {
return
}
# Convert XAML namespace dots to C++ scope operators
$cppPageType = ($pageClass -replace '\.', '::')
# Find all local:SettingContainer start tags
$pattern = '<local:SettingContainer\b([^>/]*)(/?>)'
$matchesAll = [System.Text.RegularExpressions.Regex]::Matches($text, $pattern, 'IgnoreCase')
foreach ($m in $matchesAll) {
$attrBlock = $m.Groups[1].Value
if ($attrBlock -match '\bx:Uid="([^"]+)"') {
$uid = $matches[1]
}
else {
continue
}
if ($attrBlock -match '\bx:Name="([^"]+)"') {
$name = $matches[1]
}
elseif ($attrBlock -match '\bName="([^"]+)"') {
$name = $matches[1]
}
else {
$name = ""
}
# Skip entry if UID prohibited
if ($ProhibitedUids -contains $uid) { continue }
$entries += [pscustomobject]@{
PageClass = $pageClass
CppPageType = $cppPageType
Uid = $uid
Name = $name
File = $file
}
}
}
# Ensure there aren't any duplicate entries (PageClass, Uid, Name)
$entries = $entries | Sort-Object PageClass, Uid, Name -Unique
$headerPath = Join-Path $OutputDir 'GeneratedSettingsIndex.g.h'
$cppPath = Join-Path $OutputDir 'GeneratedSettingsIndex.g.cpp'
$header = @"
/*++
Copyright (c) Microsoft Corporation
Licensed under the MIT license.
--*/
#pragma once
#include <winrt/Windows.UI.Xaml.Interop.h>
namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{
struct IndexEntry
{
std::wstring_view ElementName;
std::wstring_view ElementUID;
winrt::Windows::UI::Xaml::Interop::TypeName ParentPage;
};
std::span<const IndexEntry> LoadBuildTimeIndex();
}
"@
$entryLines = foreach ($e in $entries) {
# Ensure we emit valid wide string literals (escape backslashes and quotes)
$uidEsc = ($e.Uid -replace '\\','\\\\') -replace '"','\"'
$nameEsc = ($e.Name -replace '\\','\\\\') -replace '"','\"'
" { L`"$nameEsc`", L`"$uidEsc`", winrt::xaml_typename<$($e.CppPageType)>() }"
}
$cpp = @"
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "pch.h"
#include <winrt/Microsoft.Terminal.Settings.Editor.h>
#include "GeneratedSettingsIndex.g.h"
namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
{
namespace
{
static const IndexEntry s_entries[] =
{
$( ($entryLines -join ",`r`n") )
};
}
std::span<const IndexEntry> LoadBuildTimeIndex()
{
static auto entries = std::span<const IndexEntry>(s_entries, std::size(s_entries));
return entries;
}
}
"@
Set-Content -LiteralPath $headerPath -Value $header -NoNewline
Set-Content -LiteralPath $cppPath -Value $cpp -NoNewline
Write-Host "Generated:"
Write-Host " $headerPath"
Write-Host " $cppPath"
Write-Host "Entries: $($entries.Count)"