#include "AST.h" #include "decls.h" bool TypeNode::isAtomic() const { // conservative default return false; } bool TypeNameNode::isAtomic() const { switch (kind()) { case ClassKind: case InterfaceKind: return false; case ImmutableKind: // Immutables can be considered atomic if all of their constituent // fields are atomic. Ooh, recursion! foriter (field, decl()->environ()->allProperDecls(), EnvironIter) if (field->category() == Decl::Field && !(field->modifiers() & Common::Static) && (field->container() == decl())) { if (field->hasType()) { if (!field->type()->isAtomic()) { return false; } } else if (field->isType()) { if (!field->asType()->isAtomic()) { return false; } } } return true; default: fatal( "unable to check atomicity of " + errorName() ); return false; } } bool PrimitiveTypeNode::isAtomic() const { return true; } bool PointTypeNode::isAtomic() const { return true; } bool RectDomainTypeNode::isAtomic() const { return true; }