@@ -104,8 +104,9 @@ data DeclContext = DCMain | DCBlockData | DCModule F.ProgramUnitName
104
104
instance Binary DeclContext
105
105
106
106
-- | Map of unique variable name to the unique name of the program
107
- -- unit where it was defined, and the corresponding SrcSpan.
108
- type DeclMap = M. Map F. Name (DeclContext , P. SrcSpan )
107
+ -- unit where it was defined, its source name,
108
+ -- and the corresponding SrcSpan.
109
+ type DeclMap = M. Map F. Name (DeclContext , F. Name , P. SrcSpan )
109
110
110
111
-- | A map of aliases => strings, in order to save space and share
111
112
-- structure for repeated strings.
@@ -121,7 +122,8 @@ data ModFile = ModFile { mfFilename :: String
121
122
, mfDeclMap :: DeclMap
122
123
, mfTypeEnv :: FAT. TypeEnv
123
124
, mfParamVarMap :: ParamVarMap
124
- , mfOtherData :: M. Map String LB. ByteString }
125
+ , mfOtherData :: M. Map String LB. ByteString
126
+ }
125
127
deriving (Eq , Show , Data , Typeable , Generic )
126
128
127
129
instance Binary ModFile
@@ -251,18 +253,23 @@ moduleFilename = mfFilename
251
253
252
254
-- | Create a map that links all unique variable/function names in the
253
255
-- ModFiles to their corresponding *originating* filename (i.e., where they are declared)
254
- genUniqNameToFilenameMap :: FilePath -> ModFiles -> M. Map F. Name String
255
- genUniqNameToFilenameMap localPath = M. unions . map perMF
256
+ -- paired with their source name (maybe)
257
+ genUniqNameToFilenameMap :: FilePath -> ModFiles -> M. Map F. Name (String , Maybe F. Name )
258
+ genUniqNameToFilenameMap localPath m = M. unions . map perMF $ m
256
259
where
257
260
perMF mf = M. fromList
258
- [ (n, normalise $ localPath </> fname)
259
- | modEnv <- M. elems localModuleMap
260
- , (n, _) <- M. elems modEnv ]
261
+ $ [ (n, (fname, Nothing ))
262
+ | (_p, modEnv) <- M. toList localModuleMap
263
+ , (n, _) <- M. elems modEnv ]
264
+ -- decl map information
265
+ <> [(n, (fname, Just srcName)) | (n, (_dc, srcName, _)) <- M. toList declMap ]
266
+
261
267
where
262
268
-- Make sure that we remove imported declarations so we can
263
269
-- properly localise declarations to the originator file.
264
270
localModuleMap = localisedModuleMap $ mfModuleMap mf
265
- fname = mfFilename mf
271
+ declMap = mfDeclMap mf
272
+ fname = normalise $ localPath </> mfFilename mf
266
273
267
274
--------------------------------------------------
268
275
@@ -289,28 +296,28 @@ extractDeclMap pf = M.fromList . concatMap (blockDecls . nameAndBlocks) $ univer
289
296
where
290
297
-- Extract variable names, source spans from declarations (and
291
298
-- from function return variable if present)
292
- blockDecls :: (DeclContext , Maybe (F. Name , P. SrcSpan ), [F. Block (FA. Analysis a )]) -> [(F. Name , (DeclContext , P. SrcSpan ))]
299
+ blockDecls :: (DeclContext , Maybe (F. Name , F. Name , P. SrcSpan ), [F. Block (FA. Analysis a )]) -> [(F. Name , (DeclContext , F. Name , P. SrcSpan ))]
293
300
blockDecls (dc, mret, bs)
294
301
| Nothing <- mret = map decls (universeBi bs)
295
- | Just (ret, ss) <- mret = (ret, (dc, ss)): map decls (universeBi bs)
302
+ | Just (ret, srcName, ss) <- mret = (ret, (dc, srcName , ss)): map decls (universeBi bs)
296
303
where
297
- decls d = let (v, ss) = declVarName d in (v, (dc, ss))
304
+ decls d = let (v, srcName, ss) = declVarName d in (v, (dc, srcName , ss))
298
305
299
306
-- Extract variable name and source span from declaration
300
- declVarName :: F. Declarator (FA. Analysis a ) -> (F. Name , P. SrcSpan )
301
- declVarName (F. Declarator _ _ e _ _ _) = (FA. varName e, P. getSpan e)
307
+ declVarName :: F. Declarator (FA. Analysis a ) -> (F. Name , F. Name , P. SrcSpan )
308
+ declVarName (F. Declarator _ _ e _ _ _) = (FA. varName e, FA. srcName e, P. getSpan e)
302
309
303
310
-- Extract context identifier, a function return value (+ source
304
311
-- span) if present, and a list of contained blocks
305
- nameAndBlocks :: F. ProgramUnit (FA. Analysis a ) -> (DeclContext , Maybe (F. Name , P. SrcSpan ), [F. Block (FA. Analysis a )])
312
+ nameAndBlocks :: F. ProgramUnit (FA. Analysis a ) -> (DeclContext , Maybe (F. Name , F. Name , P. SrcSpan ), [F. Block (FA. Analysis a )])
306
313
nameAndBlocks pu = case pu of
307
314
F. PUMain _ _ _ b _ -> (DCMain , Nothing , b)
308
315
F. PUModule _ _ _ b _ -> (DCModule $ FA. puName pu, Nothing , b)
309
316
F. PUSubroutine _ _ _ _ _ b _ -> (DCSubroutine (FA. puName pu, FA. puSrcName pu), Nothing , b)
310
317
F. PUFunction _ _ _ _ _ _ mret b _
311
318
| Nothing <- mret
312
- , F. Named n <- FA. puName pu -> (DCFunction (FA. puName pu, FA. puSrcName pu), Just (n, P. getSpan pu), b)
313
- | Just ret <- mret -> (DCFunction (FA. puName pu, FA. puSrcName pu), Just (FA. varName ret, P. getSpan ret), b)
319
+ , F. Named n <- FA. puName pu -> (DCFunction (FA. puName pu, FA. puSrcName pu), Just (n, n, P. getSpan pu), b)
320
+ | Just ret <- mret -> (DCFunction (FA. puName pu, FA. puSrcName pu), Just (FA. varName ret, FA. srcName ret, P. getSpan ret), b)
314
321
| otherwise -> error $ " nameAndBlocks: un-named function with no return value! " ++ show (FA. puName pu) ++ " at source-span " ++ show (P. getSpan pu)
315
322
F. PUBlockData _ _ _ b -> (DCBlockData , Nothing , b)
316
323
F. PUComment {} -> (DCBlockData , Nothing , [] ) -- no decls inside of comments, so ignore it
0 commit comments