diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd index 87e74b97f14952b4a7abe3492ca498a1b4642b2c..1425ec6c2aa96282f66b006a259bc3537a058e40 100644 --- a/src/main/jastadd/Backend.jadd +++ b/src/main/jastadd/Backend.jadd @@ -114,6 +114,16 @@ aspect BackendAbstractGrammar { public String RelationComponent.getImplAttributeName() { return "_impl_" + getID(); } + + public String RelationComponent.getImplAttributeField() { + // tt.bind("TypeInSignature", ASTNode.convTypeNameToSignature(type())); + return "token" + ofTypeDecl() + "__impl_" + getID(); + } + + public String ManyRelationComponent.getImplAttributeField() { + // tt.bind("TypeInSignature", ASTNode.convTypeNameToSignature(type())); + return "token" + listClass + "_" + ofTypeDecl() + "___impl_" + getID(); + } } aspect BackendAspect { @@ -274,7 +284,7 @@ aspect BackendDirectedAPI { } sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list == null) {\n"); sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); @@ -289,7 +299,7 @@ aspect BackendDirectedAPI { } sb.append(nameCapitalized() + "(int index, " + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list == null) {\n"); sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); @@ -304,7 +314,7 @@ aspect BackendDirectedAPI { } sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list != null && list.remove(o)) {\n"); sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n"); sb.append(ind(2) + "}\n"); @@ -320,11 +330,11 @@ aspect BackendDirectedAPI { } sb.append("() {\n"); if (resolverHelper | serializer) { - sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null && get" + getImplAttributeName() + "().is$Unresolved()) {\n"); - sb.append(ind(3) + "if (get" + getImplAttributeName() + "().as$Unresolved().getUnresolved$ResolveOpposite()) {\n"); - sb.append(ind(4) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().as$Unresolved().getUnresolved$Token()));\n"); + sb.append(ind(2) + "if (" + getImplAttributeField() + " != null && " + getImplAttributeField() + ".is$Unresolved()) {\n"); + sb.append(ind(3) + "if (" + getImplAttributeField() + ".as$Unresolved().getUnresolved$ResolveOpposite()) {\n"); + sb.append(ind(4) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(" + getImplAttributeField() + ".as$Unresolved().getUnresolved$Token()));\n"); sb.append(ind(3) + "} else {\n"); - sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().as$Unresolved().getUnresolved$Token()));\n"); + sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + "ByToken(" + getImplAttributeField() + ".as$Unresolved().getUnresolved$Token()));\n"); sb.append(ind(3) + "}\n"); sb.append(ind(2) + "}\n"); } @@ -405,15 +415,15 @@ aspect BackendBidirectionalAPI { sb.append(ind(2) + "assertNotNull(o);\n"); } // unset the old opposite - sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null) {\n"); - sb.append(ind(3) + "get" + getImplAttributeName() + "().set" + otherSide().getImplAttributeName() + "(null);\n"); + sb.append(ind(2) + "if (" + getImplAttributeField() + " != null) {\n"); + sb.append(ind(3) + "" + getImplAttributeField() + ".set" + otherSide().getImplAttributeName() + "(null);\n"); sb.append(ind(2) + "}\n"); if (resolverHelper | serializer) { - sb.append(ind(2) + "if (o != null && !o.is$Unresolved() && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); + sb.append(ind(2) + "if (o != null && !o.is$Unresolved() && o." + otherSide().getImplAttributeField() + " != null) {\n"); } else { - sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); + sb.append(ind(2) + "if (o != null && o." + otherSide().getImplAttributeField() + " != null) {\n"); } - sb.append(ind(3) + "o.get" + otherSide().getImplAttributeName() + "().set" + getImplAttributeName() + "(null);\n"); + sb.append(ind(3) + "o." + otherSide().getImplAttributeField() + ".set" + getImplAttributeName() + "(null);\n"); sb.append(ind(2) + "}\n"); sb.append(ind(2) + "set" + getImplAttributeName() + "(o);\n"); if (resolverHelper | serializer) { @@ -470,7 +480,7 @@ aspect BackendBidirectionalAPI { sb.append(ind(5) + "changed = true;\n"); sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.as$Unresolved().getUnresolved$Token(), i);\n"); sb.append(ind(5) + "if (resolvedElement != null && element.as$Unresolved().getUnresolved$ResolveOpposite()) {\n"); - sb.append(ind(6) + ASTNode.listClass + "<" + toTypeDecl() + "> otherList = resolvedElement.get" + opposite.getImplAttributeName() + "();\n"); + sb.append(ind(6) + ASTNode.listClass + "<" + toTypeDecl() + "> otherList = resolvedElement." + opposite.getImplAttributeField() + ";\n"); sb.append(ind(6) + "if (otherList == null) {\n"); sb.append(ind(7) + "otherList = new " + listClass + "<>();\n"); sb.append(ind(6) + "}\n"); @@ -495,12 +505,11 @@ aspect BackendBidirectionalAPI { } sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list == null) {\n"); sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o.get" - + otherSide().getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list2 == null) {\n"); sb.append(ind(3) + "list2 = new "+ ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); @@ -517,12 +526,12 @@ aspect BackendBidirectionalAPI { } sb.append(nameCapitalized() + "(int index, " + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list == null) {\n"); sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o.get" - + otherSide().getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o." + + otherSide().getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list2 == null) {\n"); sb.append(ind(3) + "list2 = new "+ ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); @@ -539,10 +548,10 @@ aspect BackendBidirectionalAPI { } sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list != null && list.remove(o)) {\n"); - sb.append(ind(3) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o.get" - + otherSide().getImplAttributeName() + "();\n"); + sb.append(ind(3) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o." + + otherSide().getImplAttributeField() + ";\n"); sb.append(ind(3) + "if (list2 != null) list2.remove(this);\n"); sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n"); sb.append(ind(3) + "o.set" + otherSide().getImplAttributeName() + "(list2);\n"); @@ -577,9 +586,9 @@ aspect BackendBidirectionalAPI { sb.append(ind(5) + "changed = true;\n"); sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.as$Unresolved().getUnresolved$Token(), i);\n"); sb.append(ind(5) + "if (element.as$Unresolved().getUnresolved$ResolveOpposite()) {\n"); - sb.append(ind(6) + toTypeDecl() + " oldTarget = resolvedElement.get" + opposite.getImplAttributeName() + "();\n"); + sb.append(ind(6) + toTypeDecl() + " oldTarget = resolvedElement." + opposite.getImplAttributeField() + ";\n"); sb.append(ind(6) + "if (oldTarget != null && oldTarget != this) {\n"); - sb.append(ind(7) + "oldTarget.get" + getImplAttributeName() + "().remove(resolvedElement);\n"); + sb.append(ind(7) + "oldTarget." + getImplAttributeField() + ".remove(resolvedElement);\n"); sb.append(ind(6) + "}\n"); sb.append(ind(6) + "if (oldTarget == this) {\n"); sb.append(ind(7) + "l.remove(i);\n"); @@ -608,14 +617,14 @@ aspect BackendBidirectionalAPI { } sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); - sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o.get" - + otherSide().getImplAttributeName() + "().get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + "if (o != null && o." + otherSide().getImplAttributeField() + " != null) {\n"); + sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o." + + otherSide().getImplAttributeField() + "." + getImplAttributeField() + ";\n"); sb.append(ind(3) + "if (list2.remove(o))\n"); - sb.append(ind(4) + "o.get" + otherSide().getImplAttributeName() - + "().set" + getImplAttributeName() + "(list2);\n"); + sb.append(ind(4) + "o." + otherSide().getImplAttributeField() + + ".set" + getImplAttributeName() + "(list2);\n"); sb.append(ind(2) + "}\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list == null) {\n"); sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); @@ -631,12 +640,12 @@ aspect BackendBidirectionalAPI { } sb.append(nameCapitalized() + "(int index, " + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); - sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o.get" + otherSide().getImplAttributeName() + "().get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + "if (o != null && o." + otherSide().getImplAttributeField() + " != null) {\n"); + sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + "." + getImplAttributeField() + ";\n"); sb.append(ind(3) + "if (list2.remove(o))\n"); - sb.append(ind(4) + "o.get" + otherSide().getImplAttributeName() + "().set" + getImplAttributeName() + "(list2);\n"); + sb.append(ind(4) + "o." + otherSide().getImplAttributeField() + ".set" + getImplAttributeName() + "(list2);\n"); sb.append(ind(2) + "}\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list == null) {\n"); sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); @@ -652,10 +661,10 @@ aspect BackendBidirectionalAPI { } sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n"); sb.append(ind(2) + "if (list != null && list.remove(o)) {\n"); sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n"); - sb.append(ind(3) + "if (o.get" + otherSide().getImplAttributeName() + "() == this) {\n"); + sb.append(ind(3) + "if (o." + otherSide().getImplAttributeField() + " == this) {\n"); sb.append(ind(4) + "o.set" + otherSide().getImplAttributeName() + "(null);\n"); sb.append(ind(3) + "}\n"); sb.append(ind(2) + "}\n"); @@ -672,11 +681,11 @@ aspect BackendBidirectionalAPI { if (!isOpt) { sb.append(ind(2) + "assertNotNull(o);\n"); } - sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null) {\n"); - sb.append(ind(3) + ASTNode.listClass + "<" + toTypeDecl() + "> list2 = get" + getImplAttributeName() - + "()." + "get" + otherSide().getImplAttributeName() + "();\n"); + sb.append(ind(2) + "if (" + getImplAttributeField() + " != null) {\n"); + sb.append(ind(3) + ASTNode.listClass + "<" + toTypeDecl() + "> list2 = " + getImplAttributeField() + + "." + otherSide().getImplAttributeField() + ";\n"); sb.append(ind(3) + "list2.remove(this);\n"); - sb.append(ind(3) + "get" + getImplAttributeName() + "()." + "set" + sb.append(ind(3) + getImplAttributeField() + "." + "set" + otherSide().getImplAttributeName() + "(list2);\n"); sb.append(ind(2) + "}\n"); sb.append(ind(2) + "set" + getImplAttributeName() + "(o);\n"); @@ -685,8 +694,8 @@ aspect BackendBidirectionalAPI { if (isOpt) { sb.append(ind(2) + "if (o != null) {\n"); } - sb.append(ind(ind) + ASTNode.listClass + "<" + toTypeDecl() + "> list = o.get" - + otherSide().getImplAttributeName() + "();\n"); + sb.append(ind(ind) + ASTNode.listClass + "<" + toTypeDecl() + "> list = o." + + otherSide().getImplAttributeField() + ";\n"); sb.append(ind(ind) + "if (list == null) {\n"); sb.append(ind(ind+1) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(ind) + "}\n"); @@ -1203,7 +1212,7 @@ aspect Serializer { sb.append(ind(3) + "com.fasterxml.jackson.core.JsonFactory factory = mapper.getFactory();\n"); sb.append(ind(3) + "com.fasterxml.jackson.core.JsonParser parser = factory.createParser(file);\n"); sb.append(ind(3) + getID() + " result = deserialize((com.fasterxml.jackson.databind.JsonNode)mapper.readTree(parser));\n"); - sb.append(ind(3) + "result.resolveAll();\n"); + sb.append(ind(3) + "result.treeResolveAll();\n"); sb.append(ind(3) + "return result;\n"); sb.append(ind(2) + "} catch (java.io.IOException e) {\n"); sb.append(ind(3) + "throw new DeserializationException(\"unable to deserialize \" + file.getAbsolutePath(), e);\n");