diff --git a/src/main/grammars/RustParser.bnf b/src/main/grammars/RustParser.bnf index ecdd0157e80..b21c8c2b9a8 100644 --- a/src/main/grammars/RustParser.bnf +++ b/src/main/grammars/RustParser.bnf @@ -681,8 +681,8 @@ upper ExternCrateItem ::= extern crate (identifier | self) Alias? ';' { elementTypeFactory = "org.rust.lang.core.stubs.StubImplementationsKt.factory" } -upper ModItem ::= mod identifier '{' InnerAttr* Items '}' { - pin = 3 +upper ModItem ::= unsafe? mod identifier '{' InnerAttr* Items '}' { + pin = 4 name = "" implements = [ "org.rust.lang.core.psi.ext.RsNameIdentifierOwner" "org.rust.lang.core.psi.ext.RsItemElement" @@ -693,7 +693,7 @@ upper ModItem ::= mod identifier '{' InnerAttr* Items '}' { elementTypeFactory = "org.rust.lang.core.stubs.StubImplementationsKt.factory" } -upper ModDeclItem ::= mod identifier ';' { +upper ModDeclItem ::= unsafe? mod identifier ';' { pin = 'identifier' // make sure `ModDeclItem` goes **after** `ModItem` name = "" implements = [ "org.rust.lang.core.psi.ext.RsMandatoryReferenceElement" diff --git a/src/main/kotlin/org/rust/lang/core/parser/RustParserDefinition.kt b/src/main/kotlin/org/rust/lang/core/parser/RustParserDefinition.kt index 7fc0144376f..8d0901086f2 100644 --- a/src/main/kotlin/org/rust/lang/core/parser/RustParserDefinition.kt +++ b/src/main/kotlin/org/rust/lang/core/parser/RustParserDefinition.kt @@ -104,6 +104,6 @@ class RustParserDefinition : ParserDefinition { /** * Should be increased after any change of parser rules */ - const val PARSER_VERSION: Int = LEXER_VERSION + 28 + const val PARSER_VERSION: Int = LEXER_VERSION + 29 } } diff --git a/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.rs b/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.rs index ae1685b063b..c6993d6cae7 100644 --- a/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.rs +++ b/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.rs @@ -19,7 +19,11 @@ mod empty { pub mod pub_mod {} pub(crate) mod pub_crate_mod {} +unsafe mod unsafe_crate_mod {} // semantically invalid +pub unsafe mod pub_unsafe_crate_mod {} // semantically invalid mod mod_decl; pub mod pub_mod_decl; pub(crate) mod pub_crate_mod_decl; +unsafe mod unsafe_mod_decl; // semantically invalid +pub unsafe mod pub_unsafe_mod_decl; // semantically invalid diff --git a/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.txt b/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.txt index b80b6e33b55..5473cc029bc 100644 --- a/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.txt +++ b/src/test/resources/org/rust/lang/core/parser/fixtures/complete/mod.txt @@ -160,6 +160,33 @@ FILE PsiWhiteSpace(' ') PsiElement({)('{') PsiElement(})('}') + PsiWhiteSpace('\n') + RsModItemImpl(MOD_ITEM) + PsiElement(unsafe)('unsafe') + PsiWhiteSpace(' ') + PsiElement(mod)('mod') + PsiWhiteSpace(' ') + PsiElement(identifier)('unsafe_crate_mod') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiElement(})('}') + PsiWhiteSpace(' ') + RsModItemImpl(MOD_ITEM) + PsiComment()('// semantically invalid') + PsiWhiteSpace('\n') + RsVisImpl(VIS) + PsiElement(pub)('pub') + PsiWhiteSpace(' ') + PsiElement(unsafe)('unsafe') + PsiWhiteSpace(' ') + PsiElement(mod)('mod') + PsiWhiteSpace(' ') + PsiElement(identifier)('pub_unsafe_crate_mod') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiComment()('// semantically invalid') PsiWhiteSpace('\n\n') RsModDeclItemImpl(MOD_DECL_ITEM) PsiElement(mod)('mod') @@ -189,3 +216,26 @@ FILE PsiWhiteSpace(' ') PsiElement(identifier)('pub_crate_mod_decl') PsiElement(;)(';') + PsiWhiteSpace('\n') + RsModDeclItemImpl(MOD_DECL_ITEM) + PsiElement(unsafe)('unsafe') + PsiWhiteSpace(' ') + PsiElement(mod)('mod') + PsiWhiteSpace(' ') + PsiElement(identifier)('unsafe_mod_decl') + PsiElement(;)(';') + PsiWhiteSpace(' ') + RsModDeclItemImpl(MOD_DECL_ITEM) + PsiComment()('// semantically invalid') + PsiWhiteSpace('\n') + RsVisImpl(VIS) + PsiElement(pub)('pub') + PsiWhiteSpace(' ') + PsiElement(unsafe)('unsafe') + PsiWhiteSpace(' ') + PsiElement(mod)('mod') + PsiWhiteSpace(' ') + PsiElement(identifier)('pub_unsafe_mod_decl') + PsiElement(;)(';') + PsiWhiteSpace(' ') + PsiComment()('// semantically invalid') diff --git a/src/test/resources/org/rust/lang/core/parser/fixtures/partial/fn.txt b/src/test/resources/org/rust/lang/core/parser/fixtures/partial/fn.txt index eeeb1c86516..5b07236eef3 100644 --- a/src/test/resources/org/rust/lang/core/parser/fixtures/partial/fn.txt +++ b/src/test/resources/org/rust/lang/core/parser/fixtures/partial/fn.txt @@ -105,7 +105,7 @@ FILE PsiElement(})('}') PsiWhiteSpace('\n\n') PsiElement(unsafe)('unsafe') - PsiErrorElement:extern, fn, impl or trait expected, got 'const' + PsiErrorElement:extern, fn, impl, mod or trait expected, got 'const' PsiWhiteSpace(' ') RsFunctionImpl(FUNCTION)