Skip to content

Commit

Permalink
Moved the validation over to the proper validator.
Browse files Browse the repository at this point in the history
  • Loading branch information
InsertCreativityHere committed Feb 10, 2025
1 parent 50e2eb5 commit d9122e6
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 170 deletions.
1 change: 1 addition & 0 deletions cpp/src/slice2swift/Gen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ void
Gen::generate(const UnitPtr& p)
{
SwiftGenerator::validateMetadata(p);
SwiftGenerator::validateSwiftModuleMappings(p);

ImportVisitor importVisitor(_out);
p->visit(&importVisitor);
Expand Down
185 changes: 36 additions & 149 deletions cpp/src/slice2swift/SwiftUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
//

#include "SwiftUtil.h"
#include "../Slice/MetadataValidation.h"
#include "../Ice/OutputUtil.h"
#include "../Slice/Util.h"

Expand Down Expand Up @@ -615,8 +616,41 @@ SwiftGenerator::writeServantDocSummary(IceInternal::Output& out, const Interface
void
SwiftGenerator::validateMetadata(const UnitPtr& u)
{
MetadataVisitor visitor;
u->visit(&visitor);
map<string, MetadataInfo> knownMetadata;

// "swift:attribute"
MetadataInfo attributeInfo = {
.validOn = {typeid(ClassDecl), typeid(Struct), typeid(Slice::Exception), typeid(Enum)},
.acceptedArgumentKind = MetadataArgumentKind::RequiredTextArgument,
.mustBeUnique = false,
};
knownMetadata.emplace("swift:attribute", attributeInfo);

// "swift:class-resolver-prefix"
MetadataInfo classResolverPrefixInfo = {
.validOn = {typeid(Unit)},
.acceptedArgumentKind = MetadataArgumentKind::SingleArgument,
};
knownMetadata.emplace("swift:class-resolver-prefix", classResolverPrefixInfo);

// "swift:inherits"
MetadataInfo inheritsInfo = {
.validOn = {typeid(InterfaceDecl)},
.acceptedArgumentKind = MetadataArgumentKind::RequiredTextArgument,
.mustBeUnique = false,
};
knownMetadata.emplace("swift:inherits", inheritsInfo);

// "swift:module"
MetadataInfo moduleInfo = {
.validOn = {typeid(Module)},
// Even though it's really 'module:prefix' the validator sees this as a single argument since there's no commas.
.acceptedArgumentKind = MetadataArgumentKind::SingleArgument,
};
knownMetadata.emplace("swift:module", moduleInfo);

// Pass this information off to the parser's metadata validation logic.
Slice::validateMetadata(u, "swift", knownMetadata);
}

void
Expand Down Expand Up @@ -1328,13 +1362,6 @@ SwiftGenerator::writeMarshalUnmarshalCode(
}
}

bool
SwiftGenerator::MetadataVisitor::visitModuleStart(const ModulePtr& p)
{
p->setMetadata(validate(p, p));
return true;
}

string
SwiftGenerator::paramLabel(const string& param, const ParameterList& params)
{
Expand Down Expand Up @@ -2016,143 +2043,3 @@ SwiftGenerator::writeDispatchOperation(::IceInternal::Output& out, const Operati

out << eb;
}

bool
SwiftGenerator::MetadataVisitor::visitClassDefStart(const ClassDefPtr& p)
{
p->setMetadata(validate(p, p));
for (const auto& member : p->dataMembers())
{
// TODO we should probably be passing `member` instead of `member->type()`.
// Otherwise I'm pretty sure we're just skipping the data-member metadata.
member->setMetadata(validate(member->type(), member));
}
return true;
}

bool
SwiftGenerator::MetadataVisitor::visitInterfaceDefStart(const InterfaceDefPtr& p)
{
p->setMetadata(validate(p, p));
return true;
}

void
SwiftGenerator::MetadataVisitor::visitOperation(const OperationPtr& p)
{
p->setMetadata(validate(p, p));
for (const auto& param : p->parameters())
{
param->setMetadata(validate(param->type(), param));
}
}

bool
SwiftGenerator::MetadataVisitor::visitExceptionStart(const ExceptionPtr& p)
{
p->setMetadata(validate(p, p));
for (const auto& member : p->dataMembers())
{
member->setMetadata(validate(member->type(), member));
}
return true;
}

bool
SwiftGenerator::MetadataVisitor::visitStructStart(const StructPtr& p)
{
p->setMetadata(validate(p, p));
for (const auto& member : p->dataMembers())
{
member->setMetadata(validate(member->type(), member));
}
return true;
}

void
SwiftGenerator::MetadataVisitor::visitSequence(const SequencePtr& p)
{
p->setMetadata(validate(p, p));
}

void
SwiftGenerator::MetadataVisitor::visitDictionary(const DictionaryPtr& p)
{
const string prefix = "swift:";

for (const auto& metadata : p->keyMetadata())
{
if (metadata->directive().find(prefix) == 0)
{
ostringstream msg;
msg << "ignoring invalid metadata '" << *metadata << "' for dictionary key type";
p->unit()->warning(metadata->file(), metadata->line(), InvalidMetadata, msg.str());
}
}

for (const auto& metadata : p->valueMetadata())
{
if (metadata->directive().find(prefix) == 0)
{
ostringstream msg;
msg << "ignoring invalid metadata '" << *metadata << "' for dictionary value type";
p->unit()->warning(metadata->file(), metadata->line(), InvalidMetadata, msg.str());
}
}

p->setMetadata(validate(p, p));
}

void
SwiftGenerator::MetadataVisitor::visitEnum(const EnumPtr& p)
{
p->setMetadata(validate(p, p));
}

void
SwiftGenerator::MetadataVisitor::visitConst(const ConstPtr& p)
{
p->setMetadata(validate(p, p));
}

MetadataList
SwiftGenerator::MetadataVisitor::validate(const SyntaxTreeBasePtr& p, const ContainedPtr& cont)
{
MetadataList newMetadata = cont->getMetadata();

for (auto m = newMetadata.begin(); m != newMetadata.end();)
{
MetadataPtr meta = *m++;
string_view directive = meta->directive();
string_view arguments = meta->arguments();

if (directive.find("swift:") != 0)
{
continue;
}

if (dynamic_pointer_cast<Module>(p) && directive == "swift:module" && !arguments.empty())
{
continue;
}

if (dynamic_pointer_cast<InterfaceDecl>(p) && directive == "swift:inherits" && !arguments.empty())
{
continue;
}

if ((dynamic_pointer_cast<ClassDecl>(p) || dynamic_pointer_cast<Struct>(p) || dynamic_pointer_cast<Enum>(p) ||
dynamic_pointer_cast<Exception>(p)) &&
directive == "swift:attribute" && !arguments.empty())
{
continue;
}

ostringstream msg;
msg << "ignoring invalid metadata '" << *meta << "'";
p->unit()->warning(meta->file(), meta->line(), InvalidMetadata, msg.str());
newMetadata.remove(meta);
continue;
}
return newMetadata;
}
21 changes: 0 additions & 21 deletions cpp/src/slice2swift/SwiftUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,27 +123,6 @@ namespace Slice
void writeSwiftAttributes(::IceInternal::Output&, const MetadataList&);
void writeProxyOperation(::IceInternal::Output&, const OperationPtr&);
void writeDispatchOperation(::IceInternal::Output&, const OperationPtr&);

private:
class MetadataVisitor final : public ParserVisitor
{
public:
bool visitModuleStart(const ModulePtr&) final;
bool visitClassDefStart(const ClassDefPtr&) final;
bool visitInterfaceDefStart(const InterfaceDefPtr&) final;
void visitOperation(const OperationPtr&) final;
bool visitExceptionStart(const ExceptionPtr&) final;
bool visitStructStart(const StructPtr&) final;
void visitSequence(const SequencePtr&) final;
void visitDictionary(const DictionaryPtr&) final;
void visitEnum(const EnumPtr&) final;
void visitConst(const ConstPtr&) final;

[[nodiscard]] bool shouldVisitIncludedDefinitions() const final { return true; }

private:
MetadataList validate(const SyntaxTreeBasePtr&, const ContainedPtr&);
};
};
}

Expand Down

0 comments on commit d9122e6

Please sign in to comment.