001package com.hammurapi.extract.java;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import antlr.CommonAST;
007import antlr.Token;
008import antlr.collections.AST;
009
010/**
011 * Custom AST to create canonical parse tree.
012 * @author Pavel Vlasov
013 *
014 */
015public class ParamsAST extends CommonAST {
016        
017        int parameterIndex = -1;
018        
019        void setParameterIndex(int parameterIndex) {
020                this.parameterIndex = parameterIndex;
021        }
022
023        public ParamsAST() {
024                
025        }
026
027        public ParamsAST(Token token) {
028                super(token);
029        }
030        
031        @Override
032        public boolean equals(AST ast) {
033                if (!(ast instanceof ParamsAST)) {
034                        return false;
035                }
036                
037                ParamsAST past = (ParamsAST) ast;
038                if (past.getType()!=getType()) {
039                        return false;
040                }
041                
042                if (parameterIndex!=past.parameterIndex) {
043                        return false;
044                }
045                        
046                if (past.parameterIndex==-1 && !strcmp(getText(), past.getText())) {
047                        return false;
048                }
049                
050                if (getNumberOfChildren()!=past.getNumberOfChildren()) {
051                        return false;
052                }
053                
054                for (AST child=getFirstChild(),otherChild=past.getFirstChild(); child!=null; child=child.getNextSibling(), otherChild=otherChild.getNextSibling()) {
055                        if (!child.equals(otherChild)) {
056                                return false;
057                        }
058                }
059                
060                return true;
061        }
062        
063        private boolean strcmp(String s1, String s2) {
064                return s1==s2 || (s1!=null && s1.equals(s2));
065        }
066        
067        List<Object> getIdentity() {
068                List<Object> ret = new ArrayList<Object>();
069                ret.add(getType());
070                if (parameterIndex==-1) {
071                        ret.add(getText());
072                } else {
073                        ret.add(parameterIndex);
074                }
075                
076                if (getFirstChild()!=null) {
077                        List<List<Object>> children = new ArrayList<List<Object>>();
078                        ret.add(children);
079                        for (AST child=getFirstChild(); child!=null; child=child.getNextSibling()) {
080                                children.add(((ParamsAST) child).getIdentity());
081                        }
082                }
083                
084                return ret;             
085        }
086}