@NotNull
    @Override
    public List<TypeParameterDescriptor> getParameters() {
      if (parameters == null) {
        JetClassLikeInfo classInfo = declarationProvider.getOwnerInfo();
        List<JetTypeParameter> typeParameters = classInfo.getTypeParameters();
        parameters = new ArrayList<TypeParameterDescriptor>(typeParameters.size());

        for (int i = 0; i < typeParameters.size(); i++) {
          parameters.add(
              new LazyTypeParameterDescriptor(
                  resolveSession, LazyClassDescriptor.this, typeParameters.get(i), i));
        }
      }
      return parameters;
    }
 private void findAndDisconnectLoopsInTypeHierarchy(List<JetType> supertypes) {
   for (Iterator<JetType> iterator = supertypes.iterator(); iterator.hasNext(); ) {
     JetType supertype = iterator.next();
     if (isReachable(supertype.getConstructor(), this, new HashSet<TypeConstructor>())) {
       iterator.remove();
     }
   }
 }