Class OptionalIssues

java.lang.Object
edu.umd.cs.findbugs.visitclass.BetterVisitor
edu.umd.cs.findbugs.visitclass.PreorderVisitor
edu.umd.cs.findbugs.visitclass.AnnotationVisitor
edu.umd.cs.findbugs.visitclass.DismantleBytecode
edu.umd.cs.findbugs.BytecodeScanningDetector
com.mebigfatguy.fbcontrib.detect.OptionalIssues
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

@CustomUserValue public class OptionalIssues extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for various issues around use of java.util.Optional
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    (package private) static class 
    represents an opcode that was issued while there is still active elements on the stack.
    private static enum 
     
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
     
    private static Set<String>
     
    private Map<edu.umd.cs.findbugs.OpcodeStack.Item,edu.umd.cs.findbugs.SourceLineAnnotation>
     
    private edu.umd.cs.findbugs.BugReporter
     
    private org.apache.bcel.classfile.JavaClass
     
    private static final BitSet
     
    private Boolean
     
    private static final Set<String>
    java.util.Optional is handled in the detector OptionalIssues
    private static final FQMethod
     
    private static final FQMethod
     
    private static final FQMethod
     
    private static final String
     
    private static final Set<FQMethod>
     
    private static final Set<FQMethod>
     
    private edu.umd.cs.findbugs.OpcodeStack
     
    private org.apache.bcel.classfile.JavaClass
     
    private static final Set<FQMethod>
     

    Fields inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    codeBytes, lineNumberTable, M_BR, M_CP, M_INT, M_PAD, M_R, M_UINT

    Fields inherited from interface edu.umd.cs.findbugs.Priorities

    EXP_PRIORITY, HIGH_PRIORITY, IGNORE_PRIORITY, LOW_PRIORITY, NORMAL_PRIORITY
  • Constructor Summary

    Constructors
    Constructor
    Description
    OptionalIssues(edu.umd.cs.findbugs.BugReporter bugReporter)
    constructs a OI detector given the reporter to report bugs on
  • Method Summary

    Modifier and Type
    Method
    Description
    private org.apache.bcel.classfile.Method
    getLambdaMethod(String methodName)
    finds the bootstrap method for a lambda (invokedynamic call.
    private boolean
    hasInvoke(byte[] byteCode)
    returns whether the byte code of a method has an invokeXXX statement in it
    private boolean
     
    private boolean
    returns whether the set of operations that contributed to the current stack form, are trivial or not, specifically boxing a primitive value, or appending to strings or such.
    void
    sawOpcode(int seen)
    implements the visitor to look for reference compares of Optional, Optional use when more specific Optionals should be used, and use of orElse when orElseGet would be more appropriate
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
    implements the visitor to filter out pre-1.8 classes, for 1.8+ classes, it creates the opcode stack and active stack ops
    void
    visitCode(org.apache.bcel.classfile.Code obj)
    implements the visitor clear the stacks

    Methods inherited from class edu.umd.cs.findbugs.BytecodeScanningDetector

    getClassContext, report, shouldVisitCode

    Methods inherited from class edu.umd.cs.findbugs.visitclass.DismantleBytecode

    afterOpcode, areOppositeBranches, atCatchBlock, beforeOpcode, getBranchFallThrough, getBranchOffset, getBranchTarget, getClassConstantOperand, getClassDescriptorOperand, getCodeByte, getConstantRefOperand, getDefaultSwitchOffset, getDottedClassConstantOperand, getFieldDescriptorOperand, getIntConstant, getLongConstant, getMaxPC, getMethodDescriptorOperand, getNameConstantOperand, getNextCodeByte, getNextOpcode, getNextPC, getOpcode, getPC, getPrevOpcode, getRefConstantOperand, getRefFieldIsStatic, getRegisterOperand, getSigConstantOperand, getStringConstantOperand, getSwitchLabels, getSwitchOffsets, getXClassOperand, getXFieldOperand, getXMethodOperand, isBranch, isMethodCall, isRegisterLoad, isRegisterStore, isRegisterStore, isReturn, isShift, isSwitch, isWideOpcode, printOpCode, sawBranchTo, sawClass, sawDouble, sawField, sawFloat, sawIMethod, sawInt, sawLong, sawMethod, sawRegister, sawString, visit

    Methods inherited from class edu.umd.cs.findbugs.visitclass.AnnotationVisitor

    getAnnotationParameterAsEnum, getAnnotationParameterAsString, getAnnotationParameterAsStringArray, visitAnnotation, visitAnnotation, visitParameterAnnotation, visitParameterAnnotation, visitSyntheticParameterAnnotation

    Methods inherited from class edu.umd.cs.findbugs.visitclass.PreorderVisitor

    amVisitingMainMethod, asUnsignedByte, doVisitMethod, getClassDescriptor, getClassName, getCode, getConstantPool, getDottedClassName, getDottedFieldSig, getDottedMethodSig, getDottedSuperclassName, getField, getFieldDescriptor, getFieldIsStatic, getFieldName, getFieldSig, getFullyQualifiedFieldName, getFullyQualifiedMethodName, getMethod, getMethodDescriptor, getMethodName, getMethodSig, getMethodVisitOrder, getNumberArguments, getNumberMethodArguments, getPackageName, getSizeOfSurroundingTryBlock, getSizeOfSurroundingTryBlock, getSourceFile, getStringFromIndex, getSuperclassName, getSurroundingCaughtExceptions, getSurroundingCaughtExceptions, getSurroundingCaughtExceptionTypes, getSurroundingTryBlock, getSurroundingTryBlock, getThisClass, getXClass, getXField, getXMethod, hasInterestingClass, hasInterestingMethod, isVisitMethodsInCallOrder, setupVisitorForClass, setVisitMethodsInCallOrder, shouldVisit, toString, visitAfter, visitAfter, visitAnnotationDefault, visitAnnotationEntry, visitBootstrapMethods, visitConstantInvokeDynamic, visitConstantMethodHandle, visitConstantMethodType, visitConstantModule, visitConstantPackage, visitConstantPool, visitEnclosingMethod, visitingField, visitingMethod, visitInnerClasses, visitJavaClass, visitLineNumberTable, visitLocalVariableTable, visitMethodParameters, visitParameterAnnotationEntry, visitStackMap, visitStackMapEntry

    Methods inherited from class edu.umd.cs.findbugs.visitclass.BetterVisitor

    clone, report, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visitCodeException, visitConstantClass, visitConstantDouble, visitConstantFieldref, visitConstantFloat, visitConstantInteger, visitConstantInterfaceMethodref, visitConstantLong, visitConstantMethodref, visitConstantNameAndType, visitConstantString, visitConstantUtf8, visitConstantValue, visitDeprecated, visitExceptionTable, visitField, visitInnerClass, visitLineNumber, visitLocalVariable, visitLocalVariableTypeTable, visitMethod, visitSignature, visitSourceFile, visitSynthetic, visitUnknown

    Methods inherited from class java.lang.Object

    equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface org.apache.bcel.classfile.Visitor

    visitConstantDynamic, visitMethodParameter, visitModule, visitModuleExports, visitModuleMainClass, visitModuleOpens, visitModulePackages, visitModuleProvides, visitModuleRequires, visitNestHost, visitNestMembers, visitRecord, visitRecordComponent, visitStackMapType
  • Field Details

    • OPTIONAL_SIGNATURE

      private static final String OPTIONAL_SIGNATURE
      See Also:
    • BOXED_OPTIONAL_TYPES

      private static Set<String> BOXED_OPTIONAL_TYPES
    • OPTIONAL_OR_ELSE_METHOD

      private static final FQMethod OPTIONAL_OR_ELSE_METHOD
    • OPTIONAL_OR_ELSE_GET_METHOD

      private static final FQMethod OPTIONAL_OR_ELSE_GET_METHOD
    • OPTIONAL_GET_METHOD

      private static final FQMethod OPTIONAL_GET_METHOD
    • OR_ELSE_METHODS

      private static final Set<FQMethod> OR_ELSE_METHODS
    • OR_ELSE_GET_METHODS

      private static final Set<FQMethod> OR_ELSE_GET_METHODS
    • OPTIONAL_CLASSES

      private static final Set<String> OPTIONAL_CLASSES
      java.util.Optional is handled in the detector OptionalIssues
    • TRIVIAL_METHODS

      private static final Set<FQMethod> TRIVIAL_METHODS
    • INVOKE_OPS

      private static final BitSet INVOKE_OPS
    • SUPPLIER_CLASS

      private org.apache.bcel.classfile.JavaClass SUPPLIER_CLASS
    • bugReporter

      private edu.umd.cs.findbugs.BugReporter bugReporter
    • stack

      private edu.umd.cs.findbugs.OpcodeStack stack
    • currentClass

      private org.apache.bcel.classfile.JavaClass currentClass
    • activeStackOps

      private Deque<OptionalIssues.ActiveStackOp> activeStackOps
    • boxedItems

      private Map<edu.umd.cs.findbugs.OpcodeStack.Item,edu.umd.cs.findbugs.SourceLineAnnotation> boxedItems
    • methodIsConstrained

      private Boolean methodIsConstrained
  • Constructor Details

    • OptionalIssues

      public OptionalIssues(edu.umd.cs.findbugs.BugReporter bugReporter)
      constructs a OI detector given the reporter to report bugs on
      Parameters:
      bugReporter - the sync of bug reports
  • Method Details

    • visitClassContext

      public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
      implements the visitor to filter out pre-1.8 classes, for 1.8+ classes, it creates the opcode stack and active stack ops
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
      Parameters:
      classContext - the context object of the currently parsed class
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      implements the visitor clear the stacks
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
      Parameters:
      obj - the context object of the currently parsed code block
    • sawOpcode

      public void sawOpcode(int seen)
      implements the visitor to look for reference compares of Optional, Optional use when more specific Optionals should be used, and use of orElse when orElseGet would be more appropriate
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
      Parameters:
      seen - the opcode of the currently parsed instruction
    • isTrivialStackOps

      private boolean isTrivialStackOps()
      returns whether the set of operations that contributed to the current stack form, are trivial or not, specifically boxing a primitive value, or appending to strings or such.
      Returns:
      the operations that caused the current stack to exist are trivial
    • getLambdaMethod

      @Nullable private org.apache.bcel.classfile.Method getLambdaMethod(String methodName)
      finds the bootstrap method for a lambda (invokedynamic call. As findbugs doesn't support bcel 6, have to cheat a little here.
      Parameters:
      methodName - the lambda name
      Returns:
      the method object if it exists
    • hasInvoke

      private boolean hasInvoke(byte[] byteCode)
      returns whether the byte code of a method has an invokeXXX statement in it
      Parameters:
      byteCode - the byte code of a method to check
      Returns:
      if there is an invokeXX method found
    • isMethodConstrained

      private boolean isMethodConstrained()