forked from qfpl/hpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLanguage-Python-Internal-Render-Correction.html
More file actions
23 lines (23 loc) · 19.9 KB
/
Language-Python-Internal-Render-Correction.html
File metadata and controls
23 lines (23 loc) · 19.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Language.Python.Internal.Render.Correction</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><link rel="stylesheet" type="text/css" href="quick-jump.css" /><script src="haddock-bundle.min.js" async="async" type="text/javascript"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption">hpython-0.1.0.1: Python language tools</p></div><div id="content"><div id="module-header"><table class="info"><tr><th valign="top">Copyright</th><td>(C) CSIRO 2017-2019</td></tr><tr><th>License</th><td>BSD3</td></tr><tr><th>Maintainer</th><td>Isaac Elliott <[email protected]></td></tr><tr><th>Stability</th><td>experimental</td></tr><tr><th>Portability</th><td>non-portable</td></tr><tr><th>Safe Haskell</th><td>None</td></tr><tr><th>Language</th><td>Haskell2010</td></tr></table><p class="caption">Language.Python.Internal.Render.Correction</p></div><div id="description"><p class="caption">Description</p><div class="doc"><p>There are configurations of the core syntax tree which won't print to valid Python
if we printed them naively. Many of these we catch in the
<code><a href="Language-Python-Validation.html#v:Syntax" title="Language.Python.Validation">Syntax</a></code> phase, because those mistakes correspond to
some Python syntax error. In other cases, the mistakes are more benign and have
a "resonable correction" which doesn't break the "print-parse idempotence" law.</p><p>This module is where such corrections are defined</p></div></div><div id="synopsis"><details id="syn"><summary>Synopsis</summary><ul class="details-toggle" data-details-id="syn"><li class="src short"><a href="#v:correctParams">correctParams</a> :: <a href="Language-Python-Syntax-CommaSep.html#t:CommaSep" title="Language.Python.Syntax.CommaSep">CommaSep</a> (<a href="Language-Python-Syntax-Expr.html#t:Param" title="Language.Python.Syntax.Expr">Param</a> v a) -> <a href="Language-Python-Syntax-CommaSep.html#t:CommaSep" title="Language.Python.Syntax.CommaSep">CommaSep</a> (<a href="Language-Python-Syntax-Expr.html#t:Param" title="Language.Python.Syntax.Expr">Param</a> v a)</li><li class="src short"><a href="#v:correctSpaces">correctSpaces</a> :: (<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> () -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/text-1.2.3.1/Data-Text.html#t:Text" title="Data.Text">Text</a>) -> [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()] -> [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()]</li><li class="src short"><a href="#v:correctNewlines">correctNewlines</a> :: [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()] -> [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()]</li><li class="src short"><a href="#v:correctAdjacentStrings">correctAdjacentStrings</a> :: <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-List-NonEmpty.html#t:NonEmpty" title="Data.List.NonEmpty">NonEmpty</a> (<a href="Language-Python-Syntax-Strings.html#t:StringLiteral" title="Language.Python.Syntax.Strings">StringLiteral</a> a) -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-List-NonEmpty.html#t:NonEmpty" title="Data.List.NonEmpty">NonEmpty</a> (<a href="Language-Python-Syntax-Strings.html#t:StringLiteral" title="Language.Python.Syntax.Strings">StringLiteral</a> a)</li><li class="src short"><a href="#v:quoteChar">quoteChar</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> <a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a></li><li class="src short"><a href="#v:quote">quote</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-Char.html#t:Char" title="Data.Char">Char</a></li><li class="src short"><a href="#v:correctBackslashEscapes">correctBackslashEscapes</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctBackslashes">correctBackslashes</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:naps">naps</a> :: (a -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-Maybe.html#t:Maybe" title="Data.Maybe">Maybe</a> b) -> [a] -> ([a], [b])</li><li class="src short"><a href="#v:correctBackslashEscapesRaw">correctBackslashEscapesRaw</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctBackslashesRaw">correctBackslashesRaw</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctQuotes">correctQuotes</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctQuotesRaw">correctQuotesRaw</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctInitialQuotes">correctInitialQuotes</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctInitialFinalQuotesLongRaw">correctInitialFinalQuotesLongRaw</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctInitialFinalQuotesLong">correctInitialFinalQuotesLong</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>]</li><li class="src short"><a href="#v:correctTrailingNewline">correctTrailingNewline</a> :: <a href="Language-Python-Syntax-Whitespace.html#t:HasTrailingNewline" title="Language.Python.Syntax.Whitespace">HasTrailingNewline</a> s => <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-Bool.html#t:Bool" title="Data.Bool">Bool</a> -> s v a -> s v a</li></ul></details></div><div id="interface"><h1>Documentation</h1><div class="top"><p class="src"><a id="v:correctParams" class="def">correctParams</a> :: <a href="Language-Python-Syntax-CommaSep.html#t:CommaSep" title="Language.Python.Syntax.CommaSep">CommaSep</a> (<a href="Language-Python-Syntax-Expr.html#t:Param" title="Language.Python.Syntax.Expr">Param</a> v a) -> <a href="Language-Python-Syntax-CommaSep.html#t:CommaSep" title="Language.Python.Syntax.CommaSep">CommaSep</a> (<a href="Language-Python-Syntax-Expr.html#t:Param" title="Language.Python.Syntax.Expr">Param</a> v a) <a href="#v:correctParams" class="selflink">#</a></p><div class="doc"><p>Trailing commas can only be present in a parameter list of entirely
positional arguments. This removes the bad trailing comma, and appends
the comma's trailing whitespace to the previous token</p></div></div><div class="top"><p class="src"><a id="v:correctSpaces" class="def">correctSpaces</a> :: (<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> () -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/text-1.2.3.1/Data-Text.html#t:Text" title="Data.Text">Text</a>) -> [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()] -> [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()] <a href="#v:correctSpaces" class="selflink">#</a></p></div><div class="top"><p class="src"><a id="v:correctNewlines" class="def">correctNewlines</a> :: [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()] -> [<a href="Language-Python-Internal-Token.html#t:PyToken" title="Language.Python.Internal.Token">PyToken</a> ()] <a href="#v:correctNewlines" class="selflink">#</a></p></div><div class="top"><p class="src"><a id="v:correctAdjacentStrings" class="def">correctAdjacentStrings</a> :: <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-List-NonEmpty.html#t:NonEmpty" title="Data.List.NonEmpty">NonEmpty</a> (<a href="Language-Python-Syntax-Strings.html#t:StringLiteral" title="Language.Python.Syntax.Strings">StringLiteral</a> a) -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-List-NonEmpty.html#t:NonEmpty" title="Data.List.NonEmpty">NonEmpty</a> (<a href="Language-Python-Syntax-Strings.html#t:StringLiteral" title="Language.Python.Syntax.Strings">StringLiteral</a> a) <a href="#v:correctAdjacentStrings" class="selflink">#</a></p><div class="doc"><p>Two non-typed single-quoted strings cannot be lexically
adjacent, because this would be a parse error</p><p>eg. '''' or """"</p><p>we correct for this by inserting a single space where required
'' '' or "" ""</p></div></div><div class="top"><p class="src"><a id="v:quoteChar" class="def">quoteChar</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> <a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a> <a href="#v:quoteChar" class="selflink">#</a></p></div><div class="top"><p class="src"><a id="v:quote" class="def">quote</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-Char.html#t:Char" title="Data.Char">Char</a> <a href="#v:quote" class="selflink">#</a></p></div><div class="top"><p class="src"><a id="v:correctBackslashEscapes" class="def">correctBackslashEscapes</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctBackslashEscapes" class="selflink">#</a></p><div class="doc"><p>When a backslash character, precedes an escape sequence it needs to be escaped
so that it doesn't interfere with the backslash that begins the escape sequence.</p><p>For example:</p><p><code>[<code><a href="Language-Python-Syntax-Strings.html#v:Char_lit" title="Language.Python.Syntax.Strings">Char_lit</a></code> '\\', Char_esc_n]</code> would naively render to '\\n', which
would parse to <code>[<code><a href="Language-Python-Syntax-Strings.html#v:Char_esc_bslash" title="Language.Python.Syntax.Strings">Char_esc_bslash</a></code>, <code><a href="Language-Python-Syntax-Strings.html#v:Char_lit" title="Language.Python.Syntax.Strings">Char_lit</a></code> 'n']</code>, breaking the
<code>parse . print</code> identity</p></div></div><div class="top"><p class="src"><a id="v:correctBackslashes" class="def">correctBackslashes</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctBackslashes" class="selflink">#</a></p></div><div class="top"><p class="src"><a id="v:naps" class="def">naps</a> :: (a -> <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-Maybe.html#t:Maybe" title="Data.Maybe">Maybe</a> b) -> [a] -> ([a], [b]) <a href="#v:naps" class="selflink">#</a></p><div class="doc"><p><code>(as, bs) = span p xs</code>
<code>bs</code> is the longest suffix that satisfies the predicate, and <code>as</code> is the
prefix up to that point</p><p>It's like the reverse of <code><a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/GHC-OldList.html#v:span" title="GHC.OldList">span</a></code></p></div></div><div class="top"><p class="src"><a id="v:correctBackslashEscapesRaw" class="def">correctBackslashEscapesRaw</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctBackslashEscapesRaw" class="selflink">#</a></p><div class="doc"><p>Sometimes strings need to be corrected when certain characters follow a literal
backslash. For example, a literal backslash followed by an escape sequence means
that the literal backslash actually needs to be escaped, so that it doesn't get
<code>combined</code> with the backslash in the escape sequence.</p></div></div><div class="top"><p class="src"><a id="v:correctBackslashesRaw" class="def">correctBackslashesRaw</a> :: [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctBackslashesRaw" class="selflink">#</a></p><div class="doc"><p>It turns out that raw strings can only ever be constructed with an even number
of trailing backslash characters. This functon corrects raw strings with an
odd number of trailing backslash characters</p></div></div><div class="top"><p class="src"><a id="v:correctQuotes" class="def">correctQuotes</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctQuotes" class="selflink">#</a></p><div class="doc"><p>Every quote in a string of a particular quote type should be escaped</p></div></div><div class="top"><p class="src"><a id="v:correctQuotesRaw" class="def">correctQuotesRaw</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctQuotesRaw" class="selflink">#</a></p><div class="doc"><p>Every quote in short raw string that isn't preceded by
a backslash should be escaped</p></div></div><div class="top"><p class="src"><a id="v:correctInitialQuotes" class="def">correctInitialQuotes</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctInitialQuotes" class="selflink">#</a></p><div class="doc"><p>Every third literal quote at the beginning of a long (non-raw) string should
be escaped</p></div></div><div class="top"><p class="src"><a id="v:correctInitialFinalQuotesLongRaw" class="def">correctInitialFinalQuotesLongRaw</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctInitialFinalQuotesLongRaw" class="selflink">#</a></p><div class="doc"><p>Literal quotes at the beginning and end of a long raw string should be escaped</p></div></div><div class="top"><p class="src"><a id="v:correctInitialFinalQuotesLong" class="def">correctInitialFinalQuotesLong</a> :: <a href="Language-Python-Syntax-Strings.html#t:QuoteType" title="Language.Python.Syntax.Strings">QuoteType</a> -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] -> [<a href="Language-Python-Syntax-Strings.html#t:PyChar" title="Language.Python.Syntax.Strings">PyChar</a>] <a href="#v:correctInitialFinalQuotesLong" class="selflink">#</a></p><div class="doc"><p>Literal quotes at the beginning and end of a long (non-raw) string should be escaped</p></div></div><div class="top"><p class="src"><a id="v:correctTrailingNewline" class="def">correctTrailingNewline</a> :: <a href="Language-Python-Syntax-Whitespace.html#t:HasTrailingNewline" title="Language.Python.Syntax.Whitespace">HasTrailingNewline</a> s => <a href="file:///nix/store/vqpc66a1hnvmjq14k7crkp0diwarf9vl-ghc-8.4.4-doc/share/doc/ghc/html/libraries/base-4.11.1.0/Data-Bool.html#t:Bool" title="Data.Bool">Bool</a> -> s v a -> s v a <a href="#v:correctTrailingNewline" class="selflink">#</a></p><div class="doc"><p>It's possible that successive statements have no newlines in between
them. This would cause them to be displayed on the same line. In every line where
this would be the case, we explicitly insert a line-feed character.</p></div></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.20.0</p></div></body></html>