diff generator/parser/declarator_compiler.cpp @ 1:e78566595089

initial import
author mandel
date Mon, 11 May 2009 16:01:50 +0000
parents
children 09a0f1d048f2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/generator/parser/declarator_compiler.cpp	Mon May 11 16:01:50 2009 +0000
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Nokia. All rights reserved.
+** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
+**
+** This file is part of Qt Jambi.
+**
+** * Commercial Usage
+* Licensees holding valid Qt Commercial licenses may use this file in
+* accordance with the Qt Commercial License Agreement provided with the
+* Software or, alternatively, in accordance with the terms contained in
+* a written agreement between you and Nokia.
+*
+*
+* GNU General Public License Usage
+* Alternatively, this file may be used under the terms of the GNU
+* General Public License versions 2.0 or 3.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.fsf.org/licensing/licenses/info/GPLv2.html and
+* http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
+* exception, Nokia gives you certain additional rights. These rights
+* are described in the Nokia Qt GPL Exception version 1.2, included in
+* the file GPL_EXCEPTION.txt in this package.
+* 
+* Qt for Windows(R) Licensees
+* As a special exception, Nokia, as the sole copyright holder for Qt
+* Designer, grants users of the Qt/Eclipse Integration plug-in the
+* right for the Qt/Eclipse Integration to link to functionality
+* provided by Qt Designer and its related libraries.
+*
+*
+* If you are unsure which license is appropriate for your use, please
+* contact the sales department at qt-sales@nokia.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 "declarator_compiler.h"
+#include "name_compiler.h"
+#include "type_compiler.h"
+#include "compiler_utils.h"
+#include "lexer.h"
+#include "binder.h"
+#include "tokens.h"
+
+#include <qdebug.h>
+
+DeclaratorCompiler::DeclaratorCompiler(Binder *binder)
+  : _M_binder (binder), _M_token_stream (binder->tokenStream ())
+{
+}
+
+void DeclaratorCompiler::run(DeclaratorAST *node)
+{
+  _M_id.clear();
+  _M_parameters.clear();
+  _M_array.clear();
+  _M_function = false;
+  _M_reference = false;
+  _M_variadics = false;
+  _M_indirection = 0;
+
+  if (node)
+    {
+      NameCompiler name_cc(_M_binder);
+
+      DeclaratorAST *decl = node;
+      while (decl && decl->sub_declarator)
+        decl = decl->sub_declarator;
+
+      Q_ASSERT (decl != 0);
+
+      name_cc.run(decl->id);
+      _M_id = name_cc.name();
+      _M_function = (node->parameter_declaration_clause != 0);
+      if (node->parameter_declaration_clause && node->parameter_declaration_clause->ellipsis)
+        _M_variadics = true;
+
+      visitNodes(this, node->ptr_ops);
+      visit(node->parameter_declaration_clause);
+
+      if (const ListNode<ExpressionAST*> *it = node->array_dimensions)
+        {
+          it->toFront();
+          const ListNode<ExpressionAST*> *end = it;
+
+          do
+            {
+              QString elt;
+              if (ExpressionAST *expr = it->element)
+                {
+                  const Token &start_token = _M_token_stream->token((int) expr->start_token);
+                  const Token &end_token = _M_token_stream->token((int) expr->end_token);
+
+                  elt += QString::fromUtf8(&start_token.text[start_token.position],
+                                           (int) (end_token.position - start_token.position)).trimmed();
+                }
+
+              _M_array.append (elt);
+
+              it = it->next;
+            }
+          while (it != end);
+        }
+    }
+}
+
+void DeclaratorCompiler::visitPtrOperator(PtrOperatorAST *node)
+{
+  std::size_t op =  _M_token_stream->kind(node->op);
+
+  switch (op)
+    {
+      case '&':
+        _M_reference = true;
+        break;
+      case '*':
+        ++_M_indirection;
+        break;
+
+      default:
+        break;
+    }
+
+  if (node->mem_ptr)
+    {
+#if defined(__GNUC__)
+#warning "ptr to mem -- not implemented"
+#endif
+    }
+}
+
+void DeclaratorCompiler::visitParameterDeclaration(ParameterDeclarationAST *node)
+{
+  Parameter p;
+
+  TypeCompiler type_cc(_M_binder);
+  DeclaratorCompiler decl_cc(_M_binder);
+
+  decl_cc.run(node->declarator);
+
+  p.name = decl_cc.id();
+  p.type = CompilerUtils::typeDescription(node->type_specifier, node->declarator, _M_binder);
+  if (node->expression != 0)
+    {
+      const Token &start = _M_token_stream->token((int) node->expression->start_token);
+      const Token &end = _M_token_stream->token((int) node->expression->end_token);
+      int length = (int) (end.position - start.position);
+
+      p.defaultValueExpression = QString();
+      QString source = QString::fromUtf8(&start.text[start.position], length).trimmed();
+      QStringList list = source.split("\n");
+
+
+      for (int i=0; i<list.size(); ++i) {
+          if (!list.at(i).startsWith("#"))
+              p.defaultValueExpression += list.at(i).trimmed();
+      }
+
+      p.defaultValue = p.defaultValueExpression.size() > 0;
+
+    }
+
+  _M_parameters.append(p);
+}
+
+// kate: space-indent on; indent-width 2; replace-tabs on;