From e4900116537dde1a9a6b2aa9a62bbb81b4a86371 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrg=20Billeter?= Date: Mon, 7 Jul 2008 10:07:20 +0000 Subject: [PATCH] Support methods and property accessors with body in VAPI files MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2008-07-07 Jürg Billeter * 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 | 10 +++++++ gobject/valaccodegenerator.vala | 14 ++++++--- gobject/valaccodegeneratorsourcefile.vala | 5 ++++ vala/valaparser.vala | 48 +++++++++++++++++++++++++++---- vala/valasourcefile.vala | 7 +++++ vala/valasymbol.vala | 15 ++++------ 6 files changed, 80 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 790e0c6..87812ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2008-07-07 Jürg Billeter + * 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 + * vala/valasemanticanalyzer.vala: Allow non-external methods in VAPI files diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 814074b..5e3358f 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -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 ())); + } } } diff --git a/gobject/valaccodegeneratorsourcefile.vala b/gobject/valaccodegeneratorsourcefile.vala index 423bc02..4149d00 100644 --- a/gobject/valaccodegeneratorsourcefile.vala +++ b/gobject/valaccodegeneratorsourcefile.vala @@ -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 ()) { diff --git a/vala/valaparser.vala b/vala/valaparser.vala index c38933a..1a2dcef 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -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? 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? 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? 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? 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? 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? 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); } diff --git a/vala/valasourcefile.vala b/vala/valasourcefile.vala index 1203c9f..28928aa 100644 --- a/vala/valasourcefile.vala +++ b/vala/valasourcefile.vala @@ -85,6 +85,8 @@ public class Vala.SourceFile : Object { private Gee.List header_internal_full_dependencies = new ArrayList (); private Gee.List header_internal_dependencies = new ArrayList (); + private Gee.Set source_symbol_dependencies = new HashSet (); + private Gee.ArrayList 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 (header_internal_dependencies); } + public Gee.Set get_source_symbol_dependencies () { + return new ReadOnlySet (source_symbol_dependencies); + } + /** * Returns the requested line from this file, loading it if needed. * diff --git a/vala/valasymbol.vala b/vala/valasymbol.vala index 8300d9c..30a3ee0 100644 --- a/vala/valasymbol.vala +++ b/vala/valasymbol.vala @@ -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; -- 2.7.4