@@ -692,6 +692,20 @@ const DataType_parameters_fieldindex = fieldindex(DataType, :parameters)
692
692
const DataType_types_fieldindex = fieldindex (DataType, :types )
693
693
const DataType_super_fieldindex = fieldindex (DataType, :super )
694
694
695
+ const TypeName_name_fieldindex = fieldindex (TypeName, :name )
696
+ const TypeName_module_fieldindex = fieldindex (TypeName, :module )
697
+ const TypeName_wrapper_fieldindex = fieldindex (TypeName, :wrapper )
698
+
699
+ function const_datatype_getfield_tfunc (sv, fld)
700
+ if (fld == DataType_name_fieldindex ||
701
+ fld == DataType_parameters_fieldindex ||
702
+ fld == DataType_types_fieldindex ||
703
+ fld == DataType_super_fieldindex)
704
+ return abstract_eval_constant (getfield (sv, fld))
705
+ end
706
+ return nothing
707
+ end
708
+
695
709
# returns (type, isexact)
696
710
function getfield_tfunc (s00:: ANY , name)
697
711
if isa (s00, TypeVar)
@@ -719,12 +733,22 @@ function getfield_tfunc(s00::ANY, name)
719
733
elseif nv === :body || nv === 2
720
734
return Const (sv. body)
721
735
end
736
+ elseif isa (sv, DataType)
737
+ t = const_datatype_getfield_tfunc (sv, isa (nv, Symbol) ?
738
+ fieldindex (DataType, nv, false ) : nv)
739
+ t != = nothing && return t
740
+ elseif isa (sv, TypeName)
741
+ fld = isa (nv, Symbol) ? fieldindex (TypeName, nv, false ) : nv
742
+ if (fld == TypeName_name_fieldindex ||
743
+ fld == TypeName_module_fieldindex ||
744
+ fld == TypeName_wrapper_fieldindex)
745
+ return abstract_eval_constant (getfield (sv, fld))
746
+ end
722
747
end
723
748
if isa (sv, Module) && isa (nv, Symbol)
724
749
return abstract_eval_global (sv, nv)
725
750
end
726
- if (isa (sv, DataType) || isa (sv, SimpleVector) || isa (sv, TypeName)
727
- || isimmutable (sv)) && isdefined (sv, nv)
751
+ if (isa (sv, SimpleVector) || isimmutable (sv)) && isdefined (sv, nv)
728
752
return abstract_eval_constant (getfield (sv, nv))
729
753
end
730
754
end
@@ -784,12 +808,9 @@ function getfield_tfunc(s00::ANY, name)
784
808
else
785
809
sp = nothing
786
810
end
787
- if (sp != = nothing &&
788
- (fld == DataType_name_fieldindex ||
789
- fld == DataType_parameters_fieldindex ||
790
- fld == DataType_types_fieldindex ||
791
- fld == DataType_super_fieldindex))
792
- return Const (getfield (sp, fld))
811
+ if sp != = nothing
812
+ t = const_datatype_getfield_tfunc (sp, fld)
813
+ t != = nothing && return t
793
814
end
794
815
R = s. types[fld]
795
816
if isempty (s. parameters)
0 commit comments