From bf52175296d07ad2d115c69d652b1e5999b64b07 Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Sun, 3 Mar 2019 23:31:48 +0100 Subject: [PATCH] create alternative reference resolving NOT setting the opposite directions --- src/main/jastadd/Backend.jadd | 37 ++++++++++++++----- .../org/jastadd/relast/compiler/Compiler.java | 1 + 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd index e6ae314..b079db0 100644 --- a/src/main/jastadd/Backend.jadd +++ b/src/main/jastadd/Backend.jadd @@ -257,7 +257,11 @@ aspect BackendDirectedAPI { sb.append(".get" + nameCapitalized() + "() {\n"); if (resolverHelper) { sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null && get" + getImplAttributeName() + "().unresolved()) {\n"); - sb.append(ind(3) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().asUnresolved().get__token()));\n"); + sb.append(ind(3) + "if (get" + getImplAttributeName() + "().asUnresolved().get__resolve_opposite()) {\n"); + sb.append(ind(4) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().asUnresolved().get__token()));\n"); + sb.append(ind(3) + "} else {\n"); + sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().asUnresolved().get__token()));\n"); + sb.append(ind(3) + "}\n"); sb.append(ind(2) + "}\n"); } sb.append(ind(2) + "return get" + getImplAttributeName() + "();\n"); @@ -391,7 +395,7 @@ aspect BackendBidirectionalAPI { 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(5) + "if (resolvedElement != null && element.asUnresolved().get__resolve_opposite()) {\n"); sb.append(ind(6) + ASTNode.listClass + "<" + toTypeDecl() + "> otherList = resolvedElement.get" + opposite.getImplAttributeName() + "();\n"); sb.append(ind(6) + "if (otherList == null) {\n"); sb.append(ind(7) + "otherList = new ArrayList<>();\n"); @@ -484,15 +488,19 @@ aspect BackendBidirectionalAPI { 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" + opposite.getImplAttributeName() + "();\n"); - sb.append(ind(5) + "if (oldTarget != null && oldTarget != this) {\n"); - sb.append(ind(6) + "oldTarget.get" + getImplAttributeName() + "().remove(resolvedElement);\n"); - sb.append(ind(5) + "}\n"); - sb.append(ind(5) + "if (oldTarget == this) {\n"); - sb.append(ind(6) + "l.remove(i);\n"); - sb.append(ind(6) + "i--;\n"); + sb.append(ind(5) + "if (element.asUnresolved().get__resolve_opposite()) {\n"); + sb.append(ind(6) + toTypeDecl() + " oldTarget = resolvedElement.get" + opposite.getImplAttributeName() + "();\n"); + sb.append(ind(6) + "if (oldTarget != null && oldTarget != this) {\n"); + sb.append(ind(7) + "oldTarget.get" + getImplAttributeName() + "().remove(resolvedElement);\n"); + sb.append(ind(6) + "}\n"); + sb.append(ind(6) + "if (oldTarget == this) {\n"); + sb.append(ind(7) + "l.remove(i);\n"); + sb.append(ind(7) + "i--;\n"); + sb.append(ind(6) + "} else {\n"); + sb.append(ind(7) + "resolvedElement.set" + opposite.getImplAttributeName() + "(this);\n"); + sb.append(ind(7) + "l.set(i, resolvedElement);\n"); + sb.append(ind(6) + "}\n"); sb.append(ind(5) + "} else {\n"); - sb.append(ind(6) + "resolvedElement.set" + opposite.getImplAttributeName() + "(this);\n"); sb.append(ind(6) + "l.set(i, resolvedElement);\n"); sb.append(ind(5) + "}\n"); sb.append(ind(4) + "}\n"); @@ -727,6 +735,7 @@ aspect NameResolutionHelper { sb.append(ind(1) + "public interface __Unresolved {\n"); sb.append(ind(2) + "abstract String get__token();\n"); + sb.append(ind(2) + "abstract boolean get__resolve_opposite();\n"); sb.append(ind(1) + "}\n\n"); for (TypeDecl decl : getTypeDeclList()) { @@ -764,6 +773,14 @@ aspect NameResolutionHelper { sb.append(ind(1) + "public static " + superType + " " + superType + ".createRef(String ref) {\n"); sb.append(ind(2) + instantiableUnresolved.getID() + " unresolvedNode = new " + instantiableUnresolved.getID() + "();\n"); sb.append(ind(2) + "unresolvedNode.set__token(ref);\n"); + sb.append(ind(2) + "unresolvedNode.set__resolve_opposite(true);\n"); + sb.append(ind(2) + "return unresolvedNode;\n"); + sb.append(ind(1) + "}\n"); + + sb.append(ind(1) + "public static " + superType + " " + superType + ".createRefDirection(String ref) {\n"); + sb.append(ind(2) + instantiableUnresolved.getID() + " unresolvedNode = new " + instantiableUnresolved.getID() + "();\n"); + sb.append(ind(2) + "unresolvedNode.set__token(ref);\n"); + sb.append(ind(2) + "unresolvedNode.set__resolve_opposite(false);\n"); sb.append(ind(2) + "return unresolvedNode;\n"); sb.append(ind(1) + "}\n"); } diff --git a/src/main/java/org/jastadd/relast/compiler/Compiler.java b/src/main/java/org/jastadd/relast/compiler/Compiler.java index ab8b0b5..135a34b 100644 --- a/src/main/java/org/jastadd/relast/compiler/Compiler.java +++ b/src/main/java/org/jastadd/relast/compiler/Compiler.java @@ -59,6 +59,7 @@ public class Compiler { unresolvedDecl.setAbstract(typeDecl.getAbstract()); unresolvedDecl.setSuper(new SimpleTypeUse(typeDecl.getID())); unresolvedDecl.addComponent(new TokenComponent("__token", new SimpleTypeUse("String"))); + unresolvedDecl.addComponent(new TokenComponent("__resolve_opposite", new SimpleTypeUse("boolean"))); p.addTypeDecl(unresolvedDecl); unresolvedDecls.add(unresolvedDecl); } -- GitLab