Esempio n. 1
0
        private static VirtualnessModifiers GetVirtualnessModifiers(Symbol symbol)
        {
            VirtualnessModifiers mods = VirtualnessModifiers.None;

            if (symbol.IsAbstract)
            {
                mods |= VirtualnessModifiers.Abstract;
            }
            if (symbol.IsVirtual)
            {
                mods |= VirtualnessModifiers.Virtual;
            }

            if (symbol.IsSealed)
            {
                mods |= VirtualnessModifiers.Sealed;
            }
            else if (symbol.IsOverride)
            {
                mods |= VirtualnessModifiers.Override;
            }

            return(mods);
        }
Esempio n. 2
0
        public void TestMixedAccessorModifiers()
        {
            var assembly = MetadataTestHelpers.GetSymbolForReference(TestReferences.SymbolsTests.Properties);

            var globalNamespace = assembly.GlobalNamespace;

            var type = globalNamespace.GetMember <NamedTypeSymbol>("AccessorModifierMismatch");

            const VirtualnessModifiers @none     = VirtualnessModifiers.None;
            const VirtualnessModifiers @abstract = VirtualnessModifiers.Abstract;
            const VirtualnessModifiers @virtual  = VirtualnessModifiers.Virtual;
            const VirtualnessModifiers @override = VirtualnessModifiers.Override;
            const VirtualnessModifiers @sealed   = VirtualnessModifiers.Sealed;

            VirtualnessModifiers[] modList = new[]
            {
                @none,
                @abstract,
                @virtual,
                @override,
                @sealed,
            };

            int length = 1 + modList.Cast <int>().Max();

            VirtualnessModifiers[,] expected = new VirtualnessModifiers[length, length];

            expected[(int)@none, (int)@none]     = @none;
            expected[(int)@none, (int)@abstract] = @abstract;
            expected[(int)@none, (int)@virtual]  = @virtual;
            expected[(int)@none, (int)@override] = @override;
            expected[(int)@none, (int)@sealed]   = @override; //not both sealed

            expected[(int)@abstract, (int)@none]     = @abstract;
            expected[(int)@abstract, (int)@abstract] = @abstract;
            expected[(int)@abstract, (int)@virtual]  = @abstract;
            expected[(int)@abstract, (int)@override] = @abstract | @override;
            expected[(int)@abstract, (int)@sealed]   = @abstract | @override; //not both sealed

            expected[(int)@virtual, (int)@none]     = @virtual;
            expected[(int)@virtual, (int)@abstract] = @abstract;
            expected[(int)@virtual, (int)@virtual]  = @virtual;
            expected[(int)@virtual, (int)@override] = @override;
            expected[(int)@virtual, (int)@sealed]   = @override; //not both sealed

            expected[(int)@override, (int)@none]     = @override;
            expected[(int)@override, (int)@abstract] = @override | @abstract;
            expected[(int)@override, (int)@virtual]  = @override;
            expected[(int)@override, (int)@override] = @override;
            expected[(int)@override, (int)@sealed]   = @override;           //not both sealed

            expected[(int)@sealed, (int)@none]     = @override;             //not both sealed
            expected[(int)@sealed, (int)@abstract] = @abstract | @override; //not both sealed
            expected[(int)@sealed, (int)@virtual]  = @override;             //not both sealed
            expected[(int)@sealed, (int)@override] = @override;             //not both sealed
            expected[(int)@sealed, (int)@sealed]   = @sealed;

            // Table should be symmetrical.
            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < length; j++)
                {
                    Assert.Equal(expected[i, j], expected[j, i]);
                }
            }

            foreach (var mod1 in modList)
            {
                foreach (var mod2 in modList)
                {
                    var property = type.GetMember <PropertySymbol>(mod1.ToString() + mod2.ToString());
                    var getter   = property.GetMethod;
                    var setter   = property.SetMethod;

                    Assert.Equal(mod1, GetVirtualnessModifiers(getter));
                    Assert.Equal(mod2, GetVirtualnessModifiers(setter));

                    Assert.Equal(expected[(int)mod1, (int)mod2], GetVirtualnessModifiers(property));
                }
            }
        }
        public void TestMixedAccessorModifiers()
        {
            var assembly = MetadataTestHelpers.GetSymbolForReference(TestReferences.SymbolsTests.Properties);

            var globalNamespace = assembly.GlobalNamespace;

            var type = globalNamespace.GetMember<NamedTypeSymbol>("AccessorModifierMismatch");

            const VirtualnessModifiers @none = VirtualnessModifiers.None;
            const VirtualnessModifiers @abstract = VirtualnessModifiers.Abstract;
            const VirtualnessModifiers @virtual = VirtualnessModifiers.Virtual;
            const VirtualnessModifiers @override = VirtualnessModifiers.Override;
            const VirtualnessModifiers @sealed = VirtualnessModifiers.Sealed;

            VirtualnessModifiers[] modList = new[]
            {
                @none,
                @abstract,
                @virtual,
                @override,
                @sealed,
            };

            int length = 1 + modList.Cast<int>().Max();
            VirtualnessModifiers[,] expected = new VirtualnessModifiers[length, length];

            expected[(int)@none, (int)@none] = @none;
            expected[(int)@none, (int)@abstract] = @abstract;
            expected[(int)@none, (int)@virtual] = @virtual;
            expected[(int)@none, (int)@override] = @override;
            expected[(int)@none, (int)@sealed] = @override; //not both sealed

            expected[(int)@abstract, (int)@none] = @abstract;
            expected[(int)@abstract, (int)@abstract] = @abstract;
            expected[(int)@abstract, (int)@virtual] = @abstract;
            expected[(int)@abstract, (int)@override] = @abstract | @override;
            expected[(int)@abstract, (int)@sealed] = @abstract | @override; //not both sealed

            expected[(int)@virtual, (int)@none] = @virtual;
            expected[(int)@virtual, (int)@abstract] = @abstract;
            expected[(int)@virtual, (int)@virtual] = @virtual;
            expected[(int)@virtual, (int)@override] = @override;
            expected[(int)@virtual, (int)@sealed] = @override; //not both sealed

            expected[(int)@override, (int)@none] = @override;
            expected[(int)@override, (int)@abstract] = @override | @abstract;
            expected[(int)@override, (int)@virtual] = @override;
            expected[(int)@override, (int)@override] = @override;
            expected[(int)@override, (int)@sealed] = @override; //not both sealed

            expected[(int)@sealed, (int)@none] = @override; //not both sealed
            expected[(int)@sealed, (int)@abstract] = @abstract | @override; //not both sealed
            expected[(int)@sealed, (int)@virtual] = @override; //not both sealed
            expected[(int)@sealed, (int)@override] = @override; //not both sealed
            expected[(int)@sealed, (int)@sealed] = @sealed;

            // Table should be symmetrical.
            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < length; j++)
                {
                    Assert.Equal(expected[i, j], expected[j, i]);
                }
            }

            foreach (var mod1 in modList)
            {
                foreach (var mod2 in modList)
                {
                    var property = type.GetMember<PropertySymbol>(mod1.ToString() + mod2.ToString());
                    var getter = property.GetMethod;
                    var setter = property.SetMethod;

                    Assert.Equal(mod1, GetVirtualnessModifiers(getter));
                    Assert.Equal(mod2, GetVirtualnessModifiers(setter));

                    Assert.Equal(expected[(int)mod1, (int)mod2], GetVirtualnessModifiers(property));
                }
            }
        }