@@ -549,12 +549,19 @@ proc add*(father, son: PType) =
549549proc addAllowNil * (father, son: PType ) {.inline .} =
550550 father.sonsImpl.add son
551551
552- template `[]` * (n: PType , i: int ): PType = n.sonsImpl[i]
552+ template `[]` * (n: PType , i: int ): PType =
553+ if n.state == Partial : loadType (n)
554+ n.sonsImpl[i]
553555template `[]=` * (n: PType , i: int ; x: PType ) =
556+ if n.state == Partial : loadType (n)
554557 n.sonsImpl[i] = x
555558
556- template `[]` * (n: PType , i: BackwardsIndex ): PType = n[n.len - i.int ]
557- template `[]=` * (n: PType , i: BackwardsIndex ; x: PType ) = n[n.len - i.int ] = x
559+ template `[]` * (n: PType , i: BackwardsIndex ): PType =
560+ if n.state == Partial : loadType (n)
561+ n[n.len - i.int ]
562+ template `[]=` * (n: PType , i: BackwardsIndex ; x: PType ) =
563+ if n.state == Partial : loadType (n)
564+ n[n.len - i.int ] = x
558565
559566proc getDeclPragma * (n: PNode ): PNode =
560567 # # return the `nkPragma` node for declaration `n`, or `nil` if no pragma was found.
@@ -791,29 +798,57 @@ proc replaceFirstSon*(n, newson: PNode) {.inline.} =
791798proc replaceSon * (n: PNode ; i: int ; newson: PNode ) {.inline .} =
792799 n.sons[i] = newson
793800
794- proc last * (n: PType ): PType {.inline .} = n.sonsImpl[^ 1 ]
801+ proc last * (n: PType ): PType {.inline .} =
802+ if n.state == Partial : loadType (n)
803+ n.sonsImpl[^ 1 ]
795804
796- proc elementType * (n: PType ): PType {.inline .} = n.sonsImpl[^ 1 ]
797- proc skipModifier * (n: PType ): PType {.inline .} = n.sonsImpl[^ 1 ]
805+ proc elementType * (n: PType ): PType {.inline .} =
806+ if n.state == Partial : loadType (n)
807+ n.sonsImpl[^ 1 ]
798808
799- proc indexType * (n: PType ): PType {.inline .} = n.sonsImpl[0 ]
800- proc baseClass * (n: PType ): PType {.inline .} = n.sonsImpl[0 ]
809+ proc skipModifier * (n: PType ): PType {.inline .} =
810+ if n.state == Partial : loadType (n)
811+ n.sonsImpl[^ 1 ]
812+
813+ proc indexType * (n: PType ): PType {.inline .} =
814+ if n.state == Partial : loadType (n)
815+ n.sonsImpl[0 ]
816+
817+ proc baseClass * (n: PType ): PType {.inline .} =
818+ if n.state == Partial : loadType (n)
819+ n.sonsImpl[0 ]
801820
802821proc base * (t: PType ): PType {.inline .} =
822+ if t.state == Partial : loadType (t)
803823 result = t.sonsImpl[0 ]
804824
805- proc returnType * (n: PType ): PType {.inline .} = n.sonsImpl[0 ]
825+ proc returnType * (n: PType ): PType {.inline .} =
826+ if n.state == Partial : loadType (n)
827+ n.sonsImpl[0 ]
828+
806829proc setReturnType * (n, r: PType ) {.inline .} =
830+ if n.state == Partial : loadType (n)
807831 n.sonsImpl[0 ] = r
832+
808833proc setIndexType * (n, idx: PType ) {.inline .} =
834+ if n.state == Partial : loadType (n)
809835 n.sonsImpl[0 ] = idx
810836
811- proc firstParamType * (n: PType ): PType {.inline .} = n.sonsImpl[1 ]
812- proc firstGenericParam * (n: PType ): PType {.inline .} = n.sonsImpl[1 ]
837+ proc firstParamType * (n: PType ): PType {.inline .} =
838+ if n.state == Partial : loadType (n)
839+ n.sonsImpl[1 ]
840+
841+ proc firstGenericParam * (n: PType ): PType {.inline .} =
842+ if n.state == Partial : loadType (n)
843+ n.sonsImpl[1 ]
813844
814- proc typeBodyImpl * (n: PType ): PType {.inline .} = n.sonsImpl[^ 1 ]
845+ proc typeBodyImpl * (n: PType ): PType {.inline .} =
846+ if n.state == Partial : loadType (n)
847+ n.sonsImpl[^ 1 ]
815848
816- proc genericHead * (n: PType ): PType {.inline .} = n.sonsImpl[0 ]
849+ proc genericHead * (n: PType ): PType {.inline .} =
850+ if n.state == Partial : loadType (n)
851+ n.sonsImpl[0 ]
817852
818853proc skipTypes * (t: PType , kinds: TTypeKinds ): PType =
819854 # # Used throughout the compiler code to test whether a type tree contains or
0 commit comments