diff --git a/src/Avalonia.Controls/IToolTipService.cs b/src/Avalonia.Controls/IToolTipService.cs index 31884348502..f3082c0e242 100644 --- a/src/Avalonia.Controls/IToolTipService.cs +++ b/src/Avalonia.Controls/IToolTipService.cs @@ -1,9 +1,10 @@ -using Avalonia.Metadata; +using Avalonia.Input; +using Avalonia.Metadata; namespace Avalonia.Controls; [Unstable, PrivateApi] internal interface IToolTipService { - void Update(Visual? candidateToolTipHost); + void Update(IInputRoot root, Visual? candidateToolTipHost); } diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 1292b332b1b..402defea07e 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -1650,7 +1650,7 @@ protected override void OnPointerMoved(PointerEventArgs e) if (Math.Abs(caretIndex - previousIndex) == 1) e.PreventGestureRecognition(); - if (e.Pointer.Type == PointerType.Mouse) + if (e.Pointer.Type == PointerType.Mouse || _isDoubleTapped) { var selectionStart = SelectionStart; var selectionEnd = SelectionEnd; diff --git a/src/Avalonia.Controls/ToolTipService.cs b/src/Avalonia.Controls/ToolTipService.cs index b080769bee8..c3231fcde93 100644 --- a/src/Avalonia.Controls/ToolTipService.cs +++ b/src/Avalonia.Controls/ToolTipService.cs @@ -17,6 +17,7 @@ internal sealed class ToolTipService : IToolTipService, IDisposable private long _lastTipCloseTime; private DispatcherTimer? _timer; private ulong _lastTipEventTime; + private ulong _lastWindowEventTime; public ToolTipService(IInputManager inputManager) { @@ -36,18 +37,23 @@ private void InputManager_OnProcess(RawInputEventArgs e) { if (e is RawPointerEventArgs pointerEvent) { + bool isTooltipEvent = false; if (_tipControl?.GetValue(ToolTip.ToolTipProperty) is { } currentTip && e.Root == currentTip.PopupHost) + { + isTooltipEvent = true; _lastTipEventTime = pointerEvent.Timestamp; - - var simultaneousTipEvent = _lastTipEventTime == pointerEvent.Timestamp; + } + else if (e.Root == _tipControl?.VisualRoot) + { + _lastWindowEventTime = pointerEvent.Timestamp; + } switch (pointerEvent.Type) { - // sometimes there is a null hit test as soon as the pointer enters a tooltip - case RawPointerEventType.Move when !(simultaneousTipEvent && pointerEvent.InputHitTestResult.element == null): - Update(pointerEvent.InputHitTestResult.element as Visual); + case RawPointerEventType.Move: + Update(pointerEvent.Root, pointerEvent.InputHitTestResult.element as Visual); break; - case RawPointerEventType.LeaveWindow when e.Root == _tipControl?.VisualRoot && !simultaneousTipEvent: + case RawPointerEventType.LeaveWindow when (e.Root == _tipControl?.VisualRoot && _lastTipEventTime != e.Timestamp) || (isTooltipEvent && _lastWindowEventTime != e.Timestamp): ClearTip(); _tipControl = null; break; @@ -68,10 +74,16 @@ void ClearTip() } } - public void Update(Visual? candidateToolTipHost) + public void Update(IInputRoot root, Visual? candidateToolTipHost) { var currentToolTip = _tipControl?.GetValue(ToolTip.ToolTipProperty); + if (root == currentToolTip?.VisualRoot) + { + // Don't update while the pointer is over a tooltip + return; + } + while (candidateToolTipHost != null) { if (candidateToolTipHost == currentToolTip) // when OverlayPopupHost is in use, the tooltip is in the same window as the host control @@ -193,7 +205,11 @@ private void ToolTipPointerExited(object? sender, PointerEventArgs e) private void StartShowTimer(int showDelay, Control control) { _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(showDelay), Tag = (this, control) }; - _timer.Tick += (o, e) => Open(control); + _timer.Tick += (o, e) => + { + if (_timer != null) + Open(control); + }; _timer.Start(); } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 404964d3740..53821c7a5c5 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -896,12 +896,12 @@ private static void OnToolTipServiceEnabledChanged(AvaloniaPropertyChangedEventA private void UpdateToolTip(Rect dirtyRect) { - if (_tooltipService != null && _pointerOverPreProcessor?.LastPosition is { } lastPos) + if (_tooltipService != null && IsPointerOver && _pointerOverPreProcessor?.LastPosition is { } lastPos) { var clientPoint = this.PointToClient(lastPos); if (dirtyRect.Contains(clientPoint)) { - _tooltipService.Update(HitTester.HitTestFirst(clientPoint, this, null)); + _tooltipService.Update(this, HitTester.HitTestFirst(clientPoint, this, null)); } } } diff --git a/src/tools/Avalonia.Generators/NameGenerator/InitializeComponentCodeGenerator.cs b/src/tools/Avalonia.Generators/NameGenerator/InitializeComponentCodeGenerator.cs index 295104abe4f..3dd058af0be 100644 --- a/src/tools/Avalonia.Generators/NameGenerator/InitializeComponentCodeGenerator.cs +++ b/src/tools/Avalonia.Generators/NameGenerator/InitializeComponentCodeGenerator.cs @@ -6,6 +6,8 @@ namespace Avalonia.Generators.NameGenerator; internal class InitializeComponentCodeGenerator : ICodeGenerator { + private string _generatorName = typeof(InitializeComponentCodeGenerator).FullName; + private string _generatorVersion = typeof(InitializeComponentCodeGenerator).Assembly.GetName().Version.ToString(); private readonly bool _diagnosticsAreConnected; private const string AttachDevToolsCodeBlock = @" #if DEBUG @@ -31,6 +33,7 @@ public string GenerateCode(string className, string nameSpace, IXamlType xamlTyp var initializations = new List(); const string thisFindNameScopeVariable = " var __thisNameScope__ = this.FindNameScope();"; bool hasNames = false; + foreach (var resolvedName in names) { if (!hasNames) @@ -39,7 +42,12 @@ public string GenerateCode(string className, string nameSpace, IXamlType xamlTyp } var (typeName, name, fieldModifier) = resolvedName; - properties.Add($" {fieldModifier} {typeName} {name};"); + var propertySource = + $""" + [global::System.CodeDom.Compiler.GeneratedCode("{_generatorName}", "{_generatorVersion}")] + {fieldModifier} {typeName} {name}; + """; + properties.Add(propertySource); initializations.Add($" {name} = __thisNameScope__?.Find<{typeName}>(\"{name}\");"); hasNames = true; @@ -64,6 +72,8 @@ partial class {className} /// /// Should the XAML be loaded into the component. {(attachDevTools ? AttachDevToolsParameterDocumentation : string.Empty)} + [global::System.CodeDom.Compiler.GeneratedCode(""{_generatorName}"", ""{_generatorVersion}"")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true{(attachDevTools ? ", bool attachDevTools = true" : string.Empty)}) {{ if (loadXaml) diff --git a/src/tools/Avalonia.Generators/NameGenerator/OnlyPropertiesCodeGenerator.cs b/src/tools/Avalonia.Generators/NameGenerator/OnlyPropertiesCodeGenerator.cs index 367874e2126..8b295acd6be 100644 --- a/src/tools/Avalonia.Generators/NameGenerator/OnlyPropertiesCodeGenerator.cs +++ b/src/tools/Avalonia.Generators/NameGenerator/OnlyPropertiesCodeGenerator.cs @@ -7,10 +7,15 @@ namespace Avalonia.Generators.NameGenerator; internal class OnlyPropertiesCodeGenerator : ICodeGenerator { + private string _generatorName = typeof(OnlyPropertiesCodeGenerator).FullName; + private string _generatorVersion = typeof(OnlyPropertiesCodeGenerator).Assembly.GetName().Version.ToString(); + public string GenerateCode(string className, string nameSpace, IXamlType xamlType, IEnumerable names) { var namedControls = names .Select(info => " " + + $"[global::System.CodeDom.Compiler.GeneratedCode(\"{_generatorName}\", \"{_generatorVersion}\")]\n" + + " " + $"{info.FieldModifier} {info.TypeName} {info.Name} => " + $"this.FindNameScope()?.Find<{info.TypeName}>(\"{info.Name}\");") .ToList(); diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedProps.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedProps.txt index 836f366d699..083d66d8249 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedProps.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedProps.txt @@ -8,6 +8,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; /// @@ -15,6 +16,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedPropsWithDevTools.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedPropsWithDevTools.txt index 2b7562947f5..ea8b9a3f50c 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedPropsWithDevTools.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/AttachedPropsWithDevTools.txt @@ -8,6 +8,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; /// @@ -16,6 +17,8 @@ namespace Sample.App /// Should the XAML be loaded into the component. /// Should the dev tools be attached. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true, bool attachDevTools = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/ControlWithoutWindow.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/ControlWithoutWindow.txt index 836f366d699..083d66d8249 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/ControlWithoutWindow.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/ControlWithoutWindow.txt @@ -8,6 +8,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; /// @@ -15,6 +16,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/CustomControls.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/CustomControls.txt index 843f1b9af1b..5911e30e565 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/CustomControls.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/CustomControls.txt @@ -8,8 +8,11 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Controls.CustomTextBox UserNameTextBox; /// @@ -17,6 +20,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/DataTemplates.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/DataTemplates.txt index 4bb89b83f57..33a875af3ec 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/DataTemplates.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/DataTemplates.txt @@ -8,7 +8,9 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.ListBox NamedListBox; /// @@ -16,6 +18,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/FieldModifier.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/FieldModifier.txt index 2e458f62a46..63471ed8528 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/FieldModifier.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/FieldModifier.txt @@ -8,11 +8,17 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] public global::Avalonia.Controls.TextBox FirstNameTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] public global::Avalonia.Controls.TextBox LastNameTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] protected global::Avalonia.Controls.TextBox PasswordTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button RegisterButton; /// @@ -20,6 +26,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControl.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControl.txt index 836f366d699..083d66d8249 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControl.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControl.txt @@ -8,6 +8,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; /// @@ -15,6 +16,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControls.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControls.txt index 644e8b5a911..ed4a2ea6e57 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControls.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NamedControls.txt @@ -8,8 +8,11 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox PasswordTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton; /// @@ -17,6 +20,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NoNamedControls.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NoNamedControls.txt index b68dce6170a..ff293f9c235 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NoNamedControls.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/NoNamedControls.txt @@ -15,6 +15,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/SignUpView.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/SignUpView.txt index 747692c4819..4118a3b6822 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/SignUpView.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/SignUpView.txt @@ -8,15 +8,25 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Controls.CustomTextBox UserNameTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock UserNameValidation; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox PasswordTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock PasswordValidation; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.ListBox AwesomeListView; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Documents.Run SignUpButtonDescription; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock CompoundValidation; /// @@ -24,6 +34,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControl.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControl.txt index 836f366d699..083d66d8249 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControl.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControl.txt @@ -8,6 +8,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; /// @@ -15,6 +16,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControls.txt b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControls.txt index 644e8b5a911..ed4a2ea6e57 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControls.txt +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/GeneratedInitializeComponent/xNamedControls.txt @@ -8,8 +8,11 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox PasswordTextBox; + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton; /// @@ -17,6 +20,8 @@ namespace Sample.App /// /// Should the XAML be loaded into the component. + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.InitializeComponentCodeGenerator", "$GeneratorVersion")] + [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage] public void InitializeComponent(bool loadXaml = true) { if (loadXaml) diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs b/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs index 1653796f52b..1d0070f2f1e 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs @@ -48,15 +48,17 @@ public class InitializeComponentTests var names = nameResolver.ResolveNames(classInfo.Xaml); var generator = new InitializeComponentCodeGenerator(types, devToolsMode); + var generatorVersion = typeof(InitializeComponentCodeGenerator).Assembly.GetName().Version.ToString(); var code = generator .GenerateCode("SampleView", "Sample.App", classInfo.XamlType, names) .Replace("\r", string.Empty); - var expected = await InitializeComponentCode.Load(expectation); - + var expected = (await InitializeComponentCode.Load(expectation)) + .Replace("\r", string.Empty) + .Replace("$GeneratorVersion", generatorVersion); CSharpSyntaxTree.ParseText(code); - Assert.Equal(expected.Replace("\r", string.Empty), code); + Assert.Equal(expected, code); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/AttachedProps.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/AttachedProps.txt index 8a3a65773c3..17658bacff9 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/AttachedProps.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/AttachedProps.txt @@ -6,6 +6,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/ControlWithoutWindow.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/ControlWithoutWindow.txt index 8a3a65773c3..17658bacff9 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/ControlWithoutWindow.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/ControlWithoutWindow.txt @@ -6,6 +6,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/CustomControls.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/CustomControls.txt index d9328b4b0d4..46175e85ef8 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/CustomControls.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/CustomControls.txt @@ -6,8 +6,11 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.ReactiveUI.RoutedViewHost ClrNamespaceRoutedViewHost => this.FindNameScope()?.Find("ClrNamespaceRoutedViewHost"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.ReactiveUI.RoutedViewHost UriRoutedViewHost => this.FindNameScope()?.Find("UriRoutedViewHost"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Controls.CustomTextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/DataTemplates.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/DataTemplates.txt index ee73a529e96..ad1f4649b22 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/DataTemplates.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/DataTemplates.txt @@ -6,7 +6,9 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.ListBox NamedListBox => this.FindNameScope()?.Find("NamedListBox"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/FieldModifier.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/FieldModifier.txt index 250e8c98f3c..a3897ce27d2 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/FieldModifier.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/FieldModifier.txt @@ -6,11 +6,17 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] public global::Avalonia.Controls.TextBox FirstNameTextBox => this.FindNameScope()?.Find("FirstNameTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] public global::Avalonia.Controls.TextBox LastNameTextBox => this.FindNameScope()?.Find("LastNameTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] protected global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find("PasswordTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] private global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindNameScope()?.Find("ConfirmPasswordTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find("SignUpButton"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button RegisterButton => this.FindNameScope()?.Find("RegisterButton"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControl.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControl.txt index 8a3a65773c3..17658bacff9 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControl.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControl.txt @@ -6,6 +6,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControls.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControls.txt index 1129600cea8..a946da4791e 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControls.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/NamedControls.txt @@ -6,8 +6,11 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find("PasswordTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find("SignUpButton"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/SignUpView.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/SignUpView.txt index c70abaf6afa..d6db79a284c 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/SignUpView.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/SignUpView.txt @@ -6,15 +6,25 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Controls.CustomTextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock UserNameValidation => this.FindNameScope()?.Find("UserNameValidation"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find("PasswordTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock PasswordValidation => this.FindNameScope()?.Find("PasswordValidation"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.ListBox AwesomeListView => this.FindNameScope()?.Find("AwesomeListView"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox ConfirmPasswordTextBox => this.FindNameScope()?.Find("ConfirmPasswordTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock ConfirmPasswordValidation => this.FindNameScope()?.Find("ConfirmPasswordValidation"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Documents.Run SignUpButtonDescription => this.FindNameScope()?.Find("SignUpButtonDescription"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find("SignUpButton"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBlock CompoundValidation => this.FindNameScope()?.Find("CompoundValidation"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControl.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControl.txt index 8a3a65773c3..17658bacff9 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControl.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControl.txt @@ -6,6 +6,7 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControls.txt b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControls.txt index 1129600cea8..a946da4791e 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControls.txt +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/GeneratedCode/xNamedControls.txt @@ -6,8 +6,11 @@ namespace Sample.App { partial class SampleView { + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox UserNameTextBox => this.FindNameScope()?.Find("UserNameTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.TextBox PasswordTextBox => this.FindNameScope()?.Find("PasswordTextBox"); + [global::System.CodeDom.Compiler.GeneratedCode("Avalonia.Generators.NameGenerator.OnlyPropertiesCodeGenerator", "$GeneratorVersion")] internal global::Avalonia.Controls.Button SignUpButton => this.FindNameScope()?.Find("SignUpButton"); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs b/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs index 937fd323b73..ceb15af629d 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs @@ -41,12 +41,17 @@ public async Task Should_Generate_FindControl_Refs_From_Avalonia_Markup_File(str var names = nameResolver.ResolveNames(classInfo.Xaml); var generator = new OnlyPropertiesCodeGenerator(); + var generatorVersion = typeof(OnlyPropertiesCodeGenerator).Assembly.GetName().Version.ToString(); + var code = generator .GenerateCode("SampleView", "Sample.App", classInfo.XamlType, names) .Replace("\r", string.Empty); - var expected = await OnlyPropertiesCode.Load(expectation); + var expected = (await OnlyPropertiesCode.Load(expectation)) + .Replace("\r", string.Empty) + .Replace("$GeneratorVersion", generatorVersion); + CSharpSyntaxTree.ParseText(code); - Assert.Equal(expected.Replace("\r", string.Empty), code); + Assert.Equal(expected, code); } }