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