提交 105a1300 编写于 作者: A AlekseyTs

Stop using Compilationoptions.Features to enable test-only code paths. (changeset 1211317)

上级 92c67f82
......@@ -57,6 +57,11 @@ public sealed partial class CSharpCompilation : Compilation
// NOTE: Presently, we do not cache the per-tree diagnostics.
private ImmutableArray<Diagnostic> lazyClsComplianceDiagnostics;
/// <summary>
/// Used for test purposes only to immulate missing members.
/// </summary>
private SmallDictionary<int, bool> lazyMakeMemberMissingMap;
private Conversions conversions;
internal Conversions Conversions
{
......@@ -3035,5 +3040,40 @@ internal override int CompareSourceLocations(Location loc1, Location loc2)
}
#endregion
internal void MakeMemberMissing(WellKnownMember member)
{
MakeMemberMissing((int)member);
}
internal void MakeMemberMissing(SpecialMember member)
{
MakeMemberMissing(-(int)member - 1);
}
internal bool IsMemberMissing(WellKnownMember member)
{
return IsMemberMissing((int)member);
}
internal bool IsMemberMissing(SpecialMember member)
{
return IsMemberMissing(-(int)member - 1);
}
private void MakeMemberMissing(int member)
{
if (lazyMakeMemberMissingMap == null)
{
lazyMakeMemberMissingMap = new SmallDictionary<int, bool>();
}
lazyMakeMemberMissingMap[member] = true;
}
private bool IsMemberMissing(int member)
{
return lazyMakeMemberMissingMap != null && lazyMakeMemberMissingMap.ContainsKey(member);
}
}
}
......@@ -44,8 +44,7 @@ internal Symbol GetWellKnownTypeMember(WellKnownMember member)
Debug.Assert(member >= 0 && member < WellKnownMember.Count);
// if this member is to be forced "missing", return null
var makeMissingMember = this.Feature("MakeMissingMember");
if (makeMissingMember != null && makeMissingMember == member.ToString()) return null;
if (IsMemberMissing(member)) return null;
if (lazyWellKnownTypeMembers == null || ReferenceEquals(lazyWellKnownTypeMembers[(int)member], ErrorTypeSymbol.UnknownResultType))
{
......
......@@ -185,8 +185,7 @@ public override AssemblyIdentity Identity
internal override Symbol GetSpecialTypeMember(SpecialMember member)
{
var makeMissingMember = compilation.Feature("MakeMissingMember");
return makeMissingMember != null && makeMissingMember == member.ToString() ? null : base.GetSpecialTypeMember(member);
return compilation.IsMemberMissing(member) ? null : base.GetSpecialTypeMember(member);
}
private string GetWellKnownAttributeDataStringField(Func<CommonAssemblyWellKnownAttributeData, string> fieldGetter, string missingValue = null)
......
......@@ -11,25 +11,6 @@ namespace Microsoft.CodeAnalysis.CSharp.UnitTests
{
public class MissingSpecialMember : CSharpTestBase
{
private CSharpCompilationOptions WithMissingMember(WellKnownMember wm)
{
return WithMissingMember(wm.ToString());
}
private CSharpCompilationOptions WithMissingMember(SpecialMember sm)
{
return WithMissingMember(sm.ToString());
}
private CSharpCompilationOptions WithMissingMember(string memberKey)
{
var compOptions = TestOptions.Dll.WithOptimizations(true).WithFeatures(new[] { "MakeMissingMember:" + memberKey });
if (System.Diagnostics.Debugger.IsAttached)
{
// Using single-threaded build if debugger attached, to simplify debugging.
compOptions = compOptions.WithConcurrentBuild(false);
}
return compOptions;
}
[Fact]
public void Missing_System_Collections_Generic_IEnumerable_T__GetEnumerator()
{
......@@ -48,7 +29,11 @@ public IEnumerable<int> M()
yield return 1;
}
}";
CreateCompilationWithMscorlib(source, compOptions: WithMissingMember(SpecialMember.System_Collections_Generic_IEnumerable_T__GetEnumerator)).VerifyEmitDiagnostics(
var comp = CreateCompilationWithMscorlib(source, compOptions: TestOptions.Dll.WithOptimizations(true));
comp.MakeMemberMissing(SpecialMember.System_Collections_Generic_IEnumerable_T__GetEnumerator);
comp.VerifyEmitDiagnostics(
// (10,5): error CS0656: Missing compiler required member 'System.Collections.Generic.IEnumerable`1.GetEnumerator'
// {
Diagnostic(ErrorCode.ERR_MissingPredefinedMember, @"{
......@@ -76,7 +61,11 @@ public IEnumerable<int> M()
yield return 1;
}
}";
CreateCompilationWithMscorlib(source, compOptions: WithMissingMember(SpecialMember.System_IDisposable__Dispose)).VerifyEmitDiagnostics(
var comp = CreateCompilationWithMscorlib(source, compOptions: TestOptions.Dll.WithOptimizations(true));
comp.MakeMemberMissing(SpecialMember.System_IDisposable__Dispose);
comp.VerifyEmitDiagnostics(
// (10,5): error CS0656: Missing compiler required member 'System.IDisposable.Dispose'
// {
Diagnostic(ErrorCode.ERR_MissingPredefinedMember, @"{
......@@ -104,7 +93,11 @@ public IEnumerable<int> M()
yield return 1;
}
}";
CreateCompilationWithMscorlib(source, compOptions: WithMissingMember(WellKnownMember.System_Diagnostics_DebuggerHiddenAttribute__ctor)).VerifyEmitDiagnostics(
var comp = CreateCompilationWithMscorlib(source, compOptions: TestOptions.Dll.WithOptimizations(true));
comp.MakeMemberMissing(WellKnownMember.System_Diagnostics_DebuggerHiddenAttribute__ctor);
comp.VerifyEmitDiagnostics(
// the DebuggerHidden attribute is optional.
);
}
......@@ -123,7 +116,11 @@ public static void Main(string[] args)
public static void Extension(this string x) {}
}";
CreateCompilationWithMscorlib(source, compOptions: WithMissingMember(WellKnownMember.System_Diagnostics_DebuggerHiddenAttribute__ctor)).VerifyEmitDiagnostics(
var comp = CreateCompilationWithMscorlib(source, compOptions: TestOptions.Dll.WithOptimizations(true));
comp.MakeMemberMissing(WellKnownMember.System_Diagnostics_DebuggerHiddenAttribute__ctor);
comp.VerifyEmitDiagnostics(
// (9,34): error CS1110: Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference to System.Core.dll?
// public static void Extension(this string x) {}
Diagnostic(ErrorCode.ERR_ExtensionAttrNotFound, "this").WithArguments("System.Runtime.CompilerServices.ExtensionAttribute").WithLocation(9, 34)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册