summaryrefslogtreecommitdiffstats
path: root/generator/asttoxml.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'generator/asttoxml.cpp')
-rw-r--r--generator/asttoxml.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/generator/asttoxml.cpp b/generator/asttoxml.cpp
new file mode 100644
index 0000000..f972b81
--- /dev/null
+++ b/generator/asttoxml.cpp
@@ -0,0 +1,153 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the Qt Script Generator project on Trolltech Labs.
+**
+** This file may be used under the terms of the GNU General Public
+** License version 2.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of
+** this file. Please review the following information to ensure GNU
+** General Public Licensing requirements will be met:
+** http://www.trolltech.com/products/qt/opensource.html
+**
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://www.trolltech.com/products/qt/licensing.html or contact the
+** sales department at sales@trolltech.com.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+****************************************************************************/
+
+#include "asttoxml.h"
+#include "control.h"
+#include "parser.h"
+#include "binder.h"
+
+
+#include <QXmlStreamWriter>
+#include <QTextStream>
+#include <QTextCodec>
+#include <QFile>
+
+void astToXML(QString name) {
+ QFile file(name);
+
+ if (!file.open(QFile::ReadOnly))
+ return;
+
+ QTextStream stream(&file);
+ stream.setCodec(QTextCodec::codecForName("UTF-8"));
+ QByteArray contents = stream.readAll().toUtf8();
+ file.close();
+
+ Control control;
+ Parser p(&control);
+ pool __pool;
+
+ TranslationUnitAST *ast = p.parse(contents, contents.size(), &__pool);
+
+ CodeModel model;
+ Binder binder(&model, p.location());
+ FileModelItem dom = binder.run(ast);
+
+ QFile outputFile;
+ if (!outputFile.open(stdout, QIODevice::WriteOnly))
+ {
+ return;
+ }
+
+ QXmlStreamWriter s( &outputFile);
+ s.setAutoFormatting( true );
+
+ s.writeStartElement("code");
+
+ QHash<QString, NamespaceModelItem> namespaceMap = dom->namespaceMap();
+ foreach (NamespaceModelItem item, namespaceMap.values()) {
+ writeOutNamespace(s, item);
+ }
+
+ QHash<QString, ClassModelItem> typeMap = dom->classMap();
+ foreach (ClassModelItem item, typeMap.values()) {
+ writeOutClass(s, item);
+ }
+ s.writeEndElement();
+}
+
+
+void writeOutNamespace(QXmlStreamWriter &s, NamespaceModelItem &item) {
+ s.writeStartElement("namespace");
+ s.writeAttribute("name", item->name());
+
+ QHash<QString, NamespaceModelItem> namespaceMap = item->namespaceMap();
+ foreach (NamespaceModelItem item, namespaceMap.values()) {
+ writeOutNamespace(s, item);
+ }
+
+ QHash<QString, ClassModelItem> typeMap = item->classMap();
+ foreach (ClassModelItem item, typeMap.values()) {
+ writeOutClass(s, item);
+ }
+
+ QHash<QString, EnumModelItem> enumMap = item->enumMap();
+ foreach (EnumModelItem item, enumMap.values()) {
+ writeOutEnum(s, item);
+ }
+
+ s.writeEndElement();
+}
+
+void writeOutEnum(QXmlStreamWriter &s, EnumModelItem &item) {
+ QString qualified_name = item->qualifiedName().join("::");
+ s.writeStartElement("enum");
+ s.writeAttribute("name", qualified_name);
+
+ EnumeratorList enumList = item->enumerators();
+ for(int i=0; i < enumList.size() ; i++) {
+ s.writeStartElement("enumerator");
+ if( !enumList[i]->value().isEmpty() )
+ s.writeAttribute("value", enumList[i]->value());
+ s.writeCharacters(enumList[i]->name());
+
+ s.writeEndElement();
+ }
+ s.writeEndElement();
+}
+
+void writeOutFunction(QXmlStreamWriter &s, FunctionModelItem &item) {
+ QString qualified_name = item->qualifiedName().join("::");
+ s.writeStartElement("function");
+ s.writeAttribute("name", qualified_name);
+
+ ArgumentList arguments = item->arguments();
+ for(int i=0; i < arguments.size() ; i++) {
+ s.writeStartElement("argument");
+ s.writeAttribute("type", arguments[i]->type().qualifiedName().join("::"));
+ s.writeEndElement();
+ }
+ s.writeEndElement();
+}
+
+void writeOutClass(QXmlStreamWriter &s, ClassModelItem &item) {
+ QString qualified_name = item->qualifiedName().join("::");
+ s.writeStartElement("class");
+ s.writeAttribute("name", qualified_name);
+
+ QHash<QString, EnumModelItem> enumMap = item->enumMap();
+ foreach (EnumModelItem item, enumMap.values()) {
+ writeOutEnum(s, item);
+ }
+
+ QHash<QString, FunctionModelItem> functionMap = item->functionMap();
+ foreach (FunctionModelItem item, functionMap.values()) {
+ writeOutFunction(s, item);
+ }
+
+ QHash<QString, ClassModelItem> typeMap = item->classMap();
+ foreach (ClassModelItem item, typeMap.values()) {
+ writeOutClass(s, item);
+ }
+ s.writeEndElement();
+}