|
|
@@ -29,7 +29,7 @@ private:
|
|
|
|
|
|
std::map<detail::RootReference, A> roots_;
|
|
|
|
|
|
- detail::ContextStack<detail::Anchor, detail::Reference> active_dynamic_anchors_;
|
|
|
+ detail::ContextStack<URI, detail::Anchor, detail::Reference> active_dynamic_anchors_;
|
|
|
std::map<URI, std::map<detail::Anchor, detail::Reference>> dynamic_anchors_;
|
|
|
|
|
|
public:
|
|
|
@@ -42,7 +42,7 @@ public:
|
|
|
auto dynamic_scope(detail::Reference const & ref) {
|
|
|
URI const uri =
|
|
|
ref.pointer().empty() ? ref.uri() : references_.relative_to_nearest_anchor(ref).uri();
|
|
|
- return active_dynamic_anchors_.scope(dynamic_anchors_[uri]);
|
|
|
+ return active_dynamic_anchors_.scope(uri, dynamic_anchors_[uri]);
|
|
|
}
|
|
|
|
|
|
std::optional<A> load(detail::Reference const & ref, detail::ParserContext<A> const & context) {
|
|
|
@@ -70,24 +70,7 @@ public:
|
|
|
|
|
|
detail::Reference canonicalize(detail::Reference const & ref, detail::Reference const & parent,
|
|
|
detail::inout<bool> dynamic_reference) const {
|
|
|
- if (std::optional dynamic = active_dynamic_anchors_.lookup(ref.anchor())) {
|
|
|
- if (dynamic_reference) {
|
|
|
- return *dynamic;
|
|
|
- }
|
|
|
- dynamic_reference = ref.uri().empty() && ref.pointer().empty();
|
|
|
- }
|
|
|
-
|
|
|
- if (active_dynamic_anchors_.empty()) {
|
|
|
- dynamic_reference = true;
|
|
|
- }
|
|
|
-
|
|
|
- // Relative URI, not in the HEREDOC (or we set an $id)
|
|
|
- if (ref.uri().empty() and ref.anchor().empty()) {
|
|
|
- return detail::Reference(references_.relative_to_nearest_anchor(parent).root(),
|
|
|
- ref.pointer());
|
|
|
- }
|
|
|
-
|
|
|
- URI uri = [this, &ref, &parent]() {
|
|
|
+ URI const uri = [this, &ref, &parent]() {
|
|
|
if (ref.uri().empty() && parent.uri().empty()) {
|
|
|
return references_.actual_parent_uri(parent);
|
|
|
}
|
|
|
@@ -110,11 +93,25 @@ public:
|
|
|
return base.parent() / uri;
|
|
|
}();
|
|
|
|
|
|
- detail::Reference rval(uri, ref.anchor(), ref.pointer());
|
|
|
+ URI const dyn_uri = ref.uri().empty() ? ref.uri() : uri;
|
|
|
+ if (std::optional dynamic = active_dynamic_anchors_.lookup(dyn_uri, ref.anchor())) {
|
|
|
+ if (dynamic_reference) {
|
|
|
+ return *dynamic;
|
|
|
+ }
|
|
|
+ dynamic_reference = ref.uri().empty() && ref.pointer().empty();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (active_dynamic_anchors_.empty()) {
|
|
|
+ dynamic_reference = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Relative URI, not in the HEREDOC (or we set an $id)
|
|
|
+ if (ref.uri().empty() and ref.anchor().empty()) {
|
|
|
+ return detail::Reference(references_.relative_to_nearest_anchor(parent).root(),
|
|
|
+ ref.pointer());
|
|
|
+ }
|
|
|
|
|
|
- // Will now need to go make an external fetch...
|
|
|
- // TODO(samjaffe): Make that process internal?
|
|
|
- return rval;
|
|
|
+ return detail::Reference(uri, ref.anchor(), ref.pointer());
|
|
|
}
|
|
|
|
|
|
private:
|