001/*
002 * Copyright (C) 2009-2011 Mathias Doenitz
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.parboiled.support;
018
019import org.parboiled.common.ConsoleSink;
020import org.parboiled.common.Sink;
021import org.parboiled.common.StringUtils;
022
023import java.util.LinkedList;
024
025public class DebuggingValueStack<V> extends DefaultValueStack<V> {
026    public final Sink<String> log;
027    
028    public DebuggingValueStack() {
029        this(new ConsoleSink());
030    }
031    
032    public DebuggingValueStack(Sink<String> log) {
033        this.log = log;
034    }
035
036    public DebuggingValueStack(Iterable<V> values) {
037        this(values, new ConsoleSink());
038    }
039    
040    public DebuggingValueStack(Iterable<V> values, Sink<String> log) {
041        super(values);
042        this.log = log;
043    }
044
045    @Override
046    public void clear() {
047        if (head != null) {
048            super.clear();
049            log("clear");
050        }
051    }
052
053    @Override
054    public void restoreSnapshot(Object snapshot) {
055        if (head == null && snapshot == null || head != null && head.equals(snapshot)) return;
056        super.restoreSnapshot(snapshot);
057        log("restoreSnapshot");
058    }
059
060    @Override
061    public void push(V value) {
062        super.push(value);
063        log("push");
064    }
065
066    @Override
067    public void push(int down, V value) {
068        super.push(down, value);
069        log("push");
070    }
071
072    @Override
073    public V pop(int down) {
074        V v = super.pop(down);
075        log("pop");
076        return v;
077    }
078
079    @Override
080    public void poke(int down, V value) {
081        super.poke(down, value);
082        log("poke");
083    }
084
085    @Override
086    public void swap() {
087        super.swap();
088        log("swap");
089    }
090
091    @Override
092    public void swap3() {
093        super.swap3();
094        log("swap3");
095    }
096
097    @Override
098    public void swap4() {
099        super.swap4();
100        log("swap4");
101    }
102
103    @Override
104    public void swap5() {
105        super.swap5();
106        log("swap5");
107    }
108
109    @Override
110    public void swap6() {
111        super.swap6();
112        log("swap6");
113    }
114
115    protected void log(String action) {
116        log.receive(action);
117        log.receive(StringUtils.repeat(' ', 15 - action.length()));
118        log.receive(": ");
119        LinkedList<V> elements = new LinkedList<V>();
120        for (V v : this) elements.addFirst(v);
121        log.receive(StringUtils.join(elements, ", "));
122        log.receive("\n");
123    }
124}