diff --git a/jastadd-mquat-base/src/main/jastadd/Navigation.jrag b/jastadd-mquat-base/src/main/jastadd/Navigation.jrag index 5d48f248a2a948fd960ff4fa5b833cf96357f024..eff092df9c48c9984fa46fb48d1fc1e5c55b0887 100644 --- a/jastadd-mquat-base/src/main/jastadd/Navigation.jrag +++ b/jastadd-mquat-base/src/main/jastadd/Navigation.jrag @@ -189,7 +189,7 @@ aspect Navigation { return Optional.of(instance); } } - return Optional.empty(); + return getResourceRequirement().resolveInstance(name); } syn Optional<Instance> ResourceRequirement.resolveInstance(String name) { @@ -281,27 +281,41 @@ aspect Navigation { } } } - // if no component instance has been found, look for a resource instance ResourceRequirement currentRequirement = null; Instance currentInstance = null; + + // first resolve the instance + Optional<Instance> hwInstance; + // resolve all names but the last (which is a property) for (int currentName = 0; currentName < qn.getNumName() - 1; currentName++) { if (currentRequirement == null) { - currentRequirement = getResourceRequirement(); - // TODO this has to be extended if the one resource requirement there is has more than one instance - currentInstance = getResourceRequirement().getInstance(0); + hwInstance = resolveInstance(instanceName); + if (!hwInstance.isPresent()) { + // instance can not be resolved -> bad + logger.error("Could not resolve first instance {}", instanceName); + return null; + } + currentInstance = hwInstance.get(); + currentRequirement = currentInstance.containingResourceRequirement(); } else { - for (ResourceRequirement newResourceRequirement : currentRequirement.getResourceRequirementList()) - for (Instance instance : newResourceRequirement.getInstanceList()) { - if (instance.name().equals(qn.getName(currentName).getName())) { - currentRequirement = newResourceRequirement; - currentInstance = instance; - } - } + hwInstance = currentRequirement.resolveInstance(qn.getName(currentName).getName()); + if (!hwInstance.isPresent()) { + // instance can not be resolved -> bad + logger.error("Could not resolve {}th instance {}", currentName, qn.getName(currentName).getName()); + return null; + } + currentInstance = hwInstance.get(); + currentRequirement = currentInstance.containingResourceRequirement(); } } // now, currentRequirement refers to the final resource type - return new PropertyResourceDesignator(currentInstance.createRef(), currentRequirement.getResourceTypeRef().getRef().resolveProperty(qn.getName(qn.getNumName()-1).getName()).get().createRef()); + Optional<Property> resolvedProperty = currentRequirement.getResourceTypeRef().getRef().resolveProperty(qn.getName(qn.getNumName() - 1).getName()); + if (resolvedProperty.isPresent()) { + return new PropertyResourceDesignator(currentInstance.createRef(), resolvedProperty.get().createRef()); + } + logger.error("Could not resolve property {}", qn); + return null; } }