@NotNull
  @Override
  public LightClassConstructionContext getContextForClassOrObject(
      @NotNull JetClassOrObject classOrObject) {
    ResolveSessionForBodies session =
        KotlinCacheService.getInstance(classOrObject.getProject())
            .getLazyResolveSession(classOrObject);

    if (classOrObject.isLocal()) {
      BindingContext bindingContext = session.resolveToElement(classOrObject, BodyResolveMode.FULL);
      ClassDescriptor descriptor = bindingContext.get(BindingContext.CLASS, classOrObject);

      if (descriptor == null) {
        LOG.warn(
            "No class descriptor in context for class: "
                + PsiUtilPackage.getElementTextWithContext(classOrObject));
        return new LightClassConstructionContext(bindingContext, session.getModuleDescriptor());
      }

      ForceResolveUtil.forceResolveAllContents(descriptor);

      return new LightClassConstructionContext(bindingContext, session.getModuleDescriptor());
    }

    ForceResolveUtil.forceResolveAllContents(session.getClassDescriptor(classOrObject));
    return new LightClassConstructionContext(
        session.getBindingContext(), session.getModuleDescriptor());
  }
 @Nullable
 @Override
 public PsiClass getPsiClass(@NotNull JetClassOrObject classOrObject) {
   VirtualFile virtualFile = classOrObject.getContainingFile().getVirtualFile();
   if (virtualFile != null
       && LibraryUtil.findLibraryEntry(virtualFile, classOrObject.getProject()) != null) {
     if (ProjectRootsUtil.isLibraryClassFile(project, virtualFile)) {
       return getLightClassForDecompiledClassOrObject(classOrObject);
     }
     return JetSourceNavigationHelper.getOriginalClass(classOrObject);
   }
   return KotlinLightClassForExplicitDeclaration.create(psiManager, classOrObject);
 }