提交 53070c76 编写于 作者: H Heejae Chang

resolved merge conflict

......@@ -119,6 +119,16 @@
<VsixExpInstallerArgs>-rootSuffix:RoslynDev -vsInstallDir:"$([System.IO.Path]::GetFullPath('$(MSBuildBinPath)\..\..\..'))"</VsixExpInstallerArgs>
</PropertyGroup>
<!-- Explicitly uninstall extensions in reverse dependency order to ensure that uninstall succeeds -->
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; -u $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\VisualStudioIntegrationTestSetup\Microsoft.VisualStudio.IntegrationTest.Setup.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; -u $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\VisualStudioDiagnosticsWindow\Roslyn.VisualStudio.DiagnosticsWindow.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; -u $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\ExpressionEvaluatorPackage\ExpressionEvaluatorPackage.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; -u $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\VisualStudioInteractiveComponents\Roslyn.VisualStudio.InteractiveComponents.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; -u $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\VisualStudioSetup.Next\Roslyn.VisualStudio.Setup.Next.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; -u $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\VisualStudioSetup\Roslyn.VisualStudio.Setup.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; -u $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\CompilerExtension\Roslyn.Compilers.Extension.vsix" />
<!-- Install the extensions produced by the current build in the proper order so that dependencies resolve correctly -->
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\CompilerExtension\Roslyn.Compilers.Extension.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\VisualStudioSetup\Roslyn.VisualStudio.Setup.vsix" />
<Exec Command="&quot;$(VsixExpInstallerExe)&quot; $(VsixExpInstallerArgs) $(OutputDirectory)\Vsix\VisualStudioSetup.Next\Roslyn.VisualStudio.Setup.Next.vsix" />
......
......@@ -9,7 +9,8 @@
|**dev15.0.x**|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_debug_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_debug_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_debug_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_debug_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_release_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_release_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_release_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_release_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_determinism/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_determinism/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.0.x/windows_debug_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_debug_vs-integration/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.0.x/windows_release_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/windows_release_vs-integration/)|
|**dev15.1.x**|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_debug_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_debug_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_debug_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_debug_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_release_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_release_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_release_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_release_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_determinism/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_determinism/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.1.x/windows_debug_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_debug_vs-integration/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.1.x/windows_release_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/windows_release_vs-integration/)|
|**dev15.2.x**|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_debug_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_debug_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_debug_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_debug_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_release_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_release_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_release_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_release_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_determinism/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_determinism/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.2.x/windows_debug_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_debug_vs-integration/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.2.x/windows_release_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/windows_release_vs-integration/)|
|**dev15.3-preview1**|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_debug_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_debug_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_debug_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_debug_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_release_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_release_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_release_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_release_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_determinism/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_determinism/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.3-preview1/windows_debug_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_debug_vs-integration/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.3-preview1/windows_release_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/windows_release_vs-integration/)|
|**dev15.3.x**|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_debug_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_debug_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_debug_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_debug_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_release_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_release_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_release_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_release_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_determinism/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_determinism/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.3.x/windows_debug_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_debug_vs-integration/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.3.x/windows_release_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/windows_release_vs-integration/)|
|**dev15.6**|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_debug_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_debug_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_debug_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_debug_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_release_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_release_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_release_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_release_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_determinism/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_determinism/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.6/windows_debug_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_debug_vs-integration/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev15.6/windows_release_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/windows_release_vs-integration/)|
|**dev16**|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_debug_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_debug_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_debug_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_debug_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_release_unit32/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_release_unit32/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_release_unit64/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_release_unit64/)|[![Build Status](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_determinism/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_determinism/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev16/windows_debug_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_debug_vs-integration/)|[![Build Status](https://ci.dot.net/buildStatus/icon?job=dotnet_roslyn/dev16/windows_release_vs-integration)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/windows_release_vs-integration/)|
### Linux/Mac - Unit Tests
......@@ -19,7 +20,8 @@
|**dev15.0.x**|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/linux_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/linux_debug/)||[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/mac_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.0.x/job/mac_debug/)|
|**dev15.1.x**|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/linux_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/linux_debug/)||[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/mac_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.1.x/job/mac_debug/)|
|**dev15.2.x**|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/linux_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/linux_debug/)||[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/mac_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.2.x/job/mac_debug/)|
|**dev15.3-preview1**|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/linux_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/linux_debug/)||[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/mac_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3-preview1/job/mac_debug/)|
|**dev15.3.x**|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/linux_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/linux_debug/)||[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/mac_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.3.x/job/mac_debug/)|
|**dev15.6**|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/linux_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/linux_debug/)||[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/mac_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev15.6/job/mac_debug/)|
|**dev16**|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/ubuntu_14_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/ubuntu_14_debug/)|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/ubuntu_16_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/ubuntu_16_debug/)|[![BuildStatus](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/mac_debug/badge/icon)](https://ci.dot.net/job/dotnet_roslyn/job/dev16/job/mac_debug/)|
[//]: # (End current test results)
......
......@@ -89,6 +89,7 @@
<MicrosoftVisualStudioProgressionCodeSchemaVersion>15.0.26507-alpha</MicrosoftVisualStudioProgressionCodeSchemaVersion>
<MicrosoftVisualStudioProgressionCommonVersion>15.0.26507-alpha</MicrosoftVisualStudioProgressionCommonVersion>
<MicrosoftVisualStudioProgressionInterfacesVersion>15.0.26507-alpha</MicrosoftVisualStudioProgressionInterfacesVersion>
<MicrosoftVisualStudioProjectSystemVersion>15.3.178-pre-g209fb07c2e</MicrosoftVisualStudioProjectSystemVersion>
<MicrosoftVisualStudioQualityToolsUnitTestFrameworkVersion>10.0.0.0-alpha</MicrosoftVisualStudioQualityToolsUnitTestFrameworkVersion>
<MicrosoftVisualStudioRemoteControlVersion>14.0.249-master2E2DC10C</MicrosoftVisualStudioRemoteControlVersion>
<MicrosoftVisualStudioSetupConfigurationInteropVersion>1.3.269-rc</MicrosoftVisualStudioSetupConfigurationInteropVersion>
......@@ -141,7 +142,7 @@
<RoslynDependenciesOptimizationDataVersion>2.3.0-beta3-61801-06</RoslynDependenciesOptimizationDataVersion>
<RoslynToolsMicrosoftLocateVSVersion>0.2.4-beta</RoslynToolsMicrosoftLocateVSVersion>
<RoslynToolsMicrosoftSignToolVersion>0.3.0-beta</RoslynToolsMicrosoftSignToolVersion>
<RoslynToolsMicrosoftVSIXExpInstallerVersion>0.2.4-beta</RoslynToolsMicrosoftVSIXExpInstallerVersion>
<RoslynToolsMicrosoftVSIXExpInstallerVersion>0.4.0-beta</RoslynToolsMicrosoftVSIXExpInstallerVersion>
<RoslynToolsReferenceAssembliesVersion>0.1.1</RoslynToolsReferenceAssembliesVersion>
<RoslynMicrosoftVisualStudioExtensionManagerVersion>0.0.4</RoslynMicrosoftVisualStudioExtensionManagerVersion>
<StreamJsonRpcVersion>1.0.2-rc</StreamJsonRpcVersion>
......
......@@ -12,28 +12,29 @@ Syntax Grammar
This grammar is represented as a diff from the current spec grammar.
```diff
declaration-statement
: local-variable-declaration ';'
| local-constant-declaration ';'
+ | local-function-declaration
declaration_statement
: local_variable_declaration ';'
| local_constant_declaration ';'
+ | local_function_declaration
;
+local-function-declaration
+ : local-function-header local-function-body
+local_function_declaration
+ : local_function_header local_function_body
+ ;
+local-function-header
+ : local-function-modifiers? return-type identifier type-parameter-list?
+ ( formal-parameter-list? ) type-parameter-constraints-clauses
+local_function_header
+ : local_function_modifier* return_type identifier type_parameter_list?
+ '(' formal_parameter_list? ')' type_parameter_constraints_clauses
+ ;
+local-function-modifiers
+ : (async | unsafe)
+local_function_modifier
+ : 'async'
+ | 'unsafe'
+ ;
+local-function-body
+local_function_body
+ : block
+ | arrow-expression-body
+ | arrow_expression_body
+ ;
```
......
......@@ -29,11 +29,12 @@ static void addRoslynJob(def myJob, String jobName, String branchName, Boolean i
// Create the standard job. This will setup parameter, SCM, timeout, etc ...
def projectName = 'dotnet/roslyn'
def defaultBranch = "*/${branchName}"
Utilities.standardJobSetup(myJob, projectName, isPr, defaultBranch)
// Need to setup the triggers for the job
if (isPr) {
// Note the use of ' vs " for the 4th argument. We don't want groovy to interpolate this string (the ${ghprbPullId}
// is resolved when the job is run based on an environment variable set by the Jenkins Pull Request Builder plugin.
Utilities.standardJobSetupPR(myJob, projectName, null, '+refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/*');
def triggerCore = "open|all|${jobName}"
if (triggerPhraseExtra) {
triggerCore = "${triggerCore}|${triggerPhraseExtra}"
......@@ -42,6 +43,7 @@ static void addRoslynJob(def myJob, String jobName, String branchName, Boolean i
def contextName = jobName
Utilities.addGithubPRTriggerForBranch(myJob, branchName, contextName, triggerPhrase, triggerPhraseOnly)
} else {
Utilities.standardJobSetupPush(myJob, projectName, "*/${branchName}");
Utilities.addGithubPushTrigger(myJob)
// TODO: Add once external email sending is available again
// addEmailPublisher(myJob)
......
......@@ -262,14 +262,15 @@ private IPropertyReferenceExpression CreateBoundPropertyAccessOperation(BoundPro
{
IPropertySymbol property = boundPropertyAccess.PropertySymbol;
Lazy<IOperation> instance = new Lazy<IOperation>(() => Create(boundPropertyAccess.PropertySymbol.IsStatic ? null : boundPropertyAccess.ReceiverOpt));
Lazy<ImmutableArray<IArgument>> argumentsInEvaluationOrder = new Lazy<ImmutableArray<IArgument>>(() => ImmutableArray<IArgument>.Empty);
ISymbol member = boundPropertyAccess.PropertySymbol;
SyntaxNode syntax = boundPropertyAccess.Syntax;
ITypeSymbol type = boundPropertyAccess.Type;
Optional<object> constantValue = ConvertToOptional(boundPropertyAccess.ConstantValue);
return new LazyPropertyReferenceExpression(property, instance, member, syntax, type, constantValue);
return new LazyPropertyReferenceExpression(property, instance, member, argumentsInEvaluationOrder, syntax, type, constantValue);
}
private IIndexedPropertyReferenceExpression CreateBoundIndexerAccessOperation(BoundIndexerAccess boundIndexerAccess)
private IPropertyReferenceExpression CreateBoundIndexerAccessOperation(BoundIndexerAccess boundIndexerAccess)
{
IPropertySymbol property = boundIndexerAccess.Indexer;
Lazy<IOperation> instance = new Lazy<IOperation>(() => Create(boundIndexerAccess.Indexer.IsStatic ? null : boundIndexerAccess.ReceiverOpt));
......@@ -295,7 +296,7 @@ private IIndexedPropertyReferenceExpression CreateBoundIndexerAccessOperation(Bo
SyntaxNode syntax = boundIndexerAccess.Syntax;
ITypeSymbol type = boundIndexerAccess.Type;
Optional<object> constantValue = ConvertToOptional(boundIndexerAccess.ConstantValue);
return new LazyIndexedPropertyReferenceExpression(property, instance, member, argumentsInEvaluationOrder, syntax, type, constantValue);
return new LazyPropertyReferenceExpression(property, instance, member, argumentsInEvaluationOrder, syntax, type, constantValue);
}
private IEventReferenceExpression CreateBoundEventAccessOperation(BoundEventAccess boundEventAccess)
......@@ -510,14 +511,14 @@ private IInstanceReferenceExpression CreateBoundThisReferenceOperation(BoundThis
return new InstanceReferenceExpression(instanceReferenceKind, syntax, type, constantValue);
}
private IAssignmentExpression CreateBoundAssignmentOperatorOperation(BoundAssignmentOperator boundAssignmentOperator)
private ISimpleAssignmentExpression CreateBoundAssignmentOperatorOperation(BoundAssignmentOperator boundAssignmentOperator)
{
Lazy<IOperation> target = new Lazy<IOperation>(() => Create(boundAssignmentOperator.Left));
Lazy<IOperation> value = new Lazy<IOperation>(() => Create(boundAssignmentOperator.Right));
SyntaxNode syntax = boundAssignmentOperator.Syntax;
ITypeSymbol type = boundAssignmentOperator.Type;
Optional<object> constantValue = ConvertToOptional(boundAssignmentOperator.ConstantValue);
return new LazyAssignmentExpression(target, value, syntax, type, constantValue);
return new LazySimpleAssignmentExpression(target, value, syntax, type, constantValue);
}
private ICompoundAssignmentExpression CreateBoundCompoundAssignmentOperatorOperation(BoundCompoundAssignmentOperator boundCompoundAssignmentOperator)
......@@ -536,15 +537,13 @@ private ICompoundAssignmentExpression CreateBoundCompoundAssignmentOperatorOpera
private IIncrementExpression CreateBoundIncrementOperatorOperation(BoundIncrementOperator boundIncrementOperator)
{
UnaryOperationKind incrementOperationKind = Helper.DeriveUnaryOperationKind(boundIncrementOperator.OperatorKind);
BinaryOperationKind binaryOperationKind = Helper.DeriveBinaryOperationKind(incrementOperationKind);
Lazy<IOperation> target = new Lazy<IOperation>(() => Create(boundIncrementOperator.Operand));
Lazy<IOperation> value = new Lazy<IOperation>(() => CreateIncrementOneLiteralExpression(boundIncrementOperator));
bool usesOperatorMethod = (boundIncrementOperator.OperatorKind & UnaryOperatorKind.TypeMask) == UnaryOperatorKind.UserDefined;
IMethodSymbol operatorMethod = boundIncrementOperator.MethodOpt;
SyntaxNode syntax = boundIncrementOperator.Syntax;
ITypeSymbol type = boundIncrementOperator.Type;
Optional<object> constantValue = ConvertToOptional(boundIncrementOperator.ConstantValue);
return new LazyIncrementExpression(incrementOperationKind, binaryOperationKind, target, value, usesOperatorMethod, operatorMethod, syntax, type, constantValue);
return new LazyIncrementExpression(incrementOperationKind, target, usesOperatorMethod, operatorMethod, syntax, type, constantValue);
}
private IInvalidExpression CreateBoundBadExpressionOperation(BoundBadExpression boundBadExpression)
......
// 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;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Symbols;
......@@ -28,15 +29,6 @@ private ImmutableArray<IOperation> ToStatements(BoundStatement statement)
return ImmutableArray.Create(Create(statement));
}
private ILiteralExpression CreateIncrementOneLiteralExpression(BoundIncrementOperator increment)
{
string text = increment.Syntax.ToString();
SyntaxNode syntax = increment.Syntax;
ITypeSymbol type = increment.Type;
Optional<object> constantValue = ConvertToOptional(Semantics.Expression.SynthesizeNumeric(increment.Type, 1));
return new LiteralExpression(text, syntax, type, constantValue);
}
internal static IArgument CreateArgumentOperation(ArgumentKind kind, IParameterSymbol parameter, IOperation value)
{
return new Argument(kind,
......@@ -73,8 +65,14 @@ internal static IArgument CreateArgumentOperation(ArgumentKind kind, IParameterS
//TODO: https://github.com/dotnet/roslyn/issues/18722
// Right now, for erroneous code, we exposes all expression in place of arguments as IArgument with Parameter set to null,
// so user needs to check IsInvalid first before using anything we returned. Need to implement a new interface for invalid invocation instead.
if (boundNode.HasErrors || (object)optionalParametersMethod == null)
// so user needs to check IsInvalid first before using anything we returned. Need to implement a new interface for invalid
// invocation instead.
// Note this check doesn't cover all scenarios. For example, when a parameter is a generic type but the type of the type argument
// is undefined.
if ((object)optionalParametersMethod == null
|| boundNode.HasAnyErrors
|| parameters.Any(p => p.Type.IsErrorType())
|| optionalParametersMethod.GetUseSiteDiagnostic()?.DefaultSeverity == DiagnosticSeverity.Error)
{
// optionalParametersMethod can be null if we are writing to a readonly indexer or reading from an writeonly indexer,
// in which case HasErrors property would be true, but we still want to treat this as invalid invocation.
......@@ -137,6 +135,9 @@ private static ConversionKind GetConversionKind(CSharp.ConversionKind kind)
case CSharp.ConversionKind.PointerToVoid:
return Semantics.ConversionKind.CSharp;
case CSharp.ConversionKind.InterpolatedString:
return Semantics.ConversionKind.InterpolatedString;
default:
return Semantics.ConversionKind.Invalid;
}
......
......@@ -87,6 +87,7 @@
<Compile Include="FlowAnalysis\RegionAnalysisTests.cs" />
<Compile Include="FlowAnalysis\StructTests.cs" />
<Compile Include="FlowAnalysis\TryLockUsingStatementTests.cs" />
<Compile Include="IOperation\IOperationTests_IUnaryOperatorExpression.cs" />
<Compile Include="IOperation\IOperationTests_IVariableDeclaration.cs" />
<Compile Include="Semantics\FuzzTests.cs" />
<Compile Include="Semantics\OverloadResolutionPerfTests.cs" />
......
......@@ -85,19 +85,19 @@ public void Deconstruct(out int a, out int b, out int c)
IOperation operation1 = model.GetOperation(assignments[0]);
Assert.NotNull(operation1);
Assert.Equal(OperationKind.None, operation1.Kind);
Assert.False(operation1 is IAssignmentExpression);
Assert.False(operation1 is ISimpleAssignmentExpression);
Assert.Equal("(x, y, z) = new C()", assignments[1].ToString());
IOperation operation2 = model.GetOperation(assignments[1]);
Assert.NotNull(operation2);
Assert.Equal(OperationKind.None, operation2.Kind);
Assert.False(operation2 is IAssignmentExpression);
Assert.False(operation2 is ISimpleAssignmentExpression);
Assert.Equal("var (a, b) = (1, 2)", assignments[2].ToString());
IOperation operation3 = model.GetOperation(assignments[2]);
Assert.NotNull(operation3);
Assert.Equal(OperationKind.None, operation3.Kind);
Assert.False(operation3 is IAssignmentExpression);
Assert.False(operation3 is ISimpleAssignmentExpression);
}
}
}
\ No newline at end of file
......@@ -1079,7 +1079,7 @@ void M1()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { get; set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[10]')
IPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[10]')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Explicit) (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'this')
Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: index) (OperationKind.Argument) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -1109,7 +1109,7 @@ void M1()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { get; set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[10]')
IPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[10]')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Explicit) (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'this')
Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: index) (OperationKind.Argument) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -1139,7 +1139,7 @@ void M1()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 1], [System.Int32 j = 2]] { get; set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[j:10]')
IPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 1], [System.Int32 j = 2]] { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[j:10]')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Explicit) (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'this')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: j) (OperationKind.Argument) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -1171,7 +1171,7 @@ void M1()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32, IsInvalid) (Syntax: 'this[10]')
IPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32, IsInvalid) (Syntax: 'this[10]')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Explicit) (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'this')
Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: null) (OperationKind.Argument, IsInvalid) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')";
......@@ -1203,7 +1203,7 @@ void M1()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { get; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32, IsInvalid) (Syntax: 'this[10]')
IPropertyReferenceExpression: System.Int32 P.this[System.Int32 index] { get; } (OperationKind.PropertyReferenceExpression, Type: System.Int32, IsInvalid) (Syntax: 'this[10]')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Explicit) (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'this')
Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: null) (OperationKind.Argument, IsInvalid) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -1249,7 +1249,7 @@ static void Main()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 Derived.this[[System.Int32 x = 8], [System.Int32 y = 9]] { set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'd[0]')
IPropertyReferenceExpression: System.Int32 Derived.this[[System.Int32 x = 8], [System.Int32 y = 9]] { set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'd[0]')
Instance Receiver: ILocalReferenceExpression: d (OperationKind.LocalReferenceExpression, Type: Derived) (Syntax: 'd')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: x) (OperationKind.Argument) (Syntax: '0')
ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
......@@ -1284,7 +1284,7 @@ public void M()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[System.Int32 x, params System.Int32[] y] { get; set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[0]')
IPropertyReferenceExpression: System.Int32 P.this[System.Int32 x, params System.Int32[] y] { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[0]')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Explicit) (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'this')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: x) (OperationKind.Argument) (Syntax: '0')
ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
......@@ -1316,7 +1316,7 @@ public void M()
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: ref System.Int32 P.this[System.Int32 x] { get; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[0]')
IPropertyReferenceExpression: ref System.Int32 P.this[System.Int32 x] { get; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'this[0]')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Explicit) (OperationKind.InstanceReferenceExpression, Type: P) (Syntax: 'this')
Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: x) (OperationKind.Argument) (Syntax: '0')
ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
......@@ -1421,7 +1421,7 @@ public static void Main(string[] args)
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 3], [System.Int32 j = 4]] { get; set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'p[10]')
IPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 3], [System.Int32 j = 4]] { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'p[10]')
Instance Receiver: ILocalReferenceExpression: p (OperationKind.LocalReferenceExpression, Type: P) (Syntax: 'p')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: i) (OperationKind.Argument) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -1531,7 +1531,7 @@ public static void Main(string[] args)
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 3], [System.Int32 j = 4]] { get; set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'p[10]')
IPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 3], [System.Int32 j = 4]] { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'p[10]')
Instance Receiver: ILocalReferenceExpression: p (OperationKind.LocalReferenceExpression, Type: P) (Syntax: 'p')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: i) (OperationKind.Argument) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -1643,7 +1643,7 @@ public static void Main(string[] args)
}
";
string expectedOperationTree = @"
IIndexedPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 3], [System.Int32 j = 4]] { get; set; } (OperationKind.IndexedPropertyReferenceExpression, Type: System.Int32) (Syntax: 'p[10]')
IPropertyReferenceExpression: System.Int32 P.this[[System.Int32 i = 3], [System.Int32 j = 4]] { get; set; } (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'p[10]')
Instance Receiver: ILocalReferenceExpression: p (OperationKind.LocalReferenceExpression, Type: P) (Syntax: 'p')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: i) (OperationKind.Argument) (Syntax: '10')
ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
......@@ -1711,6 +1711,164 @@ public void M2()
VerifyOperationTreeAndDiagnosticsForTestWithIL<InvocationExpressionSyntax>(csharp, il, expectedOperationTree, expectedDiagnostics);
}
[Fact, WorkItem(20330, "https://github.com/dotnet/roslyn/issues/20330")]
public void DefaultValueNullForNullableTypeParameterWithMissingNullableReference()
{
string source = @"
class P
{
static void M1()
{
/*<bind>*/M2()/*</bind>*/;
}
static void M2(bool? x = null)
{
}
}
";
string expectedOperationTree = @"IInvocationExpression (static void P.M2([System.Boolean[missing]? x = null])) (OperationKind.InvocationExpression, Type: System.Void[missing]) (Syntax: 'M2()')";
var expectedDiagnostics = new DiagnosticDescription[] {
// (3,7): error CS0518: Predefined type 'System.Object' is not defined or imported
// class P
Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "P").WithArguments("System.Object").WithLocation(2, 7),
// (10,20): error CS0518: Predefined type 'System.Nullable`1' is not defined or imported
// static void M2(bool? x = null)
Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "bool?").WithArguments("System.Nullable`1").WithLocation(9, 20),
// (10,20): error CS0518: Predefined type 'System.Boolean' is not defined or imported
// static void M2(bool? x = null)
Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "bool").WithArguments("System.Boolean").WithLocation(9, 20),
// (10,12): error CS0518: Predefined type 'System.Void' is not defined or imported
// static void M2(bool? x = null)
Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "void").WithArguments("System.Void").WithLocation(9, 12),
// (5,12): error CS0518: Predefined type 'System.Void' is not defined or imported
// static void M1()
Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "void").WithArguments("System.Void").WithLocation(4, 12),
// (7,19): error CS0518: Predefined type 'System.Object' is not defined or imported
// /*<bind>*/M2()/*</bind>*/;
Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "M2").WithArguments("System.Object").WithLocation(6, 19),
// (3,7): error CS1729: 'object' does not contain a constructor that takes 0 arguments
// class P
Diagnostic(ErrorCode.ERR_BadCtorArgCount, "P").WithArguments("object", "0").WithLocation(2, 7)
};
var compilation = CreateCompilation(source, options: Test.Utilities.TestOptions.ReleaseDll);
VerifyOperationTreeAndDiagnosticsForTest<InvocationExpressionSyntax>(compilation, expectedOperationTree, expectedDiagnostics);
}
[Fact, WorkItem(20330, "https://github.com/dotnet/roslyn/issues/20330")]
public void DefaultValueWithParameterErrorType()
{
string source = @"
class P
{
static void M1()
{
/*<bind>*/M2(1)/*</bind>*/;
}
static void M2(int x, S s = 0)
{
}
}
";
string expectedOperationTree = @"
IInvocationExpression (static void P.M2(System.Int32 x, [S s = null])) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'M2(1)')
Arguments(1): IArgument (ArgumentKind.Explicit, Matching Parameter: null) (OperationKind.Argument, IsInvalid) (Syntax: '1')
ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
";
var expectedDiagnostics = new DiagnosticDescription[] {
// file.cs(9,27): error CS0246: The type or namespace name 'S' could not be found (are you missing a using directive or an assembly reference?)
// static void M2(int x, S s = 0)
Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "S").WithArguments("S").WithLocation(9, 27),
// file.cs(9,29): error CS1750: A value of type 'int' cannot be used as a default parameter because there are no standard conversions to type 'S'
// static void M2(int x, S s = 0)
Diagnostic(ErrorCode.ERR_NoConversionForDefaultParam, "s").WithArguments("int", "S").WithLocation(9, 29)
};
VerifyOperationTreeAndDiagnosticsForTest<InvocationExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[Fact]
[WorkItem(18722, "https://github.com/dotnet/roslyn/issues/18722")]
public void DefaultValueForGenericWithUndefinedTypeArgument()
{
// TODO: https://github.com/dotnet/roslyn/issues/18722
// This should be treated as invalid invocation.
string source = @"
class P
{
static void M1()
{
/*<bind>*/M2(1)/*</bind>*/;
}
static void M2(int x, G<S> s = null)
{
}
}
class G<T>
{
}
";
string expectedOperationTree = @"
IInvocationExpression (static void P.M2(System.Int32 x, [G<S> s = null])) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'M2(1)')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: x) (OperationKind.Argument) (Syntax: '1')
ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
IArgument (ArgumentKind.DefaultValue, Matching Parameter: s) (OperationKind.Argument) (Syntax: 'M2(1)')
ILiteralExpression (OperationKind.LiteralExpression, Type: G<S>, Constant: null) (Syntax: 'M2(1)')";
var expectedDiagnostics = new DiagnosticDescription[] {
// file.cs(9,29): error CS0246: The type or namespace name 'S' could not be found (are you missing a using directive or an assembly reference?)
// static void M2(int x, G<S> s = null)
Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "S").WithArguments("S").WithLocation(9, 29)
};
VerifyOperationTreeAndDiagnosticsForTest<InvocationExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[Fact]
[WorkItem(18722, "https://github.com/dotnet/roslyn/issues/18722")]
public void DefaultValueForNullableGenericWithUndefinedTypeArgument()
{
// TODO: https://github.com/dotnet/roslyn/issues/18722
// This should be treated as invalid invocation.
string source = @"
class P
{
static void M1()
{
/*<bind>*/M2(1)/*</bind>*/;
}
static void M2(int x, G<S>? s = null)
{
}
}
struct G<T>
{
}
";
string expectedOperationTree = @"
IInvocationExpression (static void P.M2(System.Int32 x, [G<S>? s = null])) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'M2(1)')
Arguments(2): IArgument (ArgumentKind.Explicit, Matching Parameter: x) (OperationKind.Argument) (Syntax: '1')
ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
IArgument (ArgumentKind.DefaultValue, Matching Parameter: s) (OperationKind.Argument) (Syntax: 'M2(1)')
IDefaultValueExpression (OperationKind.DefaultValueExpression, Type: G<S>?) (Syntax: 'M2(1)')";
var expectedDiagnostics = new DiagnosticDescription[] {
// file.cs(9,29): error CS0246: The type or namespace name 'S' could not be found (are you missing a using directive or an assembly reference?)
// static void M2(int x, G<S> s = null)
Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "S").WithArguments("S").WithLocation(9, 29)
};
VerifyOperationTreeAndDiagnosticsForTest<InvocationExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
private class IndexerAccessArgumentVerifier : OperationWalker
{
private readonly Compilation _compilation;
......@@ -1725,9 +1883,9 @@ public static void Verify(IOperation operation, Compilation compilation, SyntaxN
new IndexerAccessArgumentVerifier(compilation).Visit(operation);
}
public override void VisitIndexedPropertyReferenceExpression(IIndexedPropertyReferenceExpression operation)
public override void VisitPropertyReferenceExpression(IPropertyReferenceExpression operation)
{
if (operation.IsInvalid(_compilation))
if (operation.IsInvalid(_compilation) || operation.ArgumentsInEvaluationOrder.Length == 0)
{
return;
}
......
......@@ -675,7 +675,7 @@ static void Main(string[] args)
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'IFormattabl ... *</bind>*/;')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'IFormattabl ... *</bind>*/;')
Variables: Local_1: System.IFormattable f1
Initializer: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.IFormattable) (Syntax: '$""{1}""')
Initializer: IConversionExpression (ConversionKind.InterpolatedString, Implicit) (OperationKind.ConversionExpression, Type: System.IFormattable) (Syntax: '$""{1}""')
IInterpolatedStringExpression (OperationKind.InterpolatedStringExpression, Type: System.String) (Syntax: '$""{1}""')
Parts(1): IInterpolation (OperationKind.Interpolation) (Syntax: '{1}')
Expression: ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
......
......@@ -31,7 +31,7 @@ private void M()
Condition: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'true')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'condition = true;')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: 'condition = true')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'condition = true')
Left: ILocalReferenceExpression: condition (OperationKind.LocalReferenceExpression, Type: System.Boolean) (Syntax: 'condition')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'true')
";
......@@ -69,12 +69,12 @@ private void M()
Condition: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'true')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'condition = true;')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: 'condition = true')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'condition = true')
Left: ILocalReferenceExpression: condition (OperationKind.LocalReferenceExpression, Type: System.Boolean) (Syntax: 'condition')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'true')
IfFalse: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'condition = false;')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: 'condition = false')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'condition = false')
Left: ILocalReferenceExpression: condition (OperationKind.LocalReferenceExpression, Type: System.Boolean) (Syntax: 'condition')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: False) (Syntax: 'false')
";
......@@ -114,7 +114,7 @@ private void M()
Right: ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'condition = true;')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: 'condition = true')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'condition = true')
Left: ILocalReferenceExpression: condition (OperationKind.LocalReferenceExpression, Type: System.Boolean) (Syntax: 'condition')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'true')
";
......@@ -683,12 +683,12 @@ private void M()
IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'a = 2;')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'a = 2')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'a = 2')
Left: ILocalReferenceExpression: a (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'a')
Right: ILiteralExpression (Text: 2) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2) (Syntax: '2')
IfFalse: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'a = 3;')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'a = 3')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'a = 3')
Left: ILocalReferenceExpression: a (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'a')
Right: ILiteralExpression (Text: 3) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 3) (Syntax: '3')
";
......
......@@ -29,9 +29,8 @@ public void M(int x)
ILocalFunctionStatement (Local Function: System.Int32 Local(System.Int32 p1)) (OperationKind.LocalFunctionStatement) (Syntax: 'int Local(i ... }')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'return x++;')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (BinaryOperationKind.IntegerAdd) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
Left: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: 'x++')
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -55,9 +54,8 @@ public void M(int x)
ILocalFunctionStatement (Local Function: System.Int32 Local(System.Int32 p1)) (OperationKind.LocalFunctionStatement) (Syntax: 'int Local(i ... p1) => x++;')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '=> x++')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'x++')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (BinaryOperationKind.IntegerAdd) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
Left: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: 'x++')
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -81,9 +79,8 @@ public void M()
ILocalFunctionStatement (Local Function: System.Int32 Local(System.Int32 x)) (OperationKind.LocalFunctionStatement) (Syntax: 'int Local(int x) => x++;')
IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '=> x++')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: 'x++')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (BinaryOperationKind.IntegerAdd) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
Left: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: 'x++')
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -263,9 +260,8 @@ void M()
ILocalFunctionStatement (Local Function: void Foo()) (OperationKind.LocalFunctionStatement) (Syntax: 'void Foo() => x++;')
IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: '=> x++')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'x++')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (BinaryOperationKind.IntegerAdd) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
IIncrementExpression (UnaryOperandKind.IntegerPostfixIncrement) (OperationKind.IncrementExpression, Type: System.Int32) (Syntax: 'x++')
Left: ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'x')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: 'x++')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '=> x++')
";
var expectedDiagnostics = new DiagnosticDescription[] {
......@@ -295,7 +291,7 @@ void M(int p)
ILocalFunctionStatement (Local Function: void Foo(out System.Int32 y)) (OperationKind.LocalFunctionStatement) (Syntax: 'void Foo(ou ... ) => y = p;')
IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: '=> y = p')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'y = p')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'y = p')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'y = p')
Left: IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
Right: IParameterReferenceExpression: p (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'p')
IReturnStatement (OperationKind.ReturnStatement) (Syntax: '=> y = p')
......
......@@ -57,41 +57,41 @@ public void M1()
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'var x2 = ne ... ield = 2 };')
Variables: Local_1: F x2
Initializer: IObjectCreationExpression (Constructor: F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'new F() { Field = 2 }')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'Field = 2')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'Field = 2')
Left: IOperation: (OperationKind.None) (Syntax: 'Field')
Right: ILiteralExpression (Text: 2) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2) (Syntax: '2')
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'var x3 = ne ... ty1 = """" };')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'var x3 = ne ... ty1 = """" };')
Variables: Local_1: F x3
Initializer: IObjectCreationExpression (Constructor: F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'new F() { P ... rty1 = """" }')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.String) (Syntax: 'Property1 = """"')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.String) (Syntax: 'Property1 = """"')
Left: IOperation: (OperationKind.None) (Syntax: 'Property1')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: """") (Syntax: '""""')
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'var x4 = ne ... ield = 2 };')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'var x4 = ne ... ield = 2 };')
Variables: Local_1: F x4
Initializer: IObjectCreationExpression (Constructor: F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'new F() { P ... Field = 2 }')
Initializers(2): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.String) (Syntax: 'Property1 = """"')
Initializers(2): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.String) (Syntax: 'Property1 = """"')
Left: IOperation: (OperationKind.None) (Syntax: 'Property1')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: """") (Syntax: '""""')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'Field = 2')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'Field = 2')
Left: IOperation: (OperationKind.None) (Syntax: 'Field')
Right: ILiteralExpression (Text: 2) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2) (Syntax: '2')
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement) (Syntax: 'var x5 = ne ... = true } };')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'var x5 = ne ... = true } };')
Variables: Local_1: F x5
Initializer: IObjectCreationExpression (Constructor: F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'new F() { P ... = true } }')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: B) (Syntax: 'Property2 = ... ld = true }')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: B) (Syntax: 'Property2 = ... ld = true }')
Left: IOperation: (OperationKind.None) (Syntax: 'Property2')
Right: IObjectCreationExpression (Constructor: B..ctor()) (OperationKind.ObjectCreationExpression, Type: B) (Syntax: 'new B { Field = true }')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: 'Field = true')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'Field = true')
Left: IOperation: (OperationKind.None) (Syntax: 'Field')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'true')
IVariableDeclarationStatement (1 declarations) (OperationKind.VariableDeclarationStatement, IsInvalid) (Syntax: 'var e1 = ne ... rty2 = 1 };')
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'var e1 = ne ... rty2 = 1 };')
Variables: Local_1: F e1
Initializer: IObjectCreationExpression (Constructor: F..ctor()) (OperationKind.ObjectCreationExpression, Type: F, IsInvalid) (Syntax: 'new F() { P ... erty2 = 1 }')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: B, IsInvalid) (Syntax: 'Property2 = 1')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: B, IsInvalid) (Syntax: 'Property2 = 1')
Left: IOperation: (OperationKind.None) (Syntax: 'Property2')
Right: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: B, IsInvalid) (Syntax: '1')
ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
......@@ -220,10 +220,10 @@ public void M(int x)
";
string expectedOperationTree = @"
IObjectCreationExpression (Constructor: Class..ctor()) (OperationKind.ObjectCreationExpression, Type: Class) (Syntax: 'new Class() ... }')
Initializers(4): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'X = x')
Initializers(4): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = x')
Left: IOperation: (OperationKind.None) (Syntax: 'X')
Right: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Collections.Generic.List<System.Int32>) (Syntax: 'Y = { x, y, 3 }')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Collections.Generic.List<System.Int32>) (Syntax: 'Y = { x, y, 3 }')
Left: IOperation: (OperationKind.None) (Syntax: 'Y')
Right: IOperation: (OperationKind.None) (Syntax: '{ x, y, 3 }')
Children(3): IOperation: (OperationKind.None) (Syntax: 'x')
......@@ -232,16 +232,16 @@ public void M(int x)
Children(1): ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'y')
IOperation: (OperationKind.None) (Syntax: '3')
Children(1): ILiteralExpression (Text: 3) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 3) (Syntax: '3')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Collections.Generic.Dictionary<System.Int32, System.Int32>) (Syntax: 'Z = { { x, y } }')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Collections.Generic.Dictionary<System.Int32, System.Int32>) (Syntax: 'Z = { { x, y } }')
Left: IOperation: (OperationKind.None) (Syntax: 'Z')
Right: IOperation: (OperationKind.None) (Syntax: '{ { x, y } }')
Children(1): IOperation: (OperationKind.None) (Syntax: '{ x, y }')
Children(2): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'y')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: Class) (Syntax: 'C = { X = field }')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: Class) (Syntax: 'C = { X = field }')
Left: IOperation: (OperationKind.None) (Syntax: 'C')
Right: IOperation: (OperationKind.None) (Syntax: '{ X = field }')
Children(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'X = field')
Children(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = field')
Left: IOperation: (OperationKind.None) (Syntax: 'X')
Right: IFieldReferenceExpression: System.Int32 Class.field (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'field')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Class) (Syntax: 'field')
......
......@@ -165,10 +165,10 @@ public void M(int x, int y, int z)
";
string expectedOperationTree = @"
IObjectCreationExpression (Constructor: Class..ctor()) (OperationKind.ObjectCreationExpression, Type: Class) (Syntax: 'new Class() ... { X = z } }')
Initializers(4): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'X = x')
Initializers(4): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = x')
Left: IOperation: (OperationKind.None) (Syntax: 'X')
Right: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Collections.Generic.List<System.Int32>) (Syntax: 'Y = { x, y, 3 }')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Collections.Generic.List<System.Int32>) (Syntax: 'Y = { x, y, 3 }')
Left: IOperation: (OperationKind.None) (Syntax: 'Y')
Right: IOperation: (OperationKind.None) (Syntax: '{ x, y, 3 }')
Children(3): IOperation: (OperationKind.None) (Syntax: 'x')
......@@ -177,16 +177,16 @@ public void M(int x, int y, int z)
Children(1): IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
IOperation: (OperationKind.None) (Syntax: '3')
Children(1): ILiteralExpression (Text: 3) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 3) (Syntax: '3')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Collections.Generic.Dictionary<System.Int32, System.Int32>) (Syntax: 'Z = { { x, y } }')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Collections.Generic.Dictionary<System.Int32, System.Int32>) (Syntax: 'Z = { { x, y } }')
Left: IOperation: (OperationKind.None) (Syntax: 'Z')
Right: IOperation: (OperationKind.None) (Syntax: '{ { x, y } }')
Children(1): IOperation: (OperationKind.None) (Syntax: '{ x, y }')
Children(2): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: Class) (Syntax: 'C = { X = z }')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: Class) (Syntax: 'C = { X = z }')
Left: IOperation: (OperationKind.None) (Syntax: 'C')
Right: IOperation: (OperationKind.None) (Syntax: '{ X = z }')
Children(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'X = z')
Children(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = z')
Left: IOperation: (OperationKind.None) (Syntax: 'X')
Right: IParameterReferenceExpression: z (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'z')
";
......@@ -303,7 +303,7 @@ public void M(int x, int y)
";
string expectedOperationTree = @"
IOperation: (OperationKind.None) (Syntax: '{ X = { { x, y } } }')
Children(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: dynamic) (Syntax: 'X = { { x, y } }')
Children(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: dynamic) (Syntax: 'X = { { x, y } }')
Left: IOperation: (OperationKind.None) (Syntax: 'X')
Right: IOperation: (OperationKind.None) (Syntax: '{ { x, y } }')
Children(1): IOperation: (OperationKind.None) (Syntax: '{ x, y }')
......
......@@ -142,7 +142,7 @@ static void Main(string[] args)
string expectedOperationTree = @"
IIfStatement (OperationKind.IfStatement, IsInvalid) (Syntax: 'if (x = nul ... }')
Condition: IConversionExpression (ConversionKind.Invalid, Implicit) (OperationKind.ConversionExpression, Type: System.Boolean, IsInvalid) (Syntax: 'x = null')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: Program) (Syntax: 'x = null')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: Program) (Syntax: 'x = null')
Left: ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: Program) (Syntax: 'x')
Right: IConversionExpression (ConversionKind.Cast, Implicit) (OperationKind.ConversionExpression, Type: Program, Constant: null) (Syntax: 'null')
ILiteralExpression (Text: null) (OperationKind.LiteralExpression, Type: null, Constant: null) (Syntax: 'null')
......
......@@ -84,7 +84,6 @@
<Compile Include="Operations\IHasOperatorMethodExpression.cs" />
<Compile Include="Operations\IIfStatement.cs" />
<Compile Include="Operations\IIncrementExpression.cs" />
<Compile Include="Operations\IIndexedPropertyReferenceExpression.cs" />
<Compile Include="Operations\IInstanceReferenceExpression.cs" />
<Compile Include="Operations\IInvalidExpression.cs" />
<Compile Include="Operations\IInvalidStatement.cs" />
......
......@@ -31,6 +31,11 @@ public enum ConversionKind
/// </summary>
OperatorMethod = 0x5,
/// <summary>
/// Conversion is defined by the underlying type, and is created when an interpolated
/// string expression is being converted to an IFormattable or FormattableString.
/// </summary>
InterpolatedString = 0x6,
/// <summary>
/// Conversion is invalid.
/// </summary>
Invalid = 0xf
......
......@@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.Semantics
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IBaseAssignmentExpression : IOperation
public interface IAssignmentExpression : IOperation
{
/// <summary>
/// Target of the assignment.
......@@ -30,7 +30,7 @@ public interface IBaseAssignmentExpression : IOperation
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IAssignmentExpression : IBaseAssignmentExpression
public interface ISimpleAssignmentExpression : IAssignmentExpression
{
}
}
......
......@@ -5,29 +5,17 @@
namespace Microsoft.CodeAnalysis.Semantics
{
/// <summary>
/// Represents a base interface for assignment expression that includes a binary operation.
/// Represents an assignment expression that includes a binary operation.
/// </summary>
/// <remarks>
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IBaseCompoundAssignmentExpression : IBaseAssignmentExpression, IHasOperatorMethodExpression
public interface ICompoundAssignmentExpression : IAssignmentExpression, IHasOperatorMethodExpression
{
/// <summary>
/// Kind of binary operation.
/// </summary>
BinaryOperationKind BinaryOperationKind { get; }
}
/// <summary>
/// Represents an assignment expression that includes a binary operation.
/// </summary>
/// <remarks>
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface ICompoundAssignmentExpression : IBaseCompoundAssignmentExpression
{
}
}
}
\ No newline at end of file
......@@ -11,8 +11,13 @@ namespace Microsoft.CodeAnalysis.Semantics
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IIncrementExpression : IBaseCompoundAssignmentExpression
public interface IIncrementExpression : IOperation, IHasOperatorMethodExpression
{
/// <summary>
/// Target of the assignment.
/// </summary>
IOperation Target { get; }
/// <summary>
/// Kind of increment.
/// </summary>
......
// 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
{
/// <summary>
/// Represents a reference to an indexed property.
/// </summary>
/// <remarks>
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IIndexedPropertyReferenceExpression : IBasePropertyReferenceExpression, IHasArgumentsExpression
{
}
}
......@@ -5,29 +5,18 @@
namespace Microsoft.CodeAnalysis.Semantics
{
/// <summary>
/// Represents a base interface for reference to a property.
/// Represents a reference to a property.
/// </summary>
/// <remarks>
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IBasePropertyReferenceExpression : IMemberReferenceExpression
public interface IPropertyReferenceExpression : IMemberReferenceExpression, IHasArgumentsExpression
{
/// <summary>
/// Referenced property.
/// </summary>
IPropertySymbol Property { get; }
}
/// <summary>
/// Represents a reference to a property.
/// </summary>
/// <remarks>
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IPropertyReferenceExpression : IBasePropertyReferenceExpression
{
}
}
......@@ -33,9 +33,9 @@ public static IConditionalChoiceExpression CreateConditionalChoiceExpression(IOp
default(Optional<object>));
}
public static IExpressionStatement CreateAssignmentExpressionStatement(IOperation target, IOperation value, SyntaxNode syntax)
public static IExpressionStatement CreateSimpleAssignmentExpressionStatement(IOperation target, IOperation value, SyntaxNode syntax)
{
var expression = new AssignmentExpression(target, value, syntax, target.Type, default(Optional<object>));
var expression = new SimpleAssignmentExpression(target, value, syntax, target.Type, default(Optional<object>));
return new ExpressionStatement(expression, syntax, type: null, constantValue: default(Optional<object>));
}
......
......@@ -88,8 +88,6 @@ public enum OperationKind
MethodBindingExpression = 0x109,
/// <summary>Indicates an <see cref="IPropertyReferenceExpression"/>.</summary>
PropertyReferenceExpression = 0x10a,
/// <summary>Indicates an <see cref="IIndexedPropertyReferenceExpression"/>.</summary>
IndexedPropertyReferenceExpression = 0x10b,
/// <summary>Indicates an <see cref="IEventReferenceExpression"/>.</summary>
EventReferenceExpression = 0x10c,
/// <summary>Indicates an <see cref="IUnaryOperatorExpression"/>.</summary>
......@@ -114,8 +112,8 @@ public enum OperationKind
IsTypeExpression = 0x116,
/// <summary>Indicates an <see cref="IAwaitExpression"/>.</summary>
AwaitExpression = 0x117,
/// <summary>Indicates an <see cref="IAssignmentExpression"/>.</summary>
AssignmentExpression = 0x118,
/// <summary>Indicates an <see cref="ISimpleAssignmentExpression"/>.</summary>
SimpleAssignmentExpression = 0x118,
/// <summary>Indicates an <see cref="ICompoundAssignmentExpression"/>.</summary>
CompoundAssignmentExpression = 0x119,
/// <summary>Indicates an <see cref="IParenthesizedExpression"/>.</summary>
......
......@@ -245,11 +245,6 @@ public virtual void VisitPlaceholderExpression(IPlaceholderExpression operation)
DefaultVisit(operation);
}
public virtual void VisitIndexedPropertyReferenceExpression(IIndexedPropertyReferenceExpression operation)
{
DefaultVisit(operation);
}
public virtual void VisitUnaryOperatorExpression(IUnaryOperatorExpression operation)
{
DefaultVisit(operation);
......@@ -340,7 +335,7 @@ public virtual void VisitArrayInitializer(IArrayInitializer operation)
DefaultVisit(operation);
}
public virtual void VisitAssignmentExpression(IAssignmentExpression operation)
public virtual void VisitSimpleAssignmentExpression(ISimpleAssignmentExpression operation)
{
DefaultVisit(operation);
}
......@@ -675,11 +670,6 @@ public virtual TResult VisitPlaceholderExpression(IPlaceholderExpression operati
return DefaultVisit(operation, argument);
}
public virtual TResult VisitIndexedPropertyReferenceExpression(IIndexedPropertyReferenceExpression operation, TArgument argument)
{
return DefaultVisit(operation, argument);
}
public virtual TResult VisitUnaryOperatorExpression(IUnaryOperatorExpression operation, TArgument argument)
{
return DefaultVisit(operation, argument);
......@@ -770,7 +760,7 @@ public virtual TResult VisitArrayInitializer(IArrayInitializer operation, TArgum
return DefaultVisit(operation, argument);
}
public virtual TResult VisitAssignmentExpression(IAssignmentExpression operation, TArgument argument)
public virtual TResult VisitSimpleAssignmentExpression(ISimpleAssignmentExpression operation, TArgument argument)
{
return DefaultVisit(operation, argument);
}
......
......@@ -251,6 +251,7 @@ public override void VisitMethodBindingExpression(IMethodBindingExpression opera
public override void VisitPropertyReferenceExpression(IPropertyReferenceExpression operation)
{
Visit(operation.Instance);
VisitArray(operation.ArgumentsInEvaluationOrder);
}
public override void VisitEventReferenceExpression(IEventReferenceExpression operation)
......@@ -278,12 +279,6 @@ public override void VisitPlaceholderExpression(IPlaceholderExpression operation
{
}
public override void VisitIndexedPropertyReferenceExpression(IIndexedPropertyReferenceExpression operation)
{
Visit(operation.Instance);
VisitArray(operation.ArgumentsInEvaluationOrder);
}
public override void VisitUnaryOperatorExpression(IUnaryOperatorExpression operation)
{
Visit(operation.Operand);
......@@ -379,7 +374,7 @@ public override void VisitArrayInitializer(IArrayInitializer operation)
VisitArray(operation.ElementValues);
}
public override void VisitAssignmentExpression(IAssignmentExpression operation)
public override void VisitSimpleAssignmentExpression(ISimpleAssignmentExpression operation)
{
Visit(operation.Target);
Visit(operation.Value);
......@@ -394,7 +389,6 @@ public override void VisitCompoundAssignmentExpression(ICompoundAssignmentExpres
public override void VisitIncrementExpression(IIncrementExpression operation)
{
Visit(operation.Target);
Visit(operation.Value);
}
public override void VisitParenthesizedExpression(IParenthesizedExpression operation)
......
......@@ -508,10 +508,10 @@ private static bool AreSimilar(SyntaxNodeOrToken node1, SyntaxNodeOrToken node2)
private struct ChangeRecord
{
public readonly TextChangeRange Range;
public readonly Stack<SyntaxNodeOrToken> OldNodes;
public readonly Stack<SyntaxNodeOrToken> NewNodes;
public readonly Queue<SyntaxNodeOrToken> OldNodes;
public readonly Queue<SyntaxNodeOrToken> NewNodes;
internal ChangeRecord(TextChangeRange range, Stack<SyntaxNodeOrToken> oldNodes, Stack<SyntaxNodeOrToken> newNodes)
internal ChangeRecord(TextChangeRange range, Queue<SyntaxNodeOrToken> oldNodes, Queue<SyntaxNodeOrToken> newNodes)
{
this.Range = range;
this.OldNodes = oldNodes;
......@@ -529,13 +529,27 @@ private void RecordDeleteOld(int oldNodeCount)
private void RecordReplaceOldWithNew(int oldNodeCount, int newNodeCount)
{
var oldSpan = GetSpan(_oldNodes, 0, oldNodeCount);
var removedNodes = CopyFirst(_oldNodes, oldNodeCount);
RemoveFirst(_oldNodes, oldNodeCount);
var newSpan = GetSpan(_newNodes, 0, newNodeCount);
var insertedNodes = CopyFirst(_newNodes, newNodeCount);
RemoveFirst(_newNodes, newNodeCount);
RecordChange(new ChangeRecord(new TextChangeRange(oldSpan, newSpan.Length), removedNodes, insertedNodes));
if (oldNodeCount == 1 && newNodeCount == 1)
{
// Avoid creating a Queue<T> which we immediately discard in the most common case for old/new counts
var removedNode = _oldNodes.Pop();
var oldSpan = removedNode.FullSpan;
var insertedNode = _newNodes.Pop();
var newSpan = insertedNode.FullSpan;
RecordChange(new TextChangeRange(oldSpan, newSpan.Length), removedNode, insertedNode);
}
else
{
var oldSpan = GetSpan(_oldNodes, 0, oldNodeCount);
var removedNodes = CopyFirst(_oldNodes, oldNodeCount);
RemoveFirst(_oldNodes, oldNodeCount);
var newSpan = GetSpan(_newNodes, 0, newNodeCount);
var insertedNodes = CopyFirst(_newNodes, newNodeCount);
RemoveFirst(_newNodes, newNodeCount);
RecordChange(new ChangeRecord(new TextChangeRange(oldSpan, newSpan.Length), removedNodes, insertedNodes));
}
}
private void RecordInsertNew(int newNodeCount)
......@@ -568,6 +582,37 @@ private void RecordChange(ChangeRecord change)
_changes.Add(change);
}
private void RecordChange(TextChangeRange textChangeRange, SyntaxNodeOrToken removedNode, SyntaxNodeOrToken insertedNode)
{
if (_changes.Count > 0)
{
var last = _changes[_changes.Count - 1];
if (last.Range.Span.End == textChangeRange.Span.Start)
{
// merge changes...
last.OldNodes?.Enqueue(removedNode);
last.NewNodes?.Enqueue(insertedNode);
_changes[_changes.Count - 1] = new ChangeRecord(
new TextChangeRange(new TextSpan(last.Range.Span.Start, last.Range.Span.Length + textChangeRange.Span.Length), last.Range.NewLength + textChangeRange.NewLength),
last.OldNodes ?? CreateQueue(removedNode),
last.NewNodes ?? CreateQueue(insertedNode));
return;
}
Debug.Assert(textChangeRange.Span.Start >= last.Range.Span.End);
}
_changes.Add(new ChangeRecord(textChangeRange, CreateQueue(removedNode), CreateQueue(insertedNode)));
// Local Functions
Queue<SyntaxNodeOrToken> CreateQueue(SyntaxNodeOrToken nodeOrToken)
{
var queue = new Queue<SyntaxNodeOrToken>();
queue.Enqueue(nodeOrToken);
return queue;
}
}
private static TextSpan GetSpan(Stack<SyntaxNodeOrToken> stack, int first, int length)
{
int start = -1, end = -1, i = 0;
......@@ -593,37 +638,73 @@ private static TextSpan GetSpan(Stack<SyntaxNodeOrToken> stack, int first, int l
return TextSpan.FromBounds(start, end);
}
private static Stack<SyntaxNodeOrToken> Combine(Stack<SyntaxNodeOrToken> first, Stack<SyntaxNodeOrToken> next)
private static TextSpan GetSpan(Queue<SyntaxNodeOrToken> queue, int first, int length)
{
int start = -1, end = -1, i = 0;
foreach (var n in queue)
{
if (i == first)
{
start = n.Position;
}
if (i == first + length - 1)
{
end = n.EndPosition;
break;
}
i++;
}
Debug.Assert(start >= 0);
Debug.Assert(end >= 0);
return TextSpan.FromBounds(start, end);
}
private static Queue<SyntaxNodeOrToken> Combine(Queue<SyntaxNodeOrToken> first, Queue<SyntaxNodeOrToken> next)
{
if (first == null)
if (first == null || first.Count == 0)
{
return next;
}
if (next == null)
if (next == null || next.Count == 0)
{
return first;
}
var nodes = ToArray(first, first.Count);
for (int i = 0; i < nodes.Length; i++)
foreach (var nodeOrToken in next)
{
next.Push(nodes[i]);
first.Enqueue(nodeOrToken);
}
return next;
return first;
}
private static Stack<SyntaxNodeOrToken> CopyFirst(Stack<SyntaxNodeOrToken> stack, int n)
private static Queue<SyntaxNodeOrToken> CopyFirst(Stack<SyntaxNodeOrToken> stack, int n)
{
if (n == 0)
{
return null;
}
var nodes = ToArray(stack, n);
var newStack = new Stack<SyntaxNodeOrToken>(nodes);
return newStack;
var queue = new Queue<SyntaxNodeOrToken>(n);
int remaining = n;
foreach (var node in stack)
{
if (remaining == 0)
{
break;
}
queue.Enqueue(node);
remaining--;
}
return queue;
}
private static SyntaxNodeOrToken[] ToArray(Stack<SyntaxNodeOrToken> stack, int n)
......@@ -744,30 +825,30 @@ private static void GetCommonEdgeLengths(StringBuilder oldText, StringBuilder ne
}
}
private static string GetText(Stack<SyntaxNodeOrToken> stack)
private static string GetText(Queue<SyntaxNodeOrToken> queue)
{
if (stack == null || stack.Count == 0)
if (queue == null || queue.Count == 0)
{
return string.Empty;
}
var span = GetSpan(stack, 0, stack.Count);
var span = GetSpan(queue, 0, queue.Count);
var builder = new StringBuilder(span.Length);
CopyText(stack, builder);
CopyText(queue, builder);
return builder.ToString();
}
private static void CopyText(Stack<SyntaxNodeOrToken> stack, StringBuilder builder)
private static void CopyText(Queue<SyntaxNodeOrToken> queue, StringBuilder builder)
{
builder.Length = 0;
if (stack != null && stack.Count > 0)
if (queue != null && queue.Count > 0)
{
var writer = new System.IO.StringWriter(builder);
foreach (var n in stack)
foreach (var n in queue)
{
n.WriteTo(writer);
}
......
......@@ -205,7 +205,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Dim syntax As SyntaxNode = boundAssignmentOperator.Syntax
Dim type As ITypeSymbol = boundAssignmentOperator.Type
Dim constantValue As [Optional](Of Object) = ConvertToOptional(boundAssignmentOperator.ConstantValueOpt)
Return New LazyAssignmentExpression(target, value, syntax, type, constantValue)
Return New LazySimpleAssignmentExpression(target, value, syntax, type, constantValue)
End If
End Function
......@@ -491,7 +491,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Return New LazyArrayInitializer(elementValues, syntax, type, constantValue)
End Function
Private Function CreateBoundPropertyAccessOperation(boundPropertyAccess As BoundPropertyAccess) As IBasePropertyReferenceExpression
Private Function CreateBoundPropertyAccessOperation(boundPropertyAccess As BoundPropertyAccess) As IPropertyReferenceExpression
Dim instance As Lazy(Of IOperation) = New Lazy(Of IOperation)(
Function()
If boundPropertyAccess.PropertySymbol.IsShared Then
......@@ -503,13 +503,16 @@ Namespace Microsoft.CodeAnalysis.Semantics
Dim [property] As IPropertySymbol = boundPropertyAccess.PropertySymbol
Dim member As ISymbol = boundPropertyAccess.PropertySymbol
Dim argumentsInEvaluationOrder As Lazy(Of ImmutableArray(Of IArgument)) = New Lazy(Of ImmutableArray(Of IArgument))(Function() DeriveArguments(boundPropertyAccess.Arguments, boundPropertyAccess.PropertySymbol.Parameters))
Dim argumentsInEvaluationOrder As Lazy(Of ImmutableArray(Of IArgument)) = New Lazy(Of ImmutableArray(Of IArgument))(
Function()
Return If(boundPropertyAccess.Arguments.Length = 0,
ImmutableArray(Of IArgument).Empty,
DeriveArguments(boundPropertyAccess.Arguments, boundPropertyAccess.PropertySymbol.Parameters))
End Function)
Dim syntax As SyntaxNode = boundPropertyAccess.Syntax
Dim type As ITypeSymbol = boundPropertyAccess.Type
Dim constantValue As [Optional](Of Object) = ConvertToOptional(boundPropertyAccess.ConstantValueOpt)
Return If(boundPropertyAccess.Arguments.Length > 0,
DirectCast(New LazyIndexedPropertyReferenceExpression([property], instance, member, argumentsInEvaluationOrder, syntax, type, constantValue), IBasePropertyReferenceExpression),
New LazyPropertyReferenceExpression([property], instance, member, syntax, type, constantValue))
Return New LazyPropertyReferenceExpression([property], instance, member, argumentsInEvaluationOrder, syntax, type, constantValue)
End Function
Private Function CreateBoundEventAccessOperation(boundEventAccess As BoundEventAccess) As IEventReferenceExpression
......
......@@ -31,7 +31,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
End Select
End If
Return OperationKind.AssignmentExpression
Return OperationKind.SimpleAssignmentExpression
End Function
Private Function GetUserDefinedBinaryOperatorChild([operator] As BoundUserDefinedBinaryOperator, index As Integer) As IOperation
......@@ -237,14 +237,14 @@ Namespace Microsoft.CodeAnalysis.Semantics
' ControlVariable = InitialValue
Dim controlReference As IOperation = Create(boundFor.ControlVariable)
If controlReference IsNot Nothing Then
statements.Add(OperationFactory.CreateAssignmentExpressionStatement(controlReference, Create(boundFor.InitialValue), boundFor.InitialValue.Syntax))
statements.Add(OperationFactory.CreateSimpleAssignmentExpressionStatement(controlReference, Create(boundFor.InitialValue), boundFor.InitialValue.Syntax))
End If
' T0 = LimitValue
If Not boundFor.LimitValue.IsConstant Then
Dim value = Create(boundFor.LimitValue)
statements.Add(
OperationFactory.CreateAssignmentExpressionStatement(
OperationFactory.CreateSimpleAssignmentExpressionStatement(
New SyntheticLocalReferenceExpression(
SyntheticLocalKind.ForLoopLimitValue,
Create(boundFor),
......@@ -257,7 +257,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
If boundFor.StepValue IsNot Nothing AndAlso Not boundFor.StepValue.IsConstant Then
Dim value = Create(boundFor.StepValue)
statements.Add(
OperationFactory.CreateAssignmentExpressionStatement(
OperationFactory.CreateSimpleAssignmentExpressionStatement(
New SyntheticLocalReferenceExpression(
SyntheticLocalKind.ForLoopStepValue,
Create(boundFor),
......
......@@ -132,6 +132,7 @@
<Compile Include="FlowAnalysis\TryLockUsingStatementTests.vb" />
<Compile Include="IOperation\IOperationTests_IUsingStatement.vb" />
<Compile Include="IOperation\IOperationTests_IVariableDeclaration.vb" />
<Compile Include="IOperation\IOperationTests_IUnaryOperatorExpression.vb" />
<Compile Include="Resource.Designer.vb">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
......
......@@ -56,8 +56,8 @@ End Module
Dim statement1 As IOperation = model.GetOperation(nodes(0))
Assert.Equal(statement1.Kind, OperationKind.ExpressionStatement)
Dim expression1 As IOperation = DirectCast(statement1, IExpressionStatement).Expression
Assert.Equal(expression1.Kind, OperationKind.AssignmentExpression)
Dim assignment1 As IAssignmentExpression = DirectCast(expression1, IAssignmentExpression)
Assert.Equal(expression1.Kind, OperationKind.SimpleAssignmentExpression)
Dim assignment1 As ISimpleAssignmentExpression = DirectCast(expression1, ISimpleAssignmentExpression)
Assert.Equal(assignment1.Value.Kind, OperationKind.BinaryOperatorExpression)
Dim add1 As IBinaryOperatorExpression = DirectCast(assignment1.Value, IBinaryOperatorExpression)
Assert.Equal(add1.BinaryOperationKind, BinaryOperationKind.OperatorMethodAdd)
......@@ -73,7 +73,7 @@ End Module
comp.VerifyOperationTree(nodes(0), expectedOperationTree:="
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'x = x + 10')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: B2, IsInvalid) (Syntax: 'x = x + 10')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: B2, IsInvalid) (Syntax: 'x = x + 10')
Left: ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: B2) (Syntax: 'x')
Right: IBinaryOperatorExpression (BinaryOperationKind.OperatorMethodAdd) (OperationKind.BinaryOperatorExpression, Type: B2, IsInvalid) (Syntax: 'x + 10')
Left: ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: B2) (Syntax: 'x')
......@@ -86,8 +86,8 @@ IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'x
Dim statement2 As IOperation = model.GetOperation(nodes(1))
Assert.Equal(statement2.Kind, OperationKind.ExpressionStatement)
Dim expression2 As IOperation = DirectCast(statement2, IExpressionStatement).Expression
Assert.Equal(expression2.Kind, OperationKind.AssignmentExpression)
Dim assignment2 As IAssignmentExpression = DirectCast(expression2, IAssignmentExpression)
Assert.Equal(expression2.Kind, OperationKind.SimpleAssignmentExpression)
Dim assignment2 As ISimpleAssignmentExpression = DirectCast(expression2, ISimpleAssignmentExpression)
Assert.Equal(assignment2.Value.Kind, OperationKind.BinaryOperatorExpression)
Dim add2 As IBinaryOperatorExpression = DirectCast(assignment2.Value, IBinaryOperatorExpression)
Assert.Equal(add2.BinaryOperationKind, BinaryOperationKind.OperatorMethodAdd)
......@@ -103,7 +103,7 @@ IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'x
comp.VerifyOperationTree(nodes(1), expectedOperationTree:="
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'x = x + y')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: B2) (Syntax: 'x = x + y')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: B2) (Syntax: 'x = x + y')
Left: ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: B2) (Syntax: 'x')
Right: IBinaryOperatorExpression (BinaryOperationKind.OperatorMethodAdd) (OperatorMethod: Function B2.op_Addition(x As B2, y As B2) As B2) (OperationKind.BinaryOperatorExpression, Type: B2) (Syntax: 'x + y')
Left: ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: B2) (Syntax: 'x')
......@@ -116,8 +116,8 @@ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'x = x + y')
Dim statement3 As IOperation = model.GetOperation(nodes(2))
Assert.Equal(statement3.Kind, OperationKind.ExpressionStatement)
Dim expression3 As IOperation = DirectCast(statement3, IExpressionStatement).Expression
Assert.Equal(expression3.Kind, OperationKind.AssignmentExpression)
Dim assignment3 As IAssignmentExpression = DirectCast(expression3, IAssignmentExpression)
Assert.Equal(expression3.Kind, OperationKind.SimpleAssignmentExpression)
Dim assignment3 As ISimpleAssignmentExpression = DirectCast(expression3, ISimpleAssignmentExpression)
Assert.Equal(assignment3.Value.Kind, OperationKind.UnaryOperatorExpression)
Dim negate3 As IUnaryOperatorExpression = DirectCast(assignment3.Value, IUnaryOperatorExpression)
Assert.Equal(negate3.UnaryOperationKind, UnaryOperationKind.OperatorMethodMinus)
......@@ -129,7 +129,7 @@ IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'x = x + y')
comp.VerifyOperationTree(nodes(2), expectedOperationTree:="
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'x = -x')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: B2, IsInvalid) (Syntax: 'x = -x')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: B2, IsInvalid) (Syntax: 'x = -x')
Left: ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: B2) (Syntax: 'x')
Right: IUnaryOperatorExpression (UnaryOperationKind.OperatorMethodMinus) (OperationKind.UnaryOperatorExpression, Type: B2, IsInvalid) (Syntax: '-x')
ILocalReferenceExpression: x (OperationKind.LocalReferenceExpression, Type: B2) (Syntax: 'x')
......@@ -264,7 +264,7 @@ IForLoopStatement (LoopKind.For) (OperationKind.LoopStatement) (Syntax: 'For i =
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
Before: IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: '0')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: '0')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: '0')
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
AtLoopBottom: IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'For i = 0 T ... Next')
......
......@@ -26,7 +26,7 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If count > ... lue = count')
Right: ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If count > ... lue = count')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'returnValue = count')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = count')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = count')
Left: ILocalReferenceExpression: returnValue (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'returnValue')
Right: ILocalReferenceExpression: count (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'count')
]]>.Value
......@@ -57,7 +57,7 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If count > ... End If')
Right: ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If count > ... End If')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'returnValue = count')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = count')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = count')
Left: ILocalReferenceExpression: returnValue (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'returnValue')
Right: ILocalReferenceExpression: count (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'count')
]]>.Value
......@@ -85,14 +85,14 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If count > ... ata - count')
Right: ILiteralExpression (Text: 10) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 10) (Syntax: '10')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If count > ... ata - count')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'data = data + count')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'data = data + count')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'data = data + count')
Left: ILocalReferenceExpression: data (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'data')
Right: IBinaryOperatorExpression (BinaryOperationKind.IntegerAdd) (OperationKind.BinaryOperatorExpression, Type: System.Int32) (Syntax: 'data + count')
Left: ILocalReferenceExpression: data (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'data')
Right: ILocalReferenceExpression: count (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'count')
IfFalse: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Else data = data - count')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'data = data - count')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'data = data - count')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'data = data - count')
Left: ILocalReferenceExpression: data (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'data')
Right: IBinaryOperatorExpression (BinaryOperationKind.IntegerSubtract) (OperationKind.BinaryOperatorExpression, Type: System.Int32) (Syntax: 'data - count')
Left: ILocalReferenceExpression: data (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'data')
......@@ -128,7 +128,7 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If m > 10 T ... rnValue = n')
Right: ILiteralExpression (Text: 20) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 20) (Syntax: '20')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If n > 20 T ... rnValue = n')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'returnValue = n')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = n')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = n')
Left: ILocalReferenceExpression: returnValue (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'returnValue')
Right: ILocalReferenceExpression: n (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'n')
]]>.Value
......@@ -157,7 +157,7 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If 1 = 1 Th ... End If')
Right: ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If 1 = 1 Th ... End If')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'condition = True')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: 'condition = True')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'condition = True')
Left: ILocalReferenceExpression: condition (OperationKind.LocalReferenceExpression, Type: System.Boolean) (Syntax: 'condition')
Right: ILiteralExpression (Text: True) (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'True')
]]>.Value
......@@ -184,7 +184,7 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If False Th ... End If')
Condition: ILiteralExpression (Text: False) (OperationKind.LiteralExpression, Type: System.Boolean, Constant: False) (Syntax: 'False')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If False Th ... End If')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'condition = False')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: 'condition = False')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'condition = False')
Left: ILocalReferenceExpression: condition (OperationKind.LocalReferenceExpression, Type: System.Boolean) (Syntax: 'condition')
Right: ILiteralExpression (Text: False) (OperationKind.LiteralExpression, Type: System.Boolean, Constant: False) (Syntax: 'False')
]]>.Value
......@@ -218,7 +218,7 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If (m > 10 ... rnValue = n')
Right: ILiteralExpression (Text: 20) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 20) (Syntax: '20')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If (m > 10 ... rnValue = n')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'returnValue = n')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = n')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = n')
Left: ILocalReferenceExpression: returnValue (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'returnValue')
Right: ILocalReferenceExpression: n (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'n')
]]>.Value
......@@ -250,12 +250,12 @@ IIfStatement (OperationKind.IfStatement) (Syntax: 'If count > ... End If')
Right: ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
IfTrue: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'If count > ... End If')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'returnValue = count')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = count')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = count')
Left: ILocalReferenceExpression: returnValue (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'returnValue')
Right: ILocalReferenceExpression: count (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'count')
IfFalse: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Else ... nValue = -1')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'returnValue = -1')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = -1')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'returnValue = -1')
Left: ILocalReferenceExpression: returnValue (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'returnValue')
Right: IUnaryOperatorExpression (UnaryOperationKind.IntegerMinus) (OperationKind.UnaryOperatorExpression, Type: System.Int32, Constant: -1) (Syntax: '-1')
ILiteralExpression (Text: 1) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: '1')
......
......@@ -51,7 +51,7 @@ IBlockStatement (9 statements, 7 locals) (OperationKind.BlockStatement, IsInvali
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'x2')
Variables: Local_1: x2 As F
Initializer: IObjectCreationExpression (Constructor: Sub F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'New F() Wit ... .Field = 2}')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: '.Field = 2')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: '.Field = 2')
Left: IFieldReferenceExpression: F.Field As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'Field')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New F() Wit ... .Field = 2}')
Right: ILiteralExpression (Text: 2) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2) (Syntax: '2')
......@@ -59,7 +59,7 @@ IBlockStatement (9 statements, 7 locals) (OperationKind.BlockStatement, IsInvali
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'x3')
Variables: Local_1: x3 As F
Initializer: IObjectCreationExpression (Constructor: Sub F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'New F() Wit ... erty1 = ""}')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.Property1 = ""')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.Property1 = ""')
Left: IPropertyReferenceExpression: Property F.Property1 As System.String (OperationKind.PropertyReferenceExpression, Type: System.String) (Syntax: 'Property1')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New F() Wit ... erty1 = ""}')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "") (Syntax: '""')
......@@ -67,11 +67,11 @@ IBlockStatement (9 statements, 7 locals) (OperationKind.BlockStatement, IsInvali
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'x4')
Variables: Local_1: x4 As F
Initializer: IObjectCreationExpression (Constructor: Sub F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'New F() Wit ... .Field = 2}')
Initializers(2): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.Property1 = ""')
Initializers(2): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.Property1 = ""')
Left: IPropertyReferenceExpression: Property F.Property1 As System.String (OperationKind.PropertyReferenceExpression, Type: System.String) (Syntax: 'Property1')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New F() Wit ... .Field = 2}')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.String, Constant: "") (Syntax: '""')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: '.Field = 2')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: '.Field = 2')
Left: IFieldReferenceExpression: F.Field As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'Field')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New F() Wit ... .Field = 2}')
Right: ILiteralExpression (Text: 2) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 2) (Syntax: '2')
......@@ -79,11 +79,11 @@ IBlockStatement (9 statements, 7 locals) (OperationKind.BlockStatement, IsInvali
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration) (Syntax: 'x5')
Variables: Local_1: x5 As F
Initializer: IObjectCreationExpression (Constructor: Sub F..ctor()) (OperationKind.ObjectCreationExpression, Type: F) (Syntax: 'New F() Wit ... ld = True}}')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.Property2 ... eld = True}')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.Property2 ... eld = True}')
Left: IPropertyReferenceExpression: Property F.Property2 As B (OperationKind.PropertyReferenceExpression, Type: B) (Syntax: 'Property2')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New F() Wit ... ld = True}}')
Right: IObjectCreationExpression (Constructor: Sub B..ctor()) (OperationKind.ObjectCreationExpression, Type: B) (Syntax: 'New B() Wit ... eld = True}')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Boolean) (Syntax: '.Field = True')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: '.Field = True')
Left: IFieldReferenceExpression: B.Field As System.Boolean (OperationKind.FieldReferenceExpression, Type: System.Boolean) (Syntax: 'Field')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New B() Wit ... eld = True}')
Right: ILiteralExpression (Text: True) (OperationKind.LiteralExpression, Type: System.Boolean, Constant: True) (Syntax: 'True')
......@@ -91,7 +91,7 @@ IBlockStatement (9 statements, 7 locals) (OperationKind.BlockStatement, IsInvali
IVariableDeclaration (1 variables) (OperationKind.VariableDeclaration, IsInvalid) (Syntax: 'e1')
Variables: Local_1: e1 As F
Initializer: IObjectCreationExpression (Constructor: Sub F..ctor()) (OperationKind.ObjectCreationExpression, Type: F, IsInvalid) (Syntax: 'New F() Wit ... perty2 = 1}')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void, IsInvalid) (Syntax: '.Property2 = 1')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void, IsInvalid) (Syntax: '.Property2 = 1')
Left: IPropertyReferenceExpression: Property F.Property2 As B (OperationKind.PropertyReferenceExpression, Type: B) (Syntax: 'Property2')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New F() Wit ... perty2 = 1}')
Right: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: B, IsInvalid) (Syntax: '1')
......@@ -223,11 +223,11 @@ End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.ObjectCreationExpression, Type: [Class]) (Syntax: 'New [Class] ... }')
Initializers(4): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.X = x')
Initializers(4): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.X = x')
Left: IPropertyReferenceExpression: Property [Class].X As System.Int32 (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.Y = {x, y, 3}')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.Y = {x, y, 3}')
Left: IPropertyReferenceExpression: Property [Class].Y As System.Int32() (OperationKind.PropertyReferenceExpression, Type: System.Int32()) (Syntax: 'Y')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IArrayCreationExpression (Element Type: System.Int32) (OperationKind.ArrayCreationExpression, Type: System.Int32()) (Syntax: '{x, y, 3}')
......@@ -236,7 +236,7 @@ IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.Obje
Element Values(3): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'y')
ILiteralExpression (Text: 3) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 3) (Syntax: '3')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.Z = New Di ... om {{x, y}}')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.Z = New Di ... om {{x, y}}')
Left: IPropertyReferenceExpression: Property [Class].Z As System.Collections.Generic.Dictionary(Of System.Int32, System.Int32) (OperationKind.PropertyReferenceExpression, Type: System.Collections.Generic.Dictionary(Of System.Int32, System.Int32)) (Syntax: 'Z')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IObjectCreationExpression (Constructor: Sub System.Collections.Generic.Dictionary(Of System.Int32, System.Int32)..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Collections.Generic.Dictionary(Of System.Int32, System.Int32)) (Syntax: 'New Diction ... om {{x, y}}')
......@@ -246,11 +246,11 @@ IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.Obje
IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IArgument (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument) (Syntax: 'y')
ILocalReferenceExpression: y (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'y')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.C = New [C ... .X = field}')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.C = New [C ... .X = field}')
Left: IPropertyReferenceExpression: Property [Class].C As [Class] (OperationKind.PropertyReferenceExpression, Type: [Class]) (Syntax: 'C')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.ObjectCreationExpression, Type: [Class]) (Syntax: 'New [Class] ... .X = field}')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.X = field')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.X = field')
Left: IPropertyReferenceExpression: Property [Class].X As System.Int32 (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... .X = field}')
Right: IFieldReferenceExpression: [Class].field As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'field')
......
......@@ -249,11 +249,11 @@ End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.ObjectCreationExpression, Type: [Class]) (Syntax: 'New [Class] ... }')
Initializers(4): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.X = x')
Initializers(4): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.X = x')
Left: IPropertyReferenceExpression: Property [Class].X As System.Int32 (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.Y = {x, y, 3}')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.Y = {x, y, 3}')
Left: IPropertyReferenceExpression: Property [Class].Y As System.Int32() (OperationKind.PropertyReferenceExpression, Type: System.Int32()) (Syntax: 'Y')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IArrayCreationExpression (Element Type: System.Int32) (OperationKind.ArrayCreationExpression, Type: System.Int32()) (Syntax: '{x, y, 3}')
......@@ -262,7 +262,7 @@ IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.Obje
Element Values(3): IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
ILiteralExpression (Text: 3) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 3) (Syntax: '3')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.Z = New Di ... om {{x, y}}')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.Z = New Di ... om {{x, y}}')
Left: IPropertyReferenceExpression: Property [Class].Z As System.Collections.Generic.Dictionary(Of System.Int32, System.Int32) (OperationKind.PropertyReferenceExpression, Type: System.Collections.Generic.Dictionary(Of System.Int32, System.Int32)) (Syntax: 'Z')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IObjectCreationExpression (Constructor: Sub System.Collections.Generic.Dictionary(Of System.Int32, System.Int32)..ctor()) (OperationKind.ObjectCreationExpression, Type: System.Collections.Generic.Dictionary(Of System.Int32, System.Int32)) (Syntax: 'New Diction ... om {{x, y}}')
......@@ -272,11 +272,11 @@ IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.Obje
IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'x')
IArgument (ArgumentKind.Explicit, Matching Parameter: value) (OperationKind.Argument) (Syntax: 'y')
IParameterReferenceExpression: y (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'y')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.C = New [C ... th {.X = z}')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.C = New [C ... th {.X = z}')
Left: IPropertyReferenceExpression: Property [Class].C As [Class] (OperationKind.PropertyReferenceExpression, Type: [Class]) (Syntax: 'C')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... }')
Right: IObjectCreationExpression (Constructor: Sub [Class]..ctor()) (OperationKind.ObjectCreationExpression, Type: [Class]) (Syntax: 'New [Class] ... th {.X = z}')
Initializers(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: '.X = z')
Initializers(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: '.X = z')
Left: IPropertyReferenceExpression: Property [Class].X As System.Int32 (OperationKind.PropertyReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IOperation: (OperationKind.None) (Syntax: 'New [Class] ... th {.X = z}')
Right: IParameterReferenceExpression: z (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'z')
......@@ -504,7 +504,7 @@ End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Mid(str, st ... ngth) = str')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Void) (Syntax: 'Mid(str, st ... ngth) = str')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Void) (Syntax: 'Mid(str, st ... ngth) = str')
Left: IParameterReferenceExpression: str (OperationKind.ParameterReferenceExpression, Type: System.String) (Syntax: 'str')
Right: IOperation: (OperationKind.None) (Syntax: 'Mid(str, st ... ngth) = str')
Children(4): IParenthesizedExpression (OperationKind.ParenthesizedExpression, Type: System.String) (Syntax: 'Mid(str, start, length)')
......@@ -591,7 +591,7 @@ End Class]]>.Value
Dim expectedOperationTree = <![CDATA[
IOperation: (OperationKind.None) (Syntax: 'Erase x')
Children(1): IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32()) (Syntax: 'x')
Children(1): ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32()) (Syntax: 'x')
Left: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32()) (Syntax: 'x')
Right: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Int32(), Constant: null) (Syntax: 'x')
ILiteralExpression (OperationKind.LiteralExpression, Type: null, Constant: null) (Syntax: 'Erase x')
......
......@@ -191,11 +191,11 @@ IForLoopStatement (LoopKind.For) (OperationKind.LoopStatement, IsInvalid) (Synta
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i As Integer')
Right: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopLimitValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Int32) (Syntax: '')
Before: IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: '0')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: '0')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: '0')
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i As Integer')
Right: ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: '')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32, IsInvalid) (Syntax: '')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32, IsInvalid) (Syntax: '')
Left: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopLimitValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Int32) (Syntax: '')
Right: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Int32, IsInvalid) (Syntax: '')
IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '')
......@@ -243,17 +243,17 @@ IForLoopStatement (LoopKind.For) (OperationKind.LoopStatement, IsInvalid) (Synta
Left: ILocalReferenceExpression: (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: '')
Right: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopLimitValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Object) (Syntax: '')
Before: IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: '')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Object, IsInvalid) (Syntax: '')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Object, IsInvalid) (Syntax: '')
Left: ILocalReferenceExpression: (OperationKind.LocalReferenceExpression, Type: System.Object) (Syntax: '')
Right: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Object, IsInvalid) (Syntax: '')
IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: '')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Object, IsInvalid) (Syntax: '')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Object, IsInvalid) (Syntax: '')
Left: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopLimitValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Object) (Syntax: '')
Right: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Object, IsInvalid) (Syntax: '')
IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: '')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'For Step (M ... Next')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Object) (Syntax: 'For Step (M ... Next')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Object) (Syntax: 'For Step (M ... Next')
Left: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopStepValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Object) (Syntax: 'For Step (M ... Next')
Right: IConversionExpression (ConversionKind.Basic, Explicit) (OperationKind.ConversionExpression, Type: System.Object) (Syntax: 'For Step (M ... Next')
ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 1) (Syntax: 'For Step (M ... Next')
......@@ -305,16 +305,16 @@ IForLoopStatement (LoopKind.For) (OperationKind.LoopStatement, IsInvalid) (Synta
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i As Integer')
Right: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopLimitValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Int32) (Syntax: 'Program')
Before: IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: '0')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32) (Syntax: '0')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: '0')
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i As Integer')
Right: ILiteralExpression (Text: 0) (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'Program')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32, IsInvalid) (Syntax: 'Program')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32, IsInvalid) (Syntax: 'Program')
Left: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopLimitValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Int32) (Syntax: 'Program')
Right: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Int32, IsInvalid) (Syntax: 'Program')
IOperation: (OperationKind.None, IsInvalid) (Syntax: 'Program')
IExpressionStatement (OperationKind.ExpressionStatement, IsInvalid) (Syntax: 'x')
IAssignmentExpression (OperationKind.AssignmentExpression, Type: System.Int32, IsInvalid) (Syntax: 'x')
ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32, IsInvalid) (Syntax: 'x')
Left: ISyntheticLocalReferenceExpression (SynthesizedLocalKind.ForLoopStepValue) (OperationKind.SyntheticLocalReferenceExpression, Type: System.Int32) (Syntax: 'x')
Right: IConversionExpression (ConversionKind.Basic, Implicit) (OperationKind.ConversionExpression, Type: System.Int32, IsInvalid) (Syntax: 'x')
IInvalidExpression (OperationKind.InvalidExpression, Type: ?, IsInvalid) (Syntax: 'x')
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
......@@ -308,10 +309,27 @@ internal void Disconnect(bool documentIsClosed, bool rollbackTemporaryEdits)
}
}
private Task<LinkedFileMergeSessionResult> ComputeMergeResultAsync(Solution newSolution, CancellationToken cancellationToken)
{
var preMergeSolution = _session._baseSolution;
var diffMergingSession = new LinkedFileDiffMergingSession(preMergeSolution, newSolution, newSolution.GetChanges(preMergeSolution), logSessionInfo: true);
return diffMergingSession.MergeDiffsAsync(mergeConflictHandler: null, cancellationToken: cancellationToken);
}
[Obsolete("Update code to call ComputeMergeResultAsync prior to calling the other overload of ApplyConflictResolutionEdits.")]
internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflictResolution, IEnumerable<Document> documents, CancellationToken cancellationToken)
{
AssertIsForeground();
var mergeResult = ComputeMergeResultAsync(conflictResolution.NewSolution, cancellationToken).WaitAndGetResult(cancellationToken);
ApplyConflictResolutionEdits(conflictResolution, mergeResult, documents, cancellationToken);
}
internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflictResolution, LinkedFileMergeSessionResult mergeResult, IEnumerable<Document> documents, CancellationToken cancellationToken)
{
AssertIsForeground();
if (!AreAllReferenceSpansMappable())
{
// don't dynamically update the reference spans for documents with unmappable projections
......@@ -323,12 +341,6 @@ internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflict
// 1. Undo any previous edits and update the buffer to resulting document after conflict resolution
_session.UndoManager.UndoTemporaryEdits(_subjectBuffer, disconnect: false);
var preMergeSolution = _session._baseSolution;
var postMergeSolution = conflictResolution.NewSolution;
var diffMergingSession = new LinkedFileDiffMergingSession(preMergeSolution, postMergeSolution, postMergeSolution.GetChanges(preMergeSolution), logSessionInfo: true);
var mergeResult = diffMergingSession.MergeDiffsAsync(mergeConflictHandler: null, cancellationToken: cancellationToken).WaitAndGetResult(cancellationToken);
var newDocument = mergeResult.MergedSolution.GetDocument(documents.First().Id);
var originalDocument = _baseDocuments.Single(d => d.Id == newDocument.Id);
......@@ -355,6 +367,88 @@ internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflict
// so they get classified/tagged correctly in the editor.
_conflictResolutionRenameTrackingSpans.Clear();
var documentReplacements = documents
.Select(document => (document, conflictResolution.GetReplacements(document.Id).Where(r => GetRenameSpanKind(r.Kind) != RenameSpanKind.None).ToImmutableArray()))
.ToImmutableArray();
var firstDocumentReplacements = documentReplacements.FirstOrDefault(d => !d.Item2.IsEmpty);
var bufferContainsLinkedDocuments = documentReplacements.Length > 1 && firstDocumentReplacements.document != null;
var linkedDocumentsMightConflict = bufferContainsLinkedDocuments;
if (linkedDocumentsMightConflict)
{
// When changes are made and linked documents are involved, some of the linked documents may
// have changes that differ from others. When these changes conflict (both differ and overlap),
// the inline rename UI reveals the conflicts. However, the merge process for finding these
// conflicts is slow, so we want to avoid it when possible. This code block attempts to set
// linkedDocumentsMightConflict back to false, eliminating the need to merge the changes as part
// of the conflict detection process. Currently we only special case one scenario: ignoring
// documents that have no changes at all, we check if all linked documents have exactly the same
// set of changes.
// 1. Check if all documents have the same replacement spans (or no replacements)
var spansMatch = true;
foreach (var (document, replacements) in documentReplacements)
{
if (document == firstDocumentReplacements.document || replacements.IsEmpty)
{
continue;
}
if (replacements.Length != firstDocumentReplacements.Item2.Length)
{
spansMatch = false;
break;
}
for (var i = 0; i < replacements.Length; i++)
{
if (!replacements[i].Equals(firstDocumentReplacements.Item2[i]))
{
spansMatch = false;
break;
}
}
if (!spansMatch)
{
break;
}
}
// 2. If spans match, check content
if (spansMatch)
{
linkedDocumentsMightConflict = false;
// Only need to check the new span's content
var firstDocumentNewText = conflictResolution.NewSolution.GetDocument(firstDocumentReplacements.document.Id).GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken);
var firstDocumentNewSpanText = firstDocumentReplacements.Item2.SelectAsArray(replacement => firstDocumentNewText.ToString(replacement.NewSpan));
foreach (var (document, replacements) in documentReplacements)
{
if (document == firstDocumentReplacements.document || replacements.IsEmpty)
{
continue;
}
var documentNewText = conflictResolution.NewSolution.GetDocument(document.Id).GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken);
for (var i = 0; i < replacements.Length; i++)
{
if (documentNewText.ToString(replacements[i].NewSpan) != firstDocumentNewSpanText[i])
{
// Have to use the slower merge process
linkedDocumentsMightConflict = true;
break;
}
}
if (linkedDocumentsMightConflict)
{
break;
}
}
}
}
foreach (var document in documents)
{
var relevantReplacements = conflictResolution.GetReplacements(document.Id).Where(r => GetRenameSpanKind(r.Kind) != RenameSpanKind.None);
......@@ -363,8 +457,7 @@ internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflict
continue;
}
var bufferContainsLinkedDocuments = documents.Skip(1).Any();
var mergedReplacements = bufferContainsLinkedDocuments
var mergedReplacements = linkedDocumentsMightConflict
? GetMergedReplacementInfos(
relevantReplacements,
conflictResolution.NewSolution.GetDocument(document.Id),
......@@ -430,6 +523,11 @@ internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflict
}
}
}
if (!linkedDocumentsMightConflict)
{
break;
}
}
UpdateReadOnlyRegions();
......
......@@ -472,14 +472,29 @@ private void QueueApplyReplacements()
}
var asyncToken = _asyncListener.BeginAsyncOperation(nameof(QueueApplyReplacements));
_conflictResolutionTask.SafeContinueWith(
t => ApplyReplacements(t.Result, _conflictResolutionTaskCancellationSource.Token),
_conflictResolutionTaskCancellationSource.Token,
TaskContinuationOptions.OnlyOnRanToCompletion,
ForegroundTaskScheduler).CompletesAsyncOperation(asyncToken);
_conflictResolutionTask
.SafeContinueWith(
t => ComputeMergeResultAsync(t.Result, _conflictResolutionTaskCancellationSource.Token),
_conflictResolutionTaskCancellationSource.Token,
TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.Default)
.Unwrap()
.SafeContinueWith(
t => ApplyReplacements(t.Result.replacementInfo, t.Result.mergeResult, _conflictResolutionTaskCancellationSource.Token),
_conflictResolutionTaskCancellationSource.Token,
TaskContinuationOptions.OnlyOnRanToCompletion,
ForegroundTaskScheduler)
.CompletesAsyncOperation(asyncToken);
}
private async Task<(IInlineRenameReplacementInfo replacementInfo, LinkedFileMergeSessionResult mergeResult)> ComputeMergeResultAsync(IInlineRenameReplacementInfo replacementInfo, CancellationToken cancellationToken)
{
var diffMergingSession = new LinkedFileDiffMergingSession(_baseSolution, replacementInfo.NewSolution, replacementInfo.NewSolution.GetChanges(_baseSolution), logSessionInfo: true);
var mergeResult = await diffMergingSession.MergeDiffsAsync(mergeConflictHandler: null, cancellationToken: cancellationToken).ConfigureAwait(false);
return (replacementInfo, mergeResult);
}
private void ApplyReplacements(IInlineRenameReplacementInfo replacementInfo, CancellationToken cancellationToken)
private void ApplyReplacements(IInlineRenameReplacementInfo replacementInfo, LinkedFileMergeSessionResult mergeResult, CancellationToken cancellationToken)
{
AssertIsForeground();
cancellationToken.ThrowIfCancellationRequested();
......@@ -493,7 +508,7 @@ private void ApplyReplacements(IInlineRenameReplacementInfo replacementInfo, Can
if (documents.Any())
{
var textBufferManager = _openTextBuffers[textBuffer];
textBufferManager.ApplyConflictResolutionEdits(replacementInfo, documents, cancellationToken);
textBufferManager.ApplyConflictResolutionEdits(replacementInfo, mergeResult, documents, cancellationToken);
}
}
......
......@@ -53,7 +53,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
Dim culture = New CultureInfo("tr-TR", useUserOverride:=False)
Dim workspace = New TestWorkspace
Dim helper = CompletionHelper.GetHelper(workspace, LanguageNames.CSharp)
Dim helper = New CompletionHelper(isCaseSensitive:=False)
For Each wordMarkup In wordsToMatch
Dim word As String = Nothing
......@@ -73,7 +73,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
Private Sub TestNotMatches(pattern As String, wordsToNotMatch() As String)
Dim culture = New CultureInfo("tr-TR", useUserOverride:=False)
Dim workspace = New TestWorkspace
Dim helper = CompletionHelper.GetHelper(workspace, LanguageNames.CSharp)
Dim helper = New CompletionHelper(isCaseSensitive:=True)
For Each word In wordsToNotMatch
Dim item = CompletionItem.Create(word)
Assert.False(helper.MatchesPattern(item.FilterText, pattern, culture), $"Unexpected item {word} matches {pattern}")
......
......@@ -74,6 +74,7 @@ private static Type[] GetNeutralAndCSharpAndVisualBasicTypes()
typeof(VisualBasic.LanguageServices.VisualBasicContentTypeLanguageService),
typeof(CodeAnalysis.CSharp.Execution.CSharpOptionsSerializationService),
typeof(CodeAnalysis.VisualBasic.Execution.VisualBasicOptionsSerializationService),
typeof(CodeAnalysis.Execution.DesktopReferenceSerializationServiceFactory),
typeof(TestExportProvider)
};
......
......@@ -12,9 +12,6 @@ namespace Microsoft.CodeAnalysis.Completion
{
internal sealed class CompletionHelper
{
private static readonly CompletionHelper CaseSensitiveInstance = new CompletionHelper(isCaseSensitive: true);
private static readonly CompletionHelper CaseInsensitiveInstance = new CompletionHelper(isCaseSensitive: false);
private readonly object _gate = new object();
private readonly Dictionary<(string pattern, CultureInfo, bool includeMatchedSpans), PatternMatcher> _patternMatcherMap =
new Dictionary<(string pattern, CultureInfo, bool includeMatchedSpans), PatternMatcher>();
......@@ -22,31 +19,19 @@ internal sealed class CompletionHelper
private static readonly CultureInfo EnUSCultureInfo = new CultureInfo("en-US");
private readonly bool _isCaseSensitive;
private CompletionHelper(bool isCaseSensitive)
public CompletionHelper(bool isCaseSensitive)
{
_isCaseSensitive = isCaseSensitive;
}
public static CompletionHelper GetHelper(Workspace workspace, string language)
{
var isCaseSensitive = true;
var ls = workspace.Services.GetLanguageServices(language);
if (ls != null)
{
var syntaxFacts = ls.GetService<ISyntaxFactsService>();
isCaseSensitive = syntaxFacts?.IsCaseSensitive ?? true;
}
return isCaseSensitive ? CaseSensitiveInstance : CaseInsensitiveInstance;
}
public static CompletionHelper GetHelper(Document document)
{
return GetHelper(document.Project.Solution.Workspace, document.Project.Language);
return document.Project.Solution.Workspace.Services.GetService<ICompletionHelperService>()
.GetCompletionHelper(document);
}
public ImmutableArray<TextSpan> GetHighlightedSpans(
string text, string pattern, CultureInfo culture)
string text, string pattern, CultureInfo culture)
{
var match = GetMatch(text, pattern, includeMatchSpans: true, culture: culture);
return match == null ? ImmutableArray<TextSpan>.Empty : match.Value.MatchedSpans;
......@@ -97,7 +82,7 @@ public bool MatchesPattern(string text, string pattern, CultureInfo culture)
: value.WithMatchedSpans(value.MatchedSpans.SelectAsArray(s => new TextSpan(s.Start + offset, s.Length)));
private PatternMatch? GetMatchWorker(
string completionItemText, string pattern,
string completionItemText, string pattern,
CultureInfo culture, bool includeMatchSpans)
{
var patternMatcher = this.GetPatternMatcher(pattern, culture, includeMatchSpans);
......
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Composition;
using System.Globalization;
using System.Text;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Completion
{
[ExportWorkspaceServiceFactory(typeof(ICompletionHelperService)), Shared]
internal class CompletionHelperServiceFactory : IWorkspaceServiceFactory
{
public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices)
{
return new Service(workspaceServices.Workspace);
}
private class Service : ICompletionHelperService, IWorkspaceService
{
private readonly object _gate = new object();
private CompletionHelper _caseSensitiveInstance;
private CompletionHelper _caseInsensitiveInstance;
public Service(Workspace workspace)
{
workspace.WorkspaceChanged += OnWorkspaceChanged;
}
public CompletionHelper GetCompletionHelper(Document document)
{
lock (_gate)
{
// Don't bother creating instances unless we actually need them
if (_caseSensitiveInstance == null)
{
CreateInstances();
}
var syntaxFacts = document.GetLanguageService<ISyntaxFactsService>();
var caseSensitive = syntaxFacts?.IsCaseSensitive ?? true;
return caseSensitive
? this._caseSensitiveInstance
: this._caseInsensitiveInstance;
}
}
private void CreateInstances()
{
this._caseSensitiveInstance = new CompletionHelper(isCaseSensitive: true);
this._caseInsensitiveInstance = new CompletionHelper(isCaseSensitive: false);
}
private void OnWorkspaceChanged(object sender, WorkspaceChangeEventArgs e)
{
if (e.Kind == WorkspaceChangeKind.SolutionRemoved)
{
lock (_gate)
{
// Solution was unloaded, clear caches if we were caching anything
if (_caseSensitiveInstance != null)
{
CreateInstances();
}
}
}
}
}
}
}
using System.Collections.Immutable;
using System.Globalization;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Completion
{
internal interface ICompletionHelperService : IWorkspaceService
{
CompletionHelper GetCompletionHelper(Document document);
}
}
\ No newline at end of file
......@@ -225,7 +225,7 @@ public async Task SaveAsync(Project project, DiagnosticAnalysisResult result)
await SerializeAsync(serializer, project, result.ProjectId, _owner.NonLocalStateName, result.Others).ConfigureAwait(false);
AnalyzerABTestLogger.LogProjectDiagnostics(project, result);
AnalyzerABTestLogger.LogProjectDiagnostics(project, _owner.StateName, result);
}
public void ResetVersion()
......@@ -244,7 +244,7 @@ public async Task MergeAsync(ActiveFileState state, Document document)
var syntax = state.GetAnalysisData(AnalysisKind.Syntax);
var semantic = state.GetAnalysisData(AnalysisKind.Semantic);
AnalyzerABTestLogger.LogDocumentDiagnostics(document, syntax.Items, semantic.Items);
AnalyzerABTestLogger.LogDocumentDiagnostics(document, _owner.StateName, syntax.Items, semantic.Items);
var project = document.Project;
......
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册