diff --git a/.github/workflows/branch-deploy.yml b/.github/workflows/branch-deploy.yml
index b01a03ec0..e62853366 100644
--- a/.github/workflows/branch-deploy.yml
+++ b/.github/workflows/branch-deploy.yml
@@ -2,6 +2,11 @@ name: Deploy a branch as a snapshot version.
on:
workflow_dispatch:
+ inputs:
+ run-tests:
+ type: boolean
+ description: Run tests
+ default: true
# Cancel previous jobs
concurrency:
@@ -12,15 +17,28 @@ jobs:
deploy-branch:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - name: Normalize branch name
- id: normalize-branch-name
- uses: ./.github/actions/normalize-branch-name
- - name: Set version
- run: mvn -B versions:set -DnewVersion=0.0.0.${{ steps.normalize-branch-name.outputs.normalized }}-SNAPSHOT
- - uses: ./.github/actions/maven-build
- with:
- build-command: deploy # Deploy a snapshot build of main
- env:
- CI_DEPLOY_USERNAME: ${{ secrets.CI_DEPLOY_USERNAME }}
- CI_DEPLOY_PASSWORD: ${{ secrets.CI_DEPLOY_PASSWORD }}
+ - uses: actions/checkout@v4
+ - name: Set up Maven Central Repository
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+ architecture: x64
+ cache: maven
+ server-id: ossrh
+ server-username: CI_DEPLOY_USERNAME
+ server-password: CI_DEPLOY_PASSWORD
+ gpg-private-key: ${{ secrets.RUNE_GPG_PRIVATE_KEY }}
+ gpg-passphrase: GPG_PASSPHRASE
+ - name: Normalize branch name
+ id: normalize-branch-name
+ uses: ./.github/actions/normalize-branch-name
+ - name: Set version
+ run: mvn -B versions:set -DgenerateBackupPoms=false -DnewVersion=0.0.0.${{ steps.normalize-branch-name.outputs.normalized }}-SNAPSHOT
+ - uses: ./.github/actions/maven-build
+ with:
+ build-command: deploy
+ run-tests: ${{ inputs.run-tests }}
+ env:
+ CI_DEPLOY_USERNAME: ${{ secrets.CI_DEPLOY_USERNAME }}
+ CI_DEPLOY_PASSWORD: ${{ secrets.CI_DEPLOY_PASSWORD }}
diff --git a/rosetta-ide/rosetta.tmLanguage.yaml b/rosetta-ide/rosetta.tmLanguage.yaml
index b2bc02fb4..a9412c8b5 100644
--- a/rosetta-ide/rosetta.tmLanguage.yaml
+++ b/rosetta-ide/rosetta.tmLanguage.yaml
@@ -27,12 +27,13 @@ variables:
# - keywords that may also be used as an identifier (e.g., `version`),
# - keywords that may also be used as another keyword in a certain context (e.g., `synonym`),
# - keywords that are unambiguous, i.e., all other keywords indicating the start of a root element.
- identifiersConflictingWithRootStart: '{{wordStart}}(version){{wordEnd}}'
+ identifiersConflictingWithRootStart: '{{wordStart}}(translate){{wordEnd}}'
+ identifiersConflictingWithNamespace: '{{wordStart}}(version){{wordEnd}}'
ambiguousRootStart: '{{wordStart}}(synonym|rule){{wordEnd}}'
unambiguousRootStart: '{{wordStart}}(namespace|import|isEvent|isProduct|body|corpus|segment|basicType|recordType|typeAlias|library|reporting|eligibility|metaType|report|annotation|enum|type|choice|func){{wordEnd}}'
- rootStart: '{{identifiersConflictingWithRootStart}}|{{ambiguousRootStart}}|{{unambiguousRootStart}}'
- strictRootEnd: (?={{rootStart}})
- rootEnd: (?={{ambiguousRootStart}}|{{unambiguousRootStart}})
+ rootStart: '{{identifiersConflictingWithRootStart}}|{{identifiersConflictingWithNamespace}}|{{ambiguousRootStart}}|{{unambiguousRootStart}}'
+ namespaceEnd: (?={{identifiersConflictingWithNamespace}}|{{ambiguousRootStart}}|{{unambiguousRootStart}})
+ rootEnd: (?={{identifiersConflictingWithRootStart}}|{{ambiguousRootStart}}|{{unambiguousRootStart}})
unambiguousRootEnd: (?={{unambiguousRootStart}})
sectionStart: '{{wordStart}}((\Qpost-\E)?condition|set|add|inputs|output|alias){{wordEnd}}'
@@ -45,7 +46,7 @@ variables:
synonymAnnotationSectionEnd: (?={{synonymAnnotationSection}})|(?=\])|{{rootEnd}}
docReferenceAnnotationSection: '{{wordStart}}(rationale|rationale_author|structured_provision|provision|reportedField){{wordEnd}}'
docReferenceAnnotationSectionEnd: (?={{docReferenceAnnotationSection}}|\])|{{sectionEnd}}
- expressionEnd: '(?=,|\)|\])|{{sectionEnd}}'
+ expressionEnd: '(?=,|\)|\]|\})|{{sectionEnd}}'
functionalOperationEnd: (?={{listOperation}}|{{wordStart}}(else|then){{wordEnd}})|{{expressionEnd}}
patterns:
@@ -78,7 +79,7 @@ repository:
begin: '{{wordStart}}namespace{{wordEnd}}'
beginCaptures:
0: { name: keyword.other.namespace.rosetta }
- end: '{{strictRootEnd}}'
+ end: '{{namespaceEnd}}'
patterns:
- include: '#comment'
- include: '#documentation'
@@ -146,6 +147,7 @@ repository:
- include: '#rosettaTypeAlias'
- include: '#rosettaLibraryFunction'
- include: '#rosettaAnnotationSource'
+ - include: '#rosettaTranslateSource'
- include: '#rosettaRule'
- include: '#rosettaMetaType'
- include: '#rosettaReport'
@@ -453,6 +455,74 @@ repository:
- include: '#comment'
- include: '#annotation'
+ rosettaTranslateSource:
+ name: meta.translate-source.rosetta
+ begin: '{{wordStart}}translate{{wordEnd}}'
+ beginCaptures:
+ 0: { name: keyword.other.translate.rosetta }
+ end: (\})|{{rootEnd}}
+ endCaptures:
+ 1: { name: punctuation.section.braces.end.rosetta }
+ patterns:
+ - include: '#comment'
+ - begin: '(?<={{wordStart}}translate{{wordEnd}})'
+ end: (?=\{)|{{rootEnd}}
+ patterns:
+ - include: '#comment'
+ - name: keyword.other.source.rosetta
+ match: '{{wordStart}}source{{wordEnd}}'
+ - name: keyword.other.extends.rosetta
+ match: '{{wordStart}}extends{{wordEnd}}'
+ - name: entity.name.translate-source.rosetta
+ match: '{{identifier}}'
+ - name: meta.translate-source-body.rosetta
+ begin: (\{)
+ beginCaptures:
+ 1: { name: punctuation.section.braces.begin.rosetta }
+ end: (?=\})|{{unambiguousRootEnd}}
+ patterns:
+ - include: '#comment'
+ - name: meta.translation.inputs.rosetta
+ begin: ({{wordStart}}from{{wordEnd}})
+ beginCaptures:
+ 1: { name: keyword.other.from.rosetta }
+ end: (?=\:|\})|{{rootEnd}}
+ patterns:
+ - include: '#comment'
+ - begin: '(?={{identifier}})'
+ end: '(,)|(?=\:|\})|{{rootEnd}}'
+ endCaptures:
+ 1: { name: punctuation.separator.comma.rosetta }
+ patterns:
+ - include: '#comment'
+ - begin: '({{identifier}})\s+(?={{identifier}})'
+ beginCaptures:
+ 1: { name: variable.parameter.input.rosetta }
+ end: '(?=,)|(?=\:|\})|{{rootEnd}}'
+ patterns:
+ - include: '#comment'
+ - include: '#typeCall'
+ - include: '#typeCall'
+ - name: meta.translation.result-type.rosetta
+ begin: '(?={{identifier}})'
+ end: (?={{wordStart}}from{{wordEnd}})|(?=\:|\})|{{rootEnd}}
+ patterns:
+ - include: '#comment'
+ - name: keyword.other.from.rosetta
+ match: '{{wordStart}}from{{wordEnd}}'
+ - include: '#typeCall'
+ - include: '#colon'
+ - include: '#translateAnnotation'
+ - name: meta.translation-attribute-mapping.rosetta
+ begin: '(\+|-)\s*({{identifier}})'
+ beginCaptures:
+ 1: { name: keyword.operator.annotation.rosetta }
+ 2: { name: variable.other.member.rosetta }
+ end: (?={{identifier}}|\}|\+|-)|{{rootEnd}}
+ patterns:
+ - include: '#comment'
+ - include: '#translateAnnotation'
+
rosettaRule:
patterns:
- name: meta.rule.rosetta
@@ -722,6 +792,39 @@ repository:
- include: '#comment'
- name: entity.name.rule.rosetta
match: '{{identifier}}'
+
+ translateAnnotation:
+ name: meta.annotated.translate.rosetta
+ begin: (\[)
+ beginCaptures:
+ 1: { name: punctuation.annotation.begin.rosetta }
+ end: (\])|{{unambiguousRootEnd}}
+ endCaptures:
+ 1: { name: punctuation.annotation.end.rosetta }
+ patterns:
+ - include: '#comment'
+ - include: '#translateInstructionAnnotationBody'
+ - include: '#translateMetaInstructionAnnotationBody'
+
+ translateInstructionAnnotationBody:
+ begin: '{{wordStart}}from{{wordEnd}}'
+ beginCaptures:
+ 0: { name: keyword.other.from.rosetta }
+ end: (?=\]|\})|{{rootEnd}}
+ patterns:
+ - include: '#comment'
+ - include: '#expression'
+
+ translateMetaInstructionAnnotationBody:
+ begin: '{{wordStart}}meta{{wordEnd}}'
+ beginCaptures:
+ 0: { name: keyword.other.meta.rosetta }
+ end: (?=\]|\})|{{rootEnd}}
+ patterns:
+ - include: '#comment'
+ - include: '#translateInstructionAnnotationBody'
+ - name: variable.other.member.meta.rosetta
+ match: '{{identifier}}'
customAnnotationBody:
name: meta.annotated.rosetta
diff --git a/rosetta-ide/src/main/java/com/regnosys/rosetta/ide/semantictokens/RosettaSemanticTokensService.java b/rosetta-ide/src/main/java/com/regnosys/rosetta/ide/semantictokens/RosettaSemanticTokensService.java
index d3b1508b7..d610574f6 100644
--- a/rosetta-ide/src/main/java/com/regnosys/rosetta/ide/semantictokens/RosettaSemanticTokensService.java
+++ b/rosetta-ide/src/main/java/com/regnosys/rosetta/ide/semantictokens/RosettaSemanticTokensService.java
@@ -36,6 +36,7 @@
import com.regnosys.rosetta.rosetta.RosettaSymbol;
import com.regnosys.rosetta.rosetta.RosettaType;
import com.regnosys.rosetta.rosetta.RosettaTypeAlias;
+import com.regnosys.rosetta.rosetta.translate.TranslationParameter;
import com.regnosys.rosetta.rosetta.TypeCall;
import com.regnosys.rosetta.rosetta.TypeParameter;
import com.regnosys.rosetta.rosetta.expression.ClosureParameter;
@@ -264,6 +265,8 @@ private SemanticToken markSymbol(EObject objectToMark, EStructuralFeature featur
return markAlias(objectToMark, featureToMark, (ShortcutDeclaration)symbol);
} else if (symbol instanceof TypeParameter) {
return createSemanticToken(objectToMark, featureToMark, PARAMETER);
+ } else if (symbol instanceof TranslationParameter) {
+ return createSemanticToken(objectToMark, featureToMark, PARAMETER);
}
return null;
}
diff --git a/rosetta-ide/src/test/java/com/regnosys/rosetta/ide/contentassist/ContentAssistTest.xtend b/rosetta-ide/src/test/java/com/regnosys/rosetta/ide/contentassist/ContentAssistTest.xtend
index dcf11ee88..50dbfb288 100644
--- a/rosetta-ide/src/test/java/com/regnosys/rosetta/ide/contentassist/ContentAssistTest.xtend
+++ b/rosetta-ide/src/test/java/com/regnosys/rosetta/ide/contentassist/ContentAssistTest.xtend
@@ -164,6 +164,7 @@ class ContentAssistTest extends AbstractRosettaLanguageServerTest {
to-string -> to-string [[7, 27] .. [7, 27]]
to-time -> to-time [[7, 27] .. [7, 27]]
to-zoned-date-time -> to-zoned-date-time [[7, 27] .. [7, 27]]
+ translate -> translate [[7, 27] .. [7, 27]]
type -> type [[7, 27] .. [7, 27]]
typeAlias -> typeAlias [[7, 27] .. [7, 27]]
* -> * [[7, 27] .. [7, 27]]
diff --git a/rosetta-lang/model/Rosetta.xcore b/rosetta-lang/model/Rosetta.xcore
index e668255b3..6c8353fa5 100644
--- a/rosetta-lang/model/Rosetta.xcore
+++ b/rosetta-lang/model/Rosetta.xcore
@@ -23,8 +23,11 @@ class RosettaModel extends RosettaDefinable {
class Import {
String importedNamespace
+ String namespaceAlias
+
}
+
/**********************************************************************
* Common types
*/
@@ -45,16 +48,10 @@ interface RosettaTyped {
}
}
-class RosettaFeature extends RosettaNamed {
- /**
- * @return The name or 'value' if it's null
- */
- derived String getNameOrDefault get {
- return name ?: 'value'
- }
+interface RosettaFeature extends RosettaNamed {
}
-class RosettaTypedFeature extends RosettaFeature, RosettaTyped {}
+interface RosettaTypedFeature extends RosettaFeature, RosettaTyped {}
/**
* A named symbol that may be used in an expression to reference an object
diff --git a/rosetta-lang/model/RosettaExpression.xcore b/rosetta-lang/model/RosettaExpression.xcore
index c84d5fb3c..39c2e2fdd 100644
--- a/rosetta-lang/model/RosettaExpression.xcore
+++ b/rosetta-lang/model/RosettaExpression.xcore
@@ -14,7 +14,9 @@ import com.regnosys.rosetta.rosetta.RosettaFeature
import com.regnosys.rosetta.rosetta.RosettaCallableWithArgs
import com.regnosys.rosetta.rosetta.RosettaMapTestExpression
import com.regnosys.rosetta.rosetta.RosettaTyped
+import com.regnosys.rosetta.rosetta.TypeCall
import com.regnosys.rosetta.rosetta.simple.Attribute
+import com.regnosys.rosetta.rosetta.translate.TranslateSource
import org.eclipse.emf.common.util.BasicEList
@@ -170,6 +172,12 @@ class ConstructorKeyValuePair {
contains RosettaExpression value
}
+class TranslateDispatchOperation extends RosettaExpression {
+ refers TranslateSource source
+ refers RosettaExpression[] inputs
+ refers TypeCall outputType
+}
+
interface RosettaOperation extends RosettaExpression {
String operator
}
diff --git a/rosetta-lang/model/RosettaTranslate.xcore b/rosetta-lang/model/RosettaTranslate.xcore
new file mode 100644
index 000000000..756a36402
--- /dev/null
+++ b/rosetta-lang/model/RosettaTranslate.xcore
@@ -0,0 +1,56 @@
+@Ecore(nsURI="http://www.rosetta-model.com/RosettaTranslate")
+@GenModel(fileExtensions="rosetta", modelDirectory="/com.regnosys.rosetta/emf-gen/main/java", operationReflection="false",
+ copyrightText="Copyright (c) REGnosys 2017 (www.regnosys.com)", forceOverwrite="true", updateClasspath="false",
+ complianceLevel="8.0", bundleManifest="false", modelPluginID="")
+package com.regnosys.rosetta.rosetta.translate
+
+import com.regnosys.rosetta.rosetta.simple.Attribute
+import com.regnosys.rosetta.rosetta.RosettaMetaType
+import com.regnosys.rosetta.rosetta.RosettaNamed
+import com.regnosys.rosetta.rosetta.RosettaRootElement
+import com.regnosys.rosetta.rosetta.RosettaSymbol
+import com.regnosys.rosetta.rosetta.RosettaTyped
+import com.regnosys.rosetta.rosetta.TypeCall
+import com.regnosys.rosetta.rosetta.expression.RosettaExpression
+import com.regnosys.rosetta.rosetta.expression.TranslateDispatchOperation
+
+class TranslateSource extends RosettaRootElement, RosettaNamed {
+ refers TranslateSource[] superSources
+ contains Translation[] translations opposite source
+}
+
+class Translation {
+ refers TranslateSource source opposite translations
+
+ contains TypeCall resultType
+ contains TranslationParameter[] parameters
+ contains TranslateInstruction[] typeInstructions
+ contains TranslateMetaInstruction[] typeMetaInstructions
+
+ contains TranslationRule[] rules opposite translation
+}
+
+class TranslationParameter extends RosettaSymbol, RosettaTyped {
+
+}
+
+class TranslationRule {
+ refers Translation translation opposite rules
+
+ refers Attribute attribute
+ contains TranslateInstruction[] instructions
+ contains TranslateMetaInstruction[] metaInstructions
+}
+
+abstract class BaseTranslateInstruction {
+ contains TranslateDispatchOperation _internalDispatchExpression
+
+ contains RosettaExpression[] expressions
+}
+
+class TranslateInstruction extends BaseTranslateInstruction {
+}
+
+class TranslateMetaInstruction extends BaseTranslateInstruction {
+ refers RosettaMetaType metaFeature
+}
diff --git a/rosetta-lang/pom.xml b/rosetta-lang/pom.xml
index 780052cc2..abd23b65d 100644
--- a/rosetta-lang/pom.xml
+++ b/rosetta-lang/pom.xml
@@ -90,6 +90,7 @@
model/Rosetta.xcore
model/RosettaSimple.xcore
model/RosettaExpression.xcore
+ model/RosettaTranslate.xcore
diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/GenerateRosetta.mwe2 b/rosetta-lang/src/main/java/com/regnosys/rosetta/GenerateRosetta.mwe2
index b07c45732..25035c19f 100644
--- a/rosetta-lang/src/main/java/com/regnosys/rosetta/GenerateRosetta.mwe2
+++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/GenerateRosetta.mwe2
@@ -60,6 +60,7 @@ Workflow {
referencedResource = "platform:/resource/com.regnosys.rosetta/model/Rosetta.xcore"
referencedResource = "platform:/resource/com.regnosys.rosetta/model/RosettaSimple.xcore"
referencedResource = "platform:/resource/com.regnosys.rosetta/model/RosettaExpression.xcore"
+ referencedResource = "platform:/resource/com.regnosys.rosetta/model/RosettaTranslate.xcore"
name = "com.regnosys.rosetta.Rosetta"
fileExtensions = "rosetta"
diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/Rosetta.xtext b/rosetta-lang/src/main/java/com/regnosys/rosetta/Rosetta.xtext
index da47f984a..439a49ab2 100644
--- a/rosetta-lang/src/main/java/com/regnosys/rosetta/Rosetta.xtext
+++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/Rosetta.xtext
@@ -2,6 +2,7 @@ grammar com.regnosys.rosetta.Rosetta with org.eclipse.xtext.common.Terminals
import "http://www.rosetta-model.com/Rosetta"
import "http://www.rosetta-model.com/RosettaSimple"
import "http://www.rosetta-model.com/RosettaExpression"
+import "http://www.rosetta-model.com/RosettaTranslate"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
// general TODO: naming is inconsistent, e.g.,
@@ -26,10 +27,11 @@ QualifiedName:
;
Import:
- 'import' importedNamespace=QualifiedNameWithWildcard;
-
+ 'import' importedNamespace=(QualifiedNameWithWildcard) ('as' namespaceAlias=ValidID)?;
+
QualifiedNameWithWildcard:
QualifiedName ('.' '*')?;
+
RootElement:
Annotation
@@ -166,7 +168,7 @@ RosettaRootElement:
RosettaBasicType | RosettaRecordType | RosettaLibraryFunction | RosettaSynonymSource |
RosettaRule | RosettaMetaType | RosettaExternalSynonymSource |
RosettaExternalRuleSource | RosettaReport | RosettaTypeAlias |
- RosettaQualifiedType | RosettaCalculationType
+ RosettaQualifiedType | RosettaCalculationType | TranslateSource
;
@@ -208,8 +210,8 @@ TypeParameterValidID:
;
ValidID:
- ID | 'condition' | 'source' | 'value' | 'version' // used in CDM model
- | 'pattern'
+ ID | 'condition' | 'source' | 'value' | 'version'
+ | 'pattern' | 'translate'
;
@@ -891,3 +893,41 @@ RosettaRule:
('as' identifier=STRING)?)
)
;
+
+/***********
+ * Translate
+ ************/
+TranslateSource:
+ 'translate' 'source' RosettaNamed ('extends' superSources+=[TranslateSource|QualifiedName] (',' superSources+=[TranslateSource|QualifiedName])* )?
+ '{'
+ (translations+=Translation)*
+ '}'
+;
+
+Translation:
+ resultType=TypeCall ('from' parameters+=TranslationParameter (',' parameters+=TranslationParameter)*)? ':'
+ (typeInstructions+=TranslateInstruction | typeMetaInstructions+=TranslateMetaInstruction)*
+ rules+=TranslationRule*
+;
+
+TranslationParameter:
+ RosettaNamed? RosettaTyped
+;
+
+TranslationRule:
+ '+' attribute=[Attribute|ValidID]
+ (instructions+=TranslateInstruction | metaInstructions+=TranslateMetaInstruction)*
+;
+
+fragment BaseTranslateInstruction:
+ 'from' expressions+=RosettaCalcExpression (',' expressions+=RosettaCalcExpression)* ']'
+;
+
+TranslateInstruction:
+ '[' BaseTranslateInstruction
+;
+
+TranslateMetaInstruction:
+ '[' 'meta' metaFeature=[RosettaMetaType|ValidID] BaseTranslateInstruction
+;
+
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 b9476b023..551d04937 100644
--- a/rosetta-lang/src/main/java/com/regnosys/rosetta/RosettaStandaloneSetup.xtend
+++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/RosettaStandaloneSetup.xtend
@@ -8,6 +8,7 @@ import com.regnosys.rosetta.rosetta.simple.SimplePackage
import org.eclipse.emf.ecore.EPackage
import com.regnosys.rosetta.rosetta.expression.ExpressionPackage
import com.google.inject.Injector
+import com.regnosys.rosetta.rosetta.translate.TranslatePackage
/**
* Initialization support for running Xtext languages without Equinox extension registry.
@@ -32,6 +33,9 @@ class RosettaStandaloneSetup extends RosettaStandaloneSetupGenerated {
if (!EPackage.Registry.INSTANCE.containsKey(ExpressionPackage.eNS_URI)) {
EPackage.Registry.INSTANCE.put(ExpressionPackage.eNS_URI, ExpressionPackage.eINSTANCE);
}
+ if (!EPackage.Registry.INSTANCE.containsKey(TranslatePackage.eNS_URI)) {
+ EPackage.Registry.INSTANCE.put(TranslatePackage.eNS_URI, TranslatePackage.eINSTANCE);
+ }
super.register(injector)
}
}
diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/formatting2/RosettaFormatter.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/formatting2/RosettaFormatter.xtend
index eb5f60b5a..7335c894c 100644
--- a/rosetta-lang/src/main/java/com/regnosys/rosetta/formatting2/RosettaFormatter.xtend
+++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/formatting2/RosettaFormatter.xtend
@@ -56,6 +56,12 @@ import com.regnosys.rosetta.rosetta.TypeParameter
import com.regnosys.rosetta.rosetta.TypeCallArgument
import javax.inject.Inject
import com.regnosys.rosetta.rosetta.RosettaRule
+import com.regnosys.rosetta.rosetta.translate.TranslateSource
+import com.regnosys.rosetta.rosetta.translate.Translation
+import com.regnosys.rosetta.rosetta.translate.TranslationRule
+import com.regnosys.rosetta.rosetta.translate.TranslateInstruction
+import com.regnosys.rosetta.rosetta.translate.TranslateMetaInstruction
+import com.regnosys.rosetta.rosetta.translate.BaseTranslateInstruction
class RosettaFormatter extends AbstractRosettaFormatter2 {
@@ -756,6 +762,127 @@ class RosettaFormatter extends AbstractRosettaFormatter2 {
format
]
}
+
+ def dispatch void format(TranslateSource translateSource, extension IFormattableDocument document) {
+ val extension translateSourceGrammarAccess = translateSourceAccess
+
+ translateSource.regionFor.keyword(sourceKeyword_1)
+ .surround[oneSpace]
+ translateSource.regionFor.keyword(extendsKeyword_3_0)
+ .surround[oneSpace]
+ translateSource.regionFor.keywords(commaKeyword_3_2_0).forEach[
+ prepend[noSpace]
+ append[oneSpace]
+ ]
+
+ indentedBraces(translateSource, document)
+
+ translateSource.translations.head
+ .prepend[newLine]
+ translateSource.translations.tail.forEach[
+ prepend[setNewLines(2)]
+ ]
+ translateSource.translations.forEach[
+ format
+ ]
+ }
+
+ def dispatch void format(Translation translation, extension IFormattableDocument document) {
+ val extension translationGrammarAccess = translationAccess
+
+ translation.regionFor.keyword(fromKeyword_1_0)
+ .surround[oneSpace]
+ translation.regionFor.keywords(commaKeyword_1_2_0).forEach[
+ prepend[noSpace]
+ append[oneSpace]
+ ]
+ translation.regionFor.keyword(':').prepend[noSpace]
+ translation.indentInner(document)
+ translation.typeInstructions.forEach[
+ prepend[newLine]
+ format
+ ]
+ translation.typeMetaInstructions.forEach[
+ prepend[newLine]
+ format
+ ]
+ translation.rules.forEach[
+ prepend[newLine]
+ format
+ ]
+ }
+
+ def dispatch void format(TranslationRule rule, extension IFormattableDocument document) {
+ val extension translationRuleGrammarAccess = translationRuleAccess
+
+ rule.regionFor.keyword(plusSignKeyword_0)
+ .append[oneSpace]
+ rule.indentInner(document)
+ rule.instructions.forEach[
+ prepend[newLine]
+ format
+ ]
+ rule.metaInstructions.forEach[
+ prepend[newLine]
+ format
+ ]
+ }
+
+ private def void formatBaseInstruction(BaseTranslateInstruction baseInstruction, extension IFormattableDocument document) {
+ val extension baseTranslateInstructionGrammarAccess = baseTranslateInstructionAccess
+
+ baseInstruction.regionFor.keywords(commaKeyword_2_0).forEach[
+ prepend[noSpace]
+ ]
+
+ formatInlineOrMultiline(document, baseInstruction, FormattingMode.NORMAL,
+ [extension doc | // case: short argument list
+ baseInstruction.regionFor.keyword(fromKeyword_0)
+ .append[oneSpace]
+ baseInstruction.regionFor.keyword(rightSquareBracketKeyword_3)
+ .prepend[noSpace]
+ baseInstruction.regionFor.keywords(commaKeyword_2_0).forEach[
+ append[oneSpace]
+ ]
+ baseInstruction.expressions.forEach[format(doc)]
+ ],
+ [extension doc | // case: long argument list
+ baseInstruction.indentInner(doc)
+ interior(
+ baseInstruction.regionFor.keyword(fromKeyword_0)
+ .append[newLine],
+ baseInstruction.regionFor.keyword(rightSquareBracketKeyword_3)
+ .prepend[newLine],
+ [indent]
+ )
+ baseInstruction.regionFor.keywords(commaKeyword_2_0).forEach[
+ append[newLine]
+ ]
+ baseInstruction.expressions.forEach[format(doc)]
+ ]
+ )
+ }
+
+ def dispatch void format(TranslateInstruction instruction, extension IFormattableDocument document) {
+ val extension translateInstructionGrammarAccess = translateInstructionAccess
+
+ instruction.regionFor.keyword(leftSquareBracketKeyword_0)
+ .append[noSpace]
+
+ formatBaseInstruction(instruction, document)
+ }
+
+ def dispatch void format(TranslateMetaInstruction metaInstruction, extension IFormattableDocument document) {
+ val extension translateMetaInstructionGrammarAccess = translateMetaInstructionAccess
+
+ metaInstruction.regionFor.keyword(metaKeyword_1)
+ .prepend[noSpace]
+ .append[oneSpace]
+ metaInstruction.regionFor.assignment(metaFeatureAssignment_2)
+ .append[oneSpace]
+
+ formatBaseInstruction(metaInstruction, document)
+ }
def void indentedBraces(EObject eObject, extension IFormattableDocument document) {
val lcurly = eObject.regionFor.keyword('{').prepend[newLine]
diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/IdentifierRepresentationService.java b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/IdentifierRepresentationService.java
index d06adcbff..700c5c9da 100644
--- a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/IdentifierRepresentationService.java
+++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/IdentifierRepresentationService.java
@@ -27,7 +27,7 @@ public class IdentifierRepresentationService {
private ImplicitVariableUtil implicitVarUtil;
public ImplicitVariableRepresentation getImplicitVarInContext(EObject context) {
- EObject definingContainer = implicitVarUtil.findContainerDefiningImplicitVariable(context).orElseThrow();
+ EObject definingContainer = implicitVarUtil.findObjectDefiningImplicitVariable(context).orElseThrow();
return new ImplicitVariableRepresentation(definingContainer);
}
}
diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/RosettaGenerator.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/RosettaGenerator.xtend
index af52eafdc..a293436c9 100644
--- a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/RosettaGenerator.xtend
+++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/RosettaGenerator.xtend
@@ -31,7 +31,6 @@ import org.eclipse.xtext.generator.IGenerator2
import org.eclipse.xtext.generator.IGeneratorContext
import org.slf4j.Logger
import org.slf4j.LoggerFactory
-import com.regnosys.rosetta.generator.java.reports.RuleGenerator
import com.regnosys.rosetta.generator.java.condition.ConditionGenerator
import com.regnosys.rosetta.generator.java.reports.ReportGenerator
import javax.inject.Inject
@@ -42,6 +41,9 @@ import com.regnosys.rosetta.config.RosettaGeneratorsConfiguration
import com.regnosys.rosetta.generator.java.expression.DeepPathUtilGenerator
import com.regnosys.rosetta.utils.DeepFeatureCallUtil
import com.regnosys.rosetta.types.RDataType
+import com.regnosys.rosetta.generator.java.reports.RuleGenerator
+import com.regnosys.rosetta.generator.java.translate.TranslationGenerator
+import com.regnosys.rosetta.rosetta.translate.TranslateSource
/**
* Generates code from your model files on save.
@@ -59,6 +61,7 @@ class RosettaGenerator implements IGenerator2 {
@Inject ExternalGenerators externalGenerators
@Inject JavaPackageInfoGenerator javaPackageInfoGenerator
@Inject RuleGenerator ruleGenerator
+ @Inject TranslationGenerator translationGenerator
@Inject ModelObjectGenerator dataGenerator
@Inject ValidatorsGenerator validatorsGenerator
@@ -194,6 +197,11 @@ class RosettaGenerator implements IGenerator2 {
tabulatorGenerator.generate(fsa, externalClass.data, Optional.of(it))
]
}
+ TranslateSource: {
+ it.translations.forEach [
+ translationGenerator.generate(fsa, it)
+ ]
+ }
}
]
enumGenerator.generate(packages, fsa, model.elements, version)
diff --git a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend
index be9a5a406..da6b3a767 100644
--- a/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend
+++ b/rosetta-lang/src/main/java/com/regnosys/rosetta/generator/java/expression/ExpressionGenerator.xtend
@@ -129,6 +129,16 @@ import java.time.ZonedDateTime
import com.regnosys.rosetta.rosetta.expression.RosettaDeepFeatureCall
import com.regnosys.rosetta.rosetta.expression.DefaultOperation
import com.regnosys.rosetta.generator.java.statement.builder.JavaConditionalExpression
+import com.regnosys.rosetta.rosetta.translate.TranslationParameter
+import com.regnosys.rosetta.rosetta.expression.TranslateDispatchOperation
+import com.regnosys.rosetta.utils.TranslateUtil
+import java.util.ArrayList
+import com.fasterxml.jackson.core.type.TypeReference
+import com.regnosys.rosetta.generator.java.statement.JavaLocalVariableDeclarationStatement
+import com.regnosys.rosetta.generator.java.statement.JavaForLoop
+import com.regnosys.rosetta.generator.java.statement.JavaBlock
+import com.regnosys.rosetta.generator.java.statement.JavaStatementList
+
class ExpressionGenerator extends RosettaExpressionSwitch {
@@ -152,6 +162,7 @@ class ExpressionGenerator extends RosettaExpressionSwitchof(«it»)''',
- MAPPER_C.wrap(itemType)
- )
- ]
+ JavaStatementBuilder.invokeMethod(
+ elements,
+ [JavaExpression.from('''«MapperC».<«itemType»>of(«it»)''', MAPPER_C.wrap(itemType))],
+ context.scope
+ )
}
override protected caseMapOperation(MapOperation expr, Context context) {
@@ -1017,6 +1013,10 @@ class ExpressionGenerator extends RosettaExpressionSwitch input0List = ...;
+ // final List input1List = ...;
+ // ...
+ // final List