001: // This file is part of KeY - Integrated Deductive Software Design
002: // Copyright (C) 2001-2007 Universitaet Karlsruhe, Germany
003: // Universitaet Koblenz-Landau, Germany
004: // Chalmers University of Technology, Sweden
005: //
006: // The KeY system is protected by the GNU General Public License.
007: // See LICENSE.TXT for details.
008: //
009: //
010: package de.uka.ilkd.key.java.visitor;
011:
012: import java.util.HashSet;
013:
014: import de.uka.ilkd.key.java.ProgramElement;
015: import de.uka.ilkd.key.java.SourceElement;
016: import de.uka.ilkd.key.java.declaration.FieldSpecification;
017: import de.uka.ilkd.key.java.declaration.ImplicitFieldSpecification;
018: import de.uka.ilkd.key.java.declaration.VariableSpecification;
019: import de.uka.ilkd.key.java.statement.CatchAllStatement;
020: import de.uka.ilkd.key.logic.op.IProgramVariable;
021: import de.uka.ilkd.key.logic.op.LocationVariable;
022: import de.uka.ilkd.key.logic.op.ProgramConstant;
023:
024: /**
025: * The DeclarationProgramVariableCollector collects all top level
026: * declared program variables relative to the given block to be
027: * visited, for example starting with <code>
028: * { int j; { int i; } { int h; } for (int k; ...) {} int h; }
029: * </code>
030: * the collector will return a set containg <code>j, h</code> the
031: * <code>h</code> because of the second occurrence of <code>h</code>
032: */
033: public class DeclarationProgramVariableCollector extends JavaASTVisitor {
034:
035: private HashSet result = new HashSet();
036:
037: /** creates a new declaration visitor */
038: public DeclarationProgramVariableCollector(ProgramElement root) {
039: super (root);
040: }
041:
042: /** the action that is performed just before leaving the node the
043: * last time
044: */
045: protected void doAction(ProgramElement node) {
046: node.visit(this );
047: }
048:
049: /** starts the walker*/
050: public void start() {
051: walk(root());
052: }
053:
054: public HashSet result() {
055: return result;
056: }
057:
058: public String toString() {
059: return result.toString();
060: }
061:
062: /**
063: * adds the given variable if we are currently at top level
064: */
065: protected void addVariable(IProgramVariable var) {
066: if (depth() == 1) {
067: result.add(var);
068: }
069: }
070:
071: protected void doDefaultAction(SourceElement x) {
072: }
073:
074: public void performActionOnVariableSpecification(
075: VariableSpecification x) {
076: addVariable(x.getProgramVariable());
077: }
078:
079: public void performActionOnFieldSpecification(FieldSpecification x) {
080: addVariable(x.getProgramVariable());
081: }
082:
083: public void performActionOnImplicitFieldSpecification(
084: ImplicitFieldSpecification x) {
085: addVariable(x.getProgramVariable());
086: }
087:
088: public void performActionOnCatchAllStatement(CatchAllStatement x) {
089: result.add(x.getParameterDeclaration()
090: .getVariableSpecification().getProgramVariable());
091: }
092:
093: public void performActionOnLocationVariable(LocationVariable x) {
094: performActionOnProgramVariable(x);
095:
096: }
097:
098: public void performActionOnProgramConstant(ProgramConstant x) {
099: performActionOnProgramVariable(x);
100: }
101:
102: }
|