diff --git a/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java b/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java index 8b67321dc6c8..747320136660 100644 --- a/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java +++ b/platform/core-api/src/com/intellij/openapi/vfs/VirtualFile.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -125,6 +125,7 @@ public abstract class VirtualFile extends UserDataHolderBase implements Modifica * @return the path */ @SuppressWarnings("JavadocReference") + @NotNull public abstract String getPath(); /** @@ -727,4 +728,12 @@ public abstract class VirtualFile extends UserDataHolderBase implements Modifica public static boolean isValidName(@NotNull String name) { return name.indexOf('\\') < 0 && name.indexOf('/') < 0; } + + private static final Key DETECTED_LINE_SEPARATOR_KEY = Key.create("DETECTED_LINE_SEPARATOR_KEY"); + public String getDetectedLineSeparator() { + return getUserData(DETECTED_LINE_SEPARATOR_KEY); + } + public void setDetectedLineSeparator(String separator) { + putUserData(DETECTED_LINE_SEPARATOR_KEY, separator); + } } diff --git a/platform/core-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java b/platform/core-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java index d621140f132b..4e4114d463ae 100644 --- a/platform/core-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java +++ b/platform/core-impl/src/com/intellij/openapi/fileEditor/impl/LoadTextUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,7 +40,6 @@ import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; public final class LoadTextUtil { - private static final Key DETECTED_LINE_SEPARATOR_KEY = Key.create("DETECTED_LINE_SEPARATOR_KEY"); @Nls private static final String AUTO_DETECTED_FROM_BOM = "auto-detected from BOM"; private LoadTextUtil() { @@ -215,7 +214,7 @@ public final class LoadTextUtil { } String newText = StringUtil.convertLineSeparators(currentText.toString(), newSeparator); - file.putUserData(DETECTED_LINE_SEPARATOR_KEY, newSeparator); + file.setDetectedLineSeparator(newSeparator); write(project, file, requestor, newText, -1); } @@ -397,7 +396,7 @@ public final class LoadTextUtil { Pair result = convertBytes(bytes, charset, offset); if (saveDetectedSeparators) { - virtualFile.putUserData(DETECTED_LINE_SEPARATOR_KEY, result.getSecond()); + virtualFile.setDetectedLineSeparator(result.getSecond()); } return result.getFirst(); } @@ -425,7 +424,7 @@ public final class LoadTextUtil { } static String getDetectedLineSeparator(@NotNull VirtualFile file) { - return file.getUserData(DETECTED_LINE_SEPARATOR_KEY); + return file.getDetectedLineSeparator(); } @NotNull diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java index 33c024fc5cfe..94f73699ef99 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.NewVirtualFileSystem; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; +import com.intellij.util.LineSeparator; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -124,4 +125,19 @@ public class VirtualFileImpl extends VirtualFileSystemEntry { public OutputStream getOutputStream(final Object requestor, final long modStamp, final long timeStamp) throws IOException { return VfsUtilCore.outputStreamAddingBOM(ourPersistence.getOutputStream(this, requestor, modStamp, timeStamp), this); } + + @Override + public String getDetectedLineSeparator() { + if (getFlagInt(SYSTEM_LINE_SEPARATOR_DETECTED)) { + return LineSeparator.getSystemLineSeparator().getSeparatorString(); + } + return super.getDetectedLineSeparator(); + } + + @Override + public void setDetectedLineSeparator(String separator) { + boolean hasSystemSeparator = LineSeparator.getSystemLineSeparator().getSeparatorString().equals(separator); + setFlagInt(SYSTEM_LINE_SEPARATOR_DETECTED, hasSystemSeparator); + super.setDetectedLineSeparator(hasSystemSeparator ? null : separator); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java index 2d5b5195dad6..29844fb0e1c5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/impl/VirtualFileSystemEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,14 +52,15 @@ public abstract class VirtualFileSystemEntry extends NewVirtualFile { private static final Key SYMLINK_TARGET = Key.create("local.vfs.symlink.target"); + private static final int IS_WRITABLE_FLAG = 0x01000000; + private static final int IS_HIDDEN_FLAG = 0x02000000; + private static final int INDEXED_FLAG = 0x04000000; + static final int CHILDREN_CACHED = 0x08000000; // makes sense for directory only private static final int DIRTY_FLAG = 0x10000000; private static final int IS_SYMLINK_FLAG = 0x20000000; private static final int HAS_SYMLINK_FLAG = 0x40000000; private static final int IS_SPECIAL_FLAG = 0x80000000; - private static final int IS_WRITABLE_FLAG = 0x01000000; - private static final int IS_HIDDEN_FLAG = 0x02000000; - private static final int INDEXED_FLAG = 0x04000000; - static final int CHILDREN_CACHED = 0x08000000; + static final int SYSTEM_LINE_SEPARATOR_DETECTED = CHILDREN_CACHED; // makes sense only for non-directory file private static final int ALL_FLAGS_MASK = DIRTY_FLAG | IS_SYMLINK_FLAG | HAS_SYMLINK_FLAG | IS_SPECIAL_FLAG | IS_WRITABLE_FLAG | IS_HIDDEN_FLAG | INDEXED_FLAG | CHILDREN_CACHED;