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

Simpler implementation.

上级 f515ef87
...@@ -114,19 +114,25 @@ private void AnalyzeOperation(OperationAnalysisContext context) ...@@ -114,19 +114,25 @@ private void AnalyzeOperation(OperationAnalysisContext context)
} }
// We found an assignment using this local/parameter. Now, just make sure there // We found an assignment using this local/parameter. Now, just make sure there
// were no intervening writes between the check and the assignement. // were no intervening accesses between the check and the assignment.
var dataFlow = semanticModel.AnalyzeDataFlow( var statements = containingBlock.Statements;
ifOperation.Syntax, expressionStatement.Syntax); 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; return;
} }
}
// Ok, there were no intervening writes or accesses. This check+assignment can be simplified. // Ok, there were no intervening writes or accesses. This check+assignment can be simplified.
...@@ -162,33 +168,6 @@ private void AnalyzeOperation(OperationAnalysisContext context) ...@@ -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(); protected abstract ISyntaxFactsService GetSyntaxFactsService();
private bool TryFindAssignmentExpression( private bool TryFindAssignmentExpression(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册