Refactoring in VHDL files

MMTsuchi
2012-03-07
2013-01-25
  • MMTsuchi
    MMTsuchi
    2012-03-07

    Hi, I would like to post a begining of the script that rename signals in VHDL without replacing signal names of inferior entities in port mapping.

    # script refactoring_VHDL.py
    # -*- coding: iso-8859-15 -*- # indispensable à cause des accents
    # Auteur : mm.tsuchi
    # je veux creer un exemple de refactoring dans les fichiers VHDL
    # cad remplacer le nom du signal partout dans le fichier , SAUF dans  le mappage des entités subordonnées
    # ATTENTION ! : script en version ALPHA (pas de contrôle d'erreur)
    # A FAIRE:
    # test si le fichier courant est VHDL
    # ---  FAIT : NE remplacer QUE les mots entiers 
    # ---  FAIT : remplacer si le nom NE se trouve PAS à gauche de "=>" (sans les guillemets) : ce qui correspond à un mappage de port lors d'instanciations.
    # NE PAS remplacer si c'est compris dans le nom d'une entité : mot-cles ENTITY ou GENERIC MAP ou PORT MAP
    #***   IMPORTS   ***
    # from Npp import *
    # import re,string
    import re
    # import os, sys
    # notepad.messageBox('Hello world')
    # vérifie si le fichier est VHDL
    if notepad.getCurrentLang() == "VHDL":
    # if 1==1:
       # First we'll start an undo action, then Ctrl-Z will undo the actions of the whole script
       editor.beginUndoAction()
       # **** demande a l'utilisateur le nom a renommer
       text_to_rename = notepad.prompt("Nom a renommer","Refactoring...",editor.getSelText())
       # affiche  dans la console
       if text_to_rename == None :
          console.write("rien a remplacer")
          # exit
       else:
          console.write("text_to_rename : "+text_to_rename+"\n")
          # **** demande a l'utilisateur le nom a renommer
          text_renamed = notepad.prompt("Nouveau nom","Refactoring...",text_to_rename)
          console.write("text_renamed : "+ text_renamed+"\n")
             
          # **** remplacement dans le fichier courant de text_to_rename par text_renamed
          # test : gauche       => gauche, -- blabla
          # test : if gauche = '1' then
          # test gauche
          # test gauche
          # test gauches
          # test -- gauche
          
          # on recharche tous les textes qui ne contiennent pas de "=>" après le text_to_rename
          # ATTENTION : on utilise les regular expression de Python (pas de notepad++)
          pattern_to_replace = r"\b" + text_to_rename + r"\b( *[^=]*[^>]*)$"
          console.write("pattern_to_replace : " + pattern_to_replace + "\n")
          
          # on écrit la chaine de remplacement
          pattern_replaced = r"" + text_renamed + r"\1"
          console.write("pattern_replaced : " + pattern_replaced + "\n")
          
          # on remplace
          editor.pyreplace( pattern_to_replace, pattern_replaced,0,re.IGNORECASE)
          editor.pyreplace(r"--(.*)\b" + text_to_rename + r"\b", r"--\1" + text_renamed,0,re.IGNORECASE) # remplacement dans commentaires
       # End the undo action, so Ctrl-Z will undo the above actions
       editor.endUndoAction()
    

    Be Aware that this script is a first exemple (alpha stage) : may be incomplete, no error control, no check of reserved words, no check of end of line…

    Any amelioration will be wonderful.