public override bool IsMatch(MatchState state, Node node) {
                if (node.GetType() != typeof(Lookup)) {
                    return NoMatch;
                }

                Lookup member = (Lookup)node;
                object lookupName;
                if (!state.TryGetState(_lookup, out lookupName) ||
                    member.Name != (string)lookupName) {
                    return NoMatch;
                }

                return true;
            }
            public override bool IsMatch(MatchState state, Node node) {
                if (node.GetType() != typeof(Lookup)) {
                    return NoMatch;
                }

                object field;
                if (state.TryGetState(_decl, out field)) {
                    var curField = ((Lookup)node).VariableField;
                    while (curField != null) {
                        if (curField == field) {
                            return true;
                        }
                        curField = curField.OuterField;
                    }
                }
                return NoMatch;
            }