public int boundCheck(Substitution var1, TypeBinding var2) {
   if (var2 != TypeBinding.field_187 && var2 != this) {
     boolean var3 = var1 != null;
     if (!(var2 instanceof ReferenceBinding) && !var2.method_147()) {
       return 2;
     } else if (this.superclass == null) {
       return 0;
     } else {
       TypeBinding var8;
       if (var2.kind() != 516) {
         boolean var14 = false;
         if (this.superclass.id != 1) {
           Object var15 = var3 ? Scope.substitute(var1, this.superclass) : this.superclass;
           if (var15 != var2) {
             if (!var2.isCompatibleWith((TypeBinding) var15)) {
               return 2;
             }
             TypeBinding var18 = var2.method_140((TypeBinding) var15);
             if (var18 != null && var18.method_166() && ((TypeBinding) var15).method_149()) {
               var14 = true;
             }
           }
         }
         int var16 = 0;
         for (int var17 = this.superInterfaces.length; var16 < var17; ++var16) {
           Object var19 =
               var3
                   ? Scope.substitute(var1, this.superInterfaces[var16])
                   : this.superInterfaces[var16];
           if (var19 != var2) {
             if (!var2.isCompatibleWith((TypeBinding) var19)) {
               return 2;
             }
             var8 = var2.method_140((TypeBinding) var19);
             if (var8 != null && var8.method_166() && ((TypeBinding) var19).method_149()) {
               var14 = true;
             }
           }
         }
         return var14 ? 1 : 0;
       } else {
         WildcardBinding var4 = (WildcardBinding) var2;
         switch (var4.field_215) {
           case 1:
             TypeBinding var5 = var4.bound;
             if (var5 == this) {
               return 0;
             } else {
               ReferenceBinding var6 =
                   var3
                       ? (ReferenceBinding) Scope.substitute(var1, this.superclass)
                       : this.superclass;
               boolean var7 = var5.method_147();
               if (!var5.method_157() && var6.id != 1) {
                 if (var7) {
                   if (!var5.isCompatibleWith(var6)) {
                     return 2;
                   }
                 } else {
                   var8 = var5.method_140(var6);
                   if (var8 != null) {
                     if (var6.method_164(var8)) {
                       return 2;
                     }
                   } else {
                     var8 = var6.method_140(var5);
                     if (var8 != null) {
                       if (var8.method_164(var5)) {
                         return 2;
                       }
                     } else if (!var5.method_169() && !var6.method_169()) {
                       return 2;
                     }
                   }
                 }
               }
               ReferenceBinding[] var20 =
                   var3 ? Scope.substitute(var1, this.superInterfaces) : this.superInterfaces;
               int var9 = var20.length;
               boolean var10 = var7 || ((ReferenceBinding) var5).method_221();
               for (int var11 = 0; var11 < var9; ++var11) {
                 ReferenceBinding var12 = var20[var11];
                 if (var7) {
                   if (!var5.isCompatibleWith(var12)) {
                     return 2;
                   }
                 } else {
                   TypeBinding var13 = var5.method_140(var12);
                   if (var13 != null) {
                     if (var12.method_164(var13)) {
                       return 2;
                     }
                   } else if (var10) {
                     return 2;
                   }
                 }
               }
             }
           case 0:
           default:
             return 0;
           case 2:
             return this.boundCheck(var1, var4.bound);
         }
       }
     }
   } else {
     return 0;
   }
 }