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 :: Name, 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 -> [(String, String, Long)] whoCalls moduleName valueName = [ (callerModuleName, nameOfName 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 :: [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 ]