diff options
author | Dr. ERDI Gergo <gergo@erdi.hu> | 2014-03-19 20:07:47 +0800 |
---|---|---|
committer | Dr. ERDI Gergo <gergo@erdi.hu> | 2014-03-19 22:34:49 +0800 |
commit | a3f78e2476e3d4ead86ef3b10ddd4e14e189ada3 (patch) | |
tree | d7310cddd87b3d3c2dbf1f5a1dbe275e8bd1f33b | |
parent | 5e4bdb5fc5e741522cbb787731422da3f12aa398 (diff) | |
download | haskell-a3f78e2476e3d4ead86ef3b10ddd4e14e189ada3.tar.gz |
isLexVarSym: check all characters of the name, not just the first one.
This is so that generated names like e.g. workers don't show up as
infix operators when using something like -ddump-simpl.
-rw-r--r-- | compiler/basicTypes/OccName.lhs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/compiler/basicTypes/OccName.lhs b/compiler/basicTypes/OccName.lhs index 2d17b95d25..66e6550297 100644 --- a/compiler/basicTypes/OccName.lhs +++ b/compiler/basicTypes/OccName.lhs @@ -501,7 +501,7 @@ isDataSymOcc _ = False -- it is a data constructor or variable or whatever) isSymOcc :: OccName -> Bool isSymOcc (OccName DataName s) = isLexConSym s -isSymOcc (OccName TcClsName s) = isLexConSym s || isLexVarSym s +isSymOcc (OccName TcClsName s) = isLexSym s isSymOcc (OccName VarName s) = isLexSym s isSymOcc (OccName TvName s) = isLexSym s -- Pretty inefficient! @@ -869,6 +869,15 @@ isTupleOcc_maybe (OccName ns fs) These functions test strings to see if they fit the lexical categories defined in the Haskell report. +Note [Classification of generated names] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Some names generated for internal use can show up in debugging output, +e.g. when using -ddump-simpl. These generated names start with a $ +but should still be pretty-printed using prefix notation. We make sure +this is the case in isLexVarSym by only classifying a name as a symbol +if all its characters are symbols, not just its first one. + \begin{code} isLexCon, isLexVar, isLexId, isLexSym :: FastString -> Bool isLexConId, isLexConSym, isLexVarId, isLexVarSym :: FastString -> Bool @@ -895,19 +904,23 @@ isLexConSym cs -- Infix type or data constructors | cs == (fsLit "->") = True | otherwise = startsConSym (headFS cs) -isLexVarSym cs -- Infix identifiers - | nullFS cs = False -- e.g. "+" - | otherwise = startsVarSym (headFS cs) +isLexVarSym fs -- Infix identifiers e.g. "+" + = case (if nullFS fs then [] else unpackFS fs) of + [] -> False + (c:cs) -> startsVarSym c && all isVarSymChar cs ------------- startsVarSym, startsVarId, startsConSym, startsConId :: Char -> Bool -startsVarSym c = isSymbolASCII c || (ord c > 0x7f && isSymbol c) -- Infix Ids -startsConSym c = c == ':' -- Infix data constructors +startsVarSym c = isSymbolASCII c || (ord c > 0x7f && isSymbol c) -- Infix Ids +startsConSym c = c == ':' -- Infix data constructors startsVarId c = isLower c || c == '_' -- Ordinary Ids startsConId c = isUpper c || c == '(' -- Ordinary type constructors and data constructors isSymbolASCII :: Char -> Bool isSymbolASCII c = c `elem` "!#$%&*+./<=>?@\\^|~-" + +isVarSymChar :: Char -> Bool +isVarSymChar c = c == ':' || startsVarSym c \end{code} %************************************************************************ |