summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--changelog.md2
-rw-r--r--compiler/pathutils.nim3
-rw-r--r--compiler/vmops.nim2
-rw-r--r--doc/tut1.rst8
-rw-r--r--lib/posix/posix.nim3
-rw-r--r--lib/pure/htmlparser.nim3
-rw-r--r--lib/pure/json.nim3
-rw-r--r--lib/pure/logging.nim11
-rw-r--r--lib/pure/memfiles.nim4
-rw-r--r--lib/pure/os.nim3
-rw-r--r--lib/pure/parsecfg.nim4
-rw-r--r--lib/pure/parsecsv.nim3
-rw-r--r--lib/pure/pegs.nim2
-rw-r--r--lib/pure/ropes.nim3
-rw-r--r--lib/pure/streams.nim9
-rw-r--r--lib/pure/terminal.nim3
-rw-r--r--lib/pure/xmlparser.nim3
-rw-r--r--lib/std/syncio.nim (renamed from lib/system/io.nim)45
-rw-r--r--lib/system.nim9
-rw-r--r--lib/system_overview.rst1
-rw-r--r--lib/windows/winlean.nim3
-rw-r--r--tests/cpp/t6986.nim3
-rw-r--r--tests/test_nimscript.nims3
-rw-r--r--tools/kochdocs.nim1
24 files changed, 92 insertions, 42 deletions
diff --git a/changelog.md b/changelog.md
index bbbaf6e97..412e046eb 100644
--- a/changelog.md
+++ b/changelog.md
@@ -20,6 +20,8 @@
 - `addr` is now available for all addressable locations, `unsafeAddr` is deprecated and
 becomes an alias for `addr`.
 
+- io is about to move out of system; use `-d:nimPreviewSlimSystem` and import `std/syncio`.
+
 ## Standard library additions and changes
 
 - `macros.parseExpr` and `macros.parseStmt` now accept an optional
diff --git a/compiler/pathutils.nim b/compiler/pathutils.nim
index d8f3613b0..8138a245a 100644
--- a/compiler/pathutils.nim
+++ b/compiler/pathutils.nim
@@ -12,6 +12,9 @@
 
 import os, pathnorm
 
+when defined(nimSlimSystem):
+  import std/syncio
+
 type
   AbsoluteFile* = distinct string
   AbsoluteDir* = distinct string
diff --git a/compiler/vmops.nim b/compiler/vmops.nim
index 018e7b9c6..6b06cc68d 100644
--- a/compiler/vmops.nim
+++ b/compiler/vmops.nim
@@ -47,7 +47,7 @@ template systemop(op) {.dirty.} =
   registerCallback(c, "stdlib.system." & astToStr(op), `op Wrapper`)
 
 template ioop(op) {.dirty.} =
-  registerCallback(c, "stdlib.io." & astToStr(op), `op Wrapper`)
+  registerCallback(c, "stdlib.syncio." & astToStr(op), `op Wrapper`)
 
 template macrosop(op) {.dirty.} =
   registerCallback(c, "stdlib.macros." & astToStr(op), `op Wrapper`)
diff --git a/doc/tut1.rst b/doc/tut1.rst
index 3107aef45..405df57b1 100644
--- a/doc/tut1.rst
+++ b/doc/tut1.rst
@@ -84,8 +84,8 @@ done with spaces only, tabulators are not allowed.
 
 String literals are enclosed in double-quotes. The `var` statement declares
 a new variable named `name` of type `string` with the value that is
-returned by the `readLine <io.html#readLine,File>`_ procedure. Since the
-compiler knows that `readLine <io.html#readLine,File>`_ returns a string,
+returned by the `readLine <syncio.html#readLine,File>`_ procedure. Since the
+compiler knows that `readLine <syncio.html#readLine,File>`_ returns a string,
 you can leave out the type in the declaration (this is called `local type
 inference`:idx:). So this will work too:
 
@@ -97,7 +97,7 @@ Note that this is basically the only form of type inference that exists in
 Nim: it is a good compromise between brevity and readability.
 
 The "hello world" program contains several identifiers that are already known
-to the compiler: `echo`, `readLine <io.html#readLine,File>`_, etc.
+to the compiler: `echo`, `readLine <syncio.html#readLine,File>`_, etc.
 These built-ins are declared in the system_ module which is implicitly
 imported by any other module.
 
@@ -594,7 +594,7 @@ Procedures
 ==========
 
 To define new commands like `echo <system.html#echo,varargs[typed,]>`_
-and `readLine <io.html#readLine,File>`_ in the examples, the concept of a
+and `readLine <syncio.html#readLine,File>`_ in the examples, the concept of a
 *procedure* is needed. You might be used to them being called *methods* or
 *functions* in other languages, but Nim
 `differentiates these concepts <tut1.html#procedures-funcs-and-methods>`_. In
diff --git a/lib/posix/posix.nim b/lib/posix/posix.nim
index 912e395a7..c10fc6ac9 100644
--- a/lib/posix/posix.nim
+++ b/lib/posix/posix.nim
@@ -37,6 +37,9 @@
 when defined(nimHasStyleChecks):
   {.push styleChecks: off.}
 
+when defined(nimSlimSystem):
+  import std/syncio
+
 # TODO these constants don't seem to be fetched from a header file for unknown
 #      platforms - where do they come from and why are they here?
 when false:
diff --git a/lib/pure/htmlparser.nim b/lib/pure/htmlparser.nim
index 21dff69ff..6b1300f11 100644
--- a/lib/pure/htmlparser.nim
+++ b/lib/pure/htmlparser.nim
@@ -51,6 +51,9 @@
 
 import strutils, streams, parsexml, xmltree, unicode, strtabs
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 type
   HtmlTag* = enum  ## list of all supported HTML tags; order will always be
                    ## alphabetically
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index 922cd4e2f..bdc9fe5ab 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -164,6 +164,9 @@ import hashes, tables, strutils, lexbase, streams, macros, parsejson
 import options # xxx remove this dependency using same approach as https://github.com/nim-lang/Nim/pull/14563
 import std/private/since
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 export
   tables.`$`
 
diff --git a/lib/pure/logging.nim b/lib/pure/logging.nim
index b2ace79ab..6751a372a 100644
--- a/lib/pure/logging.nim
+++ b/lib/pure/logging.nim
@@ -48,7 +48,7 @@
 ## .. warning::
 ##   For loggers that log to a console or to files, only error and fatal
 ##   messages will cause their output buffers to be flushed immediately.
-##   Use the `flushFile proc <io.html#flushFile,File>`_ to flush the buffer
+##   Use the `flushFile proc <syncio.html#flushFile,File>`_ to flush the buffer
 ##   manually if needed.
 ##
 ## Handlers
@@ -146,6 +146,9 @@ import strutils, times
 when not defined(js):
   import os
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 type
   Level* = enum ## \
     ## Enumeration of logging levels.
@@ -346,7 +349,7 @@ method log*(logger: ConsoleLogger, level: Level, args: varargs[string, `$`]) =
   ##
   ## **Note:** Only error and fatal messages will cause the output buffer
   ## to be flushed immediately. Use the `flushFile proc
-  ## <io.html#flushFile,File>`_ to flush the buffer manually if needed.
+  ## <syncio.html#flushFile,File>`_ to flush the buffer manually if needed.
   ##
   ## See also:
   ## * `log method<#log.e,FileLogger,Level,varargs[string,]>`_
@@ -422,7 +425,7 @@ when not defined(js):
     ## **Notes:**
     ## * Only error and fatal messages will cause the output buffer
     ##   to be flushed immediately. Use the `flushFile proc
-    ##   <io.html#flushFile,File>`_ to flush the buffer manually if needed.
+    ##   <syncio.html#flushFile,File>`_ to flush the buffer manually if needed.
     ## * This method is not available for the JavaScript backend.
     ##
     ## See also:
@@ -600,7 +603,7 @@ when not defined(js):
     ## **Notes:**
     ## * Only error and fatal messages will cause the output buffer
     ##   to be flushed immediately. Use the `flushFile proc
-    ##   <io.html#flushFile,File>`_ to flush the buffer manually if needed.
+    ##   <syncio.html#flushFile,File>`_ to flush the buffer manually if needed.
     ## * This method is not available for the JavaScript backend.
     ##
     ## See also:
diff --git a/lib/pure/memfiles.nim b/lib/pure/memfiles.nim
index 407a358fa..f65ca125e 100644
--- a/lib/pure/memfiles.nim
+++ b/lib/pure/memfiles.nim
@@ -431,7 +431,7 @@ iterator memSlices*(mfile: MemFile, delim = '\l', eat = '\r'): MemSlice {.inline
 iterator lines*(mfile: MemFile, buf: var string, delim = '\l',
     eat = '\r'): string {.inline.} =
   ## Replace contents of passed buffer with each new line, like
-  ## `readLine(File) <io.html#readLine,File,string>`_.
+  ## `readLine(File) <syncio.html#readLine,File,string>`_.
   ## `delim`, `eat`, and delimiting logic is exactly as for `memSlices
   ## <#memSlices.i,MemFile,char,char>`_, but Nim strings are returned.
   ##
@@ -450,7 +450,7 @@ iterator lines*(mfile: MemFile, buf: var string, delim = '\l',
 
 iterator lines*(mfile: MemFile, delim = '\l', eat = '\r'): string {.inline.} =
   ## Return each line in a file as a Nim string, like
-  ## `lines(File) <io.html#lines.i,File>`_.
+  ## `lines(File) <syncio.html#lines.i,File>`_.
   ## `delim`, `eat`, and delimiting logic is exactly as for `memSlices
   ## <#memSlices.i,MemFile,char,char>`_, but Nim strings are returned.
   ##
diff --git a/lib/pure/os.nim b/lib/pure/os.nim
index 07040d611..76164bc49 100644
--- a/lib/pure/os.nim
+++ b/lib/pure/os.nim
@@ -34,6 +34,9 @@ import std/private/since
 
 import strutils, pathnorm
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 const weirdTarget = defined(nimscript) or defined(js)
 
 since (1, 1):
diff --git a/lib/pure/parsecfg.nim b/lib/pure/parsecfg.nim
index 0ee19912c..54584a253 100644
--- a/lib/pure/parsecfg.nim
+++ b/lib/pure/parsecfg.nim
@@ -175,8 +175,12 @@ import strutils, lexbase, streams, tables
 import std/private/decode_helpers
 import std/private/since
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 include "system/inclrtl"
 
+
 type
   CfgEventKind* = enum ## enumeration of all events that may occur when parsing
     cfgEof,            ## end of file reached
diff --git a/lib/pure/parsecsv.nim b/lib/pure/parsecsv.nim
index 6db794682..a8d1cfaab 100644
--- a/lib/pure/parsecsv.nim
+++ b/lib/pure/parsecsv.nim
@@ -67,6 +67,9 @@
 
 import lexbase, streams
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 type
   CsvRow* = seq[string] ## A row in a CSV file.
   CsvParser* = object of BaseLexer ## The parser object.
diff --git a/lib/pure/pegs.nim b/lib/pure/pegs.nim
index bac8b1a0e..0eed1c388 100644
--- a/lib/pure/pegs.nim
+++ b/lib/pure/pegs.nim
@@ -16,6 +16,8 @@
 ##
 
 include "system/inclrtl"
+when defined(nimPreviewSlimSystem):
+  import std/syncio
 
 const
   useUnicode = true ## change this to deactivate proper UTF-8 support
diff --git a/lib/pure/ropes.nim b/lib/pure/ropes.nim
index 1300b4479..84b5b47c2 100644
--- a/lib/pure/ropes.nim
+++ b/lib/pure/ropes.nim
@@ -19,6 +19,9 @@
 include system/inclrtl
 import streams
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 {.push debugger: off.} # the user does not want to trace a part
                        # of the standard library!
 
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index 7dc81148f..7ad81685f 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -92,10 +92,13 @@
 ## See also
 ## ========
 ## * `asyncstreams module <asyncstreams.html>`_
-## * `io module <io.html>`_ for `FileMode enum <io.html#FileMode>`_
+## * `io module <syncio.html>`_ for `FileMode enum <syncio.html#FileMode>`_
 
 import std/private/since
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 proc newEIO(msg: string): owned(ref IOError) =
   new(result)
   result.msg = msg
@@ -1331,7 +1334,7 @@ proc newFileStream*(f: File): owned FileStream =
   ## * `newStringStream proc <#newStringStream,string>`_ creates a new stream
   ##   from string.
   ## * `newFileStream proc <#newFileStream,string,FileMode,int>`_ is the same
-  ##   as using `open proc <io.html#open,File,string,FileMode,int>`_
+  ##   as using `open proc <syncio.html#open,File,string,FileMode,int>`_
   ##   on Examples.
   ## * `openFileStream proc <#openFileStream,string,FileMode,int>`_ creates a
   ##   file stream from the file name and the mode.
@@ -1370,7 +1373,7 @@ proc newFileStream*(filename: string, mode: FileMode = fmRead,
   ## Creates a new stream from the file named `filename` with the mode `mode`.
   ##
   ## If the file cannot be opened, `nil` is returned. See the `io module
-  ## <io.html>`_ for a list of available `FileMode enums <io.html#FileMode>`_.
+  ## <syncio.html>`_ for a list of available `FileMode enums <syncio.html#FileMode>`_.
   ##
   ## **Note:**
   ## * **This function returns nil in case of failure.**
diff --git a/lib/pure/terminal.nim b/lib/pure/terminal.nim
index c9aafc037..5755e142a 100644
--- a/lib/pure/terminal.nim
+++ b/lib/pure/terminal.nim
@@ -66,6 +66,9 @@ import colors
 when defined(windows):
   import winlean
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 type
   PTerminal = ref object
     trueColorIsSupported: bool
diff --git a/lib/pure/xmlparser.nim b/lib/pure/xmlparser.nim
index 3d9c288ed..6785fa66e 100644
--- a/lib/pure/xmlparser.nim
+++ b/lib/pure/xmlparser.nim
@@ -11,6 +11,9 @@
 
 import streams, parsexml, strtabs, xmltree
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 type
   XmlError* = object of ValueError ## Exception that is raised
                                    ## for invalid XML.
diff --git a/lib/system/io.nim b/lib/std/syncio.nim
index 04a43328d..eab96254a 100644
--- a/lib/system/io.nim
+++ b/lib/std/syncio.nim
@@ -1,18 +1,17 @@
 #
 #
 #            Nim's Runtime Library
-#        (c) Copyright 2019 Nim contributors
+#        (c) Copyright 2022 Nim contributors
 #
 #    See the file "copying.txt", included in this
 #    distribution, for details about the copyright.
 #
 
-## This is a part of `system.nim`, you should not manually import it.
+## This module implements various synchronized I/O operations.
 
-
-include inclrtl
+include system/inclrtl
 import std/private/since
-import formatfloat
+import system/formatfloat
 
 # ----------------- IO Part ------------------------------------------------
 type
@@ -179,7 +178,7 @@ proc checkErr(f: File) =
 {.push stackTrace: off, profiler: off.}
 proc readBuffer*(f: File, buffer: pointer, len: Natural): int {.
   tags: [ReadIOEffect], benign.} =
-  ## reads `len` bytes into the buffer pointed to by `buffer`. Returns
+  ## Reads `len` bytes into the buffer pointed to by `buffer`. Returns
   ## the actual number of bytes that have been read which may be less than
   ## `len` (if not as many bytes are remaining), but not greater.
   result = cast[int](c_fread(buffer, 1, cast[csize_t](len), f))
@@ -188,13 +187,13 @@ proc readBuffer*(f: File, buffer: pointer, len: Natural): int {.
 proc readBytes*(f: File, a: var openArray[int8|uint8], start,
     len: Natural): int {.
   tags: [ReadIOEffect], benign.} =
-  ## reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
+  ## Reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
   ## the actual number of bytes that have been read which may be less than
   ## `len` (if not as many bytes are remaining), but not greater.
   result = readBuffer(f, addr(a[start]), len)
 
 proc readChars*(f: File, a: var openArray[char]): int {.tags: [ReadIOEffect], benign.} =
-  ## reads up to `a.len` bytes into the buffer `a`. Returns
+  ## Reads up to `a.len` bytes into the buffer `a`. Returns
   ## the actual number of bytes that have been read which may be less than
   ## `a.len` (if not as many bytes are remaining), but not greater.
   result = readBuffer(f, addr(a[0]), a.len)
@@ -202,7 +201,7 @@ proc readChars*(f: File, a: var openArray[char]): int {.tags: [ReadIOEffect], be
 proc readChars*(f: File, a: var openArray[char], start, len: Natural): int {.
   tags: [ReadIOEffect], benign, deprecated:
     "use other `readChars` overload, possibly via: readChars(toOpenArray(buf, start, len-1))".} =
-  ## reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
+  ## Reads `len` bytes into the buffer `a` starting at `a[start]`. Returns
   ## the actual number of bytes that have been read which may be less than
   ## `len` (if not as many bytes are remaining), but not greater.
   if (start + len) > len(a):
@@ -216,7 +215,7 @@ proc write*(f: File, c: cstring) {.tags: [WriteIOEffect], benign.} =
 
 proc writeBuffer*(f: File, buffer: pointer, len: Natural): int {.
   tags: [WriteIOEffect], benign.} =
-  ## writes the bytes of buffer pointed to by the parameter `buffer` to the
+  ## Writes the bytes of buffer pointed to by the parameter `buffer` to the
   ## file `f`. Returns the number of actual written bytes, which may be less
   ## than `len` in case of an error.
   result = cast[int](c_fwrite(buffer, 1, cast[csize_t](len), f))
@@ -224,7 +223,7 @@ proc writeBuffer*(f: File, buffer: pointer, len: Natural): int {.
 
 proc writeBytes*(f: File, a: openArray[int8|uint8], start, len: Natural): int {.
   tags: [WriteIOEffect], benign.} =
-  ## writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
+  ## Writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
   ## the number of actual written bytes, which may be less than `len` in case
   ## of an error.
   var x = cast[ptr UncheckedArray[int8]](a)
@@ -232,7 +231,7 @@ proc writeBytes*(f: File, a: openArray[int8|uint8], start, len: Natural): int {.
 
 proc writeChars*(f: File, a: openArray[char], start, len: Natural): int {.
   tags: [WriteIOEffect], benign.} =
-  ## writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
+  ## Writes the bytes of `a[start..start+len-1]` to the file `f`. Returns
   ## the number of actual written bytes, which may be less than `len` in case
   ## of an error.
   var x = cast[ptr UncheckedArray[int8]](a)
@@ -341,7 +340,7 @@ proc flushFile*(f: File) {.tags: [WriteIOEffect].} =
   discard c_fflush(f)
 
 proc getFileHandle*(f: File): FileHandle =
-  ## returns the file handle of the file `f`. This is only useful for
+  ## Returns the file handle of the file `f`. This is only useful for
   ## platform specific programming.
   ## Note that on Windows this doesn't return the Windows-specific handle,
   ## but the C library's notion of a handle, whatever that means.
@@ -349,7 +348,7 @@ proc getFileHandle*(f: File): FileHandle =
   c_fileno(f)
 
 proc getOsFileHandle*(f: File): FileHandle =
-  ## returns the OS file handle of the file `f`. This is only useful for
+  ## Returns the OS file handle of the file `f`. This is only useful for
   ## platform specific programming.
   when defined(windows):
     result = FileHandle getOsfhandle(cint getFileHandle(f))
@@ -380,7 +379,7 @@ when defined(nimdoc) or (defined(posix) and not defined(nimscript)) or defined(w
 
 proc readLine*(f: File, line: var string): bool {.tags: [ReadIOEffect],
               benign.} =
-  ## reads a line of text from the file `f` into `line`. May throw an IO
+  ## Reads a line of text from the file `f` into `line`. May throw an IO
   ## exception.
   ## A line of text may be delimited by `LF` or `CRLF`. The newline
   ## character(s) are not part of the returned string. Returns `false`
@@ -500,7 +499,7 @@ proc readLine*(f: File, line: var string): bool {.tags: [ReadIOEffect],
     line.setLen(pos+sp)
 
 proc readLine*(f: File): string {.tags: [ReadIOEffect], benign.} =
-  ## reads a line of text from the file `f`. May throw an IO exception.
+  ## Reads a line of text from the file `f`. May throw an IO exception.
   ## A line of text may be delimited by `LF` or `CRLF`. The newline
   ## character(s) are not part of the returned string.
   result = newStringOfCap(80)
@@ -602,7 +601,7 @@ proc readAll*(file: File): string {.tags: [ReadIOEffect], benign.} =
 
 proc writeLine*[Ty](f: File, x: varargs[Ty, `$`]) {.inline,
                           tags: [WriteIOEffect], benign.} =
-  ## writes the values `x` to `f` and then writes "\\n".
+  ## Writes the values `x` to `f` and then writes "\\n".
   ## May throw an IO exception.
   for i in items(x):
     write(f, i)
@@ -723,7 +722,7 @@ proc open*(f: var File, filename: string,
 
 proc reopen*(f: File, filename: string, mode: FileMode = fmRead): bool {.
   tags: [], benign.} =
-  ## reopens the file `f` with given `filename` and `mode`. This
+  ## Reopens the file `f` with given `filename` and `mode`. This
   ## is often used to redirect the `stdin`, `stdout` or `stderr`
   ## file variables.
   ##
@@ -765,19 +764,19 @@ proc open*(filename: string,
     sysFatal(IOError, "cannot open: " & filename)
 
 proc setFilePos*(f: File, pos: int64, relativeTo: FileSeekPos = fspSet) {.benign.} =
-  ## sets the position of the file pointer that is used for read/write
+  ## Sets the position of the file pointer that is used for read/write
   ## operations. The file's first byte has the index zero.
   if c_fseek(f, pos, cint(relativeTo)) != 0:
     raiseEIO("cannot set file position")
 
 proc getFilePos*(f: File): int64 {.benign.} =
-  ## retrieves the current position of the file pointer that is used to
+  ## Retrieves the current position of the file pointer that is used to
   ## read from the file `f`. The file's first byte has the index zero.
   result = c_ftell(f)
   if result < 0: raiseEIO("cannot retrieve file position")
 
 proc getFileSize*(f: File): int64 {.tags: [ReadIOEffect], benign.} =
-  ## retrieves the file size (in bytes) of `f`.
+  ## Retrieves the file size (in bytes) of `f`.
   let oldPos = getFilePos(f)
   discard c_fseek(f, 0, 2) # seek the end of the file
   result = getFilePos(f)
@@ -906,7 +905,7 @@ proc writeFile*(filename: string, content: openArray[byte]) {.since: (1, 1).} =
     raise newException(IOError, "cannot open: " & filename)
 
 proc readLines*(filename: string, n: Natural): seq[string] =
-  ## read `n` lines from the file named `filename`. Raises an IO exception
+  ## Reads `n` lines from the file named `filename`. Raises an IO exception
   ## in case of an error. Raises EOF if file does not contain at least `n` lines.
   ## Available at compile time. A line of text may be delimited by `LF` or `CRLF`.
   ## The newline character(s) are not part of the returned strings.
@@ -948,7 +947,7 @@ iterator lines*(filename: string): string {.tags: [ReadIOEffect].} =
     close(f)
 
 iterator lines*(f: File): string {.tags: [ReadIOEffect].} =
-  ## Iterate over any line in the file `f`.
+  ## Iterates over any line in the file `f`.
   ##
   ## The trailing newline character(s) are removed from the iterated lines.
   ##
diff --git a/lib/system.nim b/lib/system.nim
index 63cdc3ca8..56a6e2887 100644
--- a/lib/system.nim
+++ b/lib/system.nim
@@ -2680,7 +2680,7 @@ proc slurp*(filename: string): string {.magic: "Slurp".}
   ## This is an alias for `staticRead <#staticRead,string>`_.
 
 proc staticRead*(filename: string): string {.magic: "Slurp".}
-  ## Compile-time `readFile <io.html#readFile,string>`_ proc for easy
+  ## Compile-time `readFile <syncio.html#readFile,string>`_ proc for easy
   ## `resource`:idx: embedding:
   ##
   ## The maximum file size limit that `staticRead` and `slurp` can read is
@@ -3150,8 +3150,11 @@ when defined(genode):
 import system/widestrs
 export widestrs
 
-import system/io
-export io
+when not defined(nimPreviewSlimSystem):
+  {.deprecated: """io is about to move out of system; use `-d:nimPreviewSlimSystem` and
+                import `std/syncio`.""".}
+  import std/syncio
+  export syncio
 
 when not defined(createNimHcr) and not defined(nimscript):
   include nimhcr
diff --git a/lib/system_overview.rst b/lib/system_overview.rst
index 0e4ffaf17..768fdcd6d 100644
--- a/lib/system_overview.rst
+++ b/lib/system_overview.rst
@@ -7,7 +7,6 @@ is in separate files:
 * `iterators <iterators.html>`_
 * `assertions <assertions.html>`_
 * `dollars <dollars.html>`_
-* `io <io.html>`_
 * `widestrs <widestrs.html>`_
 
 
diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim
index 6e626e4ba..c02cd9775 100644
--- a/lib/windows/winlean.nim
+++ b/lib/windows/winlean.nim
@@ -17,6 +17,9 @@ when defined(nimHasStyleChecks):
 
 {.passc: "-DWIN32_LEAN_AND_MEAN".}
 
+when defined(nimPreviewSlimSystem):
+  from std/syncio import FileHandle
+
 const
   useWinUnicode* = not defined(useWinAnsi)
 
diff --git a/tests/cpp/t6986.nim b/tests/cpp/t6986.nim
index ffd277adb..16e455c3b 100644
--- a/tests/cpp/t6986.nim
+++ b/tests/cpp/t6986.nim
@@ -5,6 +5,9 @@ discard """
 
 import sequtils, strutils
 
+when defined(nimPreviewSlimSystem):
+  import std/syncio
+
 
 let rules = toSeq(lines("input"))
   .mapIt(it.split(" => ").mapIt(it.replace("/", "")))
diff --git a/tests/test_nimscript.nims b/tests/test_nimscript.nims
index 22a566307..b380570ff 100644
--- a/tests/test_nimscript.nims
+++ b/tests/test_nimscript.nims
@@ -5,6 +5,9 @@
 
 from stdtest/specialpaths import buildDir
 
+when defined(nimSlimSystem):
+  import std/syncio
+
 import std/[
   # Core:
   bitops, typetraits, lenientops, macros, volatile,
diff --git a/tools/kochdocs.nim b/tools/kochdocs.nim
index 4fbea8c77..8fd9c84a5 100644
--- a/tools/kochdocs.nim
+++ b/tools/kochdocs.nim
@@ -187,7 +187,6 @@ proc getDocList(): seq[string] =
 
   # don't ignore these even though in lib/system (not include files)
   const goodSystem = """
-lib/system/io.nim
 lib/system/nimscript.nim
 lib/system/assertions.nim
 lib/system/iterators.nim