]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/scl/SCL/CallHierarchy.scl
Collect reference hierarchy for SCL values
[simantics/platform.git] / bundles / org.simantics.scl.compiler / scl / SCL / CallHierarchy.scl
1 module {
2     features = [edo],
3     export = [whoCalls, unusedDefinitions]
4 }
5
6 import "SCL/Reflection"
7
8 @JavaType "org.simantics.scl.compiler.module.debug.SymbolReference"
9 data SymbolReference =
10     @JavaType "org.simantics.scl.compiler.module.debug.SymbolReference"
11     @FieldNames [referred, referrer, referenceLocation]
12     SymbolReference {referred :: Name, referrer :: String, referenceLocation :: Location}
13
14 importJava "org.simantics.scl.compiler.module.debug.ModuleDebugInfo" where
15     data ModuleDebugInfo
16     
17     symbolReferences :: ModuleDebugInfo -> [SymbolReference]
18
19 importJava "org.simantics.scl.compiler.module.Module" where
20     @JavaName "getModuleDebugInfo"
21     
22     debugInfo :: Module -> Maybe ModuleDebugInfo
23     
24 whoCalls :: String -> String -> <Proc> [(String, String, Long)]
25 whoCalls moduleName valueName = 
26     [ (callerModuleName, referrer, referenceLocation)
27     | callerModuleName <- sclModuleNames
28     , Just callerModule = moduleByName callerModuleName
29     , Just debugInfo = debugInfo callerModule
30     , SymbolReference {referred, referrer, referenceLocation} <- symbolReferences debugInfo
31     , referred == name
32     ]
33   where
34     name = createName moduleName valueName
35     
36 unusedDefinitions :: <Proc> [Name]
37 unusedDefinitions =
38     [ createName moduleName def
39     | moduleName <- sclModuleNames
40     , Just module = moduleByName moduleName
41     , def <- valueNamesOf module
42     ]
43     \\ 
44     [ referred
45     | callerModuleName <- sclModuleNames
46     , Just callerModule = moduleByName callerModuleName
47     , Just debugInfo = debugInfo callerModule
48     , SymbolReference {referred} <- symbolReferences debugInfo
49     ]