From 59b01b5b85f144be4cec8d40d9f15564d9fecd7b Mon Sep 17 00:00:00 2001 From: rschoene <rene.schoene@tu-dresden.de> Date: Fri, 29 May 2020 18:08:07 +0200 Subject: [PATCH] Testing default only write. - base: fixed bug when multiple dependency definitions have same source (used to generate multiple getter/setter) - added test case for writing all supported types for default mapping definitions - inherited attributes for token-attributes are not supported (because no "$token_reset()" is generated by JastAdd) - added short test descriptions --- src/main/jastadd/Navigation.jrag | 10 ++++++ src/main/jastadd/backend/Generation.jadd | 42 ++++++++++++++++-------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/main/jastadd/Navigation.jrag b/src/main/jastadd/Navigation.jrag index ce20294..49b86d0 100644 --- a/src/main/jastadd/Navigation.jrag +++ b/src/main/jastadd/Navigation.jrag @@ -15,6 +15,10 @@ aspect Navigation { syn boolean Component.isTypeComponent() = false; eq TypeComponent.isTypeComponent() = true; + // --- asTypeComponent (should be in preprocessor) --- + syn TypeComponent Component.asTypeComponent() = null; + eq TypeComponent.asTypeComponent() = this; + // --- isWriteToMqttDefinition --- syn boolean UpdateDefinition.isWriteToMqttDefinition() = false; eq WriteToMqttDefinition.isWriteToMqttDefinition() = true; @@ -38,4 +42,10 @@ aspect Navigation { // --- isDefaultMappingDefinition --- syn boolean MappingDefinition.isDefaultMappingDefinition() = false; eq DefaultMappingDefinition.isDefaultMappingDefinition() = true; + + // --- allTokenComponents --- + coll java.util.Set<TokenComponent> Program.allTokenComponents() [new java.util.HashSet<>()] root Program; + TokenComponent contributes this + to Program.allTokenComponents() + for program(); } diff --git a/src/main/jastadd/backend/Generation.jadd b/src/main/jastadd/backend/Generation.jadd index 7a134ec..82c1ae0 100644 --- a/src/main/jastadd/backend/Generation.jadd +++ b/src/main/jastadd/backend/Generation.jadd @@ -101,6 +101,9 @@ aspect AspectGeneration { for (DependencyDefinition def : getDependencyDefinitionList()) { def.generateAspect(sb); } + for (TokenComponent token : getProgram().allTokenComponents()) { + token.generateAspect(sb); + } sb.append("}\n"); } @@ -235,27 +238,40 @@ aspect AspectGeneration { .append(dependencyMethod()).append("(").append(sourceParentTypeName).append(" source) {\n"); sb.append(ind(2)).append("add").append(internalRelationPrefix()).append("Source(source);\n"); sb.append(ind(1)).append("}\n\n"); + } + + void TokenComponent.generateAspect(StringBuilder sb) { + if (getDependencySourceDefinitionList().isEmpty()) { return; } + String parentTypeName = containingTypeDecl().getName(); // virtual setter - sb.append(ind(1)).append("public ").append(sourceParentTypeName).append(" ") - .append(sourceParentTypeName).append(".set").append(getSource().getName()).append("("); - getSource().getJavaTypeUse().generateAbstractGrammar(sb); + sb.append(ind(1)).append("public ").append(parentTypeName).append(" ") + .append(parentTypeName).append(".set").append(getName()).append("("); + getJavaTypeUse().generateAbstractGrammar(sb); sb.append(" value) {\n"); - sb.append(ind(2)).append("set").append(internalTokenName()).append("(value);\n"); - sb.append(ind(2)).append("for (").append(targetParentTypeName).append(" target : get") - .append(internalRelationPrefix()).append("TargetList()) {\n"); - sb.append(ind(3)).append("if (target.").append(targetUpdateDefinition().updateMethod()).append("()) {\n"); - sb.append(ind(4)).append("target.").append(targetUpdateDefinition().writeMethod()).append("();\n"); - sb.append(ind(3)).append("}\n"); - sb.append(ind(2)).append("}\n"); + sb.append(ind(2)).append("set").append(internalName()).append("(value);\n"); + + for (DependencyDefinition dependencyDefinition : getDependencySourceDefinitionList()) { + String targetParentTypeName = dependencyDefinition.getTarget().containingTypeDecl().getName(); + sb.append(ind(2)).append("for (").append(targetParentTypeName).append(" target : get") + .append(dependencyDefinition.internalRelationPrefix()).append("TargetList()) {\n"); + sb.append(ind(3)).append("if (target.") + .append(dependencyDefinition.targetUpdateDefinition().updateMethod()) + .append("()) {\n"); + sb.append(ind(4)).append("target.") + .append(dependencyDefinition.targetUpdateDefinition().writeMethod()) + .append("();\n"); + sb.append(ind(3)).append("}\n"); + sb.append(ind(2)).append("}\n"); + } sb.append(ind(2)).append("return this;\n"); sb.append(ind(1)).append("}\n\n"); // virtual getter sb.append(ind(1)).append("public "); - getSource().getJavaTypeUse().generateAbstractGrammar(sb); - sb.append(" ").append(sourceParentTypeName).append(".get").append(getSource().getName()).append("() {\n"); - sb.append(ind(2)).append("return get").append(internalTokenName()).append("();\n"); + getJavaTypeUse().generateAbstractGrammar(sb); + sb.append(" ").append(parentTypeName).append(".get").append(getName()).append("() {\n"); + sb.append(ind(2)).append("return get").append(internalName()).append("();\n"); sb.append(ind(1)).append("}\n\n"); } } -- GitLab