コード例 #1
0
        public override void VisitIdentifierName(IdentifierNameSyntax node)
        {
            if (symbols.FirstOrDefault(x => node.NameIs(x.Name) && x.Equals(semanticModel.GetSymbolInfo(node).Symbol)) is { } symbol)
            {
                isMuted = IsInTupleAssignmentTarget() || IsUsedInLocalFunction(symbol) || IsInUnsupportedExpression();
                InspectTryCatch(node);
            }
            base.VisitIdentifierName(node);

            bool IsInTupleAssignmentTarget() =>
            node.Parent is ArgumentSyntax argument && argument.IsInTupleAssignmentTarget();

            bool IsUsedInLocalFunction(ISymbol symbol) =>
            // We don't mute it if it's declared and used in local function
            !(symbol.ContainingSymbol is IMethodSymbol containingSymbol && containingSymbol.MethodKind == MethodKindEx.LocalFunction) &&
            HasAncestor(node, SyntaxKindEx.LocalFunctionStatement);

            bool IsInUnsupportedExpression() =>
            node.FirstAncestorOrSelf <SyntaxNode>(x => x.IsAnyKind(SyntaxKindEx.IndexExpression, SyntaxKindEx.RangeExpression)) != null;
        }