tools/qdoc3/qsakernelparser.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/qdoc3/qsakernelparser.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $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 <qfile.h>
+
+#include "qsakernelparser.h"
+#include "tokenizer.h"
+#include "tree.h"
+
+QT_BEGIN_NAMESPACE
+
+QsaKernelParser::QsaKernelParser( Tree *cppTree )
+    : cppTre( cppTree )
+{
+}
+
+QsaKernelParser::~QsaKernelParser()
+{
+}
+
+QString QsaKernelParser::language()
+{
+    return "QSA Kernel C++";
+}
+
+QString QsaKernelParser::sourceFileNameFilter()
+{
+    return "*.cpp";
+}
+
+void QsaKernelParser::parseSourceFile( const Location& location,
+				       const QString& filePath,
+				       Tree * /* tree */ )
+{
+    FILE *in = fopen( QFile::encodeName(filePath), "r" );
+    if ( in == 0 ) {
+        location.error( tr("Cannot open QSA kernel file '%1'").arg(filePath) );
+        return;
+    }
+
+    Location fileLocation( filePath );
+    Tokenizer fileTokenizer( fileLocation, in );
+    tokenizer = &fileTokenizer;
+    readToken();
+
+    QString ident;
+    QString className;
+    int delimDepth = 0;
+
+    while ( tok != Tok_Eoi ) {
+	if ( tok == Tok_Ident ) {
+	    ident = tokenizer->lexeme();
+	    readToken();
+	    if ( tok == Tok_Gulbrandsen && tokenizer->braceDepth() == 0 &&
+		 tokenizer->parenDepth() == 0 ) {
+		className = ident;
+	    } else if ( ident.startsWith("add") && ident.endsWith("Member") &&
+			tok == Tok_LeftParen ) {
+		bool isProperty = ident.endsWith( "VariableMember" );
+		bool isStatic = ident.startsWith( "addStatic" );
+		bool isWritable = !isStatic;
+
+		readToken();
+		if ( tok == Tok_String ) {
+		    QString member = tokenizer->lexeme();
+		    member = member.mid( 1, member.length() - 2 );
+
+		    readToken();
+		    if ( tok == Tok_Comma )
+			readToken();
+		    if ( tok == Tok_Ident && tokenizer->lexeme() == "QSMember" )
+			readToken();
+		    if ( tok == Tok_LeftParen ) {
+			delimDepth++;
+			readToken();
+		    }
+
+		    while ( tok != Tok_Eoi && tok != Tok_RightParen &&
+			    tok != Tok_Semicolon ) {
+			if ( tok == Tok_Ident ) {
+			    ident = tokenizer->lexeme();
+			    if ( ident == "Custom" ) {
+				isProperty = true;
+			    } else if ( ident == "AttributeNonWritable" ) {
+				isWritable = false;
+			    } else if ( ident == "AttributeStatic" ) {
+				isStatic = true;
+			    }
+			}
+			readToken();
+		    }
+
+		    ClassNode *classe =
+			    (ClassNode *) cppTre->findNode( QStringList(className),
+							    Node::Class );
+		    if ( classe == 0 ) {
+			classe = new ClassNode( cppTre->root(), className );
+			classe->setLocation( tokenizer->location() );
+		    }
+
+		    if ( isProperty ) {
+			PropertyNode *property = new PropertyNode(classe, member);
+			property->setLocation( tokenizer->location() );
+			property->setDataType( "Object" );
+#if 0
+			property->setGetter( member );
+			if ( isWritable ) {
+			    QString setter = member;
+			    setter[0] = setter[0].toUpper();
+			    setter.prepend( "set" );
+			    property->setSetter( setter );
+			}
+#endif
+		    } else {
+			FunctionNode *func = new FunctionNode( classe, member );
+			func->setLocation( tokenizer->location() );
+			func->setAccess( FunctionNode::Public );
+			func->setMetaness( FunctionNode::Slot );
+			if ( member == "toLocaleString" ||
+			     member == "toString" ) {
+			    func->setReturnType( "QString" );
+			} else if ( member == "valueOf" ) {
+			    func->setReturnType( "Object" );
+			} else {
+			    func->setReturnType( "Object" );
+			    func->addParameter( Parameter("...") );
+			}
+			func->setStatic( false ); // ###
+		    }
+		}
+	    }
+	} else {
+	    readToken();
+	}
+    }
+    fclose( in );
+}
+
+void QsaKernelParser::doneParsingSourceFiles( Tree * /* tree */ )
+{
+}
+
+void QsaKernelParser::readToken()
+{
+    tok = tokenizer->getToken();
+}
+
+QT_END_NAMESPACE