summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/ResolveExpression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/cplusplus/ResolveExpression.cpp')
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp171
1 files changed, 20 insertions, 151 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 7c9eedebd5..f89c2c9afd 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -30,6 +30,7 @@
#include "ResolveExpression.h"
#include "LookupContext.h"
#include "Overview.h"
+#include "GenTemplateInstance.h"
#include <Control.h>
#include <AST.h>
@@ -49,151 +50,6 @@ using namespace CPlusPlus;
namespace {
-typedef QList< QPair<Name *, FullySpecifiedType> > Substitution;
-
-class GenerateInstance: protected TypeVisitor, protected NameVisitor
-{
- Control *_control;
- FullySpecifiedType _type;
- const Substitution _substitution;
-
-public:
- GenerateInstance(Control *control, const Substitution &substitution)
- : _control(control),
- _substitution(substitution)
- { }
-
- FullySpecifiedType operator()(const FullySpecifiedType &ty)
- { return subst(ty); }
-
-protected:
- FullySpecifiedType subst(Name *name)
- {
- if (TemplateNameId *t = name->asTemplateNameId()) {
- QVarLengthArray<FullySpecifiedType, 8> args(t->templateArgumentCount());
-
- for (unsigned i = 0; i < t->templateArgumentCount(); ++i)
- args[i] = subst(t->templateArgumentAt(i));
-
- TemplateNameId *n = _control->templateNameId(t->identifier(),
- args.data(), args.size());
-
- return FullySpecifiedType(_control->namedType(n));
- } else if (name->isQualifiedNameId()) {
- // ### implement me
- }
-
- for (int i = 0; i < _substitution.size(); ++i) {
- const QPair<Name *, FullySpecifiedType> s = _substitution.at(i);
- if (name->isEqualTo(s.first))
- return s.second;
- }
-
- return FullySpecifiedType(_control->namedType(name));
- }
-
- FullySpecifiedType subst(const FullySpecifiedType &ty)
- {
- FullySpecifiedType previousType = switchType(ty);
- TypeVisitor::accept(ty.type());
- return switchType(previousType);
- }
-
- FullySpecifiedType switchType(const FullySpecifiedType &type)
- {
- FullySpecifiedType previousType = _type;
- _type = type;
- return previousType;
- }
-
- // types
- virtual void visit(PointerToMemberType * /*ty*/)
- {
- Q_ASSERT(false);
- }
-
- virtual void visit(PointerType *ty)
- {
- FullySpecifiedType elementType = subst(ty->elementType());
- _type.setType(_control->pointerType(elementType));
- }
-
- virtual void visit(ReferenceType *ty)
- {
- FullySpecifiedType elementType = subst(ty->elementType());
- _type.setType(_control->referenceType(elementType));
- }
-
- virtual void visit(ArrayType *ty)
- {
- FullySpecifiedType elementType = subst(ty->elementType());
- _type.setType(_control->arrayType(elementType, ty->size()));
- }
-
- virtual void visit(NamedType *ty)
- {
- Name *name = ty->name();
- _type.setType(subst(name).type());
- }
-
- virtual void visit(Function *ty)
- {
- Name *name = ty->name();
- FullySpecifiedType returnType = subst(ty->returnType());
-
- Function *fun = _control->newFunction(0, name);
- fun->setScope(ty->scope());
- fun->setConst(ty->isConst());
- fun->setVolatile(ty->isVolatile());
- fun->setReturnType(returnType);
- for (unsigned i = 0; i < ty->argumentCount(); ++i) {
- Symbol *arg = ty->argumentAt(i);
- FullySpecifiedType argTy = subst(arg->type());
- Argument *newArg = _control->newArgument(0, arg->name());
- newArg->setType(argTy);
- fun->arguments()->enterSymbol(newArg);
- }
- _type.setType(fun);
- }
-
- virtual void visit(VoidType *)
- { /* nothing to do*/ }
-
- virtual void visit(IntegerType *)
- { /* nothing to do*/ }
-
- virtual void visit(FloatType *)
- { /* nothing to do*/ }
-
- virtual void visit(Namespace *)
- { Q_ASSERT(false); }
-
- virtual void visit(Class *)
- { Q_ASSERT(false); }
-
- virtual void visit(Enum *)
- { Q_ASSERT(false); }
-
- // names
- virtual void visit(NameId *)
- { Q_ASSERT(false); }
-
- virtual void visit(TemplateNameId *)
- { Q_ASSERT(false); }
-
- virtual void visit(DestructorNameId *)
- { Q_ASSERT(false); }
-
- virtual void visit(OperatorNameId *)
- { Q_ASSERT(false); }
-
- virtual void visit(ConversionNameId *)
- { Q_ASSERT(false); }
-
- virtual void visit(QualifiedNameId *)
- { Q_ASSERT(false); }
-};
-
template <typename _Tp>
static QList<_Tp> removeDuplicates(const QList<_Tp> &results)
{
@@ -286,9 +142,14 @@ bool ResolveExpression::visit(ConditionAST *)
return false;
}
-bool ResolveExpression::visit(ConditionalExpressionAST *)
+bool ResolveExpression::visit(ConditionalExpressionAST *ast)
{
- // nothing to do.
+ if (ast->left_expression)
+ accept(ast->left_expression);
+
+ else if (ast->right_expression)
+ accept(ast->right_expression);
+
return false;
}
@@ -300,7 +161,8 @@ bool ResolveExpression::visit(CppCastExpressionAST *ast)
bool ResolveExpression::visit(DeleteExpressionAST *)
{
- // nothing to do.
+ FullySpecifiedType ty(control()->voidType());
+ addResult(ty);
return false;
}
@@ -310,8 +172,15 @@ bool ResolveExpression::visit(ArrayInitializerAST *)
return false;
}
-bool ResolveExpression::visit(NewExpressionAST *)
+bool ResolveExpression::visit(NewExpressionAST *ast)
{
+ if (ast->new_type_id) {
+ Scope *scope = _context.expressionDocument()->globalSymbols();
+ FullySpecifiedType ty = sem.check(ast->new_type_id->type_specifier, scope);
+ ty = sem.check(ast->new_type_id->ptr_operators, ty, scope);
+ FullySpecifiedType ptrTy(control()->pointerType(ty));
+ addResult(ptrTy);
+ }
// nothing to do.
return false;
}
@@ -836,7 +705,7 @@ ResolveExpression::resolveMember(Name *memberName, Class *klass,
unqualifiedNameId = q->unqualifiedNameId();
if (TemplateNameId *templId = unqualifiedNameId->asTemplateNameId()) {
- Substitution subst;
+ GenTemplateInstance::Substitution subst;
for (unsigned i = 0; i < templId->templateArgumentCount(); ++i) {
FullySpecifiedType templArgTy = templId->templateArgumentAt(i);
@@ -846,7 +715,7 @@ ResolveExpression::resolveMember(Name *memberName, Class *klass,
templArgTy));
}
- GenerateInstance inst(control(), subst);
+ GenTemplateInstance inst(control(), subst);
ty = inst(ty);
}