From 9e256ef7e77cb8fe6c9488760155a213e8f339b7 Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Sat, 2 Mar 2019 15:50:34 +0100 Subject: [PATCH] only trigger change if something has actually been resolved. fixes issue #5 --- src/main/jastadd/Backend.jadd | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd index b285919..bfff3b3 100644 --- a/src/main/jastadd/Backend.jadd +++ b/src/main/jastadd/Backend.jadd @@ -200,14 +200,18 @@ aspect BackendDirectedAPI { // resolve the entire list if (resolverHelper) { sb.append(ind(2) + "if (l != null) {\n"); + sb.append(ind(3) + "boolean changed = false;\n"); sb.append(ind(3) + "for (int i = 0; i < l.size(); i++) {\n"); sb.append(ind(4) + ofTypeDecl() + " element = l.get(i);\n"); sb.append(ind(4) + "if (element.unresolved()) {\n"); + sb.append(ind(5) + "changed = true;\n"); sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.asUnresolved().get__token(), i);\n"); sb.append(ind(5) + "l.set(i, resolvedElement);\n"); sb.append(ind(4) + "}\n"); sb.append(ind(3) + "}\n"); - sb.append(ind(3) + "set" + getImplAttributeName() + "(l);\n"); + sb.append(ind(3) + "if (changed) {\n"); + sb.append(ind(4) + "set" + getImplAttributeName() + "(l);\n"); + sb.append(ind(3) + "}\n"); sb.append(ind(2) + "}\n"); } sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n"); @@ -368,9 +372,11 @@ aspect BackendBidirectionalAPI { // resolve the entire list if (resolverHelper) { sb.append(ind(2) + "if (l != null) {\n"); + sb.append(ind(3) + "boolean changed = false;\n"); sb.append(ind(3) + "for (int i = 0; i < l.size(); i++) {\n"); sb.append(ind(4) + ofTypeDecl() + " element = l.get(i);\n"); sb.append(ind(4) + "if (element.unresolved()) {\n"); + sb.append(ind(5) + "changed = true;\n"); sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.asUnresolved().get__token(), i);\n"); sb.append(ind(5) + "if (resolvedElement != null) {\n"); sb.append(ind(6) + ASTNode.listClass + "<" + toTypeDecl() + "> otherList = resolvedElement.get" + getImplAttributeName() + "();\n"); @@ -383,7 +389,9 @@ aspect BackendBidirectionalAPI { sb.append(ind(5) + "l.set(i, resolvedElement);\n"); sb.append(ind(4) + "}\n"); sb.append(ind(3) + "}\n"); - sb.append(ind(3) + "set" + getImplAttributeName() + "(l);\n"); + sb.append(ind(3) + "if (changed) {\n"); + sb.append(ind(4) + "set" + getImplAttributeName() + "(l);\n"); + sb.append(ind(3) + "}\n"); sb.append(ind(2) + "}\n"); } sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n"); @@ -439,9 +447,11 @@ aspect BackendBidirectionalAPI { // resolve the entire list if (resolverHelper) { sb.append(ind(2) + "if (l != null) {\n"); + sb.append(ind(3) + "boolean changed = false;\n"); sb.append(ind(3) + "for (int i = 0; i < l.size(); i++) {\n"); sb.append(ind(4) + ofTypeDecl() + " element = l.get(i);\n"); sb.append(ind(4) + "if (element.unresolved()) {\n"); + sb.append(ind(5) + "changed = true;\n"); sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.asUnresolved().get__token(), i);\n"); sb.append(ind(5) + toTypeDecl() + " oldTarget = resolvedElement.get" + getImplAttributeName() + "();\n"); sb.append(ind(5) + "if (oldTarget != null && oldTarget != this) {\n"); @@ -456,7 +466,9 @@ aspect BackendBidirectionalAPI { sb.append(ind(5) + "}\n"); sb.append(ind(4) + "}\n"); sb.append(ind(3) + "}\n"); - sb.append(ind(3) + "set" + getImplAttributeName() + "(l);\n"); + sb.append(ind(3) + "if (changed) {\n"); + sb.append(ind(4) + "set" + getImplAttributeName() + "(l);\n"); + sb.append(ind(3) + "}\n"); sb.append(ind(2) + "}\n"); } sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n"); -- GitLab