Skip to content

Instantly share code, notes, and snippets.

@controlflow
Last active August 15, 2018 13:52
Show Gist options
  • Save controlflow/70af3a10a3265dffea0dfb3fa53d82ec to your computer and use it in GitHub Desktop.
Save controlflow/70af3a10a3265dffea0dfb3fa53d82ec to your computer and use it in GitHub Desktop.
public bool HasReference(ITreeNode element, IReferenceNameContainer names)
{
var argument = element as ICSharpArgument;
if (argument != null)
{
var literal = argument.Value.GetOperandThroughParenthesis() as ICSharpLiteralExpression;
if (literal == null) return false;
if (!IsStringLiteralExpression(literal)) return false;
return literal.ConstantValue.Value is string value && names.Contains(value);
}
var literalExpression = element as ICSharpLiteralExpression;
if (literalExpression != null)
{
if (!IsStringLiteralExpression(literalExpression)) return false;
var outerArgument = CSharpArgumentNavigator.GetByValue(GetContainingConcatenationExpression(literalExpression));
var attribute = AttributeNavigator.GetByArgument(outerArgument);
if (attribute == null) return false;
return literalExpression.ConstantValue.Value is string value && names.HasAnyNameIn(value);
}
var assignmentExpression = element as IAssignmentExpression;
if (assignmentExpression != null)
{
var literal = assignmentExpression.Source as ICSharpLiteralExpression;
if (literal == null) return false;
if (!IsStringLiteralExpression(literal)) return false;
return literal.ConstantValue.Value is string value && names.Contains(value);
}
return false;
}
public bool HasReference(ITreeNode element, IReferenceNameContainer names)
{
switch (element)
{
case ICSharpArgument argument:
{
var literal = argument.Value.GetOperandThroughParenthesis() as ICSharpLiteralExpression;
if (literal == null) return false;
if (!IsStringLiteralExpression(literal)) return false;
return literal.ConstantValue.Value is string value && names.Contains(value);
}
case ICSharpLiteralExpression literalExpression when !IsStringLiteralExpression(literalExpression):
return false;
case ICSharpLiteralExpression literalExpression:
{
var outerArgument = CSharpArgumentNavigator.GetByValue(GetContainingConcatenationExpression(literalExpression));
var attribute = AttributeNavigator.GetByArgument(outerArgument);
if (attribute == null) return false;
return literalExpression.ConstantValue.Value is string value && names.HasAnyNameIn(value);
}
case IAssignmentExpression assignmentExpression:
{
var literal = assignmentExpression.Source as ICSharpLiteralExpression;
if (literal == null) return false;
if (!IsStringLiteralExpression(literal)) return false;
return literal.ConstantValue.Value is string value && names.Contains(value);
}
default:
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment