2002-01-05 12:45:55 +00:00
// GtkSharp.Generation.Parser.cs - The XML Parsing engine.
2002-01-04 02:02:28 +00:00
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
2004-06-25 16:35:15 +00:00
// Copyright (c) 2001-2003 Mike Kestner
// Copyright (c) 2003 Ximian Inc.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.
2002-01-04 02:02:28 +00:00
2002-01-05 12:45:55 +00:00
namespace GtkSharp.Generation {
2002-01-04 02:02:28 +00:00
using System ;
using System.Collections ;
2003-02-26 02:16:38 +00:00
using System.IO ;
2002-01-04 02:02:28 +00:00
using System.Xml ;
public class Parser {
2009-03-19 18:13:01 +00:00
const int curr_parser_version = 1 ;
2003-10-03 22:11:47 +00:00
private XmlDocument Load ( string filename )
2004-11-15 13:56:34 +00:00
{
2003-10-03 22:11:47 +00:00
XmlDocument doc = new XmlDocument ( ) ;
2002-01-04 02:02:28 +00:00
try {
2003-02-26 02:16:38 +00:00
Stream stream = File . OpenRead ( filename ) ;
doc . Load ( stream ) ;
stream . Close ( ) ;
2002-01-04 02:02:28 +00:00
} catch ( XmlException e ) {
Console . WriteLine ( "Invalid XML file." ) ;
2003-10-03 22:11:47 +00:00
Console . WriteLine ( e ) ;
doc = null ;
2002-01-04 02:02:28 +00:00
}
2003-10-03 22:11:47 +00:00
return doc ;
2002-01-04 02:02:28 +00:00
}
2003-10-03 22:11:47 +00:00
public IGeneratable [ ] Parse ( string filename )
2002-01-05 12:45:55 +00:00
{
2003-10-03 22:11:47 +00:00
XmlDocument doc = Load ( filename ) ;
if ( doc = = null )
return null ;
2002-01-05 12:45:55 +00:00
XmlElement root = doc . DocumentElement ;
2002-01-04 02:02:28 +00:00
2002-01-05 12:45:55 +00:00
if ( ( root = = null ) | | ! root . HasChildNodes ) {
2003-10-03 22:11:47 +00:00
Console . WriteLine ( "No Namespaces found." ) ;
return null ;
2002-01-05 12:45:55 +00:00
}
2002-01-04 02:02:28 +00:00
2009-03-19 18:13:01 +00:00
int parser_version ;
if ( root . HasAttribute ( "parser_version" ) ) {
try {
parser_version = int . Parse ( root . GetAttribute ( "parser_version" ) ) ;
} catch {
Console . WriteLine ( "ERROR: Unable to parse parser_version attribute value \"{0}\" to a number. Input file {1} will be ignored" , root . GetAttribute ( "parser_version" ) , filename ) ;
return null ;
}
} else
parser_version = 1 ;
if ( parser_version > curr_parser_version )
Console . WriteLine ( "WARNING: The input file {0} was created by a parser that was released after this version of the generator. Consider updating the code generator if you experience problems." , filename ) ;
2003-10-03 22:11:47 +00:00
ArrayList gens = new ArrayList ( ) ;
foreach ( XmlNode child in root . ChildNodes ) {
XmlElement elem = child as XmlElement ;
2002-08-19 Rachel Hestilow <hestilow@ximian.com>
* art/Makefile.in (clean): Change to avoid bugging out on generated/CVS.
* glib/ObjectManager.cs: Added. Used to be auto-generated, but
now it can infer names, and relies on per-namespace ObjectManager
classes to inform it of oddly-named classes.
* generator/IGeneratable.cs, GenBase.cs: New "DoGenerate" property.
* generator/*Gen.cs: Honor DoGenerate.
* generator/CodeGenerator.cs: Support including dependency files
which will not be generated.
* generator/ObjectGen.cs: Generate mapping file per-namespace, as one
that calls back to the one in glib. Only generate if the name does
not follow the normal conventions, otherwise, GtkSharp.ObjectManager
can infer the name.
* generator/Parser.cs: Accept 'generate' flag to pass on to the
IGeneratables. Parse a new toplevel element, "symbol", which adds
a type to the SymbolTable (instead of hard-coding it).
* generator/SignalHandler.cs: Do not optimize signal handler creation,
instead creating them in their own namespaces. Do not generate
if the calling Signal told us not to.
* generator/Signal.cs: Do not generate handlers if container's DoGenerate
is false. Adjust to the marshaller name being in a sub-namespace.
* generator/SymbolTable.cs (AddSimpleType, AddManualType): Used
to add simple and manually wrapped types at runtime instead of
compile-time.
(FromNative): Remove hard-coded cases for manually wrapped types, use
a generic case instead.
* api: Added. Move api files and generation targets here.
* source: Added. Move source parsing here.
* generator/makefile: Move actual generation to api/.
* glib/Makefile.in: Remove generated/* target.
* glue/Makefile.am: Fix to include canvas-marshal. Move canvas stuff
to GNOME target.
* gnome/CanvasProxy.cs: Update to work with SignalHandlers being
namespace-specific.
* parser/Metadata.pm: Moved to GAPI/Metadata.pm, renamed, etc.
* parser/gapi2xml.pl: Use GAPI::Metadata.
* parser/makefile: Install scripts, remove source parse build target.
Rename formatXML to gapi_format_xml.
svn path=/trunk/gtk-sharp/; revision=6818
2002-08-20 19:56:18 +00:00
if ( elem = = null )
2002-01-05 12:45:55 +00:00
continue ;
2002-01-04 02:02:28 +00:00
2003-10-03 22:11:47 +00:00
switch ( child . Name ) {
case "namespace" :
gens . AddRange ( ParseNamespace ( elem ) ) ;
break ;
case "symbol" :
gens . Add ( ParseSymbol ( elem ) ) ;
break ;
default :
Console . WriteLine ( "Parser::Parse - Unexpected child node: " + child . Name ) ;
break ;
}
2002-01-04 02:02:28 +00:00
}
2003-10-03 22:11:47 +00:00
return ( IGeneratable [ ] ) gens . ToArray ( typeof ( IGeneratable ) ) ;
2002-01-04 02:02:28 +00:00
}
2003-10-03 22:11:47 +00:00
private ArrayList ParseNamespace ( XmlElement ns )
2002-01-04 02:02:28 +00:00
{
2003-10-03 22:11:47 +00:00
ArrayList result = new ArrayList ( ) ;
2002-01-04 02:02:28 +00:00
foreach ( XmlNode def in ns . ChildNodes ) {
2003-10-03 22:11:47 +00:00
XmlElement elem = def as XmlElement ;
if ( elem = = null )
2002-01-04 02:02:28 +00:00
continue ;
2002-10-26 08:03:16 +00:00
if ( elem . HasAttribute ( "hidden" ) )
continue ;
2003-10-03 22:11:47 +00:00
bool is_opaque = false ;
* parser/gapi2xml.pl (addFuncElems): if a struct or boxed type has
a constructor or a ref, unref, or destroy method, then it must be
a reference type, so mark it "opaque" but then also mark all of
its fields public and writable.
* */*-api*.raw: Regen
* generator/Parser.cs (ParseNamespace): make the opaque attribute
check actually look at the value of the attribute rather than just
checking if it's there, so that you can change a struct's opaque
attribute from "true" to "false" via metadata and have that work.
* generator/BoxedGen.cs (Generate): do not generate the boxed's
"Free" method (since it's guaranteed to crash when we pass it a
stack pointer). If "Copy" is marked deprecated, create a
deprecated no-op for it, otherwise just skip it (since otherwise
it will just leak memory when we copy its result onto the stack).
* pango/Pango.metadata: deprecate Pango.Color.Copy and
Pango.Matrix.Copy. Hide some array fields in Pango.GlyphString
that we've never generated correctly. Tweak Pango.LayoutLine
fields to be the same as they used to be.
* pango/GlyphItem.custom (glyphs, item):
* pango/GlyphString.custom (Zero, New):
* pango/Item.custom (Zero, New):
* pango/LayoutRun.custom (glyphs, item): add deprecated API compat
* gdk/Gdk.metadata: undo the parser's new opaquification of
Gdk.Font; it's been deprecated since pre-gtk# times, and no one
should be using it, so there's no point in fixing it now. Fix up a
few other things to match how they used to be. Fix RgbCmap's
constructor args.
* gdk/RgbCmap.custom (Zero, New): deprecated API compat
* gdk/PangoAttrEmbossed.custom:
* gdk/PangoAttrStipple.custom (Zero, New, Attr): deprecated API
compat
(explicit operator ...): allow casting back and forth between
Pango.Attribute. (We can't usefully make them real subclasses of
Pango.Attribute, because there's no way for
Pango.Attribute.GetAttribute() to be able to dtrt with them.)
* gtk/Gtk.metadata: deprecate Gtk.Requisition.Copy,
Gtk.TextIter.Copy, and Gtk.TreeIter.Copy. Mark the return value of
TextView.DefaultAttributes as "owned". Mark TargetList's fields
private so it stays how it used to be.
* gtk/TextAttributes.custom (Zero, New): deprecated API compat
* gnomevfs/Gnomevfs.metadata: remove a bunch of opaque
declarations that the parser figures out on its own now.
* art/Art.metadata:
* glade/Glade.metadata:
* rsvg/Rsvg.metadata: un-mark everything the parser marked opaque
in these libraries, because all of the structs in question would
still be unusably broken, so the API churn would be pointless.
svn path=/trunk/gtk-sharp/; revision=48387
2005-08-15 15:15:57 +00:00
if ( elem . GetAttribute ( "opaque" ) = = "true" | |
elem . GetAttribute ( "opaque" ) = = "1" )
2003-10-03 22:11:47 +00:00
is_opaque = true ;
2002-01-04 02:02:28 +00:00
2003-10-03 22:11:47 +00:00
switch ( def . Name ) {
2002-01-04 02:02:28 +00:00
case "alias" :
2002-05-26 16:23:40 +00:00
string aname = elem . GetAttribute ( "cname" ) ;
string atype = elem . GetAttribute ( "type" ) ;
if ( ( aname = = "" ) | | ( atype = = "" ) )
continue ;
2003-10-03 22:11:47 +00:00
result . Add ( new AliasGen ( aname , atype ) ) ;
2002-01-04 02:02:28 +00:00
break ;
2002-01-17 00:26:46 +00:00
case "boxed" :
2003-10-03 22:11:47 +00:00
result . Add ( is_opaque ? new OpaqueGen ( ns , elem ) as object : new BoxedGen ( ns , elem ) as object ) ;
2002-01-17 00:26:46 +00:00
break ;
2002-01-04 02:02:28 +00:00
case "callback" :
2003-10-03 22:11:47 +00:00
result . Add ( new CallbackGen ( ns , elem ) ) ;
2002-01-04 02:02:28 +00:00
break ;
case "enum" :
2003-10-03 22:11:47 +00:00
result . Add ( new EnumGen ( ns , elem ) ) ;
2002-01-04 02:02:28 +00:00
break ;
2002-01-07 23:30:01 +00:00
case "interface" :
2003-10-03 22:11:47 +00:00
result . Add ( new InterfaceGen ( ns , elem ) ) ;
2002-01-07 23:30:01 +00:00
break ;
2002-01-04 02:02:28 +00:00
case "object" :
2003-10-03 22:11:47 +00:00
result . Add ( new ObjectGen ( ns , elem ) ) ;
2002-01-04 02:02:28 +00:00
break ;
2003-07-11 02:00:13 +00:00
case "class" :
2003-10-03 22:11:47 +00:00
result . Add ( new ClassGen ( ns , elem ) ) ;
2003-07-11 02:00:13 +00:00
break ;
2002-01-04 02:02:28 +00:00
case "struct" :
2003-10-03 22:11:47 +00:00
result . Add ( is_opaque ? new OpaqueGen ( ns , elem ) as object : new StructGen ( ns , elem ) as object ) ;
2002-01-04 02:02:28 +00:00
break ;
default :
2003-10-03 22:11:47 +00:00
Console . WriteLine ( "Parser::ParseNamespace - Unexpected node: " + def . Name ) ;
2002-01-04 02:02:28 +00:00
break ;
}
}
2003-07-11 02:00:13 +00:00
2003-10-03 22:11:47 +00:00
return result ;
2002-01-04 02:02:28 +00:00
}
2002-08-19 Rachel Hestilow <hestilow@ximian.com>
* art/Makefile.in (clean): Change to avoid bugging out on generated/CVS.
* glib/ObjectManager.cs: Added. Used to be auto-generated, but
now it can infer names, and relies on per-namespace ObjectManager
classes to inform it of oddly-named classes.
* generator/IGeneratable.cs, GenBase.cs: New "DoGenerate" property.
* generator/*Gen.cs: Honor DoGenerate.
* generator/CodeGenerator.cs: Support including dependency files
which will not be generated.
* generator/ObjectGen.cs: Generate mapping file per-namespace, as one
that calls back to the one in glib. Only generate if the name does
not follow the normal conventions, otherwise, GtkSharp.ObjectManager
can infer the name.
* generator/Parser.cs: Accept 'generate' flag to pass on to the
IGeneratables. Parse a new toplevel element, "symbol", which adds
a type to the SymbolTable (instead of hard-coding it).
* generator/SignalHandler.cs: Do not optimize signal handler creation,
instead creating them in their own namespaces. Do not generate
if the calling Signal told us not to.
* generator/Signal.cs: Do not generate handlers if container's DoGenerate
is false. Adjust to the marshaller name being in a sub-namespace.
* generator/SymbolTable.cs (AddSimpleType, AddManualType): Used
to add simple and manually wrapped types at runtime instead of
compile-time.
(FromNative): Remove hard-coded cases for manually wrapped types, use
a generic case instead.
* api: Added. Move api files and generation targets here.
* source: Added. Move source parsing here.
* generator/makefile: Move actual generation to api/.
* glib/Makefile.in: Remove generated/* target.
* glue/Makefile.am: Fix to include canvas-marshal. Move canvas stuff
to GNOME target.
* gnome/CanvasProxy.cs: Update to work with SignalHandlers being
namespace-specific.
* parser/Metadata.pm: Moved to GAPI/Metadata.pm, renamed, etc.
* parser/gapi2xml.pl: Use GAPI::Metadata.
* parser/makefile: Install scripts, remove source parse build target.
Rename formatXML to gapi_format_xml.
svn path=/trunk/gtk-sharp/; revision=6818
2002-08-20 19:56:18 +00:00
2003-10-03 22:11:47 +00:00
private IGeneratable ParseSymbol ( XmlElement symbol )
2002-08-19 Rachel Hestilow <hestilow@ximian.com>
* art/Makefile.in (clean): Change to avoid bugging out on generated/CVS.
* glib/ObjectManager.cs: Added. Used to be auto-generated, but
now it can infer names, and relies on per-namespace ObjectManager
classes to inform it of oddly-named classes.
* generator/IGeneratable.cs, GenBase.cs: New "DoGenerate" property.
* generator/*Gen.cs: Honor DoGenerate.
* generator/CodeGenerator.cs: Support including dependency files
which will not be generated.
* generator/ObjectGen.cs: Generate mapping file per-namespace, as one
that calls back to the one in glib. Only generate if the name does
not follow the normal conventions, otherwise, GtkSharp.ObjectManager
can infer the name.
* generator/Parser.cs: Accept 'generate' flag to pass on to the
IGeneratables. Parse a new toplevel element, "symbol", which adds
a type to the SymbolTable (instead of hard-coding it).
* generator/SignalHandler.cs: Do not optimize signal handler creation,
instead creating them in their own namespaces. Do not generate
if the calling Signal told us not to.
* generator/Signal.cs: Do not generate handlers if container's DoGenerate
is false. Adjust to the marshaller name being in a sub-namespace.
* generator/SymbolTable.cs (AddSimpleType, AddManualType): Used
to add simple and manually wrapped types at runtime instead of
compile-time.
(FromNative): Remove hard-coded cases for manually wrapped types, use
a generic case instead.
* api: Added. Move api files and generation targets here.
* source: Added. Move source parsing here.
* generator/makefile: Move actual generation to api/.
* glib/Makefile.in: Remove generated/* target.
* glue/Makefile.am: Fix to include canvas-marshal. Move canvas stuff
to GNOME target.
* gnome/CanvasProxy.cs: Update to work with SignalHandlers being
namespace-specific.
* parser/Metadata.pm: Moved to GAPI/Metadata.pm, renamed, etc.
* parser/gapi2xml.pl: Use GAPI::Metadata.
* parser/makefile: Install scripts, remove source parse build target.
Rename formatXML to gapi_format_xml.
svn path=/trunk/gtk-sharp/; revision=6818
2002-08-20 19:56:18 +00:00
{
string type = symbol . GetAttribute ( "type" ) ;
string cname = symbol . GetAttribute ( "cname" ) ;
string name = symbol . GetAttribute ( "name" ) ;
2003-10-03 22:11:47 +00:00
IGeneratable result = null ;
2002-08-19 Rachel Hestilow <hestilow@ximian.com>
* art/Makefile.in (clean): Change to avoid bugging out on generated/CVS.
* glib/ObjectManager.cs: Added. Used to be auto-generated, but
now it can infer names, and relies on per-namespace ObjectManager
classes to inform it of oddly-named classes.
* generator/IGeneratable.cs, GenBase.cs: New "DoGenerate" property.
* generator/*Gen.cs: Honor DoGenerate.
* generator/CodeGenerator.cs: Support including dependency files
which will not be generated.
* generator/ObjectGen.cs: Generate mapping file per-namespace, as one
that calls back to the one in glib. Only generate if the name does
not follow the normal conventions, otherwise, GtkSharp.ObjectManager
can infer the name.
* generator/Parser.cs: Accept 'generate' flag to pass on to the
IGeneratables. Parse a new toplevel element, "symbol", which adds
a type to the SymbolTable (instead of hard-coding it).
* generator/SignalHandler.cs: Do not optimize signal handler creation,
instead creating them in their own namespaces. Do not generate
if the calling Signal told us not to.
* generator/Signal.cs: Do not generate handlers if container's DoGenerate
is false. Adjust to the marshaller name being in a sub-namespace.
* generator/SymbolTable.cs (AddSimpleType, AddManualType): Used
to add simple and manually wrapped types at runtime instead of
compile-time.
(FromNative): Remove hard-coded cases for manually wrapped types, use
a generic case instead.
* api: Added. Move api files and generation targets here.
* source: Added. Move source parsing here.
* generator/makefile: Move actual generation to api/.
* glib/Makefile.in: Remove generated/* target.
* glue/Makefile.am: Fix to include canvas-marshal. Move canvas stuff
to GNOME target.
* gnome/CanvasProxy.cs: Update to work with SignalHandlers being
namespace-specific.
* parser/Metadata.pm: Moved to GAPI/Metadata.pm, renamed, etc.
* parser/gapi2xml.pl: Use GAPI::Metadata.
* parser/makefile: Install scripts, remove source parse build target.
Rename formatXML to gapi_format_xml.
svn path=/trunk/gtk-sharp/; revision=6818
2002-08-20 19:56:18 +00:00
2007-09-21 16:37:04 +00:00
if ( type = = "simple" ) {
if ( symbol . HasAttribute ( "default_value" ) )
result = new SimpleGen ( cname , name , symbol . GetAttribute ( "default_value" ) ) ;
else {
Console . WriteLine ( "Simple type element " + cname + " has no specified default value" ) ;
result = new SimpleGen ( cname , name , String . Empty ) ;
}
} else if ( type = = "manual" )
2003-10-03 22:11:47 +00:00
result = new ManualGen ( cname , name ) ;
2004-03-12 21:18:11 +00:00
else if ( type = = "alias" )
result = new AliasGen ( cname , name ) ;
2005-03-29 18:02:04 +00:00
else if ( type = = "marshal" ) {
string mtype = symbol . GetAttribute ( "marshal_type" ) ;
string call = symbol . GetAttribute ( "call_fmt" ) ;
string from = symbol . GetAttribute ( "from_fmt" ) ;
result = new MarshalGen ( cname , name , mtype , call , from ) ;
} else
2003-10-03 22:11:47 +00:00
Console . WriteLine ( "Parser::ParseSymbol - Unexpected symbol type " + type ) ;
return result ;
2002-08-19 Rachel Hestilow <hestilow@ximian.com>
* art/Makefile.in (clean): Change to avoid bugging out on generated/CVS.
* glib/ObjectManager.cs: Added. Used to be auto-generated, but
now it can infer names, and relies on per-namespace ObjectManager
classes to inform it of oddly-named classes.
* generator/IGeneratable.cs, GenBase.cs: New "DoGenerate" property.
* generator/*Gen.cs: Honor DoGenerate.
* generator/CodeGenerator.cs: Support including dependency files
which will not be generated.
* generator/ObjectGen.cs: Generate mapping file per-namespace, as one
that calls back to the one in glib. Only generate if the name does
not follow the normal conventions, otherwise, GtkSharp.ObjectManager
can infer the name.
* generator/Parser.cs: Accept 'generate' flag to pass on to the
IGeneratables. Parse a new toplevel element, "symbol", which adds
a type to the SymbolTable (instead of hard-coding it).
* generator/SignalHandler.cs: Do not optimize signal handler creation,
instead creating them in their own namespaces. Do not generate
if the calling Signal told us not to.
* generator/Signal.cs: Do not generate handlers if container's DoGenerate
is false. Adjust to the marshaller name being in a sub-namespace.
* generator/SymbolTable.cs (AddSimpleType, AddManualType): Used
to add simple and manually wrapped types at runtime instead of
compile-time.
(FromNative): Remove hard-coded cases for manually wrapped types, use
a generic case instead.
* api: Added. Move api files and generation targets here.
* source: Added. Move source parsing here.
* generator/makefile: Move actual generation to api/.
* glib/Makefile.in: Remove generated/* target.
* glue/Makefile.am: Fix to include canvas-marshal. Move canvas stuff
to GNOME target.
* gnome/CanvasProxy.cs: Update to work with SignalHandlers being
namespace-specific.
* parser/Metadata.pm: Moved to GAPI/Metadata.pm, renamed, etc.
* parser/gapi2xml.pl: Use GAPI::Metadata.
* parser/makefile: Install scripts, remove source parse build target.
Rename formatXML to gapi_format_xml.
svn path=/trunk/gtk-sharp/; revision=6818
2002-08-20 19:56:18 +00:00
}
2002-01-04 02:02:28 +00:00
}
}