07.05.2016, 15:35, "Al Thomas" <astav...@yahoo.co.uk>:
>>  From: Dmitry Golovin <d...@golovin.in>
>>  Sent: Saturday, 7 May 2016, 9:01
>>  Subject: [Vala] Getting all the symbols from my code
>>
>>  I want to have a list of all the symbols from my code.
>>
>>  First I create a CodeContext, then I add all the external packages and 
>> source
>>  files, then visit each file with a Parser.
>>
>>  I expect to get all the CodeNodes from my code, but I only get the top-level
>
>>  ones. Is it possible to get all the children of each CodeNode?
>
> You probably want to be looking at a CodeVisitor. So this file
>
> I think writes out Vala symbols for a VAPI:
> https://git.gnome.org/browse/vala/tree/vala/valacodewriter.vala
>
> I understand other tools have done similar to what you are attempting:
> https://git.gnome.org/browse/anjuta/tree/plugins/language-support-vala
> https://git.gnome.org/browse/gnome-builder/tree/plugins/vala-pack
>
> Given a lot of IDE tools are re-implementing this there is probably
> a case for a libvalaidetools that talks to libvala and provides a stable
> API. That would be a signifiant project. I would suggest the Vala build
> system also be switched to non-recursive make first so it is easier to
> add any new code.
>
> Al

Thanks for the code reference, Al! I will check it out.

For now I created some kind of Type detection, but I'm not sure if it is done 
right. Here is my code (please excuse formatting, I think it is more readable 
this way if you use monotype font):

    foreach (var src in context.get_source_files()) {
        print("\n" + src.get_relative_filename() + ":\n");
        foreach (var node in src.get_nodes()) {
            print(node.to_string() + " -- ");
            if (node is Expression) {                       print("Expression");
            } else if (node is Symbol) {                    print("Symbol ");
                if (node is Constant) {                         
print("Constant");
                } else if (node is Namespace) {                 
print("Namespace");
                } else if (node is Subroutine) {                
print("Subroutine ");
                    if (node is Constructor) {                      
print("Constructor");
                    } else if (node is Destructor) {                
print("Destructor");
                    } else if (node is Method) {                    
print("Method");
                    } else if (node is PropertyAccessor) {          
print("PropertyAccessor");
                    } else {                                        print("-"); 
}
                } else if (node is TypeSymbol) {                
print("TypeSymbol ");
                    if (node is Delegate) {                         
print("Delegate");
                    } else if (node is Enum) {                      
print("Enum");
                    } else if (node is ErrorCode) {                 
print("ErrorCode");
                    } else if (node is ErrorDomain) {               
print("ErrorDomain");
                    } else if (node is ObjectTypeSymbol) {          
print("ObjectTypeSymbol ");
                        if (node is Class) {                            
print("Class");
                        } else if (node is Interface) {                 
print("Interface");
                        } else {                                        
print("-"); }
                    } else if (node is Struct) {                    
print("Struct");
                    } else {                                        print("-"); 
}
                } else if (node is Variable) {                  print("Variable 
");
                    if (node is Field) {                            
print("Field");
                    } else if (node is LocalVariable) {             
print("LocalVariable");
                    } else if (node is Vala.Parameter) {            
print("Parameter");
                    } else {                                        print("-"); 
}
                } else {                                        print("-"); }
            } else {                                        print("-"); }
            print("\n");
        }
    }

The idea of having somehow standardized libvalaidetools is great. This can be 
simple API library providing completion, code navigation, dependency 
management, some standard vala-project file format, etc. So that anyone could 
turn his favorite text editor into full-featured Vala IDE using this library.

Regards,
Dmitry
_______________________________________________
vala-list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to