[Haskell-cafe] ANNOUNCE: HaRe, the Haskell Refactorer 0.6

Chris BROWN chrisb at cs.st-andrews.ac.uk
Mon Jun 28 07:37:13 EDT 2010


Dear Haskellers,

As part of our project on Refactoring Functional Programs

     http://www.cs.kent.ac.uk/projects/refactor-fp/

we are pleased to announce the availability of HaRe 0.6 (also known as
HaRe 28/06/2010), a snapshot of our Haskell Refactorer prototype. Apart
from bug-fixes, there are major changes since HaRe 0.5 and HaRe 0.4:

A number of new refactorings have been added to HaRe. Some of these
include:
Adding and removing fields and constructors to data-type definitions,
folding and unfolding against as-patterns, merging and splitting,
converting between let and where constructs, introduce pattern matching,
generative folding, and a clone detection and elimination tool.


We have evolved the ongoing architecture of HaRe and derived an API
(documented using Haddock) for program analysis and transformation.
This allows HaRe to serve as a framework for end-users to build their
own refactorings or just program transformations (or analyses).

HaRe is available to download directly from here:

http://www.cs.kent.ac.uk/projects/refactor-fp/hare/HaRe_28062010.tar.gz


You can get HaRe 0.6 and the documentation about how to build your own
refactorings via:

http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html

Please see the README.txt for build/use instructions and known issues,
and let us know about any problems, bugs, suggestions or additional
platforms you can confirm as working.

You will need:

  1. ghc-6.12.1
  2. hint-0.3.2.3 (available from cabal)
  3. unix/gnu tools (or cygwin tools, if on windows)
  4. vim or emacs (we've tested with gvim 6.2 and with emacs 21.4)
  5. If you intend on running the test suite, HUnit-1.0.

Happy Refactoring!

  The HaRe Team (Chris Brown, Huiqing Li, Simon Thompson)

  Project email: refactor-fp at kent.ac.uk<http://www.haskell.org/mailman/listinfo/haskell>

Background:

  Refactoring is the process of changing the structure of programs
  without changing their functionality, i.e., refactorings are
  meaning-preserving program transformations that implement design
  changes. For more details about refactoring, about our project and
  for background on HaRe, see our project pages.

HaRe - the Haskell Refactorer:

  HaRe is our prototype tool supporting a collection of refactorings
  for Haskell 98 (see README.txt for known issues and limitations).

  It is implemented as a separate refactoring engine (on top of
  Programatica's Haskell frontend and Strafunski's generic traversal
  strategy library), with small scripting frontends that call this
  engine from either Vim or Emacs.


  Currently supported refactorings:

     Introduce Pattern Match    : place cursor over pattern variable



     Introduce Sub pattern      : place cursor over pattern variable



     Introduce Case Expression  : place cursor over pattern variable



     Generative Fold            : highlight expression to fold.
                                  Must have equation in comment directly before
                                  definition of highlighted expression.



     Clone Analysis             : select from menu



     Clone Extraction           : highlight clone from the clone class to extract, follow
                                  step-by-step instructions.



     Converting Let to Where    : place cursor at start of identifier whose
                                  definition is to be moved



     Converting Where to Let    : place cursor at start of identifier whose
                                  definition is to be moved.



     create type signatures     : select from menu



     remove redundant declarations
                                : highlight definition to clean up



     add constructor to data
    type                        : place cursor at start of data type, you'll
                                  be prompted to add the new Constructor
                                  name, followed by any Type parameters as a
                                  complete string
     Split a tuple              : place cursor at start of top level definition that
                                  returns a tuple.



     Slicing based on a subexpression
                                : highlight sub-expression to extract.



     Instantiate a general pattern
                                : select a function equation and enter
                                  the new instances for each pattern in the argument set.







     Extract an expression      : highlight an expression within a definition
     Convert data type to
     newtype                    : place cursor at start of data type



     add definition to merge    : place cursor at start of definition that is to be merged



     merge definitions          : use "add definition for merge" for each definition to be merged.
                                  then choose merge definitions from menu.



     fold function definition   : highlight function equation to fold against.



     fold constant definition   : highlight constant equation to fold against.



     convert pattern to an as pattern
                                : highlight pattern to convert.



     unfold references to as patterns
                                : place cursor over as pattern name.



     remove field from a data type
                                : place cursor at start of field to remove.



     add field to data type
                                : place cursor over start of constructor.
                                  enter new field name.







     add debug information      : add trace calls to function by placing cursor at the
                                  start of the function to trace



     rename                     : place cursor at start of identifier to
                                  be renamed, you'll be prompted for a
                                  new name

     Lift def to top level      : place cursor at start of identifier
                                  whose definition is to be moved
     Lift def one level         : place cursor at start of identifier
                                  whose definition is to be moved
     Demote                     : place cursor at start of identifier
                                  whose definition is to be moved
     Introduce new def          : highlight expression to be named,
                                  you'll be prompted for a new name
     Unfold def                 : place cursor at start of identifier
                                  where its definition is to be unfolded
     Generalise def             : place cursor at start of identifier
                                  where its definition is to be unfolded
     Remove def                 : place cursor at start of identifier
                                  whose definition is to be removed
     Duplicate def              : place cursor at start of identifier
                                  whose definition is to be duplicated,
                                  you'll be prompted for a new name

     Add one parameter          : place cursor at start of identifier
                                  whose definition is to be modified,
                                  you'll be prompted for a new name
     rm one parameter           : place cursor in formal parameter
                                  which is to be removed



     Move def to another module : place cursor at start of the identifier
                                  whose definition is to be moved, you'll
                                  be prompted for the module name
     Clean imports              : cursor position does not matter, just
                                  choose the command from the refactor menu
     Make import explicit       : place cursor at the start of the module
                                  name in the import declaration
     Add to export              : place cursor at start of the identifier
                                  which is to be added to the export
     Remove from export         : place cursor at start of the entry to
                                  be removed in the export list
     From concrete to abstract data type: place cursor at start of the data type name
     Add field names            : place cursor at start of the data type name
     Add discriminators         : place cursor at start of the data type name
     Add constructors           : place cursor at start of the data type name
     Eliminate nested patterns  : place cursor at start of the data type name
     Eliminate patterns         : place cursor at start of the data type name
     Create an ADT module       : place cursor at start of the data type name
     Eliminate intermediate list: cursor position does not matter, just choose
                                  the command from the menu.


Caveats (see also README.txt):

  Please keep in mind that this is a prototype, so we do not recommend
  to use it on your productions sources just yet. Just play with it
  to get an idea of tool-supported refactoring in Haskell, and send us
  your feedback and bug-reports. Our goal is to develop this into a
  tool that many of you will find indispensable for Haskell
  development.

Regards,
The HaRe team.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100628/b93ade23/attachment.html


More information about the Haskell-Cafe mailing list