Skip to content
Snippets Groups Projects

Resolve "Feature: Add context-free connect"

Merged René Schöne requested to merge 34-feature-add-context-free-connect into dev
4 files
+ 164
92
Compare changes
  • Side-by-side
  • Inline
Files
4
  • a82df0f9
    begin with concise grammar · a82df0f9
    René Schöne authored
    - grammar kept as separate file to compare to old grammar
    - parser should be complete
    - navigation partly generated using abstract-type-navigation-pp
    - working on Generation.jadd
/*
/*
Design considerations
Design considerations
- InnerMappingDefinition needed for iteration attribute (first, last) - not easily possible with list-relation
- [OLD] InnerMappingDefinition needed for iteration attribute (first, last) - not possible with list-relation
 
- [NEW in 1.0.0] no complete intermediate structure, but instead single nodes where applicable
*/
*/
 
aspect NewStuff {
 
syn nta JastAddList<MTypeComponent> RagConnect.getRootTypeComponentList() {
 
JastAddList<MTypeComponent> result = new JastAddList<>();
 
for (Component child : rootNode.getComponentList()) {
 
if (child.isTypeComponent()) {
 
result.add(child.asTypeComponent().toMustache());
 
}
 
}
 
return result;
 
}
aspect AttributesForMustache {
inh boolean MTypeComponent.isFirst();
// --- EndpointDefinition ---
eq RagConnect.getRootTypeComponentList(int i).isFirst() = i == 0;
syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
// --- MRagConnect ---
eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0;
syn String MRagConnect.closeMethod() = "ragconnectCloseConnections";
syn String RagConnect.closeMethod() = "ragconnectCloseConnections";
syn String MRagConnect.mqttHandlerAttribute() = "_mqttHandler";
syn String RagConnect.mqttHandlerAttribute() = "_mqttHandler";
syn String MRagConnect.mqttHandlerField() = "_mqttHandler";
syn String RagConnect.mqttHandlerField() = "_mqttHandler";
syn String MRagConnect.mqttSetupWaitUntilReadyMethod() = "ragconnectSetupMqttWaitUntilReady";
syn String RagConnect.mqttSetupWaitUntilReadyMethod() = "ragconnectSetupMqttWaitUntilReady";
syn String MRagConnect.restHandlerAttribute() = "_restHandler";
syn String RagConnect.restHandlerAttribute() = "_restHandler";
syn String MRagConnect.restHandlerField() = "_restHandler";
syn String RagConnect.restHandlerField() = "_restHandler";
syn boolean MRagConnect.hasTreeListEndpoints() = !sendingTreeListEndpoints().isEmpty() || !receivingTreeListEndpoints().isEmpty();
syn boolean RagConnect.hasTreeListEndpoints() {
syn List<MTypeEndpointDefinition> MRagConnect.sendingTreeListEndpoints() {
for (EndpointDefinition endpointDef : getEndpointDefinitionList()) {
List<MTypeEndpointDefinition> result = new ArrayList<>();
if (endpointDef.typeIsList()) {
for (var mEndpointDef : getTypeSendDefinitionList()) {
return true;
if (mEndpointDef.typeIsList()) {
result.add(mEndpointDef);
}
}
}
}
return result;
return false;
}
}
syn List<MTypeEndpointDefinition> MRagConnect.receivingTreeListEndpoints() {
syn Set<TypeDecl> RagConnect.typesForReceivingListEndpoints() {
List<MTypeEndpointDefinition> result = new ArrayList<>();
Set<TypeDecl> result = new HashSet<>();
for (var mEndpointDef : getTypeReceiveDefinitionList()) {
for (EndpointDefinition endpointDef : getEndpointDefinitionList()) {
if (mEndpointDef.typeIsList()) {
if (endpointDef.typeIsList() && !endpointDef.getSend()) {
result.add(mEndpointDef);
result.add(endpointDef.type().getTypeDecl());
}
}
}
}
return result;
return result;
}
}
syn List<TypeDecl> MRagConnect.typesForReceivingListEndpoints() {
return receivingTreeListEndpoints().stream()
.map(mEndpointDef -> mEndpointDef.type().getTypeDecl())
.distinct()
.collect(java.util.stream.Collectors.toList());
}
// --- MEndpointDefinition ---
syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue();
syn String MEndpointDefinition.preemptiveExpectedValue();
syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn();
syn String MEndpointDefinition.preemptiveReturn();
syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName();
syn EndpointDefinition MEndpointDefinition.endpointDef();
syn String EndpointDefinition.parentTypeName() = toMustache().parentTypeName();
syn String MEndpointDefinition.firstInputVarName();
syn String EndpointDefinition.entityName() = toMustache().entityName();
syn String MEndpointDefinition.parentTypeName();
syn String EndpointDefinition.updateMethod() = toMustache().updateMethod();
syn String MEndpointDefinition.entityName();
syn String EndpointDefinition.writeMethod() = toMustache().writeMethod();
syn String MEndpointDefinition.updateMethod();
syn String EndpointDefinition.getterMethod() = toMustache().getterMethod();
syn String MEndpointDefinition.writeMethod();
syn String MEndpointDefinition.getterMethod();
eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive";
eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
syn String MEndpointDefinition.connectParameterName() = "uriString";
syn String EndpointDefinition.connectParameterName() = "uriString";
syn String MEndpointDefinition.connectMethod() = "connect" + entityName();
syn String EndpointDefinition.connectMethod() = "connect" + entityName();
syn String MEndpointDefinition.internalConnectMethod() = "_internal_" + connectMethod();
syn String EndpointDefinition.internalConnectMethod() = "_internal_" + connectMethod();
syn boolean MEndpointDefinition.isTypeEndpointDefinition() = endpointDef().isTypeEndpointDefinition();
syn boolean EndpointDefinition.isTypeEndpointDefinition() = endpointDef().isTypeEndpointDefinition();
syn String MEndpointDefinition.disconnectMethod() {
syn String EndpointDefinition.disconnectMethod() {
 
// TODO unclear. rework, when lookup methods are done.
// if both (send and receive) are defined for an endpoint, ensure methods with different names
// if both (send and receive) are defined for an endpoint, ensure methods with different names
String extra;
String extra;
if (endpointDef().isTokenEndpointDefinition()) {
if (endpointDef().isTokenEndpointDefinition()) {
@@ -75,21 +72,35 @@ aspect AttributesForMustache {
@@ -75,21 +72,35 @@ aspect AttributesForMustache {
}
}
return "disconnect" + extra + entityName();
return "disconnect" + extra + entityName();
}
}
 
// TODO potentially dangerous because asXEndpointDefinition can return null
 
syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken();
 
syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType();
 
syn String EndpointDefinition.tokenName() = token().getName();
 
syn String EndpointDefinition.typeName() = type().getName();
 
syn String EndpointDefinition.typeDeclName() = type().getTypeDecl().getName();
 
}
syn String MEndpointDefinition.uniqueSuffix();
aspect OldStuff {
eq MTokenSendDefinition.uniqueSuffix() = "Send";
// --- EndpointDefinition ---
eq MTokenReceiveDefinition.uniqueSuffix() = "Receive";
syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
eq MTypeSendDefinition.uniqueSuffix() = "Send";
eq MTypeReceiveDefinition.uniqueSuffix() = "Receive";
// TODO potentially dangerous because asXEndpointDefinition can return null
// --- MEndpointDefinition ---
syn TokenComponent MEndpointDefinition.token() = endpointDef().asTokenEndpointDefinition().getToken();
syn String MEndpointDefinition.preemptiveExpectedValue();
syn TypeComponent MEndpointDefinition.type() = endpointDef().asTypeEndpointDefinition().getType();
syn String MEndpointDefinition.preemptiveReturn();
syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply();
syn EndpointDefinition MEndpointDefinition.endpointDef();
syn boolean MEndpointDefinition.typeIsList() = endpointDef().typeIsList();
syn String MEndpointDefinition.firstInputVarName();
syn String MEndpointDefinition.tokenName() = token().getName();
syn String MEndpointDefinition.parentTypeName();
syn String MEndpointDefinition.typeName() = type().getName();
syn String MEndpointDefinition.entityName();
syn String MEndpointDefinition.typeDeclName() = type().getTypeDecl().getName();
syn String MEndpointDefinition.updateMethod();
 
syn String MEndpointDefinition.writeMethod();
 
syn String MEndpointDefinition.getterMethod();
 
 
eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
 
eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
 
 
}
 
 
aspect AttributesForMustache {
syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName();
syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName();
@@ -199,7 +210,6 @@ aspect AttributesForMustache {
@@ -199,7 +210,6 @@ aspect AttributesForMustache {
// --- MTypeComponent ---
// --- MTypeComponent ---
syn String MTypeComponent.name() = getTypeComponent().getName();
syn String MTypeComponent.name() = getTypeComponent().getName();
inh boolean MTypeComponent.isFirst();
// --- MTokenComponent ---
// --- MTokenComponent ---
syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
Loading