private IEnumerable <ISymbol> GetAssignedFieldsFromType(TypeDeclarationWithSymbol typeDeclarationWithSymbol, SemanticModel model) { var typeDeclaration = typeDeclarationWithSymbol.TypeDeclaration; var descendants = typeDeclaration.DescendantNodes(p => SkipNestedTypes(typeDeclaration, p)); return(descendants .OfType <AssignmentExpressionSyntax>() .Select(s => s.Left) .Union( descendants .OfType <PostfixUnaryExpressionSyntax>() .Select(s => s.Operand)) .Union( descendants .OfType <PrefixUnaryExpressionSyntax>() .Select(s => s.Operand) ) .Union( descendants .OfType <InvocationExpressionSyntax>() .SelectMany(s => s.ArgumentList.Arguments.Where(p => !p.RefOrOutKeyword.IsKind(SyntaxKind.None))) .Select(s => s.Expression) ) .Select(s => new { Symbol = model.GetSymbolInfo(s).Symbol, Expression = s }) .Where(p => p.Symbol != null) .Where(p => SkipFieldsFromItsOwnConstructor(typeDeclarationWithSymbol, p.Expression, p.Symbol)) .Select(s => s.Symbol)); }
private void CaptureAssignedFields(TypeDeclarationSyntax typeDeclaration, SemanticModel semanticModel, List <ISymbol> assignedFields) { var t = new TypeDeclarationWithSymbol { TypeDeclaration = typeDeclaration, NamedTypeSymbol = semanticModel.GetDeclaredSymbol(typeDeclaration) }; var fields = GetAssignedFieldsFromType(t, semanticModel); assignedFields.AddRange(fields); }
private bool SkipFieldsFromItsOwnConstructor(TypeDeclarationWithSymbol type, ExpressionSyntax assignmentExpression, ISymbol assignmentSymbol) { var parentConstructor = assignmentExpression.Ancestors().OfType <ConstructorDeclarationSyntax>().FirstOrDefault(); if (parentConstructor == null) { return(true); } return (assignmentSymbol.ContainingType != type.NamedTypeSymbol || assignmentSymbol.IsStatic != parentConstructor.Modifiers.Any(p => p.IsKind(SyntaxKind.StaticKeyword))); }
private static IEnumerable<ISymbol> GetAssignedFieldsFromType(TypeDeclarationWithSymbol typeDeclarationWithSymbol, SemanticModel model) { var typeDeclaration = typeDeclarationWithSymbol.TypeDeclaration; var descendants = typeDeclaration.DescendantNodes(p => SkipNestedTypes(typeDeclaration, p)); return descendants .OfType<AssignmentExpressionSyntax>() .Select(s => s.Left) .Union( descendants .OfType<PostfixUnaryExpressionSyntax>() .Select(s => s.Operand)) .Union( descendants .OfType<PrefixUnaryExpressionSyntax>() .Select(s => s.Operand) ) .Union( descendants .OfType<InvocationExpressionSyntax>() .SelectMany(s => s.ArgumentList.Arguments.Where(p => !p.RefOrOutKeyword.IsKind(SyntaxKind.None))) .Select(s => s.Expression) ) .Select(s => new { Symbol = model.GetSymbolInfo(s).Symbol, Expression = s }) .Where(p => p.Symbol != null) .Where(p => SkipFieldsFromItsOwnConstructor(typeDeclarationWithSymbol, p.Expression, p.Symbol)) .Select(s => s.Symbol); }
private static void CaptureAssignedFields(TypeDeclarationSyntax typeDeclaration, SemanticModel semanticModel, List<ISymbol> assignedFields) { var t = new TypeDeclarationWithSymbol { TypeDeclaration = typeDeclaration, NamedTypeSymbol = semanticModel.GetDeclaredSymbol(typeDeclaration) }; var fields = GetAssignedFieldsFromType(t, semanticModel); assignedFields.AddRange(fields); }
private static bool SkipFieldsFromItsOwnConstructor(TypeDeclarationWithSymbol type, ExpressionSyntax assignmentExpression, ISymbol assignmentSymbol) { var parentConstructor = assignmentExpression.Ancestors().OfType<ConstructorDeclarationSyntax>().FirstOrDefault(); if (parentConstructor == null) return true; return assignmentSymbol.ContainingType != type.NamedTypeSymbol || assignmentSymbol.IsStatic != parentConstructor.Modifiers.Any(p => p.IsKind(SyntaxKind.StaticKeyword)); }