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

Begin with typeEndpointDefinitions, add more tests, fix some bugs.

- mappings bug fixed: boxed types handled correctly now
- mappings bug fixed: type of last transformation correctly used now
- add junit report to ci
parent 70ccb958
No related branches found
No related tags found
1 merge request!5Testing incremental dependency tracking.
Pipeline #8700 passed
Showing
with 458 additions and 119 deletions
...@@ -21,7 +21,7 @@ build: ...@@ -21,7 +21,7 @@ build:
- ./gradlew --console=plain --no-daemon assemble jar - ./gradlew --console=plain --no-daemon assemble jar
artifacts: artifacts:
paths: paths:
- "/builds/jastadd/ragconnect/ragconnect.base/build/libs/ragconnect-*.jar" - "ragconnect.base/build/libs/ragconnect-*.jar"
expire_in: 1 week expire_in: 1 week
test: test:
...@@ -34,7 +34,7 @@ test: ...@@ -34,7 +34,7 @@ test:
- ./gradlew --console=plain --no-daemon allTests - ./gradlew --console=plain --no-daemon allTests
artifacts: artifacts:
reports: reports:
junit: "/builds/jastadd/ragconnect/ragconnect.tests/build/test-results/test/TEST-*.xml" junit: "ragconnect.tests/build/test-results/test/**/TEST-*.xml"
expire_in: 1 week expire_in: 1 week
publish: publish:
......
...@@ -12,6 +12,19 @@ aspect Analysis { ...@@ -12,6 +12,19 @@ aspect Analysis {
return result; return result;
} }
// --- lookupTypeEndpointDefinition ---
inh java.util.List<TypeEndpointDefinition> TypeEndpointDefinition.lookupTypeEndpointDefinitions(TypeComponent type);
eq RagConnect.getEndpointDefinition().lookupTypeEndpointDefinitions(TypeComponent type) = lookupTypeEndpointDefinitions(type);
syn java.util.List<TypeEndpointDefinition> RagConnect.lookupTypeEndpointDefinitions(TypeComponent type) {
java.util.List<TypeEndpointDefinition> result = new java.util.ArrayList<>();
for (EndpointDefinition def : getEndpointDefinitionList()) {
if (def.isTypeEndpointDefinition() && def.asTypeEndpointDefinition().getType().equals(type)) {
result.add(def.asTypeEndpointDefinition());
}
}
return result;
}
// --- lookupDependencyDefinition --- // --- lookupDependencyDefinition ---
inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id); inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id);
eq RagConnect.getDependencyDefinition().lookupDependencyDefinition(TypeDecl source, String id) { eq RagConnect.getDependencyDefinition().lookupDependencyDefinition(TypeDecl source, String id) {
...@@ -31,10 +44,12 @@ aspect Analysis { ...@@ -31,10 +44,12 @@ aspect Analysis {
} }
syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this; syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this;
// --- matchesType ---
syn boolean TokenEndpointDefinition.matchesType(TokenEndpointDefinition other); syn boolean TokenEndpointDefinition.matchesType(TokenEndpointDefinition other);
eq ReceiveTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isReceiveTokenEndpointDefinition(); eq ReceiveTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isReceiveTokenEndpointDefinition();
eq SendTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isSendTokenEndpointDefinition(); eq SendTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isSendTokenEndpointDefinition();
// --- assignableTo ---
syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target); syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target);
eq JavaMappingDefinitionType.assignableTo(JavaTypeUse target) = getType().assignableTo(target); eq JavaMappingDefinitionType.assignableTo(JavaTypeUse target) = getType().assignableTo(target);
eq JavaArrayMappingDefinitionType.assignableTo(JavaTypeUse target) { eq JavaArrayMappingDefinitionType.assignableTo(JavaTypeUse target) {
...@@ -65,6 +80,7 @@ aspect Analysis { ...@@ -65,6 +80,7 @@ aspect Analysis {
// --- shouldSendValue --- // --- shouldSendValue ---
syn boolean TokenEndpointDefinition.shouldSendValue() = isSendTokenEndpointDefinition() && !getToken().getNTA(); syn boolean TokenEndpointDefinition.shouldSendValue() = isSendTokenEndpointDefinition() && !getToken().getNTA();
syn boolean TypeEndpointDefinition.shouldSendValue() = isSendTypeEndpointDefinition() && !getType().getNTA();
// --- needProxyToken --- // --- needProxyToken ---
syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || getTokenEndpointDefinitionList().stream().anyMatch(TokenEndpointDefinition::shouldSendValue); syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || getTokenEndpointDefinitionList().stream().anyMatch(TokenEndpointDefinition::shouldSendValue);
......
...@@ -32,6 +32,10 @@ aspect Errors { ...@@ -32,6 +32,10 @@ aspect Errors {
when isAlreadyDefined() when isAlreadyDefined()
to RagConnect.errors(); to RagConnect.errors();
SendTypeEndpointDefinition contributes error("At least one mapping needs to be used")
when effectiveMappings().isEmpty()
to RagConnect.errors();
DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID()) DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID())
when isAlreadyDefined() when isAlreadyDefined()
to RagConnect.errors(); to RagConnect.errors();
......
...@@ -11,4 +11,20 @@ aspect NameResolution { ...@@ -11,4 +11,20 @@ aspect NameResolution {
return null; return null;
} }
refine RefResolverStubs eq ASTNode.globallyResolveTypeComponentByToken(String id) {
// return a TypeComponent. id is of the form 'parent_type_name + "." + child_type_name'
int dotIndex = id.indexOf(".");
String parentTypeName = id.substring(0, dotIndex);
String childTypeName = id.substring(dotIndex + 1);
TypeDecl type = program().resolveTypeDecl(parentTypeName);
// iterate over components and find the matching typeComponent
for (Component comp : type.getComponentList()) {
if (comp.isTypeComponent() && comp.getName().equals(childTypeName)) {
return comp.asTypeComponent();
}
}
System.err.println("Could not resolve TypeComponent '" + id + "'.");
return null;
}
} }
...@@ -27,13 +27,13 @@ aspect Navigation { ...@@ -27,13 +27,13 @@ aspect Navigation {
syn TokenEndpointDefinition EndpointDefinition.asTokenEndpointDefinition() = null; syn TokenEndpointDefinition EndpointDefinition.asTokenEndpointDefinition() = null;
eq TokenEndpointDefinition.asTokenEndpointDefinition() = this; eq TokenEndpointDefinition.asTokenEndpointDefinition() = this;
// --- isSendTokenEndpointDefinition --- // --- isTypeEndpointDefinition ---
syn boolean EndpointDefinition.isSendTokenEndpointDefinition() = false; syn boolean EndpointDefinition.isTypeEndpointDefinition() = false;
eq SendTokenEndpointDefinition.isSendTokenEndpointDefinition() = true; eq TypeEndpointDefinition.isTypeEndpointDefinition() = true;
// --- asSendTokenEndpointDefinition --- // --- asTypeEndpointDefinition ---
syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null; syn TypeEndpointDefinition EndpointDefinition.asTypeEndpointDefinition() = null;
eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this; eq TypeEndpointDefinition.asTypeEndpointDefinition() = this;
// --- isReceiveTokenEndpointDefinition --- // --- isReceiveTokenEndpointDefinition ---
syn boolean EndpointDefinition.isReceiveTokenEndpointDefinition() = false; syn boolean EndpointDefinition.isReceiveTokenEndpointDefinition() = false;
...@@ -43,6 +43,30 @@ aspect Navigation { ...@@ -43,6 +43,30 @@ aspect Navigation {
syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null; syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null;
eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this; eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this;
// --- isSendTokenEndpointDefinition ---
syn boolean EndpointDefinition.isSendTokenEndpointDefinition() = false;
eq SendTokenEndpointDefinition.isSendTokenEndpointDefinition() = true;
// --- asSendTokenEndpointDefinition ---
syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null;
eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this;
// --- isReceiveTypeEndpointDefinition ---
syn boolean EndpointDefinition.isReceiveTypeEndpointDefinition() = false;
eq ReceiveTypeEndpointDefinition.isReceiveTypeEndpointDefinition() = true;
// --- asReceiveTypeEndpointDefinition ---
syn ReceiveTypeEndpointDefinition EndpointDefinition.asReceiveTypeEndpointDefinition() = null;
eq ReceiveTypeEndpointDefinition.asReceiveTypeEndpointDefinition() = this;
// --- isSendTypeEndpointDefinition ---
syn boolean EndpointDefinition.isSendTypeEndpointDefinition() = false;
eq SendTypeEndpointDefinition.isSendTypeEndpointDefinition() = true;
// --- asSendTypeEndpointDefinition ---
syn SendTypeEndpointDefinition EndpointDefinition.asSendTypeEndpointDefinition() = null;
eq SendTypeEndpointDefinition.asSendTypeEndpointDefinition() = this;
// --- targetEndpointDefinition --- // --- targetEndpointDefinition ---
syn SendTokenEndpointDefinition DependencyDefinition.targetEndpointDefinition() { syn SendTokenEndpointDefinition DependencyDefinition.targetEndpointDefinition() {
// resolve definition in here, as we do not need resolveMethod in any other place (yet) // resolve definition in here, as we do not need resolveMethod in any other place (yet)
......
...@@ -10,6 +10,12 @@ rel TokenEndpointDefinition.Token <-> TokenComponent.TokenEndpointDefinition*; ...@@ -10,6 +10,12 @@ rel TokenEndpointDefinition.Token <-> TokenComponent.TokenEndpointDefinition*;
ReceiveTokenEndpointDefinition : TokenEndpointDefinition; ReceiveTokenEndpointDefinition : TokenEndpointDefinition;
SendTokenEndpointDefinition : TokenEndpointDefinition; SendTokenEndpointDefinition : TokenEndpointDefinition;
abstract TypeEndpointDefinition : EndpointDefinition;
rel TypeEndpointDefinition.Type <-> TypeComponent.TypeEndpointDefinition*;
ReceiveTypeEndpointDefinition : TypeEndpointDefinition;
SendTypeEndpointDefinition : TypeEndpointDefinition;
DependencyDefinition ::= <ID>; DependencyDefinition ::= <ID>;
rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*; rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*;
rel DependencyDefinition.Target -> TokenComponent; rel DependencyDefinition.Target -> TokenComponent;
......
...@@ -18,29 +18,42 @@ aspect AttributesForMustache { ...@@ -18,29 +18,42 @@ aspect AttributesForMustache {
// --- MEndpointDefinition --- // --- MEndpointDefinition ---
syn String MEndpointDefinition.preemptiveExpectedValue(); syn String MEndpointDefinition.preemptiveExpectedValue();
syn String MEndpointDefinition.preemptiveReturn(); syn String MEndpointDefinition.preemptiveReturn();
syn TokenEndpointDefinition MEndpointDefinition.endpointDef(); syn EndpointDefinition MEndpointDefinition.endpointDef();
syn String MEndpointDefinition.firstInputVarName(); syn String MEndpointDefinition.firstInputVarName();
syn String MEndpointDefinition.parentTypeName();
syn String MEndpointDefinition.entityName();
eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1; eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName(); eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
syn String MEndpointDefinition.connectParameterName() = "uriString"; syn String MEndpointDefinition.connectParameterName() = "uriString";
syn String MEndpointDefinition.connectMethod() = "connect" + tokenName(); syn String MEndpointDefinition.connectMethod() = "connect" + entityName();
syn String MEndpointDefinition.disconnectMethod() { syn String MEndpointDefinition.disconnectMethod() {
// if both (send and receive) are defined for the token, ensure methods with different names // if both (send and receive) are defined for the token, ensure methods with different names
String extra = endpointDef().lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : ""; String extra;
return "disconnect" + extra + tokenName(); if (endpointDef().isTokenEndpointDefinition()) {
extra = endpointDef().asTokenEndpointDefinition().lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : "";
} else if (endpointDef().isTypeEndpointDefinition()) {
extra = endpointDef().asTypeEndpointDefinition().lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : "";
} else {
extra = "";
}
return "disconnect" + extra + entityName();
} }
//
syn String MEndpointDefinition.uniqueSuffix(); syn String MEndpointDefinition.uniqueSuffix();
eq MSendDefinition.uniqueSuffix() = "Send"; eq MTokenSendDefinition.uniqueSuffix() = "Send";
eq MReceiveDefinition.uniqueSuffix() = "Receive"; eq MTokenReceiveDefinition.uniqueSuffix() = "Receive";
eq MTypeSendDefinition.uniqueSuffix() = "Send";
eq MTypeReceiveDefinition.uniqueSuffix() = "Receive";
syn TokenComponent MEndpointDefinition.token() = endpointDef().getToken(); // TODO potentially dangerous because asXEndpointDefinition can return null
syn TokenComponent MEndpointDefinition.token() = endpointDef().asTokenEndpointDefinition().getToken();
syn TypeComponent MEndpointDefinition.type() = endpointDef().asTypeEndpointDefinition().getType();
syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply(); syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply();
syn String MEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName();
syn String MEndpointDefinition.tokenName() = token().getName(); syn String MEndpointDefinition.tokenName() = token().getName();
syn String MEndpointDefinition.typeName() = type().getName();
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();
...@@ -51,12 +64,20 @@ aspect AttributesForMustache { ...@@ -51,12 +64,20 @@ aspect AttributesForMustache {
if (token().isPrimitiveType() && lastDefinition().mappingDef().getToType().isPrimitiveType()) { if (token().isPrimitiveType() && lastDefinition().mappingDef().getToType().isPrimitiveType()) {
return preemptiveExpectedValue() + " == " + lastResult(); return preemptiveExpectedValue() + " == " + lastResult();
} }
if (lastDefinition().mappingDef().isDefaultMappingDefinition()) { if (lastDefinition().mappingDef().getToType().isPrimitiveType() || lastDefinition().mappingDef().isDefaultMappingDefinition()) {
return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")"; return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")";
} }
return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null"; return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null";
} }
// --- MTokenEndpointDefinition ---
eq MTokenEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName();
eq MTokenEndpointDefinition.entityName() = tokenName();
// --- MTypeEndpointDefinition ---
eq MTypeEndpointDefinition.parentTypeName() = type().containingTypeDecl().getName();
eq MTypeEndpointDefinition.entityName() = typeName();
// --- MInnerMappingDefinition --- // --- MInnerMappingDefinition ---
inh boolean MInnerMappingDefinition.isLast(); inh boolean MInnerMappingDefinition.isLast();
inh String MInnerMappingDefinition.inputVarName(); inh String MInnerMappingDefinition.inputVarName();
...@@ -65,24 +86,43 @@ aspect AttributesForMustache { ...@@ -65,24 +86,43 @@ aspect AttributesForMustache {
syn MappingDefinition MInnerMappingDefinition.mappingDef() = getMMappingDefinition().getMappingDefinition(); syn MappingDefinition MInnerMappingDefinition.mappingDef() = getMMappingDefinition().getMappingDefinition();
syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one syn String MInnerMappingDefinition.outputVarName() = "result" + methodName(); // we do not need "_" in between here, because methodName begins with one
// --- MReceiveDefinition --- // --- MTokenReceiveDefinition ---
eq MReceiveDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()"; eq MTokenReceiveDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()";
eq MReceiveDefinition.preemptiveReturn() = "return;"; eq MTokenReceiveDefinition.preemptiveReturn() = "return;";
eq MReceiveDefinition.endpointDef() = getReceiveTokenEndpointDefinition(); eq MTokenReceiveDefinition.endpointDef() = getReceiveTokenEndpointDefinition();
eq MReceiveDefinition.firstInputVarName() = "message"; eq MTokenReceiveDefinition.firstInputVarName() = "message";
// --- MSendDefinition --- // --- MTokenSendDefinition ---
eq MSendDefinition.preemptiveExpectedValue() = lastValue(); eq MTokenSendDefinition.preemptiveExpectedValue() = lastValue();
eq MSendDefinition.preemptiveReturn() = "return false;"; eq MTokenSendDefinition.preemptiveReturn() = "return false;";
eq MSendDefinition.endpointDef() = getSendTokenEndpointDefinition(); eq MTokenSendDefinition.endpointDef() = getSendTokenEndpointDefinition();
eq MSendDefinition.firstInputVarName() = "get" + tokenName() + "()"; eq MTokenSendDefinition.firstInputVarName() = "get" + tokenName() + "()";
syn String MSendDefinition.sender() = "_sender_" + tokenName(); syn String MTokenSendDefinition.sender() = "_sender_" + tokenName();
syn String MSendDefinition.lastValue() = "_lastValue" + tokenName(); syn String MTokenSendDefinition.lastValue() = "_lastValue" + tokenName();
syn String MSendDefinition.updateMethod() = "_update_" + tokenName(); syn String MTokenSendDefinition.updateMethod() = "_update_" + tokenName();
syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName(); syn String MTokenSendDefinition.writeMethod() = "_writeLastValue_" + tokenName();
syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset"; syn String MTokenSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset";
syn boolean MSendDefinition.shouldSendValue() = endpointDef().shouldSendValue(); syn boolean MTokenSendDefinition.shouldSendValue() = endpointDef().asTokenEndpointDefinition().shouldSendValue();
// MTypeReceiveDefinition
eq MTypeReceiveDefinition.preemptiveExpectedValue() = null;
eq MTypeReceiveDefinition.preemptiveReturn() = null;
eq MTypeReceiveDefinition.endpointDef() = getReceiveTypeEndpointDefinition();
eq MTypeReceiveDefinition.firstInputVarName() = null;
// MTypeSendDefinition
eq MTypeSendDefinition.preemptiveExpectedValue() = null;
eq MTypeSendDefinition.preemptiveReturn() = null;
eq MTypeSendDefinition.endpointDef() = getSendTypeEndpointDefinition();
eq MTypeSendDefinition.firstInputVarName() = null;
syn String MTypeSendDefinition.sender() = "_sender_" + typeName();
syn String MTypeSendDefinition.lastValue() = "_lastValue" + typeName();
syn String MTypeSendDefinition.updateMethod() = "_update_" + typeName();
syn String MTypeSendDefinition.writeMethod() = "_writeLastValue_" + typeName();
syn String MTypeSendDefinition.tokenResetMethod() = "get" + typeName() + "_reset";
syn boolean MTypeSendDefinition.shouldSendValue() = endpointDef().asTypeEndpointDefinition().shouldSendValue();
// --- MMappingDefinition --- // --- MMappingDefinition ---
syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint(); syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint();
...@@ -96,7 +136,7 @@ aspect AttributesForMustache { ...@@ -96,7 +136,7 @@ aspect AttributesForMustache {
syn String MDependencyDefinition.dependencyMethod() = "add" + capitalize(getDependencyDefinition().getID()); syn String MDependencyDefinition.dependencyMethod() = "add" + capitalize(getDependencyDefinition().getID());
syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName(); syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName();
syn String MDependencyDefinition.internalRelationPrefix() = "_internal_" + getDependencyDefinition().getID(); syn String MDependencyDefinition.internalRelationPrefix() = "_internal_" + getDependencyDefinition().getID();
syn nta MSendDefinition MDependencyDefinition.targetEndpointDefinition() { syn nta MTokenSendDefinition MDependencyDefinition.targetEndpointDefinition() {
return getDependencyDefinition().targetEndpointDefinition().toMustache(); return getDependencyDefinition().targetEndpointDefinition().toMustache();
} }
...@@ -110,7 +150,7 @@ aspect AttributesForMustache { ...@@ -110,7 +150,7 @@ aspect AttributesForMustache {
syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint(); syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint();
syn String MTokenComponent.internalName() = getTokenComponent().needProxyToken() ? "_internal_" + name() : externalName(); syn String MTokenComponent.internalName() = getTokenComponent().needProxyToken() ? "_internal_" + name() : externalName();
syn String MTokenComponent.externalName() = name(); syn String MTokenComponent.externalName() = name();
syn MSendDefinition MTokenComponent.normalTokenSendDef() { syn MTokenSendDefinition MTokenComponent.normalTokenSendDef() {
for (TokenEndpointDefinition endpointDef : getTokenComponent().getTokenEndpointDefinitionList()) { for (TokenEndpointDefinition endpointDef : getTokenComponent().getTokenEndpointDefinitionList()) {
if (endpointDef.shouldSendValue()) { if (endpointDef.shouldSendValue()) {
return endpointDef.asSendTokenEndpointDefinition().toMustache(); return endpointDef.asSendTokenEndpointDefinition().toMustache();
...@@ -124,11 +164,16 @@ aspect AttributesForMustache { ...@@ -124,11 +164,16 @@ aspect AttributesForMustache {
MRagConnect result = new MRagConnect(); MRagConnect result = new MRagConnect();
result.setRagConnect(this); result.setRagConnect(this);
for (EndpointDefinition def : getEndpointDefinitionList()) { for (EndpointDefinition def : getEndpointDefinitionList()) {
if (def.isSendTokenEndpointDefinition()) { if (def.isReceiveTokenEndpointDefinition()) {
SendTokenEndpointDefinition sendDef = def.asSendTokenEndpointDefinition(); result.addTokenReceiveDefinition(def.asReceiveTokenEndpointDefinition().toMustache());
result.addSendDefinition(sendDef.toMustache()); } else if (def.isSendTokenEndpointDefinition()) {
result.addTokenSendDefinition(def.asSendTokenEndpointDefinition().toMustache());
} else if (def.isReceiveTypeEndpointDefinition()) {
result.addTypeReceiveDefinition(def.asReceiveTypeEndpointDefinition().toMustache());
} else if (def.isSendTypeEndpointDefinition()) {
result.addTypeSendDefinition(def.asSendTypeEndpointDefinition().toMustache());
} else { } else {
result.addReceiveDefinition(def.asReceiveTokenEndpointDefinition().toMustache()); throw new RuntimeException("Unknown endpoint definition: " + def);
} }
} }
for (MappingDefinition def : allMappingDefinitions()) { for (MappingDefinition def : allMappingDefinitions()) {
...@@ -163,20 +208,34 @@ aspect AttributesForMustache { ...@@ -163,20 +208,34 @@ aspect AttributesForMustache {
} }
} }
syn lazy MReceiveDefinition ReceiveTokenEndpointDefinition.toMustache() { syn lazy MTokenReceiveDefinition ReceiveTokenEndpointDefinition.toMustache() {
MReceiveDefinition result = new MReceiveDefinition(); MTokenReceiveDefinition result = new MTokenReceiveDefinition();
result.setReceiveTokenEndpointDefinition(this); result.setReceiveTokenEndpointDefinition(this);
result.addInnerMappings(); result.addInnerMappings();
return result; return result;
} }
syn lazy MSendDefinition SendTokenEndpointDefinition.toMustache() { syn lazy MTokenSendDefinition SendTokenEndpointDefinition.toMustache() {
MSendDefinition result = new MSendDefinition(); MTokenSendDefinition result = new MTokenSendDefinition();
result.setSendTokenEndpointDefinition(this); result.setSendTokenEndpointDefinition(this);
result.addInnerMappings(); result.addInnerMappings();
return result; return result;
} }
syn lazy MTypeReceiveDefinition ReceiveTypeEndpointDefinition.toMustache() {
MTypeReceiveDefinition result = new MTypeReceiveDefinition();
result.setReceiveTypeEndpointDefinition(this);
result.addInnerMappings();
return result;
}
syn lazy MTypeSendDefinition SendTypeEndpointDefinition.toMustache() {
MTypeSendDefinition result = new MTypeSendDefinition();
result.setSendTypeEndpointDefinition(this);
result.addInnerMappings();
return result;
}
syn lazy MMappingDefinition MappingDefinition.toMustache() { syn lazy MMappingDefinition MappingDefinition.toMustache() {
MMappingDefinition result = new MMappingDefinition(); MMappingDefinition result = new MMappingDefinition();
result.setMappingDefinition(this); result.setMappingDefinition(this);
......
...@@ -79,45 +79,33 @@ aspect DefaultMappings { ...@@ -79,45 +79,33 @@ aspect DefaultMappings {
aspect Mappings { aspect Mappings {
// --- effectiveMappings --- // --- effectiveMappings ---
syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings(); syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings() {
eq ReceiveTokenEndpointDefinition.effectiveMappings() {
// if there is a first mapping, check if it is suitable.
// or if no mappings are specified.
// then prepend the suitable default mapping
java.util.List<MappingDefinition> result; java.util.List<MappingDefinition> result;
if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) { if (isReceiveTokenEndpointDefinition() || isReceiveTypeEndpointDefinition()) {
// if no mappings are specified, or if first mapping is not suitable.
// then prepend the suitable default mapping
if (getMappingList().isEmpty() || !getMappingList().get(0).getFromType().isByteArray()) {
result = new java.util.ArrayList(); result = new java.util.ArrayList();
result.add(suitableDefaultMapping()); result.add(suitableReceiveDefaultMapping());
result.addAll(getMappingList()); result.addAll(getMappingList());
} else { } else {
result = getMappingList(); result = getMappingList();
} }
return result; } else if (isSendTokenEndpointDefinition() || isSendTypeEndpointDefinition()) {
} // if no mappings are specified, or if last mapping is not suitable
eq SendTokenEndpointDefinition.effectiveMappings() {
// if there is a mapping, check if it is suitable.
// or if no mappings are specified.
// then append the suitable default mapping // then append the suitable default mapping
java.util.List<MappingDefinition> result; if (getMappingList().isEmpty() || !getMappingList().get(getMappingList().size() - 1).getToType().isByteArray()) {
if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) {
result = new java.util.ArrayList(getMappingList()); result = new java.util.ArrayList(getMappingList());
result.add(suitableDefaultMapping()); result.add(suitableSendDefaultMapping());
} else { } else {
result = getMappingList(); result = getMappingList();
} }
} else {
throw new RuntimeException("Unknown endpoint definition: " + this);
}
return result; return result;
} }
// --- hasSuitableEdgeMapping ---
syn boolean TokenEndpointDefinition.hasSuitableEdgeMapping();
eq ReceiveTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(0));
eq SendTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(getMappingList().size() - 1));
// --- isSuitableEdgeMapping(def) ---
syn boolean TokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def);
eq ReceiveTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getFromType().isByteArray();
eq SendTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getToType().isByteArray();
// --- isPrimitiveType --- // --- isPrimitiveType ---
syn boolean TokenComponent.isPrimitiveType() = effectiveJavaTypeUse().isPrimitiveType(); syn boolean TokenComponent.isPrimitiveType() = effectiveJavaTypeUse().isPrimitiveType();
syn boolean JavaTypeUse.isPrimitiveType() = false; syn boolean JavaTypeUse.isPrimitiveType() = false;
...@@ -140,13 +128,9 @@ aspect Mappings { ...@@ -140,13 +128,9 @@ aspect Mappings {
syn boolean MappingDefinitionType.isArray() = false; syn boolean MappingDefinitionType.isArray() = false;
eq JavaArrayMappingDefinitionType.isArray() = true; eq JavaArrayMappingDefinitionType.isArray() = true;
// --- suitableDefaultMapping --- // --- suitableReceiveDefaultMapping ---
syn DefaultMappingDefinition EndpointDefinition.suitableDefaultMapping(); syn DefaultMappingDefinition EndpointDefinition.suitableReceiveDefaultMapping() {
eq ReceiveTokenEndpointDefinition.suitableDefaultMapping() { switch (targetTypeName()) {
String typeName = getMappingList().isEmpty() ?
getToken().effectiveJavaTypeUse().getName() :
getMappingList().get(0).getFromType().prettyPrint();
switch(typeName) {
case "int": case "int":
case "Integer": return ragconnect().defaultBytesToIntMapping(); case "Integer": return ragconnect().defaultBytesToIntMapping();
case "short": case "short":
...@@ -163,11 +147,9 @@ aspect Mappings { ...@@ -163,11 +147,9 @@ aspect Mappings {
default: return null; default: return null;
} }
} }
eq SendTokenEndpointDefinition.suitableDefaultMapping() { // --- suitableSendDefaultMapping ---
String typeName = getMappingList().isEmpty() ? syn DefaultMappingDefinition EndpointDefinition.suitableSendDefaultMapping() {
getToken().effectiveJavaTypeUse().getName() : switch (targetTypeName()) {
getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint();
switch(typeName) {
case "int": case "int":
case "Integer": return ragconnect().defaultIntToBytesMapping(); case "Integer": return ragconnect().defaultIntToBytesMapping();
case "short": case "short":
...@@ -184,6 +166,26 @@ aspect Mappings { ...@@ -184,6 +166,26 @@ aspect Mappings {
default: return null; default: return null;
} }
} }
// --- targetTypeName ---
syn String EndpointDefinition.targetTypeName();
eq ReceiveTokenEndpointDefinition.targetTypeName() {
return getMappingList().isEmpty() ?
getToken().effectiveJavaTypeUse().getName() :
getMappingList().get(0).getFromType().prettyPrint();
}
eq ReceiveTypeEndpointDefinition.targetTypeName() {
return getMappingList().get(0).getFromType().prettyPrint();
}
eq SendTokenEndpointDefinition.targetTypeName() {
return getMappingList().isEmpty() ?
getToken().effectiveJavaTypeUse().getName() :
getMappingList().get(getMappingList().size() - 1).getToType().prettyPrint();
}
eq SendTypeEndpointDefinition.targetTypeName() {
return getMappingList().get(getMappingList().size() - 1).getToType().prettyPrint();
}
// eq ReceiveFromRestDefinition.suitableDefaultMapping() { // eq ReceiveFromRestDefinition.suitableDefaultMapping() {
// String typeName = getMappingList().isEmpty() ? // String typeName = getMappingList().isEmpty() ?
// getToken().getJavaTypeUse().getName() : // getToken().getJavaTypeUse().getName() :
......
MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent* Handler:MHandler*; MRagConnect ::= TokenReceiveDefinition:MTokenReceiveDefinition* TokenSendDefinition:MTokenSendDefinition* TypeReceiveDefinition:MTypeReceiveDefinition* TypeSendDefinition:MTypeSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent* Handler:MHandler*;
abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*; abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*;
MReceiveDefinition : MEndpointDefinition; abstract MTokenEndpointDefinition : MEndpointDefinition;
MSendDefinition : MEndpointDefinition; MTokenReceiveDefinition : MTokenEndpointDefinition;
MTokenSendDefinition : MTokenEndpointDefinition;
abstract MTypeEndpointDefinition : MEndpointDefinition;
MTypeReceiveDefinition : MTypeEndpointDefinition;
MTypeSendDefinition : MTypeEndpointDefinition;
MMappingDefinition; MMappingDefinition;
MInnerMappingDefinition; MInnerMappingDefinition;
MDependencyDefinition; MDependencyDefinition;
...@@ -11,8 +17,10 @@ MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boole ...@@ -11,8 +17,10 @@ MHandler ::= <ClassName> <Construction> <AttributeName> <FieldName> <InUse:boole
rel MRagConnect.RagConnect -> RagConnect; rel MRagConnect.RagConnect -> RagConnect;
rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition; rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition;
rel MReceiveDefinition.ReceiveTokenEndpointDefinition -> ReceiveTokenEndpointDefinition; rel MTokenReceiveDefinition.ReceiveTokenEndpointDefinition -> ReceiveTokenEndpointDefinition;
rel MSendDefinition.SendTokenEndpointDefinition -> SendTokenEndpointDefinition; rel MTokenSendDefinition.SendTokenEndpointDefinition -> SendTokenEndpointDefinition;
rel MTypeReceiveDefinition.ReceiveTypeEndpointDefinition -> ReceiveTypeEndpointDefinition;
rel MTypeSendDefinition.SendTypeEndpointDefinition -> SendTypeEndpointDefinition;
rel MMappingDefinition.MappingDefinition -> MappingDefinition; rel MMappingDefinition.MappingDefinition -> MappingDefinition;
rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition; rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition;
rel MTypeComponent.TypeComponent -> TypeComponent; rel MTypeComponent.TypeComponent -> TypeComponent;
......
...@@ -25,19 +25,33 @@ aspect MustacheNodesToYAML { ...@@ -25,19 +25,33 @@ aspect MustacheNodesToYAML {
root.put("restHandlerField", restHandlerField()); root.put("restHandlerField", restHandlerField());
root.put("restHandlerAttribute", restHandlerAttribute()); root.put("restHandlerAttribute", restHandlerAttribute());
// ReceiveDefinitions // TokenReceiveDefinitions
ListElement receiveDefinitions = new ListElement(); ListElement receiveDefinitions = new ListElement();
for (MReceiveDefinition def : getReceiveDefinitionList()) { for (MTokenReceiveDefinition def : getTokenReceiveDefinitionList()) {
receiveDefinitions.addElement(def.toYAML()); receiveDefinitions.addElement(def.toYAML());
} }
root.put("ReceiveDefinitions", receiveDefinitions); root.put("TokenReceiveDefinitions", receiveDefinitions);
// SendDefinitions // TokenSendDefinitions
ListElement sendDefinitions = new ListElement(); ListElement sendDefinitions = new ListElement();
for (MSendDefinition def : getSendDefinitionList()) { for (MTokenSendDefinition def : getTokenSendDefinitionList()) {
sendDefinitions.addElement(def.toYAML()); sendDefinitions.addElement(def.toYAML());
} }
root.put("SendDefinitions", sendDefinitions); root.put("TokenSendDefinitions", sendDefinitions);
// TypeReceiveDefinitions
ListElement typeReceiveDefinitions = new ListElement();
for (MTypeReceiveDefinition def : getTypeReceiveDefinitionList()) {
typeReceiveDefinitions.addElement(def.toYAML());
}
root.put("TypeReceiveDefinitions", typeReceiveDefinitions);
// TypeSendDefinitions
ListElement typeSendDefinitions = new ListElement();
for (MTypeSendDefinition def : getTypeSendDefinitionList()) {
typeSendDefinitions.addElement(def.toYAML());
}
root.put("TypeSendDefinitions", typeSendDefinitions);
// MappingDefinitions // MappingDefinitions
ListElement mappingDefinitions = new ListElement(); ListElement mappingDefinitions = new ListElement();
...@@ -88,13 +102,30 @@ aspect MustacheNodesToYAML { ...@@ -88,13 +102,30 @@ aspect MustacheNodesToYAML {
return result; return result;
} }
syn MappingElement MReceiveDefinition.toYAML() { syn MappingElement MTokenReceiveDefinition.toYAML() {
MappingElement result = super.toYAML();
result.put("loggingEnabledForReads", loggingEnabledForReads);
return result;
}
syn MappingElement MTokenSendDefinition.toYAML() {
MappingElement result = super.toYAML();
result.put("sender", sender());
result.put("lastValue", lastValue());
result.put("loggingEnabledForWrites", loggingEnabledForWrites);
result.put("updateMethod", updateMethod());
result.put("writeMethod", writeMethod());
result.put("tokenResetMethod", tokenResetMethod());
return result;
}
syn MappingElement MTypeReceiveDefinition.toYAML() {
MappingElement result = super.toYAML(); MappingElement result = super.toYAML();
result.put("loggingEnabledForReads", loggingEnabledForReads); result.put("loggingEnabledForReads", loggingEnabledForReads);
return result; return result;
} }
syn MappingElement MSendDefinition.toYAML() { syn MappingElement MTypeSendDefinition.toYAML() {
MappingElement result = super.toYAML(); MappingElement result = super.toYAML();
result.put("sender", sender()); result.put("sender", sender());
result.put("lastValue", lastValue()); result.put("lastValue", lastValue());
......
...@@ -33,12 +33,18 @@ EndpointDefinition endpoint_definition ...@@ -33,12 +33,18 @@ EndpointDefinition endpoint_definition
EndpointDefinition endpoint_definition_type EndpointDefinition endpoint_definition_type
= RECEIVE token_ref {: return new ReceiveTokenEndpointDefinition().setToken(token_ref); :} = RECEIVE token_ref {: return new ReceiveTokenEndpointDefinition().setToken(token_ref); :}
| SEND token_ref {: return new SendTokenEndpointDefinition().setToken(token_ref); :} | SEND token_ref {: return new SendTokenEndpointDefinition().setToken(token_ref); :}
| RECEIVE TREE type_ref {: return new ReceiveTypeEndpointDefinition().setType(type_ref); :}
| SEND TREE type_ref {: return new SendTypeEndpointDefinition().setType(type_ref); :}
; ;
TokenComponent token_ref TokenComponent token_ref
= ID.type_name DOT ID.token_name {: return TokenComponent.createRef(type_name + "." + token_name); :} = ID.type_name DOT ID.token_name {: return TokenComponent.createRef(type_name + "." + token_name); :}
; ;
TypeComponent type_ref
= ID.parent_type_name DOT ID.child_type_name {: return TypeComponent.createRef(parent_type_name + "." + child_type_name); :}
;
ArrayList string_list ArrayList string_list
= ID = ID
| string_list COMMA ID | string_list COMMA ID
......
...@@ -5,3 +5,4 @@ ...@@ -5,3 +5,4 @@
"maps" { return sym(Terminals.MAPS); } "maps" { return sym(Terminals.MAPS); }
"to" { return sym(Terminals.TO); } "to" { return sym(Terminals.TO); }
"as" { return sym(Terminals.AS); } "as" { return sym(Terminals.AS); }
"tree" { return sym(Terminals.TREE); }
{{#usesMqtt}}{{> mqtt}}{{/usesMqtt}} {{#usesMqtt}}{{> mqtt}}{{/usesMqtt}}
{{> handler}} {{> handler}}
aspect RagConnect { aspect RagConnect {
{{#ReceiveDefinitions}} {{#TokenReceiveDefinitions}}
{{> receiveDefinition}} {{> receiveDefinition}}
{{/ReceiveDefinitions}} {{/TokenReceiveDefinitions}}
{{#SendDefinitions}} {{#TokenSendDefinitions}}
{{> sendDefinition}} {{> sendDefinition}}
{{/SendDefinitions}} {{/TokenSendDefinitions}}
{{#TypeReceiveDefinitions}}
{{> receiveDefinition}}
{{/TypeReceiveDefinitions}}
{{#TypeSendDefinitions}}
{{> sendDefinition}}
{{/TypeSendDefinitions}}
{{#MappingDefinitions}} {{#MappingDefinitions}}
{{> mappingDefinition}} {{> mappingDefinition}}
...@@ -20,6 +28,18 @@ aspect RagConnect { ...@@ -20,6 +28,18 @@ aspect RagConnect {
{{#TokenComponents}} {{#TokenComponents}}
{{> tokenComponent}} {{> tokenComponent}}
{{/TokenComponents}} {{/TokenComponents}}
public void {{rootNodeName}}.ragconnectCheckIncremental() {
{{#incrementalOptionActive}}
// check if --tracing is active
trace().getReceiver();
// check if tracing of INC_FLUSH_ATTR is possible, i.e., if --tracing=flush
ASTState.Trace.Event checkTracing = ASTState.Trace.Event.INC_FLUSH_ATTR;
// check if --rewrite is active
mayHaveRewrite();
// check if --incremental is active
Object checkIncremental = inc_throwAway_visited;
{{/incrementalOptionActive}}
}
} }
{{#incrementalOptionActive}} {{#incrementalOptionActive}}
......
...@@ -76,7 +76,15 @@ task allTests(type: Test, dependsOn: testClasses) { ...@@ -76,7 +76,15 @@ task allTests(type: Test, dependsOn: testClasses) {
useJUnitPlatform { useJUnitPlatform {
includeTags 'mqtt' includeTags 'mqtt'
// excludeTags '!NewTest' }
}
task specificTest(type: Test, dependsOn: testClasses) {
description = 'Run test tagged with "NewTest"'
group = 'verification'
useJUnitPlatform {
includeTags 'NewTest'
} }
} }
...@@ -362,8 +370,7 @@ task preprocessIncrementalTest(type: JavaExec, group: 'verification') { ...@@ -362,8 +370,7 @@ task preprocessIncrementalTest(type: JavaExec, group: 'verification') {
'src/test/01-input/incremental/Test.connect', 'src/test/01-input/incremental/Test.connect',
'--rootNode=A', '--rootNode=A',
'--tracing=cache,flush', '--tracing=cache,flush',
'--incremental=param', '--incremental=param'
'--logReads', '--logWrites', '--verbose'
} }
task compileIncrementalTest(type: RelastTest) { task compileIncrementalTest(type: RelastTest) {
...@@ -385,3 +392,35 @@ task compileIncrementalTest(type: RelastTest) { ...@@ -385,3 +392,35 @@ task compileIncrementalTest(type: RelastTest) {
compileTestJava.dependsOn compileIncrementalTest compileTestJava.dependsOn compileIncrementalTest
compileIncrementalTest.dependsOn preprocessIncrementalTest compileIncrementalTest.dependsOn preprocessIncrementalTest
// --- Test: mapping ---
task preprocessMappingTest(type: JavaExec, group: 'verification') {
doFirst {
delete 'src/test/02-after-ragconnect/mapping/Test.relast',
'src/test/02-after-ragconnect/mapping/MqttHandler.jadd',
'src/test/02-after-ragconnect/mapping/RagConnect.jadd'
}
classpath = sourceSets.main.runtimeClasspath
main = 'org.jastadd.ragconnect.compiler.Compiler'
args '--o=src/test/02-after-ragconnect/mapping',
'src/test/01-input/mapping/Test.relast',
'src/test/01-input/mapping/Test.connect',
'--rootNode=A',
'--logReads', '--logWrites', '--verbose'
}
task compileMappingTest(type: RelastTest) {
useJastAddNames = true
jastAddList = 'JastAddList'
relastFiles 'src/test/02-after-ragconnect/mapping/Test.relast',
'src/test/02-after-ragconnect/mapping/RagConnect.relast'
grammarName = 'src/test/03-after-relast/mapping/mapping'
packageName = 'mapping.ast'
moreInputFiles 'src/test/01-input/mapping/Test.jadd',
'src/test/02-after-ragconnect/mapping/MqttHandler.jadd',
'src/test/02-after-ragconnect/mapping/RagConnect.jadd'
}
compileTestJava.dependsOn compileMappingTest
compileMappingTest.dependsOn preprocessMappingTest
...@@ -7,9 +7,46 @@ receive NativeTypes.DoubleValue; ...@@ -7,9 +7,46 @@ receive NativeTypes.DoubleValue;
receive NativeTypes.CharValue; receive NativeTypes.CharValue;
receive NativeTypes.StringValue; receive NativeTypes.StringValue;
receive NativeTypes.IntValueTransformed using IntTransformation;
receive NativeTypes.ShortValueTransformed using ShortTransformation;
receive NativeTypes.LongValueTransformed using LongTransformation;
receive NativeTypes.FloatValueTransformed using FloatTransformation;
receive NativeTypes.DoubleValueTransformed using DoubleTransformation;
receive NativeTypes.CharValueTransformed using CharTransformation;
receive NativeTypes.StringValueTransformed using StringTransformation;
receive BoxedTypes.IntValue; receive BoxedTypes.IntValue;
receive BoxedTypes.ShortValue; receive BoxedTypes.ShortValue;
receive BoxedTypes.LongValue; receive BoxedTypes.LongValue;
receive BoxedTypes.FloatValue; receive BoxedTypes.FloatValue;
receive BoxedTypes.DoubleValue; receive BoxedTypes.DoubleValue;
receive BoxedTypes.CharValue; receive BoxedTypes.CharValue;
receive BoxedTypes.IntValueTransformed using IntTransformation;
receive BoxedTypes.ShortValueTransformed using ShortTransformation;
receive BoxedTypes.LongValueTransformed using LongTransformation;
receive BoxedTypes.FloatValueTransformed using FloatTransformation;
receive BoxedTypes.DoubleValueTransformed using DoubleTransformation;
receive BoxedTypes.CharValueTransformed using CharTransformation;
IntTransformation maps int i to int {:
return i;
:}
ShortTransformation maps short s to short {:
return s;
:}
LongTransformation maps long l to long {:
return l;
:}
FloatTransformation maps float f to float {:
return f;
:}
DoubleTransformation maps double d to double {:
return d;
:}
CharTransformation maps char c to char {:
return c;
:}
StringTransformation maps String s to String {:
return s;
:}
A ::= NativeTypes* BoxedTypes* ; A ::= NativeTypes* BoxedTypes* ;
NativeTypes ::= <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <StringValue:String> ; NativeTypes ::= <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <StringValue:String> <IntValueTransformed:int> <ShortValueTransformed:short> <LongValueTransformed:long> <FloatValueTransformed:float> <DoubleValueTransformed:double> <CharValueTransformed:char> <StringValueTransformed:String> ;
BoxedTypes ::= <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> ; BoxedTypes ::= <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> <IntValueTransformed:Integer> <ShortValueTransformed:Short> <LongValueTransformed:Long> <FloatValueTransformed:Float> <DoubleValueTransformed:Double> <CharValueTransformed:Character> ;
...@@ -8,6 +8,15 @@ send NativeTypesSyn.DoubleValue; ...@@ -8,6 +8,15 @@ send NativeTypesSyn.DoubleValue;
send NativeTypesSyn.CharValue; send NativeTypesSyn.CharValue;
send NativeTypesSyn.StringValue; send NativeTypesSyn.StringValue;
// native types, synthesized, transformed
send NativeTypesSyn.IntValueTransformed using IntTransformation;
send NativeTypesSyn.ShortValueTransformed using ShortTransformation;
send NativeTypesSyn.LongValueTransformed using LongTransformation;
send NativeTypesSyn.FloatValueTransformed using FloatTransformation;
send NativeTypesSyn.DoubleValueTransformed using DoubleTransformation;
send NativeTypesSyn.CharValueTransformed using CharTransformation;
send NativeTypesSyn.StringValueTransformed using StringTransformation;
// boxed types, synthesized // boxed types, synthesized
send BoxedTypesSyn.IntValue; send BoxedTypesSyn.IntValue;
send BoxedTypesSyn.ShortValue; send BoxedTypesSyn.ShortValue;
...@@ -16,6 +25,14 @@ send BoxedTypesSyn.FloatValue; ...@@ -16,6 +25,14 @@ send BoxedTypesSyn.FloatValue;
send BoxedTypesSyn.DoubleValue; send BoxedTypesSyn.DoubleValue;
send BoxedTypesSyn.CharValue; send BoxedTypesSyn.CharValue;
// boxed types, synthesized, transformed
send BoxedTypesSyn.IntValueTransformed using IntTransformation;
send BoxedTypesSyn.ShortValueTransformed using ShortTransformation;
send BoxedTypesSyn.LongValueTransformed using LongTransformation;
send BoxedTypesSyn.FloatValueTransformed using FloatTransformation;
send BoxedTypesSyn.DoubleValueTransformed using DoubleTransformation;
send BoxedTypesSyn.CharValueTransformed using CharTransformation;
// --- dependency definitions --- // --- dependency definitions ---
NativeTypesSyn.IntValue canDependOn NativeTypesSyn.DriverSyn as nativeIntDependency; NativeTypesSyn.IntValue canDependOn NativeTypesSyn.DriverSyn as nativeIntDependency;
NativeTypesSyn.ShortValue canDependOn NativeTypesSyn.DriverSyn as nativeShortDependency; NativeTypesSyn.ShortValue canDependOn NativeTypesSyn.DriverSyn as nativeShortDependency;
...@@ -31,6 +48,21 @@ BoxedTypesSyn.FloatValue canDependOn BoxedTypesSyn.DriverSyn as boxedFloatDepend ...@@ -31,6 +48,21 @@ BoxedTypesSyn.FloatValue canDependOn BoxedTypesSyn.DriverSyn as boxedFloatDepend
BoxedTypesSyn.DoubleValue canDependOn BoxedTypesSyn.DriverSyn as boxedDoubleDependency; BoxedTypesSyn.DoubleValue canDependOn BoxedTypesSyn.DriverSyn as boxedDoubleDependency;
BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependency; BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependency;
NativeTypesSyn.IntValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeIntTransformedDependency;
NativeTypesSyn.ShortValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeShortTransformedDependency;
NativeTypesSyn.LongValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeLongTransformedDependency;
NativeTypesSyn.FloatValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeFloatTransformedDependency;
NativeTypesSyn.DoubleValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeDoubleTransformedDependency;
NativeTypesSyn.CharValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeCharTransformedDependency;
NativeTypesSyn.StringValueTransformed canDependOn NativeTypesSyn.DriverSyn as nativeStringTransformedDependency;
BoxedTypesSyn.IntValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedIntTransformedDependency;
BoxedTypesSyn.ShortValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedShortTransformedDependency;
BoxedTypesSyn.LongValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedLongTransformedDependency;
BoxedTypesSyn.FloatValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedFloatTransformedDependency;
BoxedTypesSyn.DoubleValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedDoubleTransformedDependency;
BoxedTypesSyn.CharValueTransformed canDependOn BoxedTypesSyn.DriverSyn as boxedCharTransformedDependency;
// --- inherited attributes not supported --- // --- inherited attributes not supported ---
//// native types, inherited //// native types, inherited
...@@ -49,3 +81,25 @@ BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependen ...@@ -49,3 +81,25 @@ BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependen
//send BoxedTypesInh.FloatValue; //send BoxedTypesInh.FloatValue;
//send BoxedTypesInh.DoubleValue; //send BoxedTypesInh.DoubleValue;
//send BoxedTypesInh.CharValue; //send BoxedTypesInh.CharValue;
IntTransformation maps int i to int {:
return i;
:}
ShortTransformation maps short s to short {:
return s;
:}
LongTransformation maps long l to long {:
return l;
:}
FloatTransformation maps float f to float {:
return f;
:}
DoubleTransformation maps double d to double {:
return d;
:}
CharTransformation maps char c to char {:
return c;
:}
StringTransformation maps String s to String {:
return s;
:}
...@@ -7,6 +7,13 @@ aspect Computation { ...@@ -7,6 +7,13 @@ aspect Computation {
syn double NativeTypesSyn.getDoubleValue() = Double.parseDouble(getDriverSyn()); syn double NativeTypesSyn.getDoubleValue() = Double.parseDouble(getDriverSyn());
syn char NativeTypesSyn.getCharValue() = getDriverSyn().charAt(0); syn char NativeTypesSyn.getCharValue() = getDriverSyn().charAt(0);
syn String NativeTypesSyn.getStringValue() = new String(getDriverSyn()); syn String NativeTypesSyn.getStringValue() = new String(getDriverSyn());
syn int NativeTypesSyn.getIntValueTransformed() = Integer.parseInt(getDriverSyn());
syn short NativeTypesSyn.getShortValueTransformed() = Short.parseShort(getDriverSyn());
syn long NativeTypesSyn.getLongValueTransformed() = Long.parseLong(getDriverSyn());
syn float NativeTypesSyn.getFloatValueTransformed() = Float.parseFloat(getDriverSyn());
syn double NativeTypesSyn.getDoubleValueTransformed() = Double.parseDouble(getDriverSyn());
syn char NativeTypesSyn.getCharValueTransformed() = getDriverSyn().charAt(0);
syn String NativeTypesSyn.getStringValueTransformed() = new String(getDriverSyn());
// boxed types, synthesized // boxed types, synthesized
syn Integer BoxedTypesSyn.getIntValue() = Integer.valueOf(getDriverSyn()); syn Integer BoxedTypesSyn.getIntValue() = Integer.valueOf(getDriverSyn());
...@@ -15,6 +22,12 @@ aspect Computation { ...@@ -15,6 +22,12 @@ aspect Computation {
syn Float BoxedTypesSyn.getFloatValue() = Float.valueOf(getDriverSyn()); syn Float BoxedTypesSyn.getFloatValue() = Float.valueOf(getDriverSyn());
syn Double BoxedTypesSyn.getDoubleValue() = Double.valueOf(getDriverSyn()); syn Double BoxedTypesSyn.getDoubleValue() = Double.valueOf(getDriverSyn());
syn Character BoxedTypesSyn.getCharValue() = getDriverSyn().charAt(0); syn Character BoxedTypesSyn.getCharValue() = getDriverSyn().charAt(0);
syn Integer BoxedTypesSyn.getIntValueTransformed() = Integer.valueOf(getDriverSyn());
syn Short BoxedTypesSyn.getShortValueTransformed() = Short.valueOf(getDriverSyn());
syn Long BoxedTypesSyn.getLongValueTransformed() = Long.valueOf(getDriverSyn());
syn Float BoxedTypesSyn.getFloatValueTransformed() = Float.valueOf(getDriverSyn());
syn Double BoxedTypesSyn.getDoubleValueTransformed() = Double.valueOf(getDriverSyn());
syn Character BoxedTypesSyn.getCharValueTransformed() = getDriverSyn().charAt(0);
// --- inherited attributes not supported --- // --- inherited attributes not supported ---
// // native types, inherited // // native types, inherited
......
A ::= NativeTypesSyn* BoxedTypesSyn* <DriverInh:String>; A ::= NativeTypesSyn* BoxedTypesSyn* <DriverInh:String>;
// native types, synthesized // native types, synthesized
NativeTypesSyn ::= <DriverSyn:String> /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ ; NativeTypesSyn ::= <DriverSyn:String> /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ /<IntValueTransformed:int>/ /<ShortValueTransformed:short>/ /<LongValueTransformed:long>/ /<FloatValueTransformed:float>/ /<DoubleValueTransformed:double>/ /<CharValueTransformed:char>/ /<StringValueTransformed:String>/ ;
// boxed types, synthesized // boxed types, synthesized
BoxedTypesSyn ::= <DriverSyn:String> /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ ; BoxedTypesSyn ::= <DriverSyn:String> /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ /<IntValueTransformed:Integer>/ /<ShortValueTransformed:Short>/ /<LongValueTransformed:Long>/ /<FloatValueTransformed:Float>/ /<DoubleValueTransformed:Double>/ /<CharValueTransformed:Character>/ ;
// --- inherited attributes not supported --- // --- inherited attributes not supported ---
//// native types, inherited //// native types, inherited
......
# Default Mapping
Idea: Check different numbers of sequential mappings
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment