def string(self, items, meta) -> E.Base: parts = [] for item in items: if isinstance(item, E.Base): parts.append(E.Placeholder(item.pos, {}, item)) else: parts.append(item.value) assert len(parts) >= 2 assert parts[0] in ['"', "'"] assert parts[-1] in ['"', "'"] return E.String(sp(self.filename, meta), parts)
def placeholder(self, items, meta): options = dict(items[:-1]) if len(options.items()) < len(items) - 1: raise Err.MultipleDefinitions( sp(self.filename, meta), "duplicate options in expression placeholder") return E.Placeholder(sp(self.filename, meta), options, items[-1])
def command(self, items, meta): parts = [] for item in items: if isinstance(item, E.Placeholder): parts.append(item) else: parts.append(item.value) return {"command": E.String(sp(self.filename, meta), parts)}
def command(self, items, meta): parts = [] for item in items: if isinstance(item, E.Placeholder): parts.append(item) elif item.type.endswith("_FRAGMENT"): parts.append(item.value[:-2]) else: parts.append(item.value) return {"command": E.String(sp(self.filename, meta), parts)}
def string(self, items, meta) -> E.Base: parts = [] for item in items: if isinstance(item, E.Base): parts.append(E.Placeholder(item.pos, {}, item)) elif item.type.endswith("_FRAGMENT"): # for an interpolation fragment, item.value will end with "${" # so we strip that off. it'd be nice to make the grammar filter # that out since it does later filter out the "}"... parts.append(item.value[:-2]) else: parts.append(item.value) # fix up a parsing quirk -- the opening quote got its own item but the # closing quote didn't assert len(parts) >= 2 assert parts[0] in ['"', "'"] assert parts[-1][-1] in ['"', "'"] # pyre-fixme if len(parts[-1]) > 1: parts.append(parts[-1][-1]) # pyre-fixme parts[-2] = parts[-2][:-1] # pyre-fixme return E.String(sp(self.filename, meta), parts)
def fn(self, items, meta, op=op): assert len(items) == 2 return E.Apply(sp(self.filename, meta), "_" + op, items)
def left_name(self, items, meta) -> E.Base: assert len(items) == 1 and isinstance(items[0], str) return E.Get(sp(self.filename, meta), E._LeftName(sp(self.filename, meta), items[0]), None)
def get_name(self, items, meta) -> E.Base: assert len(items) == 2 and isinstance(items[0], E.Base) and isinstance( items[1], str) return E.Get(sp(self.filename, meta), items[0], items[1])
def obj(self, items, meta) -> E.Base: return E.Struct(sp(self.filename, meta), items)
def ifthenelse(self, items, meta) -> E.Base: assert len(items) == 3 return E.IfThenElse(sp(self.filename, meta), *items)
def boolean_false(self, items, meta) -> E.Base: return E.Boolean(sp(self.filename, meta), False)
def map(self, items, meta) -> E.Base: return E.Map(sp(self.filename, meta), items)
def negate(self, items, meta) -> E.Base: return E.Apply(sp(self.filename, meta), "_negate", items)
def at(self, items, meta) -> E.Base: return E.Apply(sp(self.filename, meta), "_at", items)
def array(self, items, meta) -> E.Base: return E.Array(sp(self.filename, meta), items)
def apply(self, items, meta) -> E.Base: assert len(items) >= 1 return E.Apply(sp(self.filename, meta), items[0], items[1:])
def ident(self, items, meta) -> E.Base: return E.Ident(sp(self.filename, meta), [item.value for item in items])
def float(self, items, meta) -> E.Base: assert len(items) == 1 return E.Float(sp(self.filename, meta), to_float(items[0]))
def int(self, items, meta) -> E.Base: assert len(items) == 1 return E.Int(sp(self.filename, meta), to_int(items[0]))
def get_right(self, items, meta) -> E.Base: return E.Apply(sp(self.filename, meta), "_get_right", items)
def pair(self, items, meta) -> E.Base: assert len(items) == 2 return E.Pair(sp(self.filename, meta), items[0], items[1])
def apply(self, items, meta) -> E.Base: assert len(items) >= 1 assert not items[0].startswith("_") # TODO enforce in grammar return E.Apply(sp(self.filename, meta), items[0], items[1:])
def boolean_true(self, items, meta) -> E.Base: return E.Boolean(sp(self.filename, meta), True)