mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Fold deduced pattern parsing into the general pattern parsing. (#2649)
Depends on #2646 Right now, deduced parameter handling is very narrow to `self` support. This folds it into pattern handling, which should eventually be a superset of deduced parameter support, so this will avoid more duplication of logic. Note, this subtly adds handling of multiple deduced parameters, but not generic parameters (`:!`) so it's still not quite right.
This commit is contained in:
+7
-39
@@ -9,19 +9,10 @@
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'Foo'},
|
||||
// CHECK:STDOUT: {kind: 'InterfaceDefinitionStart', text: '{', subtree_size: 3},
|
||||
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'Add'},
|
||||
// CHECK:STDOUT: {kind: 'ParameterListStart', text: '('},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'b'},
|
||||
// CHECK:STDOUT: {kind: 'SelfType', text: 'Self'},
|
||||
// CHECK:STDOUT: {kind: 'PatternBinding', text: ':', subtree_size: 3},
|
||||
// CHECK:STDOUT: {kind: 'ParameterList', text: ')', subtree_size: 5},
|
||||
// CHECK:STDOUT: {kind: 'SelfType', text: 'Self'},
|
||||
// CHECK:STDOUT: {kind: 'ReturnType', text: '->', subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'FunctionDeclaration', text: ';', subtree_size: 10},
|
||||
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'Sub'},
|
||||
// CHECK:STDOUT: {kind: 'DeducedParameterListStart', text: '['},
|
||||
// CHECK:STDOUT: {kind: 'DeducedParameterList', text: ']', has_error: yes, subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'me'},
|
||||
// CHECK:STDOUT: {kind: 'DeducedParameterList', text: ']', has_error: yes, subtree_size: 3},
|
||||
// CHECK:STDOUT: {kind: 'ParameterListStart', text: '('},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'b'},
|
||||
// CHECK:STDOUT: {kind: 'SelfType', text: 'Self'},
|
||||
@@ -29,7 +20,7 @@
|
||||
// CHECK:STDOUT: {kind: 'ParameterList', text: ')', subtree_size: 5},
|
||||
// CHECK:STDOUT: {kind: 'SelfType', text: 'Self'},
|
||||
// CHECK:STDOUT: {kind: 'ReturnType', text: '->', subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'FunctionDeclaration', text: ';', subtree_size: 12},
|
||||
// CHECK:STDOUT: {kind: 'FunctionDeclaration', text: ';', subtree_size: 13},
|
||||
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'Mul'},
|
||||
// CHECK:STDOUT: {kind: 'DeducedParameterListStart', text: '['},
|
||||
@@ -42,37 +33,14 @@
|
||||
// CHECK:STDOUT: {kind: 'SelfType', text: 'Self'},
|
||||
// CHECK:STDOUT: {kind: 'ReturnType', text: '->', subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'FunctionDeclaration', text: ';', subtree_size: 12},
|
||||
// CHECK:STDOUT: {kind: 'FunctionIntroducer', text: 'fn'},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'Rem'},
|
||||
// CHECK:STDOUT: {kind: 'DeducedParameterListStart', text: '['},
|
||||
// CHECK:STDOUT: {kind: 'DeducedParameterList', text: ']', subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'ParameterListStart', text: '('},
|
||||
// CHECK:STDOUT: {kind: 'DeclaredName', text: 'b'},
|
||||
// CHECK:STDOUT: {kind: 'SelfType', text: 'Self'},
|
||||
// CHECK:STDOUT: {kind: 'PatternBinding', text: ':', subtree_size: 3},
|
||||
// CHECK:STDOUT: {kind: 'ParameterList', text: ')', subtree_size: 5},
|
||||
// CHECK:STDOUT: {kind: 'SelfType', text: 'Self'},
|
||||
// CHECK:STDOUT: {kind: 'ReturnType', text: '->', subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'FunctionDeclaration', text: ';', subtree_size: 12},
|
||||
// CHECK:STDOUT: {kind: 'InterfaceDefinition', text: '}', subtree_size: 50},
|
||||
// CHECK:STDOUT: {kind: 'InterfaceDefinition', text: '}', subtree_size: 29},
|
||||
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
||||
// CHECK:STDOUT: ]
|
||||
interface Foo {
|
||||
fn Add(b: Self) -> Self;
|
||||
|
||||
// CHECK:STDERR: {{.*}}/toolchain/parser/testdata/generics/interface/fail_self_param_syntax.carbon:[[@LINE+1]]:10: Deduced parameters must be of the form: `<name>: <Type>` or `addr <name>: <Type>`.
|
||||
interface Foo {
|
||||
// CHECK:STDERR: {{.*}}/toolchain/parser/testdata/generics/interface/fail_self_param_syntax.carbon:[[@LINE+1]]:13: Expected parameter declaration.
|
||||
fn Sub[me Self](b: Self) -> Self;
|
||||
|
||||
// CHECK:STDERR: {{.*}}/toolchain/parser/testdata/generics/interface/fail_self_param_syntax.carbon:[[@LINE+1]]:10: Deduced parameters must be of the form: `<name>: <Type>` or `addr <name>: <Type>`.
|
||||
// CHECK:STDERR: {{.*}}/toolchain/parser/testdata/generics/interface/fail_self_param_syntax.carbon:[[@LINE+1]]:10: Expected parameter declaration.
|
||||
fn Mul[Self](b: Self) -> Self;
|
||||
|
||||
// TODO: The recovery token is currently inserted after the `;`:
|
||||
// ```
|
||||
// fn Div[me: Self(b: Self) -> Self;]
|
||||
// ```
|
||||
// Fix and uncomment this to test error handling.
|
||||
// fn Div[me: Self(b: Self) -> Self;
|
||||
|
||||
// It is fine to have an empty deduced parameter list.
|
||||
fn Rem[](b: Self) -> Self;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user