================
@@ -2270,7 +2270,18 @@ ContinuationIndenter::createBreakableToken(const 
FormatToken &Current,
     if (State.Stack.back().IsInsideObjCArrayLiteral)
       return nullptr;
 
+    // The "DPI"/"DPI-C" in SystemVerilog direct programming interface imports
+    // cannot be split, e.g.
+    // `import "DPI" function foo();`
     StringRef Text = Current.TokenText;
+    if (Style.isVerilog()) {
+      const FormatToken *Prev = Current.getPreviousNonComment();
+      if (Prev && Prev == State.Line->getFirstNonComment() &&
+          Prev->TokenText == "import") {
+        return nullptr;
+      }
+    }
+
----------------
alexfh wrote:

> > `isOneOf` won't work here, since the token has the type of `identifier` 
> > rather than a keyword:
> 
> Have you tried it? It does work because not only is `import` a 
> `tok::identifier`, it's also a `Keywords.kw_import`.

Ah, right, I had tried it with `tok::kw_import` (and I missed the difference 
between this and your suggestion). Thanks for the clarification!

> > We should leave `Current.getPreviousNonComment()` to handle comments in the 
> > middle of the statement (something like `import /*"DPI"*/ "DPI-C" ...` 
> > comes to mind).
> 
> I was aware of that, but we usually don't call `getPreviousNonComment()` 
> unless a comment before a token makes sense in practice. Otherwise, we would 
> have to write ugly and inefficient code to handle things like the following:
> 
> ```
> /* outer l_square */ [ /* inner l_square */ [ /* attribute */ unlikely /* 
> inner r_square */ ] /* outer r_square */ ] // comment
> ```

I don't think it would add a lot of overhead (one branch on a happy path) or 
hinder readability of the code a lot (`getPreviousNonComment()` vs `Prev`), but 
I also don't think it's super important here.


https://github.com/llvm/llvm-project/pull/66951
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to