I just pushed a change to fbc/master that we should find more robust.
Demo ouput for :
__FB_QUERY_SYMBOL__( fbc.FB_QUERY_SYMBOL.symbclass, sym )
Code: Select all
EXAMPLES OF __FB_QUERY_SYMBOL__( fbc.FB_QUERY_SYMBOL.symbclass, sym )
[0] *invalid* : integer ptr
[1] var : x
[1] var : y
[2] const : c
[2] const : E.elem1
[2] const : elem1
[3] proc : test
[3] proc : @test
[3] proc : T.test
[3] proc : ns.test
[3] proc : T.test
[3] proc : ns.ns2.test2
[6] keyword : integer
[7] label : label
[8] namespace : ns
[8] namespace : ns.ns2
[9] enum : E
[10] struct : U
[10] struct : T
[10] struct : ns.T1
[12] field : x.i
[12] field : y->i
[12] field : T.i
[12] field : U.a
The result of zero when getting the symbclass for "integer ptr" is correct because it is a data type expression, not an individual symbol.
Example Code for above:
Code: Select all
#include once "fbc-int/symbol.bi"
private function symbclassToStr _
( _
byval classid as fbc.FB_SYMBCLASS _
) as string
static as zstring ptr classnames _
( _
fbc.FB_SYMBCLASS.FB_SYMBCLASS_VAR _
to fbc.FB_SYMBCLASS.FB_SYMBCLASS_NSIMPORT _
) = _
{ _
@"var" , _
@"const" , _
@"proc" , _
@"param" , _
@"define" , _
@"keyword" , _
@"label" , _
@"namespace", _
@"enum" , _
@"struct" , _
@"class" , _
@"field" , _
@"typedef" , _
@"fwdref" , _
@"scope" , _
@"reserved" , _
@"nsimport" _
}
select case classid
case lbound(classnames) to ubound(classnames)
return *classnames(classid)
end select
return "*invalid*"
end function
#macro info( c )
print c;
print " <- ";
print #c
#endmacro
#macro show_symbclass( sym )
scope
var classid = __FB_QUERY_SYMBOL__( fbc.FB_QUERY_SYMBOL.symbclass, sym )
print left( "[" & classid & "] " & symbclassToStr(classid)+space(14),14) & ": ";
print #sym
end scope
#endmacro
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_VAR )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_CONST )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_PROC )
'info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_PARAM )
'info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_DEFINE )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_KEYWORD )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_LABEL )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_NAMESPACE )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_ENUM )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_STRUCT )
'info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_CLASS )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_FIELD )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_TYPEDEF )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_FWDREF )
'info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_SCOPE )
info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_RESERVED )
'info( fbc.FB_SYMBCLASS.FB_SYMBCLASS_NSIMPORT )
const c = 1234
type T
i as integer
declare sub test()
end type
dim x as T, y as T ptr
union U
a as short
b as long
end union
enum E
elem1
end enum
sub test()
end sub
namespace ns
sub test()
end sub
namespace ns2
sub test2()
end sub
end namespace
type T1
x as integer
end type
end namespace
print
print "EXAMPLES OF __FB_QUERY_SYMBOL__( fbc.FB_QUERY_SYMBOL.symbclass, sym )"
print
show_symbclass( integer ptr )
show_symbclass( x )
show_symbclass( y )
show_symbclass( c )
show_symbclass( E.elem1 )
show_symbclass( elem1 )
show_symbclass( test )
show_symbclass( @test )
show_symbclass( T.test )
show_symbclass( ns.test )
show_symbclass( T.test )
show_symbclass( ns.ns2.test2 )
show_symbclass( integer )
label:
show_symbclass( label )
show_symbclass( ns )
show_symbclass( ns.ns2 )
show_symbclass( E )
show_symbclass( U )
show_symbclass( T )
show_symbclass( ns.T1 )
show_symbclass( x.i )
show_symbclass( y->i )
show_symbclass( T.i )
show_symbclass( U.a )
sleep