def to_type(self, arg_type: Optional[object], resolver: Namespace) -> Optional[inmanta_type.Type]: """ Convert a string representation of a type to a type """ if arg_type is None: return None if not isinstance(arg_type, str): raise CompilerException( "bad annotation in plugin %s::%s, expected str but got %s (%s)" % (self.ns, self.__class__.__function_name__, type(arg_type), arg_type)) if arg_type == "any": return None if arg_type == "expression": return None # quickfix issue #1774 allowed_element_type: inmanta_type.Type = inmanta_type.Type() if arg_type == "list": return inmanta_type.TypedList(allowed_element_type) if arg_type == "dict": return inmanta_type.TypedDict(allowed_element_type) plugin_line: Range = Range(self.location.file, self.location.lnr, 1, self.location.lnr + 1, 1) locatable_type: LocatableString = LocatableString( arg_type, plugin_line, 0, None) # stack of transformations to be applied to the base inmanta_type.Type # transformations will be applied right to left transformation_stack: List[Callable[[inmanta_type.Type], inmanta_type.Type]] = [] if locatable_type.value.endswith("?"): locatable_type.value = locatable_type.value[0:-1] transformation_stack.append(inmanta_type.NullableType) if locatable_type.value.endswith("[]"): locatable_type.value = locatable_type.value[0:-2] transformation_stack.append(inmanta_type.TypedList) return reduce(lambda acc, transform: transform(acc), reversed(transformation_stack), resolver.get_type(locatable_type))
def get_basetype(self, namespace: Namespace) -> Type: """ Returns the base type for this declaration as a Type. """ return namespace.get_type(self.basetype)