use of com.nedap.archie.base.MultiplicityInterval in project archetype-languageserver by nedap.
the class ArchetypeHoverInfo method extractHoverInfo.
private void extractHoverInfo(DocumentInformation documentInformation, CAttribute attribute, Archetype archetypeForTerms) {
for (CObject object : attribute.getChildren()) {
try {
if (object instanceof CComplexObject) {
extractHoverInfo(documentInformation, (CComplexObject) object, archetypeForTerms);
} else if (object instanceof CTerminologyCode) {
extractHoverInfo(documentInformation, (CTerminologyCode) object, archetypeForTerms);
} else if (object instanceof ArchetypeSlot) {
getHoverInfoForCObject(documentInformation, object, archetypeForTerms);
}
// for the other primitives, hovers should not be important
} catch (Exception e) {
// If this fails, fine, continue with the rest of the file!
// TODO: report to client?
e.printStackTrace();
}
}
try {
CAttribute flatAttribute = archetypeForTerms.itemAtPath(attribute.getPath());
if (flatAttribute == null) {
flatAttribute = attribute;
}
Cardinality cardinality = null;
MultiplicityInterval existence = null;
// TODO: do a proper path lookup through the RM model?
CAttribute defaults = new BMMConstraintImposer(metaModels.getSelectedBmmModel()).getDefaultAttribute(flatAttribute.getParent().getRmTypeName(), flatAttribute.getRmAttributeName());
if (flatAttribute.getCardinality() != null) {
cardinality = flatAttribute.getCardinality();
} else {
if (defaults != null) {
cardinality = defaults.getCardinality();
}
}
if (flatAttribute.getExistence() != null) {
existence = flatAttribute.getExistence();
} else {
if (defaults != null) {
existence = flatAttribute.getExistence();
}
}
boolean multiple = flatAttribute.isMultiple();
StringBuilder content = new StringBuilder();
if (cardinality != null) {
content.append("Cardinality: ");
content.append(cardinality.toString());
}
if (existence != null) {
content.append(", existence: " + existence.toString());
}
content.append(multiple ? "\n multiple valued attribute" : "\n single valued attribute");
BmmClass classDefinition = metaModels.getSelectedBmmModel().getClassDefinition(flatAttribute.getParent().getRmTypeName());
if (classDefinition != null) {
BmmProperty bmmProperty = classDefinition.getFlatProperties().get(flatAttribute.getRmAttributeName());
if (bmmProperty != null) {
content.append("\n\nRM type name: *" + bmmProperty.getType().toDisplayString() + "*");
}
}
content.append("\n\n path: " + attribute.getPath());
Hover hover = new Hover();
hover.setContents(new MarkupContent(MARKDOWN, content.toString()));
Range range = getHoverRange(documentInformation, attribute);
if (range != null) {
hoverRanges.addRange(range, hover);
}
} catch (Exception e) {
// TODO: report to client?
e.printStackTrace();
}
}
use of com.nedap.archie.base.MultiplicityInterval in project archetype-languageserver by nedap.
the class ArchetypeHoverInfo method getHoverInfoForCObject.
private void getHoverInfoForCObject(DocumentInformation documentInformation, CObject definition, Archetype archetypeForTerms) {
ArchetypeTerm term = archetypeForTerms.getTerm(definition, language);
String content;
if (term != null) {
content = "### " + definition.getRmTypeName() + ": " + term.getText() + "\n\n\t" + term.getDescription();
} else {
content = "### No term found";
}
CObject flattenedObject = (definition instanceof CPrimitiveObject) ? definition : archetypeForTerms.itemAtPath(definition.getPath());
if (flattenedObject == null) {
// fallback if something went wrong
flattenedObject = definition;
}
MultiplicityInterval occurrences = flattenedObject.effectiveOccurrences(metaModels::referenceModelPropMultiplicity);
content += "\n occurrences: " + occurrences;
content += "\n\n path: " + definition.getPath();
Hover hover = new Hover();
hover.setContents(new MarkupContent(MARKDOWN, content.toString()));
Range range = getHoverRange(documentInformation, definition);
if (range != null) {
hoverRanges.addRange(range, hover);
}
}
Aggregations