From 6c2fe00b4c9a5d2cc348752ce6a179035b0eebef Mon Sep 17 00:00:00 2001 From: Sergey Nazarov Date: Mon, 7 Oct 2024 12:07:07 +0300 Subject: [PATCH] wip --- build.gradle.kts | 4 - .../rideplugin/parser/RideParser.java | 192 ++++++++++-------- .../rideplugin/psi/RideIfExpr.java | 15 +- .../rideplugin/psi/RideThenBlock.java | 25 +++ .../rideplugin/psi/RideTypes.java | 4 + .../rideplugin/psi/RideVisitor.java | 4 + .../rideplugin/psi/impl/RideIfExprImpl.java | 28 +-- .../psi/impl/RideThenBlockImpl.java | 60 ++++++ src/main/grammars/Ride.bnf | 3 +- .../com/wavesplatform/rideplugin/RideFile.kt | 4 +- .../wavesplatform/rideplugin/RideFileType.kt | 4 +- .../formatter/RideFormattingModelBuilder.kt | 8 +- .../highlighter/RideSyntaxHighlighter.kt | 4 +- src/main/resources/META-INF/plugin.xml | 8 +- 14 files changed, 221 insertions(+), 142 deletions(-) create mode 100644 src/main/gen/com/wavesplatform/rideplugin/psi/RideThenBlock.java create mode 100644 src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideThenBlockImpl.java diff --git a/build.gradle.kts b/build.gradle.kts index 460952d..6c1eb2a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -102,9 +102,5 @@ tasks { publishPlugin { dependsOn("patchChangelog") token.set(System.getenv("PUBLISH_TOKEN")) - // pluginVersion is based on the SemVer (https://semver.org) and supports pre-release labels, like 2.1.7-alpha.3 - // Specify pre-release label to publish the plugin in a custom Release Channel automatically. Read more: - // https://plugins.jetbrains.com/docs/intellij/deployment.html#specifying-a-release-channel - channels.set(listOf(properties("pluginVersion").split('-').getOrElse(1) { "default" }.split('.').first())) } } diff --git a/src/main/gen/com/wavesplatform/rideplugin/parser/RideParser.java b/src/main/gen/com/wavesplatform/rideplugin/parser/RideParser.java index cf7a371..49a6008 100644 --- a/src/main/gen/com/wavesplatform/rideplugin/parser/RideParser.java +++ b/src/main/gen/com/wavesplatform/rideplugin/parser/RideParser.java @@ -963,6 +963,104 @@ public static boolean stringLiteral(PsiBuilder b, int l) { return r; } + /* ********************************************************** */ + // THEN (closure_expr | block_state) else_if_block* else_block? + // | IF LPAREN if_cond RPAREN THEN (closure_expr | block_state) else_if_block* else_block? + public static boolean then_block(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block")) return false; + if (!nextTokenIs(b, "", IF, THEN)) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, THEN_BLOCK, ""); + r = then_block_0(b, l + 1); + if (!r) r = then_block_1(b, l + 1); + exit_section_(b, l, m, r, false, null); + return r; + } + + // THEN (closure_expr | block_state) else_if_block* else_block? + private static boolean then_block_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_0")) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_); + r = consumeToken(b, THEN); + p = r; // pin = 1 + r = r && report_error_(b, then_block_0_1(b, l + 1)); + r = p && report_error_(b, then_block_0_2(b, l + 1)) && r; + r = p && then_block_0_3(b, l + 1) && r; + exit_section_(b, l, m, r, p, null); + return r || p; + } + + // closure_expr | block_state + private static boolean then_block_0_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_0_1")) return false; + boolean r; + r = closure_expr(b, l + 1); + if (!r) r = block_state(b, l + 1); + return r; + } + + // else_if_block* + private static boolean then_block_0_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_0_2")) return false; + while (true) { + int c = current_position_(b); + if (!else_if_block(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "then_block_0_2", c)) break; + } + return true; + } + + // else_block? + private static boolean then_block_0_3(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_0_3")) return false; + else_block(b, l + 1); + return true; + } + + // IF LPAREN if_cond RPAREN THEN (closure_expr | block_state) else_if_block* else_block? + private static boolean then_block_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_1")) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_); + r = consumeTokens(b, 1, IF, LPAREN); + p = r; // pin = 1 + r = r && report_error_(b, if_cond(b, l + 1)); + r = p && report_error_(b, consumeTokens(b, -1, RPAREN, THEN)) && r; + r = p && report_error_(b, then_block_1_5(b, l + 1)) && r; + r = p && report_error_(b, then_block_1_6(b, l + 1)) && r; + r = p && then_block_1_7(b, l + 1) && r; + exit_section_(b, l, m, r, p, null); + return r || p; + } + + // closure_expr | block_state + private static boolean then_block_1_5(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_1_5")) return false; + boolean r; + r = closure_expr(b, l + 1); + if (!r) r = block_state(b, l + 1); + return r; + } + + // else_if_block* + private static boolean then_block_1_6(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_1_6")) return false; + while (true) { + int c = current_position_(b); + if (!else_if_block(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "then_block_1_6", c)) break; + } + return true; + } + + // else_block? + private static boolean then_block_1_7(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "then_block_1_7")) return false; + else_block(b, l + 1); + return true; + } + /* ********************************************************** */ // LPAREN var_definition (COMMA var_definition)* RPAREN public static boolean tuple_definition(PsiBuilder b, int l) { @@ -1525,105 +1623,19 @@ private static boolean closure_expr_1_3(PsiBuilder b, int l) { return true; } - // IF if_cond THEN (closure_expr | block_state) else_if_block* else_block? - // | IF LPAREN if_cond RPAREN THEN (closure_expr | block_state) else_if_block* else_block? + // IF if_cond then_block public static boolean if_expr(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "if_expr")) return false; if (!nextTokenIsSmart(b, IF)) return false; boolean r; Marker m = enter_section_(b); - r = if_expr_0(b, l + 1); - if (!r) r = if_expr_1(b, l + 1); - exit_section_(b, m, IF_EXPR, r); - return r; - } - - // IF if_cond THEN (closure_expr | block_state) else_if_block* else_block? - private static boolean if_expr_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_0")) return false; - boolean r, p; - Marker m = enter_section_(b, l, _NONE_); r = consumeTokenSmart(b, IF); - p = r; // pin = 1 - r = r && report_error_(b, if_cond(b, l + 1)); - r = p && report_error_(b, consumeToken(b, THEN)) && r; - r = p && report_error_(b, if_expr_0_3(b, l + 1)) && r; - r = p && report_error_(b, if_expr_0_4(b, l + 1)) && r; - r = p && if_expr_0_5(b, l + 1) && r; - exit_section_(b, l, m, r, p, null); - return r || p; - } - - // closure_expr | block_state - private static boolean if_expr_0_3(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_0_3")) return false; - boolean r; - r = closure_expr(b, l + 1); - if (!r) r = block_state(b, l + 1); - return r; - } - - // else_if_block* - private static boolean if_expr_0_4(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_0_4")) return false; - while (true) { - int c = current_position_(b); - if (!else_if_block(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "if_expr_0_4", c)) break; - } - return true; - } - - // else_block? - private static boolean if_expr_0_5(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_0_5")) return false; - else_block(b, l + 1); - return true; - } - - // IF LPAREN if_cond RPAREN THEN (closure_expr | block_state) else_if_block* else_block? - private static boolean if_expr_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_1")) return false; - boolean r, p; - Marker m = enter_section_(b, l, _NONE_); - r = consumeTokensSmart(b, 1, IF, LPAREN); - p = r; // pin = 1 - r = r && report_error_(b, if_cond(b, l + 1)); - r = p && report_error_(b, consumeTokensSmart(b, -1, RPAREN, THEN)) && r; - r = p && report_error_(b, if_expr_1_5(b, l + 1)) && r; - r = p && report_error_(b, if_expr_1_6(b, l + 1)) && r; - r = p && if_expr_1_7(b, l + 1) && r; - exit_section_(b, l, m, r, p, null); - return r || p; - } - - // closure_expr | block_state - private static boolean if_expr_1_5(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_1_5")) return false; - boolean r; - r = closure_expr(b, l + 1); - if (!r) r = block_state(b, l + 1); + r = r && if_cond(b, l + 1); + r = r && then_block(b, l + 1); + exit_section_(b, m, IF_EXPR, r); return r; } - // else_if_block* - private static boolean if_expr_1_6(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_1_6")) return false; - while (true) { - int c = current_position_(b); - if (!else_if_block(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "if_expr_1_6", c)) break; - } - return true; - } - - // else_block? - private static boolean if_expr_1_7(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "if_expr_1_7")) return false; - else_block(b, l + 1); - return true; - } - /* ********************************************************** */ // Expression root: type // Operator priority table: diff --git a/src/main/gen/com/wavesplatform/rideplugin/psi/RideIfExpr.java b/src/main/gen/com/wavesplatform/rideplugin/psi/RideIfExpr.java index 8b07ed5..66c4e5e 100644 --- a/src/main/gen/com/wavesplatform/rideplugin/psi/RideIfExpr.java +++ b/src/main/gen/com/wavesplatform/rideplugin/psi/RideIfExpr.java @@ -7,19 +7,10 @@ public interface RideIfExpr extends RideExpr { - @Nullable - RideBlockState getBlockState(); - - @Nullable - RideClosureExpr getClosureExpr(); - - @Nullable - RideElseBlock getElseBlock(); - @NotNull - List getElseIfBlockList(); - - @Nullable RideIfCond getIfCond(); + @NotNull + RideThenBlock getThenBlock(); + } diff --git a/src/main/gen/com/wavesplatform/rideplugin/psi/RideThenBlock.java b/src/main/gen/com/wavesplatform/rideplugin/psi/RideThenBlock.java new file mode 100644 index 0000000..7c44477 --- /dev/null +++ b/src/main/gen/com/wavesplatform/rideplugin/psi/RideThenBlock.java @@ -0,0 +1,25 @@ +// This is a generated file. Not intended for manual editing. +package com.wavesplatform.rideplugin.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; + +public interface RideThenBlock extends RideCompositeElement { + + @Nullable + RideBlockState getBlockState(); + + @Nullable + RideClosureExpr getClosureExpr(); + + @Nullable + RideElseBlock getElseBlock(); + + @NotNull + List getElseIfBlockList(); + + @Nullable + RideIfCond getIfCond(); + +} diff --git a/src/main/gen/com/wavesplatform/rideplugin/psi/RideTypes.java b/src/main/gen/com/wavesplatform/rideplugin/psi/RideTypes.java index 6cd9550..29b2284 100644 --- a/src/main/gen/com/wavesplatform/rideplugin/psi/RideTypes.java +++ b/src/main/gen/com/wavesplatform/rideplugin/psi/RideTypes.java @@ -79,6 +79,7 @@ public interface RideTypes { IElementType STATEMENT = new RideElementType("STATEMENT"); IElementType STRING_LITERAL = new RideElementType("STRING_LITERAL"); IElementType STRUCT_CALL = new RideElementType("STRUCT_CALL"); + IElementType THEN_BLOCK = new RideElementType("THEN_BLOCK"); IElementType TUPLE_DEFINITION = new RideElementType("TUPLE_DEFINITION"); IElementType TUPLE_EXPR = new RideElementType("TUPLE_EXPR"); IElementType TUPLE_TYPE = new RideElementType("TUPLE_TYPE"); @@ -370,6 +371,9 @@ else if (type == STRING_LITERAL) { else if (type == STRUCT_CALL) { return new RideStructCallImpl(node); } + else if (type == THEN_BLOCK) { + return new RideThenBlockImpl(node); + } else if (type == TUPLE_DEFINITION) { return new RideTupleDefinitionImpl(node); } diff --git a/src/main/gen/com/wavesplatform/rideplugin/psi/RideVisitor.java b/src/main/gen/com/wavesplatform/rideplugin/psi/RideVisitor.java index d6610da..e1e12bb 100644 --- a/src/main/gen/com/wavesplatform/rideplugin/psi/RideVisitor.java +++ b/src/main/gen/com/wavesplatform/rideplugin/psi/RideVisitor.java @@ -286,6 +286,10 @@ public void visitStructCall(@NotNull RideStructCall o) { visitExpr(o); } + public void visitThenBlock(@NotNull RideThenBlock o) { + visitCompositeElement(o); + } + public void visitTupleDefinition(@NotNull RideTupleDefinition o) { visitCompositeElement(o); } diff --git a/src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideIfExprImpl.java b/src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideIfExprImpl.java index e37dd4f..1ccad93 100644 --- a/src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideIfExprImpl.java +++ b/src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideIfExprImpl.java @@ -27,34 +27,16 @@ public void accept(@NotNull PsiElementVisitor visitor) { else super.accept(visitor); } - @Override - @Nullable - public RideBlockState getBlockState() { - return PsiTreeUtil.getChildOfType(this, RideBlockState.class); - } - - @Override - @Nullable - public RideClosureExpr getClosureExpr() { - return PsiTreeUtil.getChildOfType(this, RideClosureExpr.class); - } - - @Override - @Nullable - public RideElseBlock getElseBlock() { - return PsiTreeUtil.getChildOfType(this, RideElseBlock.class); - } - @Override @NotNull - public List getElseIfBlockList() { - return PsiTreeUtil.getChildrenOfTypeAsList(this, RideElseIfBlock.class); + public RideIfCond getIfCond() { + return notNullChild(PsiTreeUtil.getChildOfType(this, RideIfCond.class)); } @Override - @Nullable - public RideIfCond getIfCond() { - return PsiTreeUtil.getChildOfType(this, RideIfCond.class); + @NotNull + public RideThenBlock getThenBlock() { + return notNullChild(PsiTreeUtil.getChildOfType(this, RideThenBlock.class)); } } diff --git a/src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideThenBlockImpl.java b/src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideThenBlockImpl.java new file mode 100644 index 0000000..decb08a --- /dev/null +++ b/src/main/gen/com/wavesplatform/rideplugin/psi/impl/RideThenBlockImpl.java @@ -0,0 +1,60 @@ +// This is a generated file. Not intended for manual editing. +package com.wavesplatform.rideplugin.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; +import static com.wavesplatform.rideplugin.psi.RideTypes.*; +import com.intellij.extapi.psi.ASTWrapperPsiElement; +import com.wavesplatform.rideplugin.psi.*; + +public class RideThenBlockImpl extends ASTWrapperPsiElement implements RideThenBlock { + + public RideThenBlockImpl(@NotNull ASTNode node) { + super(node); + } + + public void accept(@NotNull RideVisitor visitor) { + visitor.visitThenBlock(this); + } + + @Override + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof RideVisitor) accept((RideVisitor)visitor); + else super.accept(visitor); + } + + @Override + @Nullable + public RideBlockState getBlockState() { + return PsiTreeUtil.getChildOfType(this, RideBlockState.class); + } + + @Override + @Nullable + public RideClosureExpr getClosureExpr() { + return PsiTreeUtil.getChildOfType(this, RideClosureExpr.class); + } + + @Override + @Nullable + public RideElseBlock getElseBlock() { + return PsiTreeUtil.getChildOfType(this, RideElseBlock.class); + } + + @Override + @NotNull + public List getElseIfBlockList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, RideElseIfBlock.class); + } + + @Override + @Nullable + public RideIfCond getIfCond() { + return PsiTreeUtil.getChildOfType(this, RideIfCond.class); + } + +} diff --git a/src/main/grammars/Ride.bnf b/src/main/grammars/Ride.bnf index e2669f4..d98aa59 100644 --- a/src/main/grammars/Ride.bnf +++ b/src/main/grammars/Ride.bnf @@ -211,7 +211,8 @@ index_argument ::= argument private prefix_group ::= if_expr -if_expr ::= IF if_cond THEN (closure_expr | block_state) else_if_block* else_block? +if_expr ::= IF if_cond then_block +then_block ::= THEN (closure_expr | block_state) else_if_block* else_block? | IF LPAREN if_cond RPAREN THEN (closure_expr | block_state) else_if_block* else_block? {pin(".*")=1} if_cond ::= expr | (LPAREN expr LPAREN) //todo fix??? diff --git a/src/main/kotlin/com/wavesplatform/rideplugin/RideFile.kt b/src/main/kotlin/com/wavesplatform/rideplugin/RideFile.kt index 96e0633..f23aeac 100644 --- a/src/main/kotlin/com/wavesplatform/rideplugin/RideFile.kt +++ b/src/main/kotlin/com/wavesplatform/rideplugin/RideFile.kt @@ -11,6 +11,6 @@ class RideFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, RideL } override fun toString(): String { - return "Ride File" + return "RIDE" } -} \ No newline at end of file +} diff --git a/src/main/kotlin/com/wavesplatform/rideplugin/RideFileType.kt b/src/main/kotlin/com/wavesplatform/rideplugin/RideFileType.kt index f688d25..25efc63 100644 --- a/src/main/kotlin/com/wavesplatform/rideplugin/RideFileType.kt +++ b/src/main/kotlin/com/wavesplatform/rideplugin/RideFileType.kt @@ -5,7 +5,7 @@ import javax.swing.Icon class RideFileType : LanguageFileType(RideLanguage.INSTANCE) { override fun getName(): String { - return "Ride File" + return "RIDE" } override fun getDescription(): String { @@ -24,4 +24,4 @@ class RideFileType : LanguageFileType(RideLanguage.INSTANCE) { @JvmStatic val INSTANCE = RideFileType() } -} \ No newline at end of file +} diff --git a/src/main/kotlin/com/wavesplatform/rideplugin/formatter/RideFormattingModelBuilder.kt b/src/main/kotlin/com/wavesplatform/rideplugin/formatter/RideFormattingModelBuilder.kt index 92c5486..c175119 100644 --- a/src/main/kotlin/com/wavesplatform/rideplugin/formatter/RideFormattingModelBuilder.kt +++ b/src/main/kotlin/com/wavesplatform/rideplugin/formatter/RideFormattingModelBuilder.kt @@ -96,7 +96,11 @@ class RideFormattingModelBuilder : FormattingModelBuilder { RideTypes.CALL_ARGUMENTS, RideTypes.ARRAY_CALL_ARGUMENTS, //RideTypes.COMMENT - -> Indent.getNormalIndent(false) + -> Indent.getNormalIndent(false) + + RideTypes.ELSE_BLOCK, + RideTypes.THEN_BLOCK, + -> Indent.getContinuationIndent() //RideTypes.CALL_ARGUMENTS -> Indent.getNormalIndent(false) @@ -118,7 +122,7 @@ class RideFormattingModelBuilder : FormattingModelBuilder { //RideTypes.ARRAY_EXPR, //RideTypes.CALL_INDEX_CHAIN //RideTypes.CALL_ARGUMENTS - -> Indent.getNormalIndent(false) + -> Indent.getNormalIndent(false) //RideTypes.CALL_ARGUMENTS, //RideTypes.ARRAY_CALL_ARGUMENTS -> Indent.getNormalIndent(true) diff --git a/src/main/kotlin/com/wavesplatform/rideplugin/highlighter/RideSyntaxHighlighter.kt b/src/main/kotlin/com/wavesplatform/rideplugin/highlighter/RideSyntaxHighlighter.kt index 18eefa5..9038a9c 100644 --- a/src/main/kotlin/com/wavesplatform/rideplugin/highlighter/RideSyntaxHighlighter.kt +++ b/src/main/kotlin/com/wavesplatform/rideplugin/highlighter/RideSyntaxHighlighter.kt @@ -12,7 +12,7 @@ import com.wavesplatform.rideplugin.parser.RideParserDefinition class RideSyntaxHighlighter : SyntaxHighlighterBase() { - private val attributes: Map = HashMap() + private val attributes: MutableMap = HashMap() companion object { val KEYWORDS = TextAttributesKey.createTextAttributesKey("RIDE_KEYWORD", DefaultLanguageHighlighterColors.KEYWORD) @@ -65,4 +65,4 @@ class RideSyntaxHighlighter : SyntaxHighlighterBase() { override fun getTokenHighlights(tokenType: IElementType): Array { return pack(attributes[tokenType]) } -} \ No newline at end of file +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 9536d81..1e7183c 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -13,12 +13,12 @@ - + @@ -65,7 +65,7 @@ - + @@ -74,4 +74,4 @@ - \ No newline at end of file +