mirror of
https://github.com/exaloop/codon.git
synced 2025-06-03 15:03:52 +08:00
Add new attributes
This commit is contained in:
parent
e7851d8983
commit
8dd7d2e0ea
@ -1,5 +1,8 @@
|
|||||||
#include "value.h"
|
#include "attribute.h"
|
||||||
|
|
||||||
|
#include "codon/sir/func.h"
|
||||||
|
#include "codon/sir/util/cloning.h"
|
||||||
|
#include "codon/sir/value.h"
|
||||||
#include "codon/util/fmt/ostream.h"
|
#include "codon/util/fmt/ostream.h"
|
||||||
|
|
||||||
namespace codon {
|
namespace codon {
|
||||||
@ -36,5 +39,111 @@ std::ostream &MemberAttribute::doFormat(std::ostream &os) const {
|
|||||||
|
|
||||||
const std::string SrcInfoAttribute::AttributeName = "srcInfoAttribute";
|
const std::string SrcInfoAttribute::AttributeName = "srcInfoAttribute";
|
||||||
|
|
||||||
|
const std::string ListLiteralAttribute::AttributeName = "listLiteralAttribute";
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> ListLiteralAttribute::clone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<Value *> elementsCloned;
|
||||||
|
for (auto *val : elements)
|
||||||
|
elementsCloned.push_back(cv.clone(val));
|
||||||
|
return std::make_unique<ListLiteralAttribute>(elementsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute>
|
||||||
|
ListLiteralAttribute::forceClone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<Value *> elementsCloned;
|
||||||
|
for (auto *val : elements)
|
||||||
|
elementsCloned.push_back(cv.forceClone(val));
|
||||||
|
return std::make_unique<ListLiteralAttribute>(elementsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream &ListLiteralAttribute::doFormat(std::ostream &os) const {
|
||||||
|
std::vector<std::string> strings;
|
||||||
|
for (auto *val : elements)
|
||||||
|
strings.push_back(fmt::format(FMT_STRING("{}"), *val));
|
||||||
|
fmt::print(os, FMT_STRING("[{}]"), fmt::join(strings.begin(), strings.end(), ","));
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string SetLiteralAttribute::AttributeName = "setLiteralAttribute";
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> SetLiteralAttribute::clone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<Value *> elementsCloned;
|
||||||
|
for (auto *val : elements)
|
||||||
|
elementsCloned.push_back(cv.clone(val));
|
||||||
|
return std::make_unique<SetLiteralAttribute>(elementsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute>
|
||||||
|
SetLiteralAttribute::forceClone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<Value *> elementsCloned;
|
||||||
|
for (auto *val : elements)
|
||||||
|
elementsCloned.push_back(cv.forceClone(val));
|
||||||
|
return std::make_unique<SetLiteralAttribute>(elementsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream &SetLiteralAttribute::doFormat(std::ostream &os) const {
|
||||||
|
std::vector<std::string> strings;
|
||||||
|
for (auto *val : elements)
|
||||||
|
strings.push_back(fmt::format(FMT_STRING("{}"), *val));
|
||||||
|
fmt::print(os, FMT_STRING("set([{}])"),
|
||||||
|
fmt::join(strings.begin(), strings.end(), ","));
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string DictLiteralAttribute::AttributeName = "dictLiteralAttribute";
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> DictLiteralAttribute::clone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<DictLiteralAttribute::KeyValuePair> elementsCloned;
|
||||||
|
for (auto &val : elements)
|
||||||
|
elementsCloned.push_back({cv.clone(val.key), cv.clone(val.value)});
|
||||||
|
return std::make_unique<DictLiteralAttribute>(elementsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute>
|
||||||
|
DictLiteralAttribute::forceClone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<DictLiteralAttribute::KeyValuePair> elementsCloned;
|
||||||
|
for (auto &val : elements)
|
||||||
|
elementsCloned.push_back({cv.forceClone(val.key), cv.forceClone(val.value)});
|
||||||
|
return std::make_unique<DictLiteralAttribute>(elementsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream &DictLiteralAttribute::doFormat(std::ostream &os) const {
|
||||||
|
std::vector<std::string> strings;
|
||||||
|
for (auto &val : elements)
|
||||||
|
strings.push_back(fmt::format(FMT_STRING("{}:{}"), *val.key, *val.value));
|
||||||
|
fmt::print(os, FMT_STRING("dict([{}])"),
|
||||||
|
fmt::join(strings.begin(), strings.end(), ","));
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string PartialFunctionAttribute::AttributeName = "partialFunctionAttribute";
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute>
|
||||||
|
PartialFunctionAttribute::clone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<Value *> argsCloned;
|
||||||
|
for (auto *val : args)
|
||||||
|
argsCloned.push_back(cv.clone(val));
|
||||||
|
return std::make_unique<PartialFunctionAttribute>(cast<Func>(cv.clone(func)),
|
||||||
|
argsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute>
|
||||||
|
PartialFunctionAttribute::forceClone(util::CloneVisitor &cv) const {
|
||||||
|
std::vector<Value *> argsCloned;
|
||||||
|
for (auto *val : args)
|
||||||
|
argsCloned.push_back(cv.forceClone(val));
|
||||||
|
return std::make_unique<PartialFunctionAttribute>(cast<Func>(cv.forceClone(func)),
|
||||||
|
argsCloned);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostream &PartialFunctionAttribute::doFormat(std::ostream &os) const {
|
||||||
|
std::vector<std::string> strings;
|
||||||
|
for (auto *val : args)
|
||||||
|
strings.push_back(val ? fmt::format(FMT_STRING("{}"), *val) : "...");
|
||||||
|
fmt::print(os, FMT_STRING("{}({})"), func->getName(),
|
||||||
|
fmt::join(strings.begin(), strings.end(), ","));
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ir
|
} // namespace ir
|
||||||
} // namespace codon
|
} // namespace codon
|
||||||
|
@ -14,6 +14,13 @@
|
|||||||
namespace codon {
|
namespace codon {
|
||||||
namespace ir {
|
namespace ir {
|
||||||
|
|
||||||
|
class Func;
|
||||||
|
class Value;
|
||||||
|
|
||||||
|
namespace util {
|
||||||
|
class CloneVisitor;
|
||||||
|
}
|
||||||
|
|
||||||
/// Base for SIR attributes.
|
/// Base for SIR attributes.
|
||||||
struct Attribute {
|
struct Attribute {
|
||||||
virtual ~Attribute() noexcept = default;
|
virtual ~Attribute() noexcept = default;
|
||||||
@ -26,14 +33,15 @@ struct Attribute {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// @return a clone of the attribute
|
/// @return a clone of the attribute
|
||||||
std::unique_ptr<Attribute> clone() const {
|
virtual std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const = 0;
|
||||||
return std::unique_ptr<Attribute>(doClone());
|
|
||||||
|
/// @return a clone of the attribute
|
||||||
|
virtual std::unique_ptr<Attribute> forceClone(util::CloneVisitor &cv) const {
|
||||||
|
return clone(cv);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::ostream &doFormat(std::ostream &os) const = 0;
|
virtual std::ostream &doFormat(std::ostream &os) const = 0;
|
||||||
|
|
||||||
virtual Attribute *doClone() const = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Attribute containing SrcInfo
|
/// Attribute containing SrcInfo
|
||||||
@ -48,10 +56,12 @@ struct SrcInfoAttribute : public Attribute {
|
|||||||
/// @param info the source info
|
/// @param info the source info
|
||||||
explicit SrcInfoAttribute(codon::SrcInfo info) : info(std::move(info)) {}
|
explicit SrcInfoAttribute(codon::SrcInfo info) : info(std::move(info)) {}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const override {
|
||||||
|
return std::make_unique<SrcInfoAttribute>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::ostream &doFormat(std::ostream &os) const override { return os << info; }
|
std::ostream &doFormat(std::ostream &os) const override { return os << info; }
|
||||||
|
|
||||||
Attribute *doClone() const override { return new SrcInfoAttribute(*this); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Attribute containing function information
|
/// Attribute containing function information
|
||||||
@ -76,10 +86,12 @@ struct KeyValueAttribute : public Attribute {
|
|||||||
/// string if none
|
/// string if none
|
||||||
std::string get(const std::string &key) const;
|
std::string get(const std::string &key) const;
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const override {
|
||||||
|
return std::make_unique<KeyValueAttribute>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::ostream &doFormat(std::ostream &os) const override;
|
std::ostream &doFormat(std::ostream &os) const override;
|
||||||
|
|
||||||
Attribute *doClone() const override { return new KeyValueAttribute(*this); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Attribute containing type member information
|
/// Attribute containing type member information
|
||||||
@ -95,10 +107,89 @@ struct MemberAttribute : public Attribute {
|
|||||||
explicit MemberAttribute(std::map<std::string, SrcInfo> memberSrcInfo)
|
explicit MemberAttribute(std::map<std::string, SrcInfo> memberSrcInfo)
|
||||||
: memberSrcInfo(std::move(memberSrcInfo)) {}
|
: memberSrcInfo(std::move(memberSrcInfo)) {}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const override {
|
||||||
|
return std::make_unique<MemberAttribute>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::ostream &doFormat(std::ostream &os) const override;
|
std::ostream &doFormat(std::ostream &os) const override;
|
||||||
|
};
|
||||||
|
|
||||||
Attribute *doClone() const override { return new MemberAttribute(*this); }
|
/// Attribute attached to IR structures corresponding to list literals
|
||||||
|
struct ListLiteralAttribute : public Attribute {
|
||||||
|
static const std::string AttributeName;
|
||||||
|
|
||||||
|
/// values contained in list literal
|
||||||
|
std::vector<Value *> elements;
|
||||||
|
|
||||||
|
explicit ListLiteralAttribute(std::vector<Value *> elements)
|
||||||
|
: elements(std::move(elements)) {}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const override;
|
||||||
|
std::unique_ptr<Attribute> forceClone(util::CloneVisitor &cv) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::ostream &doFormat(std::ostream &os) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Attribute attached to IR structures corresponding to set literals
|
||||||
|
struct SetLiteralAttribute : public Attribute {
|
||||||
|
static const std::string AttributeName;
|
||||||
|
|
||||||
|
/// values contained in set literal
|
||||||
|
std::vector<Value *> elements;
|
||||||
|
|
||||||
|
explicit SetLiteralAttribute(std::vector<Value *> elements)
|
||||||
|
: elements(std::move(elements)) {}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const override;
|
||||||
|
std::unique_ptr<Attribute> forceClone(util::CloneVisitor &cv) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::ostream &doFormat(std::ostream &os) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Attribute attached to IR structures corresponding to dict literals
|
||||||
|
struct DictLiteralAttribute : public Attribute {
|
||||||
|
struct KeyValuePair {
|
||||||
|
Value *key;
|
||||||
|
Value *value;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const std::string AttributeName;
|
||||||
|
|
||||||
|
/// keys and values contained in dict literal
|
||||||
|
std::vector<KeyValuePair> elements;
|
||||||
|
|
||||||
|
explicit DictLiteralAttribute(std::vector<KeyValuePair> elements)
|
||||||
|
: elements(std::move(elements)) {}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const override;
|
||||||
|
std::unique_ptr<Attribute> forceClone(util::CloneVisitor &cv) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::ostream &doFormat(std::ostream &os) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Attribute attached to IR structures corresponding to partial functions
|
||||||
|
struct PartialFunctionAttribute : public Attribute {
|
||||||
|
static const std::string AttributeName;
|
||||||
|
|
||||||
|
/// function being called
|
||||||
|
Func *func;
|
||||||
|
|
||||||
|
/// partial arguments, or null if none
|
||||||
|
/// e.g. "f(a, ..., b)" has elements [a, null, b]
|
||||||
|
std::vector<Value *> args;
|
||||||
|
|
||||||
|
PartialFunctionAttribute(Func *func, std::vector<Value *> args)
|
||||||
|
: func(func), args(std::move(args)) {}
|
||||||
|
|
||||||
|
std::unique_ptr<Attribute> clone(util::CloneVisitor &cv) const override;
|
||||||
|
std::unique_ptr<Attribute> forceClone(util::CloneVisitor &cv) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::ostream &doFormat(std::ostream &os) const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ir
|
} // namespace ir
|
||||||
|
@ -82,7 +82,7 @@ public:
|
|||||||
for (auto it = other->attributes_begin(); it != other->attributes_end(); ++it) {
|
for (auto it = other->attributes_begin(); it != other->attributes_end(); ++it) {
|
||||||
const auto *attr = other->getAttribute(*it);
|
const auto *attr = other->getAttribute(*it);
|
||||||
if (attr->needsClone()) {
|
if (attr->needsClone()) {
|
||||||
ctx[id]->setAttribute(attr->clone(), *it);
|
ctx[id]->setAttribute(attr->clone(*this), *it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,7 +125,7 @@ public:
|
|||||||
for (auto it = other->attributes_begin(); it != other->attributes_end(); ++it) {
|
for (auto it = other->attributes_begin(); it != other->attributes_end(); ++it) {
|
||||||
const auto *attr = other->getAttribute(*it);
|
const auto *attr = other->getAttribute(*it);
|
||||||
if (attr->needsClone()) {
|
if (attr->needsClone()) {
|
||||||
ctx[id]->setAttribute(attr->clone(), *it);
|
ctx[id]->setAttribute(attr->forceClone(*this), *it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user