[C#] Using 'global::' as qualifying_start_ within BaseGenerator (#6767)

* Update idl_gen_csharp.cpp

Change csharp generator to use "global::" for it's qualifying_start_ to disambiguate namespaces

* regenerate testing files

regenerate testing files

* Missed TableInC.cs

updated with global prefix

* Remove "global::" from qualifying_start_ for csharp generator

* C# global alias

* Tests and docs for --cs-global-alias

Add tests for --cs-global-alias to demonstrate use case for why it's needed.

Add documentation to Compiler.md

* Add also to help text

Add also to help text
This commit is contained in:
Todd Hansen 2021-09-15 16:57:29 -05:00 committed by GitHub
parent 90baa1444b
commit 6f7a57eaa0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 153 additions and 3 deletions

View File

@ -79,7 +79,7 @@ Additional options:
- `--allow-non-utf8` : Pass non-UTF-8 input through parser and emit nonstandard
\x escapes in JSON. (Default is to raise parse error on non-UTF-8 input.)
- `--natural-utf8` : Output strings with UTF-8 as human-readable strings.
- `--natural-utf8` : Output strings with UTF-8 as human-readable strings.
By default, UTF-8 characters are printed as \uXXXX escapes."
- `--defaults-json` : Output fields whose value is equal to the default value
@ -216,7 +216,9 @@ Additional options:
- `--flexbuffers` : Used with "binary" and "json" options, it generates
data using schema-less FlexBuffers.
- `--no-warnings` : Inhibit all warning messages.
- `--no-warnings` : Inhibit all warning messages.
- `--cs-global-alias` : Prepend `global::` to all user generated csharp classes and structs.
NOTE: short-form options for generators are deprecated, use the long form
whenever possible.

View File

@ -594,6 +594,7 @@ struct IDLOptions {
std::string filename_extension;
bool no_warnings;
std::string project_root;
bool cs_global_alias;
// Possible options for the more general generator below.
enum Language {
@ -679,6 +680,7 @@ struct IDLOptions {
filename_extension(),
no_warnings(false),
project_root(""),
cs_global_alias(false),
mini_reflect(IDLOptions::kNone),
require_explicit_ids(false),
lang_to_generate(0),

View File

@ -179,6 +179,7 @@ std::string FlatCompiler::GetUsageString(const char *program_name) const {
" --flexbuffers Used with \"binary\" and \"json\" options, it generates\n"
" data using schema-less FlexBuffers.\n"
" --no-warnings Inhibit all warning messages.\n"
" --cs-global-alias Prepend \"global::\" to all user generated csharp classes and structs.\n"
"FILEs may be schemas (must end in .fbs), binary schemas (must end in .bfbs),\n"
"or JSON files (conforming to preceding schema). FILEs after the -- must be\n"
"binary flatbuffer format files.\n"
@ -391,6 +392,8 @@ int FlatCompiler::Compile(int argc, const char **argv) {
opts.cpp_std = arg.substr(std::string("--cpp-std=").size());
} else if (arg == "--cpp-static-reflection") {
opts.cpp_static_reflection = true;
} else if (arg == "--cs-global-alias") {
opts.cs_global_alias = true;
} else {
for (size_t i = 0; i < params_.num_generators; ++i) {
if (arg == params_.generators[i].generator_opt_long ||

View File

@ -48,7 +48,7 @@ class CSharpGenerator : public BaseGenerator {
public:
CSharpGenerator(const Parser &parser, const std::string &path,
const std::string &file_name)
: BaseGenerator(parser, path, file_name, "", ".", "cs"),
: BaseGenerator(parser, path, file_name, parser.opts.cs_global_alias ? "global::" : "", ".", "cs"),
cur_name_space_(nullptr) {
// clang-format off

View File

@ -149,6 +149,15 @@
<Compile Include="..\KeywordTest\KeywordsInUnion.cs">
<Link>KeywordTest\KeywordsInUnion.cs</Link>
</Compile>
<Compile Include="..\nested_namespace_test\nested_namespace_test1_generated.cs">
<Link>nested_namespace_test\nested_namespace_test1_generated.cs</Link>
</Compile>
<Compile Include="..\nested_namespace_test\nested_namespace_test2_generated.cs">
<Link>nested_namespace_test\nested_namespace_test2_generated.cs</Link>
</Compile>
<Compile Include="..\nested_namespace_test\nested_namespace_test3_generated.cs">
<Link>nested_namespace_test\nested_namespace_test3_generated.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>

View File

@ -180,6 +180,16 @@
<Compile Include="..\KeywordTest\KeywordsInUnion.cs">
<Link>KeywordTest\KeywordsInUnion.cs</Link>
</Compile>
<Compile Include="..\nested_namespace_test\nested_namespace_test1_generated.cs">
<Link>nested_namespace_test\nested_namespace_test1_generated.cs</Link>
</Compile>
<Compile Include="..\nested_namespace_test\nested_namespace_test2_generated.cs">
<Link>nested_namespace_test\nested_namespace_test2_generated.cs</Link>
</Compile>
<Compile Include="..\nested_namespace_test\nested_namespace_test3_generated.cs">
<Link>nested_namespace_test\nested_namespace_test3_generated.cs</Link>
</Compile>
</ItemGroup>
<Compile Include="Assert.cs" />
<Compile Include="ByteBufferTests.cs" />
<Compile Include="FlatBufferBuilderTests.cs" />

View File

@ -74,6 +74,9 @@ set TEST_NOINCL_FLAGS=%TEST_BASE_FLAGS% --no-includes
@rem Generate the keywords tests
..\%buildtype%\flatc.exe --csharp --scoped-enums %TEST_BASE_FLAGS% %TEST_CS_FLAGS% keyword_test.fbs || goto FAIL
@rem Generate the nested namespace tests
..\%buildtype%\flatc.exe --csharp --cs-global-alias --gen-onefile %TEST_BASE_FLAGS% %TEST_CS_FLAGS% -o nested_namespace_test nested_namespace_test/nested_namespace_test1.fbs nested_namespace_test/nested_namespace_test2.fbs nested_namespace_test/nested_namespace_test3.fbs || goto FAIL
if NOT "%MONSTER_EXTRA%"=="skip" (
@echo Generate MosterExtra
..\%buildtype%\flatc.exe --cpp --java --csharp %TEST_NOINCL_FLAGS% %TEST_CPP_FLAGS% %TEST_CS_FLAGS% monster_extra.fbs monsterdata_extra.json || goto FAIL

View File

@ -77,6 +77,9 @@ $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS $TEST_TS_FLAGS -o namespace_te
../flatc --csharp $TEST_BASE_FLAGS $TEST_CS_FLAGS ./keyword_test.fbs
../flatc --rust $TEST_RUST_FLAGS -o keyword_test ./keyword_test.fbs
# Generate the keywords tests
../flatc --csharp --cs-global-alias --gen-onefile $TEST_BASE_FLAGS $TEST_CS_FLAGS -o nested_namespace_test nested_namespace_test/nested_namespace_test1.fbs nested_namespace_test/nested_namespace_test2.fbs nested_namespace_test/nested_namespace_test3.fbs
working_dir=`pwd`
cd FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests
$working_dir/../flatc --bfbs-filenames $working_dir --swift --grpc $TEST_NOINCL_FLAGS $TEST_CPP_FLAGS $TEST_CS_FLAGS -I ${working_dir}/include_test ${working_dir}/monster_test.fbs

View File

@ -0,0 +1,3 @@
namespace NamespaceB;
enum Color:byte { Red, Green, Blue }

View File

@ -0,0 +1,21 @@
// <auto-generated>
// automatically generated by the FlatBuffers compiler, do not modify
// </auto-generated>
namespace NamespaceB
{
using global::System;
using global::System.Collections.Generic;
using global::FlatBuffers;
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum Color : sbyte
{
Red = 0,
Green = 1,
Blue = 2,
};
}

View File

@ -0,0 +1,3 @@
namespace NamespaceA.NamespaceB;
enum Color:byte { Purple }

View File

@ -0,0 +1,19 @@
// <auto-generated>
// automatically generated by the FlatBuffers compiler, do not modify
// </auto-generated>
namespace NamespaceA.NamespaceB
{
using global::System;
using global::System.Collections.Generic;
using global::FlatBuffers;
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public enum Color : sbyte
{
Purple = 0,
};
}

View File

@ -0,0 +1,7 @@
include "nested_namespace_test1.fbs";
namespace NamespaceA.NamespaceB;
table ColorTestTable {
color:NamespaceB.Color = Blue;
}

View File

@ -0,0 +1,65 @@
// <auto-generated>
// automatically generated by the FlatBuffers compiler, do not modify
// </auto-generated>
namespace NamespaceA.NamespaceB
{
using global::System;
using global::System.Collections.Generic;
using global::FlatBuffers;
public struct ColorTestTable : IFlatbufferObject
{
private Table __p;
public ByteBuffer ByteBuffer { get { return __p.bb; } }
public static void ValidateVersion() { FlatBufferConstants.FLATBUFFERS_2_0_0(); }
public static ColorTestTable GetRootAsColorTestTable(ByteBuffer _bb) { return GetRootAsColorTestTable(_bb, new ColorTestTable()); }
public static ColorTestTable GetRootAsColorTestTable(ByteBuffer _bb, ColorTestTable obj) { return (obj.__assign(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
public void __init(int _i, ByteBuffer _bb) { __p = new Table(_i, _bb); }
public ColorTestTable __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public global::NamespaceB.Color Color { get { int o = __p.__offset(4); return o != 0 ? (global::NamespaceB.Color)__p.bb.GetSbyte(o + __p.bb_pos) : global::NamespaceB.Color.Blue; } }
public bool MutateColor(global::NamespaceB.Color color) { int o = __p.__offset(4); if (o != 0) { __p.bb.PutSbyte(o + __p.bb_pos, (sbyte)color); return true; } else { return false; } }
public static Offset<global::NamespaceA.NamespaceB.ColorTestTable> CreateColorTestTable(FlatBufferBuilder builder,
global::NamespaceB.Color color = global::NamespaceB.Color.Blue) {
builder.StartTable(1);
ColorTestTable.AddColor(builder, color);
return ColorTestTable.EndColorTestTable(builder);
}
public static void StartColorTestTable(FlatBufferBuilder builder) { builder.StartTable(1); }
public static void AddColor(FlatBufferBuilder builder, global::NamespaceB.Color color) { builder.AddSbyte(0, (sbyte)color, 2); }
public static Offset<global::NamespaceA.NamespaceB.ColorTestTable> EndColorTestTable(FlatBufferBuilder builder) {
int o = builder.EndTable();
return new Offset<global::NamespaceA.NamespaceB.ColorTestTable>(o);
}
public ColorTestTableT UnPack() {
var _o = new ColorTestTableT();
this.UnPackTo(_o);
return _o;
}
public void UnPackTo(ColorTestTableT _o) {
_o.Color = this.Color;
}
public static Offset<global::NamespaceA.NamespaceB.ColorTestTable> Pack(FlatBufferBuilder builder, ColorTestTableT _o) {
if (_o == null) return default(Offset<global::NamespaceA.NamespaceB.ColorTestTable>);
return CreateColorTestTable(
builder,
_o.Color);
}
}
public class ColorTestTableT
{
[Newtonsoft.Json.JsonProperty("color")]
public global::NamespaceB.Color Color { get; set; }
public ColorTestTableT() {
this.Color = global::NamespaceB.Color.Blue;
}
}
}