Add static types to AST. (#879)

This commit is contained in:
Geoff Romer
2021-10-13 15:42:04 -07:00
committed by GitHub
parent bc5a42211b
commit 652bee6d99
5 changed files with 223 additions and 110 deletions
+16
View File
@@ -19,6 +19,8 @@
namespace Carbon {
class Value;
class Expression {
public:
enum class Kind {
@@ -51,6 +53,18 @@ class Expression {
auto source_loc() const -> SourceLocation { return source_loc_; }
// The static type of this expression. Cannot be called before typechecking.
auto static_type() const -> Nonnull<const Value*> { return *static_type_; }
// Sets the static type of this expression. Can only be called once, during
// typechecking.
void set_static_type(Nonnull<const Value*> type) { static_type_ = type; }
// Returns whether the static type has been set. Should only be called
// during typechecking: before typechecking it's guaranteed to be false,
// and after typechecking it's guaranteed to be true.
auto has_static_type() const -> bool { return static_type_.has_value(); }
protected:
// Constructs an Expression representing syntax at the given line number.
// `kind` must be the enumerator corresponding to the most-derived type being
@@ -61,6 +75,8 @@ class Expression {
private:
const Kind kind_;
SourceLocation source_loc_;
std::optional<Nonnull<const Value*>> static_type_;
};
// Converts paren_contents to an Expression, interpreting the parentheses as
@@ -15,6 +15,8 @@
namespace Carbon {
class Value;
// TODO: expand the kinds of things that can be deduced parameters.
// For now, only generic parameters are supported.
struct GenericBinding {
@@ -58,6 +60,18 @@ class FunctionDefinition {
}
auto body() -> std::optional<Nonnull<Statement*>> { return body_; }
// The static type of this function. Cannot be called before typechecking.
auto static_type() const -> Nonnull<const Value*> { return *static_type_; }
// Sets the static type of this expression. Can only be called once, during
// typechecking.
void set_static_type(Nonnull<const Value*> type) { static_type_ = type; }
// Returns whether the static type has been set. Should only be called
// during typechecking: before typechecking it's guaranteed to be false,
// and after typechecking it's guaranteed to be true.
auto has_static_type() const -> bool { return static_type_.has_value(); }
private:
SourceLocation source_loc_;
std::string name_;
@@ -66,6 +80,8 @@ class FunctionDefinition {
Nonnull<Pattern*> return_type_;
bool is_omitted_return_type_;
std::optional<Nonnull<Statement*>> body_;
std::optional<Nonnull<const Value*>> static_type_;
};
} // namespace Carbon
+16
View File
@@ -16,6 +16,8 @@
namespace Carbon {
class Value;
// Abstract base class of all AST nodes representing patterns.
//
// Pattern and its derived classes support LLVM-style RTTI, including
@@ -46,6 +48,18 @@ class Pattern {
auto source_loc() const -> SourceLocation { return source_loc_; }
// The static type of this pattern. Cannot be called before typechecking.
auto static_type() const -> Nonnull<const Value*> { return *static_type_; }
// Sets the static type of this expression. Can only be called once, during
// typechecking.
void set_static_type(Nonnull<const Value*> type) { static_type_ = type; }
// Returns whether the static type has been set. Should only be called
// during typechecking: before typechecking it's guaranteed to be false,
// and after typechecking it's guaranteed to be true.
auto has_static_type() const -> bool { return static_type_.has_value(); }
protected:
// Constructs a Pattern representing syntax at the given line number.
// `kind` must be the enumerator corresponding to the most-derived type being
@@ -56,6 +70,8 @@ class Pattern {
private:
const Kind kind_;
SourceLocation source_loc_;
std::optional<Nonnull<const Value*>> static_type_;
};
// A pattern consisting of the `auto` keyword.