@Override
  public final XmlElementDescriptor getElementDescriptor(final XmlTag childTag, XmlTag contextTag) {
    final ConcurrentMap<RngElementDescriptor, CachedValue<XmlElementDescriptor>> descriptorMap =
      CachedValuesManager.getCachedValue(
        childTag, () -> CachedValueProvider.Result.create(ContainerUtil.createConcurrentWeakMap(), ModificationTracker.NEVER_CHANGED));
    final XmlElementDescriptor value = descriptorMap.computeIfAbsent(this,  descr -> {
      return CachedValuesManager.getManager(childTag.getProject()).createCachedValue(() -> {
        final XmlElementDescriptor descriptor = descr.findElementDescriptor(childTag);
        return CachedValueProvider.Result.create(descriptor, descr.getDependencies(), childTag);
      });
    }).getValue();
    return value == NULL ? null : value;
  }
@Override
  public final XmlElementDescriptor getElementDescriptor(final XmlTag childTag, XmlTag contextTag)