Salome HOME
PN : pour les complexes, le retour arrière sur les listes et l historique des fichiers
[tools/eficas.git] / Utilites / funcname.py
1 # -*- coding: utf-8 -*-
2 import re,types
3 import sys
4
5 sortie=sys.stderr
6 sortie.write( "import de "+__name__+" : $Id: funcname.py,v 1.1 2003/03/06 14:36:11 eficas Exp $" )
7 sortie.write( "\n" )
8
9 def get_nombre_de_blancs( str ) :
10     nombre_de_blancs=0
11     if str :
12         nombre_de_blancs=len(re.sub( "[^ ].*$" , "" , str ))
13     return nombre_de_blancs
14
15
16
17 def get_classname( filename, lineno ) :
18     """
19         Cette méthode sert à trouver dans quelle classe (le cas échéant)
20         se trouve l'instruction numéro lineno dans le fichier filename.
21     """
22     classname = ""
23     current_func = ""
24     assert(type(filename)==types.StringType)
25     ####print "RECHERCHE de la classe de "+filename+" ligne : ",lineno
26     if lineno>0 :
27         try :
28                 f=open( filename , 'r' )
29         except Exception,e :
30                 print ">>>>",str(e)
31                 sys.stdout.flush()
32                 sys.exit(17)
33
34         s = f.read()
35         f.close()
36         l_lines = s.split( '\n' )
37         k=1
38         inst = l_lines[lineno]
39         nb_blancs= get_nombre_de_blancs( inst )
40
41         for line in l_lines :
42             if k == lineno :
43                 break
44             elif re.search( "^ *def ", line ) != None :
45                 if get_nombre_de_blancs( line ) < nb_blancs :
46                     current_func=re.sub( "^ *def  *" , "" , line )
47                     current_func=re.sub( " *\(.*$" , "" , current_func )
48             elif re.search( "^class ", line ) != None :
49                 classname = re.sub( "^class  *" , "" , line )
50                 classname = re.sub( " *[(:].*$" , "" , classname )
51                 current_func = ""
52             elif current_func != "" and re.search( "^[^ \t]", line ) != None :
53                 current_func = ""
54                 classname = ""
55             k = k+1
56     if current_func == "" : current_func="__main__"
57     return classname ,current_func
58
59
60
61
62 class FUNCNAME :
63
64     """
65         Conversion des 3 informations nom de méthode, nom de fichier
66         numéro de ligne en un nom complet de méthode
67     """
68
69     def __init__ ( self , *args ) :
70
71         # le premier argument est optionnel (c'est un nom de fonction 
72         # qu'on peut reconstituer avec le nom du fichier et le numéro de ligne.
73         k=0
74         self.name = None
75         if len(args)>2 :
76             if args[k] != "" : self.name = args[k]
77             k = k+1
78
79         assert(args[k]!=None)
80         assert(args[k]!="")
81         self.filename = args[k] # recuperation du nom du fichier source
82
83         k = k+1
84         assert(args[k]>0)
85         self.lineno = args[k]   # recupération du numero de ligne
86
87         self.classname,funcname = get_classname( self.filename, self.lineno )
88         if self.name == None : self.name = funcname
89         ###assert(funcname==self.name or self.name=="main" or self.name=="<lambda>" ), "attendue '"+self.name+"' - trouvee '"+funcname+"'"
90
91     def __str__ ( self ) :
92         if self.classname != "" :
93             name=self.classname+"."+self.name
94         else :
95             name=self.name
96         return name
97
98
99 if __name__ == "__main__" :
100         print  'FUNCNAME("","funcname.py", 68)='+str(FUNCNAME("","funcname.py", 63) )
101         print  'FUNCNAME("funcname.py", 68)='+str(FUNCNAME("funcname.py", 63) )