public @NotNull List<T> getExtensions() {
    PersistentList<T> result = cache;
    if (result != null) {
      return result;
    }

    // it is ok to call getExtensionPoint several times - call is cheap, and implementation is thread-safe
    ExtensionPoint<T> extensionPoint = this.extensionPoint;
    if (extensionPoint == null) {
      extensionPoint = extensionPointSupplier.get();
      this.extensionPoint = extensionPoint;
    }

    PersistentList<T> extensions = toPersistentList(extensionPoint.getExtensionList());
    synchronized (lock) {
      result = cache;
      if (result != null) {
        return result;
      }

      // EP will not add duplicated listener, so, it is safe to not care about is already added
      extensionPoint.addExtensionPointListener(extensionPointAndAreaListener, false, null);
      result = explicitExtensions.isEmpty() ? extensions : explicitExtensions.addAll(extensions);
      cache = result;
      return result;
    }
  }
public @NotNull List<T> getExtensions()