summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2001-07-10 19:50:49 +0000
committerMarc Laukien <marc@zeroc.com>2001-07-10 19:50:49 +0000
commitaadefbf05157f6e2626e7f25241319b4aa010925 (patch)
tree37f9f19b574351656c8b799fb2776716a9aaf82d /cpp/src/Slice/Parser.cpp
parentmore tests (diff)
downloadice-aadefbf05157f6e2626e7f25241319b4aa010925.tar.bz2
ice-aadefbf05157f6e2626e7f25241319b4aa010925.tar.xz
ice-aadefbf05157f6e2626e7f25241319b4aa010925.zip
more interface stuff
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rw-r--r--cpp/src/Slice/Parser.cpp67
1 files changed, 39 insertions, 28 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index 20607748105..590ee475113 100644
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -213,11 +213,8 @@ Slice::Container::createModule(const string& name)
}
ClassDef_ptr
-Slice::Container::createClassDef(const string& name,
- const ClassDef_ptr& base,
- const ClassList& interfaces,
- bool local,
- bool intf)
+Slice::Container::createClassDef(const string& name, bool local, bool intf,
+ const ClassList& bases)
{
list<Contained_ptr> matches = unit_ -> findContents(thisScope() + name);
for(list<Contained_ptr>::iterator p = matches.begin();
@@ -226,7 +223,7 @@ Slice::Container::createClassDef(const string& name,
{
ClassDecl_ptr cl = ClassDecl_ptr::dynamicCast(*p);
if(cl)
- continue; // TODO: Check whether local matches
+ continue; // TODO: Check whether local and interface matches
if(unit_ -> ignRedefs())
{
@@ -238,8 +235,7 @@ Slice::Container::createClassDef(const string& name,
assert(false); // TODO: Already exists and not a class declaration
}
- ClassDef_ptr def = new ClassDef(this, name, base, interfaces,
- local, intf);
+ ClassDef_ptr def = new ClassDef(this, name, local, intf, bases);
contents_.push_back(def);
for(list<Contained_ptr>::iterator q = matches.begin();
@@ -275,12 +271,12 @@ Slice::Container::createClassDecl(const string& name, bool local, bool intf)
{
assert(!def);
def = clDef;
- continue; // TODO: Check whether local matches
+ continue; // TODO: Check whether local and interface matches
}
ClassDecl_ptr clDecl = ClassDecl_ptr::dynamicCast(*p);
if(clDecl)
- continue; // TODO: Check whether local matches
+ continue; // TODO: Check whether local and interface matches
// TODO: Already defined as something other than a class
assert(false);
@@ -305,7 +301,7 @@ Slice::Container::createClassDecl(const string& name, bool local, bool intf)
}
}
- ClassDecl_ptr cl = new ClassDecl(this, name, local, false);
+ ClassDecl_ptr cl = new ClassDecl(this, name, local, intf);
contents_.push_back(cl);
if(def)
@@ -697,7 +693,7 @@ Slice::ClassDecl::ClassDecl(const Container_ptr& container,
void
Slice::ClassDef::destroy()
{
- base_ = 0;
+ bases_.empty();
Container::destroy();
}
@@ -750,16 +746,27 @@ Slice::ClassDef::createDataMember(const string& name, const Type_ptr& type)
return p;
}
-ClassDef_ptr
-Slice::ClassDef::base()
+ClassList
+Slice::ClassDef::bases()
{
- return base_;
+ return bases_;
}
ClassList
-Slice::ClassDef::interfaces()
+Slice::ClassDef::allBases()
{
- return interfaces_;
+ ClassList result = bases_;
+ result.sort();
+ result.unique();
+ for(ClassList::iterator p = bases_.begin();
+ p != bases_.end();
+ ++p)
+ {
+ ClassList li = (*p) -> allBases();
+ result.merge(li);
+ result.unique();
+ }
+ return result;
}
list<Operation_ptr>
@@ -795,7 +802,10 @@ Slice::ClassDef::dataMembers()
bool
Slice::ClassDef::isAbstract()
{
- if(base_ && base_ -> isAbstract())
+ if(isInterface())
+ return true;
+
+ if(!bases_.empty() && bases_.front() -> isAbstract())
return true;
for(list<Contained_ptr>::const_iterator p = contents_.begin();
@@ -840,25 +850,26 @@ Slice::ClassDef::visit(ParserVisitor* visitor)
Slice::ClassDef::ClassDef(const Container_ptr& container,
const string& name,
- const ClassDef_ptr& base,
- const ClassList& interfaces,
bool local,
- bool intf)
+ bool intf,
+ const ClassList& bases)
: Contained(container, name),
Container(container -> unit()),
SyntaxTreeBase(container -> unit()),
- base_(base),
- interfaces_(interfaces),
local_(local),
- interface_(intf)
+ interface_(intf),
+ bases_(bases)
{
- assert(!base_ || !base_ -> isInterface());
+ //
+ // First element of bases may be a class, all others must be
+ // interfaces
+ //
#ifndef NDEBUG
- for(ClassList::iterator p = interfaces_.begin();
- p != interfaces_.end();
+ for(ClassList::iterator p = bases_.begin();
+ p != bases_.end();
++p)
{
- assert((*p) -> isInterface());
+ assert(p == bases_.begin() || (*p) -> isInterface());
}
#endif
}