42 lines
1.4 KiB
JavaScript
42 lines
1.4 KiB
JavaScript
import { parser } from '@lezer/rust';
|
|
import { LRLanguage, indentNodeProp, continuedIndent, foldNodeProp, foldInside, LanguageSupport } from '@codemirror/language';
|
|
|
|
/**
|
|
A syntax provider based on the [Lezer Rust
|
|
parser](https://github.com/lezer-parser/rust), extended with
|
|
highlighting and indentation information.
|
|
*/
|
|
const rustLanguage = /*@__PURE__*/LRLanguage.define({
|
|
name: "rust",
|
|
parser: /*@__PURE__*/parser.configure({
|
|
props: [
|
|
/*@__PURE__*/indentNodeProp.add({
|
|
IfExpression: /*@__PURE__*/continuedIndent({ except: /^\s*({|else\b)/ }),
|
|
"String BlockComment": () => null,
|
|
"AttributeItem": cx => cx.continue(),
|
|
"Statement MatchArm": /*@__PURE__*/continuedIndent()
|
|
}),
|
|
/*@__PURE__*/foldNodeProp.add(type => {
|
|
if (/(Block|edTokens|List)$/.test(type.name))
|
|
return foldInside;
|
|
if (type.name == "BlockComment")
|
|
return tree => ({ from: tree.from + 2, to: tree.to - 2 });
|
|
return undefined;
|
|
})
|
|
]
|
|
}),
|
|
languageData: {
|
|
commentTokens: { line: "//", block: { open: "/*", close: "*/" } },
|
|
indentOnInput: /^\s*(?:\{|\})$/,
|
|
closeBrackets: { stringPrefixes: ["b", "r", "br"] }
|
|
}
|
|
});
|
|
/**
|
|
Rust language support
|
|
*/
|
|
function rust() {
|
|
return new LanguageSupport(rustLanguage);
|
|
}
|
|
|
|
export { rust, rustLanguage };
|