@@ -343,7 +343,7 @@ class CodeGen(schema: Schema) {
343
343
properties.map { property =>
344
344
val name = property.name
345
345
val nameCamelCase = camelCase(name)
346
- val tpe = getCompleteType(property)
346
+ val tpe = getCompleteType(property, nullable = false )
347
347
348
348
property.cardinality match {
349
349
case Cardinality .One (_) =>
@@ -479,7 +479,7 @@ class CodeGen(schema: Schema) {
479
479
def generateNodeBaseTypeSource (nodeBaseType : NodeBaseType ): String = {
480
480
val className = nodeBaseType.className
481
481
val properties = nodeBaseType.properties
482
- val propertyAccessors = Helpers .propertyAccessors(properties)
482
+ val propertyAccessors = Helpers .propertyAccessors(properties, nullable = false )
483
483
484
484
val mixinsForBaseTypes = nodeBaseType.extendz.map { baseTrait =>
485
485
s " with ${baseTrait.className}"
@@ -601,7 +601,7 @@ class CodeGen(schema: Schema) {
601
601
602
602
val newNodePropertySetters = nodeBaseType.properties.map { property =>
603
603
val camelCaseName = camelCase(property.name)
604
- val tpe = getCompleteType(property)
604
+ val tpe = getCompleteType(property, nullable = false )
605
605
s " def ${camelCaseName}_=(value: $tpe): Unit "
606
606
}.mkString(lineSeparator)
607
607
@@ -856,7 +856,7 @@ class CodeGen(schema: Schema) {
856
856
case Cardinality .One (_) =>
857
857
s """ this._ $memberName = $newNodeCasted. $memberName""" .stripMargin
858
858
case Cardinality .ZeroOrOne =>
859
- s """ this._ $memberName = $newNodeCasted. $memberName.orNull """ .stripMargin
859
+ s """ this._ $memberName = $newNodeCasted. $memberName match { case None => null; case Some(value) => value } """ .stripMargin
860
860
case Cardinality .List =>
861
861
s """ this._ $memberName = if ( $newNodeCasted. $memberName != null) $newNodeCasted. $memberName else collection.immutable.ArraySeq.empty """ .stripMargin
862
862
}
@@ -993,7 +993,7 @@ class CodeGen(schema: Schema) {
993
993
s """ trait ${className}Base extends AbstractNode $mixinsForExtendedNodesBase $mixinsForMarkerTraits {
994
994
| def asStored : StoredNode = this.asInstanceOf[StoredNode]
995
995
|
996
- | ${Helpers .propertyAccessors(properties)}
996
+ | ${Helpers .propertyAccessors(properties, nullable = false )}
997
997
|
998
998
| $abstractContainedNodeAccessors
999
999
|}
@@ -1021,7 +1021,7 @@ class CodeGen(schema: Schema) {
1021
1021
val nodeRefImpl = {
1022
1022
val propertyDelegators = properties.map { key =>
1023
1023
val name = camelCase(key.name)
1024
- s """ override def $name: ${getCompleteType(key)} = get(). $name"""
1024
+ s """ override def $name: ${getCompleteType(key, nullable = false )} = get(). $name"""
1025
1025
}.mkString(lineSeparator)
1026
1026
1027
1027
val propertyDefaultValues = propertyDefaultValueImpl(s " $className.PropertyDefaults " , properties)
@@ -1095,14 +1095,14 @@ class CodeGen(schema: Schema) {
1095
1095
1096
1096
val updateSpecificPropertyImpl : String = {
1097
1097
import Property .Cardinality
1098
- def caseEntry (name : String , accessorName : String , cardinality : Cardinality , baseType : String ) = {
1098
+ def caseEntry (name : String , accessorName : String , cardinality : Cardinality , baseType : String , baseTypeNullable : String ) = {
1099
1099
val setter = cardinality match {
1100
1100
case Cardinality .One (_) | Cardinality .ZeroOrOne =>
1101
1101
s " value.asInstanceOf[ $baseType] "
1102
1102
case Cardinality .List =>
1103
1103
s """ value match {
1104
1104
| case null => collection.immutable.ArraySeq.empty
1105
- | case singleValue: $baseType => collection.immutable.ArraySeq(singleValue)
1105
+ | case singleValue: $baseTypeNullable => collection.immutable.ArraySeq(singleValue)
1106
1106
| case coll: IterableOnce[Any] if coll.iterator.isEmpty => collection.immutable.ArraySeq.empty
1107
1107
| case arr: Array[_] if arr.isEmpty => collection.immutable.ArraySeq.empty
1108
1108
| case arr: Array[_] => collection.immutable.ArraySeq.unsafeWrapArray(arr).asInstanceOf[IndexedSeq[ $baseType]]
@@ -1120,10 +1120,10 @@ class CodeGen(schema: Schema) {
1120
1120
s """ |case " $name" => this._ $accessorName = $setter"""
1121
1121
}
1122
1122
1123
- val forKeys = properties.map(p => caseEntry(p.name, camelCase(p.name), p.cardinality, typeFor(p))).mkString(lineSeparator)
1123
+ val forKeys = properties.map(p => caseEntry(p.name, camelCase(p.name), p.cardinality, typeFor(p), typeFor(p, nullable = true ) )).mkString(lineSeparator)
1124
1124
1125
1125
val forContainedNodes = nodeType.containedNodes.map(containedNode =>
1126
- caseEntry(containedNode.localName, containedNode.localName, containedNode.cardinality, containedNode.classNameForStoredNode)
1126
+ caseEntry(containedNode.localName, containedNode.localName, containedNode.cardinality, containedNode.classNameForStoredNode, containedNode.classNameForStoredNode )
1127
1127
).mkString(lineSeparator)
1128
1128
1129
1129
s """ override protected def updateSpecificProperty(key:String, value: Object): Unit = {
@@ -1161,10 +1161,11 @@ class CodeGen(schema: Schema) {
1161
1161
val fieldName = s " _ $publicName"
1162
1162
val (publicType, tpeForField, fieldAccessor, defaultValue) = {
1163
1163
val valueType = typeFor(property)
1164
+ val valueTypeNullable = typeFor(property, nullable = true )
1164
1165
property.cardinality match {
1165
1166
case Cardinality .One (_) =>
1166
- (valueType, valueType , fieldName, s " $className.PropertyDefaults. ${property.className}" )
1167
- case Cardinality .ZeroOrOne => (s " Option[ $valueType] " , valueType , s " Option( $fieldName) " , " null" )
1167
+ (valueType, valueTypeNullable , fieldName, s " $className.PropertyDefaults. ${property.className}" )
1168
+ case Cardinality .ZeroOrOne => (s " Option[ $valueType] " , valueTypeNullable , s " Option( $fieldName).asInstanceOf[Option[ $valueType ]] " , " null" )
1168
1169
case Cardinality .List => (s " IndexedSeq[ $valueType] " , s " IndexedSeq[ $valueType] " , fieldName, " collection.immutable.ArraySeq.empty" )
1169
1170
}
1170
1171
}
@@ -1732,27 +1733,29 @@ class CodeGen(schema: Schema) {
1732
1733
1733
1734
def generateNewNodeSource (nodeType : NodeType , properties : Seq [Property [? ]], inEdges : Map [String , Set [String ]], outEdges : Map [String , Set [String ]]) = {
1734
1735
import Property .Cardinality
1735
- case class FieldDescription (name : String , valueType : String , fullType : String , cardinality : Cardinality )
1736
+ case class FieldDescription (name : String , valueType : String , valueTypeNullable : String , fullType : String , cardinality : Cardinality )
1736
1737
val fieldDescriptions = mutable.ArrayBuffer .empty[FieldDescription ]
1737
1738
1738
1739
for (property <- properties) {
1739
1740
fieldDescriptions += FieldDescription (
1740
1741
camelCase(property.name),
1741
1742
typeFor(property),
1742
- getCompleteType(property),
1743
+ typeFor(property, nullable = true ),
1744
+ getCompleteType(property, nullable = false ),
1743
1745
property.cardinality)
1744
1746
}
1745
1747
1746
1748
for (containedNode <- nodeType.containedNodes) {
1747
1749
fieldDescriptions += FieldDescription (
1748
1750
containedNode.localName,
1749
1751
typeFor(containedNode),
1752
+ typeFor(containedNode),
1750
1753
getCompleteType(containedNode),
1751
1754
containedNode.cardinality)
1752
1755
}
1753
1756
1754
1757
val memberVariables = fieldDescriptions.reverse.map {
1755
- case FieldDescription (name, _, fullType, cardinality) =>
1758
+ case FieldDescription (name, _, _, fullType, cardinality) =>
1756
1759
val defaultValue = cardinality match {
1757
1760
case Cardinality .One (default) => defaultValueImpl(default)
1758
1761
case Cardinality .ZeroOrOne => " None"
@@ -1812,22 +1815,22 @@ class CodeGen(schema: Schema) {
1812
1815
val mixins = nodeType.extendz.map{baseType => s " with ${baseType.className}New " }.mkString(" " )
1813
1816
1814
1817
val propertySettersImpl = fieldDescriptions.map {
1815
- case FieldDescription (name, valueType , _, cardinality) =>
1818
+ case FieldDescription (name, valueType, valueTypeNullable , _, cardinality) =>
1816
1819
cardinality match {
1817
1820
case Cardinality .One (_) =>
1818
- s """ def $name(value: $valueType ): this.type = {
1821
+ s """ def $name(value: $valueTypeNullable ): this.type = {
1819
1822
| this. $name = value
1820
1823
| this
1821
1824
|}
1822
1825
| """ .stripMargin
1823
1826
1824
1827
case Cardinality .ZeroOrOne =>
1825
- s """ def $name(value: $valueType ): this.type = {
1828
+ s """ def $name(value: $valueTypeNullable ): this.type = {
1826
1829
| this. $name = Option(value)
1827
1830
| this
1828
1831
|}
1829
1832
|
1830
- |def $name(value: Option[ $valueType]): this.type = $name(value.orNull )
1833
+ |def $name(value: Option[ $valueType]): this.type = $name(value match { case None => null; case Some(value) => value: $valueTypeNullable } )
1831
1834
| """ .stripMargin
1832
1835
1833
1836
case Cardinality .List =>
0 commit comments