jansorg / swift-plugin

Space of the Swift language support plugin for JetBrains IDEs
35 stars 0 forks source link

Errors with valid syntax #28

Open kuglee opened 4 months ago

kuglee commented 4 months ago

Thanks for developing this. I've tried it with one of my projects: SwiftFormatter. Unfortunately I've got some phantom errors reported in the following files (I'm using Xcode Version 15.2 (15C500b)):

jansorg commented 4 months ago

Thanks for the pointers! These are most likely parser errors in this plugin, Swift isn't the easiest language for parsing ;)

This project is a little quiet at the moment, I'll be able to commit time for it in about 4-6 weeks.

kuglee commented 4 months ago

No rush 🙂. Keep up the good work.

eirikvaa commented 4 months ago

First of all, amazing work! Especially when working in a Kotlin Multipaltform application, having some Swift support is great!

I came across some syntax that was not supported, so just dropping it here for reference:

let task = Task { @MainActor in
               ^ 
    // ...
}

where the error message says:

'#', '#if', '#keypath', '&', '(', '.', ';', <, , , , , , , , , , , , , Any, Self, '\', _, await, defer, do, self, super, try, '{' or '}' expected, got '{'

If I remove the @MainActor, the error goes away.

jansorg commented 2 months ago

@kuglee I've fixed all your reported problems for the next update.

@eirikvaa Could you provide a working example for the problem, please? If that's a closure expression, then the official Swift grammar doesn't support this, "Grammar of a closure expression" of https://docs.swift.org/swift-book/documentation/the-swift-programming-language/summaryofthegrammar#Declarations A working example would help to fix it and to report it as change to the maintainers of the Grammar.

kuglee commented 2 months ago

I can look at it next week, but the project I linked is a good example.

jansorg commented 2 months ago

@kuglee All your reported problems are fixed for the next update. The other question was about the appended problem by @eirikvaa .

eirikvaa commented 2 months ago

@jansorg By looking at the Swift grammar, I think we can get to the syntax with the following rules and substitutions:

closure-expression → { attributes? closure-signature? statements? }
attributes → attribute attributes?
attribute → @ attribute-name attribute-argument-clause?
attribute-name → identifier

And then we are pretty much at Task { @MainActor }. A working example would be something like this:

func foo() {
    Task { @MainActor in 
        print("I'm running on the main actor")
    }
}