1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
/* $Id$
*
* Copyright (C) 2007-2009 FAUmachine Team <info@faumachine.org>.
* This program is free software. You can redistribute it and/or modify it
* under the terms of the GNU General Public License, either version 2 of
* the License, or (at your option) any later version. See COPYING.
*/
#include "frontend/ast/SubtypeIndication.hpp"
#include <cassert>
#include "frontend/misc/Symbol.hpp"
#include "frontend/ast/UnconstrainedArrayType.hpp"
namespace ast {
SubtypeIndication::SubtypeIndication(
Name *typeMark,
Location loc
) : TypeDeclaration(NULL, loc, BASE_TYPE_UNSET),
typeName(typeMark),
constraint(NULL),
indexConstraint(NULL),
resolutionFunction(NULL),
declaration(NULL) {
if (typeMark && typeMark->candidates.size() == 1) {
Symbol *sym = typeMark->candidates.front();
this->declaration = dynamic_cast<const TypeDeclaration*>(
&sym->declaration);
assert(this->declaration);
this->baseType = this->declaration->baseType;
}
}
SubtypeIndication::SubtypeIndication(
const TypeDeclaration *byType,
Location loc
) : TypeDeclaration(NULL, loc, byType->baseType),
typeName(NULL),
constraint(NULL),
indexConstraint(NULL),
resolutionFunction(NULL),
declaration(byType)
{
}
std::string *
SubtypeIndication::getResolver(void) const
{
if (this->resolutionFunction == NULL) {
const SubtypeIndication *parent =
dynamic_cast<const SubtypeIndication*>(
this->declaration);
if (parent == NULL) {
/* check for array types */
const UnconstrainedArrayType *ua =
dynamic_cast<const UnconstrainedArrayType*>(
this->declaration);
if (ua == NULL) {
return NULL;
}
const SubtypeIndication *si =
dynamic_cast<const SubtypeIndication *>(
ua->elementType);
if (si != NULL) {
return si->getResolver();
}
/* can records be resolved? */
return NULL;
}
return parent->getResolver();
}
if (this->resolutionFunction->candidates.size() != 1) {
assert(false);
return NULL;
}
return new std::string(this->resolutionFunction->getName());
}
}; /* namespace ast */
|