maui/.editorconfig

194 строки
6.8 KiB
INI
Исходник Обычный вид История

# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
# https://editorconfig.org
# top-most EditorConfig file
2016-05-26 23:39:00 +03:00
root = true
# Default settings:
# A newline ending every file
# Use 4 spaces as indentation
[*]
2020-09-29 13:15:44 +03:00
# insert_final_newline = false
indent_style = space
indent_size = 4
[project.json]
indent_size = 2
# C# files
[*.cs]
indent_style = tab
dotnet_diagnostic.CA1416.severity = error
[build] Update to .NET 6 Preview 4 (#796) * [build] Update to .NET 6 Preview 4 Brings in Preview 4 updates for the Android, MaciOS, and .NET SDks. Initial build attempts were failing with hundreds of errors: D:\a\1\s\src\Essentials\src\Connectivity\Connectivity.ios.tvos.macos.cs(12,70): error BI1234: 'CTCellularData' is obsolete: 'Starting with ios14.0 Use the 'CallKit' API instead.' [D:\a\1\s\src\Essentials\src\Essentials-net6.csproj] D:\a\1\s\src\Essentials\src\Compass\Compass.ios.cs(31,6): error CA1416: This call site is reachable on: 'iOS' 13.6 and later. 'CLLocationManager.HeadingFilter' is only supported on: 'macos' 11.0 and later. [D:\a\1\s\src\Essentials\src\Essentials-net6.csproj] D:\a\1\s\src\Core\src\Platform\MaciOS\ColorExtensions.cs(64,13): error CA1416: This call site is reachable on: 'MacCatalyst' 13.5 and later. 'UIColor.SystemBackgroundColor.get' is supported on: 'ios' 13.0 and later. [D:\a\1\s\src\Core\src\Core-net6.csproj] CSC : error AD0001: Analyzer 'Microsoft.NetCore.Analyzers.InteropServices.PlatformCompatibilityAnalyzer' threw an exception of type 'System.NullReferenceException' with message 'Object reference not set to an instance of an object.'. [D:\a\1\s\src\BlazorWebView\src\core\Microsoft.AspNetCore.Components.WebView.Maui.csproj] The [platform compatibility analyzer][0] has been disabled for now, and it can be enabled locally to work through the few hundred errors in future PRs. Once these issues were sorted, there were a handful of other breaks that I've attempted to fix: D:\a\1\s\src\Essentials\src\AssemblyInfo\AssemblyInfo.ios.tvos.watchos.macos.cs(3,12): error CS0618: 'LinkerSafeAttribute' is obsolete: 'Replace with '[assembly: System.Reflection.AssemblyMetadata ("IsTrimmable", "True")]'.' [D:\a\1\s\src\Essentials\src\Essentials-net6.csproj] D:\a\1\s\src\Compatibility\Core\src\iOS\Renderers\TabbedRenderer.cs(422,33): error CS1503: Argument 1: cannot convert from 'UIKit.UIStringAttributes' to 'UIKit.UITextAttributes' [D:\a\1\s\src\Compatibility\Core\src\Compatibility-net6.csproj] D:\a\1\s\src\Compatibility\Core\src\iOS\CollectionView\CarouselViewController.cs(106,23): error CS0114: 'CarouselViewController.DraggingStarted(UIScrollView)' hides inherited member 'UICollectionViewController.DraggingStarted(UIScrollView)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. [ D:\a\1\s\src\Compatibility\Core\src\Compatibility-net6.csproj] D:\a\1\s\src\Compatibility\Core\src\iOS\CollectionView\CarouselViewController.cs(117,23): error CS0114: 'CarouselViewController.DraggingEnded(UIScrollView, bool)' hides inherited member 'UICollectionViewController.DraggingEnded(UIScrollView, bool)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. [ D:\a\1\s\src\Compatibility\Core\src\Compatibility-net6.csproj] Finally it seems JDK 14 was being preferred on macOS machines in CI, so I've set `$(JI_JAVA_HOME)` to the [pre-installed JDK 11][1]. [0]: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1416 [1]: https://github.com/actions/virtual-environments/blob/macOS-10.15/20210419.2/images/macos/macos-10.15-Readme.md#java * Apply feedback, bump p4 bits, provision xcode 12.5 rc * Use Big Sur pool, clean up duplicate variable declaration * Revert "Use Big Sur pool, clean up duplicate variable declaration" This reverts commit b91482e10cdef99158e9060c9bf51298a74d89a8. * Disable linker for ios and catalyst Co-authored-by: Rui Marinho <me@ruimarinho.net>
2021-04-24 13:32:18 +03:00
# TODO: Remove this to reenable the COMAnalyzer once https://github.com/dotnet/linker/issues/2686 is fixed
dotnet_diagnostic.IL2050.severity = none
[core] use StringComparison.Ordinal everywhere (#4988) Context: https://docs.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1307 Context: https://docs.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1309 Context: https://github.com/dotnet/runtime/issues/43956 I was reviewing `dotnet trace` output of the .NET Podcast app: 6.32ms Microsoft.Maui.Controls!Microsoft.Maui.Controls.ShellNavigationManager.GetNavigationState 3.82ms Microsoft.Maui.Controls!Microsoft.Maui.Controls.ShellUriHandler.FormatUri The bulk of this time is spent in `string.StartsWith()`, doing a culture-aware string comparison? 3.82ms System.Private.CoreLib!System.String.StartsWith 2.57ms System.Private.CoreLib!System.Globalization.CultureInfo.get_CurrentCulture This looks to be showing the cost of the 1st culture-aware comparision plus any time making these slower string comparisons. It would be ideal if project templates did not even hit `CultureInfo.get_CurrentCulture`. To solve this, let's add to the `.editorconfig` file: dotnet_diagnostic.CA1307.severity = error dotnet_diagnostic.CA1309.severity = error And then fix all the places errors appear. There are some complications in projects that use `netstandard2.0`: 1. For `Contains()` use `IndexOf()` instead. 2. Use `#if NETSTANDARD2_0` for `GetHashCode()` or `Replace()`. Use the `char` overload of `string.Replace()` where possible. 3. Generally, `InvariantCulture` should not be used. After these changes, the `FormatUri` method disappears completely from the trace, and we instead get: 2.88ms Microsoft.Maui.Controls!Microsoft.Maui.Controls.ShellNavigationManager.GetNavigationState I suspect this saves ~3.44ms for any MAUI app startup, and a small amount more depending on the number of string comparisions happening.
2022-03-02 02:14:18 +03:00
# Code analyzers
dotnet_diagnostic.CA1307.severity = error
dotnet_diagnostic.CA1309.severity = error
dotnet_diagnostic.CA1311.severity = error
[core] `WeakEventManager+Subscription` needs `IEquatable` (#13232) Context: https://github.com/Vroomer/MAUI-master-detail-memory-leak Context: https://github.com/dotnet/maui/issues/12039 Using the Visual Studio's `.NET Object Allocation Tracking` profiler on the sample above I noticed after app launch: Microsoft.Maui.WeakEventManager+Subscription Allocations: 686,114 Bytes: 21,955,648 After spitting out my coffee, I drilled in a bit to see where these are being created: System.Collections.Generic.ObjectEqualityComparer<Microsoft.Maui.WeakEventManager+Subscription>.IndexOf It turns out this `struct` doesn't implement `IEquatable<T>`: https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1815 To solve this: * `Subscription` is private, so we can make it a `readonly struct`. * `dotnet_diagnostic.CA1815.severity = error` across the entire repo. * Implement `IEquatable<T>` for all `struct` types. After these changes, I can't find `Microsoft.Maui.WeakEventManager+Subscription` in the memory report at all. Which assuming means, I saved ~21 MB of allocations in this app. Note that this doesn't actually solve #12039, as I'm still investigating the leak. Maybe this partially closes the floodgate? * Fix `struct`s in Controls.Core Note that I did not update these, as they are some "internal" parts from Xamarin.Forms: * `Profile` * `Datum` We might actually just consider removing these in the future. * Suppress warnings in Compatibility I assume these structs aren't nearly as important, so ignoring a few. They appear to be called once at startup in most cases. * Disable `CA1815` in tests.
2023-02-10 18:20:21 +03:00
dotnet_diagnostic.CA1815.severity = error
dotnet_diagnostic.CA1825.severity = error
[core] use StringComparison.Ordinal everywhere (#4988) Context: https://docs.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1307 Context: https://docs.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1309 Context: https://github.com/dotnet/runtime/issues/43956 I was reviewing `dotnet trace` output of the .NET Podcast app: 6.32ms Microsoft.Maui.Controls!Microsoft.Maui.Controls.ShellNavigationManager.GetNavigationState 3.82ms Microsoft.Maui.Controls!Microsoft.Maui.Controls.ShellUriHandler.FormatUri The bulk of this time is spent in `string.StartsWith()`, doing a culture-aware string comparison? 3.82ms System.Private.CoreLib!System.String.StartsWith 2.57ms System.Private.CoreLib!System.Globalization.CultureInfo.get_CurrentCulture This looks to be showing the cost of the 1st culture-aware comparision plus any time making these slower string comparisons. It would be ideal if project templates did not even hit `CultureInfo.get_CurrentCulture`. To solve this, let's add to the `.editorconfig` file: dotnet_diagnostic.CA1307.severity = error dotnet_diagnostic.CA1309.severity = error And then fix all the places errors appear. There are some complications in projects that use `netstandard2.0`: 1. For `Contains()` use `IndexOf()` instead. 2. Use `#if NETSTANDARD2_0` for `GetHashCode()` or `Replace()`. Use the `char` overload of `string.Replace()` where possible. 3. Generally, `InvariantCulture` should not be used. After these changes, the `FormatUri` method disappears completely from the trace, and we instead get: 2.88ms Microsoft.Maui.Controls!Microsoft.Maui.Controls.ShellNavigationManager.GetNavigationState I suspect this saves ~3.44ms for any MAUI app startup, and a small amount more depending on the number of string comparisions happening.
2022-03-02 02:14:18 +03:00
# nullability checks
dotnet_diagnostic.IDE0029.severity = error
dotnet_diagnostic.IDE0031.severity = error
dotnet_diagnostic.IDE0041.severity = error
# Modifier preferences
dotnet_style_require_accessibility_modifiers = never:suggestion
# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = one_less_than_current
# avoid this. unless absolutely necessary
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
# only use var when it's obvious what the variable type is
csharp_style_var_for_built_in_types = true:none
csharp_style_var_when_type_is_apparent = true:none
csharp_style_var_elsewhere = false:none
# use language keywords instead of BCL types
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# name all constant fields using PascalCase
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_symbols.constant_fields.required_modifiers = const
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
# static fields should be PascalCase
dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion
dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields
dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style
dotnet_naming_symbols.static_fields.applicable_kinds = field
dotnet_naming_symbols.static_fields.required_modifiers = static
dotnet_naming_style.static_prefix_style.capitalization = pascal_case
# internal and private fields should be _camelCase
dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
dotnet_naming_style.camel_case_underscore_style.required_prefix = _
dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case
# Code style defaults
dotnet_sort_system_directives_first = true
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false
csharp_prefer_braces = true:suggestion
# Expression-level preferences
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods = false:none
csharp_style_expression_bodied_constructors = false:none
csharp_style_expression_bodied_operators = false:none
csharp_style_expression_bodied_properties = true:none
csharp_style_expression_bodied_indexers = true:none
csharp_style_expression_bodied_accessors = true:none
# Pattern matching
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
# Null checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = do_not_ignore
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# C++ Files
[*.{cpp,h,in}]
curly_bracket_next_line = true
indent_brace_style = Allman
# Xml project files
[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
indent_size = 2
# Xml build files
[*.builds]
indent_size = 2
# Xml files
[*.{xml,stylecop,resx,ruleset}]
indent_size = 2
# Xaml files
[*.{xaml}]
indent_size = 2
# Xml config files
[*.{props,targets,config,nuspec}]
indent_size = 2
# Shell scripts
[*.sh]
end_of_line = lf
[*.{cmd, bat}]
end_of_line = crlf
# Ignore Banned APIs that get generated by the WinUI Xaml Generator
# This is currently being used for the banned Services/Application APIs
[**/obj/**/XamlTypeInfo.g.cs]
dotnet_diagnostic.RS0030.severity = none