]> git.lizzy.rs Git - rust.git/commitdiff
choose a less arbitrary span when parsing the empty visibility modifier
authorZack M. Davis <code@zackmdavis.net>
Sun, 1 Jul 2018 03:22:19 +0000 (20:22 -0700)
committerZack M. Davis <code@zackmdavis.net>
Sun, 1 Jul 2018 05:20:28 +0000 (22:20 -0700)
Visibility spans were added to the AST in #47799 (d6bdf296) as a
`Spanned<_>`—which means that we need to choose a span even in the case
of inherited visibility (what you get when there's no `pub` &c. keyword
at all). That initial implementation's choice is pretty
counterintuitive, which could matter if we want to use it as a site to
suggest inserting a visibility modifier, &c.

(The phrase "Schelling span" in the comment is meant in analogy to the
game-theoretic concept of a "Schelling point", a value that is chosen
simply because it's what one can expect to agree upon with other agents
in the absence of explicit coördination.)

src/libsyntax/parse/parser.rs

index 673157d0ffa0db871c61f7730fc79d91af923086..1f062656b813bed98dbecb6d37a4ed87adc562be 100644 (file)
@@ -6032,7 +6032,10 @@ pub fn parse_visibility(&mut self, can_take_tuple: bool) -> PResult<'a, Visibili
         }
 
         if !self.eat_keyword(keywords::Pub) {
-            return Ok(respan(self.prev_span, VisibilityKind::Inherited))
+            // We need a span for our `Spanned<VisibilityKind>`, but there's inherently no
+            // keyword to grab a span from for inherited visibility; an empty span at the
+            // beginning of the current token would seem to be the "Schelling span".
+            return Ok(respan(self.span.shrink_to_lo(), VisibilityKind::Inherited))
         }
         let lo = self.prev_span;