From 09904348401a47b30f5255260871b3cb6bead9f1 Mon Sep 17 00:00:00 2001 From: Arsen Nagdalian Date: Wed, 15 Jul 2020 13:59:43 +0300 Subject: [PATCH] [Parser] Modify parser so that it could parse contract description blocks of functions --- .../parsing/KotlinExpressionParsing.java | 37 +++++++++++++++++++ .../kotlin/parsing/KotlinParsing.java | 8 ++++ 2 files changed, 45 insertions(+) diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java index 12840cf4ffc..cc87ec933f7 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java +++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java @@ -1047,6 +1047,43 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { } } + public void parseContractDescriptionBlock() { + assert _at(CONTRACT_KEYWORD); + + advance(); // CONTRACT_KEYWORD + + parseContractEffectList(); + } + + private void parseContractEffectList() { + PsiBuilder.Marker block = mark(); + + expect(LBRACKET, "Expecting '['"); + myBuilder.enableNewlines(); + + parseContractEffects(); + + expect(RBRACKET, "Expecting ']'"); + myBuilder.restoreNewlinesState(); + + block.done(CONTRACT_EFFECT_LIST); + } + + private void parseContractEffects() { + while (true) { + if (at(COMMA)) errorAndAdvance("Expecting a contract effect"); + if (at(RBRACKET)) { + break; + } + PsiBuilder.Marker effect = mark(); + parseExpression(); + effect.done(CONTRACT_EFFECT); + + if (!at(COMMA)) break; + advance(); // COMMA + } + } + /* * SimpleName */ diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java index 1fbd6c71d20..d60a09b7c32 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java +++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java @@ -1673,6 +1673,8 @@ public class KotlinParsing extends AbstractKotlinParsing { parseTypeConstraintsGuarded(typeParameterListOccurred); + parseFunctionContract(); + if (at(SEMICOLON)) { advance(); // SEMICOLON } @@ -1993,6 +1995,12 @@ public class KotlinParsing extends AbstractKotlinParsing { constraint.done(TYPE_CONSTRAINT); } + private void parseFunctionContract() { + if (at(CONTRACT_KEYWORD)) { + myExpressionParsing.parseContractDescriptionBlock(); + } + } + /* * typeParameter * : modifiers SimpleName (":" userType)?