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}