+2007-05-10 Jürg Billeter <j@bitron.ch>
+
+ * ccode/valaccodeblock.vala, ccode/valaccodedeclaration.vala,
+ ccode/valaccodedeclarator.vala, ccode/valaccodefragment.vala,
+ ccode/valaccodefunctiondeclarator.vala, ccode/valaccodenode.vala,
+ ccode/valaccodeoncesection.vala, ccode/valaccodestruct.vala,
+ ccode/valaccodetypedefinition.vala,
+ ccode/valaccodevariabledeclarator.vala: separate declaration output
+ * vala/parser.y: remove comma at end of enum
+ * vala/valaclass.vala, vala/valastruct.vala: remove unused methods
+ * vala/Makefile.am: update
+ * gobject/valacodegeneratorsourcefile.vala: support declaration
+ separation in C code
+ * gobject/valaclassregisterfunction.vala,
+ gobject/valainterfaceregisterfunction.vala,
+ gobject/valatyperegisterfunction.vala: move from vala directory,
+ move interface info declarations to the beginning of the block
+ * gobject/Makefile.am: update
+
2007-05-09 Jürg Billeter <j@bitron.ch>
* ccode/valaccodeenum.vala: remove comma at end of generated enumerator
/* valaccodeblock.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
public override void write (CCodeWriter! writer) {
writer.write_begin_block ();
+ foreach (CCodeNode statement in statements) {
+ statement.write_declaration (writer);
+ }
foreach (CCodeNode statement in statements) {
statement.write (writer);
}
/* valaccodedeclaration.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
}
public override void write (CCodeWriter! writer) {
- writer.write_indent ();
if ((modifiers & CCodeModifiers.STATIC) == CCodeModifiers.STATIC) {
+ // combined declaration and initialization for static variables
+ writer.write_indent ();
writer.write_string ("static ");
+ writer.write_string (type_name);
+ writer.write_string (" ");
+
+ bool first = true;
+ foreach (CCodeDeclarator decl in declarators) {
+ if (!first) {
+ writer.write_string (", ");
+ } else {
+ first = false;
+ }
+ decl.write (writer);
+ }
+
+ writer.write_string (";");
+ writer.write_newline ();
+ } else {
+ foreach (CCodeDeclarator decl in declarators) {
+ decl.write_initialization (writer);
+ }
+ }
+ }
+
+ public override void write_declaration (CCodeWriter! writer) {
+ if ((modifiers & CCodeModifiers.STATIC) == CCodeModifiers.STATIC) {
+ // no separate declaration for static variables
+ return;
}
+
+ writer.write_indent ();
if ((modifiers & CCodeModifiers.REGISTER) == CCodeModifiers.REGISTER) {
writer.write_string ("register ");
}
} else {
first = false;
}
- decl.write (writer);
+ decl.write_declaration (writer);
}
writer.write_string (";");
/* valaccodedeclarator.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* Represents a variable or function pointer declarator in the C code.
*/
public abstract class Vala.CCodeDeclarator : CCodeNode {
+ /**
+ * Writes initialization statements for this declarator with the
+ * specified C code writer if necessary.
+ *
+ * @param writer a C code writer
+ */
+ public virtual void write_initialization (CCodeWriter! writer) {
+ }
}
/* valaccodefragment.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
node.write (writer);
}
}
+
+ public override void write_declaration (CCodeWriter! writer) {
+ foreach (CCodeNode node in children) {
+ node.write_declaration (writer);
+ }
+ }
}
/* valaccodefunctiondeclarator.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
}
public override void write (CCodeWriter! writer) {
+ write_declaration (writer);
+ }
+
+ public override void write_declaration (CCodeWriter! writer) {
writer.write_string ("(*");
writer.write_string (name);
writer.write_string (") (");
/* valaccodenode.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* @param writer a C code writer
*/
public abstract void write (CCodeWriter! writer);
+
+ /**
+ * Writes declaration for this code node with the specified C code
+ * writer if necessary.
+ *
+ * @param writer a C code writer
+ */
+ public virtual void write_declaration (CCodeWriter! writer) {
+ }
}
/* valaccodeoncesection.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
writer.write_string ("#define ");
writer.write_string (define);
writer.write_newline ();
+ foreach (CCodeNode node in get_children ()) {
+ node.write_declaration (writer);
+ }
foreach (CCodeNode node in get_children ()) {
node.write (writer);
}
writer.write_string ("#endif");
writer.write_newline ();
}
+
+ public override void write_declaration (CCodeWriter! writer) {
+ }
}
/* valaccodestruct.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
writer.write_string (name);
writer.write_begin_block ();
foreach (CCodeDeclaration decl in declarations) {
- decl.write (writer);
+ decl.write_declaration (writer);
}
writer.write_end_block ();
writer.write_string (";");
/* valaccodetypedefinition.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
}
public override void write (CCodeWriter! writer) {
+ }
+
+ public override void write_declaration (CCodeWriter! writer) {
writer.write_indent ();
writer.write_string ("typedef ");
writer.write_string (" ");
- declarator.write (writer);
+ declarator.write_declaration (writer);
writer.write_string (";");
writer.write_newline ();
/* valaccodevariabledeclarator.vala
*
- * Copyright (C) 2006 Jürg Billeter
+ * Copyright (C) 2006-2007 Jürg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
name = _name;
initializer = init;
}
-
+
public override void write (CCodeWriter! writer) {
writer.write_string (name);
-
+
+ if (initializer != null) {
+ writer.write_string (" = ");
+ initializer.write (writer);
+ }
+ }
+
+ public override void write_declaration (CCodeWriter! writer) {
+ writer.write_string (name);
+ }
+
+ public override void write_initialization (CCodeWriter! writer) {
if (initializer != null) {
+ writer.write_indent ();
+
+ writer.write_string (name);
writer.write_string (" = ");
initializer.write (writer);
+
+ writer.write_string (";");
+ writer.write_newline ();
}
}
}
libvala_la_SOURCES = \
gobject.vala.stamp \
+ valaclassregisterfunction.c \
+ valaclassregisterfunction.h \
+ valaclassregisterfunction.vala \
valacodegenerator.c \
valacodegenerator.h \
valacodegenerator.vala \
valacodegeneratorstruct.c \
valacodegeneratorstruct.h \
valacodegeneratorstruct.vala \
+ valainterfaceregisterfunction.c \
+ valainterfaceregisterfunction.h \
+ valainterfaceregisterfunction.vala \
+ valatyperegisterfunction.c \
+ valatyperegisterfunction.h \
+ valatyperegisterfunction.vala \
$(NULL)
gobjectincludedir = $(includedir)/vala-1.0/gobject
gobjectinclude_HEADERS = \
+ valaclassregisterfunction.h \
valacodegenerator.h \
valacodegeneratorassignment.h \
valacodegeneratorclass.h \
valacodegeneratorsignal.h \
valacodegeneratorsourcefile.h \
valacodegeneratorstruct.h \
+ valainterfaceregisterfunction.h \
+ valatyperegisterfunction.h \
$(NULL)
gobject.vala gobject.vala.stamp: $(filter %.vala,$(libvala_la_SOURCES))
}
}
- public override ref CCodeFragment! get_type_interface_init_statements () {
+ public override ref CCodeFragment! get_type_interface_init_declaration () {
var frag = new CCodeFragment ();
foreach (TypeReference base_type in class_reference.get_base_types ()) {
ctypedecl.modifiers = CCodeModifiers.STATIC;
ctypedecl.add_declarator (new CCodeVariableDeclarator.with_initializer (iface_info_name, new CCodeConstant ("{ (GInterfaceInitFunc) %s_%s_interface_init, (GInterfaceFinalizeFunc) NULL, NULL}".printf (class_reference.get_lower_case_cname (null), iface.get_lower_case_cname (null)))));
frag.append (ctypedecl);
+ }
+
+ return frag;
+ }
+
+ public override ref CCodeFragment! get_type_interface_init_statements () {
+ var frag = new CCodeFragment ();
+
+ foreach (TypeReference base_type in class_reference.get_base_types ()) {
+ if (!(base_type.data_type is Interface)) {
+ continue;
+ }
+
+ var iface = (Interface) base_type.data_type;
+
+ var iface_info_name = "%s_info".printf (iface.get_lower_case_cname (null));
+
var reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_add_interface_static"));
reg_call.add_argument (new CCodeIdentifier ("%s_type_id".printf (class_reference.get_lower_case_cname (null))));
reg_call.add_argument (new CCodeIdentifier (iface.get_upper_case_cname ("TYPE_")));
once.append (new CCodeIdentifier ("G_END_DECLS"));
once.append (new CCodeNewline ());
once.append (new CCodeNewline ());
+ once.write_declaration (writer);
once.write (writer);
writer.close ();
writer.write_newline ();
source_include_directives.write (writer);
writer.write_newline ();
+ source_type_member_declaration.write_declaration (writer);
source_type_member_declaration.write (writer);
writer.write_newline ();
+ source_signal_marshaller_declaration.write_declaration (writer);
source_signal_marshaller_declaration.write (writer);
writer.write_newline ();
source_type_member_definition.write (writer);
ctypedecl.modifiers = CCodeModifiers.STATIC;
ctypedecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("g_define_type_info", new CCodeConstant ("{ sizeof (%s), (GBaseInitFunc) %s, (GBaseFinalizeFunc) NULL, (GClassInitFunc) %s, (GClassFinalizeFunc) NULL, NULL, %s, 0, (GInstanceInitFunc) %s }".printf (get_type_struct_name (), get_base_init_func_name (), get_class_init_func_name (), get_instance_struct_size (), get_instance_init_func_name ()))));
type_init.add_statement (ctypedecl);
+
+ type_init.add_statement (get_type_interface_init_declaration ());
+
CCodeFunctionCall reg_call;
if (!plugin) {
reg_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_register_static"));
return "0";
}
+ /**
+ * Returns additional C declarations to setup interfaces.
+ *
+ * @return C declarations
+ */
+ public virtual ref CCodeFragment! get_type_interface_init_declaration () {
+ return new CCodeFragment ();
+ }
+
/**
* Returns additional C initialization statements to setup interfaces.
*
valaclass.c \
valaclass.h \
valaclass.vala \
- valaclassregisterfunction.c \
- valaclassregisterfunction.h \
- valaclassregisterfunction.vala \
valacodecontext.c \
valacodecontext.h \
valacodecontext.vala \
valainterface.c \
valainterface.h \
valainterface.vala \
- valainterfaceregisterfunction.c \
- valainterfaceregisterfunction.h \
- valainterfaceregisterfunction.vala \
valainterfacewriter.c \
valainterfacewriter.h \
valainterfacewriter.vala \
valatypereference.c \
valatypereference.h \
valatypereference.vala \
- valatyperegisterfunction.c \
- valatyperegisterfunction.h \
- valatyperegisterfunction.vala \
valaunaryexpression.c \
valaunaryexpression.h \
valaunaryexpression.vala \
valacatchclause.h \
valacharacterliteral.h \
valaclass.h \
- valaclassregisterfunction.h \
valacodecontext.h \
valacodenode.h \
valacodevisitor.h \
valainstancecast.h \
valaintegerliteral.h \
valainterface.h \
- valainterfaceregisterfunction.h \
valainterfacewriter.h \
valainvocationexpression.h \
valainvokable.h \
valatypeofexpression.h \
valatypeparameter.h \
valatypereference.h \
- valatyperegisterfunction.h \
valaunaryexpression.h \
valavariabledeclarator.h \
valawhilestatement.h \
VALA_MODIFIER_ABSTRACT = 1 << 0,
VALA_MODIFIER_OVERRIDE = 1 << 1,
VALA_MODIFIER_STATIC = 1 << 2,
- VALA_MODIFIER_VIRTUAL = 1 << 3,
+ VALA_MODIFIER_VIRTUAL = 1 << 3
} ValaModifier;
int yylex (YYSTYPE *yylval_param, YYLTYPE *yylloc_param, ValaParser *parser);
}
return lower_case_csuffix;
}
-
- private void set_lower_case_csuffix (string! csuffix) {
- this.lower_case_csuffix = csuffix;
- }
-
+
public override ref string get_lower_case_cname (string infix) {
if (infix == null) {
infix = "";
}
return lower_case_csuffix;
}
-
- private void set_lower_case_csuffix (string! csuffix) {
- this.lower_case_csuffix = csuffix;
- }
-
+
public override ref string get_lower_case_cname (string infix) {
if (infix == null) {
infix = "";
return "g_value_get_pointer";
} else {
Report.error (source_reference, "The value type `%s` doesn't declare a GValue get function".printf (symbol.get_full_name ()));
+ return null;
}
} else {
return get_value_function;
return "g_value_set_pointer";
} else {
Report.error (source_reference, "The value type `%s` doesn't declare a GValue set function".printf (symbol.get_full_name ()));
+ return null;
}
} else {
return set_value_function;