| 1 19 20 package edu.umd.cs.findbugs.ba.bcp; 21 22 import org.apache.bcel.generic.ConstantPoolGen; 23 import org.apache.bcel.generic.InstructionHandle; 24 25 import edu.umd.cs.findbugs.SystemProperties; 26 import edu.umd.cs.findbugs.ba.DataflowAnalysisException; 27 import edu.umd.cs.findbugs.ba.Edge; 28 import edu.umd.cs.findbugs.ba.vna.ValueNumberFrame; 29 30 34 public abstract class PatternElement { 35 private static final boolean DEBUG = SystemProperties.getBoolean("bcp.debug"); 36 37 private PatternElement next; 38 private String label; 39 private String dominatedBy; 40 private int index; 41 private boolean allowTrailingEdges = true; 42 43 46 public PatternElement getNext() { 47 return next; 48 } 49 50 53 public void setNext(PatternElement patternElement) { 54 this.next = patternElement; 55 } 56 57 63 public PatternElement label(String label) { 64 this.label = label; 65 return this; 66 } 67 68 73 public String getLabel() { 74 return label; 75 } 76 77 82 public PatternElement dominatedBy(String dominatedBy) { 83 this.dominatedBy = dominatedBy; 84 return this; 85 } 86 87 92 public String getDominatedBy() { 93 return dominatedBy; 94 } 95 96 99 public void setIndex(int index) { 100 this.index = index; 101 } 102 103 112 public PatternElement setAllowTrailingEdges(boolean allowTrailingEdges) { 113 this.allowTrailingEdges = allowTrailingEdges; 114 return this; 115 } 116 117 120 public boolean allowTrailingEdges() { 121 return allowTrailingEdges; 122 } 123 124 131 public static Variable lookup(String varName, BindingSet bindingSet) { 132 if (bindingSet == null) 133 return null; 134 Binding binding = bindingSet.lookup(varName); 135 return (binding != null) ? binding.getVariable() : null; 136 } 137 138 152 public abstract MatchResult match(InstructionHandle handle, ConstantPoolGen cpg, 153 ValueNumberFrame before, ValueNumberFrame after, BindingSet bindingSet) throws DataflowAnalysisException; 154 155 162 public abstract boolean acceptBranch(Edge edge, InstructionHandle source); 163 164 168 public abstract int minOccur(); 169 170 174 public abstract int maxOccur(); 175 176 188 protected static BindingSet addOrCheckDefinition(String varName, Variable variable, BindingSet bindingSet) { 189 Variable existingVariable = lookup(varName, bindingSet); 190 if (existingVariable == null) { 191 bindingSet = new BindingSet(new Binding(varName, variable), bindingSet); 192 } else { 193 if (!existingVariable.sameAs(variable)) { 194 if (DEBUG) System.out.println("\tConflicting variable " + varName + ": " + variable + " != " + existingVariable); 195 return null; 196 } 197 } 198 199 return bindingSet; 200 } 201 202 @Override  203 public String toString() { 204 StringBuffer buf = new StringBuffer (); 205 String className = this.getClass().getName(); 206 buf.append(className.substring(className.lastIndexOf('.') + 1)); 207 buf.append('('); 208 buf.append(index); 209 buf.append(')'); 210 return buf.toString(); 211 } 212 } 213 214 | Popular Tags |