]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/CallHierarchy.scl b/bundles/org.simantics.scl.compiler/scl/SCL/CallHierarchy.scl
new file mode 100644 (file)
index 0000000..5ab8e81
--- /dev/null
@@ -0,0 +1,49 @@
+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