aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus/Control.cpp
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@nokia.com>2011-05-16 10:53:42 +0200
committerOswald Buddenhagen <oswald.buddenhagen@nokia.com>2011-05-16 11:05:30 +0200
commit67704b8b41b053eddbd4119a04115fb0fb2c9237 (patch)
tree094fb9bc849f2467d6389267d5613574a48f478f /src/libs/3rdparty/cplusplus/Control.cpp
parent5a39fba5805d34fbef16a50d20312b8a9de5bdfc (diff)
move src/shared/cplusplus/ -> src/libs/3rdparty/cplusplus/
Approved-by: legal
Diffstat (limited to 'src/libs/3rdparty/cplusplus/Control.cpp')
-rw-r--r--src/libs/3rdparty/cplusplus/Control.cpp832
1 files changed, 832 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Control.cpp b/src/libs/3rdparty/cplusplus/Control.cpp
new file mode 100644
index 0000000000..3492077a94
--- /dev/null
+++ b/src/libs/3rdparty/cplusplus/Control.cpp
@@ -0,0 +1,832 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (info@qt.nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** 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.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at info@qt.nokia.com.
+**
+**************************************************************************/
+// Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#include "Control.h"
+#include "Literals.h"
+#include "LiteralTable.h"
+#include "TranslationUnit.h"
+#include "CoreTypes.h"
+#include "Symbols.h"
+#include "Names.h"
+#include "TypeMatcher.h"
+#include <map>
+#include <set>
+#include <algorithm>
+
+using namespace CPlusPlus;
+
+namespace {
+
+template <typename _Tp>
+struct Compare;
+
+template <> struct Compare<IntegerType>
+{
+ bool operator()(const IntegerType &ty, const IntegerType &otherTy) const
+ { return ty.kind() < otherTy.kind(); }
+};
+
+template <> struct Compare<FloatType>
+{
+ bool operator()(const FloatType &ty, const FloatType &otherTy) const
+ { return ty.kind() < otherTy.kind(); }
+};
+
+template <> struct Compare<PointerToMemberType>
+{
+ bool operator()(const PointerToMemberType &ty, const PointerToMemberType &otherTy) const
+ {
+ if (ty.memberName() < otherTy.memberName())
+ return true;
+
+ else if (ty.memberName() == otherTy.memberName())
+ return ty.elementType() < otherTy.elementType();
+
+ return false;
+ }
+};
+
+template <> struct Compare<PointerType>
+{
+ bool operator()(const PointerType &ty, const PointerType &otherTy) const
+ {
+ return ty.elementType() < otherTy.elementType();
+ }
+};
+
+template <> struct Compare<ReferenceType>
+{
+ bool operator()(const ReferenceType &ty, const ReferenceType &otherTy) const
+ {
+ return ty.elementType() < otherTy.elementType();
+ }
+};
+
+template <> struct Compare<NamedType>
+{
+ bool operator()(const NamedType &ty, const NamedType &otherTy) const
+ {
+ return ty.name() < otherTy.name();
+ }
+};
+
+template <> struct Compare<ArrayType>
+{
+ bool operator()(const ArrayType &ty, const ArrayType &otherTy) const
+ {
+ if (ty.size() < otherTy.size())
+ return true;
+
+ else if (ty.size() == otherTy.size())
+ return ty.elementType() < otherTy.elementType();
+
+ return false;
+ }
+};
+
+template <> struct Compare<DestructorNameId>
+{
+ bool operator()(const DestructorNameId &name, const DestructorNameId &otherName) const
+ {
+ return name.identifier() < otherName.identifier();
+ }
+};
+
+template <> struct Compare<OperatorNameId>
+{
+ bool operator()(const OperatorNameId &name, const OperatorNameId &otherName) const
+ {
+ return name.kind() < otherName.kind();
+ }
+};
+
+template <> struct Compare<ConversionNameId>
+{
+ bool operator()(const ConversionNameId &name, const ConversionNameId &otherName) const
+ {
+ return name.type() < otherName.type();
+ }
+};
+template <> struct Compare<TemplateNameId>
+{
+ bool operator()(const TemplateNameId &name, const TemplateNameId &otherName) const
+ {
+ const Identifier *id = name.identifier();
+ const Identifier *otherId = otherName.identifier();
+
+ if (id == otherId)
+ return std::lexicographical_compare(name.firstTemplateArgument(), name.lastTemplateArgument(),
+ otherName.firstTemplateArgument(), otherName.lastTemplateArgument());
+
+ return id < otherId;
+ }
+};
+template <> struct Compare<QualifiedNameId>
+{
+ bool operator()(const QualifiedNameId &name, const QualifiedNameId &otherName) const
+ {
+ if (name.base() == otherName.base())
+ return name.name() < otherName.name();
+
+ return name.base() < otherName.base();
+ }
+};
+
+template <> struct Compare<SelectorNameId>
+{
+ bool operator()(const SelectorNameId &name, const SelectorNameId &otherName) const
+ {
+ if (name.hasArguments() == otherName.hasArguments())
+ return std::lexicographical_compare(name.firstName(), name.lastName(),
+ otherName.firstName(), otherName.lastName());
+
+ return name.hasArguments() < otherName.hasArguments();
+ }
+};
+
+
+template <typename _Tp>
+class Table: public std::set<_Tp, Compare<_Tp> >
+{
+ typedef std::set<_Tp, Compare<_Tp> > _Base;
+public:
+ _Tp *intern(const _Tp &element)
+ { return const_cast<_Tp *>(&*_Base::insert(element).first); }
+};
+
+} // end of anonymous namespace
+
+#ifdef Q_OS_SYMBIAN
+//Symbian compiler has some difficulties to understand the templates.
+static void delete_array_entries(std::vector<Symbol *> vt)
+{
+ std::vector<Symbol *>::iterator it;
+ for (it = vt.begin(); it != vt.end(); ++it) {
+ delete *it;
+ }
+}
+#else
+template <typename _Iterator>
+static void delete_array_entries(_Iterator first, _Iterator last)
+{
+ for (; first != last; ++first)
+ delete *first;
+}
+
+template <typename _Array>
+static void delete_array_entries(const _Array &a)
+{ delete_array_entries(a.begin(), a.end()); }
+#endif
+
+class Control::Data
+{
+public:
+ Data(Control *control)
+ : control(control)
+ , translationUnit(0)
+ , diagnosticClient(0)
+ , deprecatedId(0)
+ , unavailableId(0)
+ , objcGetterId(0)
+ , objcSetterId(0)
+ , objcReadwriteId(0)
+ , objcReadonlyId(0)
+ , objcAssignId(0)
+ , objcRetainId(0)
+ , objcCopyId(0)
+ , objcNonatomicId(0)
+ , processor(0)
+ {}
+
+ ~Data()
+ {
+ // symbols
+ delete_array_entries(symbols);
+ }
+
+ template <typename _Iterator>
+ const TemplateNameId *findOrInsertTemplateNameId(const Identifier *id, _Iterator first, _Iterator last)
+ {
+ return templateNameIds.intern(TemplateNameId(id, first, last));
+ }
+
+ const DestructorNameId *findOrInsertDestructorNameId(const Identifier *id)
+ {
+ return destructorNameIds.intern(DestructorNameId(id));
+ }
+
+ const OperatorNameId *findOrInsertOperatorNameId(OperatorNameId::Kind kind)
+ {
+ return operatorNameIds.intern(OperatorNameId(kind));
+ }
+
+ const ConversionNameId *findOrInsertConversionNameId(const FullySpecifiedType &type)
+ {
+ return conversionNameIds.intern(ConversionNameId(type));
+ }
+
+ const QualifiedNameId *findOrInsertQualifiedNameId(const Name *base, const Name *name)
+ {
+ return qualifiedNameIds.intern(QualifiedNameId(base, name));
+ }
+
+ template <typename _Iterator>
+ const SelectorNameId *findOrInsertSelectorNameId(_Iterator first, _Iterator last, bool hasArguments)
+ {
+ return selectorNameIds.intern(SelectorNameId(first, last, hasArguments));
+ }
+
+ IntegerType *findOrInsertIntegerType(int kind)
+ {
+ return integerTypes.intern(IntegerType(kind));
+ }
+
+ FloatType *findOrInsertFloatType(int kind)
+ {
+ return floatTypes.intern(FloatType(kind));
+ }
+
+ PointerToMemberType *findOrInsertPointerToMemberType(const Name *memberName, const FullySpecifiedType &elementType)
+ {
+ return pointerToMemberTypes.intern(PointerToMemberType(memberName, elementType));
+ }
+
+ PointerType *findOrInsertPointerType(const FullySpecifiedType &elementType)
+ {
+ return pointerTypes.intern(PointerType(elementType));
+ }
+
+ ReferenceType *findOrInsertReferenceType(const FullySpecifiedType &elementType, bool rvalueRef)
+ {
+ return referenceTypes.intern(ReferenceType(elementType, rvalueRef));
+ }
+
+ ArrayType *findOrInsertArrayType(const FullySpecifiedType &elementType, unsigned size)
+ {
+ return arrayTypes.intern(ArrayType(elementType, size));
+ }
+
+ NamedType *findOrInsertNamedType(const Name *name)
+ {
+ return namedTypes.intern(NamedType(name));
+ }
+
+ Declaration *newDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ Declaration *declaration = new Declaration(translationUnit, sourceLocation, name);
+ symbols.push_back(declaration);
+ return declaration;
+ }
+
+ EnumeratorDeclaration *newEnumeratorDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ EnumeratorDeclaration *decl = new EnumeratorDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(decl);
+ return decl;
+ }
+
+ Argument *newArgument(unsigned sourceLocation, const Name *name)
+ {
+ Argument *argument = new Argument(translationUnit, sourceLocation, name);
+ symbols.push_back(argument);
+ return argument;
+ }
+
+ TypenameArgument *newTypenameArgument(unsigned sourceLocation, const Name *name)
+ {
+ TypenameArgument *argument = new TypenameArgument(translationUnit, sourceLocation, name);
+ symbols.push_back(argument);
+ return argument;
+ }
+
+ Function *newFunction(unsigned sourceLocation, const Name *name)
+ {
+ Function *function = new Function(translationUnit, sourceLocation, name);
+ symbols.push_back(function);
+ return function;
+ }
+
+ BaseClass *newBaseClass(unsigned sourceLocation, const Name *name)
+ {
+ BaseClass *baseClass = new BaseClass(translationUnit, sourceLocation, name);
+ symbols.push_back(baseClass);
+ return baseClass;
+ }
+
+ Block *newBlock(unsigned sourceLocation)
+ {
+ Block *block = new Block(translationUnit, sourceLocation);
+ symbols.push_back(block);
+ return block;
+ }
+
+ Class *newClass(unsigned sourceLocation, const Name *name)
+ {
+ Class *klass = new Class(translationUnit, sourceLocation, name);
+ symbols.push_back(klass);
+ return klass;
+ }
+
+ Namespace *newNamespace(unsigned sourceLocation, const Name *name)
+ {
+ Namespace *ns = new Namespace(translationUnit, sourceLocation, name);
+ symbols.push_back(ns);
+ return ns;
+ }
+
+ Template *newTemplate(unsigned sourceLocation, const Name *name)
+ {
+ Template *ns = new Template(translationUnit, sourceLocation, name);
+ symbols.push_back(ns);
+ return ns;
+ }
+
+ NamespaceAlias *newNamespaceAlias(unsigned sourceLocation, const Name *name)
+ {
+ NamespaceAlias *ns = new NamespaceAlias(translationUnit, sourceLocation, name);
+ symbols.push_back(ns);
+ return ns;
+ }
+
+ UsingNamespaceDirective *newUsingNamespaceDirective(unsigned sourceLocation, const Name *name)
+ {
+ UsingNamespaceDirective *u = new UsingNamespaceDirective(translationUnit, sourceLocation, name);
+ symbols.push_back(u);
+ return u;
+ }
+
+ ForwardClassDeclaration *newForwardClassDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ ForwardClassDeclaration *c = new ForwardClassDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(c);
+ return c;
+ }
+
+ QtPropertyDeclaration *newQtPropertyDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ QtPropertyDeclaration *d = new QtPropertyDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(d);
+ return d;
+ }
+
+ QtEnum *newQtEnum(unsigned sourceLocation, const Name *name)
+ {
+ QtEnum *d = new QtEnum(translationUnit, sourceLocation, name);
+ symbols.push_back(d);
+ return d;
+ }
+
+ ObjCBaseClass *newObjCBaseClass(unsigned sourceLocation, const Name *name)
+ {
+ ObjCBaseClass *c = new ObjCBaseClass(translationUnit, sourceLocation, name);
+ symbols.push_back(c);
+ return c;
+ }
+
+ ObjCBaseProtocol *newObjCBaseProtocol(unsigned sourceLocation, const Name *name)
+ {
+ ObjCBaseProtocol *p = new ObjCBaseProtocol(translationUnit, sourceLocation, name);
+ symbols.push_back(p);
+ return p;
+ }
+
+ ObjCClass *newObjCClass(unsigned sourceLocation, const Name *name)
+ {
+ ObjCClass *c = new ObjCClass(translationUnit, sourceLocation, name);
+ symbols.push_back(c);
+ return c;
+ }
+
+ ObjCForwardClassDeclaration *newObjCForwardClassDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ ObjCForwardClassDeclaration *fwd = new ObjCForwardClassDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(fwd);
+ return fwd;
+ }
+
+ ObjCProtocol *newObjCProtocol(unsigned sourceLocation, const Name *name)
+ {
+ ObjCProtocol *p = new ObjCProtocol(translationUnit, sourceLocation, name);
+ symbols.push_back(p);
+ return p;
+ }
+
+ ObjCForwardProtocolDeclaration *newObjCForwardProtocolDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ ObjCForwardProtocolDeclaration *fwd = new ObjCForwardProtocolDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(fwd);
+ return fwd;
+ }
+
+ ObjCMethod *newObjCMethod(unsigned sourceLocation, const Name *name)
+ {
+ ObjCMethod *method = new ObjCMethod(translationUnit, sourceLocation, name);
+ symbols.push_back(method);
+ return method;
+ }
+
+ ObjCPropertyDeclaration *newObjCPropertyDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ ObjCPropertyDeclaration *decl = new ObjCPropertyDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(decl);
+ return decl;
+ }
+
+ Enum *newEnum(unsigned sourceLocation, const Name *name)
+ {
+ Enum *e = new Enum(translationUnit, sourceLocation, name);
+ symbols.push_back(e);
+ return e;
+ }
+
+ UsingDeclaration *newUsingDeclaration(unsigned sourceLocation, const Name *name)
+ {
+ UsingDeclaration *u = new UsingDeclaration(translationUnit, sourceLocation, name);
+ symbols.push_back(u);
+ return u;
+ }
+
+ Control *control;
+ TranslationUnit *translationUnit;
+ DiagnosticClient *diagnosticClient;
+
+ TypeMatcher matcher;
+
+ LiteralTable<Identifier> identifiers;
+ LiteralTable<StringLiteral> stringLiterals;
+ LiteralTable<NumericLiteral> numericLiterals;
+
+ // ### replace std::map with lookup tables. ASAP!
+
+ // names
+ Table<DestructorNameId> destructorNameIds;
+ Table<OperatorNameId> operatorNameIds;
+ Table<ConversionNameId> conversionNameIds;
+ Table<TemplateNameId> templateNameIds;
+ Table<QualifiedNameId> qualifiedNameIds;
+ Table<SelectorNameId> selectorNameIds;
+
+ // types
+ VoidType voidType;
+ Table<IntegerType> integerTypes;
+ Table<FloatType> floatTypes;
+ Table<PointerToMemberType> pointerToMemberTypes;
+ Table<PointerType> pointerTypes;
+ Table<ReferenceType> referenceTypes;
+ Table<ArrayType> arrayTypes;
+ Table<NamedType> namedTypes;
+
+ // symbols
+ std::vector<Symbol *> symbols;
+
+ const Identifier *deprecatedId;
+ const Identifier *unavailableId;
+ // ObjC context keywords:
+ const Identifier *objcGetterId;
+ const Identifier *objcSetterId;
+ const Identifier *objcReadwriteId;
+ const Identifier *objcReadonlyId;
+ const Identifier *objcAssignId;
+ const Identifier *objcRetainId;
+ const Identifier *objcCopyId;
+ const Identifier *objcNonatomicId;
+ TopLevelDeclarationProcessor *processor;
+};
+
+Control::Control()
+{
+ d = new Data(this);
+
+ d->deprecatedId = identifier("deprecated");
+ d->unavailableId = identifier("unavailable");
+
+ d->objcGetterId = identifier("getter");
+ d->objcSetterId = identifier("setter");
+ d->objcReadwriteId = identifier("readwrite");
+ d->objcReadonlyId = identifier("readonly");
+ d->objcAssignId = identifier("assign");
+ d->objcRetainId = identifier("retain");
+ d->objcCopyId = identifier("copy");
+ d->objcNonatomicId = identifier("nonatomic");
+}
+
+Control::~Control()
+{ delete d; }
+
+TranslationUnit *Control::translationUnit() const
+{ return d->translationUnit; }
+
+TranslationUnit *Control::switchTranslationUnit(TranslationUnit *unit)
+{
+ TranslationUnit *previousTranslationUnit = d->translationUnit;
+ d->translationUnit = unit;
+ return previousTranslationUnit;
+}
+
+DiagnosticClient *Control::diagnosticClient() const
+{ return d->diagnosticClient; }
+
+void Control::setDiagnosticClient(DiagnosticClient *diagnosticClient)
+{ d->diagnosticClient = diagnosticClient; }
+
+const OperatorNameId *Control::findOperatorNameId(OperatorNameId::Kind operatorId) const
+{
+ Table<OperatorNameId>::const_iterator i = d->operatorNameIds.find(operatorId);
+ if (i == d->operatorNameIds.end())
+ return 0;
+ else
+ return &*i;
+}
+
+const Identifier *Control::findIdentifier(const char *chars, unsigned size) const
+{ return d->identifiers.findLiteral(chars, size); }
+
+const Identifier *Control::identifier(const char *chars, unsigned size)
+{ return d->identifiers.findOrInsertLiteral(chars, size); }
+
+const Identifier *Control::identifier(const char *chars)
+{
+ unsigned length = std::strlen(chars);
+ return identifier(chars, length);
+}
+
+Control::IdentifierIterator Control::firstIdentifier() const
+{ return d->identifiers.begin(); }
+
+Control::IdentifierIterator Control::lastIdentifier() const
+{ return d->identifiers.end(); }
+
+Control::StringLiteralIterator Control::firstStringLiteral() const
+{ return d->stringLiterals.begin(); }
+
+Control::StringLiteralIterator Control::lastStringLiteral() const
+{ return d->stringLiterals.end(); }
+
+Control::NumericLiteralIterator Control::firstNumericLiteral() const
+{ return d->numericLiterals.begin(); }
+
+Control::NumericLiteralIterator Control::lastNumericLiteral() const
+{ return d->numericLiterals.end(); }
+
+const StringLiteral *Control::stringLiteral(const char *chars, unsigned size)
+{ return d->stringLiterals.findOrInsertLiteral(chars, size); }
+
+const StringLiteral *Control::stringLiteral(const char *chars)
+{
+ unsigned length = std::strlen(chars);
+ return stringLiteral(chars, length);
+}
+
+const NumericLiteral *Control::numericLiteral(const char *chars, unsigned size)
+{ return d->numericLiterals.findOrInsertLiteral(chars, size); }
+
+const NumericLiteral *Control::numericLiteral(const char *chars)
+{
+ unsigned length = std::strlen(chars);
+ return numericLiteral(chars, length);
+}
+
+const TemplateNameId *Control::templateNameId(const Identifier *id,
+ const FullySpecifiedType *const args,
+ unsigned argv)
+{
+ return d->findOrInsertTemplateNameId(id, args, args + argv);
+}
+
+const DestructorNameId *Control::destructorNameId(const Identifier *id)
+{ return d->findOrInsertDestructorNameId(id); }
+
+const OperatorNameId *Control::operatorNameId(OperatorNameId::Kind kind)
+{ return d->findOrInsertOperatorNameId(kind); }
+
+const ConversionNameId *Control::conversionNameId(const FullySpecifiedType &type)
+{ return d->findOrInsertConversionNameId(type); }
+
+const QualifiedNameId *Control::qualifiedNameId(const Name *base, const Name *name)
+{
+ return d->findOrInsertQualifiedNameId(base, name);
+}
+
+const SelectorNameId *Control::selectorNameId(const Name *const *names,
+ unsigned nameCount,
+ bool hasArguments)
+{
+ return d->findOrInsertSelectorNameId(names, names + nameCount, hasArguments);
+}
+
+
+VoidType *Control::voidType()
+{ return &d->voidType; }
+
+IntegerType *Control::integerType(int kind)
+{ return d->findOrInsertIntegerType(kind); }
+
+FloatType *Control::floatType(int kind)
+{ return d->findOrInsertFloatType(kind); }
+
+PointerToMemberType *Control::pointerToMemberType(const Name *memberName, const FullySpecifiedType &elementType)
+{ return d->findOrInsertPointerToMemberType(memberName, elementType); }
+
+PointerType *Control::pointerType(const FullySpecifiedType &elementType)
+{ return d->findOrInsertPointerType(elementType); }
+
+ReferenceType *Control::referenceType(const FullySpecifiedType &elementType, bool rvalueRef)
+{ return d->findOrInsertReferenceType(elementType, rvalueRef); }
+
+ArrayType *Control::arrayType(const FullySpecifiedType &elementType, unsigned size)
+{ return d->findOrInsertArrayType(elementType, size); }
+
+NamedType *Control::namedType(const Name *name)
+{ return d->findOrInsertNamedType(name); }
+
+Argument *Control::newArgument(unsigned sourceLocation, const Name *name)
+{ return d->newArgument(sourceLocation, name); }
+
+TypenameArgument *Control::newTypenameArgument(unsigned sourceLocation, const Name *name)
+{ return d->newTypenameArgument(sourceLocation, name); }
+
+Function *Control::newFunction(unsigned sourceLocation, const Name *name)
+{ return d->newFunction(sourceLocation, name); }
+
+Namespace *Control::newNamespace(unsigned sourceLocation, const Name *name)
+{ return d->newNamespace(sourceLocation, name); }
+
+Template *Control::newTemplate(unsigned sourceLocation, const Name *name)
+{ return d->newTemplate(sourceLocation, name); }
+
+NamespaceAlias *Control::newNamespaceAlias(unsigned sourceLocation, const Name *name)
+{ return d->newNamespaceAlias(sourceLocation, name); }
+
+BaseClass *Control::newBaseClass(unsigned sourceLocation, const Name *name)
+{ return d->newBaseClass(sourceLocation, name); }
+
+Class *Control::newClass(unsigned sourceLocation, const Name *name)
+{ return d->newClass(sourceLocation, name); }
+
+Enum *Control::newEnum(unsigned sourceLocation, const Name *name)
+{ return d->newEnum(sourceLocation, name); }
+
+Block *Control::newBlock(unsigned sourceLocation)
+{ return d->newBlock(sourceLocation); }
+
+Declaration *Control::newDeclaration(unsigned sourceLocation, const Name *name)
+{ return d->newDeclaration(sourceLocation, name); }
+
+EnumeratorDeclaration *Control::newEnumeratorDeclaration(unsigned sourceLocation, const Name *name)
+{ return d->newEnumeratorDeclaration(sourceLocation, name); }
+
+UsingNamespaceDirective *Control::newUsingNamespaceDirective(unsigned sourceLocation,
+ const Name *name)
+{ return d->newUsingNamespaceDirective(sourceLocation, name); }
+
+UsingDeclaration *Control::newUsingDeclaration(unsigned sourceLocation, const Name *name)
+{ return d->newUsingDeclaration(sourceLocation, name); }
+
+ForwardClassDeclaration *Control::newForwardClassDeclaration(unsigned sourceLocation,
+ const Name *name)
+{ return d->newForwardClassDeclaration(sourceLocation, name); }
+
+QtPropertyDeclaration *Control::newQtPropertyDeclaration(unsigned sourceLocation,
+ const Name *name)
+{ return d->newQtPropertyDeclaration(sourceLocation, name); }
+
+QtEnum *Control::newQtEnum(unsigned sourceLocation, const Name *name)
+{ return d->newQtEnum(sourceLocation, name); }
+
+ObjCBaseClass *Control::newObjCBaseClass(unsigned sourceLocation, const Name *name)
+{ return d->newObjCBaseClass(sourceLocation, name); }
+
+ObjCBaseProtocol *Control::newObjCBaseProtocol(unsigned sourceLocation, const Name *name)
+{ return d->newObjCBaseProtocol(sourceLocation, name); }
+
+ObjCClass *Control::newObjCClass(unsigned sourceLocation, const Name *name)
+{ return d->newObjCClass(sourceLocation, name); }
+
+ObjCForwardClassDeclaration *Control::newObjCForwardClassDeclaration(unsigned sourceLocation, const Name *name)
+{ return d->newObjCForwardClassDeclaration(sourceLocation, name); }
+
+ObjCProtocol *Control::newObjCProtocol(unsigned sourceLocation, const Name *name)
+{ return d->newObjCProtocol(sourceLocation, name); }
+
+ObjCForwardProtocolDeclaration *Control::newObjCForwardProtocolDeclaration(unsigned sourceLocation, const Name *name)
+{ return d->newObjCForwardProtocolDeclaration(sourceLocation, name); }
+
+ObjCMethod *Control::newObjCMethod(unsigned sourceLocation, const Name *name)
+{ return d->newObjCMethod(sourceLocation, name); }
+
+ObjCPropertyDeclaration *Control::newObjCPropertyDeclaration(unsigned sourceLocation, const Name *name)
+{ return d->newObjCPropertyDeclaration(sourceLocation, name); }
+
+const Identifier *Control::deprecatedId() const
+{ return d->deprecatedId; }
+
+const Identifier *Control::unavailableId() const
+{ return d->unavailableId; }
+
+const Identifier *Control::objcGetterId() const
+{ return d->objcGetterId; }
+
+const Identifier *Control::objcSetterId() const
+{ return d->objcSetterId; }
+
+const Identifier *Control::objcReadwriteId() const
+{ return d->objcReadwriteId; }
+
+const Identifier *Control::objcReadonlyId() const
+{ return d->objcReadonlyId; }
+
+const Identifier *Control::objcAssignId() const
+{ return d->objcAssignId; }
+
+const Identifier *Control::objcRetainId() const
+{ return d->objcRetainId; }
+
+const Identifier *Control::objcCopyId() const
+{ return d->objcCopyId; }
+
+const Identifier *Control::objcNonatomicId() const
+{ return d->objcNonatomicId; }
+
+Symbol **Control::firstSymbol() const
+{
+ if (d->symbols.empty())
+ return 0;
+
+ return &*d->symbols.begin();
+}
+
+Symbol **Control::lastSymbol() const
+{
+ if (d->symbols.empty())
+ return 0;
+
+ return &*d->symbols.begin() + d->symbols.size();
+}
+
+bool Control::hasSymbol(Symbol *symbol) const
+{
+ return std::find(d->symbols.begin(), d->symbols.end(), symbol) != d->symbols.end();
+}
+
+void Control::squeeze()
+{
+ d->numericLiterals.reset();
+}
+
+TopLevelDeclarationProcessor *Control::topLevelDeclarationProcessor() const
+{
+ return d->processor;
+}
+
+void Control::setTopLevelDeclarationProcessor(CPlusPlus::TopLevelDeclarationProcessor *processor)
+{
+ d->processor = processor;
+}