in DataExtraction/SourceGraphExtractionUtils/Utils/RoslynUtils.cs [166:255]
public static Dictionary<SyntaxNode, SyntaxToken> CreateNodeToTokenMap(SemanticModel semanticModel,
Dictionary<SyntaxToken, ISymbol> variableTokens,
IEnumerable<SyntaxNode> nodes)
{
var nodesToTokens = new Dictionary<SyntaxNode, SyntaxToken>();
foreach (var syntaxNode in nodes)
{
SyntaxToken token;
switch (syntaxNode)
{
case PropertyDeclarationSyntax propDecl:
token = propDecl.Identifier;
break;
case VariableDeclaratorSyntax varDecl:
token = varDecl.Identifier;
break;
case ParameterSyntax parSyn:
token = parSyn.Identifier;
break;
case MethodDeclarationSyntax methodDecl:
continue;
case AssignmentExpressionSyntax assignExpr:
SyntaxNode baseExpr = assignExpr.Left;
bool visit = true;
while (visit)
{
visit = false;
if (baseExpr is ElementAccessExpressionSyntax access)
{
baseExpr = access.Expression;
visit = true;
}
else if (baseExpr is PrefixUnaryExpressionSyntax prefSyn)
{
baseExpr = prefSyn.Operand;
visit = true;
}
else if (baseExpr is CastExpressionSyntax castExpr)
{
baseExpr = castExpr.Expression;
visit = true;
}
}
var symbol = semanticModel.GetSymbolInfo(baseExpr).Symbol;
var tokens = baseExpr.DescendantTokens()
.Where(t => variableTokens.ContainsKey(t) && (symbol == null || t.Text.Equals(symbol.Name))).ToArray();
if (tokens.Length == 1) token = tokens[0];
else continue;
break;
case AccessorDeclarationSyntax accessorSyn:
var parent = accessorSyn.Parent.Parent;
switch (parent)
{
case PropertyDeclarationSyntax parentProperty:
token = parentProperty.Identifier;
break;
case IndexerDeclarationSyntax indexerProperty:
token = indexerProperty.ThisKeyword;
break;
case EventDeclarationSyntax eventParent:
token = eventParent.Identifier;
break;
default:
throw new Exception("Should not happen: " + parent.GetType());
}
break;
case ForEachStatementSyntax foreachSyn:
token = foreachSyn.Identifier;
break;
default:
var nodeTokens = syntaxNode.DescendantTokens().Where(t => variableTokens.ContainsKey(t)).ToList();
if (nodeTokens.Count == 1)
{
token = nodeTokens[0];
}
else if (nodeTokens.Count == 0)
{
continue;
}
else
{
throw new Exception("This shouldn't happen");
}
break;
}
nodesToTokens.Add(syntaxNode, token);
}
return nodesToTokens;
}