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); }
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)); } } }