lauromoura pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0c9ddb0f345c400e6d7db1a38123a9a0d2fb27bb

commit 0c9ddb0f345c400e6d7db1a38123a9a0d2fb27bb
Author: Lauro Moura <[email protected]>
Date:   Wed Nov 20 18:34:08 2019 -0300

    csharp: CA1307 Add CultureInfo to generated code.
    
    Summary:
    For the struct fields with strings when implementing `GetHashCode`.
    
    Ref T8405
    
    Reviewers: brunobelo, felipealmeida, YOhoho
    
    Reviewed By: brunobelo
    
    Subscribers: cedric, #reviewers, #committers
    
    Tags: #efl
    
    Maniphest Tasks: T8405
    
    Differential Revision: https://phab.enlightenment.org/D10696
---
 src/bin/eolian_mono/eolian/mono/culture_info.hh    | 61 ++++++++++++++++++++++
 .../eolian_mono/eolian/mono/struct_definition.hh   |  5 +-
 2 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/src/bin/eolian_mono/eolian/mono/culture_info.hh 
b/src/bin/eolian_mono/eolian/mono/culture_info.hh
new file mode 100644
index 0000000000..f1efb1ce4e
--- /dev/null
+++ b/src/bin/eolian_mono/eolian/mono/culture_info.hh
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2019 by its authors. See AUTHORS.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef CULTURE_INFO_GENERATOR_HH
+#define CULTURE_INFO_GENERATOR_HH
+
+#include "grammar/generator.hpp"
+#include "grammar/klass_def.hpp"
+
+namespace eolian_mono {
+
+namespace attributes = efl::eolian::grammar::attributes;
+
+// Some methods on string require a culture info parameter due to warning 
CA1307
+struct culture_info_generator
+{
+    template<typename OutputIterator, typename Context>
+    bool generate(OutputIterator sink, attributes::struct_field_def const& 
field, Context const& context) const
+    {
+        std::string managed_name;
+
+        if (!as_generator(type).generate(std::back_inserter(managed_name), 
field.type, context))
+          return false;
+
+        if (managed_name == "System.String")
+          if (!as_generator(lit("StringComparison.Ordinal")).generate(sink, 
attributes::unused, context))
+            return false;
+
+        return true;
+    }
+} const culture_info {};
+
+}
+
+namespace efl { namespace eolian { namespace grammar {
+
+template <>
+struct is_eager_generator< ::eolian_mono::culture_info_generator> : 
std::true_type {};
+template <>
+struct is_generator< ::eolian_mono::culture_info_generator> : std::true_type 
{};
+
+namespace type_traits {
+template <>
+struct attributes_needed< ::eolian_mono::culture_info_generator> : 
std::integral_constant<int, 1> {};
+}
+
+} } }
+
+#endif // CULTURE_INFO_GENERATOR_HH
diff --git a/src/bin/eolian_mono/eolian/mono/struct_definition.hh 
b/src/bin/eolian_mono/eolian/mono/struct_definition.hh
index 973eb27149..70332c9889 100644
--- a/src/bin/eolian_mono/eolian/mono/struct_definition.hh
+++ b/src/bin/eolian_mono/eolian/mono/struct_definition.hh
@@ -29,6 +29,7 @@
 #include "documentation.hh"
 #include "struct_fields.hh"
 #include "blacklist.hh"
+#include "culture_info.hh"
 
 namespace eolian_mono {
 
@@ -485,7 +486,6 @@ struct struct_definition_generator
              indent << scope_tab << "/// <summary>Get a hash code for this 
item.\n"
              << since_line
              << indent << scope_tab << "/// </summary>\n"
-             << "#pragma warning disable CA1307\n"
              << indent << scope_tab << "public override int GetHashCode()\n"
              << indent << scope_tab << "{\n"
           ).generate(sink, attributes::unused, context))
@@ -500,7 +500,7 @@ struct struct_definition_generator
           // return hash
           if (!as_generator(
                 indent << scope_tab << scope_tab << "int hash = 17;\n"
-                << *(indent << scope_tab << scope_tab << "hash = hash * 23 + " 
<< name_helpers::struct_field_name << ".GetHashCode();\n")
+                << *(grammar::attribute_reorder<-1, -1>(indent << scope_tab << 
scope_tab << "hash = hash * 23 + " << name_helpers::struct_field_name << 
".GetHashCode(" << culture_info << ");\n"))
                 << indent << scope_tab << scope_tab << "return hash;\n"
               ).generate(sink, struct_.fields, context))
             return false;
@@ -516,7 +516,6 @@ struct struct_definition_generator
 
      if (!as_generator(
              indent << scope_tab << "}\n"
-             << "#pragma warning restore CA1307\n\n"
           ).generate(sink, attributes::unused, context))
        return false;
 

-- 


Reply via email to