mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-28 08:10:10 +01:00
interfaces, impls, and constrained generics (basics) (#1073)
* interfaces, impls, and constrained generics (basics) * separate type checking into declare vs. type check, removing redundancy * external impls * added impl scopes to handle generics calling generics * cleanup * more cleanup * Update executable_semantics/testdata/interface/external_impl_point_vector.carbon Co-authored-by: josh11b <josh11b@users.noreply.github.com> * Update executable_semantics/testdata/interface/generic_call_generic.carbon Co-authored-by: josh11b <josh11b@users.noreply.github.com> * Update executable_semantics/testdata/interface/tuple_vector_add_scale.carbon Co-authored-by: josh11b <josh11b@users.noreply.github.com> * Update executable_semantics/testdata/interface/vector_point_add_scale.carbon Co-authored-by: josh11b <josh11b@users.noreply.github.com> * change ImplementationDeclaration to ImplDeclaration * remove impl_type_value * split NamedEntity into two * changed GetName to be a free function * adding comments * more edits to respond to review * introduce ImplBinding, remove punning on GenericBinding * new test case and some minor edits * refactor GetMember and GetField to move impl logic to interpreter * remove commennt * change EntityView to ImplBinding in FieldAccess... * move ImplBinding * review response * added example to impl_scope.h * minor edits * Update executable_semantics/interpreter/field_path.h Co-authored-by: Geoff Romer <gromer@google.com> * Update executable_semantics/interpreter/value.cpp Co-authored-by: Geoff Romer <gromer@google.com> * Update executable_semantics/interpreter/interpreter.cpp Co-authored-by: Geoff Romer <gromer@google.com> * Update executable_semantics/ast/expression.h Co-authored-by: Geoff Romer <gromer@google.com> * Update executable_semantics/ast/expression.h Co-authored-by: Geoff Romer <gromer@google.com> * Update executable_semantics/ast/generic_binding.h Co-authored-by: Geoff Romer <gromer@google.com> * more edits from review * review response * Update executable_semantics/ast/static_scope.h Co-authored-by: Geoff Romer <gromer@google.com> * remove ImplType, renamed node_view to value_node Co-authored-by: josh11b <josh11b@users.noreply.github.com> Co-authored-by: Geoff Romer <gromer@google.com>
This commit is contained in:
committed by
GitHub
co-authored by
josh11b
Geoff Romer
parent
8f6e42d866
commit
7cce1bd124
@@ -42,6 +42,7 @@ AMPERSAND "&"
|
||||
AND "and"
|
||||
API "api"
|
||||
ARROW "->"
|
||||
AS "as"
|
||||
AUTO "auto"
|
||||
AWAIT "__await"
|
||||
BOOL "Bool"
|
||||
@@ -60,12 +61,14 @@ DOUBLE_ARROW "=>"
|
||||
ELSE "else"
|
||||
EQUAL "="
|
||||
EQUAL_EQUAL "=="
|
||||
EXTERNAL "external"
|
||||
FALSE "false"
|
||||
FN "fn"
|
||||
FN_TYPE "__Fn"
|
||||
IF "if"
|
||||
IMPL "impl"
|
||||
IMPORT "import"
|
||||
INTERFACE "interface"
|
||||
LEFT_CURLY_BRACE "{"
|
||||
LEFT_PARENTHESIS "("
|
||||
LEFT_SQUARE_BRACKET "["
|
||||
@@ -139,6 +142,7 @@ string_literal \"([^\\\"\n\v\f\r]|\\.)*\"
|
||||
{AND} { return SIMPLE_TOKEN(AND); }
|
||||
{API} { return SIMPLE_TOKEN(API); }
|
||||
{ARROW} { return SIMPLE_TOKEN(ARROW); }
|
||||
{AS} { return SIMPLE_TOKEN(AS); }
|
||||
{AUTO} { return SIMPLE_TOKEN(AUTO); }
|
||||
{AWAIT} { return SIMPLE_TOKEN(AWAIT); }
|
||||
{BOOL} { return SIMPLE_TOKEN(BOOL); }
|
||||
@@ -157,12 +161,14 @@ string_literal \"([^\\\"\n\v\f\r]|\\.)*\"
|
||||
{ELSE} { return SIMPLE_TOKEN(ELSE); }
|
||||
{EQUAL_EQUAL} { return SIMPLE_TOKEN(EQUAL_EQUAL); }
|
||||
{EQUAL} { return SIMPLE_TOKEN(EQUAL); }
|
||||
{EXTERNAL} { return SIMPLE_TOKEN(EXTERNAL); }
|
||||
{FALSE} { return SIMPLE_TOKEN(FALSE); }
|
||||
{FN_TYPE} { return SIMPLE_TOKEN(FN_TYPE); }
|
||||
{FN} { return SIMPLE_TOKEN(FN); }
|
||||
{IF} { return SIMPLE_TOKEN(IF); }
|
||||
{IMPL} { return SIMPLE_TOKEN(IMPL); }
|
||||
{IMPORT} { return SIMPLE_TOKEN(IMPORT); }
|
||||
{INTERFACE} { return SIMPLE_TOKEN(INTERFACE); }
|
||||
{LEFT_CURLY_BRACE} { return SIMPLE_TOKEN(LEFT_CURLY_BRACE); }
|
||||
{LEFT_PARENTHESIS} { return SIMPLE_TOKEN(LEFT_PARENTHESIS); }
|
||||
{LEFT_SQUARE_BRACKET} { return SIMPLE_TOKEN(LEFT_SQUARE_BRACKET); }
|
||||
|
||||
@@ -93,6 +93,7 @@
|
||||
%token <std::string> sized_type_literal
|
||||
%token <std::string> string_literal
|
||||
%type <std::string> designator
|
||||
%type <ImplKind> impl_kind
|
||||
%type <std::pair<LibraryName, bool>> package_directive
|
||||
%type <LibraryName> import_directive
|
||||
%type <std::vector<LibraryName>> import_directives
|
||||
@@ -144,6 +145,7 @@
|
||||
AND
|
||||
API
|
||||
ARROW
|
||||
AS
|
||||
AUTO
|
||||
AWAIT
|
||||
BOOL
|
||||
@@ -162,12 +164,14 @@
|
||||
ELSE
|
||||
EQUAL
|
||||
EQUAL_EQUAL
|
||||
EXTERNAL
|
||||
FALSE
|
||||
FN
|
||||
FN_TYPE
|
||||
IF
|
||||
IMPL
|
||||
IMPORT
|
||||
INTERFACE
|
||||
LEFT_CURLY_BRACE
|
||||
LEFT_PARENTHESIS
|
||||
LEFT_SQUARE_BRACKET
|
||||
@@ -742,6 +746,21 @@ declaration:
|
||||
}
|
||||
| VAR variable_declaration EQUAL expression SEMICOLON
|
||||
{ $$ = arena->New<VariableDeclaration>(context.source_loc(), $2, $4); }
|
||||
| INTERFACE identifier LEFT_CURLY_BRACE declaration_list RIGHT_CURLY_BRACE
|
||||
{
|
||||
auto ty_ty = arena -> New<TypeTypeLiteral>(context.source_loc());
|
||||
auto self =
|
||||
arena -> New<GenericBinding>(context.source_loc(), "Self", ty_ty);
|
||||
$$ = arena->New<InterfaceDeclaration>(context.source_loc(), $2, self, $4);
|
||||
}
|
||||
| impl_kind IMPL expression AS expression LEFT_CURLY_BRACE declaration_list RIGHT_CURLY_BRACE
|
||||
{ $$ = arena->New<ImplDeclaration>(context.source_loc(), $1, $3, $5, $7); }
|
||||
;
|
||||
impl_kind:
|
||||
// Internal
|
||||
{ $$ = Carbon::ImplKind::InternalImpl; }
|
||||
| EXTERNAL
|
||||
{ $$ = Carbon::ImplKind::ExternalImpl; }
|
||||
;
|
||||
declaration_list:
|
||||
// Empty
|
||||
|
||||
Reference in New Issue
Block a user