package cangjie_tpc::prism4cj.languages

public class PrismScala {
    public static func create(prism: Prism): Grammar {
        let scala: Grammar = GrammarUtils.extendGrammar(
            GrammarUtils.require(prism, "java"),
            "scala",
            TokenFilterScalaImpl(),
            ArrayList<Token>([
                Prism.token(
                    "keyword",
                    Prism.pattern(
                        Regex(
                        "<-|=>|\\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\\b"/*cjlint-ignore !G.CHK.04 */
                    ))
                ),
                Prism.token(
                    "string",
                    Prism.pattern(Regex("\"\"\"[\\s\\S]*?\"\"\""), false, true),/*cjlint-ignore !G.CHK.04 */
                    Prism.pattern(Regex("(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1"), false, true)/*cjlint-ignore !G.CHK.04 */
                ),
                Prism.token(
                    "number",
                    Prism.pattern(
                        Regex(
                            "\\b0x[\\da-f]*\\.?[\\da-f]+|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:e\\d+)?[dfl]?",/*cjlint-ignore !G.CHK.04 */
                            RegexFlag.IgnoreCase
                        )
                    )
                )
            ])
        )

        scala.tokens().add(Prism.token("symbol", Prism.pattern(Regex("'[^\\d\\s\\\\]\\w*"))))/*cjlint-ignore !G.CHK.04 */

        GrammarUtils.insertBeforeToken(
            scala,
            "number",
            ArrayList<Token>([
                Prism.token(
                    "builtin",
                    Prism.pattern(
                        Regex(
                        "\\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\\b")/*cjlint-ignore !G.CHK.04 */
                    )
                )
            ])
        )

        return scala
    }
}

class TokenFilterScalaImpl <: TokenFilter {
    public override func test(token: Token): Bool {
        let name: String = token.name()
        return "class-name" != name && "function" != name
    }
}