asttoxml.cpp
171 lines
| 5.2 KiB
| text/x-c
|
CppLexer
/ generator / asttoxml.cpp
r0 | /**************************************************************************** | |||
** | ||||
** Copyright (C) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). | ||||
** All rights reserved. | ||||
** Contact: Nokia Corporation (qt-info@nokia.com) | ||||
** | ||||
** This file is part of the Qt Script Generator project on Qt Labs. | ||||
** | ||||
** $QT_BEGIN_LICENSE:LGPL$ | ||||
** No Commercial Usage | ||||
** This file contains pre-release code and may not be distributed. | ||||
** You may use this file in accordance with the terms and conditions | ||||
** contained in the Technology Preview License Agreement accompanying | ||||
** this package. | ||||
** | ||||
** GNU Lesser General Public License Usage | ||||
** Alternatively, this file may be used under the terms of the GNU Lesser | ||||
** General Public License version 2.1 as published by the Free Software | ||||
** Foundation and appearing in the file LICENSE.LGPL included in the | ||||
** packaging of this file. Please review the following information to | ||||
** ensure the GNU Lesser General Public License version 2.1 requirements | ||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | ||||
** | ||||
** In addition, as a special exception, Nokia gives you certain additional | ||||
** rights. These rights are described in the Nokia Qt LGPL Exception | ||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | ||||
** | ||||
** If you have questions regarding the use of this file, please contact | ||||
** Nokia at qt-info@nokia.com. | ||||
** | ||||
** | ||||
** | ||||
** | ||||
** | ||||
** | ||||
** | ||||
** | ||||
** $QT_END_LICENSE$ | ||||
** | ||||
****************************************************************************/ | ||||
#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 namespaceItem, namespaceMap.values()) { | ||||
writeOutNamespace(s, namespaceItem); | ||||
} | ||||
QHash<QString, ClassModelItem> typeMap = item->classMap(); | ||||
foreach (ClassModelItem classItem, typeMap.values()) { | ||||
writeOutClass(s, classItem); | ||||
} | ||||
QHash<QString, EnumModelItem> enumMap = item->enumMap(); | ||||
foreach (EnumModelItem enumItem, enumMap.values()) { | ||||
writeOutEnum(s, enumItem); | ||||
} | ||||
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 enumItem, enumMap.values()) { | ||||
writeOutEnum(s, enumItem); | ||||
} | ||||
QHash<QString, FunctionModelItem> functionMap = item->functionMap(); | ||||
foreach (FunctionModelItem funcItem, functionMap.values()) { | ||||
writeOutFunction(s, funcItem); | ||||
} | ||||
QHash<QString, ClassModelItem> typeMap = item->classMap(); | ||||
foreach (ClassModelItem classItem, typeMap.values()) { | ||||
writeOutClass(s, classItem); | ||||
} | ||||
s.writeEndElement(); | ||||
} | ||||