ANNOUNCE: Graphalyze-0.4 and SourceGraph-0.2

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I'd like to announce version 0.4 of my Graphalyze library [1] and 0.2 of my SourceGraph programme [2]. [1] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/Graphalyze [2] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SourceGraph This should fix the bugs reported by Gwern Branwen, Magnus Therning (thanks to Niklas Broberg for stating the correct version for Haskell-Src-Exts) and Christopher Hinson. No really new features are included in this release. I was planning on fixing this and releasing it sooner but - to utilise what seems to be a current meme [3] - "I accidentally my Gentoo" on Tuesday night and only fixed it yesterday. [3] http://encyclopediadramatica.com/I_accidentally_X Since I'm more awake now than I was when I made the initial release, here's a run-down of what SourceGraph is: SourceGraph is a programme designed to help you analyse the static complexity of your Haskell code when represented as a graph. At the moment, it does the following (M == for each module, I = for imports, C = the whole codebase): * Visualise it {M,I,C} * See a "collapsed" visualisation {M} * Proposed module/directory layout using two different algorithms {I,C} * See the "core" visualisation (recursively strip off roots/leaves) {M} * Calculate the Cyclomatic complexity [4] {M,I,C} * Root analysis (compare what's exported to what actually is a root) {M,I,C} * Determine how many components you have, to see if you should split {M,I,C} * Clique Analysis (find co-recursive functions) {M,C} * Cycle analysis (non-cliques) {M,I,C} * Chain detection (e.g. "straight-line" functions/imports) {M,I,C} [4] http://en.wikipedia.org/wiki/Cyclomatic_complexity Current limitations: * An automatic refactoring tool: SourceGraph gives *you* information on how you might want to possibly refactor your code. It's not smart: it can't tell that you've clumped functions foo and bar in the same module because they do similar things or because it's a utility module, even though they're not related. For automatic refactoring, see something like HaRe [5]. * SourceGraph ignore's "data-based" functions, i.e. record-functions and class/instance declarations, as it's too confusing (IMHO) which actual function you mean (if you see "show" being called, is it for Int, Double, or something else?). * Despite using Haskell-Src-Exts, some extensions (e.g. TH) are ignored, mainly because I have no idea how they work and nothing to test it on. GHC extensions should be supported (read the parser won't choke on them) though. * Reporting output is currently rather limited: - The report will be generated in a subdirectory called "SourceGraph" of the codebase directory; this is currently hardwired in. - It will produce an all-in-one html file report, with no fancy CSS magic to make it look pretty. Ideally, it would produce a split-file, and allow you to choose output format. - Large graphs are shrunk down to being a maximum of 15"x10". Ideally, I'd like to extend this later so that large graphs will have a shrunk version in the graph, which link to a larger version (note though that these graphs get very large very fast). - The output of individual function names, etc. could be improved. [5] http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html SourceGraph can be installed with cabal-install. Once you've done so, you can analyse a cabalized library/application Foo as follows: $ SourceGraph /path/to/codebase/Foo.cabal Report generated at: /path/to/codebase/SourceGraph/Foo.html This has been written as part of my mathematics Honours Thesis, "Graph-Theoretic Analysis of the Relationships in Discrete Data". Since I've actually got to write the thesis up now, I won't be making any more releases for a while. After uni is over for the semester though, I hope to tidy it up and extend it. If you want to check the code out yourselves, there's also darcs repositories for Graphalyze [6] and SourceGraph [7]. [6] http://code.haskell.org/Graphalyze [7] http://code.haskell.org/SourceGraph/ Note that whilst Graphalyze is fully documented, etc., the internals of SourceGraph are a bit fugly (mainly due to time constraints). Enjoy! - -- Ivan Lazar Miljenovic Ivan.Miljenovic@gmail.com IvanMiljenovic.wordpress.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkjyAacACgkQfEfFJ9JhvyiHEACfVVuRk2FR3ZQiJ6H18FFK/de/ sukAn0tuCLwqxmzlQvWicQKQ3qEJKC1K =HRUK -----END PGP SIGNATURE-----

On 2008.10.12 23:54:44 +1000, Ivan Lazar Miljenovic
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
I'd like to announce version 0.4 of my Graphalyze library [1] and 0.2 of my SourceGraph programme [2].
[1] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/Graphalyze [2] http://hackage.haskell.org/cgi-bin/hackage-scripts/package/SourceGraph
This should fix the bugs reported by Gwern Branwen, Magnus Therning (thanks to Niklas Broberg for stating the correct version for Haskell-Src-Exts) and Christopher Hinson. No really new features are included in this release. I was planning on fixing this and releasing it sooner but - to utilise what seems to be a current meme [3] - "I accidentally my Gentoo" on Tuesday night and only fixed it yesterday.
[3] http://encyclopediadramatica.com/I_accidentally_X
Since I'm more awake now than I was when I made the initial release, here's a run-down of what SourceGraph is:
SourceGraph is a programme designed to help you analyse the static complexity of your Haskell code when represented as a graph. At the moment, it does the following (M == for each module, I = for imports, C = the whole codebase):
* Visualise it {M,I,C} * See a "collapsed" visualisation {M} * Proposed module/directory layout using two different algorithms {I,C} * See the "core" visualisation (recursively strip off roots/leaves) {M} * Calculate the Cyclomatic complexity [4] {M,I,C} * Root analysis (compare what's exported to what actually is a root) {M,I,C} * Determine how many components you have, to see if you should split {M,I,C} * Clique Analysis (find co-recursive functions) {M,C} * Cycle analysis (non-cliques) {M,I,C} * Chain detection (e.g. "straight-line" functions/imports) {M,I,C}
[4] http://en.wikipedia.org/wiki/Cyclomatic_complexity
Current limitations:
* An automatic refactoring tool: SourceGraph gives *you* information on how you might want to possibly refactor your code. It's not smart: it can't tell that you've clumped functions foo and bar in the same module because they do similar things or because it's a utility module, even though they're not related. For automatic refactoring, see something like HaRe [5]. * SourceGraph ignore's "data-based" functions, i.e. record-functions and class/instance declarations, as it's too confusing (IMHO) which actual function you mean (if you see "show" being called, is it for Int, Double, or something else?). * Despite using Haskell-Src-Exts, some extensions (e.g. TH) are ignored, mainly because I have no idea how they work and nothing to test it on. GHC extensions should be supported (read the parser won't choke on them) though. * Reporting output is currently rather limited: - The report will be generated in a subdirectory called "SourceGraph" of the codebase directory; this is currently hardwired in. - It will produce an all-in-one html file report, with no fancy CSS magic to make it look pretty. Ideally, it would produce a split-file, and allow you to choose output format. - Large graphs are shrunk down to being a maximum of 15"x10". Ideally, I'd like to extend this later so that large graphs will have a shrunk version in the graph, which link to a larger version (note though that these graphs get very large very fast). - The output of individual function names, etc. could be improved.
[5] http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html
SourceGraph can be installed with cabal-install. Once you've done so, you can analyse a cabalized library/application Foo as follows:
$ SourceGraph /path/to/codebase/Foo.cabal Report generated at: /path/to/codebase/SourceGraph/Foo.html
This has been written as part of my mathematics Honours Thesis, "Graph-Theoretic Analysis of the Relationships in Discrete Data". Since I've actually got to write the thesis up now, I won't be making any more releases for a while. After uni is over for the semester though, I hope to tidy it up and extend it.
If you want to check the code out yourselves, there's also darcs repositories for Graphalyze [6] and SourceGraph [7].
[6] http://code.haskell.org/Graphalyze [7] http://code.haskell.org/SourceGraph/
Note that whilst Graphalyze is fully documented, etc., the internals of SourceGraph are a bit fugly (mainly due to time constraints).
Enjoy!
- -- Ivan Lazar Miljenovic
OK, I've installed and yes - it now produces output for XMC instead of looping. However, I happened to want to look at the output for one of my modules, XMonad.Util.XSelection - and it simply isn't there. Most of the XMC modules seem to be there, but that one isn't. It's in the cabal file, SourceGraph did not output any errors or warnings, but XSelection is not mentioned in the HTML output nor are any PNGs generated with regard to it. See: gwern@craft:24375~/bin/XMonadContrib/SourceGraph>grep XSelection ../xmonad-contrib.cabal [ 1:20PM] XMonad.Util.XSelection gwern@craft:24372~/bin/XMonadContrib>SourceGraph xmonad-contrib.cabal [ 1:16PM] Report generated at: SourceGraph/xmonad-contrib.html SourceGraph xmonad-contrib.cabal 59.05s user 4.14s system 98% cpu 1:03.83 total gwern@craft:24373~/bin/XMonadContrib>c SourceGraph [ 1:17PM] codeCluster.png XMonad.Layout.DragPane_collapsed.png codeCollapsed.png XMonad.Layout.DragPane.png codeCore.png XMonad.Layout.DwmStyle_collapsed.png codeCW.png XMonad.Layout.DwmStyle.png code.png XMonad.Layout.Gaps_collapsed.png codeRNG.png XMonad.Layout.Gaps.png importCluster.png XMonad.Layout.Grid_collapsed.png importCW.png XMonad.Layout.Grid.png importRNG.png XMonad.Layout.HintedGrid_collapsed.png imports.png XMonad.Layout.HintedGrid.png Main_collapsed.png XMonad.Layout.HintedTile_collapsed.png Main.png XMonad.Layout.HintedTile_core.png XMonad.Actions.Commands_collapsed.png XMonad.Layout.HintedTile.png XMonad.Actions.Commands.png XMonad.Layout.IM_collapsed.png XMonad.Actions.ConstrainedResize_collapsed.png XMonad.Layout.IM.png XMonad.Actions.ConstrainedResize.png XMonad.Layout.LayoutCombinators_collapsed.png XMonad.Actions.CopyWindow_collapsed.png XMonad.Layout.LayoutCombinators.png XMonad.Actions.CopyWindow.png XMonad.Layout.LayoutHints_collapsed.png XMonad.Actions.CycleRecentWS_collapsed.png XMonad.Layout.LayoutHints.png XMonad.Actions.CycleRecentWS.png XMonad.Layout.LayoutModifier_collapsed.png XMonad.Actions.CycleSelectedLayouts_collapsed.png XMonad.Layout.LayoutModifier.png XMonad.Actions.CycleSelectedLayouts.png XMonad.Layout.LayoutScreens_collapsed.png XMonad.Actions.CycleWS_collapsed.png XMonad.Layout.LayoutScreens.png XMonad.Actions.CycleWS_core.png XMonad.Layout.MagicFocus_collapsed.png XMonad.Actions.CycleWS.png XMonad.Layout.MagicFocus.png XMonad.Actions.DeManage_collapsed.png XMonad.Layout.Magnifier_collapsed.png XMonad.Actions.DeManage.png XMonad.Layout.Magnifier.png XMonad.Actions.DwmPromote_collapsed.png XMonad.Layout.Master_collapsed.png XMonad.Actions.DwmPromote.png XMonad.Layout.Master.png XMonad.Actions.DynamicWorkspaces_collapsed.png XMonad.Layout.Maximize_collapsed.png XMonad.Actions.DynamicWorkspaces.png XMonad.Layout.Maximize.png XMonad.Actions.FindEmptyWorkspace_collapsed.png XMonad.Layout.MosaicAlt_collapsed.png XMonad.Actions.FindEmptyWorkspace.png XMonad.Layout.MosaicAlt_core.png XMonad.Actions.FlexibleManipulate_collapsed.png XMonad.Layout.MosaicAlt.png XMonad.Actions.FlexibleManipulate.png XMonad.Layout.MultiToggle_collapsed.png XMonad.Actions.FlexibleResize_collapsed.png XMonad.Layout.MultiToggle.Instances_collapsed.png XMonad.Actions.FlexibleResize.png XMonad.Layout.MultiToggle.Instances.png XMonad.Actions.FloatKeys_collapsed.png XMonad.Layout.MultiToggle.png XMonad.Actions.FloatKeys.png XMonad.Layout.Named_collapsed.png XMonad.Actions.FocusNth_collapsed.png XMonad.Layout.Named.png XMonad.Actions.FocusNth.png XMonad.Layout.NoBorders_collapsed.png XMonad.Actions.MouseGestures_collapsed.png XMonad.Layout.NoBorders.png XMonad.Actions.MouseGestures.png XMonad.Layout.PerWorkspace_collapsed.png XMonad.Actions.MouseResize_collapsed.png XMonad.Layout.PerWorkspace.png XMonad.Actions.MouseResize.png XMonad.Layout.Reflect_collapsed.png XMonad.Actions.NoBorders_collapsed.png XMonad.Layout.Reflect.png XMonad.Actions.NoBorders.png XMonad.Layout.ResizeScreen_collapsed.png XMonad.Actions.PerWorkspaceKeys_collapsed.png XMonad.Layout.ResizeScreen.png XMonad.Actions.PerWorkspaceKeys.png XMonad.Layout.Roledex_collapsed.png XMonad.Actions.Plane_collapsed.png XMonad.Layout.Roledex.png XMonad.Actions.Plane.png XMonad.Layout.ShowWName_collapsed.png XMonad.Actions.Promote_collapsed.png XMonad.Layout.ShowWName.png XMonad.Actions.Promote.png XMonad.Layout.SimpleDecoration_collapsed.png XMonad.Actions.RotSlaves_collapsed.png XMonad.Layout.SimpleDecoration.png XMonad.Actions.RotSlaves.png XMonad.Layout.SimpleFloat_collapsed.png XMonad.Actions.Search_collapsed.png XMonad.Layout.SimpleFloat.png XMonad.Actions.Search.png XMonad.Layout.Simplest_collapsed.png XMonad.Actions.SimpleDate_collapsed.png XMonad.Layout.SimplestFloat_collapsed.png XMonad.Actions.SimpleDate.png XMonad.Layout.SimplestFloat.png XMonad.Actions.SinkAll_collapsed.png XMonad.Layout.Simplest.png XMonad.Actions.SinkAll.png XMonad.Layout.Spiral_collapsed.png XMonad.Actions.Submap_collapsed.png XMonad.Layout.Spiral_core.png XMonad.Actions.Submap.png XMonad.Layout.Spiral.png XMonad.Actions.SwapWorkspaces_collapsed.png XMonad.Layout.Square_collapsed.png XMonad.Actions.SwapWorkspaces.png XMonad.Layout.Square.png XMonad.Actions.TagWindows_collapsed.png XMonad.Layout.TabBarDecoration_collapsed.png XMonad.Actions.TagWindows.png XMonad.Layout.TabBarDecoration.png XMonad.Actions.UpdatePointer_collapsed.png XMonad.Layout.Tabbed_collapsed.png XMonad.Actions.UpdatePointer.png XMonad.Layout.Tabbed.png XMonad.Actions.Warp_collapsed.png XMonad.Layout.ToggleLayouts_collapsed.png XMonad.Actions.Warp.png XMonad.Layout.ToggleLayouts.png XMonad.Actions.WindowBringer_collapsed.png XMonad.Layout.TwoPane_collapsed.png XMonad.Actions.WindowBringer.png XMonad.Layout.TwoPane.png XMonad.Actions.WindowGo_collapsed.png XMonad.Layout.WindowArranger_collapsed.png XMonad.Actions.WindowGo.png XMonad.Layout.WindowArranger.png XMonad.Actions.WindowNavigation_collapsed.png XMonad.Layout.WindowNavigation_collapsed.png XMonad.Actions.WindowNavigation_core.png XMonad.Layout.WindowNavigation_core.png XMonad.Actions.WindowNavigation.png XMonad.Layout.WindowNavigation.png XMonad.Config.Arossato_collapsed.png XMonad.Layout.WorkspaceDir_collapsed.png XMonad.Config.Arossato.png XMonad.Layout.WorkspaceDir.png XMonad.Config.Azerty_collapsed.png XMonad.Prompt.AppendFile_collapsed.png XMonad.Config.Azerty.png XMonad.Prompt.AppendFile.png XMonad.Config.Desktop_collapsed.png XMonad.Prompt.AppLauncher_collapsed.png XMonad.Config.Desktop.png XMonad.Prompt.AppLauncher.png XMonad.Config.Droundy_collapsed.png XMonad.Prompt_collapsed.png XMonad.Config.Droundy.png XMonad.Prompt_core.png XMonad.Config.Gnome_collapsed.png XMonad.Prompt.Directory_collapsed.png XMonad.Config.Gnome.png XMonad.Prompt.Directory.png XMonad.Config.Kde_collapsed.png XMonad.Prompt.DirExec_collapsed.png XMonad.Config.Kde.png XMonad.Prompt.DirExec.png XMonad.Config.PlainConfig_collapsed.png XMonad.Prompt.Email_collapsed.png XMonad.Config.PlainConfig_core.png XMonad.Prompt.Email.png XMonad.Config.PlainConfig.png XMonad.Prompt.Input_collapsed.png XMonad.Config.Sjanssen_collapsed.png XMonad.Prompt.Input.png XMonad.Config.Sjanssen.png XMonad.Prompt.Layout_collapsed.png XMonad.Config.Xfce_collapsed.png XMonad.Prompt.Layout.png XMonad.Config.Xfce.png XMonad.Prompt.Man_collapsed.png xmonad-contrib.html XMonad.Prompt.Man.png XMonad.Doc_collapsed.png XMonad.Prompt.png XMonad.Doc.Configuring_collapsed.png XMonad.Prompt.RunOrRaise_collapsed.png XMonad.Doc.Configuring.png XMonad.Prompt.RunOrRaise.png XMonad.Doc.Developing_collapsed.png XMonad.Prompt.Shell_collapsed.png XMonad.Doc.Developing.png XMonad.Prompt.Shell_core.png XMonad.Doc.Extending_collapsed.png XMonad.Prompt.Shell.png XMonad.Doc.Extending.png XMonad.Prompt.Ssh_collapsed.png XMonad.Doc.png XMonad.Prompt.Ssh.png XMonad.Hooks.DynamicHooks_collapsed.png XMonad.Prompt.Theme_collapsed.png XMonad.Hooks.DynamicHooks.png XMonad.Prompt.Theme.png XMonad.Hooks.DynamicLog_collapsed.png XMonad.Prompt.Window_collapsed.png XMonad.Hooks.DynamicLog.png XMonad.Prompt.Window.png XMonad.Hooks.EventHook_collapsed.png XMonad.Prompt.Workspace_collapsed.png XMonad.Hooks.EventHook.png XMonad.Prompt.Workspace.png XMonad.Hooks.EwmhDesktops_collapsed.png XMonad.Prompt.XMonad_collapsed.png XMonad.Hooks.EwmhDesktops.png XMonad.Prompt.XMonad.png XMonad.Hooks.FadeInactive_collapsed.png XMonad.Util.CustomKeys_collapsed.png XMonad.Hooks.FadeInactive.png XMonad.Util.CustomKeys.png XMonad.Hooks.ManageDocks_collapsed.png XMonad.Util.Dmenu_collapsed.png XMonad.Hooks.ManageDocks.png XMonad.Util.Dmenu.png XMonad.Hooks.ManageHelpers_collapsed.png XMonad.Util.Dzen_collapsed.png XMonad.Hooks.ManageHelpers.png XMonad.Util.Dzen.png XMonad.Hooks.Script_collapsed.png XMonad.Util.EZConfig_collapsed.png XMonad.Hooks.Script.png XMonad.Util.EZConfig.png XMonad.Hooks.ServerMode_collapsed.png XMonad.Util.Invisible_collapsed.png XMonad.Hooks.ServerMode.png XMonad.Util.Invisible.png XMonad.Hooks.SetWMName_collapsed.png XMonad.Util.Loggers_collapsed.png XMonad.Hooks.SetWMName.png XMonad.Util.Loggers.png XMonad.Hooks.UrgencyHook_collapsed.png XMonad.Util.NamedWindows_collapsed.png XMonad.Hooks.UrgencyHook.png XMonad.Util.NamedWindows.png XMonad.Hooks.XPropManage_collapsed.png XMonad.Util.Paste_collapsed.png XMonad.Hooks.XPropManage.png XMonad.Util.Paste.png XMonad.Layout.Accordion_collapsed.png XMonad.Util.Run_collapsed.png XMonad.Layout.Accordion.png XMonad.Util.Run.png XMonad.Layout.BoringWindows_collapsed.png XMonad.Util.Scratchpad_collapsed.png XMonad.Layout.BoringWindows.png XMonad.Util.Scratchpad.png XMonad.Layout.Circle_collapsed.png XMonad.Util.Themes_collapsed.png XMonad.Layout.Circle.png XMonad.Util.Themes.png XMonad.Layout.Combo_collapsed.png XMonad.Util.Timer_collapsed.png XMonad.Layout.Combo.png XMonad.Util.Timer.png XMonad.Layout.Decoration_collapsed.png XMonad.Util.WindowProperties_collapsed.png XMonad.Layout.Decoration_core.png XMonad.Util.WindowProperties_core.png XMonad.Layout.DecorationMadness_collapsed.png XMonad.Util.WindowProperties.png XMonad.Layout.DecorationMadness.png XMonad.Util.WorkspaceCompare_collapsed.png XMonad.Layout.Decoration.png XMonad.Util.WorkspaceCompare.png XMonad.Layout.Dishes_collapsed.png XMonad.Util.XUtils_collapsed.png XMonad.Layout.Dishes.png XMonad.Util.XUtils.png gwern@craft:24374~/bin/XMonadContrib/SourceGraph>grep XSelection * [ 1:19PM] gwern@craft:24375~/bin/XMonadContrib/SourceGraph> (I'd attach the output, but even a gzipped tarball of SourceGraph/ is 8.2M, and someone complained about the last one which was only a few megabytes, so...) -- gwern SLBM TRW NSS 32 Poseidon blackjack global Aum enforcers Unit

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Sun, 12 Oct 2008 13:24:40 -0400
Gwern Branwen
However, I happened to want to look at the output for one of my modules, XMonad.Util.XSelection - and it simply isn't there. Most of the XMC modules seem to be there, but that one isn't. It's in the cabal file, SourceGraph did not output any errors or warnings, but XSelection is not mentioned in the HTML output nor are any PNGs generated with regard to it. See:
Hmmmm..... that means that SourceGraph isn't able to parse it and dies silently. I'll have a look at myself later and try to find out why. - -- Ivan Lazar Miljenovic Ivan.Miljenovic@gmail.com IvanMiljenovic.wordpress.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkjygdoACgkQfEfFJ9JhvyigPACfejpPr5vYnSOxCFg6DQTfnk2U cpIAnAhh7fzI9OtzPAXYxPpDg66UZzeD =upq7 -----END PGP SIGNATURE-----

On 2008.10.13 09:01:42 +1000, Ivan Lazar Miljenovic
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Sun, 12 Oct 2008 13:24:40 -0400 Gwern Branwen
wrote: However, I happened to want to look at the output for one of my modules, XMonad.Util.XSelection - and it simply isn't there. Most of the XMC modules seem to be there, but that one isn't. It's in the cabal file, SourceGraph did not output any errors or warnings, but XSelection is not mentioned in the HTML output nor are any PNGs generated with regard to it. See:
Hmmmm..... that means that SourceGraph isn't able to parse it and dies silently. I'll have a look at myself later and try to find out why.
- -- Ivan Lazar Miljenovic
'K. So SourceGraph doesn't do any error reporting? I'll keep that in mind. -- gwern Trident Satellite Flu High mailbomb Competitor MCI SEAL NSRB PARKHILL

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Sun, 12 Oct 2008 20:01:32 -0400
Gwern Branwen
'K. So SourceGraph doesn't do any error reporting? I'll keep that in mind.
In this case, it isn't SourceGraph's fault: Haskell-Src-Exts can't parse it. Maybe it doesn't parse CPP stuff properly? I'm not sure how I can get SourceGraph to parse files only after they've been pre-processed... The other option is that, once I've read the file and before I try parsing it, I do a bit of manual pre-processing of my own and simply filter out all lines that start with a '#' (i.e. remove all CPP annotations). The possible problem that I can think with this is that if there are two versions of a function foo defined within an #ifdef block, then that function will be listed twice (using nub might fix this but I'm not sure), or else if a function is optionally defined because you're not importing something (as appears to be the case with Gwern's XSelection module), then you have the situation where it's not possible to tell if it's using the external or internal one. - - -- Ivan Lazar Miljenovic Ivan.Miljenovic@gmail.com IvanMiljenovic.wordpress.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkjy9FoACgkQfEfFJ9Jhvyie+QCeOYA3MFoi41M+9PRC7F0KXPWL 3+0An2TsyRv26EO8a5AbdOGALzqHpYpD =/COZ -----END PGP SIGNATURE-----

Ivan Lazar Miljenovic
In this case, it isn't SourceGraph's fault: Haskell-Src-Exts can't parse it. Maybe it doesn't parse CPP stuff properly? I'm not sure how I can get SourceGraph to parse files only after they've been pre-processed...
You could try using the library version of cpphs, which is also on Hackage. (Note: has an LGPL license) Regards, Malcolm

Ivan:
In this case, it isn't SourceGraph's fault: Haskell-Src-Exts can't parse it. Maybe it doesn't parse CPP stuff properly? I'm not sure how I can get SourceGraph to parse files only after they've been pre-processed...
haskell-src-exts doesn't include a CPP processor no, but will discard all lines beginning with # (as an old hack to allow #!/bin/runhaskell style cgi-files). This of course leads to the kinds of problems you suggest with #if conditionals. So if you want to really support files with CPP you need to run a separate processor first, like cpphs as Malcolm suggested. Cheers, /Niklas
participants (4)
-
Gwern Branwen
-
Ivan Lazar Miljenovic
-
Malcolm Wallace
-
Niklas Broberg