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;