Commit 1ae591fa authored by Robert Bradshaw's avatar Robert Bradshaw

call struct constructor

parent 9534cbd1
...@@ -1863,6 +1863,21 @@ class CallNode(ExprNode): ...@@ -1863,6 +1863,21 @@ class CallNode(ExprNode):
if env.nogil: if env.nogil:
error(self.pos, "Calling gil-requiring function without gil") error(self.pos, "Calling gil-requiring function without gil")
def analyse_as_type_constructor(self, env):
type = self.function.analyse_as_type(env)
if type and type.is_struct_or_union:
args, kwds = self.explicit_args_kwds()
items = []
for arg, member in zip(args, type.scope.var_entries):
items.append(DictItemNode(pos=arg.pos, key=NameNode(pos=arg.pos, name=member.name), value=arg))
if kwds:
items += kwds.key_value_pairs
self.key_value_pairs = items
self.__class__ = DictNode
self.analyse_types(env)
self.coerce_to(type, env)
return True
class SimpleCallNode(CallNode): class SimpleCallNode(CallNode):
# Function call without keyword, * or ** args. # Function call without keyword, * or ** args.
...@@ -1907,6 +1922,8 @@ class SimpleCallNode(CallNode): ...@@ -1907,6 +1922,8 @@ class SimpleCallNode(CallNode):
return self.args, None return self.args, None
def analyse_types(self, env): def analyse_types(self, env):
if self.analyse_as_type_constructor(env):
return
function = self.function function = self.function
function.is_called = 1 function.is_called = 1
self.function.analyse_types(env) self.function.analyse_types(env)
...@@ -2142,6 +2159,8 @@ class GeneralCallNode(CallNode): ...@@ -2142,6 +2159,8 @@ class GeneralCallNode(CallNode):
return self.positional_args.args, self.keyword_args return self.positional_args.args, self.keyword_args
def analyse_types(self, env): def analyse_types(self, env):
if self.analyse_as_type_constructor(env):
return
self.function.analyse_types(env) self.function.analyse_types(env)
self.positional_args.analyse_types(env) self.positional_args.analyse_types(env)
if self.keyword_args: if self.keyword_args:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment