diff --git a/lang/backend-emf/src/main/java/tools/vitruv/neojoin/transformation/Transformator.java b/lang/backend-emf/src/main/java/tools/vitruv/neojoin/transformation/Transformator.java
index 52a92a6f..37b075c5 100644
--- a/lang/backend-emf/src/main/java/tools/vitruv/neojoin/transformation/Transformator.java
+++ b/lang/backend-emf/src/main/java/tools/vitruv/neojoin/transformation/Transformator.java
@@ -9,7 +9,7 @@
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.jspecify.annotations.Nullable;
-import tools.vitruv.neojoin.Constants;
+import tools.vitruv.neojoin.Formatting;
import tools.vitruv.neojoin.aqr.AQR;
import tools.vitruv.neojoin.aqr.AQRFeature;
import tools.vitruv.neojoin.aqr.AQRTargetClass;
@@ -100,7 +100,7 @@ public EObject transform() throws TransformatorException {
.forEach(target -> {
var instances = transformTargetClass(target);
var rootRef = root.eClass()
- .getEStructuralFeature(Constants.RootReferenceNameFormat.formatted(target.name()));
+ .getEStructuralFeature(Formatting.formatRootReferenceName(target.name()));
root.eSet(rootRef, instances);
});
diff --git a/lang/frontend/cli/src/test/resources/models/pizza.ecore b/lang/frontend/cli/src/test/resources/models/pizza.ecore
index 9f0c77ab..9a06ebc6 100644
--- a/lang/frontend/cli/src/test/resources/models/pizza.ecore
+++ b/lang/frontend/cli/src/test/resources/models/pizza.ecore
@@ -11,9 +11,9 @@
eType="#//Food"/>
-
-
diff --git a/lang/frontend/cli/src/test/resources/results/actor-rating.ecore b/lang/frontend/cli/src/test/resources/results/actor-rating.ecore
index 49774da5..9e5d8a0b 100644
--- a/lang/frontend/cli/src/test/resources/results/actor-rating.ecore
+++ b/lang/frontend/cli/src/test/resources/results/actor-rating.ecore
@@ -6,7 +6,7 @@
-
diff --git a/lang/frontend/cli/src/test/resources/results/books-on-tape.ecore b/lang/frontend/cli/src/test/resources/results/books-on-tape.ecore
index 28fa3d05..94de703c 100644
--- a/lang/frontend/cli/src/test/resources/results/books-on-tape.ecore
+++ b/lang/frontend/cli/src/test/resources/results/books-on-tape.ecore
@@ -9,7 +9,7 @@
-
diff --git a/lang/frontend/cli/src/test/resources/results/customer-borrowings.ecore b/lang/frontend/cli/src/test/resources/results/customer-borrowings.ecore
index e74c8f80..ee3217f1 100644
--- a/lang/frontend/cli/src/test/resources/results/customer-borrowings.ecore
+++ b/lang/frontend/cli/src/test/resources/results/customer-borrowings.ecore
@@ -10,9 +10,9 @@
-
-
diff --git a/lang/frontend/cli/src/test/resources/results/movies.ecore b/lang/frontend/cli/src/test/resources/results/movies.ecore
index 9f40fb45..3b4a13f6 100644
--- a/lang/frontend/cli/src/test/resources/results/movies.ecore
+++ b/lang/frontend/cli/src/test/resources/results/movies.ecore
@@ -7,9 +7,9 @@
-
-
diff --git a/lang/frontend/cli/src/test/resources/results/pizza.xmi b/lang/frontend/cli/src/test/resources/results/pizza.xmi
index 96d21ce0..f016c995 100644
--- a/lang/frontend/cli/src/test/resources/results/pizza.xmi
+++ b/lang/frontend/cli/src/test/resources/results/pizza.xmi
@@ -1,7 +1,7 @@
-
-
-
-
+
+
+
+
diff --git a/lang/frontend/language/pom.xml b/lang/frontend/language/pom.xml
index 7d2895ab..1ca7e2c2 100644
--- a/lang/frontend/language/pom.xml
+++ b/lang/frontend/language/pom.xml
@@ -17,6 +17,7 @@
17
17
17
+ 2.3.10
@@ -95,6 +96,17 @@
junit-platform-engine
test
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+
+
+ org.jetbrains.kotlin
+ kotlin-test
+ ${kotlin.version}
+ test
+
@@ -129,6 +141,74 @@
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+ true
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ src/main/java
+ src/main/xtext
+ target/generated-sources/annotations
+ target/generated-sources/xtext-ecore
+ target/generated-sources/xtext-java
+
+
+
+
+ test-compile
+ test-compile
+
+ test-compile
+
+
+
+ src/test/java
+ target/generated-test-sources/test-annotations
+
+
+
+
+
+ ${maven.compiler.target}
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ default-compile
+ none
+
+
+ default-testCompile
+ none
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ testCompile
+ test-compile
+
+ testCompile
+
+
+
+
@@ -148,4 +228,4 @@
-
\ No newline at end of file
+
diff --git a/lang/frontend/language/src/main/java/tools/vitruv/neojoin/Constants.java b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/Constants.java
index 164302ec..3d972937 100644
--- a/lang/frontend/language/src/main/java/tools/vitruv/neojoin/Constants.java
+++ b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/Constants.java
@@ -6,8 +6,6 @@ public final class Constants {
public static final String DefaultRootClassName = "Root";
- public static final String RootReferenceNameFormat = "all%ss";
-
public static final String ExpressionSelfReference = "it";
public static final String EcoreAlias = "ecore";
diff --git a/lang/frontend/language/src/main/java/tools/vitruv/neojoin/Formatting.java b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/Formatting.java
new file mode 100644
index 00000000..1a1e23bb
--- /dev/null
+++ b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/Formatting.java
@@ -0,0 +1,11 @@
+package tools.vitruv.neojoin;
+
+public class Formatting {
+
+ public static String formatRootReferenceName(String name) {
+ return new StringBuilder(name)
+ .replace(0, 1, "" + Character.toLowerCase(name.charAt(0)))
+ .append("s")
+ .toString();
+ }
+}
diff --git a/lang/frontend/language/src/main/java/tools/vitruv/neojoin/aqr/AQRBuilder.java b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/aqr/AQRBuilder.java
index 09385f9b..8c4d8ca1 100644
--- a/lang/frontend/language/src/main/java/tools/vitruv/neojoin/aqr/AQRBuilder.java
+++ b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/aqr/AQRBuilder.java
@@ -13,6 +13,7 @@
import org.eclipse.xtext.xbase.XExpression;
import org.jspecify.annotations.Nullable;
import tools.vitruv.neojoin.Constants;
+import tools.vitruv.neojoin.Formatting;
import tools.vitruv.neojoin.ast.Body;
import tools.vitruv.neojoin.ast.Export;
import tools.vitruv.neojoin.ast.Feature;
@@ -438,7 +439,7 @@ private void populateRoot(AQRTargetClass root) {
continue;
}
- var featureName = Constants.RootReferenceNameFormat.formatted(target.name());
+ var featureName = Formatting.formatRootReferenceName(target.name());
invariant(
root.features().stream().noneMatch(f -> f.name().equals(featureName)),
() -> "Duplicated feature name '%s' in root class".formatted(featureName)
diff --git a/lang/frontend/language/src/main/java/tools/vitruv/neojoin/validation/FeatureValidator.java b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/validation/FeatureValidator.java
index b00adb6e..9bb43c70 100644
--- a/lang/frontend/language/src/main/java/tools/vitruv/neojoin/validation/FeatureValidator.java
+++ b/lang/frontend/language/src/main/java/tools/vitruv/neojoin/validation/FeatureValidator.java
@@ -13,6 +13,7 @@
import org.eclipse.xtext.xbase.typesystem.references.LightweightTypeReference;
import org.jspecify.annotations.Nullable;
import tools.vitruv.neojoin.Constants;
+import tools.vitruv.neojoin.Formatting;
import tools.vitruv.neojoin.aqr.AQRFeatureOptionsBuilder;
import tools.vitruv.neojoin.ast.AstPackage;
import tools.vitruv.neojoin.ast.Feature;
@@ -27,10 +28,7 @@
import tools.vitruv.neojoin.utils.AstUtils;
import tools.vitruv.neojoin.utils.TypeCasts;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -423,7 +421,7 @@ public void checkRootFeatureCollision(MainQuery mainQuery) {
var allNames = AstUtils.getAllQueries(AstUtils.getViewType(mainQuery))
.map(q -> AstUtils.getTargetName(q, expressionHelper))
- .map(Constants.RootReferenceNameFormat::formatted)
+ .map(Formatting::formatRootReferenceName)
.collect(Collectors.toSet());
for (var feature : mainQuery.getBody().getFeatures()) {
diff --git a/lang/frontend/language/src/test/java/tools/vitruv/neojoin/aqr/RootAQRTest.java b/lang/frontend/language/src/test/java/tools/vitruv/neojoin/aqr/RootAQRTest.java
index f3d340eb..56451441 100644
--- a/lang/frontend/language/src/test/java/tools/vitruv/neojoin/aqr/RootAQRTest.java
+++ b/lang/frontend/language/src/test/java/tools/vitruv/neojoin/aqr/RootAQRTest.java
@@ -76,8 +76,8 @@ void rootReferences() {
assertThat(root)
.hasNoCondition()
.hasCalculatedAttribute("test", "EInt")
- .hasGeneratedReference("allRestaurantys", "Restauranty") // explicit
- .hasGeneratedReference("allFoods", "Food") // implicit
+ .hasGeneratedReference("restaurantys", "Restauranty") // explicit
+ .hasGeneratedReference("foods", "Food") // implicit
.hasNoMoreFeatures();
}
)
diff --git a/lang/frontend/language/src/test/java/tools/vitruv/neojoin/parse/RootParseTest.java b/lang/frontend/language/src/test/java/tools/vitruv/neojoin/parse/RootParseTest.java
index 5979cd35..bdb44965 100644
--- a/lang/frontend/language/src/test/java/tools/vitruv/neojoin/parse/RootParseTest.java
+++ b/lang/frontend/language/src/test/java/tools/vitruv/neojoin/parse/RootParseTest.java
@@ -44,7 +44,7 @@ void featureNameConflict() {
from Food create
create root Rooty {
- allFoods := 5
+ foods := 5
}
""");