168d28b036
This commit reduces the code surface that interacts with raw JSON data, reducing code complexity and improving maintainability. Files that needed to be changed drastically were additionally cleaned up to remove any code cruft that has accrued over time. In order to facility this the following changes were made: * Move JSON handling from `CascadiaSettings` into `SettingsLoader` This allows us to use STL containers for data model instances. For instance profiles are now added to a hashmap for O(1) lookup. * JSON parsing within `SettingsLoader` doesn't differentiate between user, inbox and fragment JSON data, reducing code complexity and size. It also centralizes common concerns, like profile deduplication and ensuring that all profiles are assigned a GUID. * Direct JSON modification, like the insertion of dynamic profiles into settings.json were removed. This vastly reduces code complexity, but unfortunately removes support for comments in JSON on first start. * `ColorScheme`s cannot be layered. As such its `LayerJson` API was replaced with `FromJson`, allowing us to remove JSON-based color scheme validation. * `Profile`s used to test their wish to layer using `ShouldBeLayered`, which was replaced with a GUID-based hashmap lookup on previously parsed profiles. Further changes were made as improvements upon the previous changes: * Compact the JSON files embedded binary, saving 28kB * Prevent double-initialization of the color table in `ColorScheme` * Making `til::color` getters `constexpr`, allow better optimizations The result is a reduction of: * 48kB binary size for the Settings.Model.dll * 5-10% startup duration * 26% code for the `CascadiaSettings` class * 1% overall code in this project Furthermore this results in the following breaking changes: * The long deprecated "globals" settings object will not be detected and no warning will be created during load. * The initial creation of a new settings.json will not produce helpful comments. Both cases are caused by the removal of manual JSON handling and the move to representing the settings file with model objects instead ## PR Checklist * [x] Closes #5276 * [x] Closes #7421 * [x] I work here * [x] Tests added/passed ## Validation Steps Performed * Out-of-box-experience is identical to before ✔️ (Except for the settings.json file lacking comments.) * Existing user settings load correctly ✔️ * New WSL instances are added to user settings ✔️ * New fragments are added to user settings ✔️ * All profiles are assigned GUIDs ✔️
270 lines
14 KiB
XML
270 lines
14 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||
<PropertyGroup Label="Globals">
|
||
<ProjectGuid>{CA5CAD1A-d7ec-4107-b7c6-79cb77ae2907}</ProjectGuid>
|
||
<Keyword>Win32Proj</Keyword>
|
||
<ProjectName>Microsoft.Terminal.Settings.Model.Lib</ProjectName>
|
||
<RootNamespace>Microsoft.Terminal.Settings.Model</RootNamespace>
|
||
<TargetName>Microsoft.Terminal.Settings.Model.Lib</TargetName>
|
||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||
<SubSystem>Console</SubSystem>
|
||
<OpenConsoleUniversalApp>true</OpenConsoleUniversalApp>
|
||
</PropertyGroup>
|
||
<Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" />
|
||
<!-- ========================= Headers ======================== -->
|
||
<ItemGroup>
|
||
<ClInclude Include="BaseVisualStudioGenerator.h" />
|
||
<ClInclude Include="DefaultTerminal.h">
|
||
<DependentUpon>DefaultTerminal.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="IconPathConverter.h">
|
||
<DependentUpon>IconPathConverter.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="pch.h" />
|
||
<ClInclude Include="ActionArgs.h">
|
||
<DependentUpon>ActionArgs.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="ActionAndArgs.h">
|
||
<DependentUpon>ActionArgs.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="ActionMap.h">
|
||
<DependentUpon>ActionMap.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="AzureCloudShellGenerator.h" />
|
||
<ClInclude Include="ApplicationState.h">
|
||
<DependentUpon>ApplicationState.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="CascadiaSettings.h">
|
||
<DependentUpon>CascadiaSettings.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="ColorScheme.h">
|
||
<DependentUpon>ColorScheme.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="Command.h">
|
||
<DependentUpon>Command.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="DynamicProfileUtils.h" />
|
||
<ClInclude Include="FileUtils.h" />
|
||
<ClInclude Include="GlobalAppSettings.h">
|
||
<DependentUpon>GlobalAppSettings.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="IInheritable.h" />
|
||
<ClInclude Include="IDynamicProfileGenerator.h" />
|
||
<ClInclude Include="JsonUtils.h" />
|
||
<ClInclude Include="HashUtils.h" />
|
||
<ClInclude Include="KeyChordSerialization.h">
|
||
<DependentUpon>KeyChordSerialization.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="PowershellCoreProfileGenerator.h" />
|
||
<ClInclude Include="Profile.h">
|
||
<DependentUpon>Profile.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="AppearanceConfig.h">
|
||
<DependentUpon>AppearanceConfig.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="FontConfig.h">
|
||
<DependentUpon>FontConfig.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="EnumMappings.h">
|
||
<DependentUpon>EnumMappings.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="SettingsTypes.h" />
|
||
<ClInclude Include="TerminalSettings.h">
|
||
<DependentUpon>TerminalSettings.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="TerminalSettingsSerializationHelpers.h" />
|
||
<ClInclude Include="TerminalWarnings.h">
|
||
<DependentUpon>TerminalWarnings.idl</DependentUpon>
|
||
</ClInclude>
|
||
<ClInclude Include="VsDevCmdGenerator.h" />
|
||
<ClInclude Include="VsDevShellGenerator.h" />
|
||
<ClInclude Include="VsSetupConfiguration.h" />
|
||
<ClInclude Include="WslDistroGenerator.h" />
|
||
</ItemGroup>
|
||
<!-- ========================= Cpp Files ======================== -->
|
||
<ItemGroup>
|
||
<ClCompile Include="BaseVisualStudioGenerator.cpp" />
|
||
<ClCompile Include="DefaultTerminal.cpp">
|
||
<DependentUpon>DefaultTerminal.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="IconPathConverter.cpp">
|
||
<DependentUpon>IconPathConverter.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="init.cpp" />
|
||
<ClCompile Include="pch.cpp">
|
||
<PrecompiledHeader>Create</PrecompiledHeader>
|
||
</ClCompile>
|
||
<ClCompile Include="ActionAndArgs.cpp">
|
||
<DependentUpon>ActionArgs.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="ActionArgs.cpp">
|
||
<DependentUpon>ActionArgs.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="ActionMap.cpp">
|
||
<DependentUpon>ActionMap.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="ActionMapSerialization.cpp">
|
||
<DependentUpon>ActionMap.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="AzureCloudShellGenerator.cpp" />
|
||
<ClCompile Include="ApplicationState.cpp">
|
||
<DependentUpon>ApplicationState.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="CascadiaSettings.cpp">
|
||
<DependentUpon>CascadiaSettings.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="CascadiaSettingsSerialization.cpp">
|
||
<DependentUpon>CascadiaSettings.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="ColorScheme.cpp">
|
||
<DependentUpon>ColorScheme.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="Command.cpp">
|
||
<DependentUpon>Command.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="DynamicProfileUtils.cpp" />
|
||
<ClCompile Include="FileUtils.cpp" />
|
||
<ClCompile Include="GlobalAppSettings.cpp">
|
||
<DependentUpon>GlobalAppSettings.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="KeyChordSerialization.cpp">
|
||
<DependentUpon>KeyChordSerialization.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="PowershellCoreProfileGenerator.cpp" />
|
||
<ClCompile Include="Profile.cpp">
|
||
<DependentUpon>Profile.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="AppearanceConfig.cpp">
|
||
<DependentUpon>AppearanceConfig.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="FontConfig.cpp">
|
||
<DependentUpon>FontConfig.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="TerminalSettings.cpp">
|
||
<DependentUpon>TerminalSettings.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="EnumMappings.cpp">
|
||
<DependentUpon>EnumMappings.idl</DependentUpon>
|
||
</ClCompile>
|
||
<ClCompile Include="VsDevCmdGenerator.cpp" />
|
||
<ClCompile Include="VsDevShellGenerator.cpp" />
|
||
<ClCompile Include="VsSetupConfiguration.cpp" />
|
||
<ClCompile Include="WslDistroGenerator.cpp" />
|
||
<!-- You _NEED_ to include this file and the jsoncpp IncludePath (below) if
|
||
you want to use jsoncpp -->
|
||
<ClCompile Include="$(OpenConsoleDir)\dep\jsoncpp\jsoncpp.cpp">
|
||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||
</ClCompile>
|
||
<ClCompile Include="$(GeneratedFilesDir)module.g.cpp" />
|
||
</ItemGroup>
|
||
<!-- ========================= idl Files ======================== -->
|
||
<ItemGroup>
|
||
<Midl Include="ActionArgs.idl" />
|
||
<Midl Include="ActionMap.idl" />
|
||
<Midl Include="ApplicationState.idl" />
|
||
<Midl Include="CascadiaSettings.idl" />
|
||
<Midl Include="ColorScheme.idl" />
|
||
<Midl Include="Command.idl" />
|
||
<Midl Include="DefaultTerminal.idl" />
|
||
<Midl Include="GlobalAppSettings.idl" />
|
||
<Midl Include="IconPathConverter.idl" />
|
||
<Midl Include="Profile.idl" />
|
||
<Midl Include="EnumMappings.idl" />
|
||
<Midl Include="TerminalSettings.idl" />
|
||
<Midl Include="TerminalWarnings.idl" />
|
||
<Midl Include="KeyChordSerialization.idl" />
|
||
<Midl Include="AppearanceConfig.idl" />
|
||
<Midl Include="IAppearanceConfig.idl" />
|
||
<Midl Include="FontConfig.idl" />
|
||
</ItemGroup>
|
||
<!-- ========================= Misc Files ======================== -->
|
||
<ItemGroup>
|
||
<PRIResource Include="Resources\en-US\Resources.resw" />
|
||
<OCResourceDirectory Include="Resources" />
|
||
<None Include="packages.config" />
|
||
</ItemGroup>
|
||
<!-- ========================= Project References ======================== -->
|
||
<ItemGroup>
|
||
<!--
|
||
the packaging project won't recurse through our dependencies, you have to
|
||
make sure that if you add a cppwinrt dependency to any of these projects,
|
||
you also update all the consumers
|
||
-->
|
||
<ProjectReference Include="$(OpenConsoleDir)src\types\lib\types.vcxproj" />
|
||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\WinRTUtils\WinRTUtils.vcxproj">
|
||
<Project>{CA5CAD1A-039A-4929-BA2A-8BEB2E4106FE}</Project>
|
||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||
</ProjectReference>
|
||
<!-- For whatever reason, we can't include the TerminalControl and
|
||
TerminalSettings projects' winmds via project references. So we'll have to
|
||
manually include the winmds as References below -->
|
||
</ItemGroup>
|
||
<ItemGroup>
|
||
<!-- Manually add references to each of our dependent winmds. Mark them as
|
||
private=false and CopyLocalSatelliteAssemblies=false, so that we don't
|
||
propagate them upwards (which can make referencing this project result in
|
||
duplicate type definitions)-->
|
||
<Reference Include="Microsoft.Terminal.TerminalConnection">
|
||
<HintPath>$(OpenConsoleCommonOutDir)TerminalConnection\Microsoft.Terminal.TerminalConnection.winmd</HintPath>
|
||
<IsWinMDFile>true</IsWinMDFile>
|
||
<Private>false</Private>
|
||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||
</Reference>
|
||
<Reference Include="Microsoft.Terminal.Control">
|
||
<HintPath>$(OpenConsoleCommonOutDir)Microsoft.Terminal.Control\Microsoft.Terminal.Control.winmd</HintPath>
|
||
<IsWinMDFile>true</IsWinMDFile>
|
||
<Private>false</Private>
|
||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||
</Reference>
|
||
<Reference Include="Microsoft.Terminal.Core">
|
||
<HintPath>$(OpenConsoleCommonOutDir)TerminalCore\Microsoft.Terminal.Core.winmd</HintPath>
|
||
<IsWinMDFile>true</IsWinMDFile>
|
||
<Private>false</Private>
|
||
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
|
||
</Reference>
|
||
</ItemGroup>
|
||
<!-- ====================== Compiler & Linker Flags ===================== -->
|
||
<ItemDefinitionGroup>
|
||
<ClCompile>
|
||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||
<AdditionalIncludeDirectories>..;$(OpenConsoleDir)\dep\jsoncpp\json;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories>
|
||
<!-- Manually disable unreachable code warning, because jconcpp has a ton of that. -->
|
||
<DisableSpecificWarnings>4702;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||
</ClCompile>
|
||
<Link>
|
||
<AdditionalDependencies>WindowsApp.lib;user32.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||
</Link>
|
||
<Reference>
|
||
<Private>false</Private>
|
||
</Reference>
|
||
</ItemDefinitionGroup>
|
||
<!-- ========================= Globals ======================== -->
|
||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.post.props" />
|
||
|
||
<Import Project="..\..\..\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('..\..\..\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets')" />
|
||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||
<PropertyGroup>
|
||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||
</PropertyGroup>
|
||
<Error Condition="!Exists('$(OpenConsoleDir)\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(OpenConsoleDir)\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets'))" />
|
||
<Error Condition="!Exists('..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets'))" />
|
||
</Target>
|
||
<!-- This target will take our defaults.json and stamp it into a .h file that
|
||
we can include in the code directly. This way, we don't need to worry about
|
||
failing to load the default settings at runtime. -->
|
||
<Target Name="_TerminalAppGenerateDefaultsH" Inputs="defaults.json" Outputs="Generated Files\defaults.h" BeforeTargets="BeforeClCompile">
|
||
<Exec Command="pwsh.exe -NoProfile –ExecutionPolicy Unrestricted $(OpenConsoleDir)\tools\GenerateHeaderForJson.ps1 -JsonFile defaults.json -OutPath "Generated Files\defaults.h" -VariableName DefaultJson" />
|
||
</Target>
|
||
<!-- A different set of defaults for Universal variant -->
|
||
<Target Name="_TerminalAppGenerateDefaultsUniversalH" Inputs="defaults-universal.json" Outputs="Generated Files\defaults-universal.h" BeforeTargets="BeforeClCompile">
|
||
<Exec Command="pwsh.exe -NoProfile –ExecutionPolicy Unrestricted $(OpenConsoleDir)\tools\GenerateHeaderForJson.ps1 -JsonFile defaults-universal.json -OutPath "Generated Files\defaults-universal.h" -VariableName DefaultUniversalJson" />
|
||
</Target>
|
||
<!-- Same as above, but for the default settings.json template -->
|
||
<Target Name="_TerminalAppGenerateUserSettingsH" Inputs="userDefaults.json" Outputs="Generated Files\userDefaults.h" BeforeTargets="BeforeClCompile">
|
||
<Exec Command="pwsh.exe -NoProfile –ExecutionPolicy Unrestricted $(OpenConsoleDir)\tools\GenerateHeaderForJson.ps1 -JsonFile userDefaults.json -OutPath "Generated Files\userDefaults.h" -VariableName UserSettingsJson" />
|
||
</Target>
|
||
<Import Project="$(SolutionDir)build\rules\CollectWildcardResources.targets" />
|
||
<Import Project="..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets" Condition="Exists('..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets')" />
|
||
</Project>
|