void Component:: supports (IdentifierPtr const& id) { if (ctx.trace ()) cerr << " supports " << id << endl; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { SemanticGraph::Interface& i ( resolve<SemanticGraph::Interface> (from, name, Flags::defined)); check_support (now ().supports_begin (), now ().supports_end (), i); ctx.tu ().new_edge<Supports> (now (), i); ctx.tu ().new_edge<Extends> (now (), i); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid supports specification" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no interface with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "incompatible type in supports specification" << endl; } catch (NotDefined const& e) { cerr << ctx.file () << ":" << id->line () << ": error: " << "attempt to support forward-declared interface " << e.name () << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "support of forward-declared interface is illegal" << endl; } catch (AlreadySupported const& e) { cerr << ctx.file () << ":" << id->line () << ": error: " << "directly supporting interface \'" << e.name () << "\' more than once is illegal" << endl; } }
void EventTypeFactory:: parameter (IdentifierPtr const& type_id, SimpleIdentifierPtr const& name_id) { if (ctx.trace ()) cerr << "parameter in " << " " << type_id << " " << name_id << endl; if (f_ == 0) return; Name name (type_id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { Type& t (resolve<Type> (from, name, Flags::complete)); Parameter& p ( ctx.tu ().new_node<InParameter> ( ctx.file (), name_id->line (), name_id->lexeme ())); ctx.tu ().new_edge<Belongs> (p, t); ctx.tu ().new_edge<Receives> (*f_, p); } catch (Resolve const&) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "invalid parameter declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "no type with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not a type declaration" << endl; cerr << ctx.file () << ":" << type_id->line () << ": error: " << "using non-type as an factory parameter type is " << "illegal" << endl; } catch (NotComplete const& e) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "type \'" << e.name () << "\' is not complete" << endl; } }
void Member:: type (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "member " << id << endl; type_ = 0; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { // With introduction of CORBA 3.1 we have a new beast: // struct with incoplete members which itself becomes // incomplete. // type_ = &resolve<Type> (from, name/*, Flags::complete*/); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid member declaration" << endl; throw; } //@@ I am not handling NotUnique here. For example if // I provide module name as type then the compiler // will ICE. Think about other places it may happen // (attribute, value memebr, typeded, others?). // } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no type with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not a type declaration" << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "using non-type as a member type is illegal" << endl; } catch (NotComplete const& e) { cerr << ctx.file () << ":" << id->line () << ": error: " << "type \'" << e.name () << "\' is not complete" << endl; } }
void Union:: type (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "type " << id << endl; type_ = 0; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { type_ = &resolve<Type> (from, name); if (!(dynamic_cast<Enum*> (type_) || dynamic_cast<Boolean*> (type_) || dynamic_cast<Char*> (type_) || dynamic_cast<Wchar*> (type_) || dynamic_cast<Short*> (type_) || dynamic_cast<UnsignedShort*> (type_) || dynamic_cast<Long*> (type_) || dynamic_cast<UnsignedLong*> (type_) || dynamic_cast<LongLong*> (type_) || dynamic_cast<UnsignedLongLong*> (type_))) { throw WrongType (type_->scoped_name ()); } ctx.tu ().new_edge<ArgumentsWithType> (*type_, now ()); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid union declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no type with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not a valid discriminant type" << endl; } }
void Operation:: raises (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "raises " << id << endl; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); struct OneWay : Resolve {}; try { try { if (one_way_) throw OneWay (); SemanticGraph::Exception& e ( resolve<SemanticGraph::Exception> (from, name)); ctx.tu ().new_edge<Raises> (*op_, e); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid raises declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no exception with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not an exception declaration" << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "using non-exception type in raises declaration is " << "illegal" << endl; } catch (OneWay const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "oneway operation may not raise exceptions" << endl; } }
void Typedef:: begin_unbounded_seq (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "typedef u-sequence<" << id << ">" << endl; define_ = true; type_ = 0; array_type_ = 0; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { Type& t (resolve<Type> (from, name)); UnboundedSequence& s ( ctx.tu ().new_node<UnboundedSequence> ( ctx.file (), line_)); ctx.tu ().new_edge<ArgumentsWithType> (t, s); type_ = &s; } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid sequence declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no type with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not a type declaration" << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "using non-type in sequence specialization is illegal" << endl; } }
void Component:: inherits (IdentifierPtr const& id) { if (ctx.trace ()) cerr << " inherits " << id << endl; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { SemanticGraph::Component& c ( resolve<SemanticGraph::Component> (from, name, Flags::defined)); ctx.tu ().new_edge<Inherits> (now (), c); ctx.tu ().new_edge<Extends> (now (), c); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid inheritance specification" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no component with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "incompatible type in inheritance specification" << endl; } catch (NotDefined const& e) { cerr << ctx.file () << ":" << id->line () << ": error: " << "attempt to inherit from forward-declared component " << e.name () << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "inheritance from forward-declared component is illegal" << endl; } }
void Operation:: type (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "operation " << id; type_ = 0; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { type_ = &resolve<Type> (from, name, Flags::complete); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid operation declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no type with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not a type declaration" << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "using non-type as an operation return type is illegal" << endl; } catch (NotComplete const& e) { cerr << ctx.file () << ":" << id->line () << ": error: " << "type \'" << e.name () << "\' is not complete" << endl; } }
void EventTypeFactory:: raises (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "raises " << id << endl; if (f_ == 0) return; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { SemanticGraph::Exception& e ( resolve<SemanticGraph::Exception> (from, name)); ctx.tu ().new_edge<Raises> (*f_, e); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid raises declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no exception with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not an exception declaration" << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "using non-exception type in raises declaration is " << "illegal" << endl; } }
void Typedef:: begin (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "typedef " << id << endl; define_ = false; type_ = 0; array_type_ = 0; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { type_ = &resolve<Type> (from, name); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid typedef declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no type with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not a type declaration" << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "using non-type in typedef is illegal" << endl; } }
void Publishes:: type (IdentifierPtr const& id) { if (ctx.trace ()) cerr << "publishes " << id; type_ = 0; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { type_ = &resolve<EventType> (from, name); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid publishes declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no eventtype with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not an eventtype declaration" << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "using non-eventtype in publishes declaration is illegal" << endl; } }
void Operation:: parameter (Direction::Value direction, IdentifierPtr const& type_id, SimpleIdentifierPtr const& name_id) { if (ctx.trace ()) cerr << "parameter " << direction << " " << type_id << " " << name_id << endl; Name name (type_id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); struct NotIn : Resolve {}; try { try { if (one_way_ && direction != Direction::in) throw NotIn (); Type& t (resolve<Type> (from, name, Flags::complete)); Parameter* p (0); switch (direction) { case Direction::in: { p = &ctx.tu ().new_node<InParameter> ( ctx.file (), name_id->line (), name_id->lexeme ()); break; } case Direction::out: { p = &ctx.tu ().new_node<OutParameter> ( ctx.file (), name_id->line (), name_id->lexeme ()); break; } case Direction::inout: { p = &ctx.tu ().new_node<InOutParameter> ( ctx.file (), name_id->line (), name_id->lexeme ()); break; } } ctx.tu ().new_edge<Belongs> (*p, t); ctx.tu ().new_edge<Receives> (*op_, *p); } catch (Resolve const&) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "invalid parameter declaration" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "no type with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "declaration with name \'" << name << "\' visible from scope \'" << from << "\' is not a type declaration" << endl; cerr << ctx.file () << ":" << type_id->line () << ": error: " << "using non-type as an operation parameter type is " << "illegal" << endl; } catch (NotComplete const& e) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "type \'" << e.name () << "\' is not complete" << endl; } catch (NotIn const&) { cerr << ctx.file () << ":" << type_id->line () << ": error: " << "parameter of oneway operation should have \'in\' " << "direction" << endl; } }
void Interface:: inherits (IdentifierPtr const& id) { if (ctx.trace ()) cerr << " inherits " << id << endl; Name name (id->lexeme ()); ScopedName from (ctx.scope ().scoped_name ()); try { try { SemanticGraph::Interface& i ( resolve<SemanticGraph::Interface> (from, name, Flags::defined)); switch (qualifier_) { case Qualifier::abstract: { if (dynamic_cast<AbstractInterface*> (&i)) break; throw WrongType (i.scoped_name ()); } case Qualifier::unconstrained: { if (dynamic_cast<UnconstrainedInterface*> (&i) || dynamic_cast<AbstractInterface*> (&i)) break; throw WrongType (i.scoped_name ()); } default: break; } check_inheritance (now ().inherits_begin (), now ().inherits_end (), i); ctx.tu ().new_edge<Inherits> (now (), i); ctx.tu ().new_edge<Extends> (now (), i); } catch (Resolve const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "invalid inheritance specification" << endl; throw; } } catch (NotFound const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "no interface with name \'" << name << "\' visible from scope \'" << from << "\'" << endl; } catch (WrongType const&) { cerr << ctx.file () << ":" << id->line () << ": error: " << "incompatible type in inheritance specification" << endl; } catch (NotDefined const& e) { cerr << ctx.file () << ":" << id->line () << ": error: " << "attempt to inherit from forward-declared interface " << e.name () << endl; cerr << ctx.file () << ":" << id->line () << ": error: " << "inheritance from forward-declared interface is illegal" << endl; } catch (AlreadyInherited const& e) { cerr << ctx.file () << ":" << id->line () << ": error: " << "directly inheriting from interface \'" << e.name () << "\' more than once is illegal" << endl; } }