From c5659933ef58ddbb003ecc30694a9e3e77b20c57 Mon Sep 17 00:00:00 2001 From: Jan Chyb <48855024+jchyb@users.noreply.github.com> Date: Tue, 7 May 2024 18:46:27 +0200 Subject: [PATCH] Revert "Regression: fix compilation performance on Windows" --- compiler/src/dotty/tools/io/AbstractFile.scala | 6 ++++++ compiler/src/dotty/tools/io/NoAbstractFile.scala | 2 ++ compiler/src/dotty/tools/io/PlainFile.scala | 13 +++++++++++-- compiler/src/dotty/tools/io/VirtualDirectory.scala | 6 ++++++ compiler/src/dotty/tools/io/VirtualFile.scala | 6 ++++++ compiler/src/dotty/tools/io/ZipArchive.scala | 2 ++ 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/compiler/src/dotty/tools/io/AbstractFile.scala b/compiler/src/dotty/tools/io/AbstractFile.scala index ee72297c2a4f..233b1ca8fb62 100644 --- a/compiler/src/dotty/tools/io/AbstractFile.scala +++ b/compiler/src/dotty/tools/io/AbstractFile.scala @@ -136,6 +136,12 @@ abstract class AbstractFile extends Iterable[AbstractFile] { /** Does this abstract file represent something which can contain classfiles? */ def isClassContainer: Boolean = isDirectory || (jpath != null && ext.isJarOrZip) + /** Create a file on disk, if one does not exist already. */ + def create(): Unit + + /** Delete the underlying file or directory (recursively). */ + def delete(): Unit + /** Is this abstract file a directory? */ def isDirectory: Boolean diff --git a/compiler/src/dotty/tools/io/NoAbstractFile.scala b/compiler/src/dotty/tools/io/NoAbstractFile.scala index bef045e290a5..13c2c6851d2b 100644 --- a/compiler/src/dotty/tools/io/NoAbstractFile.scala +++ b/compiler/src/dotty/tools/io/NoAbstractFile.scala @@ -17,6 +17,8 @@ import java.io.InputStream object NoAbstractFile extends AbstractFile { def absolute: AbstractFile = this def container: AbstractFile = this + def create(): Unit = ??? + def delete(): Unit = ??? def jpath: JPath = null def input: InputStream = null def isDirectory: Boolean = false diff --git a/compiler/src/dotty/tools/io/PlainFile.scala b/compiler/src/dotty/tools/io/PlainFile.scala index a6a39d9ff3eb..acef191d3072 100644 --- a/compiler/src/dotty/tools/io/PlainFile.scala +++ b/compiler/src/dotty/tools/io/PlainFile.scala @@ -13,8 +13,9 @@ import java.nio.file.{InvalidPathException, Paths} /** ''Note: This library is considered experimental and should not be used unless you know what you are doing.'' */ class PlainDirectory(givenPath: Directory) extends PlainFile(givenPath) { - override val isDirectory: Boolean = true + override def isDirectory: Boolean = true override def iterator(): Iterator[PlainFile] = givenPath.list.filter(_.exists).map(new PlainFile(_)) + override def delete(): Unit = givenPath.deleteRecursively() } /** This class implements an abstract file backed by a File. @@ -77,7 +78,7 @@ class PlainFile(val givenPath: Path) extends AbstractFile { } /** Is this abstract file a directory? */ - val isDirectory: Boolean = givenPath.isDirectory // cached for performance on Windows + def isDirectory: Boolean = givenPath.isDirectory /** Returns the time that this abstract file was last modified. */ def lastModified: Long = givenPath.lastModified.toMillis @@ -112,6 +113,14 @@ class PlainFile(val givenPath: Path) extends AbstractFile { null } + /** Does this abstract file denote an existing file? */ + def create(): Unit = if (!exists) givenPath.createFile() + + /** Delete the underlying file or directory (recursively). */ + def delete(): Unit = + if (givenPath.isFile) givenPath.delete() + else if (givenPath.isDirectory) givenPath.toDirectory.deleteRecursively() + /** Returns a plain file with the given name. It does not * check that it exists. */ diff --git a/compiler/src/dotty/tools/io/VirtualDirectory.scala b/compiler/src/dotty/tools/io/VirtualDirectory.scala index 949f2d0e61dd..157f63a2ac1a 100644 --- a/compiler/src/dotty/tools/io/VirtualDirectory.scala +++ b/compiler/src/dotty/tools/io/VirtualDirectory.scala @@ -34,6 +34,12 @@ extends AbstractFile { override def input: InputStream = sys.error("directories cannot be read") override def output: OutputStream = sys.error("directories cannot be written") + /** Does this abstract file denote an existing file? */ + def create(): Unit = { unsupported() } + + /** Delete the underlying file or directory (recursively). */ + def delete(): Unit = { unsupported() } + /** Returns an abstract file with the given name. It does not * check that it exists. */ diff --git a/compiler/src/dotty/tools/io/VirtualFile.scala b/compiler/src/dotty/tools/io/VirtualFile.scala index 6fb9859503f2..9d290a9b0e6a 100644 --- a/compiler/src/dotty/tools/io/VirtualFile.scala +++ b/compiler/src/dotty/tools/io/VirtualFile.scala @@ -82,6 +82,12 @@ class VirtualFile(val name: String, override val path: String) extends AbstractF Iterator.empty } + /** Does this abstract file denote an existing file? */ + def create(): Unit = unsupported() + + /** Delete the underlying file or directory (recursively). */ + def delete(): Unit = unsupported() + /** * Returns the abstract file in this abstract directory with the * specified name. If there is no such file, returns null. The diff --git a/compiler/src/dotty/tools/io/ZipArchive.scala b/compiler/src/dotty/tools/io/ZipArchive.scala index a23bde8faaed..9af935690ffc 100644 --- a/compiler/src/dotty/tools/io/ZipArchive.scala +++ b/compiler/src/dotty/tools/io/ZipArchive.scala @@ -61,6 +61,8 @@ abstract class ZipArchive(override val jpath: JPath, release: Option[String]) ex def isDirectory: Boolean = true def lookupName(name: String, directory: Boolean): AbstractFile = unsupported() def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile = unsupported() + def create(): Unit = unsupported() + def delete(): Unit = unsupported() def output: OutputStream = unsupported() def container: AbstractFile = unsupported() def absolute: AbstractFile = unsupported()