summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Laner <laner@itestra.de>2013-10-24 19:56:05 +0200
committerPhilip Rauwolf <rauwolf@itestra.de>2013-10-29 17:37:39 +0100
commitb2e962942805f7e115ec7f65b0a45fb5b3fe1cb7 (patch)
tree6cfacc67149eb40a74ce01114514eabbbfd8d174
parente8fd0e9df8c30d52e5b7a5a4af467bcd69762f91 (diff)
downloadgenivi-common-api-runtime-b2e962942805f7e115ec7f65b0a45fb5b3fe1cb7.tar.gz
Fixed code generation of polymorphic structs
Change-Id: I6da1b38ef784a46d4f00dee6bb3949c1bbb4c59b
-rw-r--r--org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FTypeGenerator.xtend28
-rw-r--r--org.genivi.commonapi.core/src/org/genivi/commonapi/core/generator/FrancaGeneratorExtensions.xtend13
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)