提交 2da7f5b9 编写于 作者: C CyrusNajmabadi

Simpler implementation.

上级 f515ef87
......@@ -114,19 +114,25 @@ private void AnalyzeOperation(OperationAnalysisContext context)
}
// We found an assignment using this local/parameter. Now, just make sure there
// were no intervening writes between the check and the assignement.
var dataFlow = semanticModel.AnalyzeDataFlow(
ifOperation.Syntax, expressionStatement.Syntax);
// were no intervening accesses between the check and the assignment.
var statements = containingBlock.Statements;
var ifOperationIndex = statements.IndexOf(ifOperation);
var expressionStatementIndex = statements.IndexOf(expressionStatement);
if (dataFlow.WrittenInside.Contains(localOrParameter))
if (expressionStatementIndex > ifOperationIndex + 1)
{
return;
}
// There are intermediary statements between the check and the assignment.
// Make sure they don't try to access the local.
var dataFlow = semanticModel.AnalyzeDataFlow(
statements[ifOperationIndex + 1].Syntax,
statements[expressionStatementIndex - 1].Syntax);
if (ContainsMemberAccess(containingBlock, ifOperation, expressionStatement, localOrParameter))
if (dataFlow.ReadInside.Contains(localOrParameter) ||
dataFlow.WrittenInside.Contains(localOrParameter))
{
return;
}
}
// Ok, there were no intervening writes or accesses. This check+assignment can be simplified.
......@@ -162,33 +168,6 @@ private void AnalyzeOperation(OperationAnalysisContext context)
}
}
private bool ContainsMemberAccess(
IBlockStatement containingBlock, IIfStatement ifOperation,
IExpressionStatement expressionStatement, ISymbol localOrParameter)
{
var syntaxFacts = this.GetSyntaxFactsService();
var ifIndex = containingBlock.Statements.IndexOf(ifOperation);
var expressionStatementIndex = containingBlock.Statements.IndexOf(expressionStatement);
for (var i = ifIndex + 1; i <= expressionStatementIndex; i++)
{
var currentStatement = containingBlock.Statements[i];
var statementSyntax = currentStatement.Syntax;
foreach (var token in statementSyntax.DescendantTokens())
{
if (syntaxFacts.IsIdentifier(token) &&
syntaxFacts.IsExpressionOfMemberAccessExpression(token.Parent) &&
token.ValueText == localOrParameter.Name)
{
return true;
}
}
}
return false;
}
protected abstract ISyntaxFactsService GetSyntaxFactsService();
private bool TryFindAssignmentExpression(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册