@Override public @CheckForNull XMethodParameter getNonNullParameter() { return new XMethodParameter(m, param); }
@Override public void visitSyntheticParameterAnnotation(int p, boolean runtimeVisible) { if (database == null) { return; } XMethod xmethod = XFactory.createXMethod(this); XMethodParameter xparameter = new XMethodParameter(xmethod, p); database.addDirectAnnotation(xparameter, NullnessAnnotation.UNKNOWN_NULLNESS); }
@Override public void visitParameterAnnotation(int p, String annotationClass, Map<String, ElementValue> map, boolean runtimeVisible) { if (database == null) { return; } NullnessAnnotation n = NullnessAnnotation.Parser.parse(annotationClass); annotationClass = lastPortion(annotationClass); if (n == null) { return; } XMethod xmethod = XFactory.createXMethod(this); if (DEBUG) { System.out.println("Parameter " + p + " @" + annotationClass.substring(annotationClass.lastIndexOf('/') + 1) + " in " + xmethod.toString()); } XMethodParameter xparameter = new XMethodParameter(xmethod, p); database.addDirectAnnotation(xparameter, n); }
@Override public boolean parameterMustBeNonNull(XMethod m, int param) { if (param == 0) { if ("equals".equals(m.getName()) && "(Ljava/lang/Object;)Z".equals(m.getSignature()) && !m.isStatic()) { return false; } else if ("main".equals(m.getName()) && "([Ljava/lang/String;)V".equals(m.getSignature()) && m.isStatic() && m.isPublic()) { return true; } else if (TypeQualifierNullnessAnnotationDatabase.assertsFirstParameterIsNonnull(m)) { return true; } else if ("compareTo".equals(m.getName()) && m.getSignature().endsWith(";)Z") && !m.isStatic()) { return true; } } if (!anyAnnotations(NullnessAnnotation.NONNULL)) { return false; } XMethodParameter xmp = new XMethodParameter(m, param); NullnessAnnotation resolvedAnnotation = getResolvedAnnotation(xmp, true); return resolvedAnnotation == NullnessAnnotation.NONNULL; }
protected void addMethodParameterAnnotation(String cName, String mName, String mSig, boolean isStatic, int param, AnnotationEnum annotation) { // if (!Subtypes.DO_NOT_USE) { // subtypes.addNamedClass(cName); // } if (addClassOnly) { return; } SignatureParser parser = new SignatureParser(mSig); if (param < 0 || param >= parser.getNumParameters()) { throw new IllegalArgumentException("can't annotation parameter #" + param + " of " + cName + "." + mName + mSig); } String signature = parser.getParameter(param); char firstChar = signature.charAt(0); boolean isReference = firstChar == 'L' || firstChar == '['; if (onlyAppliesToReferenceParameters(annotation) && !isReference) { AnalysisContext.logError("Can't apply " + annotation + " to parameter " + param + " with signature " + signature + " of " + cName + "." + mName + " : " + mSig); return; } XMethod m = XFactory.createXMethod(cName, mName, mSig, isStatic); addDirectAnnotation(new XMethodParameter(m, param), annotation); } }
private AnnotationEnum lookInOverriddenMethod(final Object originalQuery, String classToLookIn, XMethod originalMethod, boolean getMinimal) { try { AnnotationEnum n; // Look in supermethod XMethod superMethod = XFactory.createXMethod(classToLookIn, originalMethod.getName(), originalMethod.getSignature(), originalMethod.isStatic()); if (!superMethod.isResolved()) { return null; } if (DEBUG) { System.out.println("Looking for overridden method " + superMethod); } Object probe; if (originalQuery instanceof XMethod) { probe = superMethod; } else if (originalQuery instanceof XMethodParameter) { probe = new XMethodParameter(superMethod, ((XMethodParameter) originalQuery).getParameterNumber()); } else { throw new IllegalStateException("impossible"); } n = getResolvedAnnotation(probe, getMinimal); return n; } catch (RuntimeException e) { AnalysisContext.logError("Exception while looking for annotation of " + originalMethod + "in " + classToLookIn, e); return null; } }
IsNullValue value; XMethodParameter methodParameter = new XMethodParameter(xm, paramIndex); NullnessAnnotation n = db.getResolvedAnnotation(methodParameter, false); if (n == NullnessAnnotation.CHECK_FOR_NULL) {
@Override public @CheckForNull XMethodParameter getNonNullParameter() { return new XMethodParameter(m, param); }
@Override public void visitSyntheticParameterAnnotation(int p, boolean runtimeVisible) { if (database == null) { return; } XMethod xmethod = XFactory.createXMethod(this); XMethodParameter xparameter = new XMethodParameter(xmethod, p); database.addDirectAnnotation(xparameter, NullnessAnnotation.UNKNOWN_NULLNESS); }
@Override public void visitParameterAnnotation(int p, String annotationClass, Map<String, ElementValue> map, boolean runtimeVisible) { if (database == null) { return; } NullnessAnnotation n = NullnessAnnotation.Parser.parse(annotationClass); annotationClass = lastPortion(annotationClass); if (n == null) { return; } XMethod xmethod = XFactory.createXMethod(this); if (DEBUG) { System.out.println("Parameter " + p + " @" + annotationClass.substring(annotationClass.lastIndexOf('/') + 1) + " in " + xmethod.toString()); } XMethodParameter xparameter = new XMethodParameter(xmethod, p); database.addDirectAnnotation(xparameter, n); }
@Override public boolean parameterMustBeNonNull(XMethod m, int param) { if (param == 0) { if ("equals".equals(m.getName()) && "(Ljava/lang/Object;)Z".equals(m.getSignature()) && !m.isStatic()) { return false; } else if ("main".equals(m.getName()) && "([Ljava/lang/String;)V".equals(m.getSignature()) && m.isStatic() && m.isPublic()) { return true; } else if (TypeQualifierNullnessAnnotationDatabase.assertsFirstParameterIsNonnull(m)) { return true; } else if ("compareTo".equals(m.getName()) && m.getSignature().endsWith(";)Z") && !m.isStatic()) { return true; } } if (!anyAnnotations(NullnessAnnotation.NONNULL)) { return false; } XMethodParameter xmp = new XMethodParameter(m, param); NullnessAnnotation resolvedAnnotation = getResolvedAnnotation(xmp, true); return resolvedAnnotation == NullnessAnnotation.NONNULL; }
protected void addMethodParameterAnnotation(String cName, String mName, String mSig, boolean isStatic, int param, AnnotationEnum annotation) { // if (!Subtypes.DO_NOT_USE) { // subtypes.addNamedClass(cName); // } if (addClassOnly) { return; } SignatureParser parser = new SignatureParser(mSig); if (param < 0 || param >= parser.getNumParameters()) { throw new IllegalArgumentException("can't annotation parameter #" + param + " of " + cName + "." + mName + mSig); } String signature = parser.getParameter(param); char firstChar = signature.charAt(0); boolean isReference = firstChar == 'L' || firstChar == '['; if (onlyAppliesToReferenceParameters(annotation) && !isReference) { AnalysisContext.logError("Can't apply " + annotation + " to parameter " + param + " with signature " + signature + " of " + cName + "." + mName + " : " + mSig); return; } XMethod m = XFactory.createXMethod(cName, mName, mSig, isStatic); addDirectAnnotation(new XMethodParameter(m, param), annotation); } }
private AnnotationEnum lookInOverriddenMethod(final Object originalQuery, String classToLookIn, XMethod originalMethod, boolean getMinimal) { try { AnnotationEnum n; // Look in supermethod XMethod superMethod = XFactory.createXMethod(classToLookIn, originalMethod.getName(), originalMethod.getSignature(), originalMethod.isStatic()); if (!superMethod.isResolved()) { return null; } if (DEBUG) { System.out.println("Looking for overridden method " + superMethod); } Object probe; if (originalQuery instanceof XMethod) { probe = superMethod; } else if (originalQuery instanceof XMethodParameter) { probe = new XMethodParameter(superMethod, ((XMethodParameter) originalQuery).getParameterNumber()); } else { throw new IllegalStateException("impossible"); } n = getResolvedAnnotation(probe, getMinimal); return n; } catch (RuntimeException e) { AnalysisContext.logError("Exception while looking for annotation of " + originalMethod + "in " + classToLookIn, e); return null; } }
IsNullValue value; XMethodParameter methodParameter = new XMethodParameter(xm, paramIndex); NullnessAnnotation n = db.getResolvedAnnotation(methodParameter, false); if (n == NullnessAnnotation.CHECK_FOR_NULL) {