Skip to content
Snippets Groups Projects
Commit 2e0b5b38 authored by René Schöne's avatar René Schöne
Browse files

WIP: begin with attribute as endpoint target

parent 81c522ef
No related branches found
No related tags found
1 merge request!25Resolve "Feature: Send endpoint for attributes"
Pipeline #12442 failed
Showing
with 193 additions and 7 deletions
...@@ -64,6 +64,7 @@ aspect Analysis { ...@@ -64,6 +64,7 @@ aspect Analysis {
} }
syn boolean EndpointTarget.entityIsNormalAttribute(); syn boolean EndpointTarget.entityIsNormalAttribute();
// TODO AttributeEndpointTarget.entityIsNormalAttribute
eq TokenEndpointTarget.entityIsNormalAttribute() = !getToken().getNTA(); eq TokenEndpointTarget.entityIsNormalAttribute() = !getToken().getNTA();
eq TypeEndpointTarget.entityIsNormalAttribute() = !getType().getNTA(); eq TypeEndpointTarget.entityIsNormalAttribute() = !getType().getNTA();
eq ContextFreeTypeEndpointTarget.entityIsNormalAttribute() = false; eq ContextFreeTypeEndpointTarget.entityIsNormalAttribute() = false;
......
...@@ -371,6 +371,10 @@ aspect MustacheReceiveAndSendAndHandleUri { ...@@ -371,6 +371,10 @@ aspect MustacheReceiveAndSendAndHandleUri {
syn String EndpointTarget.parentTypeName(); syn String EndpointTarget.parentTypeName();
syn String EndpointTarget.entityName(); syn String EndpointTarget.entityName();
// TODO AttributeEndpointTarget.getterName
eq AttributeEndpointTarget.parentTypeName() = getParentTypeDecl().getName();
eq AttributeEndpointTarget.entityName() = getName();
eq TokenEndpointTarget.getterMethodName() = "get" + getToken().getName(); eq TokenEndpointTarget.getterMethodName() = "get" + getToken().getName();
eq TokenEndpointTarget.parentTypeName() = getToken().containingTypeDecl().getName(); eq TokenEndpointTarget.parentTypeName() = getToken().containingTypeDecl().getName();
eq TokenEndpointTarget.entityName() = getToken().getName(); eq TokenEndpointTarget.entityName() = getToken().getName();
...@@ -456,9 +460,7 @@ aspect MustacheSendDefinition { ...@@ -456,9 +460,7 @@ aspect MustacheSendDefinition {
getTypeDecl().getName() : getTypeDecl().getName() :
ragconnect().configJastAddList() + "<" + getTypeDecl().getName() + ">"; ragconnect().configJastAddList() + "<" + getTypeDecl().getName() + ">";
syn String EndpointTarget.senderName(); syn String EndpointTarget.senderName() = ragconnect().internalRagConnectPrefix() + "_sender_" + entityName();
eq TokenEndpointTarget.senderName() = ragconnect().internalRagConnectPrefix() + "_sender_" + getToken().getName();
eq TypeEndpointTarget.senderName() = ragconnect().internalRagConnectPrefix() + "_sender_" + getType().getName();
eq ContextFreeTypeEndpointTarget.senderName() = null; eq ContextFreeTypeEndpointTarget.senderName() = null;
syn String MEndpointDefinition.updateMethodName(); syn String MEndpointDefinition.updateMethodName();
......
...@@ -191,6 +191,7 @@ aspect Mappings { ...@@ -191,6 +191,7 @@ aspect Mappings {
// --- suitableReceiveDefaultMapping --- // --- suitableReceiveDefaultMapping ---
syn DefaultMappingDefinition EndpointDefinition.suitableReceiveDefaultMapping() { syn DefaultMappingDefinition EndpointDefinition.suitableReceiveDefaultMapping() {
// TODO might be expanded to AttributeEndpointTarget
if (getEndpointTarget().isTypeEndpointTarget()) { if (getEndpointTarget().isTypeEndpointTarget()) {
try { try {
TypeDecl typeDecl = program().resolveTypeDecl(targetTypeName()); TypeDecl typeDecl = program().resolveTypeDecl(targetTypeName());
...@@ -236,6 +237,7 @@ aspect Mappings { ...@@ -236,6 +237,7 @@ aspect Mappings {
// --- suitableSendDefaultMapping --- // --- suitableSendDefaultMapping ---
syn DefaultMappingDefinition EndpointDefinition.suitableSendDefaultMapping() { syn DefaultMappingDefinition EndpointDefinition.suitableSendDefaultMapping() {
// TODO might be expanded to AttributeEndpointTarget
if (getEndpointTarget().isTypeEndpointTarget() && typeIsList() && !getIndexBasedListAccess()) { if (getEndpointTarget().isTypeEndpointTarget() && typeIsList() && !getIndexBasedListAccess()) {
return ragconnect().defaultListTreeToBytesMapping(); return ragconnect().defaultListTreeToBytesMapping();
} }
...@@ -288,6 +290,7 @@ aspect Mappings { ...@@ -288,6 +290,7 @@ aspect Mappings {
} }
} }
syn String EndpointTarget.targetTypeName(); syn String EndpointTarget.targetTypeName();
eq AttributeEndpointTarget.targetTypeName() = getTypeName();
eq TokenEndpointTarget.targetTypeName() = getToken().effectiveJavaTypeUse().getName(); eq TokenEndpointTarget.targetTypeName() = getToken().effectiveJavaTypeUse().getName();
eq TypeEndpointTarget.targetTypeName() = getType().getTypeDecl().getName(); eq TypeEndpointTarget.targetTypeName() = getType().getTypeDecl().getName();
eq ContextFreeTypeEndpointTarget.targetTypeName() = getTypeDecl().getName(); eq ContextFreeTypeEndpointTarget.targetTypeName() = getTypeDecl().getName();
......
aspect NewStuff { aspect NewStuff {
// TODO regenerate for AttributeEndpointTarget
/** Tests if EndpointTarget is a TokenEndpointTarget. /** Tests if EndpointTarget is a TokenEndpointTarget.
* @return 'true' if this is a TokenEndpointTarget, otherwise 'false' * @return 'true' if this is a TokenEndpointTarget, otherwise 'false'
*/ */
......
...@@ -13,9 +13,10 @@ TypeEndpointTarget : EndpointTarget; ...@@ -13,9 +13,10 @@ TypeEndpointTarget : EndpointTarget;
rel TypeEndpointTarget.Type <-> TypeComponent.TypeEndpointTarget*; rel TypeEndpointTarget.Type <-> TypeComponent.TypeEndpointTarget*;
ContextFreeTypeEndpointTarget : EndpointTarget; ContextFreeTypeEndpointTarget : EndpointTarget;
rel ContextFreeTypeEndpointTarget.TypeDecl <-> TypeDecl.ContextFreeTypeEndpointTarget*; rel ContextFreeTypeEndpointTarget.TypeDecl <-> TypeDecl.ContextFreeTypeEndpointTarget*;
UntypedEndpointTarget : EndpointTarget ::= <TypeName> <ChildName>; // only used by parser UntypedEndpointTarget : EndpointTarget ::= <TypeName> <ChildName> <IsAttribute:boolean>; // only used by parser
// to be integrated: // to be integrated:
//AttributeEndpointTarget : EndpointTarget ::= <Name> ; AttributeEndpointTarget : EndpointTarget ::= <Name> <TypeName> ;
rel AttributeEndpointTarget.ParentTypeDecl <-> TypeDecl.AttributeEndpointTarget*;
//RelationEndpointTarget : EndpointTarget ; //RelationEndpointTarget : EndpointTarget ;
//rel RelationEndpointTarget.Role <-> Role.RelationEndpointTarget* ; //rel RelationEndpointTarget.Role <-> Role.RelationEndpointTarget* ;
......
...@@ -23,6 +23,19 @@ aspect ParserRewrites { ...@@ -23,6 +23,19 @@ aspect ParserRewrites {
result.setTypeDecl(TypeDecl.createRef(getTypeName())); result.setTypeDecl(TypeDecl.createRef(getTypeName()));
return result; return result;
} }
when (getIsAttribute())
to AttributeEndpointTarget {
AttributeEndpointTarget result = new AttributeEndpointTarget();
String[] tokens = this.getChildName().split(":");
String attributeName = tokens[0];
String attributeTypeName = tokens[1];
result.copyOtherValuesFrom(this);
result.setName(attributeName);
result.setTypeName(attributeTypeName);
result.setParentTypeDecl(TypeDecl.createRef(getTypeName()));
return result;
}
} }
syn String UntypedEndpointTarget.combinedName() = getTypeName() + "." + getChildName(); syn String UntypedEndpointTarget.combinedName() = getTypeName() + "." + getChildName();
......
...@@ -62,8 +62,10 @@ EndpointDefinition endpoint_definition_type ...@@ -62,8 +62,10 @@ EndpointDefinition endpoint_definition_type
; ;
EndpointTarget endpoint_target EndpointTarget endpoint_target
= ID.type_name DOT ID.child_name {: return new UntypedEndpointTarget(type_name, child_name); :} = ID.type_name DOT ID.child_name {: return new UntypedEndpointTarget(type_name, child_name, false); :}
| ID.type_name {: return new UntypedEndpointTarget(type_name, ""); :} | ID.type_name DOT ID.child_name BRACKETS COLON ID.attribute_type_name
{: return new UntypedEndpointTarget(type_name, child_name + ":" + attribute_type_name, true); :}
| ID.type_name {: return new UntypedEndpointTarget(type_name, "", false); :}
; ;
ArrayList string_list ArrayList string_list
......
...@@ -8,3 +8,5 @@ ...@@ -8,3 +8,5 @@
"with" { return sym(Terminals.WITH); } "with" { return sym(Terminals.WITH); }
"indexed" { return sym(Terminals.INDEXED); } "indexed" { return sym(Terminals.INDEXED); }
"add" { return sym(Terminals.ADD); } "add" { return sym(Terminals.ADD); }
"()" { return sym(Terminals.BRACKETS); }
":" { return sym(Terminals.COLON); }
...@@ -621,3 +621,29 @@ task compileIndexedSendIncremental(type: RagConnectTest, dependsOn: ':ragconnect ...@@ -621,3 +621,29 @@ task compileIndexedSendIncremental(type: RagConnectTest, dependsOn: ':ragconnect
extraOptions = JASTADD_INCREMENTAL_OPTIONS_TRACING_FULL extraOptions = JASTADD_INCREMENTAL_OPTIONS_TRACING_FULL
} }
} }
// --- Test: attribute-incremental ---
task compileAttributeIncremental(type: RagConnectTest, dependsOn: ':ragconnect.base:jar') {
ragconnect {
outputDir = file('src/test/02-after-ragconnect/attributeInc')
inputFiles = [file('src/test/01-input/attribute/Test.relast'),
file('src/test/01-input/attribute/Test.connect')]
rootNode = 'Root'
logWrites = true
logReads = true
logIncremental = true
extraOptions = ['--experimental-jastadd-329']
}
relast {
useJastAddNames = true
grammarName = 'src/test/03-after-relast/attributeInc/attributeInc'
serializer = 'jackson'
}
jastadd {
jastAddList = 'JastAddList'
packageName = 'attributeInc.ast'
inputFiles = [file('src/test/01-input/attribute/Test.jadd')]
extraOptions = JASTADD_INCREMENTAL_OPTIONS_TRACING_FULL
}
}
compileAttributeIncremental.outputs.upToDateWhen { false }
# Attribute
Idea: Use send definitions for attributes.
send SenderRoot.basic():String ;
send SenderRoot.simple():String ;
send SenderRoot.transformed():int ;
send SenderRoot.toReferenceType():A ;
send SenderRoot.toNTA():A ;
AddSuffix maps A a to A {:
A result = new A();
String changedValue = a.getValue() + "post";
result.setValue(changedValue);
result.setInner(new Inner("inner" + changedValue));
return result;
:}
AddStringSuffix maps String s to String {:
return s + "post";
:}
AddPlusOne maps int i to int {:
return i + 1;
:}
receive ReceiverRoot.FromBasic;
receive ReceiverRoot.FromSimpleNoMapping;
receive ReceiverRoot.FromSimpleWithMapping using AddStringSuffix;
receive ReceiverRoot.FromTransformedNoMapping;
receive ReceiverRoot.FromTransformedWithMapping using AddPlusOne;
receive ReceiverRoot.FromReferenceTypeNoMapping;
receive ReceiverRoot.FromReferenceTypeWithMapping using AddSuffix;
receive ReceiverRoot.FromNTANoMapping;
receive ReceiverRoot.FromNTAWithMapping using AddSuffix;
aspect Computation {
syn String SenderRoot.basic() = getInput();
syn String SenderRoot.simple() = getInput() + "Post";
syn int SenderRoot.transformed() = getInput().length();
syn A SenderRoot.toReferenceType() {
A result = new A();
result.setValue(getInput());
Inner inner = new Inner();
inner.setInnerValue("1");
result.setInner(inner);
return result;
}
syn nta A SenderRoot.toNTA() {
A result = new A();
result.setValue(getInput());
Inner inner = new Inner();
inner.setInnerValue("2");
result.setInner(inner);
return result;
}
}
aspect MakeCodeCompile {
}
aspect MakeCodeWork {
}
aspect NameResolution {
// overriding customID guarantees to produce the same JSON representation for equal lists
// otherwise, the value for id is different each time
@Override
protected String A.customID() {
return getClass().getSimpleName() + getValue();
}
@Override
protected String Inner.customID() {
return getClass().getSimpleName() + getInnerValue();
}
}
Root ::= SenderRoot ReceiverRoot;
SenderRoot ::= <Input> ;
ReceiverRoot ::=
<FromBasic>
<FromSimpleNoMapping>
<FromSimpleWithMapping>
<FromTransformedNoMapping:int>
<FromTransformedWithMapping:int>
FromReferenceTypeNoMapping:A
FromReferenceTypeWithMapping:A
FromNTANoMapping:A
FromNTAWithMapping:A ;
A ::= <Value> Inner ;
Inner ::= <InnerValue> ;
package org.jastadd.ragconnect.tests;
import attribute.ast.*;
import org.junit.jupiter.api.Tag;
import java.io.IOException;
/**
* Test case "attribute".
*
* @author rschoene - Initial contribution
*/
@Tag("Incremental")
@Tag("New")
public class AttributeTest extends AbstractMqttTest {
Root model;
MqttHandler handler;
@Override
protected void createModel() {
}
@Override
protected void setupReceiverAndConnect() throws IOException, InterruptedException {
}
@Override
protected void communicateSendInitialValue() throws IOException, InterruptedException {
}
@Override
protected void communicateOnlyUpdatedValue() throws IOException, InterruptedException {
}
@Override
protected void closeConnections() {
if (handler != null) {
handler.close();
}
if (model != null) {
model.ragconnectCloseConnections();
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment