Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions compiler/ast_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,7 @@
"source_section": "8.8",
"fields": [
{ "name": "name", "type": "Identifier", "optional": false },
{ "name": "receiver", "type": "Option<ParameterSpecification>", "optional": true },
{ "name": "formal_part", "type": "Option<FormalPart>", "optional": true },
{ "name": "span", "type": "Span", "optional": false }
]
Expand All @@ -1227,6 +1228,7 @@
"source_section": "8.8",
"fields": [
{ "name": "name", "type": "Identifier", "optional": false },
{ "name": "receiver", "type": "Option<ParameterSpecification>", "optional": true },
{ "name": "formal_part", "type": "Option<FormalPart>", "optional": true },
{ "name": "return_type", "type": "NodeRef<SubtypeIndication | ListTypeSpec | MapTypeSpec | GrowableArrayTypeSpec | TupleTypeSpec | OptionalTypeSpec>", "optional": false },
{ "name": "span", "type": "Span", "optional": false }
Expand Down
44 changes: 29 additions & 15 deletions compiler_impl/src/safe_frontend-check_emit.adb
Original file line number Diff line number Diff line change
Expand Up @@ -1962,29 +1962,35 @@ package body Safe_Frontend.Check_Emit is
end case;
end Statement_Node;

function Parameter_Spec_Node
(Param : CM.Parameter_Spec) return String
is
Names : String_Vectors.Vector;
begin
for Name of Param.Names loop
Names.Append (JS.Quote (Name));
end loop;
return
"{""node_type"":""ParameterSpecification"",""names"":"
& Json_List (Names)
& ",""is_aliased"":false,""mode"":"
& JS.Quote (FT.To_String (Param.Mode))
& ",""param_type"":"
& Object_Type_Node (Param.Param_Type)
& ",""default_expression"":null,""span"":"
& JS.Span_Object (Param.Span)
& "}";
end Parameter_Spec_Node;

function Formal_Part_Node
(Params : CM.Parameter_Vectors.Vector;
Span : FT.Source_Span) return String
is
Items : String_Vectors.Vector;
Names : String_Vectors.Vector;
begin
if not Params.Is_Empty then
for Param of Params loop
Names.Clear;
for Name of Param.Names loop
Names.Append (JS.Quote (Name));
end loop;
Items.Append
("{""node_type"":""ParameterSpecification"",""names"":"
& Json_List (Names)
& ",""is_aliased"":false,""mode"":"
& JS.Quote (FT.To_String (Param.Mode))
& ",""param_type"":"
& Object_Type_Node (Param.Param_Type)
& ",""default_expression"":null,""span"":"
& JS.Span_Object (Param.Span)
& "}");
Items.Append (Parameter_Spec_Node (Param));
end loop;
end if;
return
Expand Down Expand Up @@ -2056,6 +2062,10 @@ package body Safe_Frontend.Check_Emit is
& JS.Bool_Literal (Parsed.Is_Public)
& ",""spec"":{""node_type"":""FunctionSpecification"",""name"":"
& JS.Quote (Parsed.Spec.Name)
& ",""receiver"":"
& (if Parsed.Spec.Has_Receiver
then Parameter_Spec_Node (Parsed.Spec.Receiver)
else "null")
& ",""formal_part"":"
& (if Parsed.Spec.Params.Is_Empty then "null"
else Formal_Part_Node (Parsed.Spec.Params, Parsed.Spec.Span))
Expand All @@ -2079,6 +2089,10 @@ package body Safe_Frontend.Check_Emit is
& JS.Bool_Literal (Parsed.Is_Public)
& ",""spec"":{""node_type"":""ProcedureSpecification"",""name"":"
& JS.Quote (Parsed.Spec.Name)
& ",""receiver"":"
& (if Parsed.Spec.Has_Receiver
then Parameter_Spec_Node (Parsed.Spec.Receiver)
else "null")
& ",""formal_part"":"
& (if Parsed.Spec.Params.Is_Empty then "null"
else Formal_Part_Node (Parsed.Spec.Params, Parsed.Spec.Span))
Expand Down
2 changes: 2 additions & 0 deletions compiler_impl/src/safe_frontend-check_model.ads
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,8 @@ package Safe_Frontend.Check_Model is
type Subprogram_Spec is record
Kind : FT.UString := FT.To_UString ("");
Name : FT.UString := FT.To_UString ("");
Has_Receiver : Boolean := False;
Receiver : Parameter_Spec;
Params : Parameter_Vectors.Vector;
Has_Return_Type : Boolean := False;
Return_Type : Type_Spec;
Expand Down
16 changes: 16 additions & 0 deletions compiler_impl/src/safe_frontend-check_parse.adb
Original file line number Diff line number Diff line change
Expand Up @@ -1490,6 +1490,7 @@ package body Safe_Frontend.Check_Parse is
Start : constant FL.Token := Current (State);
Name : FL.Token;
Result : CM.Subprogram_Spec;
Receiver : CM.Parameter_Spec;
Close : FT.Source_Span := Start.Span;
begin
if Current_Lower (State) = "procedure" then
Expand All @@ -1507,6 +1508,21 @@ package body Safe_Frontend.Check_Parse is

Result.Kind := FT.To_UString ("function");
Advance (State);

if Match (State, "(") then
Receiver := Parse_Parameter (State);
if Natural (Receiver.Names.Length) /= 1 then
Raise_Diag
(CM.Source_Frontend_Error
(Path => Path_String (State),
Span => Receiver.Span,
Message => "method receiver must declare exactly one parameter name"));
end if;
Close := Expect (State, ")").Span;
Result.Has_Receiver := True;
Result.Receiver := Receiver;
end if;

Name := Expect_Identifier (State);
Result.Name := Name.Lexeme;

Expand Down
Loading
Loading