private void AddToMap(SyntaxNode node, Binder binder) { // If this ever breaks, make sure that all callers of // CanHaveAssociatedLocalBinder are in sync. Debug.Assert( node.CanHaveAssociatedLocalBinder() || (node == _root && node is ExpressionSyntax) ); // Cleverness: for some nodes (e.g. lock), we want to specify a binder flag that // applies to the embedded statement, but not to the entire node. Since the // embedded statement may or may not have its own binder, we need a way to ensure // that the flag is set regardless. We accomplish this by adding a binder for // the embedded statement immediately, and then overwriting it with one constructed // in the usual way, if there is such a binder. That's why we're using update, // rather than add, semantics. Binder existing; // Note that a lock statement has two outer binders (a second one for pattern variable scope) Debug.Assert( !_map.TryGetValue(node, out existing) || existing == binder || existing == binder.Next || existing == binder.Next?.Next ); _map[node] = binder; }
private void AddToMap(SyntaxNode node, Binder binder) { // If this ever breaks, make sure that all callers of // CanHaveAssociatedLocalBinder are in sync. Debug.Assert(node.CanHaveAssociatedLocalBinder() || (node == _root && node is ExpressionSyntax)); // Cleverness: for some nodes (e.g. lock), we want to specify a binder flag that // applies to the embedded statement, but not to the entire node. Since the // embedded statement may or may not have its own binder, we need a way to ensure // that the flag is set regardless. We accomplish this by adding a binder for // the embedded statement immediately, and then overwriting it with one constructed // in the usual way, if there is such a binder. That's why we're using update, // rather than add, semantics. Binder existing; // Note that a lock statement has two outer binders (a second one for pattern variable scope) Debug.Assert(!_map.TryGetValue(node, out existing) || existing == binder || existing == binder.Next || existing == binder.Next?.Next); _map[node] = binder; }