HLexTagModuleNames.hs

This module exports the lexer postprocessor convModulesNames, which changes the tags of module names and special identifers in imports. (They are just tagged as Conid and Varid by the lexer.)

Real module names are retagged as ModuleName, while module aliases in export lists, and after the as keyword, are retagged as ModuleAlias.

The special identifiers qualified, as and hiding are retagged as Specialid.

This is a simple hack that assumes that the input is syntactically correct.

module HLexTagModuleNames(convModuleNames) where
import HsTokens

convModuleNames = convh

-- At the beginning of a module
convh = skipspace convh'
convh' (t@(Reservedid,(_,"module")):ts) = t:convm ts 
convh' ts = conv ts -- no module header

-- When "module" has been seen at the beginning of a module:
convm = skipspace convm'
convm' ((Qconid,ps):ts) = (ModuleName,ps):conv ts
convm' ((Conid,ps):ts) = (ModuleName,ps):conv ts
convm' ts = conv ts -- syntactically incorrect module header?!

-- At various positions
conv = skipspace conv'
conv' [] = []
conv' (t@(Reservedid,(_,"import")):ts) = t:convi ts
conv' (t@(Reservedid,(_,"module")):ts) = t:conve ts 
conv' (t:ts) = t:conv ts -- a "normal" token, output unchanged

-- When "module" has been seen in an export list:
conve = skipspace conve'
conve' ((Qconid,ps):ts) = (ModuleAlias,ps):conv ts
conve' ((Conid,ps):ts) = (ModuleAlias,ps):conv ts
conve' ts = conv ts  -- syntactically incorrect module export?!

-- When "import" has been seen:
convi = skipspace convi'
convi' ((Varid,ps@(_,"qualified")):ts) = (Specialid,ps):convi ts
convi' ((Qconid,ps):ts) = (ModuleName,ps):conva ts
convi' ((Conid,ps):ts) = (ModuleName,ps):conva ts
convi' ts = conv ts -- syntactically incorrect import declaration?!

-- When the module name after "import" has been seen:
conva = skipspace conva'
conva' (t2@(Varid,ps@(_,"as")):ts) = (Specialid,ps):conva ts
conva' (t2@(Varid,ps@(_,"hiding")):ts) = (Specialid,ps):conv ts
conva' ((Qconid,ps):ts) = (ModuleAlias,ps):conva ts
conva' ((Conid,ps):ts) = (ModuleAlias,ps):conva ts
conva' ts = conv ts


skipspace f (t@(Whitespace,_):ts) = t:skipspace f ts
skipspace f (t@(NestedComment,_):ts) = t:skipspace f ts
skipspace f (t1@(Commentstart,_):t2@(Comment,_):ts) = t1:t2:skipspace f ts
skipspace f ts = f ts

Plain-text version of HLexTagModuleNames.hs | Valid HTML?