Class FunctionalInterfaceIssues

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.FunctionalInterfaceIssues
All Implemented Interfaces:
edu.umd.cs.findbugs.Detector, edu.umd.cs.findbugs.Priorities, org.apache.bcel.classfile.Visitor

@CustomUserValue public class FunctionalInterfaceIssues extends edu.umd.cs.findbugs.BytecodeScanningDetector
looks for issues around use of @FunctionalInterface classes, especially in use with Streams.. The first pass walks thru all the regular methods looking for InvokeVirtuals The second pass walks thru all the synthetic methods looking for anonymous methods Future Ids: - filter before map, where the filter does what the map does
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    (package private) static enum 
     
    (package private) static class 
     
    (package private) static enum 
     
    (package private) static enum 
     
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
     
    private Map<String,BugType>
     
    private static final FQMethod
     
    private org.apache.bcel.classfile.BootstrapMethods
     
    private edu.umd.cs.findbugs.BugReporter
     
    private org.apache.bcel.classfile.JavaClass
     
    private static final FQMethod
     
    private org.apache.bcel.classfile.JavaClass
     
    private static final QMethod
     
    private static final FQMethod
     
    private static final FQMethod
     
    private static final FQMethod
     
     
    private static final FQMethod
     
    private boolean
     
    private static final FQMethod
     
    private static final FQMethod
     
    private static final FQMethod
     
     
    private static final QMethod
     
    private edu.umd.cs.findbugs.OpcodeStack
     
    private static final QMethod
     
    private static final QMethod
     
    private static final FQMethod
     
    private static final 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
    FunctionalInterfaceIssues(edu.umd.cs.findbugs.BugReporter bugReporter)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
     
    private String
    getAnonymousName(org.apache.bcel.classfile.ConstantMethodHandle cmh)
     
    private org.apache.bcel.classfile.BootstrapMethods
    getBootstrapAttribute(org.apache.bcel.classfile.JavaClass clz)
     
    private org.apache.bcel.classfile.ConstantMethodHandle
    getMethodHandle(int bootstrapIndex)
     
    private boolean
    isSynthetic(String methodName, String methodSig)
     
    void
    sawOpcode(int seen)
     
    void
    visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
     
    void
    visitCode(org.apache.bcel.classfile.Code obj)
     

    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

    • CONTAINS

      private static final QMethod CONTAINS
    • SIZE

      private static final QMethod SIZE
    • TOARRAY

      private static final QMethod TOARRAY
    • STREAM

      private static final QMethod STREAM
    • ASLIST

      private static final FQMethod ASLIST
    • COLLECT

      private static final FQMethod COLLECT
    • FILTER

      private static final FQMethod FILTER
    • FINDFIRST

      private static final FQMethod FINDFIRST
    • ISPRESENT

      private static final FQMethod ISPRESENT
    • TOLIST

      private static final FQMethod TOLIST
    • TOSET

      private static final FQMethod TOSET
    • COUNT

      private static final FQMethod COUNT
    • GET

      private static final FQMethod GET
    • MAP

      private static final FQMethod MAP
    • LIMIT

      private static final FQMethod LIMIT
    • collectionClass

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

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

      private org.apache.bcel.classfile.JavaClass cls
    • stack

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

      private org.apache.bcel.classfile.BootstrapMethods bootstrapAtt
    • functionalInterfaceInfo

      private Map<String,List<FunctionalInterfaceIssues.FIInfo>> functionalInterfaceInfo
    • anonymousBugType

      private Map<String,BugType> anonymousBugType
    • parseState

    • anonState

    • isParmLambda

      private boolean isParmLambda
  • Constructor Details

    • FunctionalInterfaceIssues

      public FunctionalInterfaceIssues(edu.umd.cs.findbugs.BugReporter bugReporter)
  • Method Details

    • visitClassContext

      public void visitClassContext(edu.umd.cs.findbugs.ba.ClassContext classContext)
      Specified by:
      visitClassContext in interface edu.umd.cs.findbugs.Detector
      Overrides:
      visitClassContext in class edu.umd.cs.findbugs.BytecodeScanningDetector
    • visitCode

      public void visitCode(org.apache.bcel.classfile.Code obj)
      Specified by:
      visitCode in interface org.apache.bcel.classfile.Visitor
      Overrides:
      visitCode in class edu.umd.cs.findbugs.visitclass.PreorderVisitor
    • sawOpcode

      public void sawOpcode(int seen)
      Overrides:
      sawOpcode in class edu.umd.cs.findbugs.visitclass.DismantleBytecode
    • checkLimit

      public void checkLimit()
    • getBootstrapAttribute

      @Nullable private org.apache.bcel.classfile.BootstrapMethods getBootstrapAttribute(org.apache.bcel.classfile.JavaClass clz)
    • getMethodHandle

      @Nullable private org.apache.bcel.classfile.ConstantMethodHandle getMethodHandle(int bootstrapIndex)
    • getAnonymousName

      @Nullable private String getAnonymousName(org.apache.bcel.classfile.ConstantMethodHandle cmh)
    • isSynthetic

      private boolean isSynthetic(String methodName, String methodSig)