diff --git a/docs/rune-java-documentation.md b/docs/rune-java-documentation.md index aad06bd4c..032b9c5fd 100644 --- a/docs/rune-java-documentation.md +++ b/docs/rune-java-documentation.md @@ -3,7 +3,7 @@ title: "Rune Java Documentation" date: 2023-09-01T12:57:00+02:00 description: "This document describes the interface and usage of classes that are generated from a Rune model using the Java code generator." draft: false -weight: 2 +weight: 3 --- # Rune Java Documentation diff --git a/rosetta-integration-tests/.project b/rosetta-integration-tests/.project index be553457a..fb3912373 100644 --- a/rosetta-integration-tests/.project +++ b/rosetta-integration-tests/.project @@ -16,12 +16,12 @@ - org.eclipse.m2e.core.maven2Builder + net.sf.eclipsecs.core.CheckstyleBuilder - net.sf.eclipsecs.core.CheckstyleBuilder + org.eclipse.m2e.core.maven2Builder diff --git a/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/tests/NoEcoreValidatorTest.java b/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/tests/NoEcoreValidatorTest.java new file mode 100644 index 000000000..df58d5618 --- /dev/null +++ b/rosetta-integration-tests/src/test/java/com/regnosys/rosetta/tests/NoEcoreValidatorTest.java @@ -0,0 +1,40 @@ +package com.regnosys.rosetta.tests; + +import javax.inject.Inject; + +import org.eclipse.emf.ecore.util.EObjectValidator; +import org.eclipse.xtext.diagnostics.Diagnostic; +import org.eclipse.xtext.testing.InjectWith; +import org.eclipse.xtext.testing.extensions.InjectionExtension; +import org.eclipse.xtext.testing.validation.ValidationTestHelper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import com.regnosys.rosetta.rosetta.RosettaModel; +import com.regnosys.rosetta.tests.util.ModelHelper; + +import static com.regnosys.rosetta.rosetta.RosettaPackage.Literals.*; + +// Verify that we are using Xtext's EcoreValidator, which does not duplicate unresolved reference errors. +@ExtendWith(InjectionExtension.class) +@InjectWith(RosettaTestInjectorProvider.class) +public class NoEcoreValidatorTest { + @Inject ModelHelper modelHelper; + @Inject ValidationTestHelper validationHelper; + + @Test + void testNoUnresolvedProxyError() { + RosettaModel model = modelHelper.parseRosetta(""" + namespace test + + type Foo: + attr UnresolvedType (1..1) + """); + // There should be an unresolved error + validationHelper.assertError(model, TYPE_CALL, Diagnostic.LINKING_DIAGNOSTIC, "Couldn't resolve reference to RosettaType 'UnresolvedType'."); + // There should not be an "unresolved proxy" error: + // "The feature 'type' of 'com.regnosys.rosetta.rosetta.impl.TypeCallImpl@2503ec73{__synthetic1.rosetta#/0/@elements.0/@attributes.0/@typeCall}' + // contains an unresolved proxy 'com.regnosys.rosetta.rosetta.impl.RosettaBasicTypeImpl@76a14c8d{__synthetic1.rosetta#|0}'" + validationHelper.assertNoIssue(model, TYPE_CALL, EObjectValidator.DIAGNOSTIC_SOURCE + "." + EObjectValidator.EOBJECT__EVERY_PROXY_RESOLVES); + } +} diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/RosettaStandaloneSetup.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/RosettaStandaloneSetup.xtend index da534fabf..2baa57771 100644 --- a/rosetta-lang/src/main/java/com/regnosys/rosetta/RosettaStandaloneSetup.xtend +++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/RosettaStandaloneSetup.xtend @@ -21,14 +21,6 @@ class RosettaStandaloneSetup extends RosettaStandaloneSetupGenerated { override Injector createInjectorAndDoEMFRegistration() { EValidator.Registry.INSTANCE.clear // This line is to ensure tests don't use the same validator instance. - return super.createInjectorAndDoEMFRegistration() - } - - /** - * Register xcore model in standalone setup. - */ - override register(Injector injector) { - if (!EPackage.Registry.INSTANCE.containsKey(RosettaPackage.eNS_URI)) { EPackage.Registry.INSTANCE.put(RosettaPackage.eNS_URI, RosettaPackage.eINSTANCE); } @@ -38,6 +30,6 @@ class RosettaStandaloneSetup extends RosettaStandaloneSetupGenerated { if (!EPackage.Registry.INSTANCE.containsKey(ExpressionPackage.eNS_URI)) { EPackage.Registry.INSTANCE.put(ExpressionPackage.eNS_URI, ExpressionPackage.eINSTANCE); } - super.register(injector) + return super.createInjectorAndDoEMFRegistration() } } diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/util/RosettaFunctionExtensions.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/util/RosettaFunctionExtensions.xtend index 223f6e82e..cadc6d813 100644 --- a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/util/RosettaFunctionExtensions.xtend +++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/util/RosettaFunctionExtensions.xtend @@ -24,9 +24,10 @@ import java.util.List import com.regnosys.rosetta.types.RFunction import javax.inject.Inject import com.regnosys.rosetta.types.RChoiceType +import com.regnosys.rosetta.RosettaEcoreUtil class RosettaFunctionExtensions { - + @Inject RosettaEcoreUtil ecoreUtil @Inject RosettaTypeProvider typeProvider /** @@ -171,7 +172,8 @@ class RosettaFunctionExtensions { def getTransformAnnotations(Annotated element) { element.annotations - .filter[it.annotation.model.name == "com.rosetta.model"] + .filter[ecoreUtil.isResolved(annotation)] + .filter["com.rosetta.model" == it.annotation.model.name] .filter["ingest" == it.annotation.name || "enrich" == it.annotation.name || "projection" == it.annotation.name].toList } } diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend index 4dff20eb0..f6f8dc539 100644 --- a/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend +++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/types/RosettaTypeProvider.xtend @@ -89,10 +89,8 @@ import javax.inject.Inject import javax.inject.Provider import org.eclipse.emf.ecore.EObject -import com.regnosys.rosetta.rosetta.expression.SwitchCaseOrDefault import static extension com.regnosys.rosetta.types.RMetaAnnotatedType.withMeta import static extension com.regnosys.rosetta.types.RMetaAnnotatedType.withNoMeta -import com.regnosys.rosetta.rosetta.simple.Attribute import com.regnosys.rosetta.rosetta.simple.AnnotationPathExpression import com.regnosys.rosetta.rosetta.simple.AnnotationPathAttributeReference import com.regnosys.rosetta.rosetta.simple.AnnotationPath @@ -175,7 +173,7 @@ class RosettaTypeProvider extends RosettaExpressionSwitch getRMetaAttributes(List annotations) { annotations - .filter[it.annotation.name.equals("metadata") && it.attribute !== null] + .filter[extensions.isResolved(annotation) && "metadata" == annotation.name && extensions.isResolved(attribute)] .map[new RMetaAttribute(it.attribute.name, it.attribute.RTypeOfSymbol.RType)] .toList } diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/validation/AbstractDeclarativeRosettaValidator.java b/rosetta-lang/src/main/java/com/regnosys/rosetta/validation/AbstractDeclarativeRosettaValidator.java index d295cb469..0fd75626b 100644 --- a/rosetta-lang/src/main/java/com/regnosys/rosetta/validation/AbstractDeclarativeRosettaValidator.java +++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/validation/AbstractDeclarativeRosettaValidator.java @@ -130,7 +130,7 @@ protected INode findDirectKeyword(ICompositeNode node, String keyword) { } protected void checkDeprecatedAnnotation(Annotated annotated, EObject owner, EStructuralFeature ref, int index) { - if (annotated.getAnnotations().stream().anyMatch(ann -> ann.getAnnotation() != null && ann.getAnnotation().getName().equals("deprecated"))) { + if (annotated.getAnnotations().stream().anyMatch(ann -> ecoreUtil.isResolved(ann.getAnnotation()) && "deprecated".equals(ann.getAnnotation().getName()))) { String msg; if (annotated instanceof RosettaNamed) { msg = ((RosettaNamed)annotated).getName() + " is deprecated"; diff --git a/rosetta-testing/src/main/java/com/regnosys/rosetta/tests/RosettaInjectorProvider.java b/rosetta-testing/src/main/java/com/regnosys/rosetta/tests/RosettaInjectorProvider.java index 3f779781d..8497d2020 100644 --- a/rosetta-testing/src/main/java/com/regnosys/rosetta/tests/RosettaInjectorProvider.java +++ b/rosetta-testing/src/main/java/com/regnosys/rosetta/tests/RosettaInjectorProvider.java @@ -8,6 +8,7 @@ import com.google.inject.Injector; import com.regnosys.rosetta.RosettaRuntimeModule; import com.regnosys.rosetta.RosettaStandaloneSetup; + import org.eclipse.xtext.testing.GlobalRegistries; import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento; import org.eclipse.xtext.testing.IInjectorProvider;