diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java index d309ae4bb5a62162fd6c8337bc4babf0f5d8951c..0c22b19100452f40591a4e0506f41d324c310033 100644 --- a/src/main/java/ui/AvatarDesignPanelTranslator.java +++ b/src/main/java/ui/AvatarDesignPanelTranslator.java @@ -195,6 +195,7 @@ public class AvatarDesignPanelTranslator { while (iterator.hasNext()) { tgc = iterator.next(); + if (tgc instanceof AvatarBDPragma) { ErrorAccumulator errorAcc = new ErrorAccumulator(tgc, adp.getAvatarBDPanel()); tgcn = (AvatarBDPragma) tgc; @@ -225,19 +226,22 @@ public class AvatarDesignPanelTranslator { } } } + if (tgc instanceof AvatarBDSafetyPragma) { tgsp = (AvatarBDSafetyPragma) tgc; values = tgsp.getValues(); tgsp.syntaxErrors.clear(); for (String s : values) { - if (checkSafetyPragma(s, _blocks, _as, tgc)) { - _as.addSafetyPragma(s); + // Remove data types from pragma + String prag = removeDataTypesFromPragma(s, _blocks); + if (checkSafetyPragma(prag, _blocks, _as, tgc)) { + _as.addSafetyPragma(prag); } else { - tgsp.syntaxErrors.add(s); - + tgsp.syntaxErrors.add(prag); } } } + if (tgc instanceof AvatarBDPerformancePragma) { tgpp = (AvatarBDPerformancePragma) tgc; values = tgpp.getValues(); @@ -419,6 +423,61 @@ public class AvatarDesignPanelTranslator { } + private String removeDataTypesFromPragma(String _pragma, List<AvatarBDBlock> _blocks) { + // For each data type, and each attribute, check if it is present. IF yes + // replace it with its value. If no value, the default initial value + + // Make all possible String DataType.elt + //TraceManager.addDev("removeDataTypesFromPragma in " + _pragma); + Set<String> dataType = new HashSet<>(); + for(AvatarBDBlock b: _blocks) { + for (TAttribute a : b.getAttributeList()) { + //TraceManager.addDev("Analyzing attribute " + a.getId() + " / type" + a.getType() + " in block " + b.getBlockName()); + if (a.getTypeOther() != null) { + //TraceManager.addDev("Adding type " + a.getType()); + dataType.add(a.getTypeOther()); + } + } + } + + if (dataType.size() == 0) { + //TraceManager.addDev("No Datatype"); + return _pragma; + } + + // At least one DataType + + for(String dt: dataType) { + List<TAttribute> attr = adp.getAvatarBDPanel().getAttributesOfDataType(dt); + if (attr != null) { + //TraceManager.addDev("Found " + attr.size() + " attributes in " + dt); + for (TAttribute t : attr) { + _pragma = removeDataTypesAttrFromPragma(_pragma, dt, t); + } + } + } + + return _pragma; + } + + private String removeDataTypesAttrFromPragma(String _pragma, String _dataType, TAttribute _t) { + String init = _t.getInitialValue(); + if (init == null) { + return _pragma; + } + + String loc = _dataType + "." + _t.getId(); + + // Replace in pragmas loc by its value init + // We must be sure to correctly identify loc + _pragma = AvatarExpressionSolver.replaceVariable(_pragma, loc, init); + + //TraceManager.addDev("PRAGMA: new pragma=" + _pragma); + + return _pragma; + } + + private boolean checkSafetyPragma(String _pragma, List<AvatarBDBlock> _blocks, AvatarSpecification as, TGComponent tgc) { //Todo: check types //Todo: handle complex types diff --git a/src/main/java/ui/TAttribute.java b/src/main/java/ui/TAttribute.java index f9391aa769d84c1601e0bd0a17517a07cbc9e1af..b0157e36c3982ead6f184a747ee69a6ee125db2c 100644 --- a/src/main/java/ui/TAttribute.java +++ b/src/main/java/ui/TAttribute.java @@ -159,6 +159,13 @@ public class TAttribute { (otherType != OTHER || this.typeOther.equals(ta.getTypeOther())); } + public boolean isNotDefault() { + return (getType() != TAttribute.INTEGER) && + (getType() != TAttribute.NATURAL) && + (getType() != TAttribute.BOOLEAN) && + (getType() != TAttribute.TIMER); + } + public void setAccess(int _access) { access = _access; }