diff options
author | Jose <jose@zeroc.com> | 2019-10-11 00:29:05 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2019-10-11 00:29:05 +0200 |
commit | d462c60b95c9137a9c2abe3caa09501f2b42ecf2 (patch) | |
tree | 0207dc50652875aa4bb6269a9fa7f68046dfbb51 /cpp | |
parent | Add swift to Slice/errorDetection test (diff) | |
download | ice-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.cpp | 50 |
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; } |