diff --git a/CHANGELOG.md b/CHANGELOG.md index b08bfa4a..f9865282 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,14 @@ Changelog structure reference: ## [Unreleased] +## [20.1.1] + +### Fixed + +- Zig + - Unterminated string at the end of the file soft-locks the editor + - Trailing commas in for loop parameters don't get parsed correctly + ## [20.1.0] ### Added diff --git a/core/src/main/grammar/Zig.bnf b/core/src/main/grammar/Zig.bnf index fa980fe7..74c1bdce 100644 --- a/core/src/main/grammar/Zig.bnf +++ b/core/src/main/grammar/Zig.bnf @@ -180,11 +180,11 @@ Root ::= CONTAINER_DOC_COMMENT? ContainerMembers? // *** Top level *** -ContainerMembers ::= ContainerDeclarations? (ContainerField COMMA)* (ContainerField | ContainerDeclarations)? +ContainerMembers ::= ContainerDeclaration* (ContainerField COMMA)* (ContainerField | ContainerDeclaration*) -ContainerDeclarations ::= (TestDecl | ComptimeDecl | DOC_COMMENT? KEYWORD_PUB? Decl)+ +ContainerDeclaration ::= TestDecl | ComptimeDecl | DOC_COMMENT? KEYWORD_PUB? Decl -TestDecl ::= DOC_COMMENT? KEYWORD_TEST (STRING_LITERAL_SINGLE | IDENTIFIER)? Block {pin=2} +TestDecl ::= KEYWORD_TEST (STRING_LITERAL_SINGLE | IDENTIFIER)? Block {pin=1} ComptimeDecl ::= KEYWORD_COMPTIME Block @@ -205,6 +205,7 @@ ContainerField ::= DOC_COMMENT? KEYWORD_COMPTIME? !KEYWORD_FN (IDENTIFIER COLON) Statement ::= KEYWORD_COMPTIME ComptimeStatement | KEYWORD_NOSUSPEND BlockExprStatement + | KEYWORD_SUSPEND BlockExprStatement | KEYWORD_DEFER BlockExprStatement | KEYWORD_ERRDEFER Payload? BlockExprStatement | IfStatement @@ -415,14 +416,21 @@ WhilePrefix ::= KEYWORD_WHILE ZB_WhilePrefix_Operand PtrPayload? WhileContinueEx private ZB_WhilePrefix_Operand ::= LPAREN Expr RPAREN {pin=1} -ForRange ::= Expr DOT2 Expr? -ForOperand ::= ForRange | Expr {recoverWhile="ZB_ForOperand_Recover"} +ForPrefix ::= KEYWORD_FOR LPAREN ZB_ForParams RPAREN ForPayload {pin=1} -private ZB_ForOperand_Recover ::= !(COMMA | RPAREN) +private ZB_ForParams ::= ForInput (COMMA ForInput)* COMMA? {recoverWhile="ZB_ForParams_Recover"} -ForPrefix ::= KEYWORD_FOR ZB_ForPrefix_Operands PtrIndexPayload {pin=1} +private ZB_ForParams_Recover ::= !(RPAREN) -private ZB_ForPrefix_Operands ::= LPAREN (ForOperand COMMA)* ForOperand RPAREN {pin=1} +ForInput ::= Expr (DOT2 Expr?)? {recoverWhile="ZB_ForInput_Recover"} + +private ZB_ForInput_Recover ::= !(COMMA | RPAREN) + +ForPayload ::= PIPE ZB_ForPayload_Item (COMMA ZB_ForPayload_Item)* PIPE {pin=1} + +private ZB_ForPayload_Item ::= ASTERISK? IDENTIFIER {recoverWhile="ZB_ForPayload_Recover"} + +private ZB_ForPayload_Recover ::= !(COMMA | PIPE) // Payloads Payload ::= PIPE IDENTIFIER PIPE diff --git a/core/src/main/grammar/Zig.flex b/core/src/main/grammar/Zig.flex index 307239dc..00af51a9 100644 --- a/core/src/main/grammar/Zig.flex +++ b/core/src/main/grammar/Zig.flex @@ -222,6 +222,7 @@ BUILTINIDENTIFIER="@"[A-Za-z_][A-Za-z0-9_]* "'" { yybegin(CHAR_LIT); } {char_char}*"'" { yybegin(YYINITIAL); return CHAR_LITERAL; } + <> { yybegin(YYINITIAL); return BAD_SQUOT; } [^] { yypushback(1); yybegin(UNT_SQUOT); } {FLOAT} { return FLOAT; } @@ -229,6 +230,7 @@ BUILTINIDENTIFIER="@"[A-Za-z_][A-Za-z0-9_]* "\"" { yybegin(STR_LIT); } {string_char}*"\"" { yybegin(YYINITIAL); return STRING_LITERAL_SINGLE; } + <> { yybegin(YYINITIAL); return BAD_DQUOT; } [^] { yypushback(1); yybegin(UNT_DQUOT); } "\\\\" { yybegin(STR_MULT_LINE); } {all_nl_wrap} "\\\\" { } @@ -237,12 +239,17 @@ BUILTINIDENTIFIER="@"[A-Za-z_][A-Za-z0-9_]* {IDENTIFIER_PLAIN} { return IDENTIFIER; } "@\"" { yybegin(ID_QUOT); } {string_char}*"\"" { yybegin(YYINITIAL); return IDENTIFIER; } + <> { yybegin(YYINITIAL); return BAD_DQUOT; } [^] { yypushback(1); yybegin(UNT_DQUOT); } {BUILTINIDENTIFIER} { return BUILTINIDENTIFIER; } - [^\n]*{CRLF} { yybegin(YYINITIAL); return BAD_SQUOT; } - [^\n]*{CRLF} { yybegin(YYINITIAL); return BAD_DQUOT; } + <> { yybegin(YYINITIAL); return BAD_SQUOT; } + {CRLF} { yybegin(YYINITIAL); return BAD_SQUOT; } + [^\n]* { } + <> { yybegin(YYINITIAL); return BAD_DQUOT; } + {CRLF} { yybegin(YYINITIAL); return BAD_DQUOT; } + [^\n]* { } {WHITE_SPACE} { return WHITE_SPACE; } diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/execution/base/ZigTopLevelLineMarker.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/execution/base/ZigTopLevelLineMarker.kt index 0df4cf55..340c8f10 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/execution/base/ZigTopLevelLineMarker.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/execution/base/ZigTopLevelLineMarker.kt @@ -36,7 +36,7 @@ abstract class ZigTopLevelLineMarker: RunLineMarkerContributor() { var nestingLevel = 0; while (parent != null && parent !is PsiFile) { - if (parent.elementType == ZigTypes.CONTAINER_DECLARATIONS) { + if (parent.elementType == ZigTypes.CONTAINER_DECLARATION) { if (nestingLevel != 0) return null nestingLevel++ diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/zig/injection/ZigStringElementManipulator.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/zig/injection/ZigStringElementManipulator.kt index e119b570..6849ddb5 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/zig/injection/ZigStringElementManipulator.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/zig/injection/ZigStringElementManipulator.kt @@ -59,10 +59,9 @@ class ZigStringElementManipulator: AbstractElementManipulator( val stringLiteral = dummy .firstChild .let {it as ZigContainerMembers} - .containerDeclarationsList - .first() - .declList + .containerDeclarationList .first() + .decl!! .globalVarDecl!! .expr .let { it as ZigPrimaryTypeExpr } diff --git a/gradle.properties b/gradle.properties index bd364753..d12de329 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ pluginName=ZigBrains pluginRepositoryUrl=https://github.com/FalsePattern/ZigBrains -pluginVersion=20.1.0 +pluginVersion=20.1.1 pluginSinceBuild=241 pluginUntilBuild=241.*