public void FieldInPropertyExpressionBody(Search search) { var testCode = @" namespace RoslynSandbox { internal class Foo { private int number; internal Foo() { var i = this.Number; } public int Number => this.number = 3; } }"; var syntaxTree = CSharpSyntaxTree.ParseText(testCode); var compilation = CSharpCompilation.Create("test", new[] { syntaxTree }, MetadataReferences.FromAttributes()); var semanticModel = compilation.GetSemanticModel(syntaxTree); var value = syntaxTree.FindMemberAccessExpression("this.number"); var ctor = syntaxTree.FindConstructorDeclaration("Foo()"); AssignmentExpressionSyntax result; var field = semanticModel.GetSymbolSafe(value, CancellationToken.None); if (search == Search.Recursive) { Assert.AreEqual(true, AssignmentWalker.FirstForSymbol(field, ctor, Search.Recursive, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.number = 3", result?.ToString()); } else { Assert.AreEqual(false, AssignmentWalker.FirstForSymbol(field, ctor, Search.TopLevel, semanticModel, CancellationToken.None, out result)); } }
public void FieldWithCtorArg(Search search) { var testCode = @" namespace RoslynSandbox { internal class Foo { private readonly int value; internal Foo(int arg) { this.value = arg; } } }"; var syntaxTree = CSharpSyntaxTree.ParseText(testCode); var compilation = CSharpCompilation.Create("test", new[] { syntaxTree }, MetadataReferences.FromAttributes()); var semanticModel = compilation.GetSemanticModel(syntaxTree); var value = syntaxTree.FindMemberAccessExpression("this.value"); var ctor = syntaxTree.FindConstructorDeclaration("Foo(int arg)"); var field = semanticModel.GetSymbolSafe(value, CancellationToken.None); Assert.AreEqual(true, AssignmentWalker.FirstForSymbol(field, ctor, search, semanticModel, CancellationToken.None, out var result)); Assert.AreEqual("this.value = arg", result?.ToString()); }
public void FieldWithCtorArgViaProperty(Search search) { var testCode = @" namespace RoslynSandbox { internal class Foo { private int number; internal Foo(int arg) { this.Number = arg; } public int Number { get { return this.number; } set { this.number = value; } } } }"; var syntaxTree = CSharpSyntaxTree.ParseText(testCode); var compilation = CSharpCompilation.Create("test", new[] { syntaxTree }, MetadataReferences.FromAttributes()); var semanticModel = compilation.GetSemanticModel(syntaxTree); var value = syntaxTree.FindBestMatch <ParameterSyntax>("arg"); var ctor = syntaxTree.FindConstructorDeclaration("Foo(int arg)"); AssignmentExpressionSyntax result; var symbol = semanticModel.GetDeclaredSymbolSafe(value, CancellationToken.None); if (search == Search.Recursive) { Assert.AreEqual(true, AssignmentWalker.FirstWith(symbol, ctor, Search.Recursive, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.Number = arg", result?.ToString()); } else { Assert.AreEqual(false, AssignmentWalker.FirstForSymbol(symbol, ctor, Search.TopLevel, semanticModel, CancellationToken.None, out result)); } }
public void FieldWithChainedCtorArg(Search search) { var testCode = @" namespace RoslynSandbox { internal class Foo { private readonly int value; public Foo() : this(1) { } internal Foo(int arg) { this.value = arg; } } }"; var syntaxTree = CSharpSyntaxTree.ParseText(testCode); var compilation = CSharpCompilation.Create("test", new[] { syntaxTree }, MetadataReferences.FromAttributes()); var semanticModel = compilation.GetSemanticModel(syntaxTree); var value = syntaxTree.BestMatch <MemberAccessExpressionSyntax>("this.value"); var ctor = syntaxTree.BestMatch <ConstructorDeclarationSyntax>("Foo()"); AssignmentExpressionSyntax result; var field = semanticModel.GetSymbolSafe(value, CancellationToken.None); if (search == Search.Recursive) { Assert.AreEqual(true, AssignmentWalker.FirstForSymbol(field, ctor, Search.Recursive, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.value = arg", result?.ToString()); } else { Assert.AreEqual(false, AssignmentWalker.FirstForSymbol(field, ctor, Search.TopLevel, semanticModel, CancellationToken.None, out result)); } }