Skip to content

Commit

Permalink
application to the Domainmodel example
Browse files Browse the repository at this point in the history
  • Loading branch information
LorenzoBettini committed May 6, 2024
1 parent eead401 commit ef578b5
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ import org.junit.runner.RunWith

import static org.eclipse.xtext.example.domainmodel.domainmodel.DomainmodelPackage.Literals.PROPERTY
import static org.eclipse.xtext.example.domainmodel.domainmodel.DomainmodelPackage.Literals.OPERATION
import static org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_PROPERTY
import static org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_OPERATION
import static org.eclipse.xtext.xbase.validation.IssueCodes.*
import static org.eclipse.xtext.xtype.XtypePackage.Literals.*

Expand Down Expand Up @@ -181,9 +179,10 @@ class ValidationTests {
}
'''
model.parse => [
// coming from org.eclipse.xtext.xbase.validation.JvmGenericTypeValidator
assertNumberOfIssues(2)
assertError(PROPERTY, DUPLICATE_PROPERTY, model.indexOf("p"), 1, "Duplicate property p")
assertError(PROPERTY, DUPLICATE_PROPERTY, model.lastIndexOf("p"), 1, "Duplicate property p")
assertError(PROPERTY, DUPLICATE_FIELD, model.indexOf("p"), 1, "Duplicate field p")
assertError(PROPERTY, DUPLICATE_FIELD, model.lastIndexOf("p"), 1, "Duplicate field p")
]
}

Expand All @@ -195,9 +194,10 @@ class ValidationTests {
}
'''
model.parse => [
// coming from org.eclipse.xtext.xbase.validation.JvmGenericTypeValidator
assertNumberOfIssues(2)
assertError(OPERATION, DUPLICATE_OPERATION, model.indexOf("foo"), 3, "Duplicate operation foo")
assertError(OPERATION, DUPLICATE_OPERATION, model.lastIndexOf("foo"), 3, "Duplicate operation foo")
assertError(OPERATION, DUPLICATE_METHOD, model.indexOf("foo"), 3, "Duplicate method foo")
assertError(OPERATION, DUPLICATE_METHOD, model.lastIndexOf("foo"), 3, "Duplicate method foo")
]
}

Expand Down Expand Up @@ -250,9 +250,10 @@ class ValidationTests {
}
'''
model.parse => [
// coming from org.eclipse.xtext.xbase.validation.JvmGenericTypeValidator
assertNumberOfIssues(2)
assertError(OPERATION, DUPLICATE_OPERATION, model.indexOf("m"), 1, "Duplicate operation m")
assertError(OPERATION, DUPLICATE_OPERATION, model.lastIndexOf("m"), 1, "Duplicate operation m")
assertError(OPERATION, DUPLICATE_METHOD, model.indexOf("m"), 1, "The method m(List<String>) has the same erasure")
assertError(OPERATION, DUPLICATE_METHOD, model.lastIndexOf("m"), 1, "The method m(List<Integer>) has the same erasure")
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,8 +303,8 @@ public void testDuplicatedProperty() throws Exception {
DomainModel _parse = this._parseHelper.parse(model);
final Procedure1<DomainModel> _function = (DomainModel it) -> {
this.assertNumberOfIssues(it, 2);
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.PROPERTY, org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_PROPERTY, model.indexOf("p"), 1, "Duplicate property p");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.PROPERTY, org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_PROPERTY, model.lastIndexOf("p"), 1, "Duplicate property p");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.PROPERTY, IssueCodes.DUPLICATE_FIELD, model.indexOf("p"), 1, "Duplicate field p");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.PROPERTY, IssueCodes.DUPLICATE_FIELD, model.lastIndexOf("p"), 1, "Duplicate field p");
};
ObjectExtensions.<DomainModel>operator_doubleArrow(_parse, _function);
}
Expand All @@ -326,8 +326,8 @@ public void testDuplicatedOperation() throws Exception {
DomainModel _parse = this._parseHelper.parse(model);
final Procedure1<DomainModel> _function = (DomainModel it) -> {
this.assertNumberOfIssues(it, 2);
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_OPERATION, model.indexOf("foo"), 3, "Duplicate operation foo");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_OPERATION, model.lastIndexOf("foo"), 3, "Duplicate operation foo");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, IssueCodes.DUPLICATE_METHOD, model.indexOf("foo"), 3, "Duplicate method foo");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, IssueCodes.DUPLICATE_METHOD, model.lastIndexOf("foo"), 3, "Duplicate method foo");
};
ObjectExtensions.<DomainModel>operator_doubleArrow(_parse, _function);
}
Expand Down Expand Up @@ -428,8 +428,8 @@ public void testDuplicatedOperationWithDifferentSignatureWithSameTypeErasure() t
DomainModel _parse = this._parseHelper.parse(model);
final Procedure1<DomainModel> _function = (DomainModel it) -> {
this.assertNumberOfIssues(it, 2);
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_OPERATION, model.indexOf("m"), 1, "Duplicate operation m");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, org.eclipse.xtext.example.domainmodel.validation.IssueCodes.DUPLICATE_OPERATION, model.lastIndexOf("m"), 1, "Duplicate operation m");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, IssueCodes.DUPLICATE_METHOD, model.indexOf("m"), 1, "The method m(List<String>) has the same erasure");
this._validationTestHelper.assertError(it, DomainmodelPackage.Literals.OPERATION, IssueCodes.DUPLICATE_METHOD, model.lastIndexOf("m"), 1, "The method m(List<Integer>) has the same erasure");
};
ObjectExtensions.<DomainModel>operator_doubleArrow(_parse, _function);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,40 +8,23 @@
*/
package org.eclipse.xtext.example.domainmodel.validation;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.example.domainmodel.domainmodel.DomainmodelPackage;
import org.eclipse.xtext.example.domainmodel.domainmodel.Entity;
import org.eclipse.xtext.example.domainmodel.domainmodel.Feature;
import org.eclipse.xtext.example.domainmodel.domainmodel.Operation;
import org.eclipse.xtext.example.domainmodel.domainmodel.PackageDeclaration;
import org.eclipse.xtext.example.domainmodel.domainmodel.Property;
import org.eclipse.xtext.example.domainmodel.jvmmodel.DomainmodelJvmModelHelper;
import org.eclipse.xtext.util.Strings;
import org.eclipse.xtext.validation.Check;
import org.eclipse.xtext.validation.ComposedChecks;
import org.eclipse.xtext.validation.ValidationMessageAcceptor;
import org.eclipse.xtext.xbase.jvmmodel.IJvmModelAssociations;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.StringExtensions;

import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import org.eclipse.xtext.xbase.validation.JvmGenericTypeValidator;

/**
* This class contains custom validation rules.
*
* See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation
*/
@ComposedChecks(validators = JvmGenericTypeValidator.class)
public class DomainmodelValidator extends AbstractDomainmodelValidator {
@Inject
private IJvmModelAssociations jvmModelAssociations;

@Inject
private DomainmodelJvmModelHelper domainmodelJvmModelHelper;

@Check
public void checkTypeNameStartsWithCapital(Entity entity) {
if (!Character.isUpperCase(entity.getName().charAt(0))) {
Expand All @@ -68,34 +51,4 @@ public void checkPackage(PackageDeclaration pack) {
}
}

@Check
public void checkPropertyNamesAreUnique(Entity entity) {
Map<String, List<Feature>> name2properties = entity.getFeatures().stream()
.filter(Property.class::isInstance)
.filter(it -> !StringExtensions.isNullOrEmpty(it.getName()))
.collect(Collectors.groupingBy(Feature::getName));
name2properties.values().forEach(properties -> {
if (properties.size() > 1) {
properties.forEach(it ->
error("Duplicate property " + it.getName(), it, DomainmodelPackage.Literals.FEATURE__NAME,
IssueCodes.DUPLICATE_PROPERTY)
);
}
});
}

@Check
public void checkOperationNamesAreUnique(Entity entity) {
JvmGenericType inferredJavaClass = IterableExtensions
.head(Iterables.filter(jvmModelAssociations.getJvmElements(entity), JvmGenericType.class));
domainmodelJvmModelHelper.handleDuplicateJvmOperations(inferredJavaClass, jvmOperations ->
jvmOperations.stream()
.map(it -> jvmModelAssociations.getPrimarySourceElement(it))
.filter(Operation.class::isInstance)
.map(Operation.class::cast)
.forEach(it ->
error("Duplicate operation " + it.getName(), it, DomainmodelPackage.Literals.FEATURE__NAME, IssueCodes.DUPLICATE_OPERATION)
)
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,4 @@ public interface IssueCodes {

String MISSING_TYPE = PREFIX + "MissingType";

String DUPLICATE_PROPERTY = PREFIX + "DuplicateProperty";

String DUPLICATE_OPERATION = PREFIX + "DuplicateOperation";

}

0 comments on commit ef578b5

Please sign in to comment.