summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2012-05-16 17:06:00 -0700
committerMark Spruiell <mes@zeroc.com>2012-05-16 17:06:00 -0700
commit1c6024e41f697d61b2727dc60c8aa6f62e9f5660 (patch)
treea1fe8e5ff322f02adef32c3edaf48b3d947cd6f0 /cpp/src/Slice/Parser.cpp
parent* Ruby port of sliced/compact/preserved (diff)
downloadice-1c6024e41f697d61b2727dc60c8aa6f62e9f5660.tar.bz2
ice-1c6024e41f697d61b2727dc60c8aa6f62e9f5660.tar.xz
ice-1c6024e41f697d61b2727dc60c8aa6f62e9f5660.zip
parser support for optional data members
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rwxr-xr-xcpp/src/Slice/Parser.cpp90
1 files changed, 79 insertions, 11 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index 96260809ef8..50b1e68101d 100755
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -3043,8 +3043,9 @@ Slice::ClassDef::createOperation(const string& name,
}
DataMemberPtr
-Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultValueType,
- const string& defaultValue, const string& defaultLiteral)
+Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, bool optional, int tag,
+ const SyntaxTreeBasePtr& defaultValueType, const string& defaultValue,
+ const string& defaultLiteral)
{
checkIdentifier(name);
@@ -3186,8 +3187,25 @@ Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, const
}
}
+ if(optional)
+ {
+ //
+ // Validate the tag.
+ //
+ DataMemberList dml = allDataMembers();
+ for(DataMemberList::iterator q = dml.begin(); q != dml.end(); ++q)
+ {
+ if((*q)->optional() && tag == (*q)->tag())
+ {
+ string msg = "tag for optional data member `" + name + "' is already in use";
+ _unit->error(msg);
+ break;
+ }
+ }
+ }
+
_hasDataMembers = true;
- DataMemberPtr member = new DataMember(this, name, type, dlt, dv, dl);
+ DataMemberPtr member = new DataMember(this, name, type, optional, tag, dlt, dv, dl);
_contents.push_back(member);
return member;
}
@@ -3565,8 +3583,9 @@ Slice::Exception::destroy()
}
DataMemberPtr
-Slice::Exception::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultValueType,
- const string& defaultValue, const string& defaultLiteral)
+Slice::Exception::createDataMember(const string& name, const TypePtr& type, bool optional, int tag,
+ const SyntaxTreeBasePtr& defaultValueType, const string& defaultValue,
+ const string& defaultLiteral)
{
checkIdentifier(name);
@@ -3697,7 +3716,24 @@ Slice::Exception::createDataMember(const string& name, const TypePtr& type, cons
}
}
- DataMemberPtr p = new DataMember(this, name, type, dlt, dv, dl);
+ if(optional)
+ {
+ //
+ // Validate the tag.
+ //
+ DataMemberList dml = allDataMembers();
+ for(DataMemberList::iterator q = dml.begin(); q != dml.end(); ++q)
+ {
+ if((*q)->optional() && tag == (*q)->tag())
+ {
+ string msg = "tag for optional data member `" + name + "' is already in use";
+ _unit->error(msg);
+ break;
+ }
+ }
+ }
+
+ DataMemberPtr p = new DataMember(this, name, type, optional, tag, dlt, dv, dl);
_contents.push_back(p);
return p;
}
@@ -3917,8 +3953,9 @@ Slice::Exception::Exception(const ContainerPtr& container, const string& name, c
// ----------------------------------------------------------------------
DataMemberPtr
-Slice::Struct::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultValueType,
- const string& defaultValue, const string& defaultLiteral)
+Slice::Struct::createDataMember(const string& name, const TypePtr& type, bool optional, int tag,
+ const SyntaxTreeBasePtr& defaultValueType, const string& defaultValue,
+ const string& defaultLiteral)
{
checkIdentifier(name);
@@ -4031,7 +4068,24 @@ Slice::Struct::createDataMember(const string& name, const TypePtr& type, const S
}
}
- DataMemberPtr p = new DataMember(this, name, type, dlt, dv, dl);
+ if(optional)
+ {
+ //
+ // Validate the tag.
+ //
+ DataMemberList dml = dataMembers();
+ for(DataMemberList::iterator q = dml.begin(); q != dml.end(); ++q)
+ {
+ if((*q)->optional() && tag == (*q)->tag())
+ {
+ string msg = "tag for optional data member `" + name + "' is already in use";
+ _unit->error(msg);
+ break;
+ }
+ }
+ }
+
+ DataMemberPtr p = new DataMember(this, name, type, optional, tag, dlt, dv, dl);
_contents.push_back(p);
return p;
}
@@ -5160,6 +5214,18 @@ Slice::DataMember::type() const
return _type;
}
+bool
+Slice::DataMember::optional() const
+{
+ return _optional;
+}
+
+int
+Slice::DataMember::tag() const
+{
+ return _tag;
+}
+
string
Slice::DataMember::defaultValue() const
{
@@ -5209,11 +5275,13 @@ Slice::DataMember::visit(ParserVisitor* visitor, bool)
}
Slice::DataMember::DataMember(const ContainerPtr& container, const string& name, const TypePtr& type,
- const SyntaxTreeBasePtr& defaultValueType, const string& defaultValue,
- const string& defaultLiteral) :
+ bool optional, int tag, const SyntaxTreeBasePtr& defaultValueType,
+ const string& defaultValue, const string& defaultLiteral) :
SyntaxTreeBase(container->unit()),
Contained(container, name),
_type(type),
+ _optional(optional),
+ _tag(tag),
_defaultValueType(defaultValueType),
_defaultValue(defaultValue),
_defaultLiteral(defaultLiteral)