diff options
Diffstat (limited to 'lib/stdlib/src/erl_parse.yrl')
| -rw-r--r-- | lib/stdlib/src/erl_parse.yrl | 20 | 
1 files changed, 16 insertions, 4 deletions
| diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl index 1dc5fc52a7..828870d492 100644 --- a/lib/stdlib/src/erl_parse.yrl +++ b/lib/stdlib/src/erl_parse.yrl @@ -146,8 +146,7 @@ type -> '(' top_type ')'                  : {paren_type, ?line('$2'), ['$2']}.  type -> var                               : '$1'.  type -> atom                              : '$1'.  type -> atom '(' ')'                      : build_gen_type('$1'). -type -> atom '(' top_types ')'            : {type, ?line('$1'), -                                             normalise('$1'), '$3'}. +type -> atom '(' top_types ')'            : build_type('$1', '$3').  type -> atom ':' atom '(' ')'             : {remote_type, ?line('$1'),                                               ['$1', '$3', []]}.  type -> atom ':' atom '(' top_types ')'   : {remote_type, ?line('$1'), @@ -181,7 +180,7 @@ fun_type -> '(' top_types ')' '->' top_type  map_pair_types -> map_pair_type                    : ['$1'].  map_pair_types -> map_pair_type ',' map_pair_types : ['$1'|'$3']. -map_pair_type  -> top_type '=>' top_type           : {type, ?line('$2'), map_field_assoc,'$1','$3'}. +map_pair_type  -> top_type '=>' top_type           : {type, ?line('$2'), map_field_assoc,['$1','$3']}.  field_types -> field_type                 : ['$1'].  field_types -> field_type ',' field_types : ['$1'|'$3']. @@ -665,6 +664,8 @@ find_arity_from_specs([Spec|_]) ->      {type, _, 'fun', [{type, _, product, Args},_]} = Fun,      length(Args). +build_def({var, L, '_'}, _Types) -> +    ret_err(L, "bad type variable");  build_def(LHS, Types) ->      IsSubType = {atom, ?line(LHS), is_subtype},      {type, ?line(LHS), constraint, [IsSubType, [LHS, Types]]}. @@ -684,7 +685,8 @@ build_gen_type({atom, La, tuple}) ->  build_gen_type({atom, La, map}) ->      {type, La, map, any};  build_gen_type({atom, La, Name}) -> -    {type, La, Name, []}. +    Tag = type_tag(Name, 0), +    {Tag, La, Name, []}.  build_bin_type([{var, _, '_'}|Left], Int) ->      build_bin_type(Left, Int); @@ -693,6 +695,16 @@ build_bin_type([], Int) ->  build_bin_type([{var, La, _}|_], _) ->      ret_err(La, "Bad binary type"). +build_type({atom, L, Name}, Types) -> +    Tag = type_tag(Name, length(Types)), +    {Tag, L, Name, Types}. + +type_tag(TypeName, NumberOfTypeVariables) -> +    case erl_internal:is_type(TypeName, NumberOfTypeVariables) of +        true -> type; +        false -> user_type +    end. +  %% build_attribute(AttrName, AttrValue) ->  %%	{attribute,Line,module,Module}  %%	{attribute,Line,export,Exports} | 
