Changed names to be uniquified based on their source position, and fixed the source position for things in pragmas

The second part of the patch is essential, given the first.  Otherwise names in different pragmas in the same file can overlap -- this already happened in oak!
This commit is contained in:
Neil Brown 2009-04-02 17:45:31 +00:00
parent f5e0288ad0
commit 460c3e287f
3 changed files with 12 additions and 10 deletions

View File

@ -261,10 +261,7 @@ nameSource n = lookupName n >>* A.ndNameSource
-- | Make a name unique by appending a suffix to it. -- | Make a name unique by appending a suffix to it.
makeUniqueName :: CSM m => Meta -> String -> m String makeUniqueName :: CSM m => Meta -> String -> m String
makeUniqueName m s makeUniqueName m s
= do st <- get = let mungedFile = munge $ show m in return $ s ++ "_" ++ mungedFile
let mungedFile = munge $ fromMaybe "" (metaFile m)
put $ st { csNameCounter = csNameCounter st + 1 }
return $ s ++ "_" ++ mungedFile ++ "_u" ++ show (csNameCounter st)
where where
munge cs = [if c `elem` (['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9']) munge cs = [if c `elem` (['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'])
then c then c

View File

@ -182,8 +182,8 @@ mkState code _ s = (Nothing, code)
-- | Run the lexer, returning a list of tokens. -- | Run the lexer, returning a list of tokens.
-- (This is based on the `alexScanTokens` function that Alex provides.) -- (This is based on the `alexScanTokens` function that Alex provides.)
runLexer :: Die m => String -> String -> m [Token] runLexer' :: Die m => (String, Int, Int) -> String -> m [Token]
runLexer filename str = go (alexStartPos, '\n', str) 0 runLexer' (filename, startLine, startCol) str = go (AlexPn 0 startLine startCol, '\n', str) 0
where where
go inp@(pos@(AlexPn _ line col), _, str) code = go inp@(pos@(AlexPn _ line col), _, str) code =
case alexScan inp code of case alexScan inp code of
@ -204,5 +204,8 @@ runLexer filename str = go (alexStartPos, '\n', str) 0
metaColumn = col metaColumn = col
} }
runLexer :: Die m => String -> String -> m [Token]
runLexer fn = runLexer' (fn, 1, 1)
} }

View File

@ -1370,8 +1370,8 @@ structuredTypeField
--}}} --}}}
--{{{ pragmas --{{{ pragmas
pragma :: OccParser () pragma :: OccParser ()
pragma = do Pragma rawP <- genToken isPragma pragma = do m <- getPosition >>* sourcePosToMeta
m <- getPosition >>* sourcePosToMeta Pragma rawP <- genToken isPragma
let prag :: Maybe (Int, String) let prag :: Maybe (Int, String)
prag = join $ find isJust prag = join $ find isJust
[ (matchRegex (mkRegex pt) rawP >>= listToMaybe) >>* (,) i [ (matchRegex (mkRegex pt) rawP >>= listToMaybe) >>* (,) i
@ -1409,7 +1409,7 @@ pragma = do Pragma rawP <- genToken isPragma
if pragmaType == 2 if pragmaType == 2
then do sPROC then do sPROC
n <- newProcName n <- newProcName
fs <- formalList >>* map fst fs <- formalList'
sEq sEq
integer integer
return (n, ProcName, n, fs, A.Proc m (A.PlainSpec, A.PlainRec) fs (A.Skip m)) return (n, ProcName, n, fs, A.Proc m (A.PlainSpec, A.PlainRec) fs (A.Skip m))
@ -1436,7 +1436,9 @@ pragma = do Pragma rawP <- genToken isPragma
} }
case (prag, mprod) of case (prag, mprod) of
(Just (_, pragStr), Just prod) -> do (Just (_, pragStr), Just prod) -> do
toks <- runLexer "<unknown(pragma)>" pragStr let column = metaColumn m + fromMaybe 0 (findIndex (=='\"') rawP)
toks <- runLexer' (fromMaybe "<unknown(pragma)>" $ metaFile m
, metaLine m, column) pragStr
cs <- getCompState cs <- getCompState
case runParser (prod >> getState) cs "" toks of case runParser (prod >> getState) cs "" toks of
Left err -> warnP m WarnUnknownPreprocessorDirective $ Left err -> warnP m WarnUnknownPreprocessorDirective $