@Nullable
    @Override
    protected ClassData getClassData(@NotNull ClassId classId) {
      InputStream stream =
          getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId));
      if (stream == null) {
        return null;
      }

      try {
        ProtoBuf.Class classProto = ProtoBuf.Class.parseFrom(stream);

        Name expectedShortName = classId.getRelativeClassName().shortName();
        Name actualShortName =
            nameResolver.getClassId(classProto.getFqName()).getRelativeClassName().shortName();
        if (!actualShortName.isSpecial() && !actualShortName.equals(expectedShortName)) {
          // Workaround for case-insensitive file systems,
          // otherwise we'd find "Collection" for "collection" etc
          return null;
        }

        return new ClassData(nameResolver, classProto);
      } catch (IOException e) {
        throw new IllegalStateException(e);
      }
    }
 @Nullable
 private static JetTypeConstraint findTypeParameterConstraint(
     @NotNull JetFunction function, @NotNull Name typeParameterName, int index) {
   if (index != 0) {
     int currentIndex = 0;
     for (JetTypeConstraint constraint : function.getTypeConstraints()) {
       JetSimpleNameExpression parameterName = constraint.getSubjectTypeParameterName();
       assert parameterName != null;
       if (typeParameterName.equals(parameterName.getReferencedNameAsName())) {
         currentIndex++;
       }
       if (currentIndex == index) {
         return constraint;
       }
     }
   }
   return null;
 }