package com.wix.files; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.wix.Util; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; public final class ActualFileManager { private static final Logger LOG = Logger.getInstance(Util.LOG_ID); private ActualFileManager() { } @Nullable public static BaseActualFile getOrCreateActualFile(@NotNull Key<ThreadLocalTempActualFile> key, @NotNull PsiFile psiFile, @Nullable String content) { // Original file VirtualFile virtualFile = psiFile.getVirtualFile(); FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); if (!fileDocumentManager.isFileModified(virtualFile)) { File file = new File(virtualFile.getPath()); if (file.isFile()) { return new OriginalFile(psiFile, file); } } // TEMP File ThreadLocalTempActualFile threadLocal = key.get(virtualFile); if (threadLocal == null) { threadLocal = virtualFile.putUserDataIfAbsent(key, new ThreadLocalTempActualFile("scss-temp", psiFile)); } RelativeFile file = threadLocal.getOrCreateFile(); if (file == null) { return null; } if (content == null) { Document document = fileDocumentManager.getDocument(virtualFile); if (document != null) { content = document.getText(); } } if (content == null) { return null; } try { FileUtil.writeToFile(file.file, content); return new TempFile(psiFile, new File(virtualFile.getPath()), file); } catch (IOException e) { LOG.warn("Can not write to " + file.file.getAbsolutePath(), e); } return null; } public static void dispose(BaseActualFile actualCodeFile) { if (actualCodeFile != null) { actualCodeFile.deleteTemp(); } } }