+module {
+ features = [edo],
+ export = [whoCalls, unusedDefinitions]
+}
+
+import "SCL/Reflection"
+
+@JavaType "org.simantics.scl.compiler.module.debug.SymbolReference"
+data SymbolReference =
+ @JavaType "org.simantics.scl.compiler.module.debug.SymbolReference"
+ @FieldNames [referred, referrer, referenceLocation]
+ SymbolReference {referred :: Name, referrer :: String, referenceLocation :: Location}
+
+importJava "org.simantics.scl.compiler.module.debug.ModuleDebugInfo" where
+ data ModuleDebugInfo
+
+ symbolReferences :: ModuleDebugInfo -> [SymbolReference]
+
+importJava "org.simantics.scl.compiler.module.Module" where
+ @JavaName "getModuleDebugInfo"
+
+ debugInfo :: Module -> Maybe ModuleDebugInfo
+
+whoCalls :: String -> String -> <Proc> [(String, String, Long)]
+whoCalls moduleName valueName =
+ [ (callerModuleName, referrer, referenceLocation)
+ | callerModuleName <- sclModuleNames
+ , Just callerModule = moduleByName callerModuleName
+ , Just debugInfo = debugInfo callerModule
+ , SymbolReference {referred, referrer, referenceLocation} <- symbolReferences debugInfo
+ , referred == name
+ ]
+ where
+ name = createName moduleName valueName
+
+unusedDefinitions :: <Proc> [Name]
+unusedDefinitions =
+ [ createName moduleName def
+ | moduleName <- sclModuleNames
+ , Just module = moduleByName moduleName
+ , def <- valueNamesOf module
+ ]
+ \\
+ [ referred
+ | callerModuleName <- sclModuleNames
+ , Just callerModule = moduleByName callerModuleName
+ , Just debugInfo = debugInfo callerModule
+ , SymbolReference {referred} <- symbolReferences debugInfo
+ ]
\ No newline at end of file