Skip to content

Commit

Permalink
feat: add kwargs to member function
Browse files Browse the repository at this point in the history
  • Loading branch information
tserg committed Jul 3, 2022
1 parent a6c8e5f commit e9e2458
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
16 changes: 14 additions & 2 deletions vyper/semantics/types/function.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
NamespaceCollision,
StateAccessViolation,
StructureException,
TypeMismatch,
)
from vyper.semantics.namespace import get_namespace
from vyper.semantics.types.bases import BaseTypeDefinition, DataLocation, StorageSlot
Expand Down Expand Up @@ -565,25 +566,36 @@ def __init__(
arg_types: List[BaseTypeDefinition],
return_type: Optional[BaseTypeDefinition],
is_modifying: bool,
kwargs: Dict[str, KwargSettings] = {},
) -> None:
super().__init__(DataLocation.UNSET)
self.underlying_type = underlying_type
self.name = name
self.arg_types = arg_types
self.return_type = return_type
self.is_modifying = is_modifying
self.kwargs = kwargs

def __repr__(self):
return f"{self.underlying_type._id} member function '{self.name}'"

def fetch_call_return(self, node: vy_ast.Call) -> Optional[BaseTypeDefinition]:
validate_call_args(node, len(self.arg_types))
def _validate_arg_types(self, node: vy_ast.Call):
num_args = len(self.arg_types)
validate_call_args(node, num_args, list(self.kwargs))

assert len(node.args) == len(self.arg_types) # validate_call_args postcondition
for arg, expected_type in zip(node.args, self.arg_types):
# CMC 2022-04-01 this should probably be in the validation module
validate_expected_type(arg, expected_type)

for kwarg in node.keywords:
kwarg_settings = self.kwargs[kwarg.arg]
if kwarg_settings.require_literal and not isinstance(kwarg.value, vy_ast.Constant):
raise TypeMismatch("Value for kwarg must be a literal", kwarg.value)
validate_expected_type(kwarg.value, kwarg_settings.typ)

def fetch_call_return(self, node: vy_ast.Call) -> Optional[BaseTypeDefinition]:
self._validate_arg_types(node)
return self.return_type


Expand Down
13 changes: 12 additions & 1 deletion vyper/semantics/types/indexable/sequence.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,11 +160,22 @@ def __init__(
# Adding members here as otherwise MemberFunctionDefinition is not yet defined
# if added as _type_members
from vyper.semantics.types.function import MemberFunctionDefinition
from vyper.semantics.types.utils import KwargSettings

self.add_member(
"append", MemberFunctionDefinition(self, "append", [self.value_type], None, True)
)
self.add_member("pop", MemberFunctionDefinition(self, "pop", [], self.value_type, True))
self.add_member(
"pop",
MemberFunctionDefinition(
self,
"pop",
[],
self.value_type,
True,
kwargs={"ix": KwargSettings(Uint256Definition(), -1, require_literal=True)},
),
)

def __repr__(self):
return f"DynArray[{self.value_type}, {self.length}]"
Expand Down

0 comments on commit e9e2458

Please sign in to comment.