{-+ 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