Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Quasiquotes #2714

Merged
merged 11 commits into from Jul 10, 2013
Merged

Quasiquotes #2714

merged 11 commits into from Jul 10, 2013

Commits on Jul 8, 2013

  1. moves TreeBuilder into the parser

    This is the first of the two patches to the parser necessary for
    quasiquotes to function.
    
    This one moves TreeBuilder from Global to the internals of the Parsers,
    so that quasiquotes will be able to override it later to support some
    corner cases arising from splicing (see the subsequent quasiquote commit
    for more details).
    
    Surprisingly enough, almost noone used TreeBuilder outside the parser,
    and it was necessary to move just a couple of methods to TreeGen to
    satisfy broken dependencies.
    densh authored and xeno-by committed Jul 8, 2013
    Copy the full SHA
    310df92 View commit details
    Browse the repository at this point in the history
  2. extensibility hooks for parser

    This is the second of the two patches to the parser necessary for
    quasiquotes to function.
    
    This one applies just a couple of minor changes to the way parser works,
    so that quasiquotes will be able to extend it to support some
    corner cases arising from splicing (see the subsequent quasiquote commit
    for more details).
    densh authored and xeno-by committed Jul 8, 2013
    Copy the full SHA
    b5f703f View commit details
    Browse the repository at this point in the history
  3. adds the lookahead routine to the parser

    Introduces a scoping operator used to temporarily look into the future.
    Backs up scanner data before evaluating a block and restores it after.
    
    Not used anywhere, only necessary for the upcoming quasiquote patch
    in order to reliably detect and accordingly process holes in quasiquoted
    Scala syntax.
    densh authored and xeno-by committed Jul 8, 2013
    Copy the full SHA
    cbe5362 View commit details
    Browse the repository at this point in the history
  4. moves template creation logic from nsc to reflect

    This routine is going to be necessary in scala-reflect.jar to support
    ClassDef construction/deconstruction in the upcoming quasiquote patch.
    densh authored and xeno-by committed Jul 8, 2013
    Copy the full SHA
    7e6c723 View commit details
    Browse the repository at this point in the history
  5. introduces extensibility hooks into the reifier

    Quasiquoting macros are surprisingly similar to reifying macros, since
    both take something and then produce Scala ASTs for that something.
    
    Therefore the upcoming quasiquote patch reuses the vanilla reifier,
    adjusting it in key points to enable splicing and extraction to
    support string interpolation syntax.
    
    In this commit we prepare the reifier for being reused later on,
    adding a modest amound of extensibility hooks.
    xeno-by committed Jul 8, 2013
    Copy the full SHA
    32949c4 View commit details
    Browse the repository at this point in the history
  6. implements quasiquotes

    - Additions to the reflection API:
    
      - The Quasiquotes implicit class that defines `q`, `tq`, `pq` and `cq`
        interpolators which now become a part of the `scala.reflect.api.
        Universe`.
    
      - Implementations of the interpolators are macro-based
        and are hardwired through `FastTrack`.
    
      - The `Liftable` class and the `StandardLiftables` slice of the cake
        that provide a type class and a bunch of its instances that allow
        to easily splice user-defined types into quasiquotes.
    
      - Additional methods in `BuildUtils` that are used by the quasiquote
        macro to generate trees, notably:
    
        - `SyntacticClassDef`. An extractor/constructor that allows to
          construct and deconstruct classes using arguments that mirror
          syntactic form of ClassDefs (e.g. constructor outside of the
          body).
    
        - `TupleN`, `TupleTypeN`. Extractor/constructor for easy
          construction of ast that represents a tuple term or type
          with given amount of elements.
    
    - Actual implementation of quasiquotes in the `scala.tools.reflect.
      quasiquotes` package which is organized into a cake called
      `Quasiquotes` with slices introducing core abstractions necessary to
      splice into Scala syntax, routines for interfacing with the parser,
      and customized reifiers for tree construction and deconstruction.
    densh authored and xeno-by committed Jul 8, 2013
    4
    Copy the full SHA
    7184fe0 View commit details
    Browse the repository at this point in the history
  7. introduces unapply macros for internal use

    Adds a macro hook into the unapply part of `doTypedApply`, provides
    `macroExpandUnapply` in the macro engine and applies a couple of minor
    refactorings along the way (renames the ugly `macroExpand1` into
    oblivion, changes the ctor of `Fingerprint` to be private and upgrades
    `MacroRole` from a string to a value class).
    
    Unapply macros haven't been approved for inclusion in 2.11.0, however
    they are necessary for pattern-matching quasiquotes. Therefore I'm only
    allowing them to expand for QuasiquoteClass_api_unapply.
    xeno-by committed Jul 8, 2013
    Copy the full SHA
    1771923 View commit details
    Browse the repository at this point in the history
  8. tests for quasiquotes

    Introduces an extensive ScalaCheck-based test suite for recently
    implemented quasiquotes. Provides tools for syntactic tree comparison
    and verifying compilation error messages.
    densh authored and xeno-by committed Jul 8, 2013
    Copy the full SHA
    7553b0a View commit details
    Browse the repository at this point in the history

Commits on Jul 10, 2013

  1. backward compatibility for TreeBuilder

    Reintroduces treeBuilder at its old location (Global.treeBuilder) by
    routing it from the new location (Parsers.treeBuilder) for the sake of
    being friendly to tools that might depend on it.
    densh authored and xeno-by committed Jul 10, 2013
    Copy the full SHA
    f7093b8 View commit details
    Browse the repository at this point in the history
  2. precise return type for FlagsAsBits.unapply

    This will help the pattern matcher to emit better code for this kind
    of extractor that does nothing but wrap the extractee.
    densh authored and xeno-by committed Jul 10, 2013
    Copy the full SHA
    aada28f View commit details
    Browse the repository at this point in the history
  3. macro impls can now return subtypes of c.Tree

    1022931 allowed macro impls to take and return values of type c.Tree
    in addition to the usual c.Expr. However it didn't take into account that
    it is often useful to return subtypes of trees (e.g. with quasiquotes
    that expand into expressions typed as precisely as possible). This patch
    fixes that oversight.
    xeno-by committed Jul 10, 2013
    Copy the full SHA
    114d52b View commit details
    Browse the repository at this point in the history