} else if (!innerClassCannotBeStatic.contains(className)) { boolean easyChange = !needsOuterObjectInConstructor.contains(className); if (easyChange || !isAnonymousInnerClass) {       int priority = LOW_PRIORITY; if (easyChange && !isAnonymousInnerClass) priority = NORMAL_PRIORITY;  String bug = "SIC_INNER_SHOULD_BE_STATIC"; if (isAnonymousInnerClass) bug = "SIC_INNER_SHOULD_BE_STATIC_ANON"; else if (!easyChange) bug = "SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS";  bugReporter.reportBug(new BugInstance(this, bug, priority) .addClass(className)); } }
}
	public void report() {		TreeSet<FieldAnnotation> notInitializedInConstructors =		        new TreeSet<FieldAnnotation>(declaredFields);		notInitializedInConstructors.retainAll(readFields);		notInitializedInConstructors.retainAll(writtenFields);		notInitializedInConstructors.retainAll(assumedNonNull.keySet());		notInitializedInConstructors.removeAll(writtenInConstructorFields);		TreeSet<FieldAnnotation> readOnlyFields =		        new TreeSet<FieldAnnotation>(declaredFields);		readOnlyFields.removeAll(writtenFields);		readOnlyFields.retainAll(readFields);		Set<FieldAnnotation> writeOnlyFields = declaredFields;		writeOnlyFields.removeAll(readFields);		for (Iterator<FieldAnnotation> i = notInitializedInConstructors.iterator(); i.hasNext();) {			FieldAnnotation f = i.next();			String fieldName = f.getFieldName();			String className = f.getClassName();			String fieldSignature = f.getFieldSignature();			if (!superWrittenFields.contains(fieldName)				 && !fieldsOfSerializableOrNativeClassed.contains(f)				 && (fieldSignature.charAt(0) == 'L' || fieldSignature.charAt(0) == '[')				) {				int priority = LOW_PRIORITY;				bugReporter.reportBug(new BugInstance(this, 						"UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR", 						priority)				        .addClass(className)				        .addField(f));				}		}		for (Iterator<FieldAnnotation> i = readOnlyFields.iterator(); i.hasNext();) {			FieldAnnotation f = i.next();			String fieldName = f.getFieldName();			String className = f.getClassName();			String fieldSignature = f.getFieldSignature();			if (!superWrittenFields.contains(fieldName)				 && !fieldsOfSerializableOrNativeClassed.contains(f)) {				int priority = NORMAL_PRIORITY;				if (!(fieldSignature.charAt(0) == 'L' || fieldSignature.charAt(0) == '['))					priority++;				else if (assumedNonNull.containsKey(f)) {				priority--;				for(ProgramPoint p : assumedNonNull.get(f)) 				bugReporter.reportBug(new BugInstance(this, 					"NP_UNWRITTEN_FIELD", 					NORMAL_PRIORITY)				        .addClassAndMethod(p.method)				        .addSourceLine(p.sourceLine)					);				}				bugReporter.reportBug(new BugInstance(this, 					"UWF_UNWRITTEN_FIELD", 					priority)				        .addClass(className)				        .addField(f));			}						}		for (Iterator<FieldAnnotation> i = writeOnlyFields.iterator(); i.hasNext();) {			FieldAnnotation f = i.next();			String fieldName = f.getFieldName();			String className = f.getClassName();			int lastDollar =			        Math.max(className.lastIndexOf('$'),			                className.lastIndexOf('+'));			boolean isAnonymousInnerClass =			        (lastDollar > 0)			        && (lastDollar < className.length() - 1)			        && Character.isDigit(className.charAt(className.length() - 1));			if (DEBUG) {			System.out.println("Checking write only field " + className					+ "." + fieldName					+ "\t" + superReadFields.contains(f.getFieldName())					+ "\t" + constantFields.contains(f)					+ "\t" + f.isStatic()					);			}			if (superReadFields.contains(f.getFieldName())) continue;			if (!fieldName.startsWith("this$")			        && !fieldName.startsWith("this+")			) {				if (constantFields.contains(f)) {					if (!f.isStatic())					bugReporter.reportBug(new BugInstance(this, 							"SS_SHOULD_BE_STATIC", 							NORMAL_PRIORITY)					        .addClass(className)					        .addField(f));					}				else if (fieldsOfSerializableOrNativeClassed.contains(f)) {					// ignore it				} else if (!writtenFields.contains(f) && !superWrittenFields.contains(f.getFieldName()))					bugReporter.reportBug(new BugInstance(this, "UUF_UNUSED_FIELD", NORMAL_PRIORITY)					        .addClass(className)					        .addField(f));				else if (!f.isStatic() || !finalFields.contains(f))					bugReporter.reportBug(new BugInstance(this, "URF_UNREAD_FIELD", NORMAL_PRIORITY)					        .addClass(className)					        .addField(f));			} else if (!innerClassCannotBeStatic.contains(className)) {				boolean easyChange = !needsOuterObjectInConstructor.contains(className);				if (easyChange || !isAnonymousInnerClass) {					// easyChange    isAnonymousInnerClass					// true          false			medium, SIC					// true          true				low, SIC_ANON					// false         true				not reported					// false         false			low, SIC_THIS					int priority = LOW_PRIORITY;					if (easyChange && !isAnonymousInnerClass)						priority = NORMAL_PRIORITY;					String bug = "SIC_INNER_SHOULD_BE_STATIC";					if (isAnonymousInnerClass)						bug = "SIC_INNER_SHOULD_BE_STATIC_ANON";					else if (!easyChange)						bug = "SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS";					bugReporter.reportBug(new BugInstance(this, bug, priority)					        .addClass(className));				}			}		}	}