View Javadoc

1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.symboltable;
5   
6   import net.sourceforge.pmd.ast.ASTFormalParameter;
7   import net.sourceforge.pmd.ast.ASTFormalParameters;
8   import net.sourceforge.pmd.ast.ASTMethodDeclarator;
9   import net.sourceforge.pmd.ast.ASTPrimitiveType;
10  import net.sourceforge.pmd.ast.SimpleNode;
11  
12  public class MethodNameDeclaration extends AbstractNameDeclaration {
13  
14      public MethodNameDeclaration(ASTMethodDeclarator node) {
15          super(node);
16      }
17  
18      public int getParameterCount() {
19          return ((ASTMethodDeclarator) node).getParameterCount();
20      }
21  
22      public ASTMethodDeclarator getMethodNameDeclaratorNode() {
23          return (ASTMethodDeclarator) node;
24      }
25  
26      public String getParameterDisplaySignature() {
27          StringBuffer sb = new StringBuffer("(");
28          ASTFormalParameters params = (ASTFormalParameters) node.jjtGetChild(0);
29          // TODO - this can be optimized - add [0] then ,[n] in a loop.
30          //        no need to trim at the end
31          for (int i = 0; i < ((ASTMethodDeclarator) node).getParameterCount(); i++) {
32              ASTFormalParameter p = (ASTFormalParameter) params.jjtGetChild(i);
33              sb.append(p.getTypeNode().getTypeImage());
34              sb.append(',');
35          }
36          if (sb.charAt(sb.length() - 1) == ',') {
37              sb.deleteCharAt(sb.length() - 1);
38          }
39          sb.append(')');
40          return sb.toString();
41      }
42  
43      public boolean equals(Object o) {
44          MethodNameDeclaration other = (MethodNameDeclaration) o;
45  
46          // compare name
47          if (!other.node.getImage().equals(node.getImage())) {
48              return false;
49          }
50  
51          // compare parameter count - this catches the case where there are no params, too
52          if (((ASTMethodDeclarator) (other.node)).getParameterCount() != ((ASTMethodDeclarator) node).getParameterCount()) {
53              return false;
54          }
55  
56          // compare parameter types
57          ASTFormalParameters myParams = (ASTFormalParameters) node.jjtGetChild(0);
58          ASTFormalParameters otherParams = (ASTFormalParameters) other.node.jjtGetChild(0);
59          for (int i = 0; i < ((ASTMethodDeclarator) node).getParameterCount(); i++) {
60              ASTFormalParameter myParam = (ASTFormalParameter) myParams.jjtGetChild(i);
61              ASTFormalParameter otherParam = (ASTFormalParameter) otherParams.jjtGetChild(i);
62  
63              SimpleNode myTypeNode = (SimpleNode) myParam.getTypeNode().jjtGetChild(0);
64              SimpleNode otherTypeNode = (SimpleNode) otherParam.getTypeNode().jjtGetChild(0);
65  
66              // compare primitive vs reference type
67              if (myTypeNode.getClass() != otherTypeNode.getClass()) {
68                  return false;
69              }
70  
71              // simple comparison of type images
72              // this can be fooled by one method using "String"
73              // and the other method using "java.lang.String"
74              // once we get real types in here that should get fixed
75              String myTypeImg;
76              String otherTypeImg;
77              if (myTypeNode instanceof ASTPrimitiveType) {
78                  myTypeImg = myTypeNode.getImage();
79                  otherTypeImg = otherTypeNode.getImage();
80              } else {
81                  myTypeImg = ((SimpleNode) (myTypeNode.jjtGetChild(0))).getImage();
82                  otherTypeImg = ((SimpleNode) (otherTypeNode.jjtGetChild(0))).getImage();
83              }
84  
85              if (!myTypeImg.equals(otherTypeImg)) {
86                  return false;
87              }
88  
89              // if type is ASTPrimitiveType and is an array, make sure the other one is also
90          }
91          return true;
92      }
93  
94      public int hashCode() {
95          return node.getImage().hashCode() + ((ASTMethodDeclarator) node).getParameterCount();
96      }
97  
98      public String toString() {
99          return "Method " + node.getImage() + ", line " + node.getBeginLine() + ", params = " + ((ASTMethodDeclarator) node).getParameterCount();
100     }
101 }