diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json
index d2f2ee36d5..b802589fc7 100644
--- a/.nuke/build.schema.json
+++ b/.nuke/build.schema.json
@@ -6,17 +6,18 @@
"build": {
"type": "object",
"properties": {
- "Configuration": {
- "type": "string",
- "description": "configuration"
+ "api-baseline": {
+ "type": "string"
+ },
+ "configuration": {
+ "type": "string"
},
"Continue": {
"type": "boolean",
"description": "Indicates to continue a previously failed build attempt"
},
- "ForceNugetVersion": {
- "type": "string",
- "description": "force-nuget-version"
+ "force-nuget-version": {
+ "type": "string"
},
"Help": {
"type": "boolean",
@@ -89,17 +90,16 @@
"RunRenderTests",
"RunTests",
"RunToolsTests",
+ "ValidateApiDiff",
"ZipFiles"
]
}
},
- "SkipPreviewer": {
- "type": "boolean",
- "description": "skip-previewer"
+ "skip-previewer": {
+ "type": "boolean"
},
- "SkipTests": {
- "type": "boolean",
- "description": "skip-tests"
+ "skip-tests": {
+ "type": "boolean"
},
"Target": {
"type": "array",
@@ -124,10 +124,14 @@
"RunRenderTests",
"RunTests",
"RunToolsTests",
+ "ValidateApiDiff",
"ZipFiles"
]
}
},
+ "update-api-suppression": {
+ "type": "boolean"
+ },
"Verbosity": {
"type": "string",
"description": "Logging verbosity during build execution. Default is 'Normal'",
diff --git a/api/Avalonia.Controls.ColorPicker.nupkg.xml b/api/Avalonia.Controls.ColorPicker.nupkg.xml
new file mode 100644
index 0000000000..90271d6e98
--- /dev/null
+++ b/api/Avalonia.Controls.ColorPicker.nupkg.xml
@@ -0,0 +1,64 @@
+
+
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Fluent/ColorPicker.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Fluent/ColorPreviewer.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Fluent/ColorSlider.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Fluent/ColorSpectrum.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Fluent/ColorView.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Simple/ColorPicker.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Simple/ColorPreviewer.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Simple/ColorSlider.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Simple/ColorSpectrum.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Themes/Simple/ColorView.xaml
+ baseline/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+ target/netstandard2.0/Avalonia.Controls.ColorPicker.dll
+
+
\ No newline at end of file
diff --git a/api/Avalonia.Themes.Fluent.nupkg.xml b/api/Avalonia.Themes.Fluent.nupkg.xml
new file mode 100644
index 0000000000..f35bf5a629
--- /dev/null
+++ b/api/Avalonia.Themes.Fluent.nupkg.xml
@@ -0,0 +1,418 @@
+
+
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Accents/BaseResources.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Accents/FluentControlResources.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/AdornerLayer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/AutoCompleteBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Button.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ButtonSpinner.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Calendar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarDatePicker.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarDayButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CaptionButtons.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Carousel.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CheckBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ComboBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ComboBoxItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ContentControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ContextMenu.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DataValidationErrors.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DatePicker.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DateTimePickerShared.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DropDownButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/EmbeddableControlRoot.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Expander.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/FlyoutPresenter.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/GridSplitter.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ItemsControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Label.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ListBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ListBoxItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ManagedFileChooser.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Menu.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/MenuFlyoutPresenter.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/MenuItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/MenuScrollViewer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/NativeMenuBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/NotificationCard.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/NumericUpDown.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/OverlayPopupHost.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/PathIcon.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/PopupRoot.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ProgressBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RadioButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RefreshContainer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RefreshVisualizer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RepeatButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ScrollBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ScrollViewer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/SelectableTextBlock.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Separator.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Slider.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/SplitButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/SplitView.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabStrip.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabStripItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TextBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ThemeVariantScope.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TimePicker.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TitleBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ToggleButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ToggleSwitch.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ToolTip.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TransitioningContentControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TreeView.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TreeViewItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Window.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/WindowNotificationManager.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Fluent.dll
+ target/netstandard2.0/Avalonia.Themes.Fluent.dll
+
+
\ No newline at end of file
diff --git a/api/Avalonia.Themes.Simple.nupkg.xml b/api/Avalonia.Themes.Simple.nupkg.xml
new file mode 100644
index 0000000000..78d8c4b332
--- /dev/null
+++ b/api/Avalonia.Themes.Simple.nupkg.xml
@@ -0,0 +1,406 @@
+
+
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Accents/Base.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/AdornerLayer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/AutoCompleteBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Button.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ButtonSpinner.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Calendar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarDatePicker.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarDayButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CalendarItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CaptionButtons.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Carousel.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/CheckBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ComboBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ComboBoxItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ContentControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ContextMenu.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DataValidationErrors.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DatePicker.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DateTimePickerShared.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/DropDownButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/EmbeddableControlRoot.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Expander.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/FlyoutPresenter.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/GridSplitter.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ItemsControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Label.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ListBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ListBoxItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ManagedFileChooser.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Menu.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/MenuFlyoutPresenter.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/MenuItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/NativeMenuBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/NotificationCard.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/NumericUpDown.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/OverlayPopupHost.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/PathIcon.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/PopupRoot.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ProgressBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RadioButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RefreshContainer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RefreshVisualizer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/RepeatButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ScrollBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ScrollViewer.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/SelectableTextBlock.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Separator.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Slider.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/SplitButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/SplitView.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabStrip.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TabStripItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TextBox.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ThemeVariantScope.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TimePicker.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TitleBar.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ToggleButton.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ToggleSwitch.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/ToolTip.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TransitioningContentControl.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TreeView.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/TreeViewItem.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/Window.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
+ CP0001
+ T:CompiledAvaloniaXaml.!AvaloniaResources.NamespaceInfo:/Controls/WindowNotificationManager.xaml
+ baseline/netstandard2.0/Avalonia.Themes.Simple.dll
+ target/netstandard2.0/Avalonia.Themes.Simple.dll
+
+
\ No newline at end of file
diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml
new file mode 100644
index 0000000000..6a7d53544e
--- /dev/null
+++ b/api/Avalonia.nupkg.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ CP0006
+ P:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.ImportCompleted
+ baseline/netstandard2.0/Avalonia.Base.dll
+ target/netstandard2.0/Avalonia.Base.dll
+
+
\ No newline at end of file
diff --git a/build/SourceLink.props b/build/SourceLink.props
index dd7ecc8d2a..b0f1f2c2cc 100644
--- a/build/SourceLink.props
+++ b/build/SourceLink.props
@@ -1,9 +1,9 @@
true
- false
+ true
+ snupkg
true
- $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb
@@ -14,10 +14,6 @@
true
-
- embedded
-
-
diff --git a/nukebuild/ApiDiffValidation.cs b/nukebuild/ApiDiffValidation.cs
new file mode 100644
index 0000000000..483bfd336a
--- /dev/null
+++ b/nukebuild/ApiDiffValidation.cs
@@ -0,0 +1,154 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Net.Http;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Nuke.Common.Tooling;
+
+public static class ApiDiffValidation
+{
+ private static readonly HttpClient s_httpClient = new();
+
+ public static async Task ValidatePackage(
+ Tool apiCompatTool, string packagePath, string baselineVersion,
+ string suppressionFilesFolder, bool updateSuppressionFile)
+ {
+ if (baselineVersion is null)
+ {
+ throw new InvalidOperationException(
+ "Build \"api-baseline\" parameter must be set when running Nuke CreatePackages");
+ }
+
+ if (!Directory.Exists(suppressionFilesFolder))
+ {
+ Directory.CreateDirectory(suppressionFilesFolder!);
+ }
+
+ await using (var baselineStream = await DownloadBaselinePackage(packagePath, baselineVersion))
+ using (var target = new ZipArchive(File.Open(packagePath, FileMode.Open, FileAccess.Read), ZipArchiveMode.Read))
+ using (var baseline = new ZipArchive(baselineStream, ZipArchiveMode.Read))
+ using (Helpers.UseTempDir(out var tempFolder))
+ {
+ var targetDlls = GetDlls(target);
+ var baselineDlls = GetDlls(baseline);
+
+ var left = new List();
+ var right = new List();
+
+ var packageId = GetPackageId(packagePath);
+ var suppressionFile = Path.Combine(suppressionFilesFolder, packageId + ".nupkg.xml");
+
+ // Don't use Path.Combine with these left and right tool parameters.
+ // Microsoft.DotNet.ApiCompat.Tool is stupid and treats '/' and '\' as different assemblies in suppression files.
+ // So, always use Unix '/'
+ foreach (var baselineDll in baselineDlls)
+ {
+ var baselineDllPath = $"baseline/{baselineDll.target}/{baselineDll.entry.Name}";
+ var baselineDllRealPath = Path.Combine(tempFolder, baselineDllPath);
+ Directory.CreateDirectory(Path.GetDirectoryName(baselineDllRealPath)!);
+ await using (var baselineDllFile = File.Create(baselineDllRealPath))
+ {
+ await baselineDll.entry.Open().CopyToAsync(baselineDllFile);
+ }
+
+ var targetDll = targetDlls.FirstOrDefault(e =>
+ e.target == baselineDll.target && e.entry.Name == baselineDll.entry.Name);
+ if (targetDll.entry is null)
+ {
+ throw new InvalidOperationException($"Some assemblies are missing in the new package {packageId}: {baselineDll.entry.Name} for {baselineDll.target}");
+ }
+
+ var targetDllPath = $"target/{targetDll.target}/{targetDll.entry.Name}";
+ var targetDllRealPath = Path.Combine(tempFolder, targetDllPath);
+ Directory.CreateDirectory(Path.GetDirectoryName(targetDllRealPath)!);
+ await using (var targetDllFile = File.Create(targetDllRealPath))
+ {
+ await targetDll.entry.Open().CopyToAsync(targetDllFile);
+ }
+
+ left.Add(baselineDllPath);
+ right.Add(targetDllPath);
+ }
+
+ if (left.Any())
+ {
+ var args = $""" -l={string.Join(',', left)} -r="{string.Join(',', right)}" """;
+ if (File.Exists(suppressionFile))
+ {
+ args += $""" --suppression-file="{suppressionFile}" """;
+ }
+
+ if (updateSuppressionFile)
+ {
+ args += $""" --suppression-output-file="{suppressionFile}" --generate-suppression-file=true """;
+ }
+
+ var result = apiCompatTool(args, tempFolder)
+ .Where(t => t.Type == OutputType.Err).ToArray();
+ if (result.Any())
+ {
+ throw new AggregateException(
+ $"ApiDiffValidation task has failed for \"{Path.GetFileName(packagePath)}\" package",
+ result.Select(r => new Exception(r.Text)));
+ }
+ }
+ }
+ }
+
+ private static IReadOnlyCollection<(string target, ZipArchiveEntry entry)> GetDlls(ZipArchive archive)
+ {
+ return archive.Entries
+ .Where(e => Path.GetExtension(e.FullName) == ".dll"
+ // Exclude analyzers and build task, as we don't care about breaking changes there
+ && !e.FullName.Contains("analyzers/") && !e.FullName.Contains("analyzers\\")
+ && !e.Name.Contains("Avalonia.Build.Tasks"))
+ .Select(e => (
+ entry: e,
+ isRef: e.FullName.Contains("ref/") || e.FullName.Contains("ref\\"),
+ target: Path.GetDirectoryName(e.FullName)!.Split(new [] { '/', '\\' }).Last())
+ )
+ .GroupBy(e => (e.target, e.entry.Name))
+ .Select(g => g.MaxBy(e => e.isRef))
+ .Select(e => (e.target, e.entry))
+ .ToArray();
+ }
+
+ static async Task DownloadBaselinePackage(string packagePath, string baselineVersion)
+ {
+ /*
+ Gets package name from versions like:
+ Avalonia.0.10.0-preview1
+ Avalonia.11.0.999-cibuild0037534-beta
+ Avalonia.11.0.0
+ */
+ var packageId = GetPackageId(packagePath);
+ Build.Information("Downloading {0} {1} baseline package", packageId, baselineVersion);
+
+ try
+ {
+ using var response = await s_httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Get,
+ $"https://www.nuget.org/api/v2/package/{packageId}/{baselineVersion}"), HttpCompletionOption.ResponseHeadersRead);
+ response.EnsureSuccessStatusCode();
+
+ await using var stream = await response.Content.ReadAsStreamAsync();
+ var memoryStream = new MemoryStream();
+ await stream.CopyToAsync(memoryStream);
+ memoryStream.Seek(0, SeekOrigin.Begin);
+ return memoryStream;
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException($"Downloading baseline package for {packageId} {baselineVersion} failed.\r" + ex.Message, ex);
+ }
+ }
+
+ static string GetPackageId(string packagePath)
+ {
+ return Regex.Replace(
+ Path.GetFileNameWithoutExtension(packagePath),
+ """(\.\d+\.\d+\.\d+(?:-.+)?)$""", "");
+ }
+}
diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs
index 524c9fa4e4..bbfc28aa9f 100644
--- a/nukebuild/Build.cs
+++ b/nukebuild/Build.cs
@@ -36,6 +36,10 @@ using MicroCom.CodeGenerator;
partial class Build : NukeBuild
{
BuildParameters Parameters { get; set; }
+
+ [PackageExecutable("Microsoft.DotNet.ApiCompat.Tool", "Microsoft.DotNet.ApiCompat.Tool.dll", Framework = "net6.0")]
+ Tool ApiCompatTool;
+
protected override void OnBuildInitialized()
{
Parameters = new BuildParameters(this);
@@ -278,7 +282,17 @@ partial class Build : NukeBuild
RefAssemblyGenerator.GenerateRefAsmsInPackage(Parameters.NugetRoot / "Avalonia." +
Parameters.Version + ".nupkg");
});
-
+
+ Target ValidateApiDiff => _ => _
+ .DependsOn(CreateNugetPackages)
+ .Executes(async () =>
+ {
+ await Task.WhenAll(
+ Directory.GetFiles(Parameters.NugetRoot, "*.nupkg").Select(nugetPackage => ApiDiffValidation.ValidatePackage(
+ ApiCompatTool, nugetPackage, Parameters.ApiValidationBaseline,
+ Parameters.ApiValidationSuppressionFiles, Parameters.UpdateApiValidationSuppression)));
+ });
+
Target RunTests => _ => _
.DependsOn(RunCoreLibsTests)
.DependsOn(RunRenderTests)
@@ -288,7 +302,8 @@ partial class Build : NukeBuild
Target Package => _ => _
.DependsOn(RunTests)
- .DependsOn(CreateNugetPackages);
+ .DependsOn(CreateNugetPackages)
+ .DependsOn(ValidateApiDiff);
Target CiAzureLinux => _ => _
.DependsOn(RunTests);
diff --git a/nukebuild/BuildParameters.cs b/nukebuild/BuildParameters.cs
index dfa914d1db..897fdc84f1 100644
--- a/nukebuild/BuildParameters.cs
+++ b/nukebuild/BuildParameters.cs
@@ -10,18 +10,24 @@ using static Nuke.Common.IO.PathConstruction;
public partial class Build
{
- [Parameter("configuration")]
+ [Parameter(Name = "configuration")]
public string Configuration { get; set; }
- [Parameter("skip-tests")]
+ [Parameter(Name = "skip-tests")]
public bool SkipTests { get; set; }
- [Parameter("force-nuget-version")]
+ [Parameter(Name = "force-nuget-version")]
public string ForceNugetVersion { get; set; }
- [Parameter("skip-previewer")]
+ [Parameter(Name = "skip-previewer")]
public bool SkipPreviewer { get; set; }
+ [Parameter(Name = "api-baseline")]
+ public string ApiValidationBaseline { get; set; }
+
+ [Parameter(Name = "update-api-suppression")]
+ public bool? UpdateApiValidationSuppression { get; set; }
+
public class BuildParameters
{
public string Configuration { get; }
@@ -57,7 +63,9 @@ public partial class Build
public string FileZipSuffix { get; }
public AbsolutePath ZipCoreArtifacts { get; }
public AbsolutePath ZipNuGetArtifacts { get; }
-
+ public string ApiValidationBaseline { get; }
+ public bool UpdateApiValidationSuppression { get; }
+ public AbsolutePath ApiValidationSuppressionFiles { get; }
public BuildParameters(Build b)
{
@@ -103,6 +111,9 @@ public partial class Build
// VERSION
Version = b.ForceNugetVersion ?? GetVersion();
+ ApiValidationBaseline = b.ApiValidationBaseline ?? new Version(new Version(Version).Major, 0).ToString();
+ UpdateApiValidationSuppression = b.UpdateApiValidationSuppression ?? IsLocalBuild;
+
if (IsRunningOnAzure)
{
if (!IsNuGetRelease)
@@ -125,6 +136,7 @@ public partial class Build
FileZipSuffix = Version + ".zip";
ZipCoreArtifacts = ZipRoot / ("Avalonia-" + FileZipSuffix);
ZipNuGetArtifacts = ZipRoot / ("Avalonia-NuGet-" + FileZipSuffix);
+ ApiValidationSuppressionFiles = RootDirectory / "api";
}
string GetVersion()
diff --git a/nukebuild/Numerge b/nukebuild/Numerge
index aef10ae67d..9738c6121f 160000
--- a/nukebuild/Numerge
+++ b/nukebuild/Numerge
@@ -1 +1 @@
-Subproject commit aef10ae67dc55c95f49b52a505a0be33bfa297a5
+Subproject commit 9738c6121fdd143c78d3e25686a7e4e13c00f586
diff --git a/nukebuild/Shims.cs b/nukebuild/Shims.cs
index 6f79972ad6..eecfcf6da1 100644
--- a/nukebuild/Shims.cs
+++ b/nukebuild/Shims.cs
@@ -9,12 +9,12 @@ using Numerge;
public partial class Build
{
- static void Information(string info)
+ internal static void Information(string info)
{
Logger.Info(info);
}
- static void Information(string info, params object[] args)
+ internal static void Information(string info, params object[] args)
{
Logger.Info(info, args);
}
diff --git a/nukebuild/_build.csproj b/nukebuild/_build.csproj
index 30e1200220..64eccbbb3f 100644
--- a/nukebuild/_build.csproj
+++ b/nukebuild/_build.csproj
@@ -8,8 +8,8 @@
1
net7.0
-
-
+
+
@@ -22,6 +22,8 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
@@ -30,9 +32,9 @@
-
-
-
+
+
+
@@ -41,7 +43,5 @@
dirs.proj
-
-
diff --git a/packages/Avalonia/AvaloniaBuildTasks.targets b/packages/Avalonia/AvaloniaBuildTasks.targets
index 33f22f4d02..6af35ff0d2 100644
--- a/packages/Avalonia/AvaloniaBuildTasks.targets
+++ b/packages/Avalonia/AvaloniaBuildTasks.targets
@@ -144,4 +144,30 @@
+
+
+ Build
+
+
+
+
+ http://127.0.0.1:6001
+ $(OutputPath)/$(AssemblyName).dll
+ MainWindow.axaml
+ $(APreviewExecutable)
+ $([System.IO.Path]::ChangeExtension('$(APreviewExecutable)', '.deps.json'))
+ $([System.IO.Path]::ChangeExtension('$(APreviewExecutable)', '.runtimeconfig.json'))
+ $([System.IO.Path]::GetFullPath('$(APreviewFile)'))
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/readme.md b/readme.md
index c9539e1eb9..fc5e218a92 100644
--- a/readme.md
+++ b/readme.md
@@ -10,12 +10,12 @@
[Avalonia](https://avaloniaui.net) is a cross-platform UI framework for dotnet, providing a flexible styling system and supporting a wide range of platforms such as Windows, macOS, Linux, iOS, Android and WebAssembly. Avalonia is mature and production ready and is used by companies, including [Schneider Electric](https://avaloniaui.net/showcase#se), [Unity](https://avaloniaui.net/showcase#unity), [JetBrains](https://avaloniaui.net/showcase#rider) and [Github](https://avaloniaui.net/showcase#github).
-Considered by many to be the spiritual successor to WPF, Avalonia UI provides a familiar, modern development experience for XAML developers creating cross-platform applications. While Avalonia UI is [similar to WPF](https://docs.avaloniaui.net/misc/wpf), it isn't a 1:1 copy, and you'll find plenty of improvements.
+Considered by many to be the spiritual successor to WPF, Avalonia UI provides a familiar, modern development experience for XAML developers creating cross-platform applications. While Avalonia UI is [similar to WPF](https://docs.avaloniaui.net/docs/next/get-started/wpf/), it isn't a 1:1 copy, and you'll find plenty of improvements.
For those seeking a cross-platform WPF, we have created [Avalonia XPF](https://avaloniaui.net/xpf), enabling WPF applications to run on macOS and Linux with little to no code changes. Avalonia XPF is a commercial product and is licensed per-app, per-platform.
#### Roadmap
-To see the status of some of our features, please see our [Roadmap](https://github.com/AvaloniaUI/Avalonia/issues/2239).
+To see the status of some of our features, look at our [Roadmap](https://github.com/AvaloniaUI/Avalonia/issues/2239).
#### Breaking Changes
You can also see what [breaking changes](https://github.com/AvaloniaUI/Avalonia/issues/3538) we have planned and what our [past breaking changes](https://github.com/AvaloniaUI/Avalonia/wiki/Breaking-Changes) have been.
diff --git a/samples/ControlCatalog/Pages/DataGridPage.xaml b/samples/ControlCatalog/Pages/DataGridPage.xaml
index fb097da71b..356834832d 100644
--- a/samples/ControlCatalog/Pages/DataGridPage.xaml
+++ b/samples/ControlCatalog/Pages/DataGridPage.xaml
@@ -34,7 +34,7 @@
RowBackground="#1000">
-
+
@@ -68,7 +68,7 @@
-
+
diff --git a/src/Avalonia.Base/Avalonia.Base.csproj b/src/Avalonia.Base/Avalonia.Base.csproj
index ddc2b7effb..16eb09de65 100644
--- a/src/Avalonia.Base/Avalonia.Base.csproj
+++ b/src/Avalonia.Base/Avalonia.Base.csproj
@@ -43,21 +43,15 @@
-
-
-
-
-
-
diff --git a/src/Avalonia.Base/Interactivity/EventRoute.cs b/src/Avalonia.Base/Interactivity/EventRoute.cs
index 37539a7153..d0d82b4884 100644
--- a/src/Avalonia.Base/Interactivity/EventRoute.cs
+++ b/src/Avalonia.Base/Interactivity/EventRoute.cs
@@ -120,11 +120,6 @@ namespace Avalonia.Interactivity
return;
}
- if (e.Source is null)
- {
- throw new ArgumentException("Event source may not be null", nameof(e));
- }
-
Interactive? lastTarget = null;
var start = 0;
var end = _route.Count;
diff --git a/src/Avalonia.Base/Platform/Storage/PickerOptions.cs b/src/Avalonia.Base/Platform/Storage/PickerOptions.cs
index ed061aa2d5..07f99f32c8 100644
--- a/src/Avalonia.Base/Platform/Storage/PickerOptions.cs
+++ b/src/Avalonia.Base/Platform/Storage/PickerOptions.cs
@@ -6,7 +6,7 @@
public class PickerOptions
{
///
- /// Gets or sets the text that appears in the title bar of a folder dialog.
+ /// Gets or sets the text that appears in the title bar of a picker.
///
public string? Title { get; set; }
diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs
index 1021bc58b4..31cbaf2a29 100644
--- a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs
+++ b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs
@@ -1,10 +1,13 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Threading.Tasks;
using Avalonia.Metadata;
using Avalonia.Platform;
namespace Avalonia.Rendering.Composition;
+
+[NotClientImplementable]
public interface ICompositionGpuInterop
{
///
@@ -84,15 +87,22 @@ public enum CompositionGpuImportedImageSynchronizationCapabilities
///
/// An imported GPU object that's usable by composition APIs
///
+[NotClientImplementable]
public interface ICompositionGpuImportedObject : IAsyncDisposable
{
///
/// Tracks the import status of the object. Once the task is completed,
/// the user code is allowed to free the resource owner in case when a non-owning
- /// sharing handle was used
+ /// sharing handle was used.
///
Task ImportCompleted { get; }
-
+
+ ///
+ /// ImportCompleted (recommended replacement)
+ [Obsolete("Please use ICompositionGpuImportedObject.ImportCompleted instead")]
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ Task ImportCompeted { get; }
+
///
/// Indicates if the device context this instance is associated with is no longer available
///
diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs
index 9eea228e84..12a252ed96 100644
--- a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs
+++ b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs
@@ -74,6 +74,8 @@ abstract class CompositionGpuImportedObjectBase : ICompositionGpuImportedObject
public abstract void Dispose();
public Task ImportCompleted { get; }
+
+ public Task ImportCompeted => ImportCompleted;
public bool IsLost => Context.IsLost;
public ValueTask DisposeAsync() => new(Compositor.InvokeServerJobAsync(() =>
diff --git a/src/Avalonia.Base/Rendering/Composition/Drawing/ServerCompositionRenderData.cs b/src/Avalonia.Base/Rendering/Composition/Drawing/ServerCompositionRenderData.cs
index cb5e21be00..97083ccaf5 100644
--- a/src/Avalonia.Base/Rendering/Composition/Drawing/ServerCompositionRenderData.cs
+++ b/src/Avalonia.Base/Rendering/Composition/Drawing/ServerCompositionRenderData.cs
@@ -42,22 +42,31 @@ class ServerCompositionRenderData : SimpleServerRenderResource
_items.Add(reader.ReadObject());
var collector = s_resourceHashSetPool.Get();
- foreach(var item in _items)
- if (item is IRenderDataItemWithServerResources resourceItem)
- resourceItem.Collect(collector);
-
+ CollectResources(_items, collector);
+
foreach (var r in collector.Resources)
{
_referencedResources.Add(r);
r.AddObserver(this);
}
-
+
collector.Resources.Clear();
s_resourceHashSetPool.ReturnAndSetNull(ref collector);
base.DeserializeChangesCore(reader, committedAt);
}
+ private static void CollectResources(PooledInlineList items, IRenderDataServerResourcesCollector collector)
+ {
+ foreach (var item in items)
+ {
+ if (item is IRenderDataItemWithServerResources resourceItem)
+ resourceItem.Collect(collector);
+ else if (item is RenderDataPushNode pushNode)
+ CollectResources(pushNode.Children, collector);
+ }
+ }
+
public Rect? Bounds
{
get
@@ -133,4 +142,4 @@ class ServerCompositionRenderData : SimpleServerRenderResource
Reset();
base.Dispose();
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs b/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs
index 7d586e1cbd..5995a03758 100644
--- a/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs
+++ b/src/Avalonia.Base/Threading/Dispatcher.Invoke.cs
@@ -90,7 +90,7 @@ public partial class Dispatcher
{
if (callback == null)
{
- throw new ArgumentNullException("callback");
+ throw new ArgumentNullException(nameof(callback));
}
DispatcherPriority.Validate(priority, "priority");
@@ -98,7 +98,7 @@ public partial class Dispatcher
if (timeout.TotalMilliseconds < 0 &&
timeout != TimeSpan.FromMilliseconds(-1))
{
- throw new ArgumentOutOfRangeException("timeout");
+ throw new ArgumentOutOfRangeException(nameof(timeout));
}
// Fast-Path: if on the same thread, and invoking at Send priority,
@@ -212,7 +212,7 @@ public partial class Dispatcher
{
if (callback == null)
{
- throw new ArgumentNullException("callback");
+ throw new ArgumentNullException(nameof(callback));
}
DispatcherPriority.Validate(priority, "priority");
@@ -220,7 +220,7 @@ public partial class Dispatcher
if (timeout.TotalMilliseconds < 0 &&
timeout != TimeSpan.FromMilliseconds(-1))
{
- throw new ArgumentOutOfRangeException("timeout");
+ throw new ArgumentOutOfRangeException(nameof(timeout));
}
// Fast-Path: if on the same thread, and invoking at Send priority,
@@ -304,7 +304,7 @@ public partial class Dispatcher
{
if (callback == null)
{
- throw new ArgumentNullException("callback");
+ throw new ArgumentNullException(nameof(callback));
}
DispatcherPriority.Validate(priority, "priority");
@@ -379,7 +379,7 @@ public partial class Dispatcher
{
if (callback == null)
{
- throw new ArgumentNullException("callback");
+ throw new ArgumentNullException(nameof(callback));
}
DispatcherPriority.Validate(priority, "priority");
diff --git a/src/Avalonia.Base/Threading/Dispatcher.Queue.cs b/src/Avalonia.Base/Threading/Dispatcher.Queue.cs
index 829ab4cf87..1644332aea 100644
--- a/src/Avalonia.Base/Threading/Dispatcher.Queue.cs
+++ b/src/Avalonia.Base/Threading/Dispatcher.Queue.cs
@@ -9,7 +9,9 @@ public partial class Dispatcher
private readonly DispatcherPriorityQueue _queue = new();
private bool _signaled;
private bool _explicitBackgroundProcessingRequested;
- private const int MaximumTimeProcessingBackgroundJobs = 50;
+ private const int MaximumInputStarvationTimeInFallbackMode = 50;
+ private const int MaximumInputStarvationTimeInExplicitProcessingExplicitMode = 50;
+ private int _maximumInputStarvationTime;
void RequestBackgroundProcessing()
{
@@ -35,8 +37,8 @@ public partial class Dispatcher
lock (InstanceLock)
{
_explicitBackgroundProcessingRequested = false;
- ExecuteJobsCore();
}
+ ExecuteJobsCore(true);
}
///
@@ -130,10 +132,10 @@ public partial class Dispatcher
lock (InstanceLock)
_signaled = false;
- ExecuteJobsCore();
+ ExecuteJobsCore(false);
}
- void ExecuteJobsCore()
+ void ExecuteJobsCore(bool fromExplicitBackgroundProcessingCallback)
{
long? backgroundJobExecutionStartedAt = null;
while (true)
@@ -151,7 +153,6 @@ public partial class Dispatcher
if (job.Priority > DispatcherPriority.Input)
{
ExecuteJob(job);
- backgroundJobExecutionStartedAt = null;
}
// If platform supports pending input query, ask the platform if we can continue running low priority jobs
else if (_pendingInputImpl?.CanQueryPendingInput == true)
@@ -164,6 +165,13 @@ public partial class Dispatcher
return;
}
}
+ // We can't ask if the implementation has pending input, so we should let it to call us back
+ // Once it thinks that input is handled
+ else if (_backgroundProcessingImpl != null && !fromExplicitBackgroundProcessingCallback)
+ {
+ RequestBackgroundProcessing();
+ return;
+ }
// We can't check if there is pending input, but still need to enforce interactivity
// so we stop processing background jobs after some timeout and start a timer to continue later
else
@@ -171,7 +179,7 @@ public partial class Dispatcher
if (backgroundJobExecutionStartedAt == null)
backgroundJobExecutionStartedAt = Now;
- if (Now - backgroundJobExecutionStartedAt.Value > MaximumTimeProcessingBackgroundJobs)
+ if (Now - backgroundJobExecutionStartedAt.Value > _maximumInputStarvationTime)
{
_signaled = true;
RequestBackgroundProcessing();
diff --git a/src/Avalonia.Base/Threading/Dispatcher.Timers.cs b/src/Avalonia.Base/Threading/Dispatcher.Timers.cs
index bb252b7f55..51408daad1 100644
--- a/src/Avalonia.Base/Threading/Dispatcher.Timers.cs
+++ b/src/Avalonia.Base/Threading/Dispatcher.Timers.cs
@@ -127,7 +127,7 @@ public partial class Dispatcher
if (needToPromoteTimers)
PromoteTimers();
if (needToProcessQueue)
- ExecuteJobsCore();
+ ExecuteJobsCore(false);
UpdateOSTimer();
}
diff --git a/src/Avalonia.Base/Threading/Dispatcher.cs b/src/Avalonia.Base/Threading/Dispatcher.cs
index f257072dc8..46c6699b5a 100644
--- a/src/Avalonia.Base/Threading/Dispatcher.cs
+++ b/src/Avalonia.Base/Threading/Dispatcher.cs
@@ -34,6 +34,9 @@ public partial class Dispatcher : IDispatcher
_controlledImpl = _impl as IControlledDispatcherImpl;
_pendingInputImpl = _impl as IDispatcherImplWithPendingInput;
_backgroundProcessingImpl = _impl as IDispatcherImplWithExplicitBackgroundProcessing;
+ _maximumInputStarvationTime = _backgroundProcessingImpl == null ?
+ MaximumInputStarvationTimeInFallbackMode :
+ MaximumInputStarvationTimeInExplicitProcessingExplicitMode;
if (_backgroundProcessingImpl != null)
_backgroundProcessingImpl.ReadyForBackgroundProcessing += OnReadyForExplicitBackgroundProcessing;
}
diff --git a/src/Avalonia.Base/Threading/DispatcherFrame.cs b/src/Avalonia.Base/Threading/DispatcherFrame.cs
index e826432475..1a80740420 100644
--- a/src/Avalonia.Base/Threading/DispatcherFrame.cs
+++ b/src/Avalonia.Base/Threading/DispatcherFrame.cs
@@ -38,10 +38,14 @@ public class DispatcherFrame
/// for their important criteria to be met. These frames
/// should have a timeout associated with them.
///
- public DispatcherFrame(bool exitWhenRequested)
+ public DispatcherFrame(bool exitWhenRequested) : this(Dispatcher.UIThread, exitWhenRequested)
{
- Dispatcher = Dispatcher.UIThread;
Dispatcher.VerifyAccess();
+ }
+
+ internal DispatcherFrame(Dispatcher dispatcher, bool exitWhenRequested)
+ {
+ Dispatcher = dispatcher;
_exitWhenRequested = exitWhenRequested;
_continue = true;
}
diff --git a/src/Avalonia.Base/Threading/DispatcherTimer.cs b/src/Avalonia.Base/Threading/DispatcherTimer.cs
index 879d9d8a5f..fbdeed4edc 100644
--- a/src/Avalonia.Base/Threading/DispatcherTimer.cs
+++ b/src/Avalonia.Base/Threading/DispatcherTimer.cs
@@ -62,7 +62,7 @@ public partial class DispatcherTimer
{
if (callback == null)
{
- throw new ArgumentNullException("callback");
+ throw new ArgumentNullException(nameof(callback));
}
Tick += callback;
@@ -112,11 +112,11 @@ public partial class DispatcherTimer
bool updateOSTimer = false;
if (value.TotalMilliseconds < 0)
- throw new ArgumentOutOfRangeException("value",
+ throw new ArgumentOutOfRangeException(nameof(value),
"TimeSpan period must be greater than or equal to zero.");
if (value.TotalMilliseconds > Int32.MaxValue)
- throw new ArgumentOutOfRangeException("value",
+ throw new ArgumentOutOfRangeException(nameof(value),
"TimeSpan period must be less than or equal to Int32.MaxValue.");
lock (_instanceLock)
@@ -253,20 +253,20 @@ public partial class DispatcherTimer
{
if (dispatcher == null)
{
- throw new ArgumentNullException("dispatcher");
+ throw new ArgumentNullException(nameof(dispatcher));
}
DispatcherPriority.Validate(priority, "priority");
if (priority == DispatcherPriority.Inactive)
{
- throw new ArgumentException("Specified priority is not valid.", "priority");
+ throw new ArgumentException("Specified priority is not valid.", nameof(priority));
}
if (interval.TotalMilliseconds < 0)
- throw new ArgumentOutOfRangeException("interval", "TimeSpan period must be greater than or equal to zero.");
+ throw new ArgumentOutOfRangeException(nameof(interval), "TimeSpan period must be greater than or equal to zero.");
if (interval.TotalMilliseconds > Int32.MaxValue)
- throw new ArgumentOutOfRangeException("interval",
+ throw new ArgumentOutOfRangeException(nameof(interval),
"TimeSpan period must be less than or equal to Int32.MaxValue.");
@@ -349,4 +349,4 @@ public partial class DispatcherTimer
// used by Dispatcher
internal long DueTimeInMs { get; private set; }
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Base/Utilities/SmallDictionary.cs b/src/Avalonia.Base/Utilities/SmallDictionary.cs
index b6e62411da..1e63d554b4 100644
--- a/src/Avalonia.Base/Utilities/SmallDictionary.cs
+++ b/src/Avalonia.Base/Utilities/SmallDictionary.cs
@@ -51,7 +51,7 @@ internal struct InlineDictionary : IEnumerable : IEnumerable()
@@ -353,10 +353,16 @@ namespace Avalonia.Build.Tasks
((List)parsedXamlDocuments).Add(new XamlDocumentResource(
parsed, res.Uri, res, classType,
classModifierPublic.Value,
- populateBuilder,
- compiler.DefinePopulateMethod(populateBuilder, parsed, populateName,
- classTypeDefinition == null && classModifierPublic.Value),
- buildName == null ? null : compiler.DefineBuildMethod(builder, parsed, buildName, classModifierPublic.Value)));
+ () => new XamlDocumentTypeBuilderProvider(
+ populateBuilder,
+ compiler.DefinePopulateMethod(
+ populateBuilder,
+ parsed,
+ populateName,
+ classTypeDefinition == null && classModifierPublic.Value),
+ buildName == null ?
+ null :
+ compiler.DefineBuildMethod(builder, parsed, buildName, classModifierPublic.Value))));
}
catch (Exception e)
{
@@ -387,10 +393,17 @@ namespace Avalonia.Build.Tasks
foreach (var document in parsedXamlDocuments)
{
+ var res = (IResource)document.FileSource!;
+
+ if (document.Usage == XamlDocumentUsage.Merged && !document.IsPublic)
+ {
+ res.Remove();
+ continue;
+ }
+
var parsed = document.XamlDocument;
- var res = (IResource)document.FileSource;
var classType = document.ClassType;
- var populateBuilder = document.TypeBuilder;
+ var populateBuilder = document.TypeBuilderProvider.TypeBuilder;
try
{
@@ -399,8 +412,8 @@ namespace Avalonia.Build.Tasks
compiler.Compile(parsed,
contextClass,
- document.PopulateMethod,
- document.BuildMethod,
+ document.TypeBuilderProvider.PopulateMethod,
+ document.TypeBuilderProvider.BuildMethod,
builder.DefineSubType(compilerConfig.WellKnownTypes.Object, "NamespaceInfo:" + res.Name, true),
(closureName, closureBaseType) =>
populateBuilder.DefineSubType(closureBaseType, closureName, false),
@@ -412,7 +425,7 @@ namespace Avalonia.Build.Tasks
if (classTypeDefinition != null)
{
var compiledPopulateMethod = typeSystem.GetTypeReference(populateBuilder).Resolve()
- .Methods.First(m => m.Name == document.PopulateMethod.Name);
+ .Methods.First(m => m.Name == document.TypeBuilderProvider.PopulateMethod.Name);
var designLoaderFieldType = typeSystem
.GetType("System.Action`1")
@@ -536,12 +549,12 @@ namespace Avalonia.Build.Tasks
}
if (document.IsPublic
- && (document.BuildMethod != null || classTypeDefinition != null))
+ && (document.TypeBuilderProvider.BuildMethod != null || classTypeDefinition != null))
{
- var compiledBuildMethod = document.BuildMethod == null ?
+ var compiledBuildMethod = document.TypeBuilderProvider.BuildMethod is not { } buildMethod ?
null :
typeSystem.GetTypeReference(builder).Resolve()
- .Methods.First(m => m.Name == document.BuildMethod?.Name);
+ .Methods.First(m => m.Name == buildMethod.Name);
var parameterlessConstructor = compiledBuildMethod != null ?
null :
classTypeDefinition.GetConstructors().FirstOrDefault(c =>
diff --git a/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs b/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs
index 30517f4b00..0026c9e074 100644
--- a/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs
+++ b/src/Avalonia.Controls.DataGrid/Collections/DataGridCollectionView.cs
@@ -807,7 +807,7 @@ namespace Avalonia.Collections
{
if (value < 0)
{
- throw new ArgumentOutOfRangeException("PageSize cannot have a negative value.");
+ throw new ArgumentOutOfRangeException(nameof(value), "PageSize cannot have a negative value.");
}
// if the Refresh is currently deferred, cache the desired PageSize
@@ -1954,7 +1954,7 @@ namespace Avalonia.Collections
// for indices larger than the count
if (index >= Count || index < 0)
{
- throw new ArgumentOutOfRangeException("index");
+ throw new ArgumentOutOfRangeException(nameof(index));
}
if (IsGrouping)
diff --git a/src/Avalonia.Controls.DataGrid/DataGridCheckBoxColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridCheckBoxColumn.cs
index 5d080f5ef6..b2deb1c26e 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridCheckBoxColumn.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridCheckBoxColumn.cs
@@ -222,7 +222,7 @@ namespace Avalonia.Controls
{
if (element == null)
{
- throw new ArgumentNullException("element");
+ throw new ArgumentNullException(nameof(element));
}
if (element is CheckBox checkBox)
{
diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs b/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs
index e7f9a9a6c4..798228c84c 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridColumnCollection.cs
@@ -191,7 +191,7 @@ namespace Avalonia.Controls
}
if (dataGridColumn == null)
{
- throw new ArgumentNullException("dataGridColumn");
+ throw new ArgumentNullException(nameof(dataGridColumn));
}
int columnIndexWithFiller = columnIndex;
diff --git a/src/Avalonia.Controls.DataGrid/DataGridLength.cs b/src/Avalonia.Controls.DataGrid/DataGridLength.cs
index 4841ddd494..a193352f52 100644
--- a/src/Avalonia.Controls.DataGrid/DataGridLength.cs
+++ b/src/Avalonia.Controls.DataGrid/DataGridLength.cs
@@ -499,7 +499,7 @@ namespace Avalonia.Controls
{
if (destinationType == null)
{
- throw new ArgumentNullException("destinationType");
+ throw new ArgumentNullException(nameof(destinationType));
}
if (destinationType != typeof(string))
{
diff --git a/src/Avalonia.Controls/Automation/Peers/ControlAutomationPeer.cs b/src/Avalonia.Controls/Automation/Peers/ControlAutomationPeer.cs
index 756951667b..c19d887230 100644
--- a/src/Avalonia.Controls/Automation/Peers/ControlAutomationPeer.cs
+++ b/src/Avalonia.Controls/Automation/Peers/ControlAutomationPeer.cs
@@ -18,7 +18,7 @@ namespace Avalonia.Automation.Peers
public ControlAutomationPeer(Control owner)
{
- Owner = owner ?? throw new ArgumentNullException("owner");
+ Owner = owner ?? throw new ArgumentNullException(nameof(owner));
Initialize();
}
diff --git a/src/Avalonia.Controls/Automation/Peers/ScrollViewerAutomationPeer.cs b/src/Avalonia.Controls/Automation/Peers/ScrollViewerAutomationPeer.cs
index 835ed1c4af..674eb9a241 100644
--- a/src/Avalonia.Controls/Automation/Peers/ScrollViewerAutomationPeer.cs
+++ b/src/Avalonia.Controls/Automation/Peers/ScrollViewerAutomationPeer.cs
@@ -146,12 +146,12 @@ namespace Avalonia.Automation.Peers
if (scrollHorizontally && (horizontalPercent < 0.0) || (horizontalPercent > 100.0))
{
- throw new ArgumentOutOfRangeException("horizontalPercent");
+ throw new ArgumentOutOfRangeException(nameof(horizontalPercent));
}
if (scrollVertically && (verticalPercent < 0.0) || (verticalPercent > 100.0))
{
- throw new ArgumentOutOfRangeException("verticalPercent");
+ throw new ArgumentOutOfRangeException(nameof(verticalPercent));
}
var offset = Owner.Offset;
diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs
index bce1a3685f..bd05d4947c 100644
--- a/src/Avalonia.Controls/ComboBox.cs
+++ b/src/Avalonia.Controls/ComboBox.cs
@@ -270,6 +270,7 @@ namespace Avalonia.Controls
{
if (_popup?.IsInsidePopup(source) == true)
{
+ e.Handled = true;
return;
}
}
@@ -516,5 +517,14 @@ namespace Avalonia.Controls
}
}
}
+
+ ///
+ /// Clears the selection
+ ///
+ public void Clear()
+ {
+ SelectedItem = null;
+ SelectedIndex = -1;
+ }
}
}
diff --git a/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs b/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs
index 69b0ffe9a6..5a5c3fdf1d 100644
--- a/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs
+++ b/src/Avalonia.Controls/DateTimePickers/DateTimePickerPanel.cs
@@ -165,7 +165,7 @@ namespace Avalonia.Controls.Primitives
set
{
if (value > MaximumValue || value < MinimumValue)
- throw new ArgumentOutOfRangeException("SelectedValue");
+ throw new ArgumentOutOfRangeException(nameof(value));
var sel = CoerceSelected(value);
_selectedValue = sel;
@@ -195,7 +195,7 @@ namespace Avalonia.Controls.Primitives
set
{
if (value <= 0 || value > _range)
- throw new ArgumentOutOfRangeException("Increment");
+ throw new ArgumentOutOfRangeException(nameof(value));
_increment = value;
UpdateHelperInfo();
var sel = CoerceSelected(SelectedValue);
diff --git a/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs b/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs
index b5be12fa54..30f9d8f380 100644
--- a/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs
+++ b/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs
@@ -1113,11 +1113,11 @@ namespace Avalonia.Controls
}
if (value < Minimum)
{
- throw new ArgumentOutOfRangeException(nameof(value), string.Format("Value must be greater than Minimum value of {0}", Minimum));
+ throw new ArgumentOutOfRangeException(nameof(value), $"Value must be greater than Minimum value of {Minimum}");
}
else if (value > Maximum)
{
- throw new ArgumentOutOfRangeException(nameof(value), string.Format("Value must be less than Maximum value of {0}", Maximum));
+ throw new ArgumentOutOfRangeException(nameof(value), $"Value must be less than Maximum value of {Maximum}");
}
}
diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
index e22d03273a..66ed1a27e2 100644
--- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
@@ -1395,10 +1395,8 @@ namespace Avalonia.Controls.Primitives
public object Evaluate(object? dataContext)
{
- dataContext = dataContext ?? throw new ArgumentNullException(nameof(dataContext));
-
// Only update the DataContext if necessary
- if (!dataContext.Equals(DataContext))
+ if (!Equals(dataContext, DataContext))
DataContext = dataContext;
return GetValue(ValueProperty);
diff --git a/src/Avalonia.Controls/PullToRefresh/ScrollViewerIRefreshInfoProviderAdapter.cs b/src/Avalonia.Controls/PullToRefresh/ScrollViewerIRefreshInfoProviderAdapter.cs
index 4c1e0c2565..7ff02711d6 100644
--- a/src/Avalonia.Controls/PullToRefresh/ScrollViewerIRefreshInfoProviderAdapter.cs
+++ b/src/Avalonia.Controls/PullToRefresh/ScrollViewerIRefreshInfoProviderAdapter.cs
@@ -98,14 +98,14 @@ namespace Avalonia.Controls.PullToRefresh
if (_scrollViewer.Content == null)
{
- throw new ArgumentException(nameof(adaptee), "Adaptee's content property cannot be null.");
+ throw new ArgumentException("Adaptee's content property cannot be null.", nameof(adaptee));
}
var content = adaptee.Content as Visual;
if (content == null)
{
- throw new ArgumentException(nameof(adaptee), "Adaptee's content property must be a Visual");
+ throw new ArgumentException("Adaptee's content property must be a Visual", nameof(adaptee));
}
if (content.GetVisualParent() == null)
@@ -118,7 +118,7 @@ namespace Avalonia.Controls.PullToRefresh
if (content.Parent is not InputElement)
{
- throw new ArgumentException(nameof(adaptee), "Adaptee's content's parent must be a InputElement");
+ throw new ArgumentException("Adaptee's content's parent must be a InputElement", nameof(adaptee));
}
}
@@ -194,12 +194,12 @@ namespace Avalonia.Controls.PullToRefresh
var content = _scrollViewer?.Content as Visual;
if (content == null)
{
- throw new ArgumentException(nameof(_scrollViewer), "Adaptee's content property must be a Visual");
+ throw new ArgumentException("Adaptee's content property must be a Visual", nameof(_scrollViewer));
}
if (content.Parent is not InputElement parent)
{
- throw new ArgumentException(nameof(_scrollViewer), "Adaptee's content parent must be an InputElement");
+ throw new ArgumentException("Adaptee's content parent must be an InputElement", nameof(_scrollViewer));
}
MakeInteractionSource(parent);
diff --git a/src/Avalonia.Controls/Utils/StringUtils.cs b/src/Avalonia.Controls/Utils/StringUtils.cs
index 2ea47b442a..0ae1ef0b97 100644
--- a/src/Avalonia.Controls/Utils/StringUtils.cs
+++ b/src/Avalonia.Controls/Utils/StringUtils.cs
@@ -76,7 +76,7 @@ namespace Avalonia.Controls.Utils
}
var codepoint = new Codepoint(text[index]);
-
+
if (!codepoint.IsWhiteSpace)
{
return false;
@@ -85,12 +85,20 @@ namespace Avalonia.Controls.Utils
// preceeded by lwsp.
if (index > 0)
{
- var nextCodePoint = new Codepoint(text[index + 1]);
+ if (index + 1 < text.Length)
+ {
+ var nextCodePoint = new Codepoint(text[index + 1]);
- if (nextCodePoint.IsBreakChar)
+ if (nextCodePoint.IsBreakChar)
+ {
+ return true;
+ }
+ }
+ else
{
return true;
}
+
}
switch (codepoint.GeneralCategory)
@@ -125,7 +133,7 @@ namespace Avalonia.Controls.Utils
}
cursor = Math.Min(cursor, text.Length);
-
+
int begin;
int i;
int cr;
@@ -181,7 +189,7 @@ namespace Avalonia.Controls.Utils
{
return cursor;
}
-
+
if (cr < text.Length && text[cr] == '\r' && cr + 1 < text.Length && text[cr + 1] == '\n')
{
lf = cr + 1;
@@ -214,9 +222,9 @@ namespace Avalonia.Controls.Utils
{
return i;
}
-
+
var cc = GetCharClass(text[i]);
-
+
// skip over the word, punctuation, or run of whitespace
while (i < cr && GetCharClass(text[i]) == cc)
{
diff --git a/src/Avalonia.Controls/Utils/VirtualizingSnapPointsList.cs b/src/Avalonia.Controls/Utils/VirtualizingSnapPointsList.cs
index f92756c59b..eaf501b45f 100644
--- a/src/Avalonia.Controls/Utils/VirtualizingSnapPointsList.cs
+++ b/src/Avalonia.Controls/Utils/VirtualizingSnapPointsList.cs
@@ -39,7 +39,7 @@ namespace Avalonia.Controls.Utils
get
{
if(index < 0 || index >= Count)
- throw new ArgumentOutOfRangeException("index");
+ throw new ArgumentOutOfRangeException(nameof(index));
index += _start;
diff --git a/src/Avalonia.Native/NativePlatformSettings.cs b/src/Avalonia.Native/NativePlatformSettings.cs
index 53d3da0378..42d05d831c 100644
--- a/src/Avalonia.Native/NativePlatformSettings.cs
+++ b/src/Avalonia.Native/NativePlatformSettings.cs
@@ -23,7 +23,7 @@ internal class NativePlatformSettings : DefaultPlatformSettings
AvnPlatformThemeVariant.Dark => (PlatformThemeVariant.Dark, ColorContrastPreference.NoPreference),
AvnPlatformThemeVariant.Light => (PlatformThemeVariant.Light, ColorContrastPreference.NoPreference),
AvnPlatformThemeVariant.HighContrastDark => (PlatformThemeVariant.Dark, ColorContrastPreference.High),
- AvnPlatformThemeVariant.HighContrastLight => (PlatformThemeVariant.Dark, ColorContrastPreference.High),
+ AvnPlatformThemeVariant.HighContrastLight => (PlatformThemeVariant.Light, ColorContrastPreference.High),
_ => throw new ArgumentOutOfRangeException()
};
var color = _platformSettings.AccentColor;
diff --git a/src/Avalonia.Remote.Protocol/MetsysBson.cs b/src/Avalonia.Remote.Protocol/MetsysBson.cs
index 8966dd4206..9c5f92b6ac 100644
--- a/src/Avalonia.Remote.Protocol/MetsysBson.cs
+++ b/src/Avalonia.Remote.Protocol/MetsysBson.cs
@@ -752,7 +752,7 @@ namespace Metsys.Bson
if (memberExpression.Expression.NodeType != ExpressionType.Parameter && memberExpression.Expression.NodeType != ExpressionType.Convert)
{
- throw new ArgumentException(string.Format("Expression '{0}' must resolve to top-level member.", lambdaExpression), nameof(lambdaExpression));
+ throw new ArgumentException($"Expression '{lambdaExpression}' must resolve to top-level member.", nameof(lambdaExpression));
}
return memberExpression.Member.Name;
default:
@@ -942,7 +942,7 @@ namespace Metsys.Bson
return new ListWrapper();
}
}
- throw new BsonException(string.Format("Collection of type {0} cannot be deserialized", type.FullName));
+ throw new BsonException($"Collection of type {type.FullName} cannot be deserialized");
}
public abstract void Add(object value);
@@ -1514,7 +1514,7 @@ namespace Metsys.Bson.Configuration
result = Visit((MemberExpression)expression.Left);
}
var index = Expression.Lambda(expression.Right).Compile().DynamicInvoke();
- return result + string.Format("[{0}]", index);
+ return result + $"[{index}]";
}
private string Visit(MemberExpression expression)
@@ -1540,7 +1540,7 @@ namespace Metsys.Bson.Configuration
if (expression.Method.Name == "get_Item" && expression.Arguments.Count == 1)
{
var index = Expression.Lambda(expression.Arguments[0]).Compile().DynamicInvoke();
- name += string.Format("[{0}]", index);
+ name += $"[{index}]";
}
return name;
}
diff --git a/src/Avalonia.X11/X11Clipboard.cs b/src/Avalonia.X11/X11Clipboard.cs
index 6e18151fae..637d44d617 100644
--- a/src/Avalonia.X11/X11Clipboard.cs
+++ b/src/Avalonia.X11/X11Clipboard.cs
@@ -14,6 +14,7 @@ namespace Avalonia.X11
private readonly X11Info _x11;
private IDataObject _storedDataObject;
private IntPtr _handle;
+ private TaskCompletionSource _storeAtomTcs;
private TaskCompletionSource _requestedFormatsTcs;
private TaskCompletionSource