diff --git a/skiplang/cli/src/usage.sk b/skiplang/cli/src/usage.sk index d43e46991..cd971c1c0 100644 --- a/skiplang/cli/src/usage.sk +++ b/skiplang/cli/src/usage.sk @@ -85,11 +85,11 @@ private fun usageOptions(options: Sequence): String { | _ -> ` --${arg.name}` }; optFlags = arg match { - | Cli.ValuedArg{_value_name} -> + | Cli.ValuedArg{_value_name => value_name} -> if (arg._repeatable) { - `${baseOptFlags} [<${_value_name}>]` + `${baseOptFlags} [<${value_name}>]` } else { - `${baseOptFlags} <${_value_name}>` + `${baseOptFlags} <${value_name}>` } | _ if (arg._repeatable) -> `${baseOptFlags}...` | _ -> baseOptFlags @@ -144,8 +144,11 @@ fun usage( values = cmd._args.filterMap( (arg -> (arg match { - | ValuedArg{_value_name, _value_about} if (_value_about.size() > 0) -> - Some((_value_name, _value_about)) + | ValuedArg{ + _value_name => value_name, + _value_about => value_about, + } if (value_about.size() > 0) -> + Some((value_name, value_about)) | _ -> None() })), ); diff --git a/skiplang/compiler/src/convertTree.sk b/skiplang/compiler/src/convertTree.sk index 68f26fa4e..76bf17d17 100644 --- a/skiplang/compiler/src/convertTree.sk +++ b/skiplang/compiler/src/convertTree.sk @@ -1383,13 +1383,13 @@ class Converter{file: FileCache.InputSource} { range, SkipAst.Pat_type( SkipAst.Tid_object(SkipAst.Tclass((range, "Success"))), - Some(Positional(Array[(range, SkipAst.Pat_var((range, "__x")))])), + Some(Positional(Array[(range, SkipAst.Pat_var((range, "!x")))])), SkipAst.Complete(), ), ), ], None(), - (range, SkipAst.Var((range, "__x"))), + (range, SkipAst.Var((range, "!x"))), ); early_return_branch = ( List[ @@ -1397,13 +1397,13 @@ class Converter{file: FileCache.InputSource} { range, SkipAst.Pat_type( SkipAst.Tid_object(SkipAst.Tclass((range, "Failure"))), - Some(Positional(Array[(range, SkipAst.Pat_var((range, "__x")))])), + Some(Positional(Array[(range, SkipAst.Pat_var((range, "!x")))])), SkipAst.Complete(), ), ), ], None(), - (range, SkipAst.Return((range, SkipAst.Var((range, "__x"))))), + (range, SkipAst.Return((range, SkipAst.Var((range, "!x"))))), ); SkipAst.Match( diff --git a/skiplang/compiler/src/skipNaming.sk b/skiplang/compiler/src/skipNaming.sk index 5b3b1f4cc..40072cbf4 100644 --- a/skiplang/compiler/src/skipNaming.sk +++ b/skiplang/compiler/src/skipNaming.sk @@ -439,9 +439,8 @@ fun pattern_bindings(acc: UMap, pat: A.Pattern): UMap { } } -// TODO consider !name.i1.startsWith("_") fun bind_pattern_name(acc: UMap, name: A.Name): UMap { - if (name.i1 != "_") acc.add(name, void) else acc + if (!name.i1.startsWith("_")) acc.add(name, void) else acc } fun bind_pattern_params( @@ -940,14 +939,15 @@ fun check_locals_pattern(bound: Bound, pat: N.Pattern): Bound { | N.Pat_const _ | N.Pat_literal _ -> bound - | N.Pat_var(var_name) -> bound.bind(var_name) + | N.Pat_var(var_name) -> + if (is_wildcard_name(var_name)) bound else bound.bind(var_name) | N.Pat_type(_, obj_params, _) -> obj_params match { | None() -> bound | Some(params) -> params.foldl(check_locals_pattern, bound) } | N.Pat_as(p, var_name) -> - !bound = bound.bind(var_name); + !bound = if (is_wildcard_name(var_name)) bound else bound.bind(var_name); check_locals_pattern(bound, p) } } diff --git a/skiplang/compiler/src/skipOuterIstUtils.sk b/skiplang/compiler/src/skipOuterIstUtils.sk index aaee40160..964fad598 100644 --- a/skiplang/compiler/src/skipOuterIstUtils.sk +++ b/skiplang/compiler/src/skipOuterIstUtils.sk @@ -1544,7 +1544,7 @@ fun binding_needs_ref(binding: O.BindingInfo): Bool { } fun is_underscore_binding(b: O.Binding): Bool { - b.name.id == "_" + b.name.id.startsWith("_") } /* parameters */ diff --git a/skiplang/compiler/tests/syntax/invalid/under_ident_3.exp b/skiplang/compiler/tests/syntax/invalid/under_ident_3.exp new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/skiplang/compiler/tests/syntax/invalid/under_ident_3.exp @@ -0,0 +1 @@ + diff --git a/skiplang/compiler/tests/syntax/invalid/under_ident_3.exp_err b/skiplang/compiler/tests/syntax/invalid/under_ident_3.exp_err new file mode 100644 index 000000000..7bda70834 --- /dev/null +++ b/skiplang/compiler/tests/syntax/invalid/under_ident_3.exp_err @@ -0,0 +1,7 @@ +File "tests/syntax/invalid/under_ident_3.sk", line 10, characters 7-8: +You cannot use a variable that starts with _ + 8 | | T1(_x, _y, _) + 9 | | T2(_x, _y, _) -> +10 | _x + _y + | ^^ +11 | } diff --git a/skiplang/compiler/tests/syntax/invalid/under_ident_3.sk b/skiplang/compiler/tests/syntax/invalid/under_ident_3.sk new file mode 100644 index 000000000..c96a0b13c --- /dev/null +++ b/skiplang/compiler/tests/syntax/invalid/under_ident_3.sk @@ -0,0 +1,18 @@ +base class T { + children = + | T1(x: Int, y: Int, z: Int) + | T2(x: Int, y: Int, z: String) + + fun broken(): Int { + this match { + | T1(_x, _y, _) + | T2(_x, _y, _) -> + _x + _y + } + } +} + +fun main(): void { + t2 = T2(1, 2, "three"); + print_string(t2.broken().toString()) +} diff --git a/skiplang/compiler/tests/syntax/invalid/under_ident_7.exp_err b/skiplang/compiler/tests/syntax/invalid/under_ident_7.exp_err index d3b977805..95ec411b3 100644 --- a/skiplang/compiler/tests/syntax/invalid/under_ident_7.exp_err +++ b/skiplang/compiler/tests/syntax/invalid/under_ident_7.exp_err @@ -1,7 +1,7 @@ -File "tests/syntax/invalid/under_ident_7.sk", line 4, characters 11-11: -Unbound name: _ +File "tests/syntax/invalid/under_ident_7.sk", line 4, characters 22-22: +You cannot use a variable that starts with _ 2 | fun matcher(): T { 3 | this match { 4 | | Foo{_ => _} -> _ - | ^ + | ^ 5 | }