package cangjie_tpc::prism4cj.languages

public class PrismDart {
    public static func create(prism: Prism): Grammar {
        let dart: Grammar = GrammarUtils.extendGrammar(
            GrammarUtils.require(prism, "clike"),
            "dart",
            ArrayList<Token>([
                Prism.token(
                    "string",
                    Prism.pattern(Regex("r?(\"\"\"|''')[\\s\\S]*?\\1"), false, true),
                    Prism.pattern(Regex("r?(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1"), false, true)
                ),
                Prism.token(
                    "keyword",
                    Prism.pattern(Regex("\\b(?:async|sync|yield)\\*")),
                    Prism.pattern(
                        Regex(
                        "\\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|default|deferred|do|dynamic|else|enum|export|external|extends|factory|final|finally|for|get|if|implements|import|in|library|new|null|operator|part|rethrow|return|set|static|super|switch|this|throw|try|typedef|var|void|while|with|yield)\\b"
                    ))
                ),
                Prism.token(
                    "operator",
                    Prism.pattern(
                        Regex(
                        "\\bis!|\\b(?:as|is)\\b|\\+\\+|--|&&|\\|\\||<<=?|>>=?|~(?:\\/=?)?|[+\\-*\\/%&^|=!<>]=?|\\?"))
                )
            ])
        )

        GrammarUtils.insertBeforeToken(dart, "function",
            ArrayList<Token>([Prism.token("metadata", Prism.pattern(Regex("@\\w+"), false, false, "symbol"))]))
        return dart
    }
}