root/src/kits/debugger/source_language/c_family/CLanguageFamily.cpp
/*
 * Copyright 2013-2014, Rene Gollent, rene@gollent.com.
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */

#include "CLanguageFamily.h"

#include <new>

#include <stdlib.h>

#include "CLanguageExpressionEvaluator.h"
#include "CLanguageFamilySyntaxHighlighter.h"
#include "CLanguageTokenizer.h"
#include "ExpressionInfo.h"
#include "TeamTypeInformation.h"
#include "StringValue.h"
#include "Type.h"
#include "TypeLookupConstraints.h"


using CLanguage::ParseException;


CLanguageFamily::CLanguageFamily()
{
}


CLanguageFamily::~CLanguageFamily()
{
}


SyntaxHighlighter*
CLanguageFamily::GetSyntaxHighlighter() const
{
        return new(std::nothrow) CLanguageFamilySyntaxHighlighter();
}


status_t
CLanguageFamily::EvaluateExpression(const BString& expression,
        ValueNodeManager* manager, TeamTypeInformation* info,
        ExpressionResult*& _output, ValueNode*& _neededNode)
{
        _output = NULL;
        _neededNode = NULL;
        CLanguageExpressionEvaluator evaluator;
        try {
                _output = evaluator.Evaluate(expression, manager, info);
                return B_OK;
        } catch (ParseException& ex) {
                BString error;
                error.SetToFormat("Parse error at position %" B_PRId32 ": %s",
                        ex.position, ex.message.String());
                StringValue* value = new(std::nothrow) StringValue(error.String());
                if (value == NULL)
                        return B_NO_MEMORY;
                BReference<Value> valueReference(value, true);
                _output = new(std::nothrow) ExpressionResult();
                if (_output == NULL)
                        return B_NO_MEMORY;
                _output->SetToPrimitive(value);
                return B_BAD_DATA;
        } catch (ValueNeededException& ex) {
                _neededNode = ex.value;
        }

        return B_OK;
}