Skip to content

Commit c4fde77

Browse files
authored
Release 2.3 (#184)
### Added - Support for the latest Tact 1.4.0 ([#177](#177), [#180](#180)) - Inspections for out of range integer values in FunC and Tact - Inspections for integer division by zero in FunC and Tact - Inspections for integer overflow in FunC - Constant expression evaluation in FunC and Tact (with inline hints!) ([#22](#22)) ### Fixed - `message` and `bounced` highlight not working in Tact ([#174](#174)) - `com.intellij.diagnostic.PluginException: Template not found: Fift File` ([#182](#182)) - `Storage for FuncNamedElementIndex.storage is already registered` ([#181](#181))
1 parent ed130d0 commit c4fde77

File tree

79 files changed

+2227
-380
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+2227
-380
lines changed

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
# TON Plugin for the IntelliJ IDEs Changelog
22

3+
## [2.3.0]
4+
5+
### Added
6+
7+
- Support for the latest Tact
8+
1.4.0 ([#177](https://github.com/ton-blockchain/intellij-ton/issues/177), [#180](https://github.com/ton-blockchain/intellij-ton/issues/180))
9+
- Inspections for out of range integer values in FunC and Tact
10+
- Inspections for integer division by zero in FunC and Tact
11+
- Inspections for integer overflow in FunC
12+
- Constant expression evaluation in FunC and Tact (with inline
13+
hints!) ([#22](https://github.com/ton-blockchain/intellij-ton/issues/22))
14+
15+
### Fixed
16+
17+
- `message` and `bounced` highlight not working in Tact ([#174](https://github.com/ton-blockchain/intellij-ton/issues/174))
18+
- `com.intellij.diagnostic.PluginException: Template not found: Fift File` ([#182](https://github.com/ton-blockchain/intellij-ton/issues/182))
19+
- `Storage for FuncNamedElementIndex.storage is already registered` ([#181](https://github.com/ton-blockchain/intellij-ton/issues/181))
20+
321
## [2.2.0]
422

523
### Added
@@ -54,6 +72,7 @@
5472
## [1.0.3]
5573

5674
### Added
75+
5776
- Support try-catch statements
5877

5978
## [1.0.2]

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
org.gradle.jvmargs=-Xmx4096m
22
pluginGroup=org.ton
3-
pluginVersion=2.2.1
4-
publishChannel=release
3+
pluginVersion=2.3
4+
publishChannel=stable
55
publishToken=token
66
enableBuildSearchableOptions=false
77
# Existent IDE versions can be found in the following repos:

src/main/grammar/FuncParser.bnf

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,9 @@ fake BinExpression ::= Expression BinaryOp Expression {
325325
}
326326

327327
//noinspection BnfUnusedRule
328-
fake BinaryOp ::= '=' | '+=' | '-=' | '*=' | '/=' | '~/=' | '^/=' | '%=' | '~%=' | '^%=' | '<<=' | '>>=' | '^>>=' | '~>>=' | '&=' | '|=' | '^='
328+
fake BinaryOp ::= '=' | '+=' | '-=' | '*=' | '/=' | '~/=' | '^/=' | '%=' | '~%=' | '^%='
329+
| '<<=' | '>>=' | '^>>=' | '~>>='
330+
| '&=' | '|=' | '^='
329331
| '==' | '!='
330332
| '<' | '>' | '<=' | '>=' | '<=>'
331333
| '<<' | '>>' | '~>>' | '^>>'

src/main/grammar/TactLexer.flex

Lines changed: 185 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.ton.intellij.tact.parser;
22

33
import com.intellij.lexer.FlexLexer;
44
import com.intellij.psi.tree.IElementType;
5+
import com.intellij.util.containers.Stack;
56

67
import static com.intellij.psi.TokenType.BAD_CHARACTER;
78
import static com.intellij.psi.TokenType.WHITE_SPACE;
@@ -31,12 +32,13 @@ import static org.ton.intellij.tact.psi.TactElementTypes.*;
3132
private int zzParenDepth = 0;
3233
private boolean zzStructScope = false;
3334
private boolean zzContractScope = false;
35+
private boolean zzStructIdentifierExpected = false;
3436
%}
3537

3638
%{
3739
IElementType imbueBlockComment() {
3840
assert(zzNestedCommentLevel == 0);
39-
yybegin(YYINITIAL);
41+
popState();
4042

4143
zzStartRead = zzPostponedMarkedPos;
4244
zzPostponedMarkedPos = -1;
@@ -59,8 +61,45 @@ import static org.ton.intellij.tact.psi.TactElementTypes.*;
5961
%function advance
6062
%type IElementType
6163

64+
%{
65+
private static final class State {
66+
final int lBraceCount;
67+
final int state;
68+
69+
public State(int state, int lBraceCount) {
70+
this.state = state;
71+
this.lBraceCount = lBraceCount;
72+
}
73+
74+
@Override
75+
public String toString() {
76+
return "yystate = " + state + (lBraceCount == 0 ? "" : "lBraceCount = " + lBraceCount);
77+
}
78+
}
79+
80+
private final Stack<State> states = new Stack<State>();
81+
private int lBraceCount;
82+
83+
private int commentStart;
84+
private int commentDepth;
85+
86+
private void pushState(int state) {
87+
states.push(new State(yystate(), lBraceCount));
88+
lBraceCount = 0;
89+
yybegin(state);
90+
}
91+
92+
private void popState() {
93+
State state = states.pop();
94+
lBraceCount = state.lBraceCount;
95+
yybegin(state.state);
96+
}
97+
%}
98+
6299
%s IN_BLOCK_COMMENT
63100
%s IN_NAME_ATTRIBUTE
101+
%s STRING
102+
%s STRUCT
64103

65104
%unicode
66105

@@ -78,103 +117,24 @@ INTEGER_LITERAL_HEX = 0[xX] {HEX_DIGIT} (_?{HEX_DIGIT})*
78117
INTEGER_LITERAL_BIN = 0[bB] {BIN_DIGIT} (_?{BIN_DIGIT})*
79118
INTEGER_LITERAL_OCT = 0[oO] {OCT_DIGIT} (_?{OCT_DIGIT})*
80119
INTEGER_LITERAL= {INTEGER_LITERAL_HEX} | {INTEGER_LITERAL_BIN} | {INTEGER_LITERAL_OCT} | {INTEGER_LITERAL_DEC}
81-
STRING_LITERAL=(\"([^\"\r\n\\]|\\.)*\")
82120
IDENTIFIER=[a-zA-Z_][a-zA-Z0-9_]*
83121
FUNC_IDENTIFIER=[a-zA-Z_][a-zA-Z0-9_?!:&']*
84122

85-
%%
86-
<YYINITIAL> {
87-
{WHITE_SPACE} { return WHITE_SPACE; }
88-
89-
"/*" { yybegin(IN_BLOCK_COMMENT); yypushback(2); }
90-
"//".* { return LINE_COMMENT; }
123+
REGULAR_STRING_PART=[^\\\"]+
124+
ESCAPE_SEQUENCE=\\\\ // backslash
125+
| \\\" // double quote
126+
| \\n // newline
127+
| \\r // carriage return
128+
| \\t // tab
129+
| \\v // vertical tab
130+
| \\b // backspace
131+
| \\f // form feed
132+
| \\u\{ {HEX_DIGIT} {HEX_DIGIT}? {HEX_DIGIT}? {HEX_DIGIT}? {HEX_DIGIT}? {HEX_DIGIT}? \} // unicode escape
133+
| \\u {HEX_DIGIT} {HEX_DIGIT} {HEX_DIGIT} {HEX_DIGIT} // hex escape
134+
| \\x {HEX_DIGIT} {HEX_DIGIT} // hex escape
135+
| \\[^\n] // any other character
91136

92-
"{" { zzBlockDepth++; return LBRACE; }
93-
"}" {
94-
if (zzBlockDepth-- == 0) {
95-
zzStructScope = false;
96-
zzContractScope = false;
97-
}
98-
return RBRACE;
99-
}
100-
"[" { return LBRACK; }
101-
"]" { return RBRACK; }
102-
"(" { zzParenDepth++; return LPAREN; }
103-
")" { zzParenDepth--; return RPAREN; }
104-
":" { return COLON; }
105-
";" { return SEMICOLON; }
106-
"," { return COMMA; }
107-
"." { return DOT; }
108-
"+" { return PLUS; }
109-
"-" { return MINUS; }
110-
"*" { return MUL; }
111-
"/" { return DIV; }
112-
"%" { return REM; }
113-
"&" { return AND; }
114-
"|" { return OR; }
115-
"^" { return XOR; }
116-
"<" { return LT; }
117-
">" { return GT; }
118-
"=" { return EQ; }
119-
"?" { return Q; }
120-
"!" { return EXCL; }
121-
"+=" { return PLUSLET; }
122-
"-=" { return MINUSLET; }
123-
"*=" { return TIMESLET; }
124-
"/=" { return DIVLET; }
125-
"%=" { return MODLET; }
126-
"==" { return EQEQ; }
127-
"!=" { return EXCLEQ; }
128-
">=" { return GTEQ; }
129-
"<=" { return LTEQ; }
130-
">>" { return GTGT; }
131-
"<<" { return LTLT; }
132-
"||" { return OROR; }
133-
"&&" { return ANDAND; }
134-
"!!" { return EXCLEXCL; }
135-
"if" { return IF_KEYWORD; }
136-
"else" { return ELSE_KEYWORD; }
137-
"while" { return WHILE_KEYWORD; }
138-
"do" { return DO_KEYWORD; }
139-
"until" { return UNTIL_KEYWORD; }
140-
"repeat" { return REPEAT_KEYWORD; }
141-
"return" { return RETURN_KEYWORD; }
142-
"extends" { return EXTENDS_KEYWORD; }
143-
"mutates" { return MUTATES_KEYWORD; }
144-
"virtual" { return VIRTUAL_KEYWORD; }
145-
"override" { return OVERRIDE_KEYWORD; }
146-
"inline" { return INLINE_KEYWORD; }
147-
"native" { return NATIVE_KEYWORD; }
148-
"let" { return LET_KEYWORD; }
149-
"const" { return CONST_KEYWORD; }
150-
"fun" { return FUN_KEYWORD; }
151-
"initOf" { return INIT_OF_KEYWORD; }
152-
"as" { return AS_KEYWORD; }
153-
"abstract" { return ABSTRACT_KEYWORD; }
154-
"import" { return IMPORT_KEYWORD; }
155-
"struct" { zzStructScope = true; return STRUCT_KEYWORD; }
156-
"message" { return zzBlockDepth == 0 ? MESSAGE_KEYWORD : IDENTIFIER; }
157-
"contract" { zzContractScope = true; return CONTRACT_KEYWORD; }
158-
"trait" { return TRAIT_KEYWORD; }
159-
"with" { return WITH_KEYWORD; }
160-
"receive" { return RECEIVE_KEYWORD; }
161-
"external" { return EXTERNAL_KEYWORD; }
162-
"true" { return BOOLEAN_LITERAL; }
163-
"false" { return BOOLEAN_LITERAL; }
164-
"null" { return NULL_LITERAL; }
165-
"primitive" { return PRIMITIVE_KEYWORD; }
166-
"self" { return SELF_KEYWORD; }
167-
"map" { return MAP_KEYWORD; }
168-
"bounced" { return zzBlockDepth == 1 && zzContractScope ? BOUNCED_KEYWORD : IDENTIFIER; }
169-
"init" { return zzBlockDepth == 1 && zzParenDepth == 0 ? INIT_KEYWORD : IDENTIFIER; }
170-
"get" { return zzBlockDepth <= 1 ? GET_KEYWORD : IDENTIFIER; }
171-
"@interface" { return INTERFACE_MACRO; }
172-
"@name" { yybegin(IN_NAME_ATTRIBUTE); yypushback(5); }
173-
174-
{INTEGER_LITERAL} { return INTEGER_LITERAL; }
175-
{STRING_LITERAL} { return STRING_LITERAL; }
176-
{IDENTIFIER} { return IDENTIFIER; }
177-
}
137+
%%
178138

179139
<IN_BLOCK_COMMENT> {
180140
"/*" { if (zzNestedCommentLevel++ == 0)
@@ -190,12 +150,140 @@ FUNC_IDENTIFIER=[a-zA-Z_][a-zA-Z0-9_?!:&']*
190150
[^] { }
191151
}
192152

153+
<STRING> {
154+
{REGULAR_STRING_PART} { return REGULAR_STRING_PART; }
155+
{ESCAPE_SEQUENCE} { return ESCAPE_SEQUENCE; }
156+
\" { popState(); return CLOSE_QUOTE; }
157+
[^] { popState(); yypushback(1); }
158+
}
159+
193160
<IN_NAME_ATTRIBUTE> {
194161
"@name" { return NAME_MACRO; }
195162
"(" { zzParenDepth++; return LPAREN; }
196-
")" { zzParenDepth--; yybegin(YYINITIAL); return RPAREN; }
197-
{FUNC_IDENTIFIER} { yybegin(YYINITIAL); return FUNC_IDENTIFIER; }
198-
[^] { yybegin(YYINITIAL); yypushback(1); }
163+
")" { zzParenDepth--; popState(); return RPAREN; }
164+
{FUNC_IDENTIFIER} { popState(); return FUNC_IDENTIFIER; }
165+
[^] { popState(); yypushback(1); }
166+
}
167+
168+
{WHITE_SPACE} { return WHITE_SPACE; }
169+
\" { pushState(STRING); return OPEN_QUOTE; }
170+
171+
"/*" { pushState(IN_BLOCK_COMMENT); yypushback(2); }
172+
"//".* { return LINE_COMMENT; }
173+
174+
"{" {
175+
zzBlockDepth++;
176+
if (zzStructScope) {
177+
zzStructIdentifierExpected = true;
178+
}
179+
return LBRACE;
180+
}
181+
"}" {
182+
if (zzBlockDepth-- == 0) {
183+
zzStructScope = false;
184+
zzContractScope = false;
185+
}
186+
return RBRACE;
187+
}
188+
"[" { return LBRACK; }
189+
"]" { return RBRACK; }
190+
"(" { zzParenDepth++; return LPAREN; }
191+
")" { zzParenDepth--; return RPAREN; }
192+
":" {
193+
if (zzStructScope) {
194+
zzStructIdentifierExpected = false;
195+
}
196+
return COLON;
197+
}
198+
";" {
199+
if (zzStructScope) {
200+
zzStructIdentifierExpected = true;
201+
}
202+
return SEMICOLON;
203+
}
204+
"," { return COMMA; }
205+
"." { return DOT; }
206+
"+" { return PLUS; }
207+
"-" { return MINUS; }
208+
"*" { return MUL; }
209+
"/" { return DIV; }
210+
"%" { return REM; }
211+
"&" { return AND; }
212+
"|" { return OR; }
213+
"^" { return XOR; }
214+
"<" { return LT; }
215+
">" { return GT; }
216+
"=" { return EQ; }
217+
"?" { return Q; }
218+
"!" { return EXCL; }
219+
"~" { return TILDE; }
220+
"+=" { return PLUSLET; }
221+
"-=" { return MINUSLET; }
222+
"*=" { return TIMESLET; }
223+
"/=" { return DIVLET; }
224+
"%=" { return MODLET; }
225+
"&=" { return ANDLET; }
226+
"|=" { return ORLET; }
227+
"^=" { return XORLET; }
228+
"==" { return EQEQ; }
229+
"!=" { return EXCLEQ; }
230+
">=" { return GTEQ; }
231+
"<=" { return LTEQ; }
232+
">>" { return GTGT; }
233+
"<<" { return LTLT; }
234+
"||" { return OROR; }
235+
"&&" { return ANDAND; }
236+
"!!" { return EXCLEXCL; }
237+
"if" { return IF_KEYWORD; }
238+
"else" { return ELSE_KEYWORD; }
239+
"while" { return WHILE_KEYWORD; }
240+
"do" { return DO_KEYWORD; }
241+
"until" { return UNTIL_KEYWORD; }
242+
"repeat" { return REPEAT_KEYWORD; }
243+
"return" { return RETURN_KEYWORD; }
244+
"extends" { return EXTENDS_KEYWORD; }
245+
"mutates" { return MUTATES_KEYWORD; }
246+
"virtual" { return VIRTUAL_KEYWORD; }
247+
"override" { return OVERRIDE_KEYWORD; }
248+
"inline" { return INLINE_KEYWORD; }
249+
"native" { return NATIVE_KEYWORD; }
250+
"let" { return LET_KEYWORD; }
251+
"const" { return CONST_KEYWORD; }
252+
"fun" { return FUN_KEYWORD; }
253+
"initOf" { return INIT_OF_KEYWORD; }
254+
"as" { return AS_KEYWORD; }
255+
"abstract" { return ABSTRACT_KEYWORD; }
256+
"import" { return IMPORT_KEYWORD; }
257+
"struct" { zzStructScope = true; return STRUCT_KEYWORD; }
258+
"message" { return zzBlockDepth == 0 ? MESSAGE_KEYWORD : IDENTIFIER; }
259+
"contract" { zzContractScope = true; return CONTRACT_KEYWORD; }
260+
"trait" { return TRAIT_KEYWORD; }
261+
"with" { return WITH_KEYWORD; }
262+
"receive" { return RECEIVE_KEYWORD; }
263+
"external" { return EXTERNAL_KEYWORD; }
264+
"true" { return BOOLEAN_LITERAL; }
265+
"false" { return BOOLEAN_LITERAL; }
266+
"null" { return NULL_LITERAL; }
267+
"primitive" { return PRIMITIVE_KEYWORD; }
268+
"self" { return SELF_KEYWORD; }
269+
"map" { return MAP_KEYWORD; }
270+
"try" { return TRY_KEYWORD; }
271+
"catch" { return CATCH_KEYWORD; }
272+
"foreach" { return FOREACH_KEYWORD; }
273+
"in" { return IN_KEYWORD; }
274+
"bounced" {
275+
if (zzStructScope && zzStructIdentifierExpected) {
276+
zzStructIdentifierExpected = false;
277+
return IDENTIFIER;
278+
}
279+
return BOUNCED_KEYWORD;
199280
}
281+
"init" { return zzBlockDepth == 1 && zzParenDepth == 0 ? INIT_KEYWORD : IDENTIFIER; }
282+
"get" { return zzBlockDepth <= 1 ? GET_KEYWORD : IDENTIFIER; }
283+
"@interface" { return INTERFACE_MACRO; }
284+
"@name" { pushState(IN_NAME_ATTRIBUTE); yypushback(5); }
285+
286+
{INTEGER_LITERAL} { return INTEGER_LITERAL; }
287+
{IDENTIFIER} { return IDENTIFIER; }
200288

201289
[^] { return BAD_CHARACTER; }

0 commit comments

Comments
 (0)