public static void FieldPrivateCtorCalledByInitializer(SearchScope scope) { var code = @" namespace N { internal class C { public static readonly C Default = new C(); private readonly int value; private C() { this.value = 1; } } }"; var syntaxTree = CSharpSyntaxTree.ParseText(code); var compilation = CSharpCompilation.Create("test", new[] { syntaxTree }, MetadataReferences.FromAttributes()); var semanticModel = compilation.GetSemanticModel(syntaxTree); var field = semanticModel.GetDeclaredSymbolSafe(syntaxTree.FindFieldDeclaration("private readonly int value"), CancellationToken.None); var bar = syntaxTree.FindTypeDeclaration("C"); Assert.AreEqual(true, AssignmentExecutionWalker.FirstFor(field, bar, scope, semanticModel, CancellationToken.None, out var result)); Assert.AreEqual("this.value = 1", result.ToString()); Assert.AreEqual(true, AssignmentExecutionWalker.SingleFor(field, bar, scope, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.value = 1", result.ToString()); using (var walker = AssignmentExecutionWalker.For(field, bar, scope, semanticModel, CancellationToken.None)) { Assert.AreEqual("this.value = 1", walker.Assignments.Single().ToString()); } }
public static void FieldWithCtorArg(SearchScope scope) { var code = @" namespace N { internal class C { private readonly int value; internal C(int arg) { this.value = arg; } } }"; var syntaxTree = CSharpSyntaxTree.ParseText(code); var compilation = CSharpCompilation.Create("test", new[] { syntaxTree }, MetadataReferences.FromAttributes()); var semanticModel = compilation.GetSemanticModel(syntaxTree); var value = syntaxTree.FindMemberAccessExpression("this.value"); var ctor = syntaxTree.FindConstructorDeclaration("C(int arg)"); var field = semanticModel.GetSymbolSafe(value, CancellationToken.None); Assert.AreEqual(true, AssignmentExecutionWalker.FirstFor(field, ctor, scope, semanticModel, CancellationToken.None, out var result)); Assert.AreEqual("this.value = arg", result.ToString()); Assert.AreEqual(true, AssignmentExecutionWalker.SingleFor(field, ctor, scope, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.value = arg", result.ToString()); using (var walker = AssignmentExecutionWalker.For(field, ctor, scope, semanticModel, CancellationToken.None)) { Assert.AreEqual("this.value = arg", walker.Assignments.Single().ToString()); } }
public void FieldWithCtorArgViaProperty(Scope scope) { 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.FindMemberAccessExpression("this.number"); var ctor = syntaxTree.FindConstructorDeclaration("Foo(int arg)"); AssignmentExpressionSyntax result; var field = semanticModel.GetSymbolSafe(value, CancellationToken.None); if (scope != Scope.Member) { Assert.AreEqual(true, AssignmentExecutionWalker.FirstFor(field, ctor, scope, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.number = value", result.ToString()); Assert.AreEqual(true, AssignmentExecutionWalker.SingleFor(field, ctor, scope, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.number = value", result.ToString()); using (var walker = AssignmentExecutionWalker.For(field, ctor, scope, semanticModel, CancellationToken.None)) { Assert.AreEqual("this.number = value", walker.Assignments.Single().ToString()); } } else { Assert.AreEqual(false, AssignmentExecutionWalker.FirstFor(field, ctor, scope, semanticModel, CancellationToken.None, out result)); } }
internal static bool AssignsSymbolInSetter(IPropertySymbol property, ISymbol symbol, SemanticModel semanticModel, CancellationToken cancellationToken) { var setMethod = property?.SetMethod; if (setMethod == null || setMethod.DeclaringSyntaxReferences.Length == 0) { return(false); } if (TryGetSetter(property, cancellationToken, out AccessorDeclarationSyntax setter)) { if (AssignmentExecutionWalker.FirstFor(symbol, setter, Scope.Instance, semanticModel, cancellationToken, out _)) { return(true); } } return(false); }
public static void FieldInPropertyExpressionBody(SearchScope scope) { var code = @" namespace N { internal class C { private int number; internal C() { var i = this.Number; } public int Number => this.number = 3; } }"; var syntaxTree = CSharpSyntaxTree.ParseText(code); var compilation = CSharpCompilation.Create("test", new[] { syntaxTree }, MetadataReferences.FromAttributes()); var semanticModel = compilation.GetSemanticModel(syntaxTree); var value = syntaxTree.FindMemberAccessExpression("this.number"); var ctor = syntaxTree.FindConstructorDeclaration("C()"); AssignmentExpressionSyntax result; var field = semanticModel.GetSymbolSafe(value, CancellationToken.None); if (scope != SearchScope.Member) { Assert.AreEqual(true, AssignmentExecutionWalker.FirstFor(field, ctor, scope, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.number = 3", result.ToString()); Assert.AreEqual(true, AssignmentExecutionWalker.SingleFor(field, ctor, scope, semanticModel, CancellationToken.None, out result)); Assert.AreEqual("this.number = 3", result.ToString()); using (var walker = AssignmentExecutionWalker.For(field, ctor, scope, semanticModel, CancellationToken.None)) { Assert.AreEqual("this.number = 3", walker.Assignments.Single().ToString()); } } else { Assert.AreEqual(false, AssignmentExecutionWalker.FirstFor(field, ctor, scope, semanticModel, CancellationToken.None, out _)); } }