From 0c9ddb0f345c400e6d7db1a38123a9a0d2fb27bb Mon Sep 17 00:00:00 2001 From: Lauro Moura Date: Wed, 20 Nov 2019 18:34:08 -0300 Subject: [PATCH] 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 --- .../eolian_mono/eolian/mono/culture_info.hh | 61 +++++++++++++++++++ .../eolian/mono/struct_definition.hh | 5 +- 2 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/bin/eolian_mono/eolian/mono/culture_info.hh 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 + 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 {}; +} + +} } } + +#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 << "/// Get a hash code for this item.\n" << since_line << indent << scope_tab << "/// \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;