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-04-13 17:44:48 +00:00
const int curr_parser_version = 2 ;
2009-03-19 18:13:01 +00:00
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 ;
2012-10-21 16:10:34 +00:00
if ( elem . GetAttributeAsBoolean ( "hidden" ) )
2002-10-26 08:03:16 +00:00
continue ;
2012-10-21 16:10:34 +00:00
bool is_opaque = elem . GetAttributeAsBoolean ( "opaque" ) ;
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 ) ;
2011-04-21 23:04:47 +00:00
else if ( type = = "ownable" )
result = new OwnableGen ( 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 ) ;
2011-01-31 04:49:15 +00:00
} else if ( type = = "struct" ) {
result = new ByRefGen ( symbol . GetAttribute ( "cname" ) , symbol . GetAttribute ( "name" ) ) ;
2005-03-29 18:02:04 +00:00
} 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
}
}