1 19 20 package edu.umd.cs.findbugs.ba.bcp; 21 22 import org.apache.bcel.generic.InstructionHandle; 23 24 import edu.umd.cs.findbugs.ba.BasicBlock; 25 26 33 public class PatternElementMatch { 34 private final PatternElement patternElement; 35 private final InstructionHandle matchedInstruction; 36 private final BasicBlock basicBlock; 37 private final int matchCount; 38 private final PatternElementMatch prev; 39 40 51 public PatternElementMatch(PatternElement patternElement, InstructionHandle matchedInstruction, 52 BasicBlock basicBlock, 53 int matchCount, PatternElementMatch prev) { 54 this.patternElement = patternElement; 55 this.matchedInstruction = matchedInstruction; 56 this.basicBlock = basicBlock; 57 this.matchCount = matchCount; 58 this.prev = prev; 59 } 60 61 64 public PatternElement getPatternElement() { 65 return patternElement; 66 } 67 68 71 public InstructionHandle getMatchedInstructionInstructionHandle() { 72 return matchedInstruction; 73 } 74 75 78 public BasicBlock getBasicBlock() { 79 return basicBlock; 80 } 81 82 87 public int getMatchCount() { 88 return matchCount; 89 } 90 91 94 public PatternElementMatch getPrev() { 95 return prev; 96 } 97 98 101 public InstructionHandle getLabeledInstruction(String label) { 102 PatternElementMatch first = getFirstLabeledMatch(label); 103 return first != null ? first.getMatchedInstructionInstructionHandle() : null; 104 } 105 106 110 public PatternElementMatch getFirstLabeledMatch(String label) { 111 PatternElementMatch cur = this, result = null; 112 while (cur != null) { 113 String elementLabel = cur.patternElement.getLabel(); 114 if (elementLabel != null && elementLabel.equals(label)) 115 result = cur; 116 cur = cur.prev; 117 } 118 return result; 119 } 120 121 125 public PatternElementMatch getLastLabeledMatch(String label) { 126 PatternElementMatch cur = this; 127 while (cur != null) { 128 String elementLabel = cur.patternElement.getLabel(); 129 if (elementLabel != null && elementLabel.equals(label)) 130 return cur; 131 cur = cur.prev; 132 } 133 return null; 134 } 135 136 140 public boolean allowTrailingEdges() { 141 return patternElement.allowTrailingEdges(); 142 } 143 144 @Override 145 public String toString() { 146 StringBuffer buf = new StringBuffer (); 147 PatternElementMatch cur = this; 148 buf.append(cur.patternElement.toString()); 149 buf.append(", "); 150 buf.append(cur.matchedInstruction.toString()); 151 buf.append(", "); 152 buf.append(cur.matchCount); 153 return buf.toString(); 154 } 155 156 @Override 157 public int hashCode() { 158 throw new UnsupportedOperationException (); 160 } 161 162 @Override 163 public boolean equals(Object o) { 164 if (!(o instanceof PatternElementMatch)) 165 return false; 166 PatternElementMatch lhs = this; 167 PatternElementMatch rhs = (PatternElementMatch) o; 168 169 while (lhs != null && rhs != null) { 170 if (lhs.patternElement != rhs.patternElement || 171 lhs.matchedInstruction != rhs.matchedInstruction || 172 lhs.matchCount != rhs.matchCount) 173 return false; 174 175 lhs = lhs.prev; 176 rhs = rhs.prev; 177 } 178 179 return lhs == rhs; 180 } 181 } 182 183 | Popular Tags |