diff options
author | Stefan Laner <laner@itestra.de> | 2013-10-24 19:56:05 +0200 |
---|---|---|
committer | Philip Rauwolf <rauwolf@itestra.de> | 2013-10-29 17:37:39 +0100 |
commit | b2e962942805f7e115ec7f65b0a45fb5b3fe1cb7 (patch) | |
tree | 6cfacc67149eb40a74ce01114514eabbbfd8d174 | |
parent | e8fd0e9df8c30d52e5b7a5a4af467bcd69762f91 (diff) | |
download | genivi-common-api-runtime-b2e962942805f7e115ec7f65b0a45fb5b3fe1cb7.tar.gz |
Fixed code generation of polymorphic structs
Change-Id: I6da1b38ef784a46d4f00dee6bb3949c1bbb4c59b
2 files changed, 35 insertions, 6 deletions
diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend index ba38bdc..48075c7 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend @@ -210,12 +210,16 @@ class FTypeGenerator { def dispatch generateFTypeDeclaration(FArrayType fArrayType, DeploymentInterfacePropertyAccessor deploymentAccessor) ''' «generateComments(fArrayType, false)» - typedef std::vector<«fArrayType.elementType.getNameReference(fArrayType.eContainer)»> «fArrayType.elementName»; + «IF fArrayType.elementType.derived != null && fArrayType.elementType.derived instanceof FStructType && (fArrayType.elementType.derived as FStructType).polymorphic» + typedef std::vector<std::shared_ptr<«fArrayType.elementType.getNameReference(fArrayType.eContainer)»>> «fArrayType.name»; + «ELSE» + typedef std::vector<«fArrayType.elementType.getNameReference(fArrayType.eContainer)»> «fArrayType.elementName»; + «ENDIF» ''' def dispatch generateFTypeDeclaration(FMapType fMap, DeploymentInterfacePropertyAccessor deploymentAccessor) ''' «generateComments(fMap, false)» - typedef std::unordered_map<«fMap.generateKeyType»«fMap.generateValueType»«fMap.generateHasher»> «fMap.elementName»; + typedef std::unordered_map<«fMap.generateKeyType», «fMap.generateValueType»«fMap.generateHasher»> «fMap.elementName»; ''' def dispatch generateFTypeDeclaration(FStructType fStructType, DeploymentInterfacePropertyAccessor deploymentAccessor) ''' @@ -526,8 +530,6 @@ class FTypeGenerator { return call } - def private generateKeyType(FMapType fMap) '''«fMap.keyType.getNameReference(fMap.eContainer)»''' - def private generateValueType(FMapType fMap) ''', «fMap.valueType.getNameReference(fMap.eContainer)»''' def private generateHasher(FMapType fMap) { if (fMap.keyType.derived instanceof FEnumerationType) { return ''', CommonAPI::EnumHasher<«fMap.keyType.getNameReference(fMap.eContainer)»>''' @@ -536,6 +538,24 @@ class FTypeGenerator { return "" } + def private generateKeyType(FMapType fMap) { + if (fMap.keyType.polymorphic) { + return "std::shared_ptr<" + fMap.keyType.getNameReference(fMap.eContainer) + ">" + } + else { + return fMap.keyType.getNameReference(fMap.eContainer) + } + } + + def private generateValueType(FMapType fMap) { + if (fMap.valueType.polymorphic) { + return "std::shared_ptr<" + fMap.valueType.getNameReference(fMap.eContainer) + ">" + } + else { + return fMap.valueType.getNameReference(fMap.eContainer) + } + } + def private getBaseStructName(FStructType fStructType) { if (fStructType.base != null) return fStructType.base.getRelativeNameReference(fStructType) diff --git a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FrancaGeneratorExtensions.xtend b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FrancaGeneratorExtensions.xtend index 0dcdab9..2c077ed 100644 --- a/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FrancaGeneratorExtensions.xtend +++ b/org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FrancaGeneratorExtensions.xtend @@ -658,12 +658,21 @@ class FrancaGeneratorExtensions { if (element.type.derived instanceof FStructType && (element.type.derived as FStructType).hasPolymorphicBase) typeName = 'std::shared_ptr<' + typeName + '>' - if ("[]".equals(element.array)) - typeName = 'std::vector<' + element.type.getNameReference(source) + '>' + if ("[]".equals(element.array)) { + if (element.type.derived instanceof FStructType && (element.type.derived as FStructType).hasPolymorphicBase) { + typeName = 'std::vector<std::shared_ptr<' + element.type.getNameReference(source) + '>>' + } else { + typeName = 'std::vector<' + element.type.getNameReference(source) + '>' + } + } return typeName } + def boolean isPolymorphic(FTypeRef typeRef) { + return (typeRef.derived != null && typeRef.derived instanceof FStructType && (typeRef.derived as FStructType).polymorphic) + } + def getNameReference(FTypeRef destination, EObject source) { if (destination.derived != null) return destination.derived.getRelativeNameReference(source) |