summaryrefslogtreecommitdiff
path: root/codemaker/source/cppumaker/dependencies.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'codemaker/source/cppumaker/dependencies.cxx')
-rw-r--r--codemaker/source/cppumaker/dependencies.cxx330
1 files changed, 330 insertions, 0 deletions
diff --git a/codemaker/source/cppumaker/dependencies.cxx b/codemaker/source/cppumaker/dependencies.cxx
new file mode 100644
index 000000000000..35a4ab37cd86
--- /dev/null
+++ b/codemaker/source/cppumaker/dependencies.cxx
@@ -0,0 +1,330 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include "sal/config.h"
+
+#include <cassert>
+#include <utility>
+#include <vector>
+
+#include "codemaker/typemanager.hxx"
+#include "codemaker/unotype.hxx"
+
+#include "osl/diagnose.h"
+#include "rtl/ref.hxx"
+#include "rtl/string.hxx"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+#include "unoidl/unoidl.hxx"
+
+#include "dependencies.hxx"
+
+namespace codemaker { namespace cppumaker {
+
+Dependencies::Dependencies(
+ rtl::Reference< TypeManager > const & manager, OUString const & name):
+ m_manager(manager), m_voidDependency(false), m_booleanDependency(false),
+ m_byteDependency(false), m_shortDependency(false),
+ m_unsignedShortDependency(false), m_longDependency(false),
+ m_unsignedLongDependency(false), m_hyperDependency(false),
+ m_unsignedHyperDependency(false), m_floatDependency(false),
+ m_doubleDependency(false), m_charDependency(false),
+ m_stringDependency(false), m_typeDependency(false), m_anyDependency(false),
+ m_sequenceDependency(false)
+{
+ assert(manager.is());
+ rtl::Reference< unoidl::Entity > ent;
+ switch (m_manager->getSort(name, &ent)) {
+ case UnoType::SORT_ENUM_TYPE:
+ break;
+ case UnoType::SORT_PLAIN_STRUCT_TYPE:
+ {
+ rtl::Reference< unoidl::PlainStructTypeEntity > ent2(
+ static_cast< unoidl::PlainStructTypeEntity * >(ent.get()));
+ if (!ent2->getDirectBase().isEmpty()) {
+ insert(ent2->getDirectBase());
+ }
+ for (std::vector< unoidl::PlainStructTypeEntity::Member >::
+ const_iterator i(ent2->getDirectMembers().begin());
+ i != ent2->getDirectMembers().end(); ++i)
+ {
+ insert(i->type);
+ }
+ break;
+ }
+ case UnoType::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
+ {
+ rtl::Reference< unoidl::PolymorphicStructTypeTemplateEntity > ent2(
+ static_cast< unoidl::PolymorphicStructTypeTemplateEntity * >(
+ ent.get()));
+ for (std::vector< unoidl::PolymorphicStructTypeTemplateEntity::
+ Member >::const_iterator i(ent2->getMembers().begin());
+ i != ent2->getMembers().end(); ++i)
+ {
+ if (!i->parameterized) {
+ insert(i->type);
+ }
+ }
+ break;
+ }
+ case UnoType::SORT_EXCEPTION_TYPE:
+ {
+ rtl::Reference< unoidl::ExceptionTypeEntity > ent2(
+ static_cast< unoidl::ExceptionTypeEntity * >(ent.get()));
+ if (!ent2->getDirectBase().isEmpty()) {
+ insert(ent2->getDirectBase());
+ }
+ for (std::vector< unoidl::ExceptionTypeEntity::Member >::
+ const_iterator i(ent2->getDirectMembers().begin());
+ i != ent2->getDirectMembers().end(); ++i)
+ {
+ insert(i->type);
+ }
+ break;
+ }
+ case UnoType::SORT_INTERFACE_TYPE:
+ {
+ rtl::Reference< unoidl::InterfaceTypeEntity > ent2(
+ static_cast< unoidl::InterfaceTypeEntity * >(ent.get()));
+ for (std::vector< OUString >::const_iterator i(
+ ent2->getDirectMandatoryBases().begin());
+ i != ent2->getDirectMandatoryBases().end(); ++i)
+ {
+ insert(*i, true);
+ }
+ if (!(ent2->getDirectAttributes().empty()
+ && ent2->getDirectMethods().empty()))
+ {
+ insert("com.sun.star.uno.RuntimeException");
+ }
+ for (std::vector< unoidl::InterfaceTypeEntity::Attribute >::
+ const_iterator i(ent2->getDirectAttributes().begin());
+ i != ent2->getDirectAttributes().end(); ++i)
+ {
+ insert(i->type);
+ for (std::vector< OUString >::const_iterator j(
+ i->getExceptions.begin());
+ j != i->getExceptions.end(); ++j)
+ {
+ insert(*j);
+ }
+ for (std::vector< OUString >::const_iterator j(
+ i->setExceptions.begin());
+ j != i->setExceptions.end(); ++j)
+ {
+ insert(*j);
+ }
+ }
+ for (std::vector< unoidl::InterfaceTypeEntity::Method >::
+ const_iterator i(ent2->getDirectMethods().begin());
+ i != ent2->getDirectMethods().end(); ++i)
+ {
+ insert(i->returnType);
+ for (std::vector<
+ unoidl::InterfaceTypeEntity::Method::Parameter >::
+ const_iterator j(i->parameters.begin());
+ j != i->parameters.end(); ++j)
+ {
+ insert(j->type);
+ }
+ for (std::vector< OUString >::const_iterator j(
+ i->exceptions.begin());
+ j != i->exceptions.end(); ++j)
+ {
+ insert(*j);
+ }
+ }
+ break;
+ }
+ case UnoType::SORT_TYPEDEF:
+ insert(static_cast< unoidl::TypedefEntity * >(ent.get())->getType());
+ break;
+ case UnoType::SORT_CONSTANT_GROUP:
+ {
+ rtl::Reference< unoidl::ConstantGroupEntity > ent2(
+ static_cast< unoidl::ConstantGroupEntity * >(ent.get()));
+ for (std::vector< unoidl::ConstantGroupEntity::Member >::
+ const_iterator i(ent2->getMembers().begin());
+ i != ent2->getMembers().end(); ++i)
+ {
+ switch (i->value.type) {
+ case unoidl::ConstantValue::TYPE_BOOLEAN:
+ m_booleanDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_BYTE:
+ m_byteDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_SHORT:
+ m_shortDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_UNSIGNED_SHORT:
+ m_unsignedShortDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_LONG:
+ m_longDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_UNSIGNED_LONG:
+ m_unsignedLongDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_HYPER:
+ m_hyperDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_UNSIGNED_HYPER:
+ m_unsignedHyperDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_FLOAT:
+ m_floatDependency = true;
+ break;
+ case unoidl::ConstantValue::TYPE_DOUBLE:
+ m_doubleDependency = true;
+ break;
+ }
+ }
+ break;
+ }
+ case UnoType::SORT_SINGLE_INTERFACE_BASED_SERVICE:
+ {
+ rtl::Reference< unoidl::SingleInterfaceBasedServiceEntity > ent2(
+ static_cast< unoidl::SingleInterfaceBasedServiceEntity * >(
+ ent.get()));
+ if (!ent2->getConstructors().empty()) {
+ insert(ent2->getBase());
+ }
+ for (std::vector<
+ unoidl::SingleInterfaceBasedServiceEntity::Constructor >::
+ const_iterator i(ent2->getConstructors().begin());
+ i != ent2->getConstructors().end(); ++i)
+ {
+ for (std::vector<
+ unoidl::SingleInterfaceBasedServiceEntity::
+ Constructor::Parameter >::const_iterator j(
+ i->parameters.begin());
+ j != i->parameters.end(); ++j)
+ {
+ insert(j->type);
+ if (j->rest) {
+ m_sequenceDependency = true;
+ }
+ }
+ for (std::vector< OUString >::const_iterator j(
+ i->exceptions.begin());
+ j != i->exceptions.end(); ++j)
+ {
+ insert(*j);
+ }
+ }
+ break;
+ }
+ case UnoType::SORT_INTERFACE_BASED_SINGLETON:
+ insert(
+ static_cast< unoidl::InterfaceBasedSingletonEntity * >(ent.get())->
+ getBase());
+ break;
+ default:
+ assert(false); // this cannot happen
+ }
+}
+
+Dependencies::~Dependencies() {}
+
+void Dependencies::insert(OUString const & name, bool base) {
+ sal_Int32 k;
+ std::vector< OString > args;
+ OUString n(b2u(UnoType::decompose(u2b(name), &k, &args)));
+ if (k != 0) {
+ m_sequenceDependency = true;
+ }
+ switch (m_manager->getSort(n)) {
+ case UnoType::SORT_VOID:
+ m_voidDependency = true;
+ break;
+ case UnoType::SORT_BOOLEAN:
+ m_booleanDependency = true;
+ break;
+ case UnoType::SORT_BYTE:
+ m_byteDependency = true;
+ break;
+ case UnoType::SORT_SHORT:
+ m_shortDependency = true;
+ break;
+ case UnoType::SORT_UNSIGNED_SHORT:
+ m_unsignedShortDependency = true;
+ break;
+ case UnoType::SORT_LONG:
+ m_longDependency = true;
+ break;
+ case UnoType::SORT_UNSIGNED_LONG:
+ m_unsignedLongDependency = true;
+ break;
+ case UnoType::SORT_HYPER:
+ m_hyperDependency = true;
+ break;
+ case UnoType::SORT_UNSIGNED_HYPER:
+ m_unsignedHyperDependency = true;
+ break;
+ case UnoType::SORT_FLOAT:
+ m_floatDependency = true;
+ break;
+ case UnoType::SORT_DOUBLE:
+ m_doubleDependency = true;
+ break;
+ case UnoType::SORT_CHAR:
+ m_charDependency = true;
+ break;
+ case UnoType::SORT_STRING:
+ m_stringDependency = true;
+ break;
+ case UnoType::SORT_TYPE:
+ m_typeDependency = true;
+ break;
+ case UnoType::SORT_ANY:
+ m_anyDependency = true;
+ break;
+ case UnoType::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE:
+ for (std::vector< OString >::iterator i(args.begin()); i != args.end();
+ ++i)
+ {
+ insert(b2u(*i), false);
+ }
+ // fall through
+ case UnoType::SORT_SEQUENCE_TYPE:
+ case UnoType::SORT_ENUM_TYPE:
+ case UnoType::SORT_PLAIN_STRUCT_TYPE:
+ case UnoType::SORT_EXCEPTION_TYPE:
+ case UnoType::SORT_INTERFACE_TYPE:
+ case UnoType::SORT_TYPEDEF:
+ {
+ std::pair< Map::iterator, bool > i(
+ m_map.insert(
+ Map::value_type(n, base ? KIND_BASE : KIND_NO_BASE)));
+ if (!i.second && base) {
+ i.first->second = KIND_BASE;
+ }
+ break;
+ }
+ default:
+ throw CannotDumpException(
+ "unexpected type \"" + name
+ + "\" in call to codemaker::cppumaker::Dependencies::Dependencies");
+ }
+}
+
+} }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */