Giter Club home page Giter Club logo

Comments (10)

shwestrick avatar shwestrick commented on May 25, 2024 1

Here's a couple more examples of issues. Multiline comments are handled differently than normal comments. IIRC, the pass which inserts comments also ungroups things in some cases. We should take a close look at this.

INPUT

(** this is a multiline comment
  *)
structure A = B

(* this is a comment *)
structure C = D

OUTPUT

(** this is a multiline comment
  *)
structure A
  =
  B
 
(* this is a comment *) structure C = D

from smlfmt.

shwestrick avatar shwestrick commented on May 25, 2024 1

It just occurred to me that we can make our lives easier here with Rigid. Multiline comments need to be ungrouped to prevent flattening. This is currently done in an adhoc way. We could instead just make them rigid. 🚀

from smlfmt.

shwestrick avatar shwestrick commented on May 25, 2024 1

@HarrisonGrodin some progress on this. I implemented this idea:

Adding a pass to pull comments as high up as possible (without crossing a source token) might help

It worked great. Now the formatted output looks good for these examples:

structure S =
  (* A *)
  struct
    (* B *)
    val x = 0
    (* C *)
    val y = 1
  end
(* D *)
val z = 2
 

(** this is a multiline comment
  *)
structure A = B

(* this is a comment *)
structure C = D

from smlfmt.

shwestrick avatar shwestrick commented on May 25, 2024 1

There's still one case which seems to not quite do the right thing:

INPUT

val x =
  if b then
    yah (* comment *)
  else
    nah

OUTPUT (max width 20, to force ungrouping for purposes of this example)

val x =
  if b then
    yah
  (* comment *)
  else
    nah

I know why it happens, but it's not clear what the best solution is. Comments are inserted "before" each token, and the comment retains some properties of the token it attaches to, e.g. its indentation. The comment above attaches to "else".

It might seem like we could fix this by trying to detect which token it should attach to. But this is not so straightforward.

Suppose we had this as input:

val result = (* when b, say hello *) if b then hello (* otherwise, say goodbye *) else goodbye

The formatter produces this, which we hopefully both agree is "correct":

val result =
  (* when b, say hello *)
  if b then
    hello
  (* otherwise, say goodbye *)
  else
    goodbye

from smlfmt.

shwestrick avatar shwestrick commented on May 25, 2024 1

Yeah definitely. I'm leaning towards leaving this as the default behavior.

There are definitely people out there that prefer writing comments after expression/declarations, rather than before. So, perhaps not ideal. But good enough for now I think!

from smlfmt.

shwestrick avatar shwestrick commented on May 25, 2024

Ah interesting. The prettying pass which inserts comments locally decides whether to insert above or beside the next token. This also interacts with grouping. I did a quick and dirty implementation with a simple heuristic, but this clearly needs to be revisited.

from smlfmt.

shwestrick avatar shwestrick commented on May 25, 2024

I also have a guess that the formatting issues with comments are caused by individual comments appearing "deeply nested" within the doc structure. Adding a pass to pull comments as high up as possible (without crossing a source token) might help.

from smlfmt.

HarrisonGrodin avatar HarrisonGrodin commented on May 25, 2024

Wow, that looks incredible!

There's still one case which seems to not quite do the right thing:

How bad would it be to consider this the correct behavior? Presumably,

val x =
  if b then
    (* comment *) yah
  else
    nah

would format to

val x =
  if b then
    (* comment *)
    yah
  else
    nah

Perhaps this behavior is desirable, since it gives users a simple way to understand what comments are attached to?

from smlfmt.

shwestrick avatar shwestrick commented on May 25, 2024

If you agree, I think we can close this issue :)

from smlfmt.

HarrisonGrodin avatar HarrisonGrodin commented on May 25, 2024

Agreed!

from smlfmt.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.