summaryrefslogtreecommitdiff
path: root/src/core/model/Domain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/model/Domain.cpp')
-rw-r--r--src/core/model/Domain.cpp54
1 files changed, 42 insertions, 12 deletions
diff --git a/src/core/model/Domain.cpp b/src/core/model/Domain.cpp
index 55f05b3..20a9d42 100644
--- a/src/core/model/Domain.cpp
+++ b/src/core/model/Domain.cpp
@@ -153,9 +153,22 @@ bool Descriptor::doValidate(Logger &logger) const
} else {
valid = valid & validateName(logger);
}
+ // ensure that no attribute with the key "name" exists.
+ if (attributesDescriptor == nullptr) {
+ logger.error("This Descriptor has no Attribute specification!");
+ valid = false;
+ } else {
+ if (attributesDescriptor->hasAttribute("name")) {
+ logger.error(
+ "This Descriptor has an attribute \"name\" which is a reserved "
+ "word!");
+ valid = false;
+ }
+ valid = valid & attributesDescriptor->validate(logger);
+ }
+
// check attributes and the FieldDescriptors
- return valid & attributesDescriptor->validate(logger) &
- continueValidationCheckDuplicates(fieldDescriptors, logger);
+ return valid & continueValidationCheckDuplicates(fieldDescriptors, logger);
}
std::vector<Rooted<Node>> Descriptor::pathTo(
@@ -179,13 +192,7 @@ bool Descriptor::continuePath(Handle<StructuredClass> target,
std::vector<Rooted<Node>> optimum;
// use recursive depth-first search from the top to reach the given child
// get the list of effective FieldDescriptors.
- NodeVector<FieldDescriptor> fields;
- if (isa(&RttiTypes::StructuredClass)) {
- const StructuredClass *tis = static_cast<const StructuredClass *>(this);
- fields = tis->getEffectiveFieldDescriptors();
- } else {
- fields = getFieldDescriptors();
- }
+ NodeVector<FieldDescriptor> fields = getFieldDescriptors();
for (auto &fd : fields) {
for (auto &c : fd->getChildren()) {
@@ -234,6 +241,30 @@ bool Descriptor::continuePath(Handle<StructuredClass> target,
return found;
}
+ssize_t Descriptor::getFieldDescriptorIndex(const std::string &name) const
+{
+ size_t f = 0;
+ for (auto &fd : getFieldDescriptors()) {
+ if (fd->getName() == name) {
+ return f;
+ }
+ f++;
+ }
+ return -1;
+}
+
+ssize_t Descriptor::getFieldDescriptorIndex(Handle<FieldDescriptor> fd) const
+{
+ size_t f = 0;
+ for (auto &fd2 : getFieldDescriptors()) {
+ if (fd == fd2) {
+ return f;
+ }
+ f++;
+ }
+ return -1;
+}
+
void Descriptor::addFieldDescriptor(Handle<FieldDescriptor> fd)
{
// only add it if we need to.
@@ -444,14 +475,13 @@ const void StructuredClass::gatherFieldDescriptors(
}
}
-NodeVector<FieldDescriptor> StructuredClass::getEffectiveFieldDescriptors()
- const
+NodeVector<FieldDescriptor> StructuredClass::getFieldDescriptors() const
{
// in this case we return a NodeVector of Rooted entries without owner.
NodeVector<FieldDescriptor> vec;
std::set<std::string> overriddenFields;
gatherFieldDescriptors(vec, overriddenFields);
- return std::move(vec);
+ return vec;
}
/* Class AnnotationClass */