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
This commit is contained in:
Lauro Moura 2019-11-20 18:34:08 -03:00
parent 6772a78d02
commit 0c9ddb0f34
2 changed files with 63 additions and 3 deletions

View File

@ -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

View File

@ -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;