Skip to content

Commit

Permalink
Temporary files should now be written with the selected file encoding…
Browse files Browse the repository at this point in the history
… rather than UTF-8
  • Loading branch information
jshiell committed Feb 12, 2017
1 parent 9367dbd commit 66ddb0f
Showing 1 changed file with 31 additions and 29 deletions.
Expand Up @@ -2,15 +2,13 @@

import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import org.infernus.idea.checkstyle.CheckStylePlugin;
import org.jetbrains.annotations.NotNull;
Expand All @@ -24,6 +22,7 @@
import java.util.regex.Matcher;
import java.util.stream.Collectors;

import static java.util.Optional.ofNullable;
import static org.infernus.idea.checkstyle.checker.PsiFileValidator.isScannable;

/**
Expand Down Expand Up @@ -52,8 +51,7 @@ public ScannableFile(@NotNull final PsiFile psiFile,
throws IOException {
this.psiFile = psiFile;

if (!existsOnFilesystem(psiFile)
|| documentIsModifiedAndUnsaved(psiFile.getVirtualFile())) {
if (!existsOnFilesystem(psiFile) || documentIsModifiedAndUnsaved(psiFile)) {
baseTempDir = prepareBaseTmpDir();
realFile = createTemporaryFileFor(psiFile, module, baseTempDir);

Expand All @@ -70,7 +68,7 @@ public static List<ScannableFile> createAndValidate(@NotNull final Collection<Ps
final AccessToken readAccessToken = ApplicationManager.getApplication().acquireReadActionLock();
try {
return psiFiles.stream()
.filter(psiFile -> isScannable(psiFile, Optional.ofNullable(module), plugin.getConfiguration()))
.filter(psiFile -> isScannable(psiFile, ofNullable(module), plugin.getConfiguration()))
.map(psiFile -> ScannableFile.create(psiFile, module))
.filter(Objects::nonNull)
.collect(Collectors.toList());
Expand Down Expand Up @@ -101,10 +99,9 @@ private static ScannableFile create(@NotNull final PsiFile psiFile,
}

private String pathOf(@NotNull final PsiFile file) {
if (file.getVirtualFile() != null) {
return file.getVirtualFile().getPath();
}
throw new IllegalStateException("PSIFile does not have associated virtual file: " + file);
return virtualFileOf(file)
.map(VirtualFile::getPath)
.orElseThrow(() -> new IllegalStateException("PSIFile does not have associated virtual file: " + file));
}

private File createTemporaryFileFor(@NotNull final PsiFile file,
Expand Down Expand Up @@ -160,35 +157,29 @@ private File prepareBaseTmpDir() {
}

private boolean existsOnFilesystem(@NotNull final PsiFile file) {
final VirtualFile virtualFile = file.getVirtualFile();
return virtualFile != null
&& LocalFileSystem.getInstance().exists(virtualFile);
return virtualFileOf(file)
.map(virtualFile -> LocalFileSystem.getInstance().exists(virtualFile))
.orElseGet(() -> false);
}

private boolean documentIsModifiedAndUnsaved(final VirtualFile virtualFile) {
if (virtualFile == null) {
return false;
}
private boolean documentIsModifiedAndUnsaved(final PsiFile file) {
final FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance();
if (fileDocumentManager.isFileModified(virtualFile)) {
final Document document = fileDocumentManager.getDocument(virtualFile);
if (document != null) {
return fileDocumentManager.isDocumentUnsaved(document);
}
}
return false;
return virtualFileOf(file)
.filter(fileDocumentManager::isFileModified)
.map(fileDocumentManager::getDocument)
.map(fileDocumentManager::isDocumentUnsaved)
.orElseGet(() -> false);
}

private void writeContentsToFile(final PsiFile file,
final File outFile)
throws IOException {
final CodeStyleSettings codeStyleSettings
= CodeStyleSettingsManager.getSettings(file.getProject());
final String lineSeparator = CodeStyleSettingsManager.getSettings(file.getProject()).getLineSeparator();

final Writer tempFileOut = writerTo(outFile);
final Writer tempFileOut = writerTo(outFile, charSetOf(file));
for (final char character : file.getText().toCharArray()) {
if (character == '\n') { // IDEA uses \n internally
tempFileOut.write(codeStyleSettings.getLineSeparator());
tempFileOut.write(lineSeparator);
} else {
tempFileOut.write(character);
}
Expand All @@ -198,10 +189,21 @@ private void writeContentsToFile(final PsiFile file,
}

@NotNull
private Writer writerTo(final File outFile) throws FileNotFoundException {
private Charset charSetOf(final PsiFile file) {
return virtualFileOf(file)
.map(VirtualFile::getCharset)
.orElseGet(() -> Charset.forName("UTF-8"));
}

private Optional<VirtualFile> virtualFileOf(final PsiFile file) {
return ofNullable(file.getVirtualFile());
}

@NotNull
private Writer writerTo(final File outFile, final Charset charset) throws FileNotFoundException {
return new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(outFile), Charset.forName("UTF-8").newEncoder()));
new FileOutputStream(outFile), charset.newEncoder()));
}

public File getFile() {
Expand Down

0 comments on commit 66ddb0f

Please sign in to comment.