提交 e4c5749c 编写于 作者: G Gen Lu

Merge remote-tracking branch 'dotnet/master' into MergeFromMaster

......@@ -49,4 +49,4 @@ static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.XmlTextNewLine(string text, b
static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.XmlThreadSafetyElement() -> Microsoft.CodeAnalysis.CSharp.Syntax.XmlEmptyElementSyntax
static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.XmlThreadSafetyElement(bool static, bool instance) -> Microsoft.CodeAnalysis.CSharp.Syntax.XmlEmptyElementSyntax
static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.XmlValueElement(Microsoft.CodeAnalysis.SyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.XmlNodeSyntax> content) -> Microsoft.CodeAnalysis.CSharp.Syntax.XmlElementSyntax
static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.XmlValueElement(params Microsoft.CodeAnalysis.CSharp.Syntax.XmlNodeSyntax[] content) -> Microsoft.CodeAnalysis.CSharp.Syntax.XmlElementSyntax
static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.XmlValueElement(params Microsoft.CodeAnalysis.CSharp.Syntax.XmlNodeSyntax[] content) -> Microsoft.CodeAnalysis.CSharp.Syntax.XmlElementSyntax
\ No newline at end of file
......@@ -494,7 +494,7 @@ internal static class DynamicTransformsEncoder
internal static ImmutableArray<TypedConstant> Encode(TypeSymbol type, TypeSymbol booleanType, int customModifiersCount, RefKind refKind)
{
var flagsBuilder = ArrayBuilder<bool>.GetInstance();
EncodeInternal(type, customModifiersCount, refKind, flagsBuilder);
EncodeInternal(type, customModifiersCount, refKind, flagsBuilder, addCustomModifierFlags: true);
Debug.Assert(flagsBuilder.Any());
Debug.Assert(flagsBuilder.Contains(true));
......@@ -511,11 +511,18 @@ internal static ImmutableArray<TypedConstant> Encode(TypeSymbol type, TypeSymbol
internal static ImmutableArray<bool> Encode(TypeSymbol type, int customModifiersCount, RefKind refKind)
{
var transformFlagsBuilder = ArrayBuilder<bool>.GetInstance();
EncodeInternal(type, customModifiersCount, refKind, transformFlagsBuilder);
EncodeInternal(type, customModifiersCount, refKind, transformFlagsBuilder, addCustomModifierFlags: true);
return transformFlagsBuilder.ToImmutableAndFree();
}
internal static void EncodeInternal(TypeSymbol type, int customModifiersCount, RefKind refKind, ArrayBuilder<bool> transformFlagsBuilder)
internal static ImmutableArray<bool> EncodeWithoutCustomModifierFlags(TypeSymbol type, RefKind refKind)
{
var transformFlagsBuilder = ArrayBuilder<bool>.GetInstance();
EncodeInternal(type, -1, refKind, transformFlagsBuilder, addCustomModifierFlags: false);
return transformFlagsBuilder.ToImmutableAndFree();
}
private static void EncodeInternal(TypeSymbol type, int customModifiersCount, RefKind refKind, ArrayBuilder<bool> transformFlagsBuilder, bool addCustomModifierFlags)
{
Debug.Assert(!transformFlagsBuilder.Any());
......@@ -525,13 +532,19 @@ internal static void EncodeInternal(TypeSymbol type, int customModifiersCount, R
transformFlagsBuilder.Add(false);
}
// Native compiler encodes an extra transform flag, always false, for each custom modifier.
HandleCustomModifiers(customModifiersCount, transformFlagsBuilder);
type.VisitType(s_encodeDynamicTransform, transformFlagsBuilder);
if (addCustomModifierFlags)
{
// Native compiler encodes an extra transform flag, always false, for each custom modifier.
HandleCustomModifiers(customModifiersCount, transformFlagsBuilder);
type.VisitType((typeSymbol, builder, isNested) => AddFlags(typeSymbol, builder, isNested, addCustomModifierFlags:true), transformFlagsBuilder);
}
else
{
type.VisitType((typeSymbol, builder, isNested) => AddFlags(typeSymbol, builder, isNested, addCustomModifierFlags:false), transformFlagsBuilder);
}
}
private static readonly Func<TypeSymbol, ArrayBuilder<bool>, bool, bool> s_encodeDynamicTransform = (type, transformFlagsBuilder, isNestedNamedType) =>
private static bool AddFlags(TypeSymbol type, ArrayBuilder<bool> transformFlagsBuilder, bool isNestedNamedType, bool addCustomModifierFlags)
{
// Encode transforms flag for this type and it's custom modifiers (if any).
switch (type.TypeKind)
......@@ -541,12 +554,20 @@ internal static void EncodeInternal(TypeSymbol type, int customModifiersCount, R
break;
case TypeKind.Array:
HandleCustomModifiers(((ArrayTypeSymbol)type).CustomModifiers.Length, transformFlagsBuilder);
if (addCustomModifierFlags)
{
HandleCustomModifiers(((ArrayTypeSymbol)type).CustomModifiers.Length, transformFlagsBuilder);
}
transformFlagsBuilder.Add(false);
break;
case TypeKind.Pointer:
HandleCustomModifiers(((PointerTypeSymbol)type).CustomModifiers.Length, transformFlagsBuilder);
if (addCustomModifierFlags)
{
HandleCustomModifiers(((PointerTypeSymbol)type).CustomModifiers.Length, transformFlagsBuilder);
}
transformFlagsBuilder.Add(false);
break;
......@@ -569,7 +590,7 @@ internal static void EncodeInternal(TypeSymbol type, int customModifiersCount, R
// Continue walking types
return false;
};
}
private static void HandleCustomModifiers(int customModifiersCount, ArrayBuilder<bool> transformFlagsBuilder)
{
......
......@@ -65,8 +65,7 @@ internal static TypeSymbol CopyTypeCustomModifiers(TypeSymbol sourceType, TypeSy
// we can use it in place of this.Type. We do so by computing the dynamic transform flags that
// code gen uses and then passing them to the dynamic type decoder that metadata reading uses.
const int customModifierCount = 0;// Ignore custom modifiers, since we're not done copying them.
ImmutableArray<bool> flags = CSharpCompilation.DynamicTransformsEncoder.Encode(destinationType, customModifierCount, refKind);
ImmutableArray<bool> flags = CSharpCompilation.DynamicTransformsEncoder.EncodeWithoutCustomModifierFlags(destinationType, refKind);
TypeSymbol resultType = DynamicTypeDecoder.TransformTypeWithoutCustomModifierFlags(sourceType, containingAssembly, refKind, flags);
Debug.Assert(resultType.Equals(sourceType, ignoreCustomModifiersAndArraySizesAndLowerBounds: false, ignoreDynamic: true)); // Same custom modifiers as source type.
......
......@@ -59,13 +59,13 @@ internal sealed class SourceCustomEventSymbol : SourceEventSymbol
EventSymbol overriddenEvent = this.OverriddenEvent;
if ((object)overriddenEvent != null)
{
CopyEventCustomModifiers(overriddenEvent, ref _type);
CopyEventCustomModifiers(overriddenEvent, ref _type, ContainingAssembly);
}
}
}
else if ((object)explicitlyImplementedEvent != null)
{
CopyEventCustomModifiers(explicitlyImplementedEvent, ref _type);
CopyEventCustomModifiers(explicitlyImplementedEvent, ref _type, ContainingAssembly);
}
AccessorDeclarationSyntax addSyntax = null;
......
......@@ -501,7 +501,7 @@ public override string GetDocumentationCommentXml(CultureInfo preferredCulture =
return SourceDocumentationCommentUtils.GetAndCacheDocumentationComment(this, expandIncludes, ref _lazyDocComment);
}
protected static void CopyEventCustomModifiers(EventSymbol eventWithCustomModifiers, ref TypeSymbol type)
protected static void CopyEventCustomModifiers(EventSymbol eventWithCustomModifiers, ref TypeSymbol type, AssemblySymbol containingAssembly)
{
Debug.Assert((object)eventWithCustomModifiers != null);
......@@ -510,9 +510,9 @@ protected static void CopyEventCustomModifiers(EventSymbol eventWithCustomModifi
// We do an extra check before copying the type to handle the case where the overriding
// event (incorrectly) has a different type than the overridden event. In such cases,
// we want to retain the original (incorrect) type to avoid hiding the type given in source.
if (type.Equals(overriddenEventType, ignoreCustomModifiersAndArraySizesAndLowerBounds: true, ignoreDynamic: false))
if (type.Equals(overriddenEventType, ignoreCustomModifiersAndArraySizesAndLowerBounds: true, ignoreDynamic: true))
{
type = overriddenEventType;
type = CustomModifierUtils.CopyTypeCustomModifiers(overriddenEventType, type, RefKind.None, containingAssembly);
}
}
......
......@@ -52,7 +52,7 @@ internal SourceFieldLikeEventSymbol(SourceMemberContainerTypeSymbol containingTy
EventSymbol overriddenEvent = this.OverriddenEvent;
if ((object)overriddenEvent != null)
{
CopyEventCustomModifiers(overriddenEvent, ref _type);
CopyEventCustomModifiers(overriddenEvent, ref _type, ContainingAssembly);
}
}
......
......@@ -236,9 +236,9 @@ internal sealed class SourcePropertySymbol : PropertySymbol, IAttributeTargetSym
// We do an extra check before copying the type to handle the case where the overriding
// property (incorrectly) has a different type than the overridden property. In such cases,
// we want to retain the original (incorrect) type to avoid hiding the type given in source.
if (_lazyType.Equals(overriddenPropertyType, ignoreCustomModifiersAndArraySizesAndLowerBounds: true, ignoreDynamic: false))
if (_lazyType.Equals(overriddenPropertyType, ignoreCustomModifiersAndArraySizesAndLowerBounds: true, ignoreDynamic: true))
{
_lazyType = overriddenPropertyType;
_lazyType = CustomModifierUtils.CopyTypeCustomModifiers(overriddenPropertyType, _lazyType, RefKind.None, this.ContainingAssembly);
}
_lazyParameters = CustomModifierUtils.CopyParameterCustomModifiers(overriddenOrImplementedProperty.Parameters, _lazyParameters, alsoCopyParamsModifier: isOverride);
......
......@@ -1331,6 +1331,89 @@ void Foo()
);
}
[Fact]
public void LabelOperatorsCSharp()
{
const string source = @"
public class A
{
public void Fred()
{
Wilma: goto Betty;
Betty: goto Wilma;
}
}
";
CreateCompilationWithMscorlib45(source)
.VerifyDiagnostics()
.VerifyAnalyzerDiagnostics(new DiagnosticAnalyzer[] { new LabelOperationsTestAnalyzer() }, null, null, false,
Diagnostic(LabelOperationsTestAnalyzer.LabelDescriptor.Id, "Wilma: goto Betty;").WithLocation(6, 9),
Diagnostic(LabelOperationsTestAnalyzer.GotoDescriptor.Id, "goto Betty;").WithLocation(6, 16),
Diagnostic(LabelOperationsTestAnalyzer.LabelDescriptor.Id, "Betty: goto Wilma;").WithLocation(7, 9),
Diagnostic(LabelOperationsTestAnalyzer.GotoDescriptor.Id, "goto Wilma;").WithLocation(7, 16)
);
}
[Fact]
public void UnaryBinaryOperatorsCSharp()
{
const string source = @"
public class A
{
readonly int _value;
public A (int value)
{
_value = value;
}
public static A operator +(A x, A y)
{
return new A(x._value + y._value);
}
public static A operator *(A x, A y)
{
return new A(x._value * y._value);
}
public static A operator -(A x)
{
return new A(-x._value);
}
public static A operator +(A x)
{
return new A(+x._value);
}
}
class C
{
static void Main()
{
bool b = false;
double d = 100;
A a1 = new A(0);
A a2 = new A(100);
b = !b;
d = d * 100;
a1 = a1 + a2;
a1 = -a2;
}
}
";
CreateCompilationWithMscorlib45(source)
.VerifyDiagnostics()
.VerifyAnalyzerDiagnostics(new DiagnosticAnalyzer[] { new UnaryAndBinaryOperationsTestAnalyzer() }, null, null, false,
Diagnostic(UnaryAndBinaryOperationsTestAnalyzer.BooleanNotDescriptor.Id, "!b").WithLocation(41, 13),
Diagnostic(UnaryAndBinaryOperationsTestAnalyzer.DoubleMultiplyDescriptor.Id, "d * 100").WithLocation(42, 13),
Diagnostic(UnaryAndBinaryOperationsTestAnalyzer.OperatorAddMethodDescriptor.Id, "a1 + a2").WithLocation(43, 14),
Diagnostic(UnaryAndBinaryOperationsTestAnalyzer.OperatorMinusMethodDescriptor.Id, "-a2").WithLocation(44, 14)
);
}
[WorkItem(8520, "https://github.com/dotnet/roslyn/issues/8520")]
[Fact]
public void NullOperationSyntaxCSharp()
......
......@@ -173,7 +173,7 @@ class CL3
{
public override void Test(int x)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}
";
......@@ -190,7 +190,7 @@ public override void Test(int x)
Assert.True(withoutModifiers.Equals(withModifiers, ignoreCustomModifiersAndArraySizesAndLowerBounds: true));
Assert.NotEqual(withoutModifiers, withModifiers);
CompileAndVerify(compilation, expectedOutput: "Overriden");
CompileAndVerify(compilation, expectedOutput: "Overridden");
}
[Fact, WorkItem(4163, "https://github.com/dotnet/roslyn/issues/4163")]
......@@ -251,7 +251,7 @@ class CL3
{
public override void Test(ref int x)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}
";
......@@ -261,7 +261,7 @@ public override void Test(ref int x)
var test = cl3.GetMember<MethodSymbol>("Test");
Assert.Equal("void CL3.Test(ref System.Int32 modopt(System.Runtime.CompilerServices.IsConst) modopt(System.Runtime.CompilerServices.IsLong) x)", test.ToTestDisplayString());
CompileAndVerify(compilation, expectedOutput: "Overriden");
CompileAndVerify(compilation, expectedOutput: "Overridden");
}
[Fact, WorkItem(4163, "https://github.com/dotnet/roslyn/issues/4163")]
......@@ -322,7 +322,7 @@ class CL3
{
public override void Test(ref int x)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}
";
......@@ -332,7 +332,7 @@ public override void Test(ref int x)
var test = cl3.GetMember<MethodSymbol>("Test");
Assert.Equal("void CL3.Test(ref modopt(System.Runtime.CompilerServices.IsConst) System.Int32 modopt(System.Runtime.CompilerServices.IsLong) x)", test.ToTestDisplayString());
CompileAndVerify(compilation, expectedOutput: "Overriden");
CompileAndVerify(compilation, expectedOutput: "Overridden");
}
[Fact, WorkItem(4163, "https://github.com/dotnet/roslyn/issues/4163")]
......@@ -393,7 +393,7 @@ class CL3
{
public override void Test(ref int x)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}
";
......@@ -403,7 +403,7 @@ public override void Test(ref int x)
var test = cl3.GetMember<MethodSymbol>("Test");
Assert.Equal("void CL3.Test(ref System.Int32 modopt(System.Runtime.CompilerServices.IsLong) x)", test.ToTestDisplayString());
CompileAndVerify(compilation, expectedOutput: "Overriden");
CompileAndVerify(compilation, expectedOutput: "Overridden");
}
[Fact, WorkItem(4163, "https://github.com/dotnet/roslyn/issues/4163")]
......@@ -465,7 +465,7 @@ class CL3
{
public override void Test(ref int x)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}
";
......@@ -475,7 +475,7 @@ public override void Test(ref int x)
var test = cl3.GetMember<MethodSymbol>("Test");
Assert.Equal("void CL3.Test(ref modopt(System.Runtime.CompilerServices.IsConst) System.Int32 modopt(System.Runtime.CompilerServices.IsVolatile) modopt(System.Runtime.CompilerServices.IsLong) x)", test.ToTestDisplayString());
CompileAndVerify(compilation, expectedOutput: "Overriden");
CompileAndVerify(compilation, expectedOutput: "Overridden");
}
[Fact, WorkItem(4163, "https://github.com/dotnet/roslyn/issues/4163")]
......@@ -557,12 +557,12 @@ public override int Test
{
get
{
System.Console.WriteLine(""Get Overriden"");
System.Console.WriteLine(""Get Overridden"");
return 0;
}
set
{
System.Console.WriteLine(""Set Overriden"");
System.Console.WriteLine(""Set Overridden"");
}
}
}
......@@ -575,8 +575,8 @@ public override int Test
Assert.Equal("System.Int32 modopt(System.Runtime.CompilerServices.IsConst) modopt(System.Runtime.CompilerServices.IsLong) CL3.Test.get", test.GetMethod.ToTestDisplayString());
Assert.True(test.GetMethod.ReturnTypeCustomModifiers.SequenceEqual(test.SetMethod.Parameters.First().CustomModifiers));
CompileAndVerify(compilation, expectedOutput: @"Set Overriden
Get Overriden");
CompileAndVerify(compilation, expectedOutput: @"Set Overridden
Get Overridden");
}
[Fact, WorkItem(4163, "https://github.com/dotnet/roslyn/issues/4163")]
......@@ -636,7 +636,7 @@ class CL3
{
public override void Test(int [] x)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}
";
......@@ -646,7 +646,7 @@ public override void Test(int [] x)
var test = cl3.GetMember<MethodSymbol>("Test");
Assert.Equal("void CL3.Test(System.Int32 modopt(System.Runtime.CompilerServices.IsConst) modopt(System.Runtime.CompilerServices.IsLong) [] x)", test.ToTestDisplayString());
CompileAndVerify(compilation, expectedOutput: "Overriden");
CompileAndVerify(compilation, expectedOutput: "Overridden");
}
[Fact, WorkItem(4163, "https://github.com/dotnet/roslyn/issues/4163")]
......@@ -1146,7 +1146,7 @@ class CL3 : CL2
{
public override void Test(Dictionary<dynamic, dynamic> a, Dictionary<dynamic, dynamic> b, Dictionary<dynamic, dynamic> c)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
foreach (var param in typeof(CL3).GetMethod(""Test"").GetParameters())
{
System.Console.WriteLine(param.GetCustomAttributesData().Single());
......@@ -1169,7 +1169,7 @@ static void Main()
Assert.Equal("void CL3.Test(System.Collections.Generic.Dictionary<dynamic modopt(System.Runtime.CompilerServices.IsConst), dynamic> a, System.Collections.Generic.Dictionary<dynamic, dynamic modopt(System.Runtime.CompilerServices.IsConst)> b, System.Collections.Generic.Dictionary<dynamic modopt(System.Runtime.CompilerServices.IsConst), dynamic modopt(System.Runtime.CompilerServices.IsConst)> c)", test.ToTestDisplayString());
};
CompileAndVerify(compilation, expectedOutput: @"Overriden
CompileAndVerify(compilation, expectedOutput: @"Overridden
[System.Runtime.CompilerServices.DynamicAttribute(new Boolean[3] { False, True, True })]
[System.Runtime.CompilerServices.DynamicAttribute(new Boolean[3] { False, True, True })]
[System.Runtime.CompilerServices.DynamicAttribute(new Boolean[3] { False, True, True })]",
......@@ -1298,7 +1298,7 @@ class CL3 : CL2
{
public override int Test(System.Func<int, int> x, int y)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
return x(y);
}
}
......@@ -1307,9 +1307,9 @@ public override int Test(System.Func<int, int> x, int y)
CompileAndVerify(compilation, expectedOutput: @"Test 1
Test 2
Overriden
Overridden
Test 3
Overriden
Overridden
Test 4
MyDelegate
Test 5
......@@ -1362,13 +1362,13 @@ class Test11 : Test1
{
public override void Test(int [,] c)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}";
var compilation = CreateCompilationWithCustomILSource(source, ilSource, options: TestOptions.ReleaseExe);
CompileAndVerify(compilation, expectedOutput: @"Test
Overriden");
Overridden");
}
[ClrOnlyFact(ClrOnlyReason.Ilasm), WorkItem(5725, "https://github.com/dotnet/roslyn/issues/5725")]
......@@ -1431,13 +1431,13 @@ class CL3 : CL2
{
public override void Test(int c)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}";
var compilation = CreateCompilationWithCustomILSource(source, ilSource, options: TestOptions.ReleaseExe);
CompileAndVerify(compilation, expectedOutput: @"Test
Overriden");
Overridden");
}
[ClrOnlyFact(ClrOnlyReason.Ilasm), WorkItem(5725, "https://github.com/dotnet/roslyn/issues/5725")]
......@@ -1500,13 +1500,13 @@ class CL3 : CL2
{
public override void Test(int c)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
}
}";
var compilation = CreateCompilationWithCustomILSource(source, ilSource, options: TestOptions.ReleaseExe);
CompileAndVerify(compilation, expectedOutput: @"Test
Overriden");
Overridden");
}
[ClrOnlyFact(ClrOnlyReason.Ilasm), WorkItem(5725, "https://github.com/dotnet/roslyn/issues/5725")]
......@@ -1570,14 +1570,14 @@ class CL3 : CL2
{
public override int[] Test(int c)
{
System.Console.WriteLine(""Overriden"");
System.Console.WriteLine(""Overridden"");
return null;
}
}";
var compilation = CreateCompilationWithCustomILSource(source, ilSource, options: TestOptions.ReleaseExe);
CompileAndVerify(compilation, expectedOutput: @"Test
Overriden");
Overridden");
}
[ClrOnlyFact(ClrOnlyReason.Ilasm), WorkItem(5993, "https://github.com/dotnet/roslyn/issues/5993")]
......@@ -1690,5 +1690,231 @@ .maxstack 0
Assert.True(t1.Equals(t2, ignoreCustomModifiersAndArraySizesAndLowerBounds: true));
Assert.True(t2.Equals(t1, ignoreCustomModifiersAndArraySizesAndLowerBounds: true));
}
[Fact, WorkItem(7674, "https://github.com/dotnet/roslyn/issues/7674")]
public void PropertyWithDynamic()
{
var ilSource = @"
.class public auto ansi beforefieldinit CL1
extends [mscorlib] System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void[mscorlib] System.Object::.ctor()
IL_0006: ret
} // end of method CL1`1::.ctor
.property instance object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[] modopt([mscorlib]System.Runtime.CompilerServices.IsConst)
Test()
{
.get instance object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[] modopt([mscorlib]System.Runtime.CompilerServices.IsConst) CL1::get_Test()
.set instance void CL1::set_Test(object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[] modopt([mscorlib]System.Runtime.CompilerServices.IsConst))
} // end of property CL1::Test
.method public hidebysig newslot specialname virtual
instance object modopt([mscorlib]System.Runtime.CompilerServices.IsConst) [] modopt([mscorlib]System.Runtime.CompilerServices.IsConst)
get_Test() cil managed
{
// Code size 2 (0x2)
.maxstack 1
IL_0000: ldarg.0
IL_0001: throw
} // end of method CL1::get_Test
.method public hidebysig newslot specialname virtual
instance void set_Test(object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[] modopt([mscorlib]System.Runtime.CompilerServices.IsConst) x) cil managed
{
// Code size 3 (0x3)
.maxstack 1
IL_0000: ldarg.0
IL_0001: throw
IL_0002: ret
} // end of method CL1::set_Test
} // end of class CL1
";
var source = @"
class Module1
{
static void Main()
{
CL1 x = new CL2();
x.Test = null;
var y = x.Test;
x = new CL3();
x.Test = null;
var z = x.Test;
}
}
class CL2
: CL1
{
public override dynamic[] Test
{
get
{
System.Console.WriteLine(""Get Overridden2"");
return null;
}
set
{
System.Console.WriteLine(""Set Overridden2"");
}
}
}
class CL3
: CL1
{
public override object[] Test
{
get
{
System.Console.WriteLine(""Get Overridden3"");
return null;
}
set
{
System.Console.WriteLine(""Set Overridden3"");
}
}
}
";
var compilation = CreateCompilationWithCustomILSource(source, ilSource, new[] { CSharpRef, SystemCoreRef }, options: TestOptions.ReleaseExe);
var cl2 = compilation.GetTypeByMetadataName("CL2");
var test2 = cl2.GetMember<PropertySymbol>("Test");
Assert.Equal("dynamic modopt(System.Runtime.CompilerServices.IsConst) [] modopt(System.Runtime.CompilerServices.IsConst) CL2.Test { get; set; }",
test2.ToTestDisplayString());
var cl3 = compilation.GetTypeByMetadataName("CL3");
var test3 = cl3.GetMember<PropertySymbol>("Test");
Assert.Equal("System.Object modopt(System.Runtime.CompilerServices.IsConst) [] modopt(System.Runtime.CompilerServices.IsConst) CL3.Test { get; set; }",
test3.ToTestDisplayString());
CompileAndVerify(compilation, expectedOutput: @"Set Overridden2
Get Overridden2
Set Overridden3
Get Overridden3");
}
[Fact, WorkItem(7674, "https://github.com/dotnet/roslyn/issues/7674")]
public void EventWithDynamic()
{
var ilSource = @"
.class public auto ansi beforefieldinit CL1
extends [mscorlib] System.Object
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void[mscorlib] System.Object::.ctor()
IL_0006: ret
} // end of method CL1`1::.ctor
.event class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]> Test
{
.addon instance void CL1::add_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]>)
.removeon instance void CL1::remove_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]>)
} // end of event CL1::Test
.method public hidebysig newslot specialname virtual
instance void add_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]> 'value') cil managed
{
// Code size 2 (0x2)
.maxstack 1
IL_0000: ldarg.0
IL_0001: throw
} // end of method CL1::get_Test
.method public hidebysig newslot specialname virtual
instance void remove_Test(class [mscorlib]System.Action`1<object modopt([mscorlib]System.Runtime.CompilerServices.IsConst)[]> 'value') cil managed
{
// Code size 3 (0x3)
.maxstack 1
IL_0000: ldarg.0
IL_0001: throw
IL_0002: ret
} // end of method CL1::set_Test
} // end of class CL1
";
var source = @"
using System;
class Module1
{
static void Main()
{
CL1 x = new CL2();
x.Test+= null;
x.Test-= null;
x = new CL3();
x.Test+= null;
x.Test-= null;
}
}
class CL2
: CL1
{
public override event Action<dynamic[]> Test
{
add
{
System.Console.WriteLine(""Add Overridden2"");
}
remove
{
System.Console.WriteLine(""Remove Overridden2"");
}
}
}
class CL3
: CL1
{
public override event Action<object[]> Test
{
add
{
System.Console.WriteLine(""Add Overridden3"");
}
remove
{
System.Console.WriteLine(""Remove Overridden3"");
}
}
}
";
var compilation = CreateCompilationWithCustomILSource(source, ilSource, new[] { CSharpRef, SystemCoreRef }, options: TestOptions.ReleaseExe);
var cl2 = compilation.GetTypeByMetadataName("CL2");
var test2 = cl2.GetMember<EventSymbol>("Test");
Assert.Equal("event System.Action<dynamic modopt(System.Runtime.CompilerServices.IsConst) []> CL2.Test",
test2.ToTestDisplayString());
var cl3 = compilation.GetTypeByMetadataName("CL3");
var test3 = cl3.GetMember<EventSymbol>("Test");
Assert.Equal("event System.Action<System.Object modopt(System.Runtime.CompilerServices.IsConst) []> CL3.Test",
test3.ToTestDisplayString());
CompileAndVerify(compilation, expectedOutput: @"Add Overridden2
Remove Overridden2
Add Overridden3
Remove Overridden3");
}
}
}
\ No newline at end of file
......@@ -41,9 +41,9 @@ public sealed override void Initialize(AnalysisContext context)
if (operation.Kind == OperationKind.ConversionExpression)
{
IConversionExpression conversion = (IConversionExpression)operation;
if (conversion.ResultType.IsReferenceType &&
conversion.Operand.ResultType != null &&
conversion.Operand.ResultType.IsValueType &&
if (conversion.Type.IsReferenceType &&
conversion.Operand.Type != null &&
conversion.Operand.Type.IsValueType &&
!conversion.UsesOperatorMethod)
{
Report(operationContext, conversion.Syntax);
......@@ -56,7 +56,7 @@ public sealed override void Initialize(AnalysisContext context)
IInvocationExpression invocation = (IInvocationExpression)operation;
if (invocation.Instance != null &&
invocation.Instance.ResultType.IsValueType &&
invocation.Instance.Type.IsValueType &&
invocation.TargetMethod.ContainingType.IsReferenceType)
{
Report(operationContext, invocation.Instance.Syntax);
......
......@@ -82,7 +82,7 @@ public sealed override void Initialize(AnalysisContext context)
(operationContext) =>
{
IVariableDeclarationStatement declaration = (IVariableDeclarationStatement)operationContext.Operation;
foreach (IVariable variable in declaration.Variables)
foreach (IVariableDeclaration variable in declaration.Variables)
{
ILocalSymbol local = variable.Variable;
if (variable.InitialValue != null)
......@@ -208,12 +208,12 @@ private static bool DerivesFrom(INamedTypeSymbol derivedType, INamedTypeSymbol b
return false;
}
private static void AssignTo(IExpression target, Dictionary<ILocalSymbol, HashSet<INamedTypeSymbol>> localsSourceTypes, Dictionary<IFieldSymbol, HashSet<INamedTypeSymbol>> fieldsSourceTypes, IExpression sourceValue)
private static void AssignTo(IOperation target, Dictionary<ILocalSymbol, HashSet<INamedTypeSymbol>> localsSourceTypes, Dictionary<IFieldSymbol, HashSet<INamedTypeSymbol>> fieldsSourceTypes, IOperation sourceValue)
{
AssignTo(target, localsSourceTypes, fieldsSourceTypes, OriginalType(sourceValue));
}
private static void AssignTo(IExpression target, Dictionary<ILocalSymbol, HashSet<INamedTypeSymbol>> localsSourceTypes, Dictionary<IFieldSymbol, HashSet<INamedTypeSymbol>> fieldsSourceTypes, ITypeSymbol sourceType)
private static void AssignTo(IOperation target, Dictionary<ILocalSymbol, HashSet<INamedTypeSymbol>> localsSourceTypes, Dictionary<IFieldSymbol, HashSet<INamedTypeSymbol>> fieldsSourceTypes, ITypeSymbol sourceType)
{
OperationKind targetKind = target.Kind;
if (targetKind == OperationKind.LocalReferenceExpression)
......@@ -228,7 +228,7 @@ private static void AssignTo(IExpression target, Dictionary<ILocalSymbol, HashSe
}
}
private static void AssignTo<SymbolType>(SymbolType target, ITypeSymbol targetType, Dictionary<SymbolType, HashSet<INamedTypeSymbol>> sourceTypes, IExpression sourceValue)
private static void AssignTo<SymbolType>(SymbolType target, ITypeSymbol targetType, Dictionary<SymbolType, HashSet<INamedTypeSymbol>> sourceTypes, IOperation sourceValue)
{
AssignTo(target, targetType, sourceTypes, OriginalType(sourceValue));
}
......@@ -256,18 +256,18 @@ private static void AssignTo<SymbolType>(SymbolType target, ITypeSymbol targetTy
}
}
private static ITypeSymbol OriginalType(IExpression value)
private static ITypeSymbol OriginalType(IOperation value)
{
if (value.Kind == OperationKind.ConversionExpression)
{
IConversionExpression conversion = (IConversionExpression)value;
if (!conversion.IsExplicit)
{
return conversion.Operand.ResultType;
return conversion.Operand.Type;
}
}
return value.ResultType;
return value.Type;
}
private void Report(OperationBlockAnalysisContext context, ILocalSymbol local, ITypeSymbol moreSpecificType, DiagnosticDescriptor descriptor)
......
......@@ -94,7 +94,7 @@ public sealed override void Initialize(AnalysisContext context)
});
}
private static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol staticConstructorType, HashSet<IFieldSymbol> assignedToFields, HashSet<IFieldSymbol> mightBecomeReadOnlyFields)
private static void AssignTo(IOperation target, bool inConstructor, ITypeSymbol staticConstructorType, HashSet<IFieldSymbol> assignedToFields, HashSet<IFieldSymbol> mightBecomeReadOnlyFields)
{
if (target.Kind == OperationKind.FieldReferenceExpression)
{
......@@ -104,8 +104,6 @@ private static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol
switch (fieldReference.Instance.Kind)
{
case OperationKind.InstanceReferenceExpression:
case OperationKind.BaseClassInstanceReferenceExpression:
case OperationKind.ClassInstanceReferenceExpression:
return;
}
}
......@@ -120,7 +118,7 @@ private static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol
assignedToFields.Add(targetField);
mightBecomeReadOnlyFields.Remove(targetField);
if (fieldReference.Instance != null && fieldReference.Instance.ResultType.IsValueType)
if (fieldReference.Instance != null && fieldReference.Instance.Type.IsValueType)
{
AssignTo(fieldReference.Instance, inConstructor, staticConstructorType, assignedToFields, mightBecomeReadOnlyFields);
}
......
......@@ -67,7 +67,7 @@ public sealed override void Initialize(AnalysisContext context)
(operationContext) =>
{
IVariableDeclarationStatement declaration = (IVariableDeclarationStatement)operationContext.Operation;
foreach (IVariable variable in declaration.Variables)
foreach (IVariableDeclaration variable in declaration.Variables)
{
ILocalSymbol local = variable.Variable;
if (!local.IsConst && !assignedToLocals.Contains(local))
......@@ -97,7 +97,7 @@ public sealed override void Initialize(AnalysisContext context)
});
}
private static void AssignTo(IExpression target, HashSet<ILocalSymbol> assignedToLocals, HashSet<ILocalSymbol> mightBecomeConstLocals)
private static void AssignTo(IOperation target, HashSet<ILocalSymbol> assignedToLocals, HashSet<ILocalSymbol> mightBecomeConstLocals)
{
if (target.Kind == OperationKind.LocalReferenceExpression)
{
......@@ -109,7 +109,7 @@ private static void AssignTo(IExpression target, HashSet<ILocalSymbol> assignedT
else if (target.Kind == OperationKind.FieldReferenceExpression)
{
IFieldReferenceExpression fieldReference = (IFieldReferenceExpression)target;
if (fieldReference.Instance != null && fieldReference.Instance.ResultType.IsValueType)
if (fieldReference.Instance != null && fieldReference.Instance.Type.IsValueType)
{
AssignTo(fieldReference.Instance, assignedToLocals, mightBecomeConstLocals);
}
......
......@@ -83,28 +83,28 @@ public static BinaryOperationKind DeriveAdditionKind(ITypeSymbol type)
internal sealed class ConditionalChoice : IConditionalChoiceExpression
{
public ConditionalChoice(IExpression condition, IExpression ifTrue, IExpression ifFalse, ITypeSymbol resultType, SyntaxNode syntax)
public ConditionalChoice(IOperation condition, IOperation ifTrue, IOperation ifFalse, ITypeSymbol resultType, SyntaxNode syntax)
{
this.Condition = condition;
this.IfTrue = ifTrue;
this.IfFalse = ifFalse;
this.ResultType = resultType;
this.IfTrueValue = ifTrue;
this.IfFalseValue = ifFalse;
this.Type = resultType;
this.Syntax = syntax;
}
public IExpression Condition { get; }
public IOperation Condition { get; }
public IExpression IfTrue { get; }
public IOperation IfTrueValue { get; }
public IExpression IfFalse { get; }
public IOperation IfFalseValue { get; }
public ITypeSymbol ResultType { get; }
public ITypeSymbol Type { get; }
public SyntaxNode Syntax { get; }
public OperationKind Kind => OperationKind.ConditionalChoiceExpression;
public bool IsInvalid => Condition == null || Condition.IsInvalid || IfTrue == null || IfTrue.IsInvalid || IfFalse == null || IfFalse.IsInvalid;
public bool IsInvalid => Condition == null || Condition.IsInvalid || IfTrueValue == null || IfTrueValue.IsInvalid || IfFalseValue == null || IfFalseValue.IsInvalid;
public Optional<object> ConstantValue => default(Optional<object>);
......@@ -123,7 +123,7 @@ internal sealed class Assignment : IExpressionStatement
{
private readonly AssignmentExpression _assignment;
public Assignment(IReferenceExpression target, IExpression value, SyntaxNode syntax)
public Assignment(IReferenceExpression target, IOperation value, SyntaxNode syntax)
{
_assignment = new AssignmentExpression(target, value, syntax);
this.Syntax = syntax;
......@@ -135,7 +135,11 @@ public Assignment(IReferenceExpression target, IExpression value, SyntaxNode syn
public bool IsInvalid => _assignment.IsInvalid;
public IExpression Expression => _assignment;
public IOperation Expression => _assignment;
public ITypeSymbol Type => null;
public Optional<object> ConstantValue => default(Optional<object>);
public void Accept(OperationVisitor visitor)
{
......@@ -149,7 +153,7 @@ public void Accept(OperationVisitor visitor)
private sealed class AssignmentExpression : IAssignmentExpression
{
public AssignmentExpression(IReferenceExpression target, IExpression value, SyntaxNode syntax)
public AssignmentExpression(IReferenceExpression target, IOperation value, SyntaxNode syntax)
{
this.Value = value;
this.Target = target;
......@@ -158,11 +162,11 @@ public AssignmentExpression(IReferenceExpression target, IExpression value, Synt
public IReferenceExpression Target { get; }
public IExpression Value { get; }
public IOperation Value { get; }
public SyntaxNode Syntax { get; }
public ITypeSymbol ResultType => this.Target.ResultType;
public ITypeSymbol Type => this.Target.Type;
public OperationKind Kind => OperationKind.AssignmentExpression;
......@@ -186,9 +190,9 @@ internal sealed class CompoundAssignment : IExpressionStatement
{
private readonly CompoundAssignmentExpression _compoundAssignment;
public CompoundAssignment(IReferenceExpression target, IExpression value, BinaryOperationKind binaryKind, IMethodSymbol operatorMethod, SyntaxNode syntax)
public CompoundAssignment(IReferenceExpression target, IOperation value, BinaryOperationKind binaryOperationKind, IMethodSymbol operatorMethod, SyntaxNode syntax)
{
_compoundAssignment = new CompoundAssignmentExpression(target, value, binaryKind, operatorMethod, syntax);
_compoundAssignment = new CompoundAssignmentExpression(target, value, binaryOperationKind, operatorMethod, syntax);
this.Syntax = syntax;
}
......@@ -198,7 +202,11 @@ public CompoundAssignment(IReferenceExpression target, IExpression value, Binary
public bool IsInvalid => _compoundAssignment.IsInvalid;
public IExpression Expression => _compoundAssignment;
public IOperation Expression => _compoundAssignment;
public ITypeSymbol Type => null;
public Optional<object> ConstantValue => default(Optional<object>);
public void Accept(OperationVisitor visitor)
{
......@@ -212,26 +220,26 @@ public void Accept(OperationVisitor visitor)
private sealed class CompoundAssignmentExpression : ICompoundAssignmentExpression
{
public CompoundAssignmentExpression(IReferenceExpression target, IExpression value, BinaryOperationKind binaryKind, IMethodSymbol operatorMethod, SyntaxNode syntax)
public CompoundAssignmentExpression(IReferenceExpression target, IOperation value, BinaryOperationKind binaryOperationKind, IMethodSymbol operatorMethod, SyntaxNode syntax)
{
this.Target = target;
this.Value = value;
this.BinaryKind = binaryKind;
this.Operator = operatorMethod;
this.BinaryOperationKind = binaryOperationKind;
this.OperatorMethod = operatorMethod;
this.Syntax = syntax;
}
public IReferenceExpression Target { get; }
public IExpression Value { get; }
public IOperation Value { get; }
public BinaryOperationKind BinaryKind { get; }
public BinaryOperationKind BinaryOperationKind { get; }
public IMethodSymbol Operator { get; }
public IMethodSymbol OperatorMethod { get; }
public SyntaxNode Syntax { get; }
public ITypeSymbol ResultType => this.Target.ResultType;
public ITypeSymbol Type => this.Target.Type;
public OperationKind Kind => OperationKind.CompoundAssignmentExpression;
......@@ -239,7 +247,7 @@ public CompoundAssignmentExpression(IReferenceExpression target, IExpression val
public Optional<object> ConstantValue => default(Optional<object>);
public bool UsesOperatorMethod => this.Operator != null;
public bool UsesOperatorMethod => this.OperatorMethod != null;
public void Accept(OperationVisitor visitor)
{
......@@ -260,13 +268,13 @@ internal sealed class IntegerLiteral : ILiteralExpression
public IntegerLiteral(long value, ITypeSymbol resultType, SyntaxNode syntax)
{
_value = value;
this.ResultType = resultType;
this.Type = resultType;
this.Syntax = syntax;
}
public string Spelling => _value.ToString();
public string Text =>_value.ToString();
public ITypeSymbol ResultType { get; }
public ITypeSymbol Type { get; }
public OperationKind Kind => OperationKind.LiteralExpression;
......@@ -294,13 +302,13 @@ internal class Literal : ILiteralExpression
public Literal(ConstantValue value, ITypeSymbol resultType, SyntaxNode syntax)
{
_value = value;
this.ResultType = resultType;
this.Type = resultType;
this.Syntax = syntax;
}
public string Spelling => _value.Value.ToString();
public string Text => _value.Value.ToString();
public ITypeSymbol ResultType { get; }
public ITypeSymbol Type { get; }
public OperationKind Kind => OperationKind.LiteralExpression;
......@@ -323,26 +331,26 @@ public void Accept(OperationVisitor visitor)
internal sealed class Binary : IBinaryOperatorExpression
{
public Binary(BinaryOperationKind binaryKind, IExpression left, IExpression right, ITypeSymbol resultType, SyntaxNode syntax)
public Binary(BinaryOperationKind binaryOperationKind, IOperation left, IOperation right, ITypeSymbol resultType, SyntaxNode syntax)
{
this.BinaryOperationKind = binaryKind;
this.BinaryOperationKind = binaryOperationKind;
this.Left = left;
this.Right = right;
this.ResultType = resultType;
this.Type = resultType;
this.Syntax = syntax;
}
public BinaryOperationKind BinaryOperationKind { get; }
public IExpression Left { get; }
public IOperation Left { get; }
public IExpression Right { get; }
public IOperation Right { get; }
public bool UsesOperatorMethod => false;
public IMethodSymbol Operator => null;
public IMethodSymbol OperatorMethod => null;
public ITypeSymbol ResultType { get; }
public ITypeSymbol Type { get; }
public OperationKind Kind => OperationKind.BinaryOperatorExpression;
......@@ -367,17 +375,17 @@ internal sealed class ArrayCreation : IArrayCreationExpression
{
private readonly IArrayTypeSymbol _arrayType;
public ArrayCreation(IArrayTypeSymbol arrayType, ImmutableArray<IExpression> elementValues, SyntaxNode syntax)
public ArrayCreation(IArrayTypeSymbol arrayType, ImmutableArray<IOperation> elementValues, SyntaxNode syntax)
{
_arrayType = arrayType;
this.DimensionSizes = ImmutableArray.Create<IExpression>(new IntegerLiteral(elementValues.Count(), null, syntax));
this.DimensionSizes = ImmutableArray.Create<IOperation>(new IntegerLiteral(elementValues.Count(), null, syntax));
this.Initializer = new ArrayInitializer(elementValues, syntax, arrayType);
this.Syntax = syntax;
}
public ITypeSymbol ResultType => _arrayType;
public ITypeSymbol Type => _arrayType;
public ImmutableArray<IExpression> DimensionSizes { get; }
public ImmutableArray<IOperation> DimensionSizes { get; }
public ITypeSymbol ElementType => _arrayType.ElementType;
......@@ -405,20 +413,20 @@ public void Accept(OperationVisitor visitor)
private sealed class ArrayInitializer : IArrayInitializer
{
public ArrayInitializer(ImmutableArray<IExpression> elementValues, SyntaxNode syntax, ITypeSymbol arrayType)
public ArrayInitializer(ImmutableArray<IOperation> elementValues, SyntaxNode syntax, ITypeSymbol arrayType)
{
ElementValues = elementValues;
Syntax = syntax;
ResultType = arrayType;
Type = arrayType;
}
public ImmutableArray<IExpression> ElementValues { get; }
public ImmutableArray<IOperation> ElementValues { get; }
public bool IsInvalid => ElementValues.Any(v => v.IsInvalid);
public OperationKind Kind => OperationKind.ArrayInitializer;
public ITypeSymbol ResultType { get; }
public ITypeSymbol Type { get; }
public SyntaxNode Syntax { get; }
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using Roslyn.Utilities;
using Microsoft.CodeAnalysis.Semantics;
namespace Microsoft.CodeAnalysis.Semantics
namespace Microsoft.CodeAnalysis
{
/// <summary>
/// Root type for representing the abstract semantics of C# and VB statements and expressions.
......@@ -25,6 +24,16 @@ public interface IOperation
/// </summary>
SyntaxNode Syntax { get; }
/// <summary>
/// Result type of the operation, or null if the operation does not produce a result.
/// </summary>
ITypeSymbol Type { get; }
/// <summary>
/// If the operation is an expression that evaluates to a constant value, <see cref="Optional{Object}.HasValue"/> is true and <see cref="Optional{Object}.Value"/> is the value of the expression. Otherwise, <see cref="Optional{Object}.HasValue"/> is false.
/// </summary>
Optional<object> ConstantValue { get; }
void Accept(OperationVisitor visitor);
TResult Accept<TArgument, TResult>(OperationVisitor<TArgument, TResult> visitor, TArgument argument);
......@@ -35,95 +44,164 @@ public interface IOperation
/// </summary>
public enum OperationKind
{
None,
InvalidStatement,
BlockStatement,
VariableDeclarationStatement,
SwitchStatement,
IfStatement,
LoopStatement,
ContinueStatement,
BreakStatement,
YieldBreakStatement,
LabelStatement,
LabeledStatement, // Why do both of these exist?
GoToStatement,
EmptyStatement,
ThrowStatement,
ReturnStatement,
LockStatement,
TryStatement,
CatchHandler,
UsingWithDeclarationStatement,
UsingWithExpressionStatement,
YieldReturnStatement,
FixedStatement,
LocalFunctionStatement,
ExpressionStatement,
InvalidExpression,
LiteralExpression,
ConversionExpression,
InvocationExpression,
ArrayElementReferenceExpression,
PointerIndirectionReferenceExpression,
LocalReferenceExpression,
ParameterReferenceExpression,
SyntheticLocalReferenceExpression,
FieldReferenceExpression,
MethodBindingExpression,
PropertyReferenceExpression,
EventReferenceExpression,
LateBoundMemberReferenceExpression,
UnaryOperatorExpression,
BinaryOperatorExpression,
ConditionalChoiceExpression,
NullCoalescingExpression,
LambdaExpression,
ObjectCreationExpression,
TypeParameterObjectCreationExpression,
ArrayCreationExpression,
DefaultValueExpression,
InstanceReferenceExpression,
BaseClassInstanceReferenceExpression,
ClassInstanceReferenceExpression,
IsExpression,
TypeOperationExpression,
AwaitExpression,
AddressOfExpression,
AssignmentExpression,
CompoundAssignmentExpression,
ParenthesizedExpression,
UnboundLambdaExpression,
EventAssignmentExpression,
None = 0x0,
/// <summary>Indicates an <see cref="IInvalidStatement"/>.</summary>
InvalidStatement = 0x1,
/// <summary>Indicates an <see cref="IBlockStatement"/>.</summary>
BlockStatement = 0x2,
/// <summary>Indicates an <see cref="IVariableDeclarationStatement"/>.</summary>
VariableDeclarationStatement = 0x3,
/// <summary>Indicates an <see cref="ISwitchStatement"/>.</summary>
SwitchStatement = 0x4,
/// <summary>Indicates an <see cref="IIfStatement"/>.</summary>
IfStatement = 0x5,
/// <summary>Indicates an <see cref="ILoopStatement"/>.</summary>
LoopStatement = 0x6,
/// <summary>Indicates an <see cref="IReturnStatement"/>.</summary>
YieldBreakStatement = 0x9,
/// <summary>Indicates an <see cref="ILabelStatement"/>.</summary>
LabelStatement = 0xa,
/// <summary>Indicates an <see cref="IBranchStatement"/>.</summary>
BranchStatement = 0xc,
/// <summary>Indicates an <see cref="IEmptyStatement"/>.</summary>
EmptyStatement = 0xd,
/// <summary>Indicates an <see cref="IThrowStatement"/>.</summary>
ThrowStatement = 0xe,
/// <summary>Indicates an <see cref="IReturnStatement"/>.</summary>
ReturnStatement = 0xf,
/// <summary>Indicates an <see cref="ILockStatement"/>.</summary>
LockStatement = 0x10,
/// <summary>Indicates an <see cref="ITryStatement"/>.</summary>
TryStatement = 0x11,
/// <summary>Indicates an <see cref="ICatchClause"/>.</summary>
CatchClause = 0x12,
/// <summary>Indicates an <see cref="IUsingWithDeclarationStatement"/>.</summary>
UsingWithDeclarationStatement = 0x13,
/// <summary>Indicates an <see cref="IUsingWithExpressionStatement"/>.</summary>
UsingWithExpressionStatement = 0x14,
/// <summary>Indicates an <see cref="IReturnStatement"/>.</summary>
YieldReturnStatement = 0x15,
/// <summary>Indicates an <see cref="IFixedStatement"/>.</summary>
FixedStatement = 0x16,
// LocalFunctionStatement = 0x17,
/// <summary>Indicates an <see cref="IExpressionStatement"/>.</summary>
ExpressionStatement = 0x18,
/// <summary>Indicates an <see cref="IInvalidExpression"/>.</summary>
InvalidExpression = 0x19,
/// <summary>Indicates an <see cref="ILiteralExpression"/>.</summary>
LiteralExpression = 0x1a,
/// <summary>Indicates an <see cref="IConversionExpression"/>.</summary>
ConversionExpression = 0x1b,
/// <summary>Indicates an <see cref="IInvocationExpression"/>.</summary>
InvocationExpression = 0x1c,
/// <summary>Indicates an <see cref="IArrayElementReferenceExpression"/>.</summary>
ArrayElementReferenceExpression = 0x1d,
/// <summary>Indicates an <see cref="IPointerIndirectionReferenceExpression"/>.</summary>
PointerIndirectionReferenceExpression = 0x1e,
/// <summary>Indicates an <see cref="ILocalReferenceExpression"/>.</summary>
LocalReferenceExpression = 0x1f,
/// <summary>Indicates an <see cref="IParameterReferenceExpression"/>.</summary>
ParameterReferenceExpression = 0x20,
/// <summary>Indicates an <see cref="ISyntheticLocalReferenceExpression"/>.</summary>
SyntheticLocalReferenceExpression = 0x21,
/// <summary>Indicates an <see cref="IFieldReferenceExpression"/>.</summary>
FieldReferenceExpression = 0x22,
/// <summary>Indicates an <see cref="IMethodBindingExpression"/>.</summary>
MethodBindingExpression = 0x23,
/// <summary>Indicates an <see cref="IPropertyReferenceExpression"/>.</summary>
PropertyReferenceExpression = 0x24,
/// <summary>Indicates an <see cref="IEventReferenceExpression"/>.</summary>
EventReferenceExpression = 0x25,
/// <summary>Indicates an <see cref="ILateBoundMemberReferenceExpression"/>.</summary>
LateBoundMemberReferenceExpression = 0x26,
/// <summary>Indicates an <see cref="IUnaryOperatorExpression"/>.</summary>
UnaryOperatorExpression = 0x27,
/// <summary>Indicates an <see cref="IBinaryOperatorExpression"/>.</summary>
BinaryOperatorExpression = 0x28,
/// <summary>Indicates an <see cref="IConditionalChoiceExpression"/>.</summary>
ConditionalChoiceExpression = 0x29,
/// <summary>Indicates an <see cref="INullCoalescingExpression"/>.</summary>
NullCoalescingExpression = 0x2a,
/// <summary>Indicates an <see cref="ILambdaExpression"/>.</summary>
LambdaExpression = 0x2b,
/// <summary>Indicates an <see cref="IObjectCreationExpression"/>.</summary>
ObjectCreationExpression = 0x2c,
/// <summary>Indicates an <see cref="ITypeParameterObjectCreationExpression"/>.</summary>
TypeParameterObjectCreationExpression = 0x2d,
/// <summary>Indicates an <see cref="IArrayCreationExpression"/>.</summary>
ArrayCreationExpression = 0x2e,
/// <summary>Indicates an <see cref="IDefaultValueExpression"/>.</summary>
DefaultValueExpression = 0x2f,
/// <summary>Indicates an <see cref="IInstanceReferenceExpression"/>.</summary>
InstanceReferenceExpression = 0x30,
/// <summary>Indicates an <see cref="IIsExpression"/>.</summary>
IsExpression = 0x33,
// TypeOperationExpression = 0x34,
AwaitExpression = 0x35,
/// <summary>Indicates an <see cref="IAddressOfExpression"/>.</summary>
AddressOfExpression = 0x36,
/// <summary>Indicates an <see cref="IAssignmentExpression"/>.</summary>
AssignmentExpression = 0x37,
/// <summary>Indicates an <see cref="ICompoundAssignmentExpression"/>.</summary>
CompoundAssignmentExpression = 0x38,
/// <summary>Indicates an <see cref="IParenthesizedExpression"/>.</summary>
ParenthesizedExpression = 0x39,
/// <summary>Indicates an <see cref="IUnboundLambdaExpression"/>.</summary>
UnboundLambdaExpression = 0x3a,
/// <summary>Indicates an <see cref="IEventAssignmentExpression"/>.</summary>
EventAssignmentExpression = 0x3b,
/// <summary>Indicates an <see cref="ITypeOfExpression"/>.</summary>
TypeOfExpression = 0x34,
/// <summary>Indicates an <see cref="ISizeOfExpression"/>.</summary>
SizeOfExpression = 0x50,
// VB only
OmittedArgumentExpression,
StopStatement,
EndStatement,
WithStatement,
/// <summary>Indicates an <see cref="IOmittedArgumentExpression"/>.</summary>
OmittedArgumentExpression = 0x3c,
/// <summary>Indicates an <see cref="IStopStatement"/>.</summary>
StopStatement = 0x3d,
/// <summary>Indicates an <see cref="IEndStatement"/>.</summary>
EndStatement = 0x3e,
/// <summary>Indicates an <see cref="IWithStatement"/>.</summary>
WithStatement = 0x3f,
// Newly added
ConditionalAccessExpression,
IncrementExpression,
Argument,
FieldInitializerInCreation,
PropertyInitializerInCreation,
ArrayInitializer,
VariableDeclaration,
SwitchSection,
SingleValueCaseClause,
RelationalCaseClause,
RangeCaseClause,
ParameterInitializerAtDeclaration,
FieldInitializerAtDeclaration,
PropertyInitializerAtDeclaration
/// <summary>Indicates an <see cref="IConditionalAccessExpression"/>.</summary>
ConditionalAccessExpression = 0x40,
/// <summary>Indicates an <see cref="IIncrementExpression"/>.</summary>
IncrementExpression = 0x41,
/// <summary>Indicates an <see cref="IArgument"/>.</summary>
Argument = 0x42,
/// <summary>Indicates an <see cref="IFieldInitializer"/>.</summary>
FieldInitializerInCreation = 0x43,
/// <summary>Indicates an <see cref="IPropertyInitializer"/>.</summary>
PropertyInitializerInCreation = 0x44,
/// <summary>Indicates an <see cref="IArrayInitializer"/>.</summary>
ArrayInitializer = 0x45,
/// <summary>Indicates an <see cref="IVariableDeclaration"/>.</summary>
VariableDeclaration = 0x46,
/// <summary>Indicates an <see cref="ISwitchCase"/>.</summary>
SwitchCase = 0x47,
/// <summary>Indicates an <see cref="ISingleValueCaseClause"/>.</summary>
SingleValueCaseClause = 0x48,
/// <summary>Indicates an <see cref="IRelationalCaseClause"/>.</summary>
RelationalCaseClause = 0x49,
/// <summary>Indicates an <see cref="IRangeCaseClause"/>.</summary>
RangeCaseClause = 0x4a,
/// <summary>Indicates an <see cref="IParameterInitializer"/>.</summary>
ParameterInitializerAtDeclaration = 0x4b,
/// <summary>Indicates an <see cref="IFieldInitializer"/>.</summary>
FieldInitializerAtDeclaration = 0x4c,
/// <summary>Indicates an <see cref="IPropertyInitializer"/>.</summary>
PropertyInitializerAtDeclaration = 0x4d
}
}
......@@ -4,22 +4,15 @@
namespace Microsoft.CodeAnalysis.Semantics
{
/// <summary>
/// Root type for representing the abstract semantics of C# and VB statements.
/// </summary>
public interface IStatement : IOperation
{
}
/// <summary>
/// Represents a block scope.
/// </summary>
public interface IBlockStatement : IStatement
public interface IBlockStatement : IOperation
{
/// <summary>
/// Statements contained within the block.
/// </summary>
ImmutableArray<IStatement> Statements { get; }
ImmutableArray<IOperation> Statements { get; }
/// <summary>
/// Local declarations contained within the block.
/// </summary>
......@@ -29,18 +22,18 @@ public interface IBlockStatement : IStatement
/// <summary>
/// Represents a local variable declaration statement.
/// </summary>
public interface IVariableDeclarationStatement : IStatement
public interface IVariableDeclarationStatement : IOperation
{
/// <summary>
/// Variables declared by the statement.
/// </summary>
ImmutableArray<IVariable> Variables { get; }
ImmutableArray<IVariableDeclaration> Variables { get; }
}
/// <summary>
/// Represents a local variable declaration.
/// </summary>
public interface IVariable : IOperation
public interface IVariableDeclaration : IOperation
{
/// <summary>
/// Variable declared by the declaration.
......@@ -49,28 +42,28 @@ public interface IVariable : IOperation
/// <summary>
/// Initializer of the variable.
/// </summary>
IExpression InitialValue { get; }
IOperation InitialValue { get; }
}
/// <summary>
/// Represents a C# switch or VB Select Case statement.
/// </summary>
public interface ISwitchStatement : IStatement
public interface ISwitchStatement : IOperation
{
/// <summary>
/// Value to be switched upon.
/// </summary>
IExpression Value { get; }
IOperation Value { get; }
/// <summary>
/// Cases of the switch.
/// </summary>
ImmutableArray<ICase> Cases { get; }
ImmutableArray<ISwitchCase> Cases { get; }
}
/// <summary>
/// Represents a C# case or VB Case statement.
/// </summary>
public interface ICase : IOperation
public interface ISwitchCase : IOperation
{
/// <summary>
/// Clauses of the case. For C# there is one clause per case, but for VB there can be multiple.
......@@ -79,7 +72,7 @@ public interface ICase : IOperation
/// <summary>
/// Statements of the case.
/// </summary>
ImmutableArray<IStatement> Body { get; }
ImmutableArray<IOperation> Body { get; }
}
/// <summary>
......@@ -98,22 +91,24 @@ public interface ICaseClause : IOperation
/// </summary>
public enum CaseKind
{
None = 0x0,
/// <summary>
/// Indicates case x in C# or Case x in VB.
/// </summary>
SingleValue,
SingleValue = 0x1,
/// <summary>
/// Indicates Case Is op x in VB.
/// </summary>
Relational,
Relational = 0x2,
/// <summary>
/// Indicates Case x To Y in VB.
/// </summary>
Range,
Range = 0x3,
/// <summary>
/// Indicates default in C# or Case Else in VB.
/// </summary>
Default
Default = 0x4
}
/// <summary>
......@@ -124,7 +119,7 @@ public interface ISingleValueCaseClause : ICaseClause
/// <summary>
/// Case value.
/// </summary>
IExpression Value { get; }
IOperation Value { get; }
/// <summary>
/// Relational operator used to compare the switch value with the case value.
/// </summary>
......@@ -139,7 +134,7 @@ public interface IRelationalCaseClause : ICaseClause
/// <summary>
/// Case value.
/// </summary>
IExpression Value { get; }
IOperation Value { get; }
/// <summary>
/// Relational operator used to compare the switch value with the case value.
/// </summary>
......@@ -154,36 +149,36 @@ public interface IRangeCaseClause : ICaseClause
/// <summary>
/// Minimum value of the case range.
/// </summary>
IExpression MinimumValue { get; }
IOperation MinimumValue { get; }
/// <summary>
/// Maximum value of the case range.
/// </summary>
IExpression MaximumValue { get; }
IOperation MaximumValue { get; }
}
/// <summary>
/// Represents an if statement in C# or an If statement in VB.
/// </summary>
public interface IIfStatement : IStatement
public interface IIfStatement : IOperation
{
/// <summary>
/// Condition of the if statement. For C# there is naturally one clause per if, but for VB If statements with multiple clauses are rewritten to have only one.
/// </summary>
IExpression Condition { get; }
IOperation Condition { get; }
/// <summary>
/// Statement executed if the condition is true.
/// </summary>
IStatement IfTrue { get; }
IOperation IfTrueStatement { get; }
/// <summary>
/// Statement executed if the condition is false.
/// </summary>
IStatement IfFalse { get; }
IOperation IfFalseStatement { get; }
}
/// <summary>
/// Represents a C# while, for, foreach, or do statement, or a VB While, For, For Each, or Do statement.
/// </summary>
public interface ILoopStatement : IStatement
public interface ILoopStatement : IOperation
{
/// <summary>
/// Kind of the loop.
......@@ -192,7 +187,7 @@ public interface ILoopStatement : IStatement
/// <summary>
/// Body of the loop.
/// </summary>
IStatement Body { get; }
IOperation Body { get; }
}
/// <summary>
......@@ -200,18 +195,20 @@ public interface ILoopStatement : IStatement
/// </summary>
public enum LoopKind
{
None = 0x0,
/// <summary>
/// Indicates a C# while or do loop, or a VB While or Do loop.
/// </summary>
WhileUntil,
WhileUntil = 0x1,
/// <summary>
/// Indicates a C# for loop or a VB For loop.
/// </summary>
For,
For = 0x2,
/// <summary>
/// Indicates a C# foreach loop or a VB For Each loop.
/// </summary>
ForEach
ForEach = 0x3
}
/// <summary>
......@@ -222,7 +219,7 @@ public interface IForWhileUntilLoopStatement : ILoopStatement
/// <summary>
/// Condition of the loop.
/// </summary>
IExpression Condition { get; }
IOperation Condition { get; }
}
/// <summary>
......@@ -248,11 +245,11 @@ public interface IForLoopStatement : IForWhileUntilLoopStatement
/// <summary>
/// Statements to execute before entry to the loop. For C# these come from the first clause of the for statement. For VB these initialize the index variable of the For statement.
/// </summary>
ImmutableArray<IStatement> Before { get; }
ImmutableArray<IOperation> Before { get; }
/// <summary>
/// Statements to execute at the bottom of the loop. For C# these come from the third clause of the for statement. For VB these increment the index variable of the For statement.
/// </summary>
ImmutableArray<IStatement> AtLoopBottom { get; }
ImmutableArray<IOperation> AtLoopBottom { get; }
/// <summary>
/// Declarations local to the loop.
/// </summary>
......@@ -271,75 +268,88 @@ public interface IForEachLoopStatement : ILoopStatement
/// <summary>
/// Collection value over which the loop iterates.
/// </summary>
IExpression Collection { get; }
IOperation Collection { get; }
}
/// <summary>
/// Represents a C# or VB label statement.
/// </summary>
public interface ILabelStatement : IStatement
public interface ILabelStatement : IOperation
{
// Label that can be the target of branches.
/// <summary>
/// Label that can be the target of branches.
/// </summary>
ILabelSymbol Label { get; }
/// <summary>
/// Statement that has been labeled.
/// </summary>
IOperation LabeledStatement { get; }
}
/// <summary>
/// Represents a C# label statement.
/// Represents a C# goto, break, or continue statement, or a VB GoTo, Exit ***, or Continue *** statement
/// </summary>
public interface ILabeledStatement : ILabelStatement
public interface IBranchStatement : IOperation
{
// Statement that has been labeled.
IStatement Labeled { get; }
/// <summary>
/// Label that is the target of the branch.
/// </summary>
ILabelSymbol Target { get; }
/// <summary>
/// Kind of the branch.
/// </summary>
BranchKind BranchKind { get; }
}
/// <summary>
/// Represents a C# goto, break, or continue statement, or a VB GoTo, Exit ***, or Continue *** statement
/// </summary>
public interface IBranchStatement : IStatement
public enum BranchKind
{
// Label that is the target of the branch.
ILabelSymbol Target { get; }
None = 0x0,
Continue = 0x1,
Break = 0x2,
GoTo = 0x3
}
/// <summary>
/// Represents a C# throw or a VB Throw statement.
/// </summary>
public interface IThrowStatement : IStatement
public interface IThrowStatement : IOperation
{
// Thrown expression.
IExpression Thrown { get; }
/// <summary>
/// Value to be thrown.
/// </summary>
IOperation ThrownObject { get; }
}
/// <summary>
/// Represents a C# return or a VB Return statement.
/// </summary>
public interface IReturnStatement : IStatement
public interface IReturnStatement : IOperation
{
/// <summary>
/// Value to be returned.
/// </summary>
IExpression Returned { get; }
IOperation ReturnedValue { get; }
}
/// <summary>
/// Represents a C# lock or a VB SyncLock statement.
/// </summary>
public interface ILockStatement : IStatement
public interface ILockStatement : IOperation
{
/// <summary>
/// Value to be locked.
/// </summary>
IExpression Locked { get; }
IOperation LockedObject { get; }
/// <summary>
/// Body of the lock, to be executed while holding the lock.
/// </summary>
IStatement Body { get; }
IOperation Body { get; }
}
/// <summary>
/// Represents a C# try or a VB Try statement.
/// </summary>
public interface ITryStatement : IStatement
public interface ITryStatement : IOperation
{
/// <summary>
/// Body of the try, over which the handlers are active.
......@@ -348,7 +358,7 @@ public interface ITryStatement : IStatement
/// <summary>
/// Catch clauses of the try.
/// </summary>
ImmutableArray<ICatch> Catches { get; }
ImmutableArray<ICatchClause> Catches { get; }
/// <summary>
/// Finally handler of the try.
/// </summary>
......@@ -358,7 +368,7 @@ public interface ITryStatement : IStatement
/// <summary>
/// Represents a C# catch or VB Catch clause.
/// </summary>
public interface ICatch : IOperation
public interface ICatchClause : IOperation
{
/// <summary>
/// Body of the exception handler.
......@@ -371,7 +381,7 @@ public interface ICatch : IOperation
/// <summary>
/// Filter expression to be executed to determine whether to handle the exception.
/// </summary>
IExpression Filter { get; }
IOperation Filter { get; }
/// <summary>
/// Symbol for the local catch variable bound to the caught exception.
/// </summary>
......@@ -381,12 +391,12 @@ public interface ICatch : IOperation
/// <summary>
/// Represents a C# using or VB Using statement.
/// </summary>
public interface IUsingStatement : IStatement
public interface IUsingStatement : IOperation
{
/// <summary>
/// Body of the using, over which the resources of the using are maintained.
/// </summary>
IStatement Body { get; }
IOperation Body { get; }
}
/// <summary>
......@@ -395,9 +405,9 @@ public interface IUsingStatement : IStatement
public interface IUsingWithDeclarationStatement : IUsingStatement
{
/// <summary>
/// Variables declared by the using.
/// Declaration of variables introduced by the using.
/// </summary>
IVariableDeclarationStatement Variables { get; }
IVariableDeclarationStatement Declaration { get; }
}
/// <summary>
......@@ -408,13 +418,13 @@ public interface IUsingWithExpressionStatement : IUsingStatement
/// <summary>
/// Resource held by the using.
/// </summary>
IExpression Value { get; }
IOperation Value { get; }
}
/// <summary>
/// Represents a C# fixed staement.
/// </summary>
public interface IFixedStatement : IStatement
public interface IFixedStatement : IOperation
{
/// <summary>
/// Variables to be fixed.
......@@ -423,32 +433,60 @@ public interface IFixedStatement : IStatement
/// <summary>
/// Body of the fixed, over which the variables are fixed.
/// </summary>
IStatement Body { get; }
IOperation Body { get; }
}
/// <summary>
/// Represents a C# or VB statement that consists solely of an expression.
/// </summary>
public interface IExpressionStatement : IStatement
public interface IExpressionStatement : IOperation
{
/// <summary>
/// Expression of the statement.
/// </summary>
IExpression Expression { get; }
IOperation Expression { get; }
}
/// <summary>
/// Represents a VB With statement.
/// </summary>
public interface IWithStatement : IStatement
public interface IWithStatement : IOperation
{
/// <summary>
/// Body of the with.
/// </summary>
IStatement Body { get; }
IOperation Body { get; }
/// <summary>
/// Value to whose members leading-dot-qualified references within the with body bind.
/// </summary>
IExpression Value { get; }
IOperation Value { get; }
}
/// <summary>
/// Reprsents an empty statement.
/// </summary>
public interface IEmptyStatement : IOperation
{
}
/// <summary>
/// Represents a VB Stop statement.
/// </summary>
public interface IStopStatement : IOperation
{
}
/// <summary>
/// Represents a VB End statemnt.
/// </summary>
public interface IEndStatement : IOperation
{
}
/// <summary>
/// Represents a syntactically or semantically invalid C# or VB statement.
/// </summary>
public interface IInvalidStatement : IOperation
{
}
}
......@@ -50,7 +50,7 @@ public override void VisitVariableDeclarationStatement(IVariableDeclarationState
VisitArray(operation.Variables);
}
public override void VisitVariable(IVariable operation)
public override void VisitVariableDeclaration(IVariableDeclaration operation)
{
Visit(operation.InitialValue);
}
......@@ -61,7 +61,7 @@ public override void VisitSwitchStatement(ISwitchStatement operation)
VisitArray(operation.Cases);
}
public override void VisitCase(ICase operation)
public override void VisitSwitchCase(ISwitchCase operation)
{
VisitArray(operation.Clauses);
VisitArray(operation.Body);
......@@ -86,8 +86,8 @@ public override void VisitRangeCaseClause(IRangeCaseClause operation)
public override void VisitIfStatement(IIfStatement operation)
{
Visit(operation.Condition);
Visit(operation.IfTrue);
Visit(operation.IfFalse);
Visit(operation.IfTrueStatement);
Visit(operation.IfFalseStatement);
}
public override void VisitWhileUntilLoopStatement(IWhileUntilLoopStatement operation)
......@@ -119,35 +119,32 @@ public override void VisitForEachLoopStatement(IForEachLoopStatement operation)
}
public override void VisitLabelStatement(ILabelStatement operation)
{ }
public override void VisitLabeledStatement(ILabeledStatement operation)
{
Visit(operation.Labeled);
Visit(operation.LabeledStatement);
}
public override void VisitBranchStatement(IBranchStatement operation)
{ }
public override void VisitYieldBreakStatement(IStatement operation)
public override void VisitYieldBreakStatement(IReturnStatement operation)
{ }
public override void VisitEmptyStatement(IStatement operation)
public override void VisitEmptyStatement(IEmptyStatement operation)
{ }
public override void VisitThrowStatement(IThrowStatement operation)
{
Visit(operation.Thrown);
Visit(operation.ThrownObject);
}
public override void VisitReturnStatement(IReturnStatement operation)
{
Visit(operation.Returned);
Visit(operation.ReturnedValue);
}
public override void VisitLockStatement(ILockStatement operation)
{
Visit(operation.Locked);
Visit(operation.LockedObject);
Visit(operation.Body);
}
......@@ -158,7 +155,7 @@ public override void VisitTryStatement(ITryStatement operation)
Visit(operation.FinallyHandler);
}
public override void VisitCatch(ICatch operation)
public override void VisitCatch(ICatchClause operation)
{
Visit(operation.Filter);
Visit(operation.Handler);
......@@ -166,7 +163,7 @@ public override void VisitCatch(ICatch operation)
public override void VisitUsingWithDeclarationStatement(IUsingWithDeclarationStatement operation)
{
Visit(operation.Variables);
Visit(operation.Declaration);
}
public override void VisitUsingWithExpressionStatement(IUsingWithExpressionStatement operation)
......@@ -191,10 +188,10 @@ public override void VisitWithStatement(IWithStatement operation)
Visit(operation.Body);
}
public override void VisitStopStatement(IStatement operation)
public override void VisitStopStatement(IStopStatement operation)
{ }
public override void VisitEndStatement(IStatement operation)
public override void VisitEndStatement(IEndStatement operation)
{ }
public override void VisitInvocationExpression(IInvocationExpression operation)
......@@ -210,7 +207,7 @@ public override void VisitArgument(IArgument operation)
Visit(operation.OutConversion);
}
public override void VisitOmittedArgumentExpression(IExpression operation)
public override void VisitOmittedArgumentExpression(IOmittedArgumentExpression operation)
{ }
public override void VisitArrayElementReferenceExpression(IArrayElementReferenceExpression operation)
......@@ -286,8 +283,8 @@ public override void VisitConversionExpression(IConversionExpression operation)
public override void VisitConditionalChoiceExpression(IConditionalChoiceExpression operation)
{
Visit(operation.Condition);
Visit(operation.IfTrue);
Visit(operation.IfFalse);
Visit(operation.IfTrueValue);
Visit(operation.IfFalseValue);
}
public override void VisitNullCoalescingExpression(INullCoalescingExpression operation)
......@@ -301,7 +298,10 @@ public override void VisitIsExpression(IIsExpression operation)
Visit(operation.Operand);
}
public override void VisitTypeOperationExpression(ITypeOperationExpression operation)
public override void VisitSizeOfExpression(ISizeOfExpression operation)
{ }
public override void VisitTypeOfExpression(ITypeOfExpression operation)
{ }
public override void VisitLambdaExpression(ILambdaExpression operation)
......@@ -314,17 +314,17 @@ public override void VisitLiteralExpression(ILiteralExpression operation)
public override void VisitAwaitExpression(IAwaitExpression operation)
{
Visit(operation.Upon);
Visit(operation.AwaitedValue);
}
public override void VisitAddressOfExpression(IAddressOfExpression operation)
{
Visit(operation.Addressed);
Visit(operation.Reference);
}
public override void VisitObjectCreationExpression(IObjectCreationExpression operation)
{
VisitArray(operation.ConstructorArguments);
VisitArray(operation.ArgumentsInParameterOrder);
VisitArray(operation.MemberInitializers);
}
......@@ -382,19 +382,19 @@ public override void VisitLateBoundMemberReferenceExpression(ILateBoundMemberRef
Visit(operation.Instance);
}
public override void VisitUnboundLambdaExpression(IExpression operation)
public override void VisitUnboundLambdaExpression(IUnboundLambdaExpression operation)
{ }
public override void VisitDefaultValueExpression(IExpression operation)
public override void VisitDefaultValueExpression(IDefaultValueExpression operation)
{ }
public override void VisitTypeParameterObjectCreationExpression(IExpression operation)
public override void VisitTypeParameterObjectCreationExpression(ITypeParameterObjectCreationExpression operation)
{ }
public override void VisitInvalidStatement(IStatement operation)
public override void VisitInvalidStatement(IInvalidStatement operation)
{ }
public override void VisitInvalidExpression(IExpression operation)
public override void VisitInvalidExpression(IInvalidExpression operation)
{ }
}
}
......@@ -690,7 +690,7 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct
{
var operationBlockScope = new HostOperationBlockStartAnalysisScope();
var operationStartContext = new AnalyzerOperationBlockStartAnalysisContext(startAction.Analyzer,
operationBlockScope, operationBlocks, declaredSymbol, _analyzerOptions, _cancellationToken);
operationBlockScope, operationBlocks, declaredSymbol, semanticModel.Compilation, _analyzerOptions, _cancellationToken);
operationBlockStartAction.Action(operationStartContext);
operationBlockEndActions.AddAll(operationBlockScope.OperationBlockEndActions);
operationActions.AddRange(operationBlockScope.OperationActions);
......@@ -766,7 +766,7 @@ private void ExecuteCompilationActionsCore(ImmutableArray<CompilationAnalyzerAct
{
ExecuteAndCatchIfThrows(
operationBlockAction.Analyzer,
() => operationBlockAction.Action(new OperationBlockAnalysisContext(operationBlocks, declaredSymbol, _analyzerOptions, addDiagnostic, isSupportedDiagnostic, semanticModel, _cancellationToken)),
() => operationBlockAction.Action(new OperationBlockAnalysisContext(operationBlocks, declaredSymbol, semanticModel.Compilation, _analyzerOptions, addDiagnostic, isSupportedDiagnostic, _cancellationToken)),
new AnalysisContextInfo(_compilation, declaredSymbol));
}
}
......
......@@ -226,9 +226,10 @@ internal sealed class AnalyzerOperationBlockStartAnalysisContext : OperationBloc
HostOperationBlockStartAnalysisScope scope,
ImmutableArray<IOperation> operationBlocks,
ISymbol owningSymbol,
Compilation compilation,
AnalyzerOptions options,
CancellationToken cancellationToken)
: base(operationBlocks, owningSymbol, options, cancellationToken)
: base(operationBlocks, owningSymbol, compilation, options, cancellationToken)
{
_analyzer = analyzer;
_scope = scope;
......
......@@ -398,7 +398,7 @@ private class MyCodeAction : CodeAction.SolutionChangeAction
_glyph = glyph;
}
internal override Glyph? Glyph => _glyph;
internal override int? Glyph => _glyph.HasValue ? (int)_glyph.Value : (int?)null;
}
private struct SearchResult<T> where T : ISymbol
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册