//Returns the valueClause of the return statement from SupportedDiagnostics and the return declaration, empty list if failed private SuppDiagReturnSymbolInfo SuppDiagReturnSymbol(CompilationAnalysisContext context, SymbolInfo returnSymbolInfo, Location getAccessorKeywordLocation, PropertyDeclarationSyntax propertyDeclaration) { SuppDiagReturnSymbolInfo result = new SuppDiagReturnSymbolInfo(); ILocalSymbol returnSymbol = null; if (returnSymbolInfo.CandidateSymbols.Count() == 0) { returnSymbol = returnSymbolInfo.Symbol as ILocalSymbol; } else { returnSymbol = returnSymbolInfo.CandidateSymbols[0] as ILocalSymbol; } if (returnSymbol == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, getAccessorKeywordLocation); return result; } var variableDeclaration = returnSymbol.DeclaringSyntaxReferences[0].GetSyntax() as VariableDeclaratorSyntax; ReturnStatementSyntax returnDeclaration = returnSymbol.DeclaringSyntaxReferences[0].GetSyntax() as ReturnStatementSyntax; if (variableDeclaration == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, returnSymbol.Locations[0]); return result; } var equalsValueClause = variableDeclaration.Initializer as EqualsValueClauseSyntax; if (equalsValueClause == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, variableDeclaration.GetLocation()); return result; } var valueClause = equalsValueClause.Value as InvocationExpressionSyntax; if (valueClause == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, variableDeclaration.GetLocation()); return result; } var valueClauseMemberAccess = valueClause.Expression as MemberAccessExpressionSyntax; if (valueClauseMemberAccess == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, valueClause.GetLocation()); return result; } var valueClauseExpression = valueClauseMemberAccess.Expression as IdentifierNameSyntax; if (valueClauseExpression == null || valueClauseExpression.Identifier.Text != "ImmutableArray") { ReportDiagnostic(context, IncorrectAccessorReturnRule, valueClause.GetLocation()); return result; } var valueClauseName = valueClauseMemberAccess.Name as IdentifierNameSyntax; if (valueClauseName == null || valueClauseName.Identifier.Text != "Create") { ReportDiagnostic(context, SuppDiagReturnValueRule, valueClauseName.GetLocation(), propertyDeclaration.Identifier.Text); return result; } result.ValueClause = valueClause; result.ReturnDeclaration = returnDeclaration; return result; }
//returns the valueClause of the return statement from SupportedDiagnostics and the return declaration, empty list if failed internal SuppDiagReturnSymbolInfo SuppDiagReturnSymbol(CompilationAnalysisContext context, SymbolInfo returnSymbolInfo, Location getAccessorKeywordLocation) { SuppDiagReturnSymbolInfo result = new SuppDiagReturnSymbolInfo(); ILocalSymbol returnSymbol = null; if (returnSymbolInfo.CandidateSymbols.Count() == 0) { returnSymbol = returnSymbolInfo.Symbol as ILocalSymbol; } else { returnSymbol = returnSymbolInfo.CandidateSymbols[0] as ILocalSymbol; } if (returnSymbol == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, getAccessorKeywordLocation); return result; } if (returnSymbol.Type.ToString() != "System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.DiagnosticDescriptor>" && returnSymbol.Type.Kind.ToString() != "ErrorType") { ReportDiagnostic(context, IncorrectAccessorReturnRule, returnSymbol.Locations[0]); return result; } var variableDeclaration = returnSymbol.DeclaringSyntaxReferences[0].GetSyntax() as VariableDeclaratorSyntax; ReturnStatementSyntax returnDeclaration = returnSymbol.DeclaringSyntaxReferences[0].GetSyntax() as ReturnStatementSyntax; if (variableDeclaration == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, returnSymbol.Locations[0]); return result; } var equalsValueClause = variableDeclaration.Initializer as EqualsValueClauseSyntax; if (equalsValueClause == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, returnDeclaration.ReturnKeyword.GetLocation()); return result; } var valueClause = equalsValueClause.Value as InvocationExpressionSyntax; if (valueClause == null) { ReportDiagnostic(context, IncorrectAccessorReturnRule, returnDeclaration.GetLocation()); return result; } result.ValueClause = valueClause; result.ReturnDeclaration = returnDeclaration; return result; }