From 014793f14582194cad76f7d523f963e6870f51d2 Mon Sep 17 00:00:00 2001 From: pxxx Date: Fri, 15 May 2026 18:31:07 +0200 Subject: [PATCH 1/2] Change name of implicit root containments. --- .../neojoin/transformation/Transformator.java | 4 +- lang/frontend/language/pom.xml | 82 ++++++++++++++++++- .../java/tools/vitruv/neojoin/Constants.java | 2 - .../java/tools/vitruv/neojoin/Formatting.java | 11 +++ .../tools/vitruv/neojoin/aqr/AQRBuilder.java | 3 +- .../neojoin/validation/FeatureValidator.java | 8 +- 6 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 lang/frontend/language/src/main/java/tools/vitruv/neojoin/Formatting.java 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/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()) { From e55924e8486ef78783a53b9d6095a20b9aa8395e Mon Sep 17 00:00:00 2001 From: pxxx Date: Fri, 15 May 2026 19:37:08 +0200 Subject: [PATCH 2/2] Adjust test/test data. --- lang/frontend/cli/src/test/resources/models/pizza.ecore | 4 ++-- .../cli/src/test/resources/results/actor-rating.ecore | 2 +- .../cli/src/test/resources/results/books-on-tape.ecore | 2 +- .../src/test/resources/results/customer-borrowings.ecore | 4 ++-- lang/frontend/cli/src/test/resources/results/movies.ecore | 4 ++-- lang/frontend/cli/src/test/resources/results/pizza.xmi | 8 ++++---- .../test/java/tools/vitruv/neojoin/aqr/RootAQRTest.java | 4 ++-- .../java/tools/vitruv/neojoin/parse/RootParseTest.java | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) 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/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 } """);