diff --git a/build/Targets/Packages.props b/build/Targets/Packages.props
index 078b18b4a32dd..1a70204d60e87 100644
--- a/build/Targets/Packages.props
+++ b/build/Targets/Packages.props
@@ -8,7 +8,7 @@
8.0.1
8.0.0
0.9.2
- 3.0.0-unstable0090
+ 3.0.0
0.22.0
0.2.0
1.0.0
@@ -106,6 +106,7 @@
12.1.30328
14.3.25407
15.0.26606-alpha
+ 15.0.26606
8.0.50727
9.0.30729
15.0.26606-alpha
@@ -231,4 +232,4 @@
1.0.41
-
+
\ No newline at end of file
diff --git a/build/config/SignToolData.json b/build/config/SignToolData.json
index 1d6bfc3ed7269..a79c0812b76a5 100644
--- a/build/config/SignToolData.json
+++ b/build/config/SignToolData.json
@@ -102,7 +102,7 @@
"Vsix\\VisualStudioSetup.Next\\Roslyn.VisualStudio.Setup.Next.vsix",
"Vsix\\VisualStudioSetup\\Roslyn.VisualStudio.Setup.vsix",
"Vsix\\Roslyn\\RoslynDeployment.vsix",
- "Vsix\\Templates\\Roslyn Templates\\Release\\Roslyn SDK.vsix"
+ "Vsix\\Templates\\Roslyn SDK.vsix"
]
}
],
diff --git a/build/scripts/run_perf.ps1 b/build/scripts/run_perf.ps1
index 5bca5dcfcabe4..4aa558a7e7f40 100644
--- a/build/scripts/run_perf.ps1
+++ b/build/scripts/run_perf.ps1
@@ -16,7 +16,7 @@ Invoke-WebRequest -Uri http://dotnetci.blob.core.windows.net/roslyn-perf/cpc.zip
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | Out-Null
[IO.Compression.ZipFile]::ExtractToDirectory('cpc.zip', $CPCLocation)
-./build/scripts/cibuild.ps1 -release -testPerfRun
+./build/scripts/cibuild.cmd -release -testPerfRun
if ( -not $? )
{
diff --git a/netci.groovy b/netci.groovy
index 46ac6eb09bcde..e69bbaf1373dc 100644
--- a/netci.groovy
+++ b/netci.groovy
@@ -226,7 +226,7 @@ commitPullList.each { isPr ->
def triggerPhraseOnly = false
def triggerPhraseExtra = ""
- Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-dev15-3-preview7')
+ Utilities.setMachineAffinity(myJob, 'Windows_NT', 'latest-dev15-3')
Utilities.addXUnitDotNETResults(myJob, '**/xUnitResults/*.xml')
addRoslynJob(myJob, jobName, branchName, isPr, triggerPhraseExtra, triggerPhraseOnly)
}
diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Invocation.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Invocation.cs
index b2ee2024f606f..9492de04d8f01 100644
--- a/src/Compilers/CSharp/Portable/Binder/Binder_Invocation.cs
+++ b/src/Compilers/CSharp/Portable/Binder/Binder_Invocation.cs
@@ -627,15 +627,14 @@ private static bool HasApplicableConditionalMethod(OverloadResolutionResult
+ /// Looks up a localized string similar to Cannot pass argument with dynamic type to generic local function '{0}' with inferred type arguments..
+ ///
+ internal static string ERR_DynamicLocalFunctionTypeParameter {
+ get {
+ return ResourceManager.GetString("ERR_DynamicLocalFunctionTypeParameter", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to One or more types required to compile a dynamic expression cannot be found. Are you missing a reference?.
///
diff --git a/src/Compilers/CSharp/Portable/CSharpResources.resx b/src/Compilers/CSharp/Portable/CSharpResources.resx
index 96ca274ec8e9f..d34a38358f788 100644
--- a/src/Compilers/CSharp/Portable/CSharpResources.resx
+++ b/src/Compilers/CSharp/Portable/CSharpResources.resx
@@ -5111,4 +5111,7 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
{0} is not a valid C# conversion expression
+
+ Cannot pass argument with dynamic type to generic local function '{0}' with inferred type arguments.
+
\ No newline at end of file
diff --git a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs
index db7e38ebf5ef0..5275822f95b00 100644
--- a/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs
+++ b/src/Compilers/CSharp/Portable/Errors/ErrorCode.cs
@@ -1496,6 +1496,7 @@ internal enum ErrorCode
#region diagnostics introduced for C# 7.2
ERR_FeatureNotAvailableInVersion7_2 = 8320,
WRN_UnreferencedLocalFunction = 8321,
+ ERR_DynamicLocalFunctionTypeParameter = 8322,
#endregion diagnostics introduced for C# 7.2
}
}
diff --git a/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.Analysis.cs b/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.Analysis.cs
index 98a3179932f70..216cca9ee6d9e 100644
--- a/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.Analysis.cs
+++ b/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.Analysis.cs
@@ -246,9 +246,13 @@ private void InlineThisOnlyEnvironments()
}
else
{
- // Class-based 'this' closures can move member functions
- // to the top-level type and environments which capture
- // the 'this' environment can capture 'this' directly
+ // Class-based 'this' closures can move member functions to
+ // the top-level type and environments which capture the 'this'
+ // environment can capture 'this' directly.
+ // Note: the top-level type is treated as the initial containing
+ // environment, so by removing the 'this' environment, all
+ // nested environments which captured a pointer to the 'this'
+ // environment will now capture 'this'
RemoveEnv();
VisitClosures(ScopeTree, (scope, closure) =>
{
@@ -257,35 +261,6 @@ private void InlineThisOnlyEnvironments()
closure.ContainingEnvironmentOpt = null;
}
});
-
- // Find all environments in the scope below that could
- // capture the parent. If there are any, add 'this' to
- // the list of captured variables and remove the parent
- // link
- VisitFirstLevelScopes(ScopeTree);
- void VisitFirstLevelScopes(Scope scope)
- {
- var classEnvs = scope.DeclaredEnvironments.Where(e => !e.IsStruct);
- if (classEnvs.IsEmpty())
- {
- // Keep looking for nested environments
- foreach (var nested in scope.NestedScopes)
- {
- VisitFirstLevelScopes(nested);
- }
- }
- else
- {
- foreach (var declEnv in classEnvs)
- {
- if (declEnv.CapturesParent)
- {
- declEnv.CapturedVariables.Insert(0, thisParam);
- declEnv.CapturesParent = false;
- }
- }
- }
- }
}
void RemoveEnv()
diff --git a/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.cs b/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.cs
index 1e4c9b4c98d11..9a8c3dc5de783 100644
--- a/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.cs
+++ b/src/Compilers/CSharp/Portable/Lowering/LambdaRewriter/LambdaRewriter.cs
@@ -187,8 +187,7 @@ public MappedLocalFunction(SynthesizedLambdaMethod symbol, ClosureKind closureKi
_assignLocals = assignLocals;
_currentTypeParameters = method.TypeParameters;
_currentLambdaBodyTypeMap = TypeMap.Empty;
- _innermostFramePointer = null;
- _currentFrameThis = thisParameterOpt;
+ _innermostFramePointer = _currentFrameThis = thisParameterOpt;
_framePointers[thisType] = thisParameterOpt;
_seenBaseCall = method.MethodKind != MethodKind.Constructor; // only used for ctors
_synthesizedFieldNameIdDispenser = 1;
diff --git a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Conversion.cs b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Conversion.cs
index 075e417394dde..89e9ed6096d24 100644
--- a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Conversion.cs
+++ b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Conversion.cs
@@ -650,16 +650,8 @@ private BoundExpression MakeImplicitConversion(BoundExpression rewrittenOperand,
for (int i = 0; i < numElements; i++)
{
- var field = srcElementFields[i];
-
- DiagnosticInfo useSiteInfo = field.GetUseSiteDiagnostic();
- if ((object)useSiteInfo != null && useSiteInfo.Severity == DiagnosticSeverity.Error)
- {
- Symbol.ReportUseSiteDiagnostic(useSiteInfo, _diagnostics, syntax.Location);
- }
- var fieldAccess = MakeTupleFieldAccess(syntax, field, savedTuple, null, LookupResultKind.Empty);
+ var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(savedTuple, syntax, srcElementFields[i]);
var convertedFieldAccess = MakeConversionNode(syntax, fieldAccess, elementConversions[i], destElementTypes[i], @checked, explicitCastInCode);
-
fieldAccessorsBuilder.Add(convertedFieldAccess);
}
diff --git a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_DeconstructionAssignmentOperator.cs b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_DeconstructionAssignmentOperator.cs
index 2265088d8a49e..a8ab8094cce5b 100644
--- a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_DeconstructionAssignmentOperator.cs
+++ b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_DeconstructionAssignmentOperator.cs
@@ -221,18 +221,7 @@ private static bool IsTupleExpression(BoundKind kind)
var builder = ArrayBuilder.GetInstance(numElements);
for (int i = 0; i < numElements; i++)
{
- var field = fields[i];
-
- // Use default field rather than implicitly named fields since
- // fields from inferred names are not usable in C# 7.0.
- field = field.CorrespondingTupleField ?? field;
-
- DiagnosticInfo useSiteInfo = field.GetUseSiteDiagnostic();
- if ((object)useSiteInfo != null && useSiteInfo.Severity == DiagnosticSeverity.Error)
- {
- Symbol.ReportUseSiteDiagnostic(useSiteInfo, _diagnostics, expression.Syntax.Location);
- }
- var fieldAccess = MakeTupleFieldAccess(expression.Syntax, field, tuple, null, LookupResultKind.Empty);
+ var fieldAccess = MakeTupleFieldAccessAndReportUseSiteDiagnostics(tuple, expression.Syntax, fields[i]);
builder.Add(fieldAccess);
}
return builder.ToImmutableAndFree();
diff --git a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Field.cs b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Field.cs
index 92942a3872be5..f178d2737224d 100644
--- a/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Field.cs
+++ b/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_Field.cs
@@ -1,7 +1,6 @@
// 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 Microsoft.CodeAnalysis.CSharp.Symbols;
-using System.Diagnostics;
namespace Microsoft.CodeAnalysis.CSharp
{
@@ -90,5 +89,20 @@ public override BoundNode VisitFieldAccess(BoundFieldAccess node)
// make a field access for the most local access
return _factory.Field(rewrittenReceiver, underlyingField);
}
+
+ private BoundExpression MakeTupleFieldAccessAndReportUseSiteDiagnostics(BoundExpression tuple, SyntaxNode syntax, FieldSymbol field)
+ {
+ // Use default field rather than implicitly named fields since
+ // fields from inferred names are not usable in C# 7.0.
+ field = field.CorrespondingTupleField ?? field;
+
+ DiagnosticInfo useSiteInfo = field.GetUseSiteDiagnostic();
+ if ((object)useSiteInfo != null && useSiteInfo.Severity == DiagnosticSeverity.Error)
+ {
+ Symbol.ReportUseSiteDiagnostic(useSiteInfo, _diagnostics, syntax.Location);
+ }
+
+ return MakeTupleFieldAccess(syntax, field, tuple, null, LookupResultKind.Empty);
+ }
}
}
diff --git a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
index 5310867a48741..c0e0ec2d2dc7a 100644
--- a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
+++ b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs
@@ -634,23 +634,23 @@ private IOperation CreateUnboundLambdaOperation(UnboundLambda unboundLambda)
// We are counting on the fact that will do the error recovery and actually create the BoundLambda node appropriate for
// this syntax node.
var lambdaOperation = _semanticModel.GetOperationInternal(unboundLambda.Syntax);
- Debug.Assert(lambdaOperation.Kind == OperationKind.LambdaExpression);
+ Debug.Assert(lambdaOperation.Kind == OperationKind.AnonymousFunctionExpression);
return lambdaOperation;
}
- private ILambdaExpression CreateBoundLambdaOperation(BoundLambda boundLambda)
+ private IAnonymousFunctionExpression CreateBoundLambdaOperation(BoundLambda boundLambda)
{
- IMethodSymbol signature = boundLambda.Symbol;
+ IMethodSymbol symbol = boundLambda.Symbol;
Lazy body = new Lazy(() => (IBlockStatement)Create(boundLambda.Body));
SyntaxNode syntax = boundLambda.Syntax;
// This matches the SemanticModel implementation. This is because in VB, lambdas by themselves
// do not have a type. To get the type of a lambda expression in the SemanticModel, you need to look at
// TypeInfo.ConvertedType, rather than TypeInfo.Type. We replicate that behavior here. To get the type of
- // an ILambdaExpression, you need to look at the parent IConversionExpression.
+ // an IAnonymousFunctionExpression, you need to look at the parent IConversionExpression.
ITypeSymbol type = null;
Optional constantValue = ConvertToOptional(boundLambda.ConstantValue);
bool isImplicit = boundLambda.WasCompilerGenerated;
- return new LazyLambdaExpression(signature, body, _semanticModel, syntax, type, constantValue, isImplicit);
+ return new LazyAnonymousFunctionExpression(symbol, body, _semanticModel, syntax, type, constantValue, isImplicit);
}
private ILocalFunctionStatement CreateBoundLocalFunctionStatementOperation(BoundLocalFunctionStatement boundLocalFunctionStatement)
@@ -913,15 +913,15 @@ private IConditionalChoiceExpression CreateBoundConditionalOperatorOperation(Bou
return new LazyConditionalChoiceExpression(condition, ifTrueValue, ifFalseValue, _semanticModel, syntax, type, constantValue, isImplicit);
}
- private INullCoalescingExpression CreateBoundNullCoalescingOperatorOperation(BoundNullCoalescingOperator boundNullCoalescingOperator)
+ private ICoalesceExpression CreateBoundNullCoalescingOperatorOperation(BoundNullCoalescingOperator boundNullCoalescingOperator)
{
- Lazy primaryOperand = new Lazy(() => Create(boundNullCoalescingOperator.LeftOperand));
- Lazy secondaryOperand = new Lazy(() => Create(boundNullCoalescingOperator.RightOperand));
+ Lazy expression = new Lazy(() => Create(boundNullCoalescingOperator.LeftOperand));
+ Lazy whenNull = new Lazy(() => Create(boundNullCoalescingOperator.RightOperand));
SyntaxNode syntax = boundNullCoalescingOperator.Syntax;
ITypeSymbol type = boundNullCoalescingOperator.Type;
Optional constantValue = ConvertToOptional(boundNullCoalescingOperator.ConstantValue);
bool isImplicit = boundNullCoalescingOperator.WasCompilerGenerated;
- return new LazyNullCoalescingExpression(primaryOperand, secondaryOperand, _semanticModel, syntax, type, constantValue, isImplicit);
+ return new LazyCoalesceExpression(expression, whenNull, _semanticModel, syntax, type, constantValue, isImplicit);
}
private IAwaitExpression CreateBoundAwaitExpressionOperation(BoundAwaitExpression boundAwaitExpression)
@@ -1266,14 +1266,16 @@ private IUsingStatement CreateBoundUsingStatementOperation(BoundUsingStatement b
return new LazyUsingStatement(body, declaration, value, _semanticModel, syntax, type, constantValue, isImplicit);
}
- private IThrowStatement CreateBoundThrowStatementOperation(BoundThrowStatement boundThrowStatement)
+ private IExpressionStatement CreateBoundThrowStatementOperation(BoundThrowStatement boundThrowStatement)
{
Lazy thrownObject = new Lazy(() => Create(boundThrowStatement.ExpressionOpt));
SyntaxNode syntax = boundThrowStatement.Syntax;
- ITypeSymbol type = null;
+ ITypeSymbol throwExpressionType = boundThrowStatement.ExpressionOpt?.Type;
+ ITypeSymbol statementType = null;
Optional constantValue = default(Optional);
bool isImplicit = boundThrowStatement.WasCompilerGenerated;
- return new LazyThrowStatement(thrownObject, _semanticModel, syntax, type, constantValue, isImplicit);
+ IOperation throwExpression = new LazyThrowExpression(thrownObject, _semanticModel, syntax, throwExpressionType, constantValue, isImplicit);
+ return new ExpressionStatement(throwExpression, _semanticModel, syntax, statementType, constantValue, isImplicit);
}
private IReturnStatement CreateBoundReturnStatementOperation(BoundReturnStatement boundReturnStatement)
@@ -1298,14 +1300,14 @@ private IReturnStatement CreateBoundYieldReturnStatementOperation(BoundYieldRetu
private ILockStatement CreateBoundLockStatementOperation(BoundLockStatement boundLockStatement)
{
- Lazy lockedObject = new Lazy(() => Create(boundLockStatement.Argument));
+ Lazy expression = new Lazy(() => Create(boundLockStatement.Argument));
Lazy body = new Lazy(() => Create(boundLockStatement.Body));
SyntaxNode syntax = boundLockStatement.Syntax;
ITypeSymbol type = null;
Optional constantValue = default(Optional);
bool isImplicit = boundLockStatement.WasCompilerGenerated;
- return new LazyLockStatement(lockedObject, body, _semanticModel, syntax, type, constantValue, isImplicit);
+ return new LazyLockStatement(expression, body, _semanticModel, syntax, type, constantValue, isImplicit);
}
private IInvalidStatement CreateBoundBadStatementOperation(BoundBadStatement boundBadStatement)
diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenLocalFunctionTests.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenLocalFunctionTests.cs
index 95631d9d75a73..efc27dfc74c8f 100644
--- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenLocalFunctionTests.cs
+++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenLocalFunctionTests.cs
@@ -30,6 +30,72 @@ public static IMethodSymbol FindLocalFunction(this CompilationVerifier verifier,
[CompilerTrait(CompilerFeature.LocalFunctions)]
public class CodeGenLocalFunctionTests : CSharpTestBase
{
+ [Fact]
+ public void CaptureThisInDifferentScopes()
+ {
+ CompileAndVerify(@"
+using System;
+class C
+{
+ int _x;
+ void M()
+ {
+ {
+ int y = 0;
+ Func f1 = () => _x + y;
+ }
+ {
+ int y = 0;
+ Func f2 = () => _x + y;
+ }
+ }
+}");
+ }
+
+ [Fact]
+ public void CaptureThisInDifferentScopes2()
+ {
+ CompileAndVerify(@"
+using System;
+class C
+{
+ int _x;
+ void M()
+ {
+ {
+ int y = 0;
+ int L1() => _x + y;
+ }
+ {
+ int y = 0;
+ int L2() => _x + y;
+ }
+ }
+}");
+ }
+
+ [Fact]
+ public void CaptureFramePointerInDifferentScopes()
+ {
+ CompileAndVerify(@"
+using System;
+class C
+{
+ void M(int x)
+ {
+ Func f1 = () => x;
+ {
+ int z = 0;
+ Func f2 = () => x + z;
+ }
+ {
+ int z = 0;
+ Func f3 = () => x + z;
+ }
+ }
+}");
+ }
+
[Fact]
public void EnvironmentChainContainsStructEnvironment()
{
@@ -3558,6 +3624,121 @@ Action L5(int x)
00222");
}
+ [Fact]
+ [WorkItem(21317, "https://github.com/dotnet/roslyn/issues/21317")]
+ [CompilerTrait(CompilerFeature.Dynamic)]
+ public void DynamicGenericArg()
+ {
+ var src = @"
+void L1(T x)
+{
+ Console.WriteLine($""{x}: {typeof(T)}"");
+}
+dynamic val = 2;
+L1(val);
+L1(val);
+L1(val);
+L1(4);
+
+void L2(int x, T y) => Console.WriteLine($""{x}, {y}: {typeof(T)}"");
+L2(val, 3.0f);
+
+List listOfDynamic = new List { 1, 2, 3 };
+void L3(List x) => Console.WriteLine($""{string.Join("", "", x)}: {typeof(T)}"");
+L3(listOfDynamic);
+
+void L4(T x, params int[] y) => Console.WriteLine($""{x}, {string.Join("", "", y)}: {typeof(T)}"");
+L4(val, 3, 4);
+L4(val, 3, 4);
+L4(1, 3, val);
+
+void L5(int x, params T[] y) => Console.WriteLine($""{x}, {string.Join("", "", y)}: {typeof(T)}"");
+L5(val, 3, 4);
+L5(1, 3, val);
+L5(1, 3, val);
+";
+ var output = @"
+2: System.Object
+2: System.Int32
+2: System.Object
+4: System.Object
+2, 3: System.Single
+1, 2, 3: System.Object
+2, 3, 4: System.Object
+2, 3, 4: System.Int32
+1, 3, 2: System.Int32
+2, 3, 4: System.Int32
+1, 3, 2: System.Int32
+1, 3, 2: System.Object
+";
+ VerifyOutputInMain(src, output, "System", "System.Collections.Generic");
+ }
+
+ [Fact]
+ [WorkItem(21317, "https://github.com/dotnet/roslyn/issues/21317")]
+ [CompilerTrait(CompilerFeature.Dynamic)]
+ public void DynamicGenericClassMethod()
+ {
+ var src = @"
+using System;
+class C1
+{
+ public static void M1()
+ {
+ void F(int x)
+ {
+ Console.WriteLine($""C1<{typeof(T1)}>.M1<{typeof(T2)}>.F({x})"");
+ }
+ F((dynamic)2);
+ }
+ public static void M2()
+ {
+ void F(int x)
+ {
+ Console.WriteLine($""C1<{typeof(T1)}>.M2.F({x})"");
+ }
+ F((dynamic)2);
+ }
+}
+class C2
+{
+ public static void M1()
+ {
+ void F(int x)
+ {
+ Console.WriteLine($""C2.M1<{typeof(T2)}>.F({x})"");
+ }
+ F((dynamic)2);
+ }
+ public static void M2()
+ {
+ void F(int x)
+ {
+ Console.WriteLine($""C2.M2.F({x})"");
+ }
+ F((dynamic)2);
+ }
+}
+class Program
+{
+ static void Main()
+ {
+ C1.M1();
+ C1.M2();
+ C2.M1();
+ C2.M2();
+ }
+}
+";
+ var output = @"
+C1.M1.F(2)
+C1.M2.F(2)
+C2.M1.F(2)
+C2.M2.F(2)
+";
+ VerifyOutput(src, output);
+ }
+
[Fact]
[CompilerTrait(CompilerFeature.Dynamic, CompilerFeature.Params)]
public void DynamicArgsAndParams()
diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs
index 76b8f3d52aa8f..197b78458000c 100644
--- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs
+++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenTupleTest.cs
@@ -3938,6 +3938,29 @@ static class Extension
verifier7_1.VerifyDiagnostics();
}
+ [WorkItem(21518, "https://github.com/dotnet/roslyn/issues/21518")]
+ [Fact]
+ public void InferredName_Conversion()
+ {
+ var source =
+@"using System.Collections.Generic;
+class C
+{
+ static void F((int, IList) items)
+ {
+ }
+ static void Test()
+ {
+ var items = new List();
+ var group = (1, items);
+ F(group);
+ }
+}";
+ var comp = CreateCompilation(source, parseOptions: TestOptions.Regular.WithLanguageVersion(LanguageVersion.CSharp7),
+ references: new[] { MscorlibRef, ValueTupleRef, SystemRuntimeFacadeRef, SystemCoreRef });
+ comp.VerifyEmitDiagnostics();
+ }
+
[Fact]
public void LongTupleWithArgumentEvaluation()
{
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_ILambdaExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IAnonymousFunctionExpression.cs
similarity index 82%
rename from src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_ILambdaExpression.cs
rename to src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IAnonymousFunctionExpression.cs
index 24ba5e3ae4b5c..d03618490dd96 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_ILambdaExpression.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IAnonymousFunctionExpression.cs
@@ -12,7 +12,7 @@ public partial class IOperationTests : SemanticModelTestBase
{
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
- public void ILambdaExpression_BoundLambda_HasValidLambdaExpressionTree()
+ public void IAnonymousFunctionExpression_BoundLambda_HasValidLambdaExpressionTree()
{
string source = @"
using System;
@@ -35,7 +35,7 @@ static void F()
Variables: Local_1: System.Action x
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action) (Syntax: '() => F()')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => F()')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => F()')
IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'F()')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'F()')
Expression: IInvocationExpression (void Program.F()) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'F()')
@@ -51,7 +51,7 @@ static void F()
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
- public void ILambdaExpression_UnboundLambdaAsVar_HasValidLambdaExpressionTree()
+ public void IAnonymousFunctionExpression_UnboundLambdaAsVar_HasValidLambdaExpressionTree()
{
string source = @"
using System;
@@ -72,7 +72,7 @@ static void F()
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'var x /**/;')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'var x /**/;')
Variables: Local_1: var x
- Initializer: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '() => F()')
+ Initializer: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'F()')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'F()')
Expression: IInvocationExpression (void Program.F()) (OperationKind.InvocationExpression, Type: System.Void, IsInvalid) (Syntax: 'F()')
@@ -90,7 +90,7 @@ static void F()
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
- public void ILambdaExpression_UnboundLambdaAsDelegate_HasValidLambdaExpressionTree()
+ public void IAnonymousFunctionExpression_UnboundLambdaAsDelegate_HasValidLambdaExpressionTree()
{
string source = @"
using System;
@@ -113,7 +113,7 @@ static void F()
Variables: Local_1: System.Action x
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: '() => F()')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '() => F()')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'F()')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'F()')
Expression: IInvocationExpression (void Program.F()) (OperationKind.InvocationExpression, Type: System.Void, IsInvalid) (Syntax: 'F()')
@@ -131,7 +131,7 @@ static void F()
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
- public void ILambdaExpression_UnboundLambda_ReferenceEquality()
+ public void IAnonymousFunctionExpression_UnboundLambda_ReferenceEquality()
{
string source = @"
using System;
@@ -157,19 +157,19 @@ static void F()
var lambdaSyntax = (LambdaExpressionSyntax)variableDeclaration.Variables.Single().Initializer.Value;
var variableDeclarationOperation = (IVariableDeclarationStatement)semanticModel.GetOperationInternal(variableDeclaration);
- var variableTreeLambdaOperation = (ILambdaExpression)variableDeclarationOperation.Declarations.Single().Initializer;
- var lambdaOperation = (ILambdaExpression)semanticModel.GetOperationInternal(lambdaSyntax);
+ var variableTreeLambdaOperation = (IAnonymousFunctionExpression)variableDeclarationOperation.Declarations.Single().Initializer;
+ var lambdaOperation = (IAnonymousFunctionExpression)semanticModel.GetOperationInternal(lambdaSyntax);
// Assert that both ways of getting to the lambda (requesting the lambda directly, and requesting via the lambda syntax)
// return the same bound node.
Assert.Same(variableTreeLambdaOperation, lambdaOperation);
var variableDeclarationOperationSecondRequest = (IVariableDeclarationStatement)semanticModel.GetOperationInternal(variableDeclaration);
- var variableTreeLambdaOperationSecondRequest = (ILambdaExpression)variableDeclarationOperation.Declarations.Single().Initializer;
- var lambdaOperationSecondRequest = (ILambdaExpression)semanticModel.GetOperationInternal(lambdaSyntax);
+ var variableTreeLambdaOperationSecondRequest = (IAnonymousFunctionExpression)variableDeclarationOperation.Declarations.Single().Initializer;
+ var lambdaOperationSecondRequest = (IAnonymousFunctionExpression)semanticModel.GetOperationInternal(lambdaSyntax);
// Assert that, when request the variable declaration or the lambda for a second time, there is no rebinding of the
- // underlying UnboundLambda, and we get the same ILambdaExpression as before
+ // underlying UnboundLambda, and we get the same IAnonymousFunctionExpression as before
Assert.Same(variableTreeLambdaOperation, variableTreeLambdaOperationSecondRequest);
Assert.Same(lambdaOperation, lambdaOperationSecondRequest);
}
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IConversionExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IConversionExpression.cs
index 048723ff60a0c..e3be27f39a8f2 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IConversionExpression.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IConversionExpression.cs
@@ -318,11 +318,11 @@ static void Main(string[] args)
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'object /**/;')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'object /**/;')
Variables: Local_1: System.Object o
- Initializer: INullCoalescingExpression (OperationKind.NullCoalescingExpression, Type: System.Object) (Syntax: 'new object( ... Exception()')
- Left: IObjectCreationExpression (Constructor: System.Object..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Object) (Syntax: 'new object()')
+ Initializer: ICoalesceExpression (OperationKind.CoalesceExpression, Type: System.Object) (Syntax: 'new object( ... Exception()')
+ Expression: IObjectCreationExpression (Constructor: System.Object..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Object) (Syntax: 'new object()')
Arguments(0)
Initializer: null
- Right: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Object) (Syntax: 'throw new Exception()')
+ WhenNull: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Object) (Syntax: 'throw new Exception()')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand: IThrowExpression (OperationKind.ThrowExpression, Type: null) (Syntax: 'throw new Exception()')
IObjectCreationExpression (Constructor: System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new Exception()')
@@ -342,7 +342,7 @@ static void Main(string[] args)
OperationSelector = (operation) =>
{
var initializer = ((IVariableDeclarationStatement)operation).Declarations.Single().Initializer;
- return (IConversionExpression)((INullCoalescingExpression)initializer).SecondaryOperand;
+ return (IConversionExpression)((ICoalesceExpression)initializer).WhenNull;
}
}.Verify);
}
@@ -1614,7 +1614,7 @@ void Main()
Variables: Local_1: Program.DType d1
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: Program.DType) (Syntax: '() => { }')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => { }')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ }')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '{ }')
ReturnedValue: null
@@ -1645,7 +1645,7 @@ void Main()
Variables: Local_1: Program.DType d1
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: Program.DType, IsInvalid) (Syntax: '(string s) => { }')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '(string s) => { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '(string s) => { }')
IBlockStatement (0 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '{ }')
";
var expectedDiagnostics = new DiagnosticDescription[] {
@@ -1679,7 +1679,7 @@ void Main()
Variables: Local_1: Program.DType d1
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: Program.DType, IsInvalid) (Syntax: '() =>/**/')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '() =>/**/')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '() =>/**/')
IBlockStatement (2 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: '')
Expression: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '')
@@ -1719,7 +1719,7 @@ static void Main(string[] args)
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'new Action(() => { })')
Children(1):
- ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => { }')
+ IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => { }')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ }')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '{ }')
ReturnedValue: null
@@ -2989,7 +2989,7 @@ void M1()
Variables: Local_1: System.Action a
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action) (Syntax: 'delegate { }')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'delegate { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'delegate { }')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ }')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '{ }')
ReturnedValue: null
@@ -3021,7 +3021,7 @@ void M1()
Variables: Local_1: System.Action a
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action) (Syntax: 'delegate(int i) { }')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'delegate(int i) { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'delegate(int i) { }')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ }')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '{ }')
ReturnedValue: null
@@ -3053,7 +3053,7 @@ void M1()
Variables: Local_1: System.Action a
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'delegate() { }')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'delegate() { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'delegate() { }')
IBlockStatement (0 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '{ }')
";
var expectedDiagnostics = new DiagnosticDescription[] {
@@ -3217,7 +3217,7 @@ static void Main(string[] args)
Variables: Local_1: System.Linq.Expressions.Expression> exp
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression>) (Syntax: 'num => num < 5')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'num => num < 5')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'num => num < 5')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'num < 5')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'num < 5')
ReturnedValue: IBinaryOperatorExpression (BinaryOperationKind.IntegerLessThan) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'num < 5')
@@ -3250,7 +3250,7 @@ static void Main(string[] args)
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'Expression< ... **/;')
Variables: Local_1: System.Linq.Expressions.Expression> exp
Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression>, IsInvalid) (Syntax: 'num => num')
- ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'num => num')
+ IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'num => num')
IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'num')
IReturnStatement (OperationKind.ReturnStatement, IsInvalid) (Syntax: 'num')
IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Boolean, IsInvalid) (Syntax: 'num')
@@ -3293,7 +3293,7 @@ static void Main(string[] args)
Variables: Local_1: System.Linq.Expressions.Expression> exp
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression>, IsInvalid) (Syntax: 'num =>/**/')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'num =>/**/')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'num =>/**/')
IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '')
IReturnStatement (OperationKind.ReturnStatement, IsInvalid) (Syntax: '')
ReturnedValue: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Boolean, IsInvalid) (Syntax: '')
@@ -4902,7 +4902,7 @@ void M1()
Variables: Local_1: System.Action a
Initializer: IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action) (Syntax: '(Action)(() => { })')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => { }')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ }')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '{ }')
ReturnedValue: null
@@ -4933,7 +4933,7 @@ void M1()
Variables: Local_1: System.Action a
Initializer: IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: '(Action)(() => 1)')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '() => 1')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '() => 1')
IBlockStatement (2 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '1')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: '1')
Expression: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1, IsInvalid) (Syntax: '1')
@@ -4970,7 +4970,7 @@ void M1()
Variables: Local_1: System.Action a
Initializer: IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: '(Action)((s ... s) => { })')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '(string s) => { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '(string s) => { }')
IBlockStatement (0 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '{ }')
";
var expectedDiagnostics = new DiagnosticDescription[] {
@@ -5002,7 +5002,7 @@ void M1()
Children(1):
IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action) (Syntax: '(Action)(() => { })')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => { }')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ }')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '{ }')
ReturnedValue: null
@@ -5032,7 +5032,7 @@ void M1()
Children(1):
IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: '(Action)(() => 1)')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '() => 1')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '() => 1')
IBlockStatement (2 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '1')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: '1')
Expression: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1, IsInvalid) (Syntax: '1')
@@ -5068,7 +5068,7 @@ void M1()
Children(1):
IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: '(Action)((s ... s) => { })')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '(string s) => { }')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '(string s) => { }')
IBlockStatement (0 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '{ }')
";
var expectedDiagnostics = new DiagnosticDescription[] {
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs
index a0ede9d2fe3cd..13bcaaa99976e 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IDynamicObjectCreationExpression.cs
@@ -310,7 +310,7 @@ public C(Action a, Action y)
ApplicableSymbols(1):
Symbol: C..ctor(System.Action a, System.Action y)
Arguments(2):
- ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'delegate { }')
+ IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'delegate { }')
IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '{ }')
IReturnStatement (OperationKind.ReturnStatement, IsInvalid) (Syntax: '{ }')
ReturnedValue: null
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs
index a6dedbfee5c7e..c9c5cec3b1966 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs
@@ -724,7 +724,7 @@ static void Main(string[] args)
}
}
";
-string expectedOperationTree = @"
+ string expectedOperationTree = @"
IForEachLoopStatement (Iteration variable: System.String x) (LoopKind.ForEach) (OperationKind.LoopStatement) (Syntax: 'foreach (st ... e)args) { }')
Collection: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Collections.IEnumerable) (Syntax: '(IEnumerable)args')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
@@ -770,14 +770,15 @@ static void Main()
Left: ILocalReferenceExpression: num (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'num')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 3) (Syntax: '3')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
- IThrowStatement (OperationKind.ThrowStatement) (Syntax: 'throw new S ... ""testing"");')
- ThrownObject: IObjectCreationExpression (Constructor: System.Exception..ctor(System.String message)) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new System. ... (""testing"")')
- Arguments(1):
- IArgument (ArgumentKind.Explicit, Matching Parameter: message) (OperationKind.Argument) (Syntax: '""testing""')
- ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: ""testing"") (Syntax: '""testing""')
- InConversion: null
- OutConversion: null
- Initializer: null
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'throw new S ... ""testing"");')
+ Expression: IThrowExpression (OperationKind.ThrowExpression, Type: System.Exception) (Syntax: 'throw new S ... ""testing"");')
+ IObjectCreationExpression (Constructor: System.Exception..ctor(System.String message)) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new System. ... (""testing"")')
+ Arguments(1):
+ IArgument (ArgumentKind.Explicit, Matching Parameter: message) (OperationKind.Argument) (Syntax: '""testing""')
+ ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: ""testing"") (Syntax: '""testing""')
+ InConversion: null
+ OutConversion: null
+ Initializer: null
IfFalse: null
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'System.Cons ... eLine(num);')
Expression: IInvocationExpression (void System.Console.WriteLine(System.Int32 value)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'System.Cons ... teLine(num)')
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForLoopStatement.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForLoopStatement.cs
index 105d673c913d8..d1674ff693698 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForLoopStatement.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForLoopStatement.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// 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 Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Test.Utilities;
@@ -973,10 +973,11 @@ static void Main(string[] args)
Initializer: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
AtLoopBottom(0)
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
- IThrowStatement (OperationKind.ThrowStatement) (Syntax: 'throw new S ... xception();')
- ThrownObject: IObjectCreationExpression (Constructor: System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new System.Exception()')
- Arguments(0)
- Initializer: null
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'throw new S ... xception();')
+ Expression: IThrowExpression (OperationKind.ThrowExpression, Type: System.Exception) (Syntax: 'throw new S ... xception();')
+ IObjectCreationExpression (Constructor: System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new System.Exception()')
+ Arguments(0)
+ Initializer: null
";
VerifyOperationTreeForTest(source, expectedOperationTree);
}
@@ -1400,7 +1401,7 @@ static void Main(string[] args)
IArgument (ArgumentKind.Explicit, Matching Parameter: selector) (OperationKind.Argument) (Syntax: 'x.ToString()')
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func>) (Syntax: 'x.ToString()')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'x.ToString()')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'x.ToString()')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'x.ToString()')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'x.ToString()')
ReturnedValue: IObjectCreationExpression (Constructor: ..ctor(System.Char x, System.String z)) (OperationKind.ObjectCreationExpression, Type: ) (Syntax: 'let z = x.ToString()')
@@ -1423,7 +1424,7 @@ static void Main(string[] args)
IArgument (ArgumentKind.Explicit, Matching Parameter: selector) (OperationKind.Argument) (Syntax: 'z')
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func<, System.String>) (Syntax: 'z')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'z')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'z')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'z')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'z')
ReturnedValue: IOperation: (OperationKind.None) (Syntax: 'z')
@@ -1434,7 +1435,7 @@ static void Main(string[] args)
IArgument (ArgumentKind.Explicit, Matching Parameter: selector) (OperationKind.Argument) (Syntax: 'w')
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func) (Syntax: 'w')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'w')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'w')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'w')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'w')
ReturnedValue: IOperation: (OperationKind.None) (Syntax: 'w')
@@ -1540,7 +1541,7 @@ private static IEnumerable fun()
IArgument (ArgumentKind.Explicit, Matching Parameter: selector) (OperationKind.Argument) (Syntax: 'x.ToString()')
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func>) (Syntax: 'x.ToString()')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'x.ToString()')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'x.ToString()')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'x.ToString()')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'x.ToString()')
ReturnedValue: IObjectCreationExpression (Constructor: ..ctor(System.Char x, System.String z)) (OperationKind.ObjectCreationExpression, Type: ) (Syntax: 'let z = x.ToString()')
@@ -1563,7 +1564,7 @@ private static IEnumerable fun()
IArgument (ArgumentKind.Explicit, Matching Parameter: selector) (OperationKind.Argument) (Syntax: 'z')
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func<, System.String>) (Syntax: 'z')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'z')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'z')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'z')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'z')
ReturnedValue: IOperation: (OperationKind.None) (Syntax: 'z')
@@ -1574,7 +1575,7 @@ private static IEnumerable fun()
IArgument (ArgumentKind.Explicit, Matching Parameter: selector) (OperationKind.Argument) (Syntax: 'w')
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func) (Syntax: 'w')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'w')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'w')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'w')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'w')
ReturnedValue: IOperation: (OperationKind.None) (Syntax: 'w')
@@ -1615,7 +1616,7 @@ static void Main(string[] args)
Left: ILocalReferenceExpression: e (OperationKind.LocalReferenceExpression, Type: System.Linq.Expressions.Expression>) (Syntax: 'e')
Right: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression>) (Syntax: 'x => x * x')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'x => x * x')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'x => x * x')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'x * x')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'x * x')
ReturnedValue: IBinaryOperatorExpression (BinaryOperationKind.IntegerMultiply) (OperationKind.BinaryOperatorExpression, Type: System.Int32) (Syntax: 'x * x')
@@ -1687,7 +1688,7 @@ static void Main(string[] args)
Left: ILocalReferenceExpression: e (OperationKind.LocalReferenceExpression, Type: System.Linq.Expressions.Expression>) (Syntax: 'e')
Right: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression>) (Syntax: 'x => x * x')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'x => x * x')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'x => x * x')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'x * x')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'x * x')
ReturnedValue: IBinaryOperatorExpression (BinaryOperationKind.IntegerMultiply) (OperationKind.BinaryOperatorExpression, Type: System.Int32) (Syntax: 'x * x')
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_ILockStatement.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_ILockStatement.cs
new file mode 100644
index 0000000000000..9495e676c4831
--- /dev/null
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_ILockStatement.cs
@@ -0,0 +1,347 @@
+// 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 Microsoft.CodeAnalysis.CSharp.Syntax;
+using Microsoft.CodeAnalysis.Test.Utilities;
+using Xunit;
+
+namespace Microsoft.CodeAnalysis.CSharp.UnitTests
+{
+ public partial class IOperationTests : SemanticModelTestBase
+ {
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_ObjectLock_FieldReference()
+ {
+ string source = @"
+public class C1
+{
+ object o = new object();
+
+ public void M()
+ {
+ /**/lock (o)
+ {
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement) (Syntax: 'lock (o) ... }')
+ Expression: IFieldReferenceExpression: System.Object C1.o (OperationKind.FieldReferenceExpression, Type: System.Object) (Syntax: 'o')
+ Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: C1) (Syntax: 'o')
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = DiagnosticDescription.None;
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_ObjectLock_LocalReference()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ object o = new object();
+ /**/lock (o)
+ {
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement) (Syntax: 'lock (o) ... }')
+ Expression: ILocalReferenceExpression: o (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'o')
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = DiagnosticDescription.None;
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_ObjectLock_Null()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ /**/lock (null)
+ {
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement) (Syntax: 'lock (null) ... }')
+ Expression: ILiteralExpression (Text: null) (OperationKind.LiteralExpression, Type: null, Constant: null) (Syntax: 'null')
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = DiagnosticDescription.None;
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_ObjectLock_NonReferenceType()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ int i = 1;
+ /**/lock (i)
+ {
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement, IsInvalid) (Syntax: 'lock (i) ... }')
+ Expression: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32, IsInvalid) (Syntax: 'i')
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = new DiagnosticDescription[] {
+ // CS0185: 'int' is not a reference type as required by the lock statement
+ // /**/lock (i)
+ Diagnostic(ErrorCode.ERR_LockNeedsReference, "i").WithArguments("int").WithLocation(7, 25)
+ };
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_MissingLockExpression()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ /**/lock ()
+ {
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement, IsInvalid) (Syntax: 'lock () ... }')
+ Expression: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '')
+ Children(0)
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = new DiagnosticDescription[] {
+ // CS1525: Invalid expression term ')'
+ // /**/lock ()
+ Diagnostic(ErrorCode.ERR_InvalidExprTerm, ")").WithArguments(")").WithLocation(6, 25)
+ };
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_InvalidLockStatement()
+ {
+ string source = @"
+using System;
+
+public class C1
+{
+ public void M()
+ {
+ /**/lock (invalidReference)
+ {
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement, IsInvalid) (Syntax: 'lock (inval ... }')
+ Expression: IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'invalidReference')
+ Children(0)
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = new DiagnosticDescription[] {
+ // CS0103: The name 'invalidReference' does not exist in the current context
+ // /**/lock (invalidReference)
+ Diagnostic(ErrorCode.ERR_NameNotInContext, "invalidReference").WithArguments("invalidReference").WithLocation(8, 25)
+ };
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_MissingBody()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ object o = new object();
+ /**/lock (o)
+/* */ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement, IsInvalid) (Syntax: 'lock (o)
+')
+ Expression: ILocalReferenceExpression: o (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'o')
+ Body: IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: '')
+ Expression: IInvalidExpression (OperationKind.InvalidExpression, Type: ?) (Syntax: '')
+ Children(0)
+";
+ var expectedDiagnostics = new DiagnosticDescription[] {
+ // CS1525: Invalid expression term '}'
+ // /**/lock (o)
+ Diagnostic(ErrorCode.ERR_InvalidExprTerm, "").WithArguments("}").WithLocation(7, 27),
+ // CS1002: ; expected
+ // /**/lock (o)
+ Diagnostic(ErrorCode.ERR_SemicolonExpected, "").WithLocation(7, 27)
+ };
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_ExpressionLock_ObjectMethodCall()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ object o = new object();
+ /**/lock (o.ToString())
+ {
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement) (Syntax: 'lock (o.ToS ... }')
+ Expression: IInvocationExpression (virtual System.String System.Object.ToString()) (OperationKind.InvocationExpression, Type: System.String) (Syntax: 'o.ToString()')
+ Instance Receiver: ILocalReferenceExpression: o (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: 'o')
+ Arguments(0)
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = DiagnosticDescription.None;
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_ExpressionLock_ClassMethodCall()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ /**/lock (M2())
+ {
+ }/* */
+ }
+
+ public object M2()
+ {
+ return new object();
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement) (Syntax: 'lock (M2()) ... }')
+ Expression: IInvocationExpression ( System.Object C1.M2()) (OperationKind.InvocationExpression, Type: System.Object) (Syntax: 'M2()')
+ Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: C1) (Syntax: 'M2')
+ Arguments(0)
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = DiagnosticDescription.None;
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_ExpressionCall_VoidMethodCall()
+ {
+ string source = @"
+public class C1
+{
+ public void M()
+ {
+ /**/lock (M2())
+ {
+ }/* */
+ }
+
+ public void M2() { }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement, IsInvalid) (Syntax: 'lock (M2()) ... }')
+ Expression: IInvocationExpression ( void C1.M2()) (OperationKind.InvocationExpression, Type: System.Void, IsInvalid) (Syntax: 'M2()')
+ Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: C1, IsInvalid) (Syntax: 'M2')
+ Arguments(0)
+ Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+";
+ var expectedDiagnostics = new DiagnosticDescription[] {
+ // CS0185: 'void' is not a reference type as required by the lock statement
+ // /**/lock (M2())
+ Diagnostic(ErrorCode.ERR_LockNeedsReference, "M2()").WithArguments("void").WithLocation(6, 25)
+ };
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+
+ [CompilerTrait(CompilerFeature.IOperation)]
+ [Fact]
+ public void ILockStatement_NonEmptybody()
+ {
+ string source = @"
+using System;
+
+public class C1
+{
+ public void M()
+ {
+ /**/lock (new object())
+ {
+ Console.WriteLine(""Hello World!"");
+ }/* */
+ }
+}
+";
+ string expectedOperationTree = @"
+ILockStatement (OperationKind.LockStatement) (Syntax: 'lock (new o ... }')
+ Expression: IObjectCreationExpression (Constructor: System.Object..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Object) (Syntax: 'new object()')
+ Arguments(0)
+ Initializer: null
+ Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.Wri ... o World!"");')
+ Expression: IInvocationExpression (void System.Console.WriteLine(System.String value)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'Console.Wri ... lo World!"")')
+ Instance Receiver: null
+ Arguments(1):
+ IArgument (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument) (Syntax: '""Hello World!""')
+ ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: ""Hello World!"") (Syntax: '""Hello World!""')
+ InConversion: null
+ OutConversion: null
+";
+ var expectedDiagnostics = DiagnosticDescription.None;
+
+ VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics);
+ }
+ }
+}
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs
index df796164d7cde..cad16b56fad9e 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.cs
@@ -161,7 +161,7 @@ public void M(List customers)
IArgument (ArgumentKind.Explicit, Matching Parameter: selector) (OperationKind.Argument) (Syntax: 'cust.Name')
IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func) (Syntax: 'cust.Name')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: 'cust.Name')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'cust.Name')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'cust.Name')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'cust.Name')
ReturnedValue: IPropertyReferenceExpression: System.String Customer.Name { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.String) (Syntax: 'cust.Name')
@@ -263,7 +263,7 @@ public void UsedParameterMethod1(Action a)
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: 'new Action( ... })')
Children(1):
- ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => ... }')
+ IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => ... }')
IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'a();')
Expression: IInvocationExpression (virtual void System.Action.Invoke()) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'a()')
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs
index 58994807d9c58..3d47f936d0887 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs
@@ -1,4 +1,4 @@
-// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+// 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 Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Test.Utilities;
@@ -241,14 +241,15 @@ static void Main()
Left: ILocalReferenceExpression: value (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'value')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 100) (Syntax: '100')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
- IThrowStatement (OperationKind.ThrowStatement) (Syntax: 'throw new E ... ever hit"");')
- ThrownObject: IObjectCreationExpression (Constructor: System.Exception..ctor(System.String message)) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new Excepti ... Never hit"")')
- Arguments(1):
- IArgument (ArgumentKind.Explicit, Matching Parameter: message) (OperationKind.Argument) (Syntax: '""Never hit""')
- ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: ""Never hit"") (Syntax: '""Never hit""')
- InConversion: null
- OutConversion: null
- Initializer: null
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'throw new E ... ever hit"");')
+ Expression: IThrowExpression (OperationKind.ThrowExpression, Type: System.Exception) (Syntax: 'throw new E ... ever hit"");')
+ IObjectCreationExpression (Constructor: System.Exception..ctor(System.String message)) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new Excepti ... Never hit"")')
+ Arguments(1):
+ IArgument (ArgumentKind.Explicit, Matching Parameter: message) (OperationKind.Argument) (Syntax: '""Never hit""')
+ ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: ""Never hit"") (Syntax: '""Never hit""')
+ InConversion: null
+ OutConversion: null
+ Initializer: null
IfFalse: null
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.Wri ... tatement"");')
Expression: IInvocationExpression (void System.Console.WriteLine(System.String value)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'Console.Wri ... statement"")')
@@ -314,6 +315,7 @@ static void Main()
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'value--;')
Expression: IIncrementExpression (UnaryOperandKind.IntegerPostfixDecrement) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'value--')
Left: ILocalReferenceExpression: value (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'value')
+
";
VerifyOperationTreeForTest(source, expectedOperationTree);
}
@@ -334,7 +336,7 @@ static void Main()
}
}
";
-string expectedOperationTree = @"
+ string expectedOperationTree = @"
IWhileUntilLoopStatement (IsTopTest: True, IsWhile: True) (LoopKind.WhileUntil) (OperationKind.LoopStatement, IsInvalid) (Syntax: 'while (numb ... }')
Condition: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Boolean, IsInvalid) (Syntax: 'number')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
@@ -908,10 +910,11 @@ public void TryMethod()
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2) (Syntax: '2')
Catch clauses(0)
Finally: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
- IThrowStatement (OperationKind.ThrowStatement) (Syntax: 'throw new S ... xception();')
- ThrownObject: IObjectCreationExpression (Constructor: System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new System.Exception()')
- Arguments(0)
- Initializer: null
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'throw new S ... xception();')
+ Expression: IThrowExpression (OperationKind.ThrowExpression, Type: System.Exception) (Syntax: 'throw new S ... xception();')
+ IObjectCreationExpression (Constructor: System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'new System.Exception()')
+ Arguments(0)
+ Initializer: null
";
VerifyOperationTreeForTest(source, expectedOperationTree);
}
diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_InvalidExpression.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_InvalidExpression.cs
index a92e6824fc3e5..75062cd087eba 100644
--- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_InvalidExpression.cs
+++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_InvalidExpression.cs
@@ -328,7 +328,7 @@ static void F()
IVariableDeclarationStatement (1 variables) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'var x /**/;')
IVariableDeclaration: var x (OperationKind.VariableDeclaration) (Syntax: 'var x /**/;')
Initializer: IUnboundLambdaExpression (OperationKind.UnboundLambdaExpression, Type: null) (Syntax: '() => F()
- ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => F()')
+ IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => F()')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'F()')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'F()')
IInvocationExpression (static void Program.F()) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'F()')')
@@ -362,7 +362,7 @@ static void F()
}
";
string expectedOperationTree = @"
-ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: '() => F()')
+IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'F()')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'F()')
Expression: IInvocationExpression (void Program.F()) (OperationKind.InvocationExpression, Type: System.Void, IsInvalid) (Syntax: 'F()')
diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/LocalFunctionTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/LocalFunctionTests.cs
index a5a761ddf1dd3..d2890d43c4a32 100644
--- a/src/Compilers/CSharp/Test/Semantic/Semantics/LocalFunctionTests.cs
+++ b/src/Compilers/CSharp/Test/Semantic/Semantics/LocalFunctionTests.cs
@@ -3136,7 +3136,10 @@ static void M()
comp.VerifyEmitDiagnostics(
// (8,18): error CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type.
// L(m => L(d => d, m), null);
- Diagnostic(ErrorCode.ERR_BadDynamicMethodArgLambda, "d => d").WithLocation(8, 18));
+ Diagnostic(ErrorCode.ERR_BadDynamicMethodArgLambda, "d => d").WithLocation(8, 18),
+ // (8,16): error CS8322: Cannot pass argument with dynamic type to generic local function 'L' with inferred type arguments.
+ // L(m => L(d => d, m), null);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L(d => d, m)").WithArguments("L").WithLocation(8, 16));
}
[Fact]
@@ -3159,9 +3162,74 @@ async Task L(Func t, object p)
// (8,37): error CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type.
// => await L(async m => L(async d => await d, m), p);
Diagnostic(ErrorCode.ERR_BadDynamicMethodArgLambda, "async d => await d").WithLocation(8, 37),
+ // (8,35): error CS8322: Cannot pass argument with dynamic type to generic local function 'L' with inferred type arguments.
+ // => await L(async m => L(async d => await d, m), p);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L(async d => await d, m)").WithArguments("L").WithLocation(8, 35),
// (8,32): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
// => await L(async m => L(async d => await d, m), p);
Diagnostic(ErrorCode.WRN_AsyncLacksAwaits, "=>").WithLocation(8, 32));
}
+
+ [Fact]
+ [WorkItem(21317, "https://github.com/dotnet/roslyn/issues/21317")]
+ [CompilerTrait(CompilerFeature.Dynamic)]
+ public void DynamicGenericArg()
+ {
+ var src = @"
+using System.Collections.Generic;
+class C
+{
+ static void M()
+ {
+ dynamic val = 2;
+ dynamic dynamicList = new List();
+
+ void L1(T x) { }
+ L1(val);
+
+ void L2(int x, T y) { }
+ L2(1, val);
+ L2(val, 3.0f);
+
+ void L3(List x) { }
+ L3(dynamicList);
+
+ void L4(int x, params T[] y) { }
+ L4(1, 2, val);
+ L4(val, 3, 4);
+
+ void L5(T x, params int[] y) { }
+ L5(val, 1, 2);
+ L5(1, 3, val);
+ }
+}
+";
+ VerifyDiagnostics(src,
+ // (11,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L1'. Try specifying the type arguments explicitly.
+ // L1(val);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L1(val)").WithArguments("L1").WithLocation(11, 9),
+ // (14,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L2'. Try specifying the type arguments explicitly.
+ // L2(1, val);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L2(1, val)").WithArguments("L2").WithLocation(14, 9),
+ // (15,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L2'. Try specifying the type arguments explicitly.
+ // L2(val, 3.0f);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L2(val, 3.0f)").WithArguments("L2").WithLocation(15, 9),
+ // (18,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L3'. Try specifying the type arguments explicitly.
+ // L3(dynamicList);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L3(dynamicList)").WithArguments("L3").WithLocation(18, 9),
+ // (21,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L4'. Try specifying the type arguments explicitly.
+ // L4(1, 2, val);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L4(1, 2, val)").WithArguments("L4").WithLocation(21, 9),
+ // (22,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L4'. Try specifying the type arguments explicitly.
+ // L4(val, 3, 4);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L4(val, 3, 4)").WithArguments("L4").WithLocation(22, 9),
+ // (25,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L5'. Try specifying the type arguments explicitly.
+ // L5(val, 1, 2);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L5(val, 1, 2)").WithArguments("L5").WithLocation(25, 9),
+ // (26,9): error CS8322: Cannot pass argument with dynamic type to generic local function 'L5'. Try specifying the type arguments explicitly.
+ // L5(1, 3, val);
+ Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L5(1, 3, val)").WithArguments("L5").WithLocation(26, 9)
+ );
+ }
}
}
diff --git a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs
index d33c259e5a35e..d6903da9b8d48 100644
--- a/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs
+++ b/src/Compilers/CSharp/Test/Symbol/Symbols/AnonymousTypesSemanticsTests.cs
@@ -349,7 +349,7 @@ void Main()
Instance Receiver: null
Right: IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: D1) (Syntax: '(D1)(() => false)')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: lambda expression) (OperationKind.LambdaExpression, Type: null) (Syntax: '() => false')
+ Operand: IAnonymousFunctionExpression (Symbol: lambda expression) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: '() => false')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'false')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'false')
ReturnedValue: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: False) (Syntax: 'false')
diff --git a/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs b/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs
index 47aeb6b9fb9ca..076ac7b14de22 100644
--- a/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs
+++ b/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs
@@ -2645,20 +2645,14 @@ public LazyLabelStatement(ILabelSymbol label, Lazy labeledStatement,
protected override IOperation LabeledStatementImpl => _lazyLabeledStatement.Value;
}
- ///
- /// Represents a lambda expression.
- ///
- internal abstract partial class BaseLambdaExpression : Operation, ILambdaExpression
+ internal abstract partial class BaseAnonymousFunctionExpression : Operation, IAnonymousFunctionExpression
{
- protected BaseLambdaExpression(IMethodSymbol signature, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
- base(OperationKind.LambdaExpression, semanticModel, syntax, type, constantValue, isImplicit)
+ protected BaseAnonymousFunctionExpression(IMethodSymbol symbol, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
+ base(OperationKind.AnonymousFunctionExpression, semanticModel, syntax, type, constantValue, isImplicit)
{
- Signature = signature;
+ Symbol = symbol;
}
- ///
- /// Signature of the lambda.
- ///
- public IMethodSymbol Signature { get; }
+ public IMethodSymbol Symbol { get; }
protected abstract IBlockStatement BodyImpl { get; }
public override IEnumerable Children
{
@@ -2667,27 +2661,21 @@ public override IEnumerable Children
yield return Body;
}
}
- ///
- /// Body of the lambda.
- ///
public IBlockStatement Body => Operation.SetParentOperation(BodyImpl, this);
public override void Accept(OperationVisitor visitor)
{
- visitor.VisitLambdaExpression(this);
+ visitor.VisitAnonymousFunctionExpression(this);
}
public override TResult Accept(OperationVisitor visitor, TArgument argument)
{
- return visitor.VisitLambdaExpression(this, argument);
+ return visitor.VisitAnonymousFunctionExpression(this, argument);
}
}
- ///
- /// Represents a lambda expression.
- ///
- internal sealed partial class LambdaExpression : BaseLambdaExpression, ILambdaExpression
+ internal sealed partial class AnonymousFunctionExpression : BaseAnonymousFunctionExpression, IAnonymousFunctionExpression
{
- public LambdaExpression(IMethodSymbol signature, IBlockStatement body, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
- base(signature, semanticModel, syntax, type, constantValue, isImplicit)
+ public AnonymousFunctionExpression(IMethodSymbol symbol, IBlockStatement body, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
+ base(symbol, semanticModel, syntax, type, constantValue, isImplicit)
{
BodyImpl = body;
}
@@ -2695,14 +2683,11 @@ internal sealed partial class LambdaExpression : BaseLambdaExpression, ILambdaEx
protected override IBlockStatement BodyImpl { get; }
}
- ///
- /// Represents a lambda expression.
- ///
- internal sealed partial class LazyLambdaExpression : BaseLambdaExpression, ILambdaExpression
+ internal sealed partial class LazyAnonymousFunctionExpression : BaseAnonymousFunctionExpression, IAnonymousFunctionExpression
{
private readonly Lazy _lazyBody;
- public LazyLambdaExpression(IMethodSymbol signature, Lazy body, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(signature, semanticModel, syntax, type, constantValue, isImplicit)
+ public LazyAnonymousFunctionExpression(IMethodSymbol symbol, Lazy body, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(symbol, semanticModel, syntax, type, constantValue, isImplicit)
{
_lazyBody = body ?? throw new System.ArgumentNullException(nameof(body));
}
@@ -2856,20 +2841,20 @@ internal abstract partial class BaseLockStatement : Operation, ILockStatement
{
}
- protected abstract IOperation LockedObjectImpl { get; }
+ protected abstract IOperation ExpressionImpl { get; }
protected abstract IOperation BodyImpl { get; }
public override IEnumerable Children
{
get
{
- yield return LockedObject;
+ yield return Expression;
yield return Body;
}
}
///
- /// Value to be locked.
+ /// Expression producing a value to be locked.
///
- public IOperation LockedObject => Operation.SetParentOperation(LockedObjectImpl, this);
+ public IOperation Expression => Operation.SetParentOperation(ExpressionImpl, this);
///
/// Body of the lock, to be executed while holding the lock.
///
@@ -2889,14 +2874,14 @@ public override void Accept(OperationVisitor visitor)
///
internal sealed partial class LockStatement : BaseLockStatement, ILockStatement
{
- public LockStatement(IOperation lockedObject, IOperation body, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
+ public LockStatement(IOperation expression, IOperation body, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
base(semanticModel, syntax, type, constantValue, isImplicit)
{
- LockedObjectImpl = lockedObject;
+ ExpressionImpl = expression;
BodyImpl = body;
}
- protected override IOperation LockedObjectImpl { get; }
+ protected override IOperation ExpressionImpl { get; }
protected override IOperation BodyImpl { get; }
}
@@ -2905,16 +2890,16 @@ internal sealed partial class LockStatement : BaseLockStatement, ILockStatement
///
internal sealed partial class LazyLockStatement : BaseLockStatement, ILockStatement
{
- private readonly Lazy _lazyLockedObject;
+ private readonly Lazy _lazyExpression;
private readonly Lazy _lazyBody;
public LazyLockStatement(Lazy lockedObject, Lazy body, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(semanticModel, syntax, type, constantValue, isImplicit)
{
- _lazyLockedObject = lockedObject ?? throw new System.ArgumentNullException(nameof(lockedObject));
+ _lazyExpression = lockedObject ?? throw new System.ArgumentNullException(nameof(lockedObject));
_lazyBody = body ?? throw new System.ArgumentNullException(nameof(body));
}
- protected override IOperation LockedObjectImpl => _lazyLockedObject.Value;
+ protected override IOperation ExpressionImpl => _lazyExpression.Value;
protected override IOperation BodyImpl => _lazyBody.Value;
}
@@ -3034,74 +3019,74 @@ internal sealed partial class LazyMethodBindingExpression : BaseMethodBindingExp
///
/// Represents a null-coalescing expression.
///
- internal abstract partial class BaseNullCoalescingExpression : Operation, INullCoalescingExpression
+ internal abstract partial class BaseCoalesceExpression : Operation, ICoalesceExpression
{
- protected BaseNullCoalescingExpression(SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
- base(OperationKind.NullCoalescingExpression, semanticModel, syntax, type, constantValue, isImplicit)
+ protected BaseCoalesceExpression(SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
+ base(OperationKind.CoalesceExpression, semanticModel, syntax, type, constantValue, isImplicit)
{
}
- protected abstract IOperation PrimaryOperandImpl { get; }
- protected abstract IOperation SecondaryOperandImpl { get; }
+ protected abstract IOperation ExpressionImpl { get; }
+ protected abstract IOperation WhenNullImpl { get; }
public override IEnumerable Children
{
get
{
- yield return PrimaryOperand;
- yield return SecondaryOperand;
+ yield return Expression;
+ yield return WhenNull;
}
}
///
/// Value to be unconditionally evaluated.
///
- public IOperation PrimaryOperand => Operation.SetParentOperation(PrimaryOperandImpl, this);
+ public IOperation Expression => Operation.SetParentOperation(ExpressionImpl, this);
///
- /// Value to be evaluated if Primary evaluates to null/Nothing.
+ /// Value to be evaluated if evaluates to null/Nothing.
///
- public IOperation SecondaryOperand => Operation.SetParentOperation(SecondaryOperandImpl, this);
+ public IOperation WhenNull => Operation.SetParentOperation(WhenNullImpl, this);
public override void Accept(OperationVisitor visitor)
{
- visitor.VisitNullCoalescingExpression(this);
+ visitor.VisitCoalesceExpression(this);
}
public override TResult Accept(OperationVisitor visitor, TArgument argument)
{
- return visitor.VisitNullCoalescingExpression(this, argument);
+ return visitor.VisitCoalesceExpression(this, argument);
}
}
///
/// Represents a null-coalescing expression.
///
- internal sealed partial class NullCoalescingExpression : BaseNullCoalescingExpression, INullCoalescingExpression
+ internal sealed partial class CoalesceExpression : BaseCoalesceExpression, ICoalesceExpression
{
- public NullCoalescingExpression(IOperation primaryOperand, IOperation secondaryOperand, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
+ public CoalesceExpression(IOperation expression, IOperation whenNull, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
base(semanticModel, syntax, type, constantValue, isImplicit)
{
- PrimaryOperandImpl = primaryOperand;
- SecondaryOperandImpl = secondaryOperand;
+ ExpressionImpl = expression;
+ WhenNullImpl = whenNull;
}
- protected override IOperation PrimaryOperandImpl { get; }
- protected override IOperation SecondaryOperandImpl { get; }
+ protected override IOperation ExpressionImpl { get; }
+ protected override IOperation WhenNullImpl { get; }
}
///
/// Represents a null-coalescing expression.
///
- internal sealed partial class LazyNullCoalescingExpression : BaseNullCoalescingExpression, INullCoalescingExpression
+ internal sealed partial class LazyCoalesceExpression : BaseCoalesceExpression, ICoalesceExpression
{
- private readonly Lazy _lazyPrimaryOperand;
- private readonly Lazy _lazySecondaryOperand;
+ private readonly Lazy _lazyExpression;
+ private readonly Lazy _lazyWhenNull;
- public LazyNullCoalescingExpression(Lazy primaryOperand, Lazy secondaryOperand, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(semanticModel, syntax, type, constantValue, isImplicit)
+ public LazyCoalesceExpression(Lazy expression, Lazy whenNull, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(semanticModel, syntax, type, constantValue, isImplicit)
{
- _lazyPrimaryOperand = primaryOperand ?? throw new System.ArgumentNullException(nameof(primaryOperand));
- _lazySecondaryOperand = secondaryOperand ?? throw new System.ArgumentNullException(nameof(secondaryOperand));
+ _lazyExpression = expression ?? throw new System.ArgumentNullException(nameof(expression));
+ _lazyWhenNull = whenNull ?? throw new System.ArgumentNullException(nameof(whenNull));
}
- protected override IOperation PrimaryOperandImpl => _lazyPrimaryOperand.Value;
+ protected override IOperation ExpressionImpl => _lazyExpression.Value;
- protected override IOperation SecondaryOperandImpl => _lazySecondaryOperand.Value;
+ protected override IOperation WhenNullImpl => _lazyWhenNull.Value;
}
///
@@ -4266,67 +4251,6 @@ internal sealed partial class LazySyntheticLocalReferenceExpression : BaseSynthe
}
}
- ///
- /// Represents a C# throw or a VB Throw statement.
- ///
- internal abstract partial class BaseThrowStatement : Operation, IThrowStatement
- {
- protected BaseThrowStatement(SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
- base(OperationKind.ThrowStatement, semanticModel, syntax, type, constantValue, isImplicit)
- {
- }
-
- protected abstract IOperation ThrownObjectImpl { get; }
- public override IEnumerable Children
- {
- get
- {
- yield return ThrownObject;
- }
- }
- ///
- /// Value to be thrown.
- ///
- public IOperation ThrownObject => Operation.SetParentOperation(ThrownObjectImpl, this);
- public override void Accept(OperationVisitor visitor)
- {
- visitor.VisitThrowStatement(this);
- }
- public override TResult Accept(OperationVisitor visitor, TArgument argument)
- {
- return visitor.VisitThrowStatement(this, argument);
- }
- }
-
- ///
- /// Represents a C# throw or a VB Throw statement.
- ///
- internal sealed partial class ThrowStatement : BaseThrowStatement, IThrowStatement
- {
- public ThrowStatement(IOperation thrownObject, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) :
- base(semanticModel, syntax, type, constantValue, isImplicit)
- {
- ThrownObjectImpl = thrownObject;
- }
-
- protected override IOperation ThrownObjectImpl { get; }
- }
-
- ///
- /// Represents a C# throw or a VB Throw statement.
- ///
- internal sealed partial class LazyThrowStatement : BaseThrowStatement, IThrowStatement
- {
- private readonly Lazy _lazyThrownObject;
-
- public LazyThrowStatement(Lazy thrownObject, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(semanticModel, syntax, type, constantValue, isImplicit)
- {
- _lazyThrownObject = thrownObject ?? throw new System.ArgumentNullException(nameof(thrownObject));
- }
-
- protected override IOperation ThrownObjectImpl => _lazyThrownObject.Value;
- }
-
///
/// Represents a C# try or a VB Try statement.
///
diff --git a/src/Compilers/Core/Portable/InternalUtilities/EnumerableExtensions.cs b/src/Compilers/Core/Portable/InternalUtilities/EnumerableExtensions.cs
index 08ac4dcd6c0c0..929f6ce36efa0 100644
--- a/src/Compilers/Core/Portable/InternalUtilities/EnumerableExtensions.cs
+++ b/src/Compilers/Core/Portable/InternalUtilities/EnumerableExtensions.cs
@@ -3,9 +3,11 @@
using System;
using System.Collections;
using System.Collections.Generic;
+using System.Collections.Immutable;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
+using Microsoft.CodeAnalysis.PooledObjects;
namespace Roslyn.Utilities
{
@@ -242,6 +244,19 @@ public static IEnumerable WhereNotNull(this IEnumerable source)
return source.Where((Func)s_notNullTest);
}
+ public static ImmutableArray SelectAsArray(this IEnumerable source, Func selector)
+ {
+ if (source == null)
+ {
+ return ImmutableArray.Empty;
+ }
+
+ var builder = ArrayBuilder.GetInstance();
+ builder.AddRange(source.Select(selector));
+
+ return builder.ToImmutableAndFree();
+ }
+
public static bool All(this IEnumerable source)
{
if (source == null)
diff --git a/src/Compilers/Core/Portable/Operations/ILambdaExpression.cs b/src/Compilers/Core/Portable/Operations/IAnonymousFunctionExpression.cs
similarity index 67%
rename from src/Compilers/Core/Portable/Operations/ILambdaExpression.cs
rename to src/Compilers/Core/Portable/Operations/IAnonymousFunctionExpression.cs
index d39c83b44bca9..580502bc74737 100644
--- a/src/Compilers/Core/Portable/Operations/ILambdaExpression.cs
+++ b/src/Compilers/Core/Portable/Operations/IAnonymousFunctionExpression.cs
@@ -5,20 +5,20 @@
namespace Microsoft.CodeAnalysis.Semantics
{
///
- /// Represents a lambda expression.
+ /// Represents an anonymous function expression, such as a lambda or anonymous delegate.
///
///
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
///
- public interface ILambdaExpression : IOperation
+ public interface IAnonymousFunctionExpression : IOperation
{
///
- /// Signature of the lambda.
+ /// Symbol of the anonymous function.
///
- IMethodSymbol Signature { get; }
+ IMethodSymbol Symbol { get; }
///
- /// Body of the lambda.
+ /// Body of the anonymous function.
///
IBlockStatement Body { get; }
}
diff --git a/src/Compilers/Core/Portable/Operations/INullCoalescingExpression.cs b/src/Compilers/Core/Portable/Operations/ICoalesceExpression.cs
similarity index 75%
rename from src/Compilers/Core/Portable/Operations/INullCoalescingExpression.cs
rename to src/Compilers/Core/Portable/Operations/ICoalesceExpression.cs
index 9f64b19bf8df0..197933ede9db0 100644
--- a/src/Compilers/Core/Portable/Operations/INullCoalescingExpression.cs
+++ b/src/Compilers/Core/Portable/Operations/ICoalesceExpression.cs
@@ -11,16 +11,16 @@ namespace Microsoft.CodeAnalysis.Semantics
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
///
- public interface INullCoalescingExpression : IOperation
+ public interface ICoalesceExpression : IOperation
{
///
/// Value to be unconditionally evaluated.
///
- IOperation PrimaryOperand { get; }
+ IOperation Expression { get; }
///
- /// Value to be evaluated if Primary evaluates to null/Nothing.
+ /// Value to be evaluated if evaluates to null/Nothing.
///
- IOperation SecondaryOperand { get; }
+ IOperation WhenNull { get; }
}
}
diff --git a/src/Compilers/Core/Portable/Operations/ILockStatement.cs b/src/Compilers/Core/Portable/Operations/ILockStatement.cs
index 7d1c893782837..d433f2c709af5 100644
--- a/src/Compilers/Core/Portable/Operations/ILockStatement.cs
+++ b/src/Compilers/Core/Portable/Operations/ILockStatement.cs
@@ -14,9 +14,9 @@ namespace Microsoft.CodeAnalysis.Semantics
public interface ILockStatement : IOperation
{
///
- /// Value to be locked.
+ /// Expression producing a value to be locked.
///
- IOperation LockedObject { get; }
+ IOperation Expression { get; }
///
/// Body of the lock, to be executed while holding the lock.
///
diff --git a/src/Compilers/Core/Portable/Operations/IThrowStatement.cs b/src/Compilers/Core/Portable/Operations/IThrowStatement.cs
deleted file mode 100644
index e77669ae6ea93..0000000000000
--- a/src/Compilers/Core/Portable/Operations/IThrowStatement.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-// 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.Immutable;
-
-namespace Microsoft.CodeAnalysis.Semantics
-{
- ///
- /// Represents a C# throw or a VB Throw statement.
- ///
- ///
- /// This interface is reserved for implementation by its associated APIs. We reserve the right to
- /// change it in the future.
- ///
- public interface IThrowStatement : IOperation
- {
- ///
- /// Value to be thrown.
- ///
- IOperation ThrownObject { get; }
- }
-}
-
diff --git a/src/Compilers/Core/Portable/Operations/OperationCloner.cs b/src/Compilers/Core/Portable/Operations/OperationCloner.cs
index e889bc7ca15fd..8adc6f487f9e4 100644
--- a/src/Compilers/Core/Portable/Operations/OperationCloner.cs
+++ b/src/Compilers/Core/Portable/Operations/OperationCloner.cs
@@ -119,11 +119,6 @@ public override IOperation VisitEmptyStatement(IEmptyStatement operation, object
return new EmptyStatement(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
- public override IOperation VisitThrowStatement(IThrowStatement operation, object argument)
- {
- return new ThrowStatement(Visit(operation.ThrownObject), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
- }
-
public override IOperation VisitReturnStatement(IReturnStatement operation, object argument)
{
return new ReturnStatement(operation.Kind, Visit(operation.ReturnedValue), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
@@ -131,7 +126,7 @@ public override IOperation VisitReturnStatement(IReturnStatement operation, obje
public override IOperation VisitLockStatement(ILockStatement operation, object argument)
{
- return new LockStatement(Visit(operation.LockedObject), Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
+ return new LockStatement(Visit(operation.Expression), Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitTryStatement(ITryStatement operation, object argument)
@@ -274,9 +269,9 @@ public override IOperation VisitConditionalChoiceExpression(IConditionalChoiceEx
return new ConditionalChoiceExpression(Visit(operation.Condition), Visit(operation.IfTrueValue), Visit(operation.IfFalseValue), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
- public override IOperation VisitNullCoalescingExpression(INullCoalescingExpression operation, object argument)
+ public override IOperation VisitCoalesceExpression(ICoalesceExpression operation, object argument)
{
- return new NullCoalescingExpression(Visit(operation.PrimaryOperand), Visit(operation.SecondaryOperand), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
+ return new CoalesceExpression(Visit(operation.Expression), Visit(operation.WhenNull), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitIsTypeExpression(IIsTypeExpression operation, object argument)
@@ -294,9 +289,9 @@ public override IOperation VisitTypeOfExpression(ITypeOfExpression operation, ob
return new TypeOfExpression(operation.TypeOperand, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
- public override IOperation VisitLambdaExpression(ILambdaExpression operation, object argument)
+ public override IOperation VisitAnonymousFunctionExpression(IAnonymousFunctionExpression operation, object argument)
{
- return new LambdaExpression(operation.Signature, Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
+ return new AnonymousFunctionExpression(operation.Symbol, Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitLiteralExpression(ILiteralExpression operation, object argument)
diff --git a/src/Compilers/Core/Portable/Operations/OperationKind.cs b/src/Compilers/Core/Portable/Operations/OperationKind.cs
index f0a17227330cd..bb279bbb78fed 100644
--- a/src/Compilers/Core/Portable/Operations/OperationKind.cs
+++ b/src/Compilers/Core/Portable/Operations/OperationKind.cs
@@ -31,8 +31,7 @@ public enum OperationKind
BranchStatement = 0x8,
/// Indicates an .
EmptyStatement = 0x9,
- /// Indicates an .
- ThrowStatement = 0xa,
+ // 0xa open for usage, was IThrowStatement.
/// Indicates an .
ReturnStatement = 0xb,
/// Indicates an .
@@ -96,10 +95,10 @@ public enum OperationKind
BinaryOperatorExpression = 0x10e,
/// Indicates an .
ConditionalChoiceExpression = 0x10f,
- /// Indicates an .
- NullCoalescingExpression = 0x110,
- /// Indicates an .
- LambdaExpression = 0x111,
+ /// Indicates an .
+ CoalesceExpression = 0x110,
+ /// Indicates an .
+ AnonymousFunctionExpression = 0x111,
/// Indicates an .
ObjectCreationExpression = 0x112,
/// Indicates an .
diff --git a/src/Compilers/Core/Portable/Operations/OperationVisitor.cs b/src/Compilers/Core/Portable/Operations/OperationVisitor.cs
index 56c1f3b4db093..67c08801e9739 100644
--- a/src/Compilers/Core/Portable/Operations/OperationVisitor.cs
+++ b/src/Compilers/Core/Portable/Operations/OperationVisitor.cs
@@ -110,11 +110,6 @@ public virtual void VisitEmptyStatement(IEmptyStatement operation)
DefaultVisit(operation);
}
- public virtual void VisitThrowStatement(IThrowStatement operation)
- {
- DefaultVisit(operation);
- }
-
public virtual void VisitReturnStatement(IReturnStatement operation)
{
DefaultVisit(operation);
@@ -270,7 +265,7 @@ public virtual void VisitConditionalChoiceExpression(IConditionalChoiceExpressio
DefaultVisit(operation);
}
- public virtual void VisitNullCoalescingExpression(INullCoalescingExpression operation)
+ public virtual void VisitCoalesceExpression(ICoalesceExpression operation)
{
DefaultVisit(operation);
}
@@ -290,7 +285,7 @@ public virtual void VisitTypeOfExpression(ITypeOfExpression operation)
DefaultVisit(operation);
}
- public virtual void VisitLambdaExpression(ILambdaExpression operation)
+ public virtual void VisitAnonymousFunctionExpression(IAnonymousFunctionExpression operation)
{
DefaultVisit(operation);
}
@@ -580,11 +575,6 @@ public virtual TResult VisitEmptyStatement(IEmptyStatement operation, TArgument
return DefaultVisit(operation, argument);
}
- public virtual TResult VisitThrowStatement(IThrowStatement operation, TArgument argument)
- {
- return DefaultVisit(operation, argument);
- }
-
public virtual TResult VisitReturnStatement(IReturnStatement operation, TArgument argument)
{
return DefaultVisit(operation, argument);
@@ -740,7 +730,7 @@ public virtual TResult VisitConditionalChoiceExpression(IConditionalChoiceExpres
return DefaultVisit(operation, argument);
}
- public virtual TResult VisitNullCoalescingExpression(INullCoalescingExpression operation, TArgument argument)
+ public virtual TResult VisitCoalesceExpression(ICoalesceExpression operation, TArgument argument)
{
return DefaultVisit(operation, argument);
}
@@ -760,7 +750,7 @@ public virtual TResult VisitTypeOfExpression(ITypeOfExpression operation, TArgum
return DefaultVisit(operation, argument);
}
- public virtual TResult VisitLambdaExpression(ILambdaExpression operation, TArgument argument)
+ public virtual TResult VisitAnonymousFunctionExpression(IAnonymousFunctionExpression operation, TArgument argument)
{
return DefaultVisit(operation, argument);
}
diff --git a/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt b/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt
index 0e096aad6bcb9..8af4797ee56eb 100644
--- a/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt
+++ b/src/Compilers/Core/Portable/PublicAPI.Unshipped.txt
@@ -91,7 +91,7 @@ Microsoft.CodeAnalysis.OperationKind.InvocationExpression = 259 -> Microsoft.Cod
Microsoft.CodeAnalysis.OperationKind.IsPatternExpression = 517 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.IsTypeExpression = 278 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.LabelStatement = 7 -> Microsoft.CodeAnalysis.OperationKind
-Microsoft.CodeAnalysis.OperationKind.LambdaExpression = 273 -> Microsoft.CodeAnalysis.OperationKind
+Microsoft.CodeAnalysis.OperationKind.AnonymousFunctionExpression = 273 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.LiteralExpression = 257 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.LocalFunctionStatement = 49 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.LocalReferenceExpression = 261 -> Microsoft.CodeAnalysis.OperationKind
@@ -101,7 +101,7 @@ Microsoft.CodeAnalysis.OperationKind.MemberInitializerExpression = 289 -> Micros
Microsoft.CodeAnalysis.OperationKind.MethodBindingExpression = 265 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.NameOfExpression = 291 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.None = 0 -> Microsoft.CodeAnalysis.OperationKind
-Microsoft.CodeAnalysis.OperationKind.NullCoalescingExpression = 272 -> Microsoft.CodeAnalysis.OperationKind
+Microsoft.CodeAnalysis.OperationKind.CoalesceExpression = 272 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.ObjectCreationExpression = 274 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.ObjectOrCollectionInitializerExpression = 288 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.OmittedArgumentExpression = 768 -> Microsoft.CodeAnalysis.OperationKind
@@ -124,7 +124,6 @@ Microsoft.CodeAnalysis.OperationKind.SwitchCase = 1033 -> Microsoft.CodeAnalysis
Microsoft.CodeAnalysis.OperationKind.SwitchStatement = 4 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.SyntheticLocalReferenceExpression = 263 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.ThrowExpression = 519 -> Microsoft.CodeAnalysis.OperationKind
-Microsoft.CodeAnalysis.OperationKind.ThrowStatement = 10 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.TryStatement = 14 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.TupleExpression = 292 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.TypeOfExpression = 513 -> Microsoft.CodeAnalysis.OperationKind
@@ -485,9 +484,9 @@ Microsoft.CodeAnalysis.Semantics.IIsTypeExpression.Operand.get -> Microsoft.Code
Microsoft.CodeAnalysis.Semantics.ILabelStatement
Microsoft.CodeAnalysis.Semantics.ILabelStatement.Label.get -> Microsoft.CodeAnalysis.ILabelSymbol
Microsoft.CodeAnalysis.Semantics.ILabelStatement.LabeledStatement.get -> Microsoft.CodeAnalysis.IOperation
-Microsoft.CodeAnalysis.Semantics.ILambdaExpression
-Microsoft.CodeAnalysis.Semantics.ILambdaExpression.Body.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement
-Microsoft.CodeAnalysis.Semantics.ILambdaExpression.Signature.get -> Microsoft.CodeAnalysis.IMethodSymbol
+Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression
+Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression.Body.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement
+Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression.Symbol.get -> Microsoft.CodeAnalysis.IMethodSymbol
Microsoft.CodeAnalysis.Semantics.ILiteralExpression
Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement
Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement.Body.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement
@@ -496,7 +495,7 @@ Microsoft.CodeAnalysis.Semantics.ILocalReferenceExpression
Microsoft.CodeAnalysis.Semantics.ILocalReferenceExpression.Local.get -> Microsoft.CodeAnalysis.ILocalSymbol
Microsoft.CodeAnalysis.Semantics.ILockStatement
Microsoft.CodeAnalysis.Semantics.ILockStatement.Body.get -> Microsoft.CodeAnalysis.IOperation
-Microsoft.CodeAnalysis.Semantics.ILockStatement.LockedObject.get -> Microsoft.CodeAnalysis.IOperation
+Microsoft.CodeAnalysis.Semantics.ILockStatement.Expression.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.ILoopStatement
Microsoft.CodeAnalysis.Semantics.ILoopStatement.Body.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.ILoopStatement.LoopKind.get -> Microsoft.CodeAnalysis.Semantics.LoopKind
@@ -511,9 +510,9 @@ Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression.IsVirtual.get -> bool
Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression.Method.get -> Microsoft.CodeAnalysis.IMethodSymbol
Microsoft.CodeAnalysis.Semantics.INameOfExpression
Microsoft.CodeAnalysis.Semantics.INameOfExpression.Argument.get -> Microsoft.CodeAnalysis.IOperation
-Microsoft.CodeAnalysis.Semantics.INullCoalescingExpression
-Microsoft.CodeAnalysis.Semantics.INullCoalescingExpression.PrimaryOperand.get -> Microsoft.CodeAnalysis.IOperation
-Microsoft.CodeAnalysis.Semantics.INullCoalescingExpression.SecondaryOperand.get -> Microsoft.CodeAnalysis.IOperation
+Microsoft.CodeAnalysis.Semantics.ICoalesceExpression
+Microsoft.CodeAnalysis.Semantics.ICoalesceExpression.Expression.get -> Microsoft.CodeAnalysis.IOperation
+Microsoft.CodeAnalysis.Semantics.ICoalesceExpression.WhenNull.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression
Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression.Constructor.get -> Microsoft.CodeAnalysis.IMethodSymbol
Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression.Initializer.get -> Microsoft.CodeAnalysis.Semantics.IObjectOrCollectionInitializerExpression
@@ -564,8 +563,6 @@ Microsoft.CodeAnalysis.Semantics.ISyntheticLocalReferenceExpression
Microsoft.CodeAnalysis.Semantics.ISyntheticLocalReferenceExpression.SyntheticLocalKind.get -> Microsoft.CodeAnalysis.Semantics.SyntheticLocalKind
Microsoft.CodeAnalysis.Semantics.IThrowExpression
Microsoft.CodeAnalysis.Semantics.IThrowExpression.Expression.get -> Microsoft.CodeAnalysis.IOperation
-Microsoft.CodeAnalysis.Semantics.IThrowStatement
-Microsoft.CodeAnalysis.Semantics.IThrowStatement.ThrownObject.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.ITryStatement
Microsoft.CodeAnalysis.Semantics.ITryStatement.Body.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement
Microsoft.CodeAnalysis.Semantics.ITryStatement.Catches.get -> System.Collections.Immutable.ImmutableArray
@@ -819,7 +816,7 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitInvocationExpress
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsPatternExpression(Microsoft.CodeAnalysis.Semantics.IIsPatternExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsTypeExpression(Microsoft.CodeAnalysis.Semantics.IIsTypeExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLabelStatement(Microsoft.CodeAnalysis.Semantics.ILabelStatement operation) -> void
-virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLambdaExpression(Microsoft.CodeAnalysis.Semantics.ILambdaExpression operation) -> void
+virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousFunctionExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLiteralExpression(Microsoft.CodeAnalysis.Semantics.ILiteralExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalFunctionStatement(Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalReferenceExpression(Microsoft.CodeAnalysis.Semantics.ILocalReferenceExpression operation) -> void
@@ -827,7 +824,7 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLockStatement(Mic
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMemberInitializerExpression(Microsoft.CodeAnalysis.Semantics.IMemberInitializerExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMethodBindingExpression(Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitNameOfExpression(Microsoft.CodeAnalysis.Semantics.INameOfExpression operation) -> void
-virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitNullCoalescingExpression(Microsoft.CodeAnalysis.Semantics.INullCoalescingExpression operation) -> void
+virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCoalesceExpression(Microsoft.CodeAnalysis.Semantics.ICoalesceExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectOrCollectionInitializerExpression(Microsoft.CodeAnalysis.Semantics.IObjectOrCollectionInitializerExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitOmittedArgumentExpression(Microsoft.CodeAnalysis.Semantics.IOmittedArgumentExpression operation) -> void
@@ -850,7 +847,6 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitSwitchCase(Micros
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitSwitchStatement(Microsoft.CodeAnalysis.Semantics.ISwitchStatement operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitSyntheticLocalReferenceExpression(Microsoft.CodeAnalysis.Semantics.ISyntheticLocalReferenceExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitThrowExpression(Microsoft.CodeAnalysis.Semantics.IThrowExpression operation) -> void
-virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitThrowStatement(Microsoft.CodeAnalysis.Semantics.IThrowStatement operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitTryStatement(Microsoft.CodeAnalysis.Semantics.ITryStatement operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitTupleExpression(Microsoft.CodeAnalysis.Semantics.ITupleExpression operation) -> void
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitTypeOfExpression(Microsoft.CodeAnalysis.Semantics.ITypeOfExpression operation) -> void
@@ -909,7 +905,7 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Vi
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsPatternExpression(Microsoft.CodeAnalysis.Semantics.IIsPatternExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitIsTypeExpression(Microsoft.CodeAnalysis.Semantics.IIsTypeExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLabelStatement(Microsoft.CodeAnalysis.Semantics.ILabelStatement operation, TArgument argument) -> TResult
-virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLambdaExpression(Microsoft.CodeAnalysis.Semantics.ILambdaExpression operation, TArgument argument) -> TResult
+virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitAnonymousFunctionExpression(Microsoft.CodeAnalysis.Semantics.IAnonymousFunctionExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLiteralExpression(Microsoft.CodeAnalysis.Semantics.ILiteralExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalFunctionStatement(Microsoft.CodeAnalysis.Semantics.ILocalFunctionStatement operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitLocalReferenceExpression(Microsoft.CodeAnalysis.Semantics.ILocalReferenceExpression operation, TArgument argument) -> TResult
@@ -917,7 +913,7 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Vi
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMemberInitializerExpression(Microsoft.CodeAnalysis.Semantics.IMemberInitializerExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitMethodBindingExpression(Microsoft.CodeAnalysis.Semantics.IMethodBindingExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitNameOfExpression(Microsoft.CodeAnalysis.Semantics.INameOfExpression operation, TArgument argument) -> TResult
-virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitNullCoalescingExpression(Microsoft.CodeAnalysis.Semantics.INullCoalescingExpression operation, TArgument argument) -> TResult
+virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitCoalesceExpression(Microsoft.CodeAnalysis.Semantics.ICoalesceExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectCreationExpression(Microsoft.CodeAnalysis.Semantics.IObjectCreationExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitObjectOrCollectionInitializerExpression(Microsoft.CodeAnalysis.Semantics.IObjectOrCollectionInitializerExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitOmittedArgumentExpression(Microsoft.CodeAnalysis.Semantics.IOmittedArgumentExpression operation, TArgument argument) -> TResult
@@ -940,7 +936,6 @@ virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.Vi
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitSwitchStatement(Microsoft.CodeAnalysis.Semantics.ISwitchStatement operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitSyntheticLocalReferenceExpression(Microsoft.CodeAnalysis.Semantics.ISyntheticLocalReferenceExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitThrowExpression(Microsoft.CodeAnalysis.Semantics.IThrowExpression operation, TArgument argument) -> TResult
-virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitThrowStatement(Microsoft.CodeAnalysis.Semantics.IThrowStatement operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitTryStatement(Microsoft.CodeAnalysis.Semantics.ITryStatement operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitTupleExpression(Microsoft.CodeAnalysis.Semantics.ITupleExpression operation, TArgument argument) -> TResult
virtual Microsoft.CodeAnalysis.Semantics.OperationVisitor.VisitTypeOfExpression(Microsoft.CodeAnalysis.Semantics.ITypeOfExpression operation, TArgument argument) -> TResult
diff --git a/src/Compilers/Extension/CompilerExtension.csproj b/src/Compilers/Extension/CompilerExtension.csproj
index 864ce605cc9a0..ab9465b39cab3 100644
--- a/src/Compilers/Extension/CompilerExtension.csproj
+++ b/src/Compilers/Extension/CompilerExtension.csproj
@@ -128,6 +128,7 @@
+
diff --git a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb
index 21988b54e960d..6bc718abb7245 100644
--- a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb
+++ b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb
@@ -338,14 +338,14 @@ Namespace Microsoft.CodeAnalysis.Semantics
Return New LazyNameOfExpression(argument, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
- Private Function CreateBoundLambdaOperation(boundLambda As BoundLambda) As ILambdaExpression
- Dim signature As IMethodSymbol = boundLambda.LambdaSymbol
+ Private Function CreateBoundLambdaOperation(boundLambda As BoundLambda) As IAnonymousFunctionExpression
+ Dim symbol As IMethodSymbol = boundLambda.LambdaSymbol
Dim body As Lazy(Of IBlockStatement) = New Lazy(Of IBlockStatement)(Function() DirectCast(Create(boundLambda.Body), IBlockStatement))
Dim syntax As SyntaxNode = boundLambda.Syntax
Dim type As ITypeSymbol = boundLambda.Type
Dim constantValue As [Optional](Of Object) = ConvertToOptional(boundLambda.ConstantValueOpt)
Dim isImplicit As Boolean = boundLambda.WasCompilerGenerated
- Return New LazyLambdaExpression(signature, body, _semanticModel, syntax, type, constantValue, isImplicit)
+ Return New LazyAnonymousFunctionExpression(symbol, body, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
Private Function CreateBoundCallOperation(boundCall As BoundCall) As IInvocationExpression
@@ -459,14 +459,14 @@ Namespace Microsoft.CodeAnalysis.Semantics
Return New LazyBinaryOperatorExpression(binaryOperationKind, leftOperand, rightOperand, isLifted, usesOperatorMethod, operatorMethod, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
- Private Function CreateBoundBinaryConditionalExpressionOperation(boundBinaryConditionalExpression As BoundBinaryConditionalExpression) As INullCoalescingExpression
- Dim primaryOperand As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundBinaryConditionalExpression.TestExpression))
- Dim secondaryOperand As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundBinaryConditionalExpression.ElseExpression))
+ Private Function CreateBoundBinaryConditionalExpressionOperation(boundBinaryConditionalExpression As BoundBinaryConditionalExpression) As ICoalesceExpression
+ Dim expression As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundBinaryConditionalExpression.TestExpression))
+ Dim whenNull As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundBinaryConditionalExpression.ElseExpression))
Dim syntax As SyntaxNode = boundBinaryConditionalExpression.Syntax
Dim type As ITypeSymbol = boundBinaryConditionalExpression.Type
Dim constantValue As [Optional](Of Object) = ConvertToOptional(boundBinaryConditionalExpression.ConstantValueOpt)
Dim isImplicit As Boolean = boundBinaryConditionalExpression.WasCompilerGenerated
- Return New LazyNullCoalescingExpression(primaryOperand, secondaryOperand, _semanticModel, syntax, type, constantValue, isImplicit)
+ Return New LazyCoalesceExpression(expression, whenNull, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
Private Function CreateBoundUserDefinedShortCircuitingOperatorOperation(boundUserDefinedShortCircuitingOperator As BoundUserDefinedShortCircuitingOperator) As IBinaryOperatorExpression
@@ -1020,13 +1020,15 @@ Namespace Microsoft.CodeAnalysis.Semantics
Return New LazyReturnStatement(OperationKind.ReturnStatement, returnedValue, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
- Private Function CreateBoundThrowStatementOperation(boundThrowStatement As BoundThrowStatement) As IThrowStatement
+ Private Function CreateBoundThrowStatementOperation(boundThrowStatement As BoundThrowStatement) As IExpressionStatement
Dim thrownObject As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundThrowStatement.ExpressionOpt))
Dim syntax As SyntaxNode = boundThrowStatement.Syntax
- Dim type As ITypeSymbol = Nothing
+ Dim expressionType As ITypeSymbol = boundThrowStatement.ExpressionOpt?.Type
+ Dim statementType As ITypeSymbol = Nothing
Dim constantValue As [Optional](Of Object) = New [Optional](Of Object)()
Dim isImplicit As Boolean = boundThrowStatement.WasCompilerGenerated
- Return New LazyThrowStatement(thrownObject, _semanticModel, syntax, type, constantValue, isImplicit)
+ Dim throwExpression As IOperation = New LazyThrowExpression(thrownObject, _semanticModel, syntax, expressionType, constantValue, isImplicit)
+ Return New ExpressionStatement(throwExpression, _semanticModel, syntax, statementType, constantValue, isImplicit)
End Function
Private Function CreateBoundWhileStatementOperation(boundWhileStatement As BoundWhileStatement) As IWhileUntilLoopStatement
@@ -1101,13 +1103,13 @@ Namespace Microsoft.CodeAnalysis.Semantics
End Function
Private Function CreateBoundSyncLockStatementOperation(boundSyncLockStatement As BoundSyncLockStatement) As ILockStatement
- Dim lockedObject As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundSyncLockStatement.LockExpression))
+ Dim expression As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundSyncLockStatement.LockExpression))
Dim body As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundSyncLockStatement.Body))
Dim syntax As SyntaxNode = boundSyncLockStatement.Syntax
Dim type As ITypeSymbol = Nothing
Dim constantValue As [Optional](Of Object) = New [Optional](Of Object)()
Dim isImplicit As Boolean = boundSyncLockStatement.WasCompilerGenerated
- Return New LazyLockStatement(lockedObject, body, _semanticModel, syntax, type, constantValue, isImplicit)
+ Return New LazyLockStatement(expression, body, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
Private Function CreateBoundNoOpStatementOperation(boundNoOpStatement As BoundNoOpStatement) As IEmptyStatement
diff --git a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb
index c31232399d2ff..361e61e4a8647 100644
--- a/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb
+++ b/src/Compilers/VisualBasic/Test/Emit/CodeGen/CodeGenTuples.vb
@@ -6277,6 +6277,28 @@ BC37289: Tuple element name 'M' is inferred. Please use language version 15.3 or
verifier15_3.VerifyDiagnostics()
End Sub
+
+ Public Sub InferredName_Conversion()
+ Dim source =
+
+Imports System.Collections.Generic
+Class C
+ Shared Sub F(items As (Integer, IList(Of Object)))
+ End Sub
+ Shared Sub Test()
+ Dim items = New List(Of Object)()
+ Dim group = (1, items)
+ F(group)
+ End Sub
+End Class
+
+
+ Dim comp = CreateCompilationWithMscorlibAndVBRuntime(source,
+ additionalRefs:={ValueTupleRef, SystemRuntimeFacadeRef, SystemCoreRef},
+ parseOptions:=TestOptions.Regular.WithLanguageVersion(LanguageVersion.VisualBasic15))
+ comp.AssertTheseEmitDiagnostics( )
+ End Sub
+
Public Sub LongTupleWithArgumentEvaluation()
@@ -7564,7 +7586,7 @@ BC36625: Lambda expression cannot be converted to 'Integer' because 'Integer' is
End Sub
- Public Sub TupleInferredLambdStrictOn()
+ Public Sub TupleInferredLambdaStrictOn()
Dim comp = CreateCompilationWithMscorlibAndVBRuntime(
@@ -7600,7 +7622,7 @@ BC36642: Option Strict On requires each lambda expression parameter to be declar
End Sub
- Public Sub TupleInferredLambdStrictOff()
+ Public Sub TupleInferredLambdaStrictOff()
Dim verifier = CompileAndVerify(
diff --git a/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb
index 9ff7fdc89d264..09930cbc34cb5 100644
--- a/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb
+++ b/src/Compilers/VisualBasic/Test/Semantic/Binding/BindingObjectInitializerTests.vb
@@ -1125,7 +1125,7 @@ IObjectCreationExpression (Constructor: Sub C1..ctor()) (OperationKind.ObjectCre
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New C1 With ... d Function}')
Right: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func(Of System.Int32)) (Syntax: 'Function() ... nd Function')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function () As System.Int32) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Function() ... nd Function')
+ Operand: IAnonymousFunctionExpression (Symbol: Function () As System.Int32) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Function() ... nd Function')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function() ... nd Function')
Locals: Local_1: As System.Int32
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'Return .Field')
@@ -1395,7 +1395,7 @@ IObjectCreationExpression (Constructor: Sub C2..ctor()) (OperationKind.ObjectCre
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'As New C2 W ... d Function}')
Right: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func(Of System.Object)) (Syntax: 'Function()' ... nd Function')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function () As System.Object) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Function()' ... nd Function')
+ Operand: IAnonymousFunctionExpression (Symbol: Function () As System.Object) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Function()' ... nd Function')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function()' ... nd Function')
Locals: Local_1: As System.Object
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'Return .Field')
@@ -1412,7 +1412,7 @@ IObjectCreationExpression (Constructor: Sub C2..ctor()) (OperationKind.ObjectCre
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'As New C2 W ... d Function}')
Right: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func(Of System.Object)) (Syntax: 'Function() ... nd Function')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function () As System.Object) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Function() ... nd Function')
+ Operand: IAnonymousFunctionExpression (Symbol: Function () As System.Object) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Function() ... nd Function')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function() ... nd Function')
Locals: Local_1: As System.Object
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'Return .Field')
diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb
index cddb496434752..586832777bf20 100644
--- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb
+++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IConversionExpression.vb
@@ -758,7 +758,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: a As System.Action(Of System.Int32)
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action(Of System.Int32)) (Syntax: 'Sub(i As In ... End Sub')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Sub (i As System.Int32)) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Sub(i As In ... End Sub')
+ Operand: IAnonymousFunctionExpression (Symbol: Sub (i As System.Int32)) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Sub(i As In ... End Sub')
IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'Sub(i As In ... End Sub')
ILabelStatement (Label: exit) (OperationKind.LabelStatement) (Syntax: 'End Sub')
LabeledStatement: null
@@ -791,7 +791,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: a As System.Action(Of System.Int32)
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action(Of System.Int32)) (Syntax: 'Sub()'BIND: ... End Sub')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Sub ()) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Sub()'BIND: ... End Sub')
+ Operand: IAnonymousFunctionExpression (Symbol: Sub ()) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Sub()'BIND: ... End Sub')
IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'Sub()'BIND: ... End Sub')
ILabelStatement (Label: exit) (OperationKind.LabelStatement) (Syntax: 'End Sub')
LabeledStatement: null
@@ -824,7 +824,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: a As System.Action
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action, IsInvalid) (Syntax: 'Sub(i As In ... End Sub')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Sub (i As System.Int32)) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'Sub(i As In ... End Sub')
+ Operand: IAnonymousFunctionExpression (Symbol: Sub (i As System.Int32)) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'Sub(i As In ... End Sub')
IBlockStatement (2 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Sub(i As In ... End Sub')
ILabelStatement (Label: exit) (OperationKind.LabelStatement, IsInvalid) (Syntax: 'End Sub')
LabeledStatement: null
@@ -862,7 +862,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: a As System.Func(Of System.Int64)
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func(Of System.Int64)) (Syntax: 'Function() ... nd Function')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function () As System.Int32) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Function() ... nd Function')
+ Operand: IAnonymousFunctionExpression (Symbol: Function () As System.Int32) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Function() ... nd Function')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function() ... nd Function')
Locals: Local_1: As System.Int32
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'Return 1')
@@ -898,7 +898,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: a As System.Action(Of System.Int32)
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Action(Of System.Int32)) (Syntax: 'Function() ... nd Function')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function () As System.Int32) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Function() ... nd Function')
+ Operand: IAnonymousFunctionExpression (Symbol: Function () As System.Int32) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Function() ... nd Function')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function() ... nd Function')
Locals: Local_1: As System.Int32
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'Return 1')
@@ -933,7 +933,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: a As System.Func(Of System.Int32)
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func(Of System.Int32), IsInvalid) (Syntax: 'Sub()'BIND: ... End Sub')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Sub ()) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'Sub()'BIND: ... End Sub')
+ Operand: IAnonymousFunctionExpression (Symbol: Sub ()) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'Sub()'BIND: ... End Sub')
IBlockStatement (2 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Sub()'BIND: ... End Sub')
ILabelStatement (Label: exit) (OperationKind.LabelStatement, IsInvalid) (Syntax: 'End Sub')
LabeledStatement: null
@@ -2086,7 +2086,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: expr As System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean))
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean))) (Syntax: 'Function(num) num < 5')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function (num As System.Int32) As System.Boolean) (OperationKind.LambdaExpression, Type: null) (Syntax: 'Function(num) num < 5')
+ Operand: IAnonymousFunctionExpression (Symbol: Function (num As System.Int32) As System.Boolean) (OperationKind.AnonymousFunctionExpression, Type: null) (Syntax: 'Function(num) num < 5')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement) (Syntax: 'Function(num) num < 5')
Locals: Local_1: As System.Boolean
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'num < 5')
@@ -2125,7 +2125,7 @@ IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclaratio
Variables: Local_1: expr As System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean))
Initializer: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Linq.Expressions.Expression(Of System.Func(Of System.Int32, System.Boolean)), IsInvalid) (Syntax: 'Function(num) num')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function (num As System.Int32) As System.Boolean) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'Function(num) num')
+ Operand: IAnonymousFunctionExpression (Symbol: Function (num As System.Int32) As System.Boolean) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'Function(num) num')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Function(num) num')
Locals: Local_1: As System.Boolean
IReturnStatement (OperationKind.ReturnStatement, IsInvalid) (Syntax: 'num')
diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.vb
index 53c7109a0e28a..0f3208919e570 100644
--- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.vb
+++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.vb
@@ -751,10 +751,11 @@ IForEachLoopStatement (Iteration variable: null) (LoopKind.ForEach) (OperationKi
Left: ILocalReferenceExpression: s (OperationKind.LocalReferenceExpression, Type: System.String) (Syntax: 's')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "one") (Syntax: '"one"')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If (s = "on ... End If')
- IThrowStatement (OperationKind.ThrowStatement) (Syntax: 'Throw New Exception')
- ThrownObject: IObjectCreationExpression (Constructor: Sub System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'New Exception')
- Arguments(0)
- Initializer: null
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Throw New Exception')
+ Expression: IThrowExpression (OperationKind.ThrowExpression, Type: System.Exception) (Syntax: 'Throw New Exception')
+ IObjectCreationExpression (Constructor: Sub System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'New Exception')
+ Arguments(0)
+ Initializer: null
IfFalse: null
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.WriteLine(s)')
Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.String)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'Console.WriteLine(s)')
@@ -763,8 +764,7 @@ IForEachLoopStatement (Iteration variable: null) (LoopKind.ForEach) (OperationKi
IArgument (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument) (Syntax: 's')
ILocalReferenceExpression: s (OperationKind.LocalReferenceExpression, Type: System.String) (Syntax: 's')
InConversion: null
- OutConversion: null
-]]>.Value
+ OutConversion: null]]>.Value
VerifyOperationTreeForTest(Of ForEachBlockSyntax)(source, expectedOperationTree)
End Sub
diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_ILockStatement.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_ILockStatement.vb
new file mode 100644
index 0000000000000..cede38039493e
--- /dev/null
+++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_ILockStatement.vb
@@ -0,0 +1,335 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports Microsoft.CodeAnalysis.Test.Utilities
+Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
+
+Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics
+ Partial Public Class IOperationTests
+ Inherits SemanticModelTestBase
+
+
+
+ Public Sub ILockStatement_ObjectLock_FieldReference()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = String.Empty
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_ObjectLock_LocalReference()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = String.Empty
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_ObjectLock_Nothing()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = String.Empty
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_ObjectLock_NonReferenceType()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = .Value
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_MissingLockExpression()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = .Value
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_InvalidLockExpression()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = .Value
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_MissingEndLock()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = .Value
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_ExpressionBody_ObjectCall()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = String.Empty
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_ExpressionLock_ClassMethodCall()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = String.Empty
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_ExpressionBody_SubMethod()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = .Value
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+
+
+
+ Public Sub ILockStatement_NonEmptyBody()
+ Dim source = .Value
+
+ Dim expectedOperationTree = .Value
+
+ Dim expectedDiagnostics = String.Empty
+
+ VerifyOperationTreeAndDiagnosticsForTest(Of SyncLockBlockSyntax)(source, expectedOperationTree, expectedDiagnostics)
+ End Sub
+ End Class
+End Namespace
diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.vb
index 1628dbcf77c73..92626a6254de9 100644
--- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.vb
+++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IParameterReferenceExpression.vb
@@ -379,7 +379,7 @@ End Class]]>.Value
Dim expectedOperationTree = As System.Object
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'x')
diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb
index 7fe9c3481bb8f..f8935ee52e10e 100644
--- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb
+++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb
@@ -234,14 +234,15 @@ IWhileUntilLoopStatement (IsTopTest: True, IsWhile: True) (LoopKind.WhileUntil)
Left: ILocalReferenceExpression: value (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'value')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 100) (Syntax: '100')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If value > ... End If')
- IThrowStatement (OperationKind.ThrowStatement) (Syntax: 'Throw New S ... occurred.")')
- ThrownObject: IObjectCreationExpression (Constructor: Sub System.Exception..ctor(message As System.String)) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'New System. ... occurred.")')
- Arguments(1):
- IArgument (ArgumentKind.Explicit, Matching Parameter: message) (OperationKind.Argument) (Syntax: '"An excepti ... occurred."')
- ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "An exception has occurred.") (Syntax: '"An excepti ... occurred."')
- InConversion: null
- OutConversion: null
- Initializer: null
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Throw New S ... occurred.")')
+ Expression: IThrowExpression (OperationKind.ThrowExpression, Type: System.Exception) (Syntax: 'Throw New S ... occurred.")')
+ IObjectCreationExpression (Constructor: Sub System.Exception..ctor(message As System.String)) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'New System. ... occurred.")')
+ Arguments(1):
+ IArgument (ArgumentKind.Explicit, Matching Parameter: message) (OperationKind.Argument) (Syntax: '"An excepti ... occurred."')
+ ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "An exception has occurred.") (Syntax: '"An excepti ... occurred."')
+ InConversion: null
+ OutConversion: null
+ Initializer: null
IfFalse: null
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'System.Cons ... statement")')
Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.String)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'System.Cons ... statement")')
@@ -888,10 +889,11 @@ IWhileUntilLoopStatement (IsTopTest: True, IsWhile: True) (LoopKind.WhileUntil)
Operand: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2) (Syntax: '2')
Catch clauses(0)
Finally: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Finally ... Exception()')
- IThrowStatement (OperationKind.ThrowStatement) (Syntax: 'Throw New S ... Exception()')
- ThrownObject: IObjectCreationExpression (Constructor: Sub System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'New System.Exception()')
- Arguments(0)
- Initializer: null]]>.Value
+ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Throw New S ... Exception()')
+ Expression: IThrowExpression (OperationKind.ThrowExpression, Type: System.Exception) (Syntax: 'Throw New S ... Exception()')
+ IObjectCreationExpression (Constructor: Sub System.Exception..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Exception) (Syntax: 'New System.Exception()')
+ Arguments(0)
+ Initializer: null]]>.Value
VerifyOperationTreeForTest(Of WhileBlockSyntax)(source, expectedOperationTree)
End Sub
diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb
index 14dd4141127e8..8b0d845b21d95 100644
--- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb
+++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_InvalidExpression.vb
@@ -278,7 +278,7 @@ End Class]]>.Value
Dim expectedOperationTree = () As ?, IsInvalid) (Syntax: 'Function() F()')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function () As ?) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'Function() F()')
+ Operand: IAnonymousFunctionExpression (Symbol: Function () As ?) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'Function() F()')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Function() F()')
Locals: Local_1: As ?
IReturnStatement (OperationKind.ReturnStatement, IsInvalid) (Syntax: 'F()')
diff --git a/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb b/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb
index edf6d9f77752b..5c3363c05ba0d 100644
--- a/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb
+++ b/src/Compilers/VisualBasic/Test/Semantic/Semantics/AnonymousTypesTests.vb
@@ -812,7 +812,7 @@ Module Program
End Sub
End Module]]>.Value
- ' The IOperation tree for this test seems to have an unexpected ILocalReferenceExpression within ILambdaExpression.
+ ' The IOperation tree for this test seems to have an unexpected ILocalReferenceExpression within IAnonymousFunctionExpression.
' See https://github.com/dotnet/roslyn/issues/20357.
Dim expectedOperationTree = , IsInvalid) (Syntax: 'New With {' ... ).Invoke()}')
@@ -827,7 +827,7 @@ IAnonymousObjectCreationExpression (OperationKind.AnonymousObjectCreationExpress
Right: IInvocationExpression (virtual Function System.Func(Of System.String).Invoke() As System.String) (OperationKind.InvocationExpression, Type: System.String, IsInvalid) (Syntax: 'DirectCast( ... )).Invoke()')
Instance Receiver: IConversionExpression (Explicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Func(Of System.String), IsInvalid) (Syntax: 'DirectCast( ... Of String))')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
- Operand: ILambdaExpression (Signature: Function () As System.String) (OperationKind.LambdaExpression, Type: null, IsInvalid) (Syntax: 'Function() ... nd Function')
+ Operand: IAnonymousFunctionExpression (Symbol: Function () As System.String) (OperationKind.AnonymousFunctionExpression, Type: null, IsInvalid) (Syntax: 'Function() ... nd Function')
IBlockStatement (3 statements, 1 locals) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Function() ... nd Function')
Locals: Local_1: