csharp: Add StyleCop support to dotnet build
authorLauro Moura <lauromoura@expertisesolutions.com.br>
Mon, 30 Dec 2019 21:42:24 +0000 (21:42 +0000)
committerJongmin Lee <jm105.lee@samsung.com>
Sun, 5 Jan 2020 21:53:51 +0000 (06:53 +0900)
This patch adds support to run the StyleCop rules. To enable, -Ddotnet=true
is needed, You can pass -Ddotnet-stylecop=CAXXXX,CAXXYY where X and Y are digits for CAs
or SAs. You can also ask that the CAs and SAs cause errors instead of warnings.

Differential Revision: https://phab.enlightenment.org/D10969

meson_options.txt
src/bindings/mono/ca.ruleset.in [new file with mode: 0644]
src/bindings/mono/efl_sharp.csproj.in
src/bindings/mono/meson.build
src/tests/efl_mono/efl_sharp_test_suite.csproj.in
src/tests/efl_mono/meson.build

index a6bb3b8..205d64f 100644 (file)
@@ -311,6 +311,18 @@ option('mono-beta',
   description: 'Mono/C# @beta Eo methods enabled in the efl'
 )
 
+option('dotnet-stylecop',
+  type: 'string',
+  description: 'Dotnet StyleCop checks. Use * for all, or use comma listed: -Ddotnet-stylecop=ca1062,CA1032, sa0001, SA0002, cA2225'
+)
+
+option('dotnet-stylecop-severity',
+  type: 'combo',
+  choices: ['Warning', 'Error'],
+  value: 'Warning',
+  description: 'Dotnet StyleCop checks cause compilation errors or just warnings'
+)
+
 option('mono-examples-dir',
   type: 'string',
   value: '',
diff --git a/src/bindings/mono/ca.ruleset.in b/src/bindings/mono/ca.ruleset.in
new file mode 100644 (file)
index 0000000..0f5be88
--- /dev/null
@@ -0,0 +1,334 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RuleSet Name="CustomRulset" Description="Custom Rulset" ToolsVersion="14.0">
+       <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
+               <!-- Do not declare static members on Generic Types --> 
+               @CA1000@
+               <!-- Consider making Raise an event --> 
+               @CA1030@
+               <!-- Catch generic exception -->
+               @CA1031@
+               <!-- Add extra exception constructors --> 
+               @CA1032@
+               <!-- Do not nest NativeTypes --> 
+               @CA1034@
+               <!-- IComparable must implement other comparison operators --> 
+               @CA1036@
+               <!-- Avoid empty interface --> 
+               @CA1040@
+               <!-- Use Integral Or String Argument For Indexers --> 
+               @CA1043@
+               <!-- Consider making property with getter --> 
+               @CA1044@
+               <!-- Visible instance fields -->
+               @CA1051@
+               <!-- Static holder can be static -->
+               @CA1052@
+               <!-- Using parameters before checking for null -->
+               @CA1062@
+               <!-- Remove IDisposable as Object already has it -->
+               @CA1063@
+               <!-- Exceptions must be public -->
+               @CA1064@
+               <!-- Do not raise exception in unexpected locations -->
+               @CA1065@
+               <!-- String localization -->
+               @CA1303@
+               <!-- Specify IFormatProvider --> 
+               @CA1305@
+               <!-- Specify Stringcomparison --> 
+               @CA1307@
+               <!-- PInvoke should not be visible -->
+               @CA1401@
+               <!-- Use nameof --> 
+               @CA1507@
+               <!-- Parameter underscore -->
+               @CA1707@
+               <!-- Attribute classes must have the Attribute Suffix --> 
+               @CA1710@
+               <!-- Replace generic parameter with T -->
+               @CA1715@
+               <!-- Parameter End conflicts with VB -->
+               @CA1716@
+               <!-- Enum field must be plural -->
+               @CA1717@
+               <!-- Variable has type name -->
+               @CA1720@
+               <!-- Property with same name as getter -->
+               @CA1721@
+               <!-- Type name must not match namespace -->
+               @CA1724@
+               <!-- Unused parameter. Lots of warnings regarding Dispose(disposing) -->
+               @CA1801@
+               <!-- Do not ignore function result -->
+               @CA1806@
+               <!-- Remove static constructors -->
+               @CA1810@
+               <!-- Realized classes are never instantiated --> 
+               @CA1812@
+               <!-- Override equal and operator equal on Value Types--> 
+               @CA1815@
+               <!-- Dispose must call SuppressFinalizers --> 
+               @CA1816@
+               <!-- Member can be static -->
+               @CA1822@
+               <!-- Consider zero length array allocation --> 
+               @CA1825@
+               <!-- Count() is used where Any() could be used instead to improve performance -->
+               @CA1827@
+               <!-- Use Count instead of Count() -->
+               @CA1829@
+               <!-- Call dispose before going out of scope -->
+               @CA2000@
+               <!-- Call ConfigureWait-->
+               @CA2007@
+               <!-- PInvoke should specify string marshalling -->
+               @CA2101@
+               <!-- Rethrow loses stack info -->
+               @CA2200@
+               <!-- Declare static fields when they are declared and remove static constructor -->
+               @CA2207@
+               <!-- Instantiate exception params correctly -->
+               @CA2208@
+               <!-- Dot not call overrideable methods in constructors --> 
+               @CA2214@
+               <!-- Replace implicit operator -->
+               @CA2225@
+               <!-- Change 'XXXXX' to be read-only by removing the property setter -->
+               @CA2227@
+
+
+
+       </Rules>
+       <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
+               <!-- Ignore docs -->
+               @SA0001@
+
+               <!-- 10** Spacing rules -->
+               @SA1000@
+               @SA1001@
+               @SA1002@
+               @SA1003@
+               <!-- Documentation must start with single space -->
+               @SA1004@
+               @SA1005@
+               @SA1006@
+               @SA1007@
+               @SA1008@
+               @SA1009@
+               @SA1010@
+               @SA1011@
+               @SA1012@
+               @SA1013@
+               @SA1014@
+               @SA1015@
+               @SA1016@
+               @SA1017@
+               @SA1018@
+               @SA1019@
+               @SA1020@
+               @SA1021@
+               @SA1022@
+               @SA1023@
+               @SA1024@
+               @SA1025@
+               @SA1026@
+               @SA1027@
+               @SA1028@
+
+               <!-- Readability -->
+               @SA1100@
+               @SA1101@
+               @SA1102@
+               @SA1103@
+               @SA1104@
+               @SA1105@
+               @SA1106@
+               @SA1107@
+               @SA1108@
+               @SA1109@
+               @SA1110@
+               @SA1111@
+               @SA1112@
+               @SA1113@
+               @SA1114@
+               @SA1115@
+               @SA1116@
+               @SA1117@
+               @SA1118@
+               @SA1119@
+               @SA1120@
+               @SA1121@
+               @SA1122@
+               @SA1123@
+               @SA1124@
+               @SA1125@
+               @SA1126@
+               @SA1127@
+               @SA1128@
+               @SA1129@
+               @SA1130@
+               @SA1131@
+               @SA1132@
+               @SA1133@
+               @SA1134@
+               @SA1135@
+               @SA1136@
+               @SA1137@
+               @SA1138@
+               @SA1139@
+
+               <!-- 12** Ordering -->
+               <!-- FIXME Check if this somehow affects docfx output -->
+               @SA1200@
+               @SA1201@
+               @SA1202@
+               @SA1203@
+               @SA1204@
+               @SA1205@
+               @SA1206@
+               @SA1207@
+               @SA1208@
+               @SA1209@
+               @SA1210@
+               @SA1211@
+               @SA1212@
+               @SA1213@
+               @SA1214@
+               @SA1215@
+               @SA1216@
+               @SA1217@
+
+               <!-- 13**  Naming Rules -->
+               <!-- Element start with upper case -->
+               @SA1300@
+               @SA1301@
+               <!-- Interface start with I -->
+               @SA1302@
+               <!-- Upper/lower score rules -->
+               @SA1303@
+               @SA1304@
+               @SA1305@
+               @SA1306@
+               @SA1307@
+               <!-- Variable field prefixes -->
+               @SA1308@
+               @SA1309@
+               @SA1310@
+               @SA1311@
+               @SA1312@
+               @SA1313@
+               @SA1314@
+
+               <!-- 14** Maintainability -->
+               <!-- Access modifier -->
+               @SA1400@
+               <!-- Field must be private -->
+               @SA1401@
+               <!-- File Must contain single class or namespace -->
+               @SA1402@
+               @SA1403@
+               <!-- CodeAnalysis suppress does not have justification -->
+               @SA1404@
+               <!-- Debug.Assert/Fail must provide a message -->
+               @SA1405@
+               @SA1406@
+               <!-- Arithmetic/Conditional expression must declare precedence -->
+               @SA1407@
+               @SA1408@
+               <!-- Remove unecessary code -->
+               @SA1409@
+               <!-- Delegate/Attribute parentheses -->
+               @SA1410@
+               @SA1411@
+               <!-- Utf8 file -->
+               @SA1412@
+               <!-- Trailing commas multiline initializer -->
+               @SA1413@
+
+               <!-- 15** Layout Rules -->
+               @SA1500@
+               @SA1501@
+               @SA1502@
+               @SA1503@
+               @SA1504@
+               @SA1505@
+               @SA1506@
+               @SA1507@
+               @SA1508@
+               @SA1509@
+               @SA1510@
+               @SA1511@
+               @SA1512@
+               @SA1513@
+               @SA1514@
+               @SA1515@
+               @SA1516@
+               @SA1517@
+               @SA1518@
+               @SA1519@
+               @SA1520@
+
+               <!-- 16** Documentation rules -->
+               <!-- Things must be documented -->
+               @SA1600@
+               @SA1601@
+               @SA1602@
+               <!-- Valid xml in docs -->
+               @SA1603@
+               @SA1604@
+               @SA1605@
+               @SA1606@
+               @SA1607@
+               @SA1608@
+               @SA1609@
+               @SA1610@
+               @SA1611@
+               @SA1612@
+               @SA1613@
+               @SA1614@
+               @SA1615@
+               @SA1616@
+               @SA1617@
+               @SA1618@
+               @SA1619@
+               @SA1620@
+               @SA1621@
+               @SA1622@
+               @SA1623@
+               @SA1624@
+               @SA1625@
+               @SA1626@
+               @SA1627@
+               @SA1628@
+               @SA1629@
+               @SA1630@
+               @SA1631@
+               @SA1632@
+               <!-- File headers -->
+               @SA1633@
+               @SA1634@
+               @SA1635@
+               @SA1636@
+               @SA1637@
+               @SA1638@
+               @SA1639@
+               @SA1640@
+               @SA1641@
+               <!-- Constructor/Destructor -->
+               @SA1642@
+               @SA1643@
+               <!-- File header -->
+               @SA1644@
+               <!-- Miscellaneous doc -->
+               @SA1645@
+               @SA1646@
+               @SA1647@
+               @SA1648@
+               <!-- Filename must match file type -->
+               @SA1649@
+               <!-- Spelling -->
+               @SA1650@
+               <!-- Placeholder -->
+               @SA1651@
+       </Rules>
+</RuleSet>
index ce6a9e4..e03be33 100644 (file)
     <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
   </PropertyGroup>
 
-  <PropertyGroup>
-    <DocumentationFile>$(AssemblyName).xml</DocumentationFile>
-    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-  </PropertyGroup>
-
   <!-- <PropertyGroup Condition="'$(BuildType)'=='Beta'"> -->
   <!--   <DefineConstants>EFL_BETA</DefineConstants> -->
   <!-- </PropertyGroup> -->
     <Compile Include="./*.cs" />
   </ItemGroup>
 
+  <!-- Code style configuration -->
+  <ItemGroup>
+    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.6" />
+    <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" />
+  </ItemGroup>
+  <PropertyGroup>
+    <CodeAnalysisRuleSet>@CA_RULESET@</CodeAnalysisRuleSet>
+  </PropertyGroup>
+
 </Project>
index eb62288..16890d7 100644 (file)
@@ -148,8 +148,9 @@ efl_mono_conf_data.set('ELDBUS', eldbus_lib.full_path())
 efl_mono_conf_data.set('ELEMENTARY', elementary_lib.full_path())
 
 efl_mono_dll_config = configure_file(input : 'efl_mono.dll.config.in',
-                                 output : 'efl_mono.dll.config',
-                                 configuration : efl_mono_conf_data)
+                                     output : 'efl_mono.dll.config',
+                                     configuration : efl_mono_conf_data)
+
 
 extra_cs_args = runtime_assemblies
 
@@ -161,8 +162,69 @@ efl_mono_install_dir = join_paths(dir_lib, 'efl-mono-'+version_major)
 efl_mono_xml_doc = join_paths(meson.current_build_dir(), 'efl_mono.xml')
 
 if (get_option('dotnet'))
+  styles = ['CA1000', 'CA1030', 'CA1031', 'CA1032', 'CA1034', 'CA1036', 'CA1040',
+            'CA1043', 'CA1044', 'CA1051', 'CA1052', 'CA1062', 'CA1063', 'CA1064',
+            'CA1065', 'CA1303', 'CA1305', 'CA1307', 'CA1401', 'CA1507', 'CA1707',
+            'CA1710', 'CA1715', 'CA1716', 'CA1717', 'CA1720', 'CA1721', 'CA1724',
+            'CA1801', 'CA1806', 'CA1810', 'CA1812', 'CA1815', 'CA1816', 'CA1822',
+            'CA1825', 'CA1827', 'CA1829', 'CA2000', 'CA2007', 'CA2101', 'CA2200',
+            'CA2207', 'CA2208', 'CA2214', 'CA2225', 'CA2227', 'SA0001', 'SA1000',
+            'SA1001', 'SA1002', 'SA1003', 'SA1004', 'SA1005',
+            'SA1006', 'SA1007', 'SA1008', 'SA1009', 'SA1010', 'SA1011', 'SA1012',
+            'SA1013', 'SA1014', 'SA1015', 'SA1016', 'SA1017', 'SA1018', 'SA1019',
+            'SA1020', 'SA1021', 'SA1022', 'SA1023', 'SA1024', 'SA1025', 'SA1026',
+            'SA1027', 'SA1028', 'SA1100', 'SA1101', 'SA1102', 'SA1103', 'SA1104',
+            'SA1105', 'SA1106', 'SA1107', 'SA1108', 'SA1109', 'SA1110', 'SA1111',
+            'SA1112', 'SA1113', 'SA1114', 'SA1115', 'SA1116', 'SA1117', 'SA1118',
+            'SA1119', 'SA1120', 'SA1121', 'SA1122', 'SA1123', 'SA1124', 'SA1125',
+            'SA1126', 'SA1127', 'SA1128', 'SA1129', 'SA1130', 'SA1131', 'SA1132',
+            'SA1133', 'SA1134', 'SA1135', 'SA1136', 'SA1137', 'SA1138', 'SA1139',
+            'SA1200', 'SA1201', 'SA1202', 'SA1203', 'SA1204', 'SA1205', 'SA1206',
+            'SA1207', 'SA1208', 'SA1209', 'SA1210', 'SA1211', 'SA1212', 'SA1213',
+            'SA1214', 'SA1215', 'SA1216', 'SA1217', 'SA1300', 'SA1301', 'SA1302',
+            'SA1303', 'SA1304', 'SA1305', 'SA1306', 'SA1307', 'SA1308', 'SA1309',
+            'SA1310', 'SA1311', 'SA1312', 'SA1313', 'SA1314', 'SA1400', 'SA1401',
+            'SA1402', 'SA1403', 'SA1404', 'SA1405', 'SA1406', 'SA1407', 'SA1408',
+            'SA1409', 'SA1410', 'SA1411', 'SA1412', 'SA1413', 'SA1500', 'SA1501',
+            'SA1502', 'SA1503', 'SA1504', 'SA1505', 'SA1506', 'SA1507', 'SA1508',
+            'SA1509', 'SA1510', 'SA1511', 'SA1512', 'SA1513', 'SA1514', 'SA1515',
+            'SA1516', 'SA1517', 'SA1518', 'SA1519', 'SA1520', 'SA1600', 'SA1601',
+            'SA1602', 'SA1603', 'SA1604', 'SA1605', 'SA1606', 'SA1607', 'SA1608',
+            'SA1609', 'SA1610', 'SA1611', 'SA1612', 'SA1613', 'SA1614', 'SA1615',
+            'SA1616', 'SA1617', 'SA1618', 'SA1619', 'SA1620', 'SA1621', 'SA1622',
+            'SA1623', 'SA1624', 'SA1625', 'SA1626', 'SA1627', 'SA1628', 'SA1629',
+            'SA1630', 'SA1631', 'SA1632', 'SA1633', 'SA1634', 'SA1635', 'SA1636',
+            'SA1637', 'SA1638', 'SA1639', 'SA1640', 'SA1641', 'SA1642', 'SA1643',
+            'SA1644', 'SA1645', 'SA1646', 'SA1647', 'SA1648', 'SA1649', 'SA1650',
+            'SA1651']
+
+  efl_stylecop_data = configuration_data()
+  watched_styles = []
+  severity_styles = get_option('dotnet-stylecop-severity')
+  if get_option('dotnet-stylecop') == '*'
+    watched_styles = styles
+  elif get_option('dotnet-stylecop') != ''
+    s = get_option('dotnet-stylecop').to_upper().split(',')
+    foreach cc : s
+      if cc.startswith('CA') or cc.startswith('SA')
+        watched_styles += cc
+      endif
+    endforeach
+  endif
+
+  foreach s : styles
+    if s in watched_styles
+      efl_stylecop_data.set('@0@'.format(s), '<Rule Id="@0@" Action="@1@"/>'.format(s, severity_styles))
+    else
+      efl_stylecop_data.set('@0@'.format(s), '<Rule Id="@0@" Action="None"/>'.format(s))
+    endif
+  endforeach
+
+  ca_ruleset = configure_file(input : 'ca.ruleset.in',
+                              output : 'ca.ruleset',
+                              configuration : efl_stylecop_data)
+
   dotnet = find_program('dotnet')
-  warning('Dotnet support is still experimental.')
 
   lib_csproj_conf_data = configuration_data()
 
@@ -184,6 +246,7 @@ if (get_option('dotnet'))
 
   lib_csproj_conf_data.set('NETSTANDARD_VERSION', dotnet_standard_version)
   lib_csproj_conf_data.set('BINDING_SRC', meson.current_source_dir())
+  lib_csproj_conf_data.set('CA_RULESET', join_paths(meson.build_root(), '@0@'.format(ca_ruleset)))
   lib_csproj_conf_data.set('EFL_VERSION', meson.project_version())
 
   if get_option('mono-beta')
@@ -197,7 +260,7 @@ if (get_option('dotnet'))
                               configuration: lib_csproj_conf_data)
 
   efl_mono = custom_target('efl_mono',
-    input: mono_generator_target + mono_files + [efl_src] + [lib_csproj],
+    input: mono_generator_target + mono_files + [efl_src] + [lib_csproj] + [ca_ruleset],
     output: 'efl_sharp.dll',
     build_by_default: true,
     command: [dotnet,
index c236363..a4c2197 100644 (file)
@@ -19,6 +19,9 @@
   <ItemGroup>
     <ProjectReference Include="../../bindings/mono/efl_sharp.csproj" />
   </ItemGroup>
+  <PropertyGroup>
+         <CodeAnalysisRuleSet>@CA_RULESET@</CodeAnalysisRuleSet>
+  </PropertyGroup>
 
   <ItemGroup>
     <Compile Include="@BINDING_TEST_SRC@/*.cs" />
index 2bba162..9c71589 100644 (file)
@@ -94,6 +94,7 @@ if get_option('dotnet')
   dotnet_test_conf_data.set('BINDING_BUILD', join_paths(meson.current_build_dir(),
                                                         '..', '..', 'bindings', 'mono'))
   dotnet_test_conf_data.set('BINDING_TEST_SRC', meson.current_source_dir())
+  dotnet_test_conf_data.set('CA_RULESET', join_paths(meson.build_root(), '@0@'.format(ca_ruleset)))
 
   dotnet_test_conf_data.set('NETCOREAPP_VERSION', dotnet_core_app_version)