if (!lhs.hasSpecificInstructions() && !rhs.hasSpecificInstructions()) return 0;   if ((cmp = lhs.getEarlierOpcodesAsString(NUM_CONTEXT_OPCODES).compareTo( rhs.getEarlierOpcodesAsString(NUM_CONTEXT_OPCODES))) != 0) { return cmp; }   if ((cmp = lhs.getSelectedOpcodesAsString().compareTo(rhs.getSelectedOpcodesAsString())) != 0) { return cmp; }   if ((cmp = lhs.getLaterOpcodesAsString(NUM_CONTEXT_OPCODES).compareTo( rhs.getLaterOpcodesAsString(NUM_CONTEXT_OPCODES))) != 0) { return cmp; }
	public int compareSourceLines(BugCollection lhsCollection, BugCollection rhsCollection, SourceLineAnnotation lhs, SourceLineAnnotation rhs) {		if (lhs == null || rhs == null) {			return compareNullElements(lhs, rhs);		}				// Classes must match fuzzily.		int cmp = compareClassesByName(lhsCollection, rhsCollection, lhs.getClassName(), rhs.getClassName());		if (cmp != 0)			return cmp;				// If both annotations refer to entire methods, as opposed to		// a specific instruction or range of instructions, consider them		// equal.  This handles the case where a warning may refer to		// another method (i.e., it was called).		// Even if the referred-to method changes between versions, we want		// the warning to be considered equivalent in both versions.		if (!lhs.hasSpecificInstructions() && !rhs.hasSpecificInstructions())			return 0;				// Compare earlier opcodes		if ((cmp = lhs.getEarlierOpcodesAsString(NUM_CONTEXT_OPCODES).compareTo(				rhs.getEarlierOpcodesAsString(NUM_CONTEXT_OPCODES))) != 0) {			return cmp;		}				// Compare selected opcodes		if ((cmp = lhs.getSelectedOpcodesAsString().compareTo(rhs.getSelectedOpcodesAsString())) != 0) {			return cmp;		}				// Compare later opcodes		if ((cmp = lhs.getLaterOpcodesAsString(NUM_CONTEXT_OPCODES).compareTo(				rhs.getLaterOpcodesAsString(NUM_CONTEXT_OPCODES))) != 0) {			return cmp;		}				return 0;	}