summaryrefslogtreecommitdiff
path: root/vapigen/valagidlparser.vala
diff options
context:
space:
mode:
authorJuerg Billeter <j@bitron.ch>2007-07-21 14:29:16 +0000
committerJürg Billeter <juergbi@src.gnome.org>2007-07-21 14:29:16 +0000
commitdb24aa20579b766161a070df69923e9f56ab7dd3 (patch)
tree92e6b6a6c5f6638c4ccce8cab3e2348b83286c03 /vapigen/valagidlparser.vala
parent611df119392203ed4648f754139902547c2ebee8 (diff)
downloadvala-db24aa20579b766161a070df69923e9f56ab7dd3.tar.gz
derive from Symbol class where appropriate and move symbol table into
2007-07-21 Juerg Billeter <j@bitron.ch> * vala/Makefile.am, vala/parser.y, vala/scanner.l, vala/vala.h, vala/valaarray.vala, vala/valaarraylengthfield.vala, vala/valaarrayresizemethod.vala, vala/valaattributeprocessor.vala, vala/valablock.vala, vala/valabreakstatement.vala, vala/valacallback.vala, vala/valaclass.vala, vala/valacodecontext.vala, vala/valacodenode.vala, vala/valacodevisitor.vala, vala/valaconstant.vala, vala/valaconstructor.vala, vala/valacontinuestatement.vala, vala/valacreationmethod.vala, vala/valadatatype.vala, vala/valadeclarationstatement.vala, vala/valadestructor.vala, vala/valadostatement.vala, vala/valaemptystatement.vala, vala/valaenum.vala, vala/valaenumvalue.vala, vala/valaexpressionstatement.vala, vala/valafield.vala, vala/valaflags.vala, vala/valaflagsvalue.vala, vala/valaforeachstatement.vala, vala/valaformalparameter.vala, vala/valaforstatement.vala, vala/valaifstatement.vala, vala/valainterface.vala, vala/valainterfacewriter.vala, vala/valalockstatement.vala, vala/valamember.vala, vala/valamemorymanager.vala, vala/valamethod.vala, vala/valanamespace.vala, vala/valaproperty.vala, vala/valapropertyaccessor.vala, vala/valareturnstatement.vala, vala/valascope.vala, vala/valasemanticanalyzer.vala, vala/valasignal.vala, vala/valasourcefile.vala, vala/valastatement.vala, vala/valastruct.vala, vala/valaswitchstatement.vala, vala/valasymbol.vala, vala/valasymbolbuilder.vala, vala/valasymbolresolver.vala, vala/valathrowstatement.vala, vala/valatrystatement.vala, vala/valatypeparameter.vala, vala/valatypereference.vala, vala/valavariabledeclarator.vala, vala/valawhilestatement.vala, gobject/valacodegenerator.vala, gobject/valacodegeneratorassignment.vala, gobject/valacodegeneratorclass.vala, gobject/valacodegeneratorinterface.vala, gobject/valacodegeneratorinvocationexpression.vala, gobject/valacodegeneratormemberaccess.vala, gobject/valacodegeneratormethod.vala, gobject/valacodegeneratorsignal.vala, gobject/valacodegeneratorstruct.vala, compiler/valacompiler.vala, vapi/atk.vala, vapi/gdk-2.0.vala, vapi/gio-standalone.vala, vapi/glib-2.0.vala, vapi/gstreamer-0.10.vala, vapi/gtk+-2.0.vala, vapi/packages/gstreamer-0.10/gstreamer-0.10-custom.vala, vapi/packages/gtk+-2.0/gtk+-2.0-custom.vala, vapi/pango.vala, vapi/vte.vala, vapigen/valagidlparser.vala, vapigen/valavapigen.vala: derive from Symbol class where appropriate and move symbol table into separate Scope class svn path=/trunk/; revision=366
Diffstat (limited to 'vapigen/valagidlparser.vala')
-rw-r--r--vapigen/valagidlparser.vala30
1 files changed, 27 insertions, 3 deletions
diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala
index ee9f362d5..536f225d5 100644
--- a/vapigen/valagidlparser.vala
+++ b/vapigen/valagidlparser.vala
@@ -29,6 +29,8 @@ using GLib;
public class Vala.GIdlParser : CodeVisitor {
private CodeContext context;
+ private SourceFile current_source_file;
+
private SourceReference current_source_reference;
private DataType current_data_type;
@@ -54,7 +56,9 @@ public class Vala.GIdlParser : CodeVisitor {
private void parse_file (SourceFile! source_file) {
string metadata_filename = "%s.metadata".printf (source_file.filename.ndup (source_file.filename.size () - ".gidl".size ()));
-
+
+ current_source_file = source_file;
+
codenode_attributes_map = new HashTable.full (str_hash, str_equal, g_free, g_free);
if (FileUtils.test (metadata_filename, FileTest.EXISTS)) {
@@ -83,7 +87,9 @@ public class Vala.GIdlParser : CodeVisitor {
foreach (IdlModule module in modules) {
var ns = parse_module (module);
- context.add_namespace (ns);
+ if (ns != null) {
+ context.root.add_namespace (ns);
+ }
}
} catch (MarkupError e) {
stdout.printf ("error parsing GIDL file: %s\n", e.message);
@@ -109,7 +115,14 @@ public class Vala.GIdlParser : CodeVisitor {
}
private Namespace parse_module (IdlModule! module) {
- var ns = new Namespace (module.name, current_source_reference);
+ Symbol sym = context.root.scope.lookup (module.name);
+ Namespace ns;
+ if (sym is Namespace) {
+ ns = (Namespace) sym;
+ ns.pkg = false;
+ } else {
+ ns = new Namespace (module.name, current_source_reference);
+ }
var attributes = get_attributes (ns.name);
if (attributes != null) {
@@ -133,6 +146,7 @@ public class Vala.GIdlParser : CodeVisitor {
}
cb.name = fix_type_name (cb.name, module);
ns.add_callback (cb);
+ current_source_file.add_node (cb);
} else if (node.type == IdlNodeTypeId.STRUCT) {
var st = parse_struct ((IdlNodeStruct) node);
if (st == null) {
@@ -140,36 +154,46 @@ public class Vala.GIdlParser : CodeVisitor {
}
st.name = fix_type_name (st.name, module);
ns.add_struct (st);
+ current_source_file.add_node (st);
} else if (node.type == IdlNodeTypeId.BOXED) {
var st = parse_boxed ((IdlNodeBoxed) node);
st.name = fix_type_name (st.name, module);
ns.add_struct (st);
st.set_type_id (st.get_upper_case_cname ("TYPE_"));
+ current_source_file.add_node (st);
} else if (node.type == IdlNodeTypeId.ENUM) {
var en = parse_enum ((IdlNodeEnum) node);
en.name = fix_type_name (en.name, module);
ns.add_enum (en);
+ current_source_file.add_node (en);
} else if (node.type == IdlNodeTypeId.OBJECT) {
var cl = parse_object ((IdlNodeInterface) node);
cl.name = fix_type_name (cl.name, module);
ns.add_class (cl);
+ current_source_file.add_node (cl);
} else if (node.type == IdlNodeTypeId.INTERFACE) {
var iface = parse_interface ((IdlNodeInterface) node);
iface.name = fix_type_name (iface.name, module);
ns.add_interface (iface);
+ current_source_file.add_node (iface);
} else if (node.type == IdlNodeTypeId.CONSTANT) {
var c = parse_constant ((IdlNodeConstant) node);
c.name = fix_const_name (c.name, module);
ns.add_constant (c);
+ current_source_file.add_node (c);
} else if (node.type == IdlNodeTypeId.FUNCTION) {
var m = parse_function ((IdlNodeFunction) node);
if (m != null) {
m.instance = false;
ns.add_method (m);
+ current_source_file.add_node (m);
}
}
}
+ if (sym is Namespace) {
+ return null;
+ }
return ns;
}