summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2019-10-11 00:29:05 +0200
committerJose <jose@zeroc.com>2019-10-11 00:29:05 +0200
commitd462c60b95c9137a9c2abe3caa09501f2b42ecf2 (patch)
tree0207dc50652875aa4bb6269a9fa7f68046dfbb51 /cpp
parentAdd swift to Slice/errorDetection test (diff)
downloadice-d462c60b95c9137a9c2abe3caa09501f2b42ecf2.tar.bz2
ice-d462c60b95c9137a9c2abe3caa09501f2b42ecf2.tar.xz
ice-d462c60b95c9137a9c2abe3caa09501f2b42ecf2.zip
Swift dictionary metadata validation
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/slice2swift/SwiftUtil.cpp50
1 files changed, 49 insertions, 1 deletions
diff --git a/cpp/src/slice2swift/SwiftUtil.cpp b/cpp/src/slice2swift/SwiftUtil.cpp
index 765a1862ea3..4a051020954 100644
--- a/cpp/src/slice2swift/SwiftUtil.cpp
+++ b/cpp/src/slice2swift/SwiftUtil.cpp
@@ -2895,6 +2895,54 @@ SwiftGenerator::MetaDataVisitor::visitSequence(const SequencePtr& p)
void
SwiftGenerator::MetaDataVisitor::visitDictionary(const DictionaryPtr& p)
{
+ const string prefix = "swift:";
+ const DefinitionContextPtr dc = p->unit()->findDefinitionContext(p->file());
+ assert(dc);
+
+ StringList newMetaData = p->keyMetaData();
+ for(StringList::const_iterator q = newMetaData.begin(); q != newMetaData.end();)
+ {
+ string s = *q++;
+ if(s.find(prefix) != 0)
+ {
+ continue;
+ }
+
+ if(p->isLocal() && s.find("swift:type:" == 0))
+ {
+ continue;
+ }
+
+ dc->error(p->file(), p->line(), "invalid metadata `" + s + "' for dictionary key type");
+ }
+
+ newMetaData = p->valueMetaData();
+ TypePtr t = p->valueType();
+ for(StringList::const_iterator q = newMetaData.begin(); q != newMetaData.end();)
+ {
+ string s = *q++;
+ if(s.find(prefix) != 0)
+ {
+ continue;
+ }
+
+ if(p->isLocal() && s.find("swift:type:" == 0))
+ {
+ continue;
+ }
+
+ if(p->isLocal() && s == "swift:nonnull")
+ {
+ if(!isNullableType(t))
+ {
+ dc->error(p->file(), p->line(), "error invalid metadata `" + s + "' for non nullable value type");
+ }
+ continue;
+ }
+
+ dc->error(p->file(), p->line(), "error invalid metadata `" + s + "' for dictionary value type");
+ }
+
p->setMetaData(validate(p, p->getMetaData(), p->file(), p->line(), p->isLocal()));
}
@@ -2924,7 +2972,7 @@ SwiftGenerator::MetaDataVisitor::validate(const SyntaxTreeBasePtr& cont, const S
for(StringList::const_iterator p = newMetaData.begin(); p != newMetaData.end();)
{
string s = *p++;
- if(s.find(prefix) == string::npos)
+ if(s.find(prefix) != 0)
{
continue;
}