diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle index 953e9c5a0a74d2fac22831166ba9b9b52381ab96..5fd73e5ac109155cd84315d3890e059353db3ef2 100644 --- a/ragconnect.base/build.gradle +++ b/ragconnect.base/build.gradle @@ -51,9 +51,9 @@ task newVersion() { } } -sourceSets.main.java { - srcDir "src/gen/java" -} +File genSrc = file("src/gen/java"); +sourceSets.main.java.srcDir genSrc +idea.module.generatedSourceDirs += genSrc jar { manifest { diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag index b62399960f34a4b8c23a8d23762ec195491ce4e3..a1367a9c21bf2f293dd33216ea20a8941f5411b5 100644 --- a/ragconnect.base/src/main/jastadd/Analysis.jrag +++ b/ragconnect.base/src/main/jastadd/Analysis.jrag @@ -24,9 +24,17 @@ aspect Analysis { } // --- isAlreadyDefined --- - syn boolean TokenEndpointDefinition.isAlreadyDefined() = lookupTokenEndpointDefinitions(getToken()).size() > 1; + syn boolean TokenEndpointDefinition.isAlreadyDefined() { + return lookupTokenEndpointDefinitions(getToken()).stream() + .filter(this::matchesType) + .count() > 1; + } syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this; + syn boolean TokenEndpointDefinition.matchesType(TokenEndpointDefinition other); + eq ReceiveTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isReceiveTokenEndpointDefinition(); + eq SendTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isSendTokenEndpointDefinition(); + syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target); eq JavaMappingDefinitionType.assignableTo(JavaTypeUse target) = getType().assignableTo(target); eq JavaArrayMappingDefinitionType.assignableTo(JavaTypeUse target) { @@ -54,4 +62,10 @@ aspect Analysis { default: return getName(); } } + + // --- shouldSendValue --- + syn boolean TokenEndpointDefinition.shouldSendValue() = isSendTokenEndpointDefinition() && !getToken().getNTA(); + + // --- needProxyToken --- + syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || getTokenEndpointDefinitionList().stream().anyMatch(TokenEndpointDefinition::shouldSendValue); } diff --git a/ragconnect.base/src/main/jastadd/Errors.jrag b/ragconnect.base/src/main/jastadd/Errors.jrag index fe2fcd59efd365174ca2803affebc34819cf3d7e..88f3aece6a64041a95f2784be4882d01008ff8c5 100644 --- a/ragconnect.base/src/main/jastadd/Errors.jrag +++ b/ragconnect.base/src/main/jastadd/Errors.jrag @@ -28,10 +28,6 @@ aspect Errors { getToken().effectiveJavaTypeUse()) to RagConnect.errors(); - SendTokenEndpointDefinition contributes error("Sending target token must be an NTA token!") - when !getToken().getNTA() - to RagConnect.errors(); - SendTokenEndpointDefinition contributes error("Send definition already defined for " + getToken().getName()) when isAlreadyDefined() to RagConnect.errors(); diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag index 752fc36aea4c59348874c1a08134696a9543b6cb..f6fc20befc6697e63ff4c4bbac16c852c898b78d 100644 --- a/ragconnect.base/src/main/jastadd/Navigation.jrag +++ b/ragconnect.base/src/main/jastadd/Navigation.jrag @@ -35,6 +35,10 @@ aspect Navigation { syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null; eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this; + // --- isReceiveTokenEndpointDefinition --- + syn boolean EndpointDefinition.isReceiveTokenEndpointDefinition() = false; + eq ReceiveTokenEndpointDefinition.isReceiveTokenEndpointDefinition() = true; + // --- asReceiveTokenEndpointDefinition --- syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null; eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this; diff --git a/ragconnect.base/src/main/jastadd/RagConnect.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast index accc617714ff6bdd24a22831ea84e5d93e6a15b8..9958106ba82c6efe32126c9f7b795ac7c66378e6 100644 --- a/ragconnect.base/src/main/jastadd/RagConnect.relast +++ b/ragconnect.base/src/main/jastadd/RagConnect.relast @@ -5,7 +5,7 @@ abstract EndpointDefinition ::= <AlwaysApply:boolean> ; rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*; abstract TokenEndpointDefinition : EndpointDefinition; -rel TokenEndpointDefinition.Token -> TokenComponent; +rel TokenEndpointDefinition.Token <-> TokenComponent.TokenEndpointDefinition*; ReceiveTokenEndpointDefinition : TokenEndpointDefinition; SendTokenEndpointDefinition : TokenEndpointDefinition; diff --git a/ragconnect.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd index 4b8d357e82e82eb8454451978589434f1ef44505..6b6399287f4d657087cc45d5c905917ac54fea7a 100644 --- a/ragconnect.base/src/main/jastadd/backend/Generation.jadd +++ b/ragconnect.base/src/main/jastadd/backend/Generation.jadd @@ -71,6 +71,7 @@ aspect AttributesForMustache { syn String MSendDefinition.updateMethod() = "_update_" + tokenName(); syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName(); syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset"; + syn boolean MSendDefinition.shouldSendValue() = endpointDef().shouldSendValue(); // --- MMappingDefinition --- syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint(); @@ -96,8 +97,16 @@ aspect AttributesForMustache { syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName(); syn String MTokenComponent.name() = getTokenComponent().getName(); syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint(); - syn String MTokenComponent.internalName() = getTokenComponent().getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + name(); + syn String MTokenComponent.internalName() = getTokenComponent().needProxyToken() ? "_internal_" + name() : externalName(); syn String MTokenComponent.externalName() = name(); + syn MSendDefinition MTokenComponent.normalTokenSendDef() { + for (TokenEndpointDefinition endpointDef : getTokenComponent().getTokenEndpointDefinitionList()) { + if (endpointDef.shouldSendValue()) { + return endpointDef.asSendTokenEndpointDefinition().toMustache(); + } + } + return null; + } // --- toMustache --- syn lazy MRagConnect RagConnect.toMustache() { @@ -118,7 +127,7 @@ aspect AttributesForMustache { result.addDependencyDefinition(def.toMustache()); } for (TokenComponent token : getProgram().allTokenComponents()) { - if (!token.getDependencySourceDefinitionList().isEmpty()) { + if (token.needProxyToken()) { result.addTokenComponent(token.toMustache()); } } diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java index 711169ec2ea7d9c21b48dc52c5a7d2cf4cc8b427..28a3f209ecf5ee4bf436251fe2cff9e71d091bc8 100644 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java +++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java @@ -216,6 +216,7 @@ public class Compiler extends AbstractCompiler { if (!atLeastOneGrammar && !atLeastOneRagConnect) { System.exit(1); } + ragConnect.flushTreeCache(); ragConnect.treeResolveAll(); ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration); ASTNode.loggingEnabledForReads = optionLogReads.value(); @@ -264,15 +265,9 @@ public class Compiler extends AbstractCompiler { } private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) { - for (EndpointDefinition endpointDefinition : ragConnectToIntegrate.getEndpointDefinitionList()) { - ragConnect.addEndpointDefinition(endpointDefinition); - } - for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) { - ragConnect.addMappingDefinition(mappingDefinition); - } - for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) { - ragConnect.addDependencyDefinition(dependencyDefinition); - } + ragConnect.setEndpointDefinitionList(ragConnectToIntegrate.getEndpointDefinitionList()); + ragConnect.setMappingDefinitionList(ragConnectToIntegrate.getMappingDefinitionList()); + ragConnect.setDependencyDefinitionList(ragConnectToIntegrate.getDependencyDefinitionList()); } // protected void printUsage() { diff --git a/ragconnect.base/src/main/resources/ragConnectVersion.properties b/ragconnect.base/src/main/resources/ragConnectVersion.properties index 768893e5c448a618f5fb93070a694b627a2ad362..a2fe0480ef146507acb8df52efc1fb529a9f4c1b 100644 --- a/ragconnect.base/src/main/resources/ragConnectVersion.properties +++ b/ragconnect.base/src/main/resources/ragConnectVersion.properties @@ -1,2 +1,2 @@ -#Fri Aug 14 13:28:32 CEST 2020 -version=0.2.1 +#Fri Aug 14 19:22:30 CEST 2020 +version=0.2.2 diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache index d6601aaeac7686a06dc59b62f0f0b56aa9642bc7..60f5efcca8f3333d41fc8cc4706a736946a42ab7 100644 --- a/ragconnect.base/src/main/resources/sendDefinition.mustache +++ b/ragconnect.base/src/main/resources/sendDefinition.mustache @@ -36,7 +36,9 @@ public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterNam } protected boolean {{parentTypeName}}.{{updateMethod}}() { + {{^shouldSendValue}} {{tokenResetMethod}}(); + {{/shouldSendValue}} {{> mappingApplication}} {{lastValue}} = {{lastResult}}; // normally we would return true here. unless no connect method was called so far to initialize {{sender}} yet diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache index ec91e68da6493d1c8de97a497e4b1df08e8e6af0..169f5f64fff01ef2c34abeea34266b5a82deaf3a 100644 --- a/ragconnect.base/src/main/resources/tokenComponent.mustache +++ b/ragconnect.base/src/main/resources/tokenComponent.mustache @@ -9,6 +9,11 @@ public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) { {{/targetEndpointDefinition}} } {{/DependencyDefinitions}} + {{#normalTokenSendDef}} + if ({{updateMethod}}()) { + {{writeMethod}}(); + } + {{/normalTokenSendDef}} return this; }