Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 106 additions & 42 deletions lib/metamodelutil.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,75 +120,139 @@ function resolveName(name, table) {
}

/**
* Name resolution for metamodel
* Resolve decorator types in the metamodel
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @return {object} the metamodel with fully qualified names
* @private
*/
function resolveTypeNames(metaModel, table) {
// any element can have a decorator (including primitive fields) , so lets resolve those first
function resolveDecoratorTypes(metaModel, table) {
(metaModel.decorators || []).forEach((decorator) => {
resolveTypeNames(decorator, table);
});
}

switch (metaModel.$class) {
case `${MetaModelNamespace}.Model`: {
(metaModel.declarations || []).forEach((decl) => {
resolveTypeNames(decl, table);
});
/**
* Resolve model declaration types in the metamodel
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @private
*/
function resolveModelTypes(metaModel, table) {
(metaModel.declarations || []).forEach((decl) => {
resolveTypeNames(decl, table);
});
}

/**
* Resolve class (Asset/Concept/Event/Transaction/Participant) declaration types
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @private
*/
function resolveClassDeclarationTypes(metaModel, table) {
if (metaModel.superType) {
const name = metaModel.superType.name;
metaModel.superType.namespace = resolveName(name, table);
metaModel.superType.name = table[name].name;
if (table[name]?.resolvedName) {
metaModel.superType.resolvedName = table[name].resolvedName;
}
}
(metaModel.properties || []).forEach((property) => {
resolveTypeNames(property, table);
});
}

/**
* Resolve map declaration types in the metamodel
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @private
*/
function resolveMapDeclarationTypes(metaModel, table) {
resolveTypeNames(metaModel.key, table);
resolveTypeNames(metaModel.value, table);
}

/**
* Resolve decorator argument types in the metamodel
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @private
*/
function resolveDecoratorArgumentTypes(metaModel, table) {
(metaModel.arguments || []).forEach((argument) => {
resolveTypeNames(argument, table);
});
}

/**
* Resolve property types (Object/Relationship/Enum) in the metamodel
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @private
*/
function resolvePropertyTypes(metaModel, table) {
metaModel.type.namespace = resolveName(metaModel.type.name, table);
metaModel.type.name = table[metaModel.type.name].name;
if (table[metaModel.type.name]?.resolvedName) {
metaModel.type.resolvedName = table[metaModel.type.name].resolvedName;
}
}

/**
* Resolve scalar types in the metamodel
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @private
*/
function resolveScalarTypes(metaModel, table) {
metaModel.namespace = resolveName(metaModel.name, table);
metaModel.name = table[metaModel.name].name;
}

/**
* Name resolution for metamodel
* @param {object} metaModel - the metamodel (JSON)
* @param {object} table - the name table
* @return {object} the metamodel with fully qualified names
*/
function resolveTypeNames(metaModel, table) {
// any element can have a decorator (including primitive fields), so let's resolve those first
resolveDecoratorTypes(metaModel, table);

switch (metaModel.$class) {
case `${MetaModelNamespace}.Model`:
resolveModelTypes(metaModel, table);
break;
case `${MetaModelNamespace}.AssetDeclaration`:
case `${MetaModelNamespace}.ConceptDeclaration`:
case `${MetaModelNamespace}.EventDeclaration`:
case `${MetaModelNamespace}.TransactionDeclaration`:
case `${MetaModelNamespace}.ParticipantDeclaration`: {
if (metaModel.superType) {
const name = metaModel.superType.name;
metaModel.superType.namespace = resolveName(name, table);
metaModel.superType.name = table[name].name;
if (table[name]?.resolvedName) {
metaModel.superType.resolvedName = table[name].resolvedName;
}
}
(metaModel.properties || []).forEach((property) => {
resolveTypeNames(property, table);
});
}
case `${MetaModelNamespace}.ParticipantDeclaration`:
resolveClassDeclarationTypes(metaModel, table);
break;
case `${MetaModelNamespace}.MapDeclaration`: {
resolveTypeNames(metaModel.key, table);
resolveTypeNames(metaModel.value, table);
}
case `${MetaModelNamespace}.MapDeclaration`:
resolveMapDeclarationTypes(metaModel, table);
break;
case `${MetaModelNamespace}.Decorator`: {
(metaModel.arguments || []).forEach((argument) => {
resolveTypeNames(argument, table);
});
}
case `${MetaModelNamespace}.Decorator`:
resolveDecoratorArgumentTypes(metaModel, table);
break;
case `${MetaModelNamespace}.EnumProperty`:
case `${MetaModelNamespace}.ObjectProperty`:
case `${MetaModelNamespace}.RelationshipProperty`:
case `${MetaModelNamespace}.DecoratorTypeReference`:
case `${MetaModelNamespace}.ObjectMapKeyType`:
case `${MetaModelNamespace}.ObjectMapValueType`: {
metaModel.type.namespace = resolveName(metaModel.type.name, table);
metaModel.type.name = table[metaModel.type.name].name;
if (table[metaModel.type.name]?.resolvedName) {
metaModel.type.resolvedName = table[metaModel.type.name].resolvedName;
}
}
case `${MetaModelNamespace}.ObjectMapValueType`:
resolvePropertyTypes(metaModel, table);
break;
case `${MetaModelNamespace}.StringScalar`:
case `${MetaModelNamespace}.BooleanScalar`:
case `${MetaModelNamespace}.DateTimeScalar`:
case `${MetaModelNamespace}.DoubleScalar`:
case `${MetaModelNamespace}.LongScalar`:
case `${MetaModelNamespace}.IntegerScalar`: {
metaModel.namespace = resolveName(metaModel.name, table);
metaModel.name = table[metaModel.name].name;
}
case `${MetaModelNamespace}.IntegerScalar`:
resolveScalarTypes(metaModel, table);
break;
}
return metaModel;
Expand Down