예제 #1
0
        public static string BuildSpecifiedModelName(
            this SetterKind setterKind,
            string modelNameSuffix)
        {
            var result = Invariant($"{Settings.ModelBaseName}{setterKind.BuildNameToken()}{modelNameSuffix}");

            return(result);
        }
예제 #2
0
 public StructVectorDefinition(
     string name,
     string typeName,
     SetterKind setterKind,
     List <string> properties)
 {
     this.PropertyNames = properties;
     this.SetterKind    = setterKind;
     this.FbsTypeName   = typeName;
     this.Name          = name;
 }
예제 #3
0
        public static string BuildScriptedModelName(
            this DeclaredKeyMethod declaredKeyMethod,
            SetterKind setterKind,
            HierarchyKind hierarchyKind,
            TypeWrapperKind typeWrapperKind,
            string childIdentifier)
        {
            var result = Invariant($"{Settings.ModelBaseName}{declaredKeyMethod.BuildNameToken()}{setterKind.BuildNameToken()}{typeWrapperKind.BuildNameToken()}{hierarchyKind.BuildNameToken()}{childIdentifier}");

            return(result);
        }
예제 #4
0
        public static string BuildNameToken(
            this SetterKind setterKind)
        {
            switch (setterKind)
            {
            case SetterKind.PrivateSetters:
                return("PrivateSet");

            case SetterKind.PublicSetters:
                return("PublicSet");

            default:
                throw new NotSupportedException("this setter kind is not supported: " + setterKind);
            }
        }
예제 #5
0
        public static bool RequiresConstructor(
            this SetterKind setterKind)
        {
            bool result;

            switch (setterKind)
            {
            ////case SetterKind.ReadOnlyAuto:
            case SetterKind.PrivateSetters:
                result = true;
                break;

            case SetterKind.PublicSetters:
                result = false;
                break;

            default:
                throw new NotSupportedException(Invariant($"This {nameof(SetterKind)} is not supported: {setterKind}"));
            }

            return(result);
        }
예제 #6
0
        public static string GetSpecifiedModelsDirectoryPath(
            this SpecifiedModelKind specifiedModelKind,
            SetterKind setterKind,
            ModelOrTest modelOrTest)
        {
            string result;

            switch (modelOrTest)
            {
            case ModelOrTest.Model:
                result = Settings.SpecifiedModelsPath + specifiedModelKind + "\\" + setterKind.BuildNameToken() + "\\";
                break;

            case ModelOrTest.Test:
                result = Settings.SpecifiedModelsTestPath + specifiedModelKind + "\\" + setterKind.BuildNameToken() + "\\";
                break;

            default:
                throw new NotSupportedException("This kind is not supported: " + modelOrTest);
            }

            return(result);
        }
예제 #7
0
        public static string ToSetterString(
            this SetterKind setterKind)
        {
            string result;

            switch (setterKind)
            {
            ////case SetterKind.ReadOnlyAuto:
            ////    result = string.Empty;
            ////    break;
            case SetterKind.PrivateSetters:
                result = "private set; ";
                break;

            case SetterKind.PublicSetters:
                result = "set; ";
                break;

            default:
                throw new NotSupportedException(Invariant($"This {nameof(SetterKind)} is not supported: {setterKind}"));
            }

            return(result);
        }
예제 #8
0
        public static string GetScriptedModelsDirectoryPath(
            this ModelOrTest modelOrTest,
            DeclaredKeyMethod declaredKeyMethod,
            SetterKind setterKind,
            TypeWrapperKind typeWrapperKind)
        {
            string result;

            switch (modelOrTest)
            {
            case ModelOrTest.Model:
                result = Settings.ScriptedModelsPath + declaredKeyMethod.BuildNameToken() + "\\" + setterKind.BuildNameToken() + "\\" + typeWrapperKind.BuildNameToken() + "\\";
                break;

            case ModelOrTest.Test:
                result = Settings.ScriptedModelsTestsPath + declaredKeyMethod.BuildNameToken() + "\\" + setterKind.BuildNameToken() + "\\" + typeWrapperKind.BuildNameToken() + "\\";
                break;

            default:
                throw new NotSupportedException("This model or test is not supported: " + modelOrTest);
            }

            return(result);
        }
예제 #9
0
        private void Test(SetterKind setterKind, FlatBufferDeserializationOption option)
        {
            string schema = $@"
            namespace VirtualTests;
            table VirtualTable ({MetadataKeys.SerializerKind}:""{option}"") {{
                Default:int ({MetadataKeys.Setter}:""{setterKind}"");
                ForcedVirtual:int ({MetadataKeys.NonVirtualProperty}:""false"", {MetadataKeys.SetterLegacy}:""{setterKind}"");
                ForcedNonVirtual:int ({MetadataKeys.NonVirtualProperty}:""true"", {MetadataKeys.Setter}:""{(setterKind != SetterKind.None ? setterKind : SetterKind.Public)}"");
                Struct:VirtualStruct;
            }}

            struct VirtualStruct {{
                Default:int ({MetadataKeys.Setter}:""{setterKind}"");
                ForcedVirtual:int ({MetadataKeys.NonVirtualProperty}:""false"", setter:""{setterKind}"");
                ForcedNonVirtual:int ({MetadataKeys.NonVirtualProperty}:""true"", setter:""{(setterKind != SetterKind.None ? setterKind : SetterKind.Public)}"");
            }}";

            Assembly asm = FlatSharpCompiler.CompileAndLoadAssembly(schema, new());

            foreach (var typeName in new[] { "VirtualTests.VirtualTable", "VirtualTests.VirtualStruct" })
            {
                Type type = asm.GetType(typeName);
                Assert.IsTrue(type.IsPublic);
                var defaultProperty          = type.GetProperty("Default");
                var forcedVirtualProperty    = type.GetProperty("ForcedVirtual");
                var forcedNonVirtualProperty = type.GetProperty("ForcedNonVirtual");

                Assert.IsNotNull(defaultProperty);
                Assert.IsNotNull(forcedVirtualProperty);
                Assert.IsNotNull(forcedNonVirtualProperty);

                Assert.IsTrue(defaultProperty.GetMethod.IsPublic);
                Assert.IsTrue(forcedVirtualProperty.GetMethod.IsPublic);
                Assert.IsTrue(forcedNonVirtualProperty.GetMethod.IsPublic);

                if (setterKind == SetterKind.PublicInit ||
                    setterKind == SetterKind.ProtectedInit ||
                    setterKind == SetterKind.ProtectedInternalInit)
                {
                    Assert.IsNotNull(defaultProperty.SetMethod.ReturnParameter.GetRequiredCustomModifiers().Any(x => x.FullName == "System.Runtime.CompilerServices.IsExternalInit"));
                    Assert.IsNotNull(forcedVirtualProperty.SetMethod.ReturnParameter.GetRequiredCustomModifiers().Any(x => x.FullName == "System.Runtime.CompilerServices.IsExternalInit"));
                    Assert.IsNotNull(forcedNonVirtualProperty.SetMethod.ReturnParameter.GetRequiredCustomModifiers().Any(x => x.FullName == "System.Runtime.CompilerServices.IsExternalInit"));
                }

                if (setterKind == SetterKind.None)
                {
                    Assert.IsNull(defaultProperty.SetMethod);
                    Assert.IsNull(forcedVirtualProperty.SetMethod);
                    Assert.IsNotNull(forcedNonVirtualProperty.SetMethod); // non-virtual can't have null setters.
                }
                else if (setterKind == SetterKind.Protected || setterKind == SetterKind.ProtectedInit)
                {
                    Assert.IsTrue(defaultProperty.SetMethod.IsFamily);
                    Assert.IsTrue(forcedVirtualProperty.SetMethod.IsFamily);
                    Assert.IsTrue(forcedNonVirtualProperty.SetMethod.IsFamily);
                }
                else if (setterKind == SetterKind.ProtectedInternal || setterKind == SetterKind.ProtectedInternalInit)
                {
                    Assert.IsTrue(defaultProperty.SetMethod.IsFamilyOrAssembly);
                    Assert.IsTrue(forcedVirtualProperty.SetMethod.IsFamilyOrAssembly);
                    Assert.IsTrue(forcedNonVirtualProperty.SetMethod.IsFamilyOrAssembly);
                }
                else if (setterKind == SetterKind.Public || setterKind == SetterKind.PublicInit)
                {
                    Assert.IsTrue(defaultProperty.SetMethod.IsPublic);
                    Assert.IsTrue(forcedVirtualProperty.SetMethod.IsPublic);
                    Assert.IsTrue(forcedNonVirtualProperty.SetMethod.IsPublic);
                }
                else
                {
                    Assert.Fail();
                }
            }
        }
예제 #10
0
        private void Test(SetterKind setterKind, FlatBufferDeserializationOption option)
        {
            string schema = $@"
            namespace VirtualTests;
            table VirtualTable (PrecompiledSerializer:""{option}"") {{
                Default:int (setter:""{setterKind}"");
                ForcedVirtual:int (virtual:""true"", setter:""{setterKind}"");
                ForcedNonVirtual:int (virtual:""false"", setter:""{(setterKind != SetterKind.None ? setterKind : SetterKind.Public)}"");
                Struct:VirtualStruct;
            }}

            struct VirtualStruct {{
                Default:int (setter:""{setterKind}"");
                ForcedVirtual:int (virtual:""true"", setter:""{setterKind}"");
                ForcedNonVirtual:int (virtual:""false"", setter:""{(setterKind != SetterKind.None ? setterKind : SetterKind.Public)}"");
            }}";

            Assembly asm = FlatSharpCompiler.CompileAndLoadAssembly(schema);

            foreach (var typeName in new[] { "VirtualTests.VirtualTable", "VirtualTests.VirtualStruct" })
            {
                Type type = asm.GetType(typeName);
                Assert.IsTrue(type.IsPublic);
                var defaultProperty          = type.GetProperty("Default");
                var forcedVirtualProperty    = type.GetProperty("ForcedVirtual");
                var forcedNonVirtualProperty = type.GetProperty("ForcedNonVirtual");

                Assert.IsNotNull(defaultProperty);
                Assert.IsNotNull(forcedVirtualProperty);
                Assert.IsNotNull(forcedNonVirtualProperty);

                Assert.IsTrue(defaultProperty.GetMethod.IsPublic);
                Assert.IsTrue(forcedVirtualProperty.GetMethod.IsPublic);
                Assert.IsTrue(forcedNonVirtualProperty.GetMethod.IsPublic);

                if (setterKind == SetterKind.None)
                {
                    Assert.IsNull(defaultProperty.SetMethod);
                    Assert.IsNull(forcedVirtualProperty.SetMethod);
                    Assert.IsNotNull(forcedNonVirtualProperty.SetMethod); // non-virtual can't have null setters.
                }
                else if (setterKind == SetterKind.Protected)
                {
                    Assert.IsTrue(defaultProperty.SetMethod.IsFamily);
                    Assert.IsTrue(forcedVirtualProperty.SetMethod.IsFamily);
                    Assert.IsTrue(forcedNonVirtualProperty.SetMethod.IsFamily);
                }
                else if (setterKind == SetterKind.ProtectedInternal)
                {
                    Assert.IsTrue(defaultProperty.SetMethod.IsFamilyOrAssembly);
                    Assert.IsTrue(forcedVirtualProperty.SetMethod.IsFamilyOrAssembly);
                    Assert.IsTrue(forcedNonVirtualProperty.SetMethod.IsFamilyOrAssembly);
                }
                else if (setterKind == SetterKind.Public)
                {
                    Assert.IsTrue(defaultProperty.SetMethod.IsPublic);
                    Assert.IsTrue(forcedVirtualProperty.SetMethod.IsPublic);
                    Assert.IsTrue(forcedNonVirtualProperty.SetMethod.IsPublic);
                }
                else
                {
                    Assert.Fail();
                }
            }
        }
예제 #11
0
 private static bool ParseSetterKind(string value, out SetterKind setter)
 {
     return(Enum.TryParse <SetterKind>(value, true, out setter));
 }
예제 #12
0
    private void Test(SetterKind setterKind, FlatBufferDeserializationOption option)
    {
        string schema = $@"
            {MetadataHelpers.AllAttributes}
            namespace VirtualTests;
            table VirtualTable ({MetadataKeys.SerializerKind}:""{option}"") {{
                Default:int ({MetadataKeys.Setter}:""{setterKind}"");
                ForcedVirtual:int ({MetadataKeys.NonVirtualProperty}:""false"", {MetadataKeys.Setter}:""{setterKind}"");
                ForcedNonVirtual:int ({MetadataKeys.NonVirtualProperty}:""true"", {MetadataKeys.Setter}:""{(setterKind != SetterKind.None ? setterKind : SetterKind.Public)}"");
                Struct:VirtualStruct;
            }}

            struct VirtualStruct {{
                Default:int ({MetadataKeys.Setter}:""{setterKind}"");
                ForcedVirtual:int ({MetadataKeys.NonVirtualProperty}:""false"", {MetadataKeys.Setter}:""{setterKind}"");
                ForcedNonVirtual:int ({MetadataKeys.NonVirtualProperty}:""true"", {MetadataKeys.Setter}:""{(setterKind != SetterKind.None ? setterKind : SetterKind.Public)}"");
            }}";

        bool isInit = setterKind == SetterKind.PublicInit ||
                      setterKind == SetterKind.ProtectedInit ||
                      setterKind == SetterKind.ProtectedInternalInit;

        Assembly asm;

#if NET5_0_OR_GREATER
        asm = FlatSharpCompiler.CompileAndLoadAssembly(schema, new());
#else
        try
        {
            asm = FlatSharpCompiler.CompileAndLoadAssembly(schema, new());
        }
        catch (InvalidFbsFileException ex) when(isInit)
        {
            // 3.1 should bail.
            Assert.Contains(
                $"The attribute '{MetadataKeys.Setter}' value {setterKind} is not supported in the current .NET Runtime. It requires .NET 5 or later.",
                ex.Message);
            return;
        }
#endif

        foreach (var typeName in new[] { "VirtualTests.VirtualTable", "VirtualTests.VirtualStruct" })
        {
            Type type = asm.GetType(typeName);
            Assert.True(type.IsPublic);
            var defaultProperty          = type.GetProperty("Default");
            var forcedVirtualProperty    = type.GetProperty("ForcedVirtual");
            var forcedNonVirtualProperty = type.GetProperty("ForcedNonVirtual");

            Assert.NotNull(defaultProperty);
            Assert.NotNull(forcedVirtualProperty);
            Assert.NotNull(forcedNonVirtualProperty);

            Assert.True(defaultProperty.GetMethod.IsPublic);
            Assert.True(forcedVirtualProperty.GetMethod.IsPublic);
            Assert.True(forcedNonVirtualProperty.GetMethod.IsPublic);

            if (isInit)
            {
                Assert.Contains(defaultProperty.SetMethod.ReturnParameter.GetRequiredCustomModifiers(), x => x.FullName == "System.Runtime.CompilerServices.IsExternalInit");
                Assert.Contains(forcedVirtualProperty.SetMethod.ReturnParameter.GetRequiredCustomModifiers(), x => x.FullName == "System.Runtime.CompilerServices.IsExternalInit");
                Assert.Contains(forcedNonVirtualProperty.SetMethod.ReturnParameter.GetRequiredCustomModifiers(), x => x.FullName == "System.Runtime.CompilerServices.IsExternalInit");
            }

            if (setterKind == SetterKind.None)
            {
                Assert.Null(defaultProperty.SetMethod);
                Assert.Null(forcedVirtualProperty.SetMethod);
                Assert.NotNull(forcedNonVirtualProperty.SetMethod); // non-virtual can't have null setters.
            }
            else if (setterKind == SetterKind.Protected || setterKind == SetterKind.ProtectedInit)
            {
                Assert.True(defaultProperty.SetMethod.IsFamily);
                Assert.True(forcedVirtualProperty.SetMethod.IsFamily);
                Assert.True(forcedNonVirtualProperty.SetMethod.IsFamily);
            }
            else if (setterKind == SetterKind.ProtectedInternal || setterKind == SetterKind.ProtectedInternalInit)
            {
                Assert.True(defaultProperty.SetMethod.IsFamilyOrAssembly);
                Assert.True(forcedVirtualProperty.SetMethod.IsFamilyOrAssembly);
                Assert.True(forcedNonVirtualProperty.SetMethod.IsFamilyOrAssembly);
            }
            else if (setterKind == SetterKind.Public || setterKind == SetterKind.PublicInit)
            {
                Assert.True(defaultProperty.SetMethod.IsPublic);
                Assert.True(forcedVirtualProperty.SetMethod.IsPublic);
                Assert.True(forcedNonVirtualProperty.SetMethod.IsPublic);
            }
            else
            {
                Assert.False(true);
            }
        }
    }