Skip to content

Commit aad001c

Browse files
committed
feat(inlay-hints): show as int257 hint for Int typed fields without a TL-B type
Fixes #25
1 parent 5b4ffdd commit aad001c

File tree

4 files changed

+72
-3
lines changed

4 files changed

+72
-3
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.tonstudio.tact.ide.hints
2+
3+
import com.intellij.codeInsight.hints.declarative.*
4+
import com.intellij.openapi.editor.Editor
5+
import com.intellij.psi.PsiElement
6+
import com.intellij.psi.PsiFile
7+
import org.tonstudio.tact.lang.psi.*
8+
import org.tonstudio.tact.lang.psi.types.TactBaseTypeEx.Companion.toEx
9+
import org.tonstudio.tact.lang.psi.types.TactPrimitiveTypeEx
10+
import org.tonstudio.tact.lang.psi.types.TactPrimitiveTypes
11+
import org.tonstudio.tact.lang.psi.types.TactTypeEx
12+
13+
class TactImplicitAsInt257HintsProvider : InlayHintsProvider {
14+
override fun createCollector(file: PsiFile, editor: Editor) = Collector()
15+
16+
class Collector : SharedBypassCollector {
17+
override fun collectFromElement(element: PsiElement, sink: InlayTreeSink) {
18+
if (element !is TactFieldDeclaration) return
19+
20+
val typeNode = element.type ?: return
21+
val type = element.fieldDefinition.getType(null) ?: return
22+
23+
// foo: Int
24+
if (needImplicitHint(type)) {
25+
addHint(sink, typeNode)
26+
}
27+
28+
// foo: map<Int, Int>
29+
if (typeNode is TactMapType) {
30+
val key = typeNode.keyType.toEx()
31+
val value = typeNode.valueType.toEx()
32+
33+
if (needImplicitHint(key)) {
34+
addHint(sink, typeNode.keyType!!)
35+
}
36+
if (needImplicitHint(value)) {
37+
addHint(sink, typeNode.valueType!!)
38+
}
39+
}
40+
}
41+
42+
private fun needImplicitHint(type: TactTypeEx): Boolean =
43+
type is TactPrimitiveTypeEx && type.name == TactPrimitiveTypes.INT && type.tlbType == null
44+
45+
private fun addHint(sink: InlayTreeSink, typeNode: TactType) {
46+
sink.addPresentation(
47+
InlineInlayPosition(typeNode.textRange.endOffset, true),
48+
listOf(),
49+
"Default TL-B serialization type for Int type.<br>Learn more in documentation: <a href=\"https://docs.tact-lang.org/book/integers/#common-serialization-types\">https://docs.tact-lang.org/book/integers/#common-serialization-types</a>",
50+
HintFormat.default
51+
.withColorKind(HintColorKind.TextWithoutBackground)
52+
.withHorizontalMargin(HintMarginPadding.MarginAndSmallerPadding)
53+
.withFontSize(HintFontSize.AsInEditor)
54+
) {
55+
text("as int257")
56+
}
57+
}
58+
}
59+
}

src/main/kotlin/org/tonstudio/tact/ide/hints/TacRequireExitCodeHintsProvider.kt renamed to src/main/kotlin/org/tonstudio/tact/ide/hints/TactRequireExitCodeHintsProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import org.tonstudio.tact.compiler.ExitCodeFormat
88
import org.tonstudio.tact.compiler.requireFunctionExitCode
99
import org.tonstudio.tact.lang.psi.*
1010

11-
class TacRequireExitCodeHintsProvider : InlayHintsProvider {
11+
class TactRequireExitCodeHintsProvider : InlayHintsProvider {
1212
override fun createCollector(file: PsiFile, editor: Editor) = Collector()
1313

1414
class Collector : SharedBypassCollector {

src/main/resources/META-INF/plugin.xml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,19 @@ Provides official support for <a href="https://tact-lang.org/">Tact</a> programm
9999
bundle="messages.TactBundle"
100100
nameKey="tact.inlay.hints.require.exit.code.info"
101101
group="VALUES_GROUP"
102-
implementationClass="org.tonstudio.tact.ide.hints.TacRequireExitCodeHintsProvider"
102+
implementationClass="org.tonstudio.tact.ide.hints.TactRequireExitCodeHintsProvider"
103103
isEnabledByDefault="true"
104104
providerId="tact.inlay.hints.require.exit.code.info"/>
105105

106+
<!--suppress PluginXmlCapitalization -->
107+
<codeInsight.declarativeInlayProvider language="tact"
108+
bundle="messages.TactBundle"
109+
nameKey="tact.inlay.hints.implicit.as.int257"
110+
group="VALUES_GROUP"
111+
implementationClass="org.tonstudio.tact.ide.hints.TactImplicitAsInt257HintsProvider"
112+
isEnabledByDefault="true"
113+
providerId="tact.inlay.hints.implicit.as.int257"/>
114+
106115
<codeInsight.parameterNameHints language="tact" id="TactParameterNameHintsProvider"
107116
implementationClass="org.tonstudio.tact.ide.hints.TactParameterNameHintsProvider"/>
108117

src/main/resources/messages/TactBundle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ tact.inlay.hints.variables=Variable Type Hint
22
tact.inlay.hints.get.methods=Get Method ID Hint
33
tact.inlay.hints.assembly.info=Assembly Instruction Information Hint
44
tact.inlay.hints.require.exit.code.info=Require Exit Code Hint
5-
tact.inlay.hints.gas.consumption=Assembly Sequence Gas Consumption
5+
tact.inlay.hints.gas.consumption=Assembly Sequence Gas Consumption Hint
6+
tact.inlay.hints.implicit.as.int257=Implicit `as int257` Hint

0 commit comments

Comments
 (0)