Skip to content

Commit

Permalink
revert to allowing absolute names on LHS of use (use .foo bar)
Browse files Browse the repository at this point in the history
  • Loading branch information
mitchellwrosen committed Feb 10, 2025
1 parent a5e7d59 commit a71dd93
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 33 deletions.
2 changes: 1 addition & 1 deletion parser-typechecker/src/Unison/Syntax/DeclParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ modifierP = do
where
unique = do
tok <- openBlockWith "unique"
optional (openBlockWith "[" *> importWordyId <* closeBlock) >>= \case
optional (openBlockWith "[" *> importRelativeWordyId <* closeBlock) >>= \case
Nothing -> pure (UnresolvedModifier'UniqueWithoutGuid <$ tok)
Just guid -> pure (UnresolvedModifier'UniqueWithGuid (Name.toText (L.payload guid)) <$ tok)
structural = do
Expand Down
6 changes: 3 additions & 3 deletions parser-typechecker/src/Unison/Syntax/FileParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ file = do
optional (reserved "namespace") >>= \case
Nothing -> pure Nothing
Just _ -> do
namespace <- importWordyId <|> importSymbolyId
namespace <- importRelativeWordyId <|> importRelativeSymbolyId
void (optional semi)
pure (Just namespace.payload)
let maybeNamespaceVar = Name.toVar <$> maybeNamespace
Expand Down Expand Up @@ -401,9 +401,9 @@ stanza = watchExpression <|> unexpectedAction <|> binding

watched :: (Monad m, Var v) => P v m (UF.WatchKind, Text, Ann)
watched = P.try do
kind <- (fmap . fmap . fmap) (Text.unpack . Name.toText) (optional importWordyId)
kind <- (fmap . fmap . fmap) (Text.unpack . Name.toText) (optional importRelativeWordyId)
guid <- uniqueName 10
op <- optional (L.payload <$> P.lookAhead importSymbolyId)
op <- optional (L.payload <$> P.lookAhead importRelativeSymbolyId)
guard (op == Just (Name.fromSegment NameSegment.watchSegment))
tok <- anyToken
guard $ maybe True (`L.touches` tok) kind
Expand Down
2 changes: 1 addition & 1 deletion parser-typechecker/src/Unison/Syntax/TermParser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -1355,7 +1355,7 @@ importp = do
optional $
fmap Right importWordyId
<|> fmap Left importSymbolyId
suffixes <- optional (some (importWordyId <|> importSymbolyId))
suffixes <- optional (some (importRelativeWordyId <|> importRelativeSymbolyId))
case (prefix, suffixes) of
(Nothing, _) -> P.customFailure $ UseEmpty kw
(Just prefix@(Left _), _) -> P.customFailure $ UseInvalidPrefixSuffix prefix suffixes
Expand Down
26 changes: 0 additions & 26 deletions unison-src/transcripts/idempotent/fix-4536.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,32 +40,6 @@ foo =
* typeLink
```

``` unison :error
foo : Nat
foo =
use .lib.builtin.Nat +
1 + 2
```

``` ucm :added-by-ucm
Loading changes detected in scratch.u.
😶
I was expecting something after the use keyword
3 | use .lib.builtin.Nat +
Here's a few examples of valid `use` statements:
use math sqrt Introduces `sqrt` as a local alias for
`math.sqrt`
use List :+ Introduces `:+` as a local alias for
`List.:+`.
use .foo bar.baz Introduces `bar.baz` as a local alias for
the absolute name `.foo.bar.baz`
```

``` unison :error
namespace .foo
```
Expand Down
18 changes: 16 additions & 2 deletions unison-syntax/src/Unison/Syntax/Parser.hs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ module Unison.Syntax.Parser
failureIf,
hqInfixId,
hqPrefixId,
importRelativeSymbolyId,
importRelativeWordyId,
importSymbolyId,
importWordyId,
label,
Expand Down Expand Up @@ -357,15 +359,27 @@ wordyDefinitionName = queryToken \case
L.WordyId n -> Just $ Name.toVar (HQ'.toName n)
_ -> Nothing

-- | Parse a wordyId as a relative Name, rejecting any hash
-- | Parse a wordyId as a Name, rejecting any hash
importWordyId :: (Ord v) => P v m (L.Token Name)
importWordyId = queryToken \case
L.WordyId (HQ'.NameOnly n) -> Just n
_ -> Nothing

-- | Parse a wordyId as a relative Name, rejecting any hash
importRelativeWordyId :: (Ord v) => P v m (L.Token Name)
importRelativeWordyId = queryToken \case
L.WordyId (HQ'.NameOnly n) | Name.isRelative n -> Just n
_ -> Nothing

-- | The `+` in: use Foo.bar + as a relative Name
-- | The `+` in: use Foo.bar + as a Name
importSymbolyId :: (Ord v) => P v m (L.Token Name)
importSymbolyId = queryToken \case
L.SymbolyId (HQ'.NameOnly n) -> Just n
_ -> Nothing

-- | The `+` in: use Foo.bar + as a relative Name
importRelativeSymbolyId :: (Ord v) => P v m (L.Token Name)
importRelativeSymbolyId = queryToken \case
L.SymbolyId (HQ'.NameOnly n) | Name.isRelative n -> Just n
_ -> Nothing

Expand Down

0 comments on commit a71dd93

Please sign in to comment.