diff --git a/.editorconfig b/.editorconfig
index eac5870f96..e6ae266849 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -145,10 +145,14 @@ dotnet_diagnostic.CS1591.severity = suggestion
# CS0162: Remove unreachable code
dotnet_diagnostic.CS0162.severity = error
+# CA1018: Mark attributes with AttributeUsageAttribute
+dotnet_diagnostic.CA1018.severity = error
# CA1304: Specify CultureInfo
dotnet_diagnostic.CA1304.severity = warning
# CA1802: Use literals where appropriate
dotnet_diagnostic.CA1802.severity = warning
+# CA1813: Avoid unsealed attributes
+dotnet_diagnostic.CA1813.severity = error
# CA1815: Override equals and operator equals on value types
dotnet_diagnostic.CA1815.severity = warning
# CA1820: Test for empty strings using string length
diff --git a/src/Avalonia.Base/Metadata/AmbientAttribute.cs b/src/Avalonia.Base/Metadata/AmbientAttribute.cs
index 85ca6c4ec9..1c85a67641 100644
--- a/src/Avalonia.Base/Metadata/AmbientAttribute.cs
+++ b/src/Avalonia.Base/Metadata/AmbientAttribute.cs
@@ -3,10 +3,10 @@ using System;
namespace Avalonia.Metadata
{
///
- /// Defines the ambient class/property
+ /// Defines the ambient class/property
///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, Inherited = true)]
- public class AmbientAttribute : Attribute
+ public sealed class AmbientAttribute : Attribute
{
}
}
diff --git a/src/Avalonia.Base/Metadata/ContentAttribute.cs b/src/Avalonia.Base/Metadata/ContentAttribute.cs
index a0b2fa0e1d..f32c8e78f6 100644
--- a/src/Avalonia.Base/Metadata/ContentAttribute.cs
+++ b/src/Avalonia.Base/Metadata/ContentAttribute.cs
@@ -6,7 +6,7 @@ namespace Avalonia.Metadata
/// Defines the property that contains the object's content in markup.
///
[AttributeUsage(AttributeTargets.Property)]
- public class ContentAttribute : Attribute
+ public sealed class ContentAttribute : Attribute
{
}
}
diff --git a/src/Avalonia.Base/Metadata/DataTypeAttribute.cs b/src/Avalonia.Base/Metadata/DataTypeAttribute.cs
index ac46a0d30a..dd9603b4a9 100644
--- a/src/Avalonia.Base/Metadata/DataTypeAttribute.cs
+++ b/src/Avalonia.Base/Metadata/DataTypeAttribute.cs
@@ -9,7 +9,7 @@ namespace Avalonia.Metadata;
/// Used on DataTemplate.DataType property so it can be inherited in compiled bindings inside of the template.
///
[AttributeUsage(AttributeTargets.Property)]
-public class DataTypeAttribute : Attribute
+public sealed class DataTypeAttribute : Attribute
{
-
+
}
diff --git a/src/Avalonia.Base/Metadata/DependsOnAttribute.cs b/src/Avalonia.Base/Metadata/DependsOnAttribute.cs
index caee71ebfd..ca58a91eb9 100644
--- a/src/Avalonia.Base/Metadata/DependsOnAttribute.cs
+++ b/src/Avalonia.Base/Metadata/DependsOnAttribute.cs
@@ -6,7 +6,7 @@ namespace Avalonia.Metadata
/// Indicates that the property depends on the value of another property in markup.
///
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
- public class DependsOnAttribute : Attribute
+ public sealed class DependsOnAttribute : Attribute
{
///
/// Initializes a new instance of the class.
diff --git a/src/Avalonia.Base/Metadata/NotClientImplementableAttribute.cs b/src/Avalonia.Base/Metadata/NotClientImplementableAttribute.cs
index 348c983c03..75fe7b8031 100644
--- a/src/Avalonia.Base/Metadata/NotClientImplementableAttribute.cs
+++ b/src/Avalonia.Base/Metadata/NotClientImplementableAttribute.cs
@@ -11,7 +11,7 @@ namespace Avalonia.Metadata
/// may be added to its API.
///
[AttributeUsage(AttributeTargets.Interface)]
- public class NotClientImplementableAttribute : Attribute
+ public sealed class NotClientImplementableAttribute : Attribute
{
}
}
diff --git a/src/Avalonia.Base/Metadata/TemplateContent.cs b/src/Avalonia.Base/Metadata/TemplateContent.cs
index 258154aba4..78bcc2ff29 100644
--- a/src/Avalonia.Base/Metadata/TemplateContent.cs
+++ b/src/Avalonia.Base/Metadata/TemplateContent.cs
@@ -6,7 +6,7 @@ namespace Avalonia.Metadata
/// Defines the property that contains the object's content in markup.
///
[AttributeUsage(AttributeTargets.Property)]
- public class TemplateContentAttribute : Attribute
+ public sealed class TemplateContentAttribute : Attribute
{
public Type? TemplateResultType { get; set; }
}
diff --git a/src/Avalonia.Base/Metadata/TrimSurroundingWhitespaceAttribute.cs b/src/Avalonia.Base/Metadata/TrimSurroundingWhitespaceAttribute.cs
index c46891b3ad..a644c9afe6 100644
--- a/src/Avalonia.Base/Metadata/TrimSurroundingWhitespaceAttribute.cs
+++ b/src/Avalonia.Base/Metadata/TrimSurroundingWhitespaceAttribute.cs
@@ -3,7 +3,7 @@
namespace Avalonia.Metadata
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
- public class TrimSurroundingWhitespaceAttribute : Attribute
+ public sealed class TrimSurroundingWhitespaceAttribute : Attribute
{
}
diff --git a/src/Avalonia.Base/Metadata/UnstableAttribute.cs b/src/Avalonia.Base/Metadata/UnstableAttribute.cs
index 3b6fa5168a..361f6d30fd 100644
--- a/src/Avalonia.Base/Metadata/UnstableAttribute.cs
+++ b/src/Avalonia.Base/Metadata/UnstableAttribute.cs
@@ -6,7 +6,8 @@ namespace Avalonia.Metadata
/// This API is unstable and is not covered by API compatibility guarantees between minor and
/// patch releases.
///
- public class UnstableAttribute : Attribute
+ [AttributeUsage(AttributeTargets.All)]
+ public sealed class UnstableAttribute : Attribute
{
}
}
diff --git a/src/Avalonia.Base/Metadata/UsableDuringInitializationAttribute.cs b/src/Avalonia.Base/Metadata/UsableDuringInitializationAttribute.cs
index 753a96b9ce..d2d163b368 100644
--- a/src/Avalonia.Base/Metadata/UsableDuringInitializationAttribute.cs
+++ b/src/Avalonia.Base/Metadata/UsableDuringInitializationAttribute.cs
@@ -3,8 +3,8 @@ using System;
namespace Avalonia.Metadata
{
[AttributeUsage(AttributeTargets.Class)]
- public class UsableDuringInitializationAttribute : Attribute
+ public sealed class UsableDuringInitializationAttribute : Attribute
{
-
+
}
}
diff --git a/src/Avalonia.Base/Metadata/WhitespaceSignificantCollectionAttribute.cs b/src/Avalonia.Base/Metadata/WhitespaceSignificantCollectionAttribute.cs
index aeaa38dad9..2fd2b1da3b 100644
--- a/src/Avalonia.Base/Metadata/WhitespaceSignificantCollectionAttribute.cs
+++ b/src/Avalonia.Base/Metadata/WhitespaceSignificantCollectionAttribute.cs
@@ -6,7 +6,7 @@ namespace Avalonia.Metadata
/// Indicates that a collection type should be processed as being whitespace significant by a XAML processor.
///
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
- public class WhitespaceSignificantCollectionAttribute : Attribute
+ public sealed class WhitespaceSignificantCollectionAttribute : Attribute
{
}
}
diff --git a/src/Avalonia.Base/Metadata/XmlnsDefinitionAttribute.cs b/src/Avalonia.Base/Metadata/XmlnsDefinitionAttribute.cs
index d43fa55f5c..c6b79ba987 100644
--- a/src/Avalonia.Base/Metadata/XmlnsDefinitionAttribute.cs
+++ b/src/Avalonia.Base/Metadata/XmlnsDefinitionAttribute.cs
@@ -6,7 +6,7 @@ namespace Avalonia.Metadata
/// Maps an XML namespace to a CLR namespace for use in XAML.
///
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
- public class XmlnsDefinitionAttribute : Attribute
+ public sealed class XmlnsDefinitionAttribute : Attribute
{
///
/// Initializes a new instance of the class.
diff --git a/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs b/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs
index ff2069e71e..560ee05c10 100644
--- a/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs
+++ b/src/Avalonia.Base/Rendering/Composition/Expressions/Expression.cs
@@ -39,7 +39,8 @@ namespace Avalonia.Rendering.Composition.Expressions
}
}
- internal class PrettyPrintStringAttribute : Attribute
+ [AttributeUsage(AttributeTargets.Field)]
+ internal sealed class PrettyPrintStringAttribute : Attribute
{
public string Name { get; }
diff --git a/src/Avalonia.Controls/Platform/ExportAvaloniaModuleAttribute.cs b/src/Avalonia.Controls/Platform/ExportAvaloniaModuleAttribute.cs
index 5a34c5c0e1..f271abb59a 100644
--- a/src/Avalonia.Controls/Platform/ExportAvaloniaModuleAttribute.cs
+++ b/src/Avalonia.Controls/Platform/ExportAvaloniaModuleAttribute.cs
@@ -41,7 +41,7 @@ namespace Avalonia.Platform
/// The fallback module will only be initialized if the Skia-specific module is not applicable.
///
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
- public class ExportAvaloniaModuleAttribute : Attribute
+ public sealed class ExportAvaloniaModuleAttribute : Attribute
{
public ExportAvaloniaModuleAttribute(string name, Type moduleType)
{
diff --git a/src/Avalonia.Controls/ResolveByNameAttribute.cs b/src/Avalonia.Controls/ResolveByNameAttribute.cs
index a13b10d630..3c56c20db0 100644
--- a/src/Avalonia.Controls/ResolveByNameAttribute.cs
+++ b/src/Avalonia.Controls/ResolveByNameAttribute.cs
@@ -7,7 +7,8 @@ namespace Avalonia.Controls
/// When applying this to attached properties, ensure to put on both
/// the Getter and Setter methods.
///
- public class ResolveByNameAttribute : Attribute
+ [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]
+ public sealed class ResolveByNameAttribute : Attribute
{
}
}
diff --git a/src/Avalonia.OpenGL/GlEntryPointAttribute.cs b/src/Avalonia.OpenGL/GlEntryPointAttribute.cs
index 3e31de6995..386db30f92 100644
--- a/src/Avalonia.OpenGL/GlEntryPointAttribute.cs
+++ b/src/Avalonia.OpenGL/GlEntryPointAttribute.cs
@@ -3,7 +3,7 @@ using System;
namespace Avalonia.OpenGL
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
- class GlMinVersionEntryPoint : Attribute
+ sealed class GlMinVersionEntryPoint : Attribute
{
public GlMinVersionEntryPoint(string entry, int minVersionMajor, int minVersionMinor)
{
@@ -28,7 +28,7 @@ namespace Avalonia.OpenGL
}
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
- class GlExtensionEntryPoint : Attribute
+ sealed class GlExtensionEntryPoint : Attribute
{
public GlExtensionEntryPoint(string entry, string extension)
{
diff --git a/src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs b/src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs
index 98a843bad1..44605a2ffb 100644
--- a/src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs
+++ b/src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs
@@ -3,7 +3,7 @@
namespace Avalonia.Remote.Protocol
{
[AttributeUsage(AttributeTargets.Class)]
- public class AvaloniaRemoteMessageGuidAttribute : Attribute
+ public sealed class AvaloniaRemoteMessageGuidAttribute : Attribute
{
public Guid Guid { get; }
diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs b/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs
index 8d6f8cdf3a..da4d7374d4 100644
--- a/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs
@@ -34,7 +34,8 @@ namespace Avalonia.Markup.Xaml
}
- public class ConstructorArgumentAttribute : Attribute
+ [AttributeUsage(AttributeTargets.Property)]
+ public sealed class ConstructorArgumentAttribute : Attribute
{
public ConstructorArgumentAttribute(string name)
{
diff --git a/src/Shared/ModuleInitializer.cs b/src/Shared/ModuleInitializer.cs
index a72929e06f..e58b296474 100644
--- a/src/Shared/ModuleInitializer.cs
+++ b/src/Shared/ModuleInitializer.cs
@@ -1,7 +1,8 @@
namespace System.Runtime.CompilerServices
{
#if NETSTANDARD2_0
- internal class ModuleInitializerAttribute : Attribute
+ [AttributeUsage(AttributeTargets.Method)]
+ internal sealed class ModuleInitializerAttribute : Attribute
{
}
diff --git a/src/Shared/SourceGeneratorAttributes.cs b/src/Shared/SourceGeneratorAttributes.cs
index 3f00fbef57..bdd21d0426 100644
--- a/src/Shared/SourceGeneratorAttributes.cs
+++ b/src/Shared/SourceGeneratorAttributes.cs
@@ -16,7 +16,9 @@ namespace Avalonia.SourceGenerator
}
- internal class GetProcAddressAttribute : Attribute
+
+ [AttributeUsage(AttributeTargets.Method)]
+ internal sealed class GetProcAddressAttribute : Attribute
{
public GetProcAddressAttribute(string proc)
{
@@ -39,11 +41,14 @@ namespace Avalonia.SourceGenerator
}
}
- internal class GenerateEnumValueDictionaryAttribute : Attribute
+ [AttributeUsage(AttributeTargets.Method)]
+ internal sealed class GenerateEnumValueDictionaryAttribute : Attribute
{
}
- internal class GenerateEnumValueListAttribute : Attribute
+
+ [AttributeUsage(AttributeTargets.Method)]
+ internal sealed class GenerateEnumValueListAttribute : Attribute
{
}
}