Skip to content

Commit 7a4fdc1

Browse files
committed
Fix documentation for empty scripts
1 parent d62ea78 commit 7a4fdc1

File tree

6 files changed

+60
-13
lines changed

6 files changed

+60
-13
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# intellij-runescript Changelog
22

33
## [Unreleased]
4+
### Fixed
5+
6+
- Fix documentation for empty scripts.
47

58
## [1.4.0] - 2023-10-15
69

src/main/gen/io/runescript/plugin/lang/parser/RsParser.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
import com.intellij.lang.PsiBuilder;
55
import com.intellij.lang.PsiBuilder.Marker;
66
import static io.runescript.plugin.lang.psi.RsElementTypes.*;
7-
import static com.intellij.lang.parser.GeneratedParserUtilBase.*;
7+
import static io.runescript.plugin.lang.parser.RsParserUtil.*;
88
import com.intellij.psi.tree.IElementType;
99
import com.intellij.lang.ASTNode;
1010
import com.intellij.psi.tree.TokenSet;
1111
import com.intellij.lang.PsiParser;
1212
import com.intellij.lang.LightPsiParser;
13+
import static com.intellij.lang.WhitespacesBinders.*;
1314

1415
@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"})
1516
public class RsParser implements PsiParser, LightPsiParser {
@@ -1204,6 +1205,8 @@ public static boolean Script(PsiBuilder b, int l) {
12041205
r = r && Script_5(b, l + 1);
12051206
r = r && Script_6(b, l + 1);
12061207
r = r && StatementList(b, l + 1);
1208+
register_hook_(b, LEFT_BINDER, SCRIPT_LEFT_BINDER);
1209+
register_hook_(b, RIGHT_BINDER, SCRIPT_RIGHT_BINDER);
12071210
exit_section_(b, m, SCRIPT, r);
12081211
return r;
12091212
}
@@ -1261,6 +1264,7 @@ public static boolean StatementList(PsiBuilder b, int l) {
12611264
if (!Statement(b, l + 1)) break;
12621265
if (!empty_element_parsed_guard_(b, "StatementList", c)) break;
12631266
}
1267+
register_hook_(b, LEFT_BINDER, GREEDY_LEFT_BINDER);
12641268
exit_section_(b, l, m, true, false, null);
12651269
return true;
12661270
}

src/main/grammars/RuneScript.bnf

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
psiPackage="io.runescript.plugin.lang.psi"
99
psiImplPackage="io.runescript.plugin.lang.psi.impl"
1010
psiImplUtilClass="io.runescript.plugin.lang.psi.RsPsiImplUtil"
11+
parserUtilClass="io.runescript.plugin.lang.parser.RsParserUtil"
1112
elementTypeHolderClass="io.runescript.plugin.lang.psi.RsElementTypes"
1213
elementTypeClass="io.runescript.plugin.lang.psi.RsElementType"
1314
tokenTypeClass="io.runescript.plugin.lang.psi.RsElementType"
@@ -25,6 +26,9 @@
2526
implements("Script")="io.runescript.plugin.lang.psi.RsNamedElement"
2627
implements("Script|HookFragment")="io.runescript.plugin.lang.psi.type.inference.RsInferenceDataHolder"
2728
classHeader="// This class is automatically generated. Do not edit."
29+
parserImports=[
30+
"static com.intellij.lang.WhitespacesBinders.*"
31+
]
2832
tokens=[
2933
LBRACKET='['
3034
RBRACKET=']'
@@ -57,6 +61,10 @@
5761
File ::= Script*
5862

5963
Script ::= '[' NameLiteral ',' NameLiteral ']' ParameterList? ReturnList? StatementList {
64+
hooks=[
65+
leftBinder="SCRIPT_LEFT_BINDER"
66+
rightBinder="SCRIPT_RIGHT_BINDER"
67+
]
6068
stubClass="io.runescript.plugin.lang.stubs.RsScriptStub"
6169
elementTypeFactory = "io.runescript.plugin.lang.stubs.StubElementTypeFactory.create"
6270
implements="com.intellij.psi.NavigatablePsiElement"
@@ -85,6 +93,9 @@ TypeName ::= TYPE_LITERAL {
8593
}
8694
StatementList ::= Statement* {
8795
mixin="io.runescript.plugin.lang.psi.mixin.RsStatementListMixin"
96+
hooks=[
97+
leftBinder="GREEDY_LEFT_BINDER"
98+
]
8899
}
89100
Statement ::= BlockStatement
90101
| IfStatement

src/main/kotlin/io/runescript/plugin/ide/doc/RsDocumentationProvider.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ import com.intellij.lang.documentation.DocumentationSettings
88
import com.intellij.openapi.editor.colors.TextAttributesKey
99
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil
1010
import com.intellij.psi.*
11-
import com.intellij.psi.tree.TokenSet
11+
import com.intellij.psi.util.childrenOfType
1212
import com.intellij.psi.util.parentOfType
13-
import com.intellij.psi.util.siblings
14-
import com.intellij.psi.util.skipTokens
1513
import io.runescript.plugin.ide.doc.RsDocRenderer.renderRsDoc
1614
import io.runescript.plugin.ide.highlight.RsSyntaxHighlighterColors
1715
import io.runescript.plugin.lang.doc.psi.api.RsDoc
@@ -194,7 +192,5 @@ private fun StringBuilder.appendColon(text: String = ":") {
194192
}
195193

196194
fun RsScript.findDoc(): RsDoc? {
197-
return siblings(false, withSelf = false)
198-
.skipTokens(TokenSet.WHITE_SPACE)
199-
.firstOrNull() as? RsDoc
195+
return childrenOfType<RsDoc>().firstOrNull()
200196
}

src/main/kotlin/io/runescript/plugin/lang/doc/psi/impl/RsDocImpl.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ package io.runescript.plugin.lang.doc.psi.impl
77
import com.intellij.lang.Language
88
import com.intellij.psi.impl.source.tree.LazyParseablePsiElement
99
import com.intellij.psi.tree.IElementType
10-
import com.intellij.psi.tree.TokenSet
11-
import com.intellij.psi.util.siblings
12-
import com.intellij.psi.util.skipTokens
10+
import com.intellij.psi.util.parentOfType
1311
import io.runescript.plugin.lang.RuneScript
1412
import io.runescript.plugin.lang.doc.getChildOfType
1513
import io.runescript.plugin.lang.doc.getChildrenOfType
@@ -28,9 +26,7 @@ class RsDocImpl(buffer: CharSequence?) : LazyParseablePsiElement(RsDocTokens.RSD
2826
override fun getTokenType(): IElementType = RsTokenTypes.DOC_COMMENT
2927

3028
override fun getOwner(): RsScript? {
31-
return siblings(true, withSelf = false)
32-
.skipTokens(TokenSet.WHITE_SPACE)
33-
.firstOrNull() as? RsScript
29+
return parentOfType<RsScript>()
3430
}
3531

3632
override fun getDefaultSection(): RsDocSection = getChildOfType()!!
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.runescript.plugin.lang.parser
2+
3+
import com.intellij.lang.WhitespacesAndCommentsBinder
4+
import com.intellij.lang.parser.GeneratedParserUtilBase
5+
import com.intellij.openapi.util.text.StringUtil
6+
import com.intellij.psi.TokenType
7+
import io.runescript.plugin.lang.psi.RsTokenTypes
8+
9+
object RsParserUtil : GeneratedParserUtilBase() {
10+
11+
@JvmField
12+
val SCRIPT_LEFT_BINDER = WhitespacesAndCommentsBinder { tokens, _, _ ->
13+
for (idx in tokens.indices.reversed()) {
14+
if (tokens[idx] == RsTokenTypes.DOC_COMMENT) {
15+
return@WhitespacesAndCommentsBinder idx
16+
}
17+
}
18+
return@WhitespacesAndCommentsBinder tokens.size
19+
}
20+
21+
@JvmField
22+
val SCRIPT_RIGHT_BINDER = WhitespacesAndCommentsBinder { tokens, _, getter ->
23+
if (tokens.isEmpty()) return@WhitespacesAndCommentsBinder 0
24+
25+
var result = 0
26+
tokens@ for (idx in tokens.indices) {
27+
val tokenType = tokens[idx]
28+
when (tokenType) {
29+
TokenType.WHITE_SPACE -> if (StringUtil.containsLineBreak(getter[idx])) break@tokens
30+
RsTokenTypes.LINE_COMMENT, RsTokenTypes.BLOCK_COMMENT -> result = idx + 1
31+
else -> break@tokens
32+
}
33+
}
34+
35+
return@WhitespacesAndCommentsBinder result
36+
}
37+
}

0 commit comments

Comments
 (0)