Browse Source

Merge pull request #7172 from AvaloniaUI/fixes/enable-existing-nullable-errors

Enable nullable warnings as errors on projects which enabled Nullable Reference Types
release/0.10.11
Max Katz 5 years ago
committed by Dan Walmsley
parent
commit
6ce40791a4
  1. 11
      build/NullableEnable.props
  2. 2
      src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj
  3. 2
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/AvaloniaPropertyViewModel.cs
  4. 2
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/ClrPropertyViewModel.cs
  5. 2
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs
  6. 11
      src/Avalonia.Diagnostics/Diagnostics/ViewModels/PropertyViewModel.cs
  7. 6
      src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs
  8. 10
      src/Avalonia.Input/AccessKeyHandler.cs
  9. 2
      src/Avalonia.Input/Avalonia.Input.csproj
  10. 5
      src/Avalonia.Input/FocusManager.cs
  11. 2
      src/Avalonia.Input/KeyboardNavigationHandler.cs
  12. 13
      src/Avalonia.Input/MouseDevice.cs
  13. 2
      src/Avalonia.Input/Pointer.cs
  14. 5
      src/Avalonia.Input/TextInput/InputMethodManager.cs
  15. 6
      src/Avalonia.Input/TextInput/TransformTrackingHelper.cs
  16. 2
      src/Avalonia.Interactivity/Avalonia.Interactivity.csproj
  17. 4
      src/Avalonia.Interactivity/RoutedEvent.cs
  18. 3
      src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj
  19. 3
      src/Markup/Avalonia.Markup/Avalonia.Markup.csproj
  20. 2
      src/Markup/Avalonia.Markup/Data/BindingBase.cs
  21. 4
      src/Markup/Avalonia.Markup/Data/TemplateBinding.cs
  22. 4
      src/Markup/Avalonia.Markup/Markup/Data/DelayedBinding.cs
  23. 2
      src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs
  24. 46
      src/Shared/PlatformSupport/AssetLoader.cs
  25. 4
      src/Web/Avalonia.Web.Blazor/Avalonia.Web.Blazor.csproj
  26. 9
      src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs

11
build/NullableEnable.props

@ -0,0 +1,11 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--
The Nullable annotations on netstandard2.0 are incomplete and incorrect in places. Ignore
nullable warnings on netstandard2.0 and make them errors on later target frameworks.
-->
<PropertyGroup>
<Nullable>enable</Nullable>
<WarningsAsErrors Condition="'$(TargetFramework)' != 'netstandard2.0'">$(WarningsAsErrors);nullable</WarningsAsErrors>
<NoWarn Condition="'$(TargetFramework)' == 'netstandard2.0'">$(NoWarn);nullable</NoWarn>
</PropertyGroup>
</Project>

2
src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj

@ -3,7 +3,6 @@
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>Avalonia</RootNamespace>
<PackageId>Avalonia.Diagnostics</PackageId>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Compile Update="**\*.xaml.cs">
@ -34,4 +33,5 @@
<Import Project="..\..\build\Rx.props" />
<Import Project="..\..\build\BuildTargets.targets" />
<Import Project="..\..\build\ApiDiff.props" />
<Import Project="..\..\build\NullableEnable.props" />
</Project>

2
src/Avalonia.Diagnostics/Diagnostics/ViewModels/AvaloniaPropertyViewModel.cs

@ -34,7 +34,7 @@ namespace Avalonia.Diagnostics.ViewModels
public override System.Type Type => _type;
public override string Value
public override string? Value
{
get => ConvertToString(_value);
set

2
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ClrPropertyViewModel.cs

@ -35,7 +35,7 @@ namespace Avalonia.Diagnostics.ViewModels
public override System.Type Type => _type;
public override string Value
public override string? Value
{
get => ConvertToString(_value);
set

2
src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs

@ -437,7 +437,7 @@ namespace Avalonia.Diagnostics.ViewModels
}
}
protected void NavigateToProperty(object o, string entityName)
protected void NavigateToProperty(object o, string? entityName)
{
var oldSelectedEntity = SelectedEntity;
if (oldSelectedEntity is IAvaloniaObject ao1)

11
src/Avalonia.Diagnostics/Diagnostics/ViewModels/PropertyViewModel.cs

@ -16,12 +16,12 @@ namespace Avalonia.Diagnostics.ViewModels
public abstract string Group { get; }
public abstract Type Type { get; }
public abstract Type? DeclaringType { get; }
public abstract string Value { get; set; }
public abstract string? Value { get; set; }
public abstract string Priority { get; }
public abstract bool? IsAttached { get; }
public abstract void Update();
protected static string ConvertToString(object? value)
protected static string? ConvertToString(object? value)
{
if (value is null)
{
@ -59,8 +59,13 @@ namespace Avalonia.Diagnostics.ViewModels
throw new InvalidCastException("Unable to convert value.");
}
protected static object? ConvertFromString(string s, Type targetType)
protected static object? ConvertFromString(string? s, Type targetType)
{
if (s is null)
{
return null;
}
var converter = TypeDescriptor.GetConverter(targetType);
if (converter.CanConvertFrom(typeof(string)))

6
src/Avalonia.Diagnostics/Diagnostics/Views/MainWindow.xaml.cs

@ -17,7 +17,7 @@ namespace Avalonia.Diagnostics.Views
{
internal class MainWindow : Window, IStyleHost
{
private readonly IDisposable _keySubscription;
private readonly IDisposable? _keySubscription;
private readonly Dictionary<Popup, IDisposable> _frozenPopupStates;
private TopLevel? _root;
@ -25,7 +25,7 @@ namespace Avalonia.Diagnostics.Views
{
InitializeComponent();
_keySubscription = InputManager.Instance.Process
_keySubscription = InputManager.Instance?.Process
.OfType<RawKeyEventArgs>()
.Where(x => x.Type == RawKeyEventType.KeyDown)
.Subscribe(RawKeyDown);
@ -82,7 +82,7 @@ namespace Avalonia.Diagnostics.Views
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
_keySubscription.Dispose();
_keySubscription?.Dispose();
foreach (var state in _frozenPopupStates)
{

10
src/Avalonia.Input/AccessKeyHandler.cs

@ -133,7 +133,7 @@ namespace Avalonia.Input
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param>
protected virtual void OnPreviewKeyDown(object sender, KeyEventArgs e)
protected virtual void OnPreviewKeyDown(object? sender, KeyEventArgs e)
{
if (e.Key == Key.LeftAlt || e.Key == Key.RightAlt)
{
@ -172,7 +172,7 @@ namespace Avalonia.Input
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param>
protected virtual void OnKeyDown(object sender, KeyEventArgs e)
protected virtual void OnKeyDown(object? sender, KeyEventArgs e)
{
bool menuIsOpen = MainMenu?.IsOpen == true;
@ -207,7 +207,7 @@ namespace Avalonia.Input
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param>
protected virtual void OnPreviewKeyUp(object sender, KeyEventArgs e)
protected virtual void OnPreviewKeyUp(object? sender, KeyEventArgs e)
{
switch (e.Key)
{
@ -234,7 +234,7 @@ namespace Avalonia.Input
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param>
protected virtual void OnPreviewPointerPressed(object sender, PointerEventArgs e)
protected virtual void OnPreviewPointerPressed(object? sender, PointerEventArgs e)
{
if (_showingAccessKeys)
{
@ -251,7 +251,7 @@ namespace Avalonia.Input
_owner!.ShowAccessKeys = _showingAccessKeys = false;
}
private void MainMenuClosed(object sender, EventArgs e)
private void MainMenuClosed(object? sender, EventArgs e)
{
_owner!.ShowAccessKeys = false;
}

2
src/Avalonia.Input/Avalonia.Input.csproj

@ -2,6 +2,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Nullable>Enable</Nullable>
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\Avalonia.Base\Metadata\NullableAttributes.cs" Link="NullableAttributes.cs" />
@ -15,4 +16,5 @@
</ItemGroup>
<Import Project="..\..\build\Rx.props" />
<Import Project="..\..\build\ApiDiff.props" />
<Import Project="..\..\build\NullableEnable.props" />
</Project>

5
src/Avalonia.Input/FocusManager.cs

@ -215,8 +215,11 @@ namespace Avalonia.Input
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param>
private static void OnPreviewPointerPressed(object sender, RoutedEventArgs e)
private static void OnPreviewPointerPressed(object? sender, RoutedEventArgs e)
{
if (sender is null)
return;
var ev = (PointerPressedEventArgs)e;
var visual = (IVisual)sender;

2
src/Avalonia.Input/KeyboardNavigationHandler.cs

@ -98,7 +98,7 @@ namespace Avalonia.Input
/// </summary>
/// <param name="sender">The event sender.</param>
/// <param name="e">The event args.</param>
protected virtual void OnKeyDown(object sender, KeyEventArgs e)
protected virtual void OnKeyDown(object? sender, KeyEventArgs e)
{
var current = FocusManager.Instance.Current;

13
src/Avalonia.Input/MouseDevice.cs

@ -298,10 +298,10 @@ namespace Avalonia.Input
root = root ?? throw new ArgumentNullException(nameof(root));
var hit = HitTest(root, p);
var source = GetSource(hit);
if (hit != null)
if (source is not null)
{
var source = GetSource(hit);
var e = new PointerReleasedEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers,
_lastMouseDownButton);
@ -321,10 +321,10 @@ namespace Avalonia.Input
root = root ?? throw new ArgumentNullException(nameof(root));
var hit = HitTest(root, p);
var source = GetSource(hit);
if (hit != null)
if (source is not null)
{
var source = GetSource(hit);
var e = new PointerWheelEventArgs(source, _pointer, root, p, timestamp, props, inputModifiers, delta);
source?.RaiseEvent(e);
@ -334,9 +334,10 @@ namespace Avalonia.Input
return false;
}
private IInteractive GetSource(IVisual hit)
private IInteractive? GetSource(IVisual? hit)
{
hit = hit ?? throw new ArgumentNullException(nameof(hit));
if (hit is null)
return null;
return _pointer.Captured ??
(hit as IInteractive) ??

2
src/Avalonia.Input/Pointer.cs

@ -59,7 +59,7 @@ namespace Avalonia.Input
return parent as IInputElement ?? parent.FindAncestorOfType<IInputElement>();
}
private void OnCaptureDetached(object sender, VisualTreeAttachmentEventArgs e)
private void OnCaptureDetached(object? sender, VisualTreeAttachmentEventArgs e)
{
Capture(GetNextCapture(e.Parent));
}

5
src/Avalonia.Input/TextInput/InputMethodManager.cs

@ -8,7 +8,6 @@ namespace Avalonia.Input.TextInput
private ITextInputMethodImpl? _im;
private IInputElement? _focusedElement;
private ITextInputMethodClient? _client;
private IDisposable? _subscribeDisposable;
private readonly TransformTrackingHelper _transformTracker = new TransformTrackingHelper();
public TextInputMethodManager()
@ -64,7 +63,7 @@ namespace Avalonia.Input.TextInput
}
}
private void OnTextViewVisualChanged(object sender, EventArgs e)
private void OnTextViewVisualChanged(object? sender, EventArgs e)
=> _transformTracker.SetVisual(_client?.TextViewVisual);
private void UpdateCursorRect()
@ -79,7 +78,7 @@ namespace Avalonia.Input.TextInput
_im.SetCursorRect(_client.CursorRectangle.TransformToAABB(transform.Value));
}
private void OnCursorRectangleChanged(object sender, EventArgs e)
private void OnCursorRectangleChanged(object? sender, EventArgs e)
{
if (sender == _client)
UpdateCursorRect();

6
src/Avalonia.Input/TextInput/TransformTrackingHelper.cs

@ -80,7 +80,7 @@ namespace Avalonia.Input.TextInput
}
}
private void OnAttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs visualTreeAttachmentEventArgs)
private void OnAttachedToVisualTree(object? sender, VisualTreeAttachmentEventArgs visualTreeAttachmentEventArgs)
{
SubscribeToParents();
UpdateMatrix();
@ -94,13 +94,13 @@ namespace Avalonia.Input.TextInput
Dispatcher.UIThread.Post(UpdateMatrix, DispatcherPriority.Render);
}
private void PropertyChangedHandler(object sender, AvaloniaPropertyChangedEventArgs e)
private void PropertyChangedHandler(object? sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.IsEffectiveValueChange && e.Property == Visual.BoundsProperty)
EnqueueForUpdate();
}
private void OnDetachedFromVisualTree(object sender, VisualTreeAttachmentEventArgs visualTreeAttachmentEventArgs)
private void OnDetachedFromVisualTree(object? sender, VisualTreeAttachmentEventArgs visualTreeAttachmentEventArgs)
{
UnsubscribeFromParents();
UpdateMatrix();

2
src/Avalonia.Interactivity/Avalonia.Interactivity.csproj

@ -3,6 +3,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<Nullable>Enable</Nullable>
<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Avalonia.Animation\Avalonia.Animation.csproj" />
@ -12,4 +13,5 @@
</ItemGroup>
<Import Project="..\..\build\Rx.props" />
<Import Project="..\..\build\ApiDiff.props" />
<Import Project="..\..\build\NullableEnable.props" />
</Project>

4
src/Avalonia.Interactivity/RoutedEvent.cs

@ -120,7 +120,7 @@ namespace Avalonia.Interactivity
bool handledEventsToo = false)
where TTarget : class, IInteractive
{
void Adapter(object sender, RoutedEventArgs e)
void Adapter(object? sender, RoutedEventArgs e)
{
if (sender is TTarget target && e is TEventArgs args)
{
@ -136,7 +136,7 @@ namespace Avalonia.Interactivity
RoutingStrategies routes = RoutingStrategies.Direct | RoutingStrategies.Bubble,
bool handledEventsToo = false) where TTarget : class, IInteractive
{
void Adapter(object sender, RoutedEventArgs e)
void Adapter(object? sender, RoutedEventArgs e)
{
if (sender is TTarget target && e is TEventArgs args)
{

3
src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj

@ -3,8 +3,6 @@
<TargetFramework>netstandard2.0</TargetFramework>
<PackageId>Avalonia.ReactiveUI</PackageId>
<SignAssembly>false</SignAssembly>
<Nullable>enable</Nullable>
<WarningsAsErrors>nullable</WarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\packages\Avalonia\Avalonia.csproj" />
@ -12,4 +10,5 @@
<Import Project="..\..\build\Rx.props" />
<Import Project="..\..\build\ReactiveUI.props" />
<Import Project="..\..\build\ApiDiff.props" />
<Import Project="..\..\build\NullableEnable.props" />
</Project>

3
src/Markup/Avalonia.Markup/Avalonia.Markup.csproj

@ -2,8 +2,6 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>Avalonia</RootNamespace>
<Nullable>Enable</Nullable>
<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<None Remove="Markup\Parsers\Nodes\ExpressionGrammer" />
@ -19,4 +17,5 @@
<Import Project="..\..\..\build\Rx.props" />
<Import Project="..\..\..\build\System.Memory.props" />
<Import Project="..\..\..\build\ApiDiff.props" />
<Import Project="..\..\..\build\NullableEnable.props" />
</Project>

2
src/Markup/Avalonia.Markup/Data/BindingBase.cs

@ -272,7 +272,7 @@ namespace Avalonia.Data
_target.PropertyChanged -= PropertyChanged;
}
private void PropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
private void PropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == _property)
{

4
src/Markup/Avalonia.Markup/Data/TemplateBinding.cs

@ -160,7 +160,7 @@ namespace Avalonia.Data
PublishValue();
}
private void TargetPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
private void TargetPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == StyledElement.TemplatedParentProperty)
{
@ -173,7 +173,7 @@ namespace Avalonia.Data
}
}
private void TemplatedParentPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
private void TemplatedParentPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == Property)
{

4
src/Markup/Avalonia.Markup/Markup/Data/DelayedBinding.cs

@ -99,9 +99,9 @@ namespace Avalonia.Markup.Data
}
}
private static void ApplyBindings(object sender, EventArgs e)
private static void ApplyBindings(object? sender, EventArgs e)
{
var target = (IStyledElement)sender;
var target = (IStyledElement)sender!;
ApplyBindings(target);
target.Initialized -= ApplyBindings;
}

2
src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs

@ -297,7 +297,7 @@ namespace Avalonia.Markup.Parsers.Nodes
protected override bool ShouldUpdate(object? sender, PropertyChangedEventArgs e)
{
if (sender is null)
if (sender is null || e.PropertyName is null)
return false;
var typeInfo = sender.GetType().GetTypeInfo();
return typeInfo.GetDeclaredProperty(e.PropertyName)?.GetIndexParameters().Any() ?? false;

46
src/Shared/PlatformSupport/AssetLoader.cs

@ -17,7 +17,7 @@ namespace Avalonia.Shared.PlatformSupport
private static readonly Dictionary<string, AssemblyDescriptor> AssemblyNameCache
= new Dictionary<string, AssemblyDescriptor>();
private AssemblyDescriptor _defaultResmAssembly;
private AssemblyDescriptor? _defaultResmAssembly;
/// <summary>
/// Initializes a new instance of the <see cref="AssetLoader"/> class.
@ -25,7 +25,7 @@ namespace Avalonia.Shared.PlatformSupport
/// <param name="assembly">
/// The default assembly from which to load resm: assets for which no assembly is specified.
/// </param>
public AssetLoader(Assembly assembly = null)
public AssetLoader(Assembly? assembly = null)
{
if (assembly == null)
assembly = Assembly.GetEntryAssembly();
@ -50,7 +50,7 @@ namespace Avalonia.Shared.PlatformSupport
/// A base URI to use if <paramref name="uri"/> is relative.
/// </param>
/// <returns>True if the asset could be found; otherwise false.</returns>
public bool Exists(Uri uri, Uri baseUri = null)
public bool Exists(Uri uri, Uri? baseUri = null)
{
return GetAsset(uri, baseUri) != null;
}
@ -66,7 +66,7 @@ namespace Avalonia.Shared.PlatformSupport
/// <exception cref="FileNotFoundException">
/// The asset could not be found.
/// </exception>
public Stream Open(Uri uri, Uri baseUri = null) => OpenAndGetAssembly(uri, baseUri).Item1;
public Stream Open(Uri uri, Uri? baseUri = null) => OpenAndGetAssembly(uri, baseUri).Item1;
/// <summary>
/// Opens the asset with the requested URI and returns the asset stream and the
@ -82,7 +82,7 @@ namespace Avalonia.Shared.PlatformSupport
/// <exception cref="FileNotFoundException">
/// The asset could not be found.
/// </exception>
public (Stream stream, Assembly assembly) OpenAndGetAssembly(Uri uri, Uri baseUri = null)
public (Stream stream, Assembly assembly) OpenAndGetAssembly(Uri uri, Uri? baseUri = null)
{
var asset = GetAsset(uri, baseUri);
@ -94,11 +94,11 @@ namespace Avalonia.Shared.PlatformSupport
return (asset.GetStream(), asset.Assembly);
}
public Assembly GetAssembly(Uri uri, Uri baseUri)
public Assembly? GetAssembly(Uri uri, Uri baseUri)
{
if (!uri.IsAbsoluteUri && baseUri != null)
uri = new Uri(baseUri, uri);
return GetAssembly(uri).Assembly;
return GetAssembly(uri)?.Assembly;
}
/// <summary>
@ -113,7 +113,7 @@ namespace Avalonia.Shared.PlatformSupport
{
var assembly = GetAssembly(uri);
return assembly?.Resources.Where(x => x.Key.Contains(uri.AbsolutePath))
return assembly?.Resources?.Where(x => x.Key.Contains(uri.AbsolutePath))
.Select(x =>new Uri($"resm:{x.Key}?assembly={assembly.Name}")) ??
Enumerable.Empty<Uri>();
}
@ -139,7 +139,7 @@ namespace Avalonia.Shared.PlatformSupport
return Enumerable.Empty<Uri>();
}
private Uri EnsureAbsolute(Uri uri, Uri baseUri)
private Uri EnsureAbsolute(Uri uri, Uri? baseUri)
{
if (uri.IsAbsoluteUri)
return uri;
@ -153,7 +153,7 @@ namespace Avalonia.Shared.PlatformSupport
return new Uri(baseUri, uri);
}
private IAssetDescriptor GetAsset(Uri uri, Uri baseUri)
private IAssetDescriptor? GetAsset(Uri uri, Uri? baseUri)
{
if (uri.IsAbsoluteUri && uri.Scheme == "resm")
{
@ -166,10 +166,9 @@ namespace Avalonia.Shared.PlatformSupport
"don't know where to look up for the resource, try specifying assembly explicitly.");
}
IAssetDescriptor rv;
var resourceKey = uri.AbsolutePath;
asm.Resources.TryGetValue(resourceKey, out rv);
IAssetDescriptor? rv = null;
asm.Resources?.TryGetValue(resourceKey, out rv);
return rv;
}
@ -193,7 +192,7 @@ namespace Avalonia.Shared.PlatformSupport
return (asm, uri.AbsolutePath);
}
private AssemblyDescriptor GetAssembly(Uri uri)
private AssemblyDescriptor? GetAssembly(Uri? uri)
{
if (uri != null)
{
@ -205,9 +204,8 @@ namespace Avalonia.Shared.PlatformSupport
if (uri.Scheme == "resm")
{
var qs = ParseQueryString(uri);
string assemblyName;
if (qs.TryGetValue("assembly", out assemblyName))
if (qs.TryGetValue("assembly", out var assemblyName))
{
return GetAssembly(assemblyName);
}
@ -222,8 +220,7 @@ namespace Avalonia.Shared.PlatformSupport
if (name == null)
throw new ArgumentNullException(nameof(name));
AssemblyDescriptor rv;
if (!AssemblyNameCache.TryGetValue(name, out rv))
if (!AssemblyNameCache.TryGetValue(name, out var rv))
{
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
var match = loadedAssemblies.FirstOrDefault(a => a.GetName().Name == name);
@ -275,7 +272,8 @@ namespace Avalonia.Shared.PlatformSupport
public Stream GetStream()
{
return _asm.GetManifestResourceStream(_name);
var s = _asm.GetManifestResourceStream(_name);
return s ?? throw new InvalidOperationException($"Could not find manifest resource stream '{_name}',");
}
public Assembly Assembly => _asm;
@ -296,7 +294,9 @@ namespace Avalonia.Shared.PlatformSupport
public Stream GetStream()
{
return new SlicedStream(Assembly.GetManifestResourceStream(AvaloniaResourceName), _offset, _length);
var s = Assembly.GetManifestResourceStream(AvaloniaResourceName) ??
throw new InvalidOperationException($"Could not find manifest resource stream '{AvaloniaResourceName}',");
return new SlicedStream(s, _offset, _length);
}
}
@ -383,9 +383,9 @@ namespace Avalonia.Shared.PlatformSupport
}
public Assembly Assembly { get; }
public Dictionary<string, IAssetDescriptor> Resources { get; }
public Dictionary<string, IAssetDescriptor> AvaloniaResources { get; }
public string Name { get; }
public Dictionary<string, IAssetDescriptor>? Resources { get; }
public Dictionary<string, IAssetDescriptor>? AvaloniaResources { get; }
public string? Name { get; }
}
public static void RegisterResUriParsers()

4
src/Web/Avalonia.Web.Blazor/Avalonia.Web.Blazor.csproj

@ -2,7 +2,6 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<PackageId>Avalonia.Web.Blazor</PackageId>
<LangVersion>preview</LangVersion>
@ -32,7 +31,8 @@
<Import Project="..\..\..\build\BuildTargets.targets" />
<Import Project="..\..\..\build\SkiaSharp.props" />
<Import Project="..\..\..\build\HarfBuzzSharp.props" />
<Import Project="..\..\..\build\NullableEnable.props" />
<ItemGroup>
<Content Include="*.props">
<Pack>true</Pack>

9
src/Web/Avalonia.Web.Blazor/WindowingPlatform.cs

@ -12,7 +12,7 @@ namespace Avalonia.Web.Blazor
public class BlazorWindowingPlatform : IWindowingPlatform, IPlatformSettings, IPlatformThreadingInterface
{
private bool _signaled;
private static int s_uiThreadId = -1;
private static KeyboardDevice? s_keyboard;
public IWindowImpl CreateWindow() => throw new NotSupportedException();
@ -26,16 +26,17 @@ namespace Avalonia.Web.Blazor
return null;
}
public static KeyboardDevice Keyboard { get; private set; }
public static KeyboardDevice Keyboard => s_keyboard ??
throw new InvalidOperationException("BlazorWindowingPlatform not registered.");
public static void Register()
{
var instance = new BlazorWindowingPlatform();
Keyboard = new KeyboardDevice();
s_keyboard = new KeyboardDevice();
AvaloniaLocator.CurrentMutable
.Bind<IClipboard>().ToSingleton<ClipboardStub>()
.Bind<ICursorFactory>().ToSingleton<CursorFactoryStub>()
.Bind<IKeyboardDevice>().ToConstant(Keyboard)
.Bind<IKeyboardDevice>().ToConstant(s_keyboard)
.Bind<IPlatformSettings>().ToConstant(instance)
.Bind<IPlatformThreadingInterface>().ToConstant(instance)
.Bind<IRenderLoop>().ToConstant(new RenderLoop())

Loading…
Cancel
Save