Support methods and property accessors with body in VAPI files
authorJürg Billeter <j@bitron.ch>
Mon, 7 Jul 2008 10:07:20 +0000 (10:07 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Mon, 7 Jul 2008 10:07:20 +0000 (10:07 +0000)
2008-07-07  Jürg Billeter  <j@bitron.ch>

* vala/valaparser.vala:
* vala/valasourcefile.vala:
* vala/valasymbol.vala:
* gobject/valaccodegenerator.vala:
* gobject/valaccodegeneratorsourcefile.vala:

Support methods and property accessors with body in VAPI files

svn path=/trunk/; revision=1679

ChangeLog
gobject/valaccodegenerator.vala
gobject/valaccodegeneratorsourcefile.vala
vala/valaparser.vala
vala/valasourcefile.vala
vala/valasymbol.vala

index 790e0c6..87812ca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2008-07-07  Jürg Billeter  <j@bitron.ch>
 
+       * vala/valaparser.vala:
+       * vala/valasourcefile.vala:
+       * vala/valasymbol.vala:
+       * gobject/valaccodegenerator.vala:
+       * gobject/valaccodegeneratorsourcefile.vala:
+
+       Support methods and property accessors with body in VAPI files
+
+2008-07-07  Jürg Billeter  <j@bitron.ch>
+
        * vala/valasemanticanalyzer.vala:
 
        Allow non-external methods in VAPI files
index 814074b..5e3358f 100644 (file)
@@ -771,10 +771,16 @@ public class Vala.CCodeGenerator : CodeGenerator {
 
                next_temp_var_id = old_next_temp_var_id;
 
-               // FIXME: omit real struct types for now since they cannot be expressed as gobject property yet
-               // don't register private properties
-               if (prop.parent_symbol is Class && !prop.property_type.is_real_struct_type () && prop.access != SymbolAccessibility.PRIVATE) {
-                       prop_enum.add_value (new CCodeEnumValue (prop.get_upper_case_cname ()));
+               var cl = prop.parent_symbol as Class;
+               if (cl != null && cl.is_subtype_of (gobject_type)) {
+                       // GObject property
+                       // FIXME: omit real struct types for now since they
+                       // cannot be expressed as gobject property yet
+                       // don't register private properties
+                       if (!prop.property_type.is_real_struct_type ()
+                           && prop.access != SymbolAccessibility.PRIVATE) {
+                               prop_enum.add_value (new CCodeEnumValue (prop.get_upper_case_cname ()));
+                       }
                }
        }
 
index 423bc02..4149d00 100644 (file)
@@ -238,6 +238,11 @@ public class Vala.CCodeGenerator {
                                used_includes.add (filename);
                        }
                }
+               foreach (Symbol symbol in source_file.get_source_symbol_dependencies ()) {
+                       if (!symbol.external && symbol.external_package) {
+                               symbol.accept (this);
+                       }
+               }
                if (source_file.is_cycle_head) {
                        foreach (SourceFile cycle_file in source_file.cycle.files) {
                                foreach (CodeNode node in cycle_file.get_nodes ()) {
index c38933a..1a2dcef 100644 (file)
@@ -1936,6 +1936,9 @@ public class Vala.Parser : CodeVisitor {
                        cl.is_static = true;
                        Report.warning (get_last_src (), "static classes are deprecated, use namespaces");
                }
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       cl.external = true;
+               }
                set_attributes (cl, attrs);
                foreach (TypeParameter type_param in type_param_list) {
                        cl.add_type_parameter (type_param);
@@ -2014,7 +2017,7 @@ public class Vala.Parser : CodeVisitor {
        Constant parse_constant_declaration (Gee.List<Attribute>? attrs) throws ParseError {
                var begin = get_location ();
                var access = parse_access_modifier ();
-               parse_member_declaration_modifiers ();
+               var flags = parse_member_declaration_modifiers ();
                expect (TokenType.CONST);
                var type = parse_type (false);
                string id = parse_identifier ();
@@ -2032,6 +2035,9 @@ public class Vala.Parser : CodeVisitor {
 
                var c = new Constant (id, type, initializer, get_src_com (begin));
                c.access = access;
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       c.external = true;
+               }
                set_attributes (c, attrs);
                return c;
        }
@@ -2055,6 +2061,9 @@ public class Vala.Parser : CodeVisitor {
                    || ModifierFlags.OVERRIDE in flags) {
                        Report.error (f.source_reference, "abstract, virtual, and override modifiers are not applicable to fields");
                }
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       f.external = true;
+               }
                if (accept (TokenType.ASSIGN)) {
                        f.initializer = parse_expression ();
                }
@@ -2141,6 +2150,8 @@ public class Vala.Parser : CodeVisitor {
                }
                if (!accept (TokenType.SEMICOLON)) {
                        method.body = parse_block ();
+               } else if (scanner.source_file.external_package) {
+                       method.external = true;
                }
                return method;
        }
@@ -2164,6 +2175,9 @@ public class Vala.Parser : CodeVisitor {
                if (ModifierFlags.OVERRIDE in flags) {
                        prop.overrides = true;
                }
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       prop.external = true;
+               }
                expect (TokenType.OPEN_BRACE);
                while (current () != TokenType.CLOSE_BRACE) {
                        if (accept (TokenType.DEFAULT)) {
@@ -2190,6 +2204,7 @@ public class Vala.Parser : CodeVisitor {
                                        Block block = null;
                                        if (!accept (TokenType.SEMICOLON)) {
                                                block = parse_block ();
+                                               prop.external = false;
                                        }
                                        prop.get_accessor = new PropertyAccessor (true, false, false, block, get_src (accessor_begin));
                                        set_attributes (prop.get_accessor, attrs);
@@ -2211,6 +2226,7 @@ public class Vala.Parser : CodeVisitor {
                                        Block block = null;
                                        if (!accept (TokenType.SEMICOLON)) {
                                                block = parse_block ();
+                                               prop.external = false;
                                        }
                                        prop.set_accessor = new PropertyAccessor (false, writable, _construct, block, get_src (accessor_begin));
                                        set_attributes (prop.set_accessor, attrs);
@@ -2298,7 +2314,7 @@ public class Vala.Parser : CodeVisitor {
        Symbol parse_struct_declaration (Gee.List<Attribute>? attrs) throws ParseError {
                var begin = get_location ();
                var access = parse_access_modifier ();
-               parse_type_declaration_modifiers ();
+               var flags = parse_type_declaration_modifiers ();
                expect (TokenType.STRUCT);
                var sym = parse_symbol_name ();
                var type_param_list = parse_type_parameter_list ();
@@ -2310,6 +2326,9 @@ public class Vala.Parser : CodeVisitor {
                }
                var st = new Struct (sym.name, get_src_com (begin));
                st.access = access;
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       st.external = true;
+               }
                set_attributes (st, attrs);
                foreach (TypeParameter type_param in type_param_list) {
                        st.add_type_parameter (type_param);
@@ -2354,7 +2373,7 @@ public class Vala.Parser : CodeVisitor {
        Symbol parse_interface_declaration (Gee.List<Attribute>? attrs) throws ParseError {
                var begin = get_location ();
                var access = parse_access_modifier ();
-               parse_type_declaration_modifiers ();
+               var flags = parse_type_declaration_modifiers ();
                expect (TokenType.INTERFACE);
                var sym = parse_symbol_name ();
                var type_param_list = parse_type_parameter_list ();
@@ -2367,6 +2386,9 @@ public class Vala.Parser : CodeVisitor {
                }
                var iface = new Interface (sym.name, get_src_com (begin));
                iface.access = access;
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       iface.external = true;
+               }
                set_attributes (iface, attrs);
                foreach (TypeParameter type_param in type_param_list) {
                        iface.add_type_parameter (type_param);
@@ -2421,11 +2443,14 @@ public class Vala.Parser : CodeVisitor {
        Symbol parse_enum_declaration (Gee.List<Attribute>? attrs) throws ParseError {
                var begin = get_location ();
                var access = parse_access_modifier ();
-               parse_type_declaration_modifiers ();
+               var flags = parse_type_declaration_modifiers ();
                expect (TokenType.ENUM);
                var sym = parse_symbol_name ();
                var en = new Enum (sym.name, get_src_com (begin));
                en.access = access;
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       en.external = true;
+               }
                set_attributes (en, attrs);
 
                expect (TokenType.OPEN_BRACE);
@@ -2478,11 +2503,14 @@ public class Vala.Parser : CodeVisitor {
        Symbol parse_errordomain_declaration (Gee.List<Attribute>? attrs) throws ParseError {
                var begin = get_location ();
                var access = parse_access_modifier ();
-               parse_type_declaration_modifiers ();
+               var flags = parse_type_declaration_modifiers ();
                expect (TokenType.ERRORDOMAIN);
                var sym = parse_symbol_name ();
                var ed = new ErrorDomain (sym.name, get_src_com (begin));
                ed.access = access;
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       ed.external = true;
+               }
                set_attributes (ed, attrs);
 
                expect (TokenType.OPEN_BRACE);
@@ -2651,7 +2679,7 @@ public class Vala.Parser : CodeVisitor {
        CreationMethod parse_creation_method_declaration (Gee.List<Attribute>? attrs) throws ParseError {
                var begin = get_location ();
                var access = parse_access_modifier ();
-               parse_member_declaration_modifiers ();
+               var flags = parse_member_declaration_modifiers ();
                var sym = parse_symbol_name ();
                CreationMethod method;
                if (sym.inner == null) {
@@ -2659,6 +2687,9 @@ public class Vala.Parser : CodeVisitor {
                } else {
                        method = new CreationMethod (sym.inner.name, sym.name, get_src_com (begin));
                }
+               if (ModifierFlags.EXTERN in flags) {
+                       method.external = true;
+               }
                expect (TokenType.OPEN_PARENS);
                if (current () != TokenType.CLOSE_PARENS) {
                        do {
@@ -2677,6 +2708,8 @@ public class Vala.Parser : CodeVisitor {
                method.binding = MemberBinding.STATIC;
                if (!accept (TokenType.SEMICOLON)) {
                        method.body = parse_block ();
+               } else if (scanner.source_file.external_package) {
+                       method.external = true;
                }
                return method;
        }
@@ -2695,6 +2728,9 @@ public class Vala.Parser : CodeVisitor {
                if (!(ModifierFlags.STATIC in flags)) {
                        d.has_target = true;
                }
+               if (ModifierFlags.EXTERN in flags || scanner.source_file.external_package) {
+                       d.external = true;
+               }
                foreach (TypeParameter type_param in type_param_list) {
                        d.add_type_parameter (type_param);
                }
index 1203c9f..28928aa 100644 (file)
@@ -85,6 +85,8 @@ public class Vala.SourceFile : Object {
        private Gee.List<weak SourceFile> header_internal_full_dependencies = new ArrayList<weak SourceFile> ();
        private Gee.List<weak SourceFile> header_internal_dependencies = new ArrayList<weak SourceFile> ();
 
+       private Gee.Set<Symbol> source_symbol_dependencies = new HashSet<Symbol> ();
+
        private Gee.ArrayList<string> source_array = null;
 
        private MappedFile mapped_file = null;
@@ -264,6 +266,7 @@ public class Vala.SourceFile : Object {
                }
                
                if (dep_type == SourceFileDependencyType.SOURCE) {
+                       source_symbol_dependencies.add (s);
                        if (s.external_package) {
                                foreach (string fn in s.get_cheader_filenames ()) {
                                        source_external_includes.add (fn);
@@ -380,6 +383,10 @@ public class Vala.SourceFile : Object {
                return new ReadOnlyList<weak SourceFile> (header_internal_dependencies);
        }
 
+       public Gee.Set<Symbol> get_source_symbol_dependencies () {
+               return new ReadOnlySet<Symbol> (source_symbol_dependencies);
+       }
+
        /**
         * Returns the requested line from this file, loading it if needed.
         *
index 8300d9c..30a3ee0 100644 (file)
@@ -82,6 +82,11 @@ public abstract class Vala.Symbol : CodeNode {
         * and checking their accessibility.
         */
        public bool is_internal_symbol () {
+               if (!external && external_package) {
+                       // non-external symbols in VAPI files are internal symbols
+                       return true;
+               }
+
                for (Symbol sym = this; null != sym; sym = sym.parent_symbol) {
                        if (SymbolAccessibility.PRIVATE == sym.access) {
                                return true;
@@ -99,13 +104,7 @@ public abstract class Vala.Symbol : CodeNode {
         * Specifies whether the implementation is external, for example in
         * a separate C source file or in an external library.
         */
-       public bool external {
-               get {
-                       return _external || (parent_symbol != null && parent_symbol.external)
-                              || external_package;
-               }
-               set { _external = value; }
-       }
+       public bool external { get; set; }
 
        /**
         * Specifies whether the implementation is in an external library.
@@ -119,8 +118,6 @@ public abstract class Vala.Symbol : CodeNode {
        private weak Scope _owner;
        private Scope _scope;
 
-       private bool _external;
-
        construct {
                _scope = new Scope (this);
                active = true;