From 9732e0c744e45a67094fc6ce08bdadb1f9a08d4a Mon Sep 17 00:00:00 2001 From: Hugo Lima Date: Mon, 17 Aug 2009 17:32:08 -0300 Subject: The genesis... --- asttoxml.cpp | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 asttoxml.cpp (limited to 'asttoxml.cpp') diff --git a/asttoxml.cpp b/asttoxml.cpp new file mode 100644 index 000000000..e884835c0 --- /dev/null +++ b/asttoxml.cpp @@ -0,0 +1,151 @@ +/* + * This file is part of the API Extractor project. + * + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + * + * Contact: PySide team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 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., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include "asttoxml.h" +#include "parser/control.h" +#include "parser/parser.h" +#include "parser/binder.h" + + +#include +#include +#include +#include + +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 namespaceMap = dom->namespaceMap(); + foreach (NamespaceModelItem item, namespaceMap.values()) + writeOutNamespace(s, item); + + QHash 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 namespaceMap = item->namespaceMap(); + foreach (NamespaceModelItem item, namespaceMap.values()) + writeOutNamespace(s, item); + + QHash typeMap = item->classMap(); + foreach (ClassModelItem item, typeMap.values()) + writeOutClass(s, item); + + QHash enumMap = item->enumMap(); + foreach (EnumModelItem item, enumMap.values()) + writeOutEnum(s, item); + + s.writeEndElement(); +} + +void writeOutEnum(QXmlStreamWriter &s, EnumModelItem &item) +{ + QString qualifiedName = item->qualifiedName().join("::"); + s.writeStartElement("enum"); + s.writeAttribute("name", qualifiedName); + + 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 qualifiedName = item->qualifiedName().join("::"); + s.writeStartElement("function"); + s.writeAttribute("name", qualifiedName); + + 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 qualifiedName = item->qualifiedName().join("::"); + s.writeStartElement("class"); + s.writeAttribute("name", qualifiedName); + + QHash enumMap = item->enumMap(); + foreach (EnumModelItem item, enumMap.values()) + writeOutEnum(s, item); + + QHash functionMap = item->functionMap(); + foreach (FunctionModelItem item, functionMap.values()) + writeOutFunction(s, item); + + QHash typeMap = item->classMap(); + foreach (ClassModelItem item, typeMap.values()) + writeOutClass(s, item); + + s.writeEndElement(); +} + -- cgit v1.2.3