You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by mb...@apache.org on 2019/06/07 20:37:38 UTC

[incubator-daffodil] branch master updated: Sick of NPE. lexicalParent is now optLexicalParent and is Option type

This is an automated email from the ASF dual-hosted git repository.

mbeckerle pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-daffodil.git


The following commit(s) were added to refs/heads/master by this push:
     new 1ccb8c8  Sick of NPE. lexicalParent is now optLexicalParent and is Option type
1ccb8c8 is described below

commit 1ccb8c82bf4c1a6bddc8020a6c0f571efd2c4af3
Author: Michael Beckerle <mb...@tresys.com>
AuthorDate: Sat Jun 1 00:42:06 2019 -0400

    Sick of NPE. lexicalParent is now optLexicalParent and is Option type
    
    DAFFODIL-1444
---
 .../daffodil/dsom/AnnotatedSchemaComponent.scala   |  8 +++--
 .../org/apache/daffodil/dsom/ChoiceGroup.scala     |  4 +--
 .../org/apache/daffodil/dsom/DFDLAnnotation.scala  |  4 ++-
 .../org/apache/daffodil/dsom/ElementBase.scala     | 10 +++---
 .../org/apache/daffodil/dsom/ElementRef.scala      |  2 +-
 .../scala/org/apache/daffodil/dsom/GroupRef.scala  |  6 ++--
 .../scala/org/apache/daffodil/dsom/IIBase.scala    |  2 +-
 .../apache/daffodil/dsom/LocalElementDecl.scala    |  6 ++--
 .../scala/org/apache/daffodil/dsom/Nesting.scala   |  8 ++---
 .../org/apache/daffodil/dsom/ReptypeMixins.scala   |  2 +-
 .../org/apache/daffodil/dsom/SchemaComponent.scala | 16 +++++----
 .../daffodil/dsom/SchemaComponentFactory.scala     | 24 +++++++-------
 .../org/apache/daffodil/dsom/SchemaDocument.scala  |  3 +-
 .../scala/org/apache/daffodil/dsom/SchemaSet.scala |  4 +--
 .../org/apache/daffodil/dsom/SequenceGroup.scala   |  6 ++--
 .../main/scala/org/apache/daffodil/dsom/Term.scala | 38 ++++++++++++----------
 .../daffodil/grammar/ElementBaseGrammarMixin.scala |  2 +-
 .../grammar/primitives/PrimitivesExpressions.scala |  2 +-
 .../annotation/props/TestPropertyRuntime.scala     |  2 +-
 19 files changed, 82 insertions(+), 67 deletions(-)

diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/AnnotatedSchemaComponent.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/AnnotatedSchemaComponent.scala
index cf89c43..6797167 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/AnnotatedSchemaComponent.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/AnnotatedSchemaComponent.scala
@@ -110,8 +110,12 @@ trait ResolvesProperties
 /** Convenience class for implemening AnnotatedSchemaComponent trait */
 abstract class AnnotatedSchemaComponentImpl(
   final override val xml: Node,
-  final override val lexicalParent: SchemaComponent)
-  extends AnnotatedSchemaComponent
+  final override val optLexicalParent: Option[SchemaComponent])
+  extends AnnotatedSchemaComponent {
+
+  def this(xml: Node, lexicalParent: SchemaComponent) =
+    this(xml, Option(lexicalParent))
+}
 
 /**
  * Shared characteristics of any annotated schema component.
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ChoiceGroup.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ChoiceGroup.scala
index b9d6114..cfccc7c 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ChoiceGroup.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ChoiceGroup.scala
@@ -101,7 +101,7 @@ trait ChoiceDefMixin
 
 abstract class ChoiceTermBase(
   final override val xml: Node,
-  final override val lexicalParent: SchemaComponent,
+  final override val optLexicalParent: Option[SchemaComponent],
   final override val position: Int)
   extends ModelGroup(position)
   with Choice_AnnotationMixin
@@ -369,7 +369,7 @@ abstract class ChoiceTermBase(
 }
 
 final class Choice(xmlArg: Node, lexicalParent: SchemaComponent, position: Int)
-  extends ChoiceTermBase(xmlArg, lexicalParent, position)
+  extends ChoiceTermBase(xmlArg, Option(lexicalParent), position)
   with ChoiceDefMixin {
 
   override lazy val optReferredToComponent = None
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/DFDLAnnotation.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/DFDLAnnotation.scala
index 3567dd3..97dd586 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/DFDLAnnotation.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/DFDLAnnotation.scala
@@ -33,13 +33,15 @@ import org.apache.daffodil.util.Misc
  * and Import objects which represent those statements in a schema,
  * the proxy DFDLSchemaFile object, etc.
  *
+ *
  */
 abstract class DFDLAnnotation(xmlArg: Node, annotatedSCArg: AnnotatedSchemaComponent)
   extends SchemaComponent
   with NestingLexicalMixin {
 
   final override val xml = xmlArg
-  final override def lexicalParent = annotatedSCArg
+
+  final override val optLexicalParent = Option(annotatedSCArg)
 
   final lazy val annotatedSC = annotatedSCArg
 
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala
index 34dda3c..4a76249 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementBase.scala
@@ -663,10 +663,12 @@ trait ElementBase
   }
 
   final lazy val isParentUnorderedSequence: Boolean = {
-    lexicalParent match {
-      case s: SequenceTermBase if !s.isOrdered => true
-      case _ => false
-    }
+    optLexicalParent.map { lp =>
+      lp match {
+        case s: SequenceTermBase if !s.isOrdered => true
+        case _ => false
+      }
+    }.getOrElse(false)
   }
 
   private def getImplicitAlignmentInBits(thePrimType: PrimType, theRepresentation: Representation): Int = {
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementRef.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementRef.scala
index 748f302..2202c48 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementRef.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ElementRef.scala
@@ -38,7 +38,7 @@ abstract class AbstractElementRef(
   with NestingLexicalMixin {
 
   override lazy val xml = xmlArg
-  final override lazy val lexicalParent = parentArg
+  final override lazy val optLexicalParent = Option(parentArg)
   final override lazy val position = positionArg
 
   requiredEvaluations(referencedElement)
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/GroupRef.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/GroupRef.scala
index e31c7e2..6b35c96 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/GroupRef.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/GroupRef.scala
@@ -59,13 +59,13 @@ trait GroupRef { self: ModelGroup =>
  * right part of the schema.
  */
 final class GroupRefFactory(refXMLArg: Node, val refLexicalParent: SchemaComponent, position: Int, isHidden: Boolean)
-  extends SchemaComponentFactory(refXMLArg, refLexicalParent.schemaDocument)
+  extends SchemaComponentFactory(refXMLArg, Some(refLexicalParent.schemaDocument))
   with HasRefMixin {
 
   final def qname = this.refQName
 
   lazy val groupRef = LV('groupRef) {
-    val gdefFactory = lexicalParent.schemaSet.getGlobalGroupDef(qname).getOrElse {
+    val gdefFactory = schemaSet.getGlobalGroupDef(qname).getOrElse {
       SDE("Referenced group definition not found: %s", this.ref)
     }
     val (gref, _) = gdefFactory.forGroupRef(refXMLArg, refLexicalParent, position, isHidden)
@@ -105,7 +105,7 @@ final class ChoiceGroupRef(
   refLexicalParent: SchemaComponent,
   positionArg: Int,
   isHiddenArg: Boolean)
-  extends ChoiceTermBase(refXML, refLexicalParent, positionArg)
+  extends ChoiceTermBase(refXML, Option(refLexicalParent), positionArg)
   with GroupRef {
 
   requiredEvaluations(groupDef)
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/IIBase.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/IIBase.scala
index edd4557..9c7032a 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/IIBase.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/IIBase.scala
@@ -126,7 +126,7 @@ object IIUtils {
 abstract class IIBase( final override val xml: Node, xsdArg: XMLSchemaDocument, val seenBefore: IIMap)
   extends SchemaComponent
   with NestingLexicalMixin {
-  final override def lexicalParent = xsdArg
+  final override def optLexicalParent = Option(xsdArg)
 
   /**
    * An import/include requires only that we can access the
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/LocalElementDecl.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/LocalElementDecl.scala
index d4955fe..ab1c040 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/LocalElementDecl.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/LocalElementDecl.scala
@@ -21,7 +21,7 @@ import scala.xml.Node
 
 sealed abstract class LocalElementDeclBase(
   final override val xml: Node,
-  final override val lexicalParent: SchemaComponent,
+  final override val optLexicalParent: Option[SchemaComponent],
   final override val position: Int)
   extends ElementBase
   with LocalElementComponentMixin
@@ -35,7 +35,7 @@ class LocalElementDecl(
   xml: Node,
   lexicalParent: SchemaComponent,
   position: Int)
-  extends LocalElementDeclBase(xml, lexicalParent, position)
+  extends LocalElementDeclBase(xml, Option(lexicalParent), position)
 
 /**
  * A QuasiElement is similar to a LocalElement except it will have no
@@ -49,7 +49,7 @@ class LocalElementDecl(
 sealed abstract class QuasiElementDeclBase(
   xml: Node,
   lexicalParent: SchemaComponent)
-  extends LocalElementDeclBase(xml, lexicalParent, -1) {
+  extends LocalElementDeclBase(xml, Option(lexicalParent), -1) {
 
   override lazy val isQuasiElement = true
 }
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Nesting.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Nesting.scala
index f0729a7..d8d690d 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Nesting.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Nesting.scala
@@ -22,7 +22,7 @@ import org.apache.daffodil.exceptions.Assert
 trait NestingMixin {
 
   /** The lexically enclosing schema component */
-  def lexicalParent: SchemaComponent
+  def optLexicalParent: Option[SchemaComponent]
 
   /**
    * Define this for schema components that have back-references to ref
@@ -56,8 +56,7 @@ trait NestingMixin {
 trait NestingLexicalMixin
   extends NestingMixin {
 
-  override protected def enclosingComponentDef =
-    if (lexicalParent eq null) None else Some(lexicalParent)
+  override protected def enclosingComponentDef = optLexicalParent
 
 }
 
@@ -70,7 +69,8 @@ trait NestingTraversesToReferenceMixin
   def referringComponent: Option[SchemaComponent]
 
   final override protected def enclosingComponentDef: Option[SchemaComponent] = {
-    Assert.invariant(lexicalParent.isInstanceOf[SchemaDocument]) // global things have schema documents as their parents.
+    Assert.invariant(optLexicalParent.isDefined &&
+      optLexicalParent.get.isInstanceOf[SchemaDocument]) // global things have schema documents as their parents.
     referringComponent
   }
 
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ReptypeMixins.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ReptypeMixins.scala
index 6fb60d2..bb160c2 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ReptypeMixins.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/ReptypeMixins.scala
@@ -32,7 +32,7 @@ trait HasOptRepTypeMixinImpl extends SchemaComponent with HasOptRepTypeMixin {
   override lazy val optRepTypeElement: Option[RepTypeQuasiElementDecl] =
     optRepTypeDef.map(repType => {
       val xmlElem = Elem(null, "QuasiElementForTypeCalc", new UnprefixedAttribute("type", repType.namedQName.toAttributeNameString, Null), namespaces, true)
-      new RepTypeQuasiElementDecl(xmlElem, lexicalParent)
+      new RepTypeQuasiElementDecl(xmlElem, optLexicalParent.get)
     })
 
 }
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponent.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponent.scala
index 9bffc30..9cfe5be 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponent.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponent.scala
@@ -36,8 +36,12 @@ import org.apache.daffodil.schema.annotation.props.PropTypes
 
 abstract class SchemaComponentImpl(
   final override val xml: Node,
-  final override val lexicalParent: SchemaComponent)
-  extends SchemaComponent
+  final override val optLexicalParent: Option[SchemaComponent])
+  extends SchemaComponent {
+
+  def this(xml: Node, lexicalParent: SchemaComponent) =
+    this(xml, Option(lexicalParent))
+}
 
 /**
  * The core root class of the DFDL Schema object model.
@@ -54,12 +58,10 @@ trait SchemaComponent
   with PropTypes {
 
   def xml: Node
-  def lexicalParent: SchemaComponent
-  final lazy val optLexicalParent = Option(lexicalParent) // Option because Option(null) == None. We want that.
 
-  override def oolagContextViaArgs = Option(lexicalParent) // Option because Option(null) == None. We want that.
+  override def oolagContextViaArgs = optLexicalParent
 
-  def tunable: DaffodilTunables = lexicalParent.tunable
+  lazy val tunable: DaffodilTunables = optLexicalParent.get.tunable
 
   lazy val dpathCompileInfo: DPathCompileInfo =
     new DPathCompileInfo(
@@ -209,7 +211,7 @@ trait SchemaComponent
  * the 'schema'.
  */
 final class Schema(val namespace: NS, schemaDocs: Seq[SchemaDocument], schemaSetArg: SchemaSet)
-  extends SchemaComponentImpl(<fake/>, schemaSetArg) {
+  extends SchemaComponentImpl(<fake/>, Option(schemaSetArg)) {
 
   requiredEvaluations(schemaDocuments)
 
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponentFactory.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponentFactory.scala
index 5d087d0..49d83c8 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponentFactory.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaComponentFactory.scala
@@ -31,15 +31,17 @@ import scala.xml.Node
  */
 abstract class SchemaComponentFactory(
   final override val xml: Node,
-  final override val lexicalParent: SchemaComponent)
+  final override val optLexicalParent: Option[SchemaComponent])
   extends SchemaComponent
   with NestingLexicalMixin {
 
+  def this(xml: Node, lexicalParent: SchemaComponent) =
+    this(xml, Option(lexicalParent))
 }
 
 abstract class AnnotatedSchemaComponentFactory(
   final override val xml: Node,
-  final override val lexicalParent: SchemaComponent)
+  final override val optLexicalParent: Option[SchemaComponent])
   extends AnnotatedSchemaComponent
   with NestingLexicalMixin {
 
@@ -50,7 +52,7 @@ trait SchemaFileLocatableImpl
 
   def xml: scala.xml.Node
   def schemaFile: Option[DFDLSchemaFile]
-  def lexicalParent: SchemaComponent
+  def optLexicalParent: Option[SchemaComponent]
 
   /**
    * Annotations can contain expressions, so we need to be able to compile them.
@@ -63,7 +65,7 @@ trait SchemaFileLocatableImpl
     val attrText = xml.attribute(XMLUtils.INT_NS, XMLUtils.LINE_ATTRIBUTE_NAME).map { _.text }
     if (attrText.isDefined) {
       attrText
-    } else if (lexicalParent != null) lexicalParent.lineAttribute
+    } else if (optLexicalParent.isDefined) optLexicalParent.get.lineAttribute
     else None
   }
 
@@ -79,14 +81,14 @@ trait SchemaFileLocatableImpl
 trait CommonContextMixin
   extends NestingMixin { self: OOLAGHost with ThrowsSDE =>
 
-  def lexicalParent: SchemaComponent
+  def optLexicalParent: Option[SchemaComponent]
 
-  lazy val schemaFile: Option[DFDLSchemaFile] = lexicalParent.schemaFile
-  lazy val schemaSet: SchemaSet = lexicalParent.schemaSet
-  def schemaDocument: SchemaDocument = lexicalParent.schemaDocument
-  lazy val xmlSchemaDocument: XMLSchemaDocument = lexicalParent.xmlSchemaDocument
-  lazy val schema: Schema = lexicalParent.schema
-  def uriString: String = lexicalParent.uriString
+  lazy val schemaFile: Option[DFDLSchemaFile] = optLexicalParent.flatMap { _.schemaFile }
+  lazy val schemaSet: SchemaSet = optLexicalParent.get.schemaSet
+  def schemaDocument: SchemaDocument = optLexicalParent.get.schemaDocument
+  lazy val xmlSchemaDocument: XMLSchemaDocument = optLexicalParent.get.xmlSchemaDocument
+  lazy val schema: Schema = optLexicalParent.get.schema
+  def uriString: String = optLexicalParent.get.uriString
 
   def xml: scala.xml.Node
 
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaDocument.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaDocument.scala
index 49f018f..c7132d0 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaDocument.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaDocument.scala
@@ -182,7 +182,8 @@ final class SchemaDocument(xmlSDoc: XMLSchemaDocument)
   with SeparatorSuppressionPolicyMixin {
 
   final override val xml = xmlSDoc.xml
-  final override def lexicalParent = xmlSDoc
+  final override def optLexicalParent = Option(xmlSDoc)
+  final override lazy val xmlSchemaDocument = xmlSDoc
 
   override lazy val optReferredToComponent = None
 
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala
index 800bac8..4f26d77 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SchemaSet.scala
@@ -70,14 +70,14 @@ final class SchemaSet(
   val validateDFDLSchemas: Boolean,
   checkAllTopLevelArg: Boolean,
   tunableArg: DaffodilTunables)
-  extends SchemaComponentImpl(<schemaSet/>, null)
+  extends SchemaComponentImpl(<schemaSet/>, None)
   with SchemaSetIncludesAndImportsMixin {
 
   private lazy val processorFactory = pfArg // insure this by name arg is evaluated exactly once.
 
   lazy val root = rootElement(processorFactory.flatMap { _.rootSpec })
 
-  override def tunable =
+  override lazy val tunable =
     tunableArg
 
   requiredEvaluations(isValid)
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala
index a2a8682..4d1fd7e 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala
@@ -48,7 +48,7 @@ import org.apache.daffodil.exceptions.Assert
  */
 abstract class SequenceTermBase(
   final override val xml: Node,
-  final override val lexicalParent: SchemaComponent,
+  final override val optLexicalParent: Option[SchemaComponent],
   final override val position: Int)
   extends ModelGroup(position)
   with SequenceGrammarMixin {
@@ -86,7 +86,7 @@ abstract class SequenceGroupTermBase(
   xml: Node,
   lexicalParent: SchemaComponent,
   position: Int)
-  extends SequenceTermBase(xml, lexicalParent, position)
+  extends SequenceTermBase(xml, Option(lexicalParent), position)
   with Sequence_AnnotationMixin
   with SequenceRuntimeValuedPropertiesMixin
   with SeparatorSuppressionPolicyMixin
@@ -356,7 +356,7 @@ class Sequence(xmlArg: Node, lexicalParent: SchemaComponent, position: Int)
  * handled as a degenerate sequence having only one element decl within it.
  */
 final class ChoiceBranchImpliedSequence(rawGM: Term)
-  extends SequenceTermBase(rawGM.xml, rawGM.lexicalParent, rawGM.position)
+  extends SequenceTermBase(rawGM.xml, rawGM.optLexicalParent, rawGM.position)
   with GroupDefLike {
 
   override def separatorSuppressionPolicy: SeparatorSuppressionPolicy = SeparatorSuppressionPolicy.TrailingEmptyStrict
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Term.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Term.scala
index 3bfb486..42458f1 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Term.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/Term.scala
@@ -281,26 +281,28 @@ trait Term
     }
 
   final lazy val immediatelyEnclosingModelGroup: Option[ModelGroup] = {
-    val res = lexicalParent match {
-      case c: ChoiceTermBase => Some(c)
-      case s: SequenceTermBase => Some(s)
-      case d: SchemaDocument => {
-        // we must be the Root elementRef or a quasi node
-        Assert.invariant(this.isInstanceOf[Root] || this.isInstanceOf[QuasiElementDeclBase])
-        None
-      }
-      case gr: GroupRef => gr.asModelGroup.immediatelyEnclosingModelGroup
-      case gdd: GlobalGroupDef => Some(gdd.groupRef.asModelGroup)
-      case ged: GlobalElementDecl => ged.elementRef.immediatelyEnclosingModelGroup
-      case ct: ComplexTypeBase => {
-        None
-        // The above formerly was ct.element.immediatelyEnclosingModelGroup,
-        // but if we have a CT as our parent, the group around the element whose type
-        // that is, isn't "immediately enclosing".
+    optLexicalParent.flatMap { lexicalParent =>
+      val res = lexicalParent match {
+        case c: ChoiceTermBase => Some(c)
+        case s: SequenceTermBase => Some(s)
+        case d: SchemaDocument => {
+          // we must be the Root elementRef or a quasi node
+          Assert.invariant(this.isInstanceOf[Root] || this.isInstanceOf[QuasiElementDeclBase])
+          None
+        }
+        case gr: GroupRef => gr.asModelGroup.immediatelyEnclosingModelGroup
+        case gdd: GlobalGroupDef => Some(gdd.groupRef.asModelGroup)
+        case ged: GlobalElementDecl => ged.elementRef.immediatelyEnclosingModelGroup
+        case ct: ComplexTypeBase => {
+          None
+          // The above formerly was ct.element.immediatelyEnclosingModelGroup,
+          // but if we have a CT as our parent, the group around the element whose type
+          // that is, isn't "immediately enclosing".
+        }
+        case _ => Assert.invariantFailed("immediatelyEnclosingModelGroup called on " + this + "with lexical parent " + lexicalParent)
       }
-      case _ => Assert.invariantFailed("immediatelyEnclosingModelGroup called on " + this + "with lexical parent " + lexicalParent)
+      res
     }
-    res
   }
 
   /**
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
index 793a7e7..8064bba 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
@@ -217,7 +217,7 @@ trait ElementBaseGrammarMixin
       <element name={ name + " (prefixLength)" } type={ prefixLengthType.toQNameString }/>
         .copy(scope = prefixLengthTypeGSTD.xml.scope)
     val detachedElementDecl =
-      new PrefixLengthQuasiElementDecl(detachedNode, prefixLengthTypeGSTD.lexicalParent)
+      new PrefixLengthQuasiElementDecl(detachedNode, prefixLengthTypeGSTD.optLexicalParent.get)
 
     val prefixedLengthKind = detachedElementDecl.lengthKind
     prefixedLengthKind match {
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesExpressions.scala b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesExpressions.scala
index ab04318..b392995 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesExpressions.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesExpressions.scala
@@ -123,7 +123,7 @@ case class InitiatedContent(
 }
 
 case class SetVariable(stmt: DFDLSetVariable)
-  extends ExpressionEvaluatorBase(stmt.lexicalParent) {
+  extends ExpressionEvaluatorBase(stmt.annotatedSC) {
 
   val baseName = "SetVariable[" + stmt.varQName.local + "]"
 
diff --git a/daffodil-core/src/test/scala/org/apache/daffodil/schema/annotation/props/TestPropertyRuntime.scala b/daffodil-core/src/test/scala/org/apache/daffodil/schema/annotation/props/TestPropertyRuntime.scala
index 72fe751..6ddf703 100644
--- a/daffodil-core/src/test/scala/org/apache/daffodil/schema/annotation/props/TestPropertyRuntime.scala
+++ b/daffodil-core/src/test/scala/org/apache/daffodil/schema/annotation/props/TestPropertyRuntime.scala
@@ -73,7 +73,7 @@ class TestPropertyRuntime {
 
 }
 
-class HasMixin extends SchemaComponentImpl(<foo/>, null)
+class HasMixin extends SchemaComponentImpl(<foo/>, None)
   with TheExamplePropMixin
   with NestingLexicalMixin {