Skip to content

Commit 0d54292

Browse files
committed
Adding more code folding logic (reifications, switch block , array, map, and object literals)
1 parent 4b949fb commit 0d54292

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
# Changelog
2+
## 1.6.3
3+
* Added: Support for code folding for switch expressions, arrays, maps and object literals.
4+
* Changed: formatter now removes spaces between expressions and semicolons
5+
* bugfix: Fixed incorrect priority in parser (ternaryExpressions must be parsed before coalescingExpressions)
6+
27
## 1.6.2
38
* Added: Null coalescing annotations (#1208)
49
* Fixed: Another constraint refers to owning typeParameter issue

src/main/java/com/intellij/plugins/haxe/ide/folding/HaxeFoldingBuilder.java

+33-7
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ private static void buildFolding(@NotNull ASTNode node, List<FoldingDescriptor>
153153
descriptor = buildImportsFolding(node);
154154
} else if (isCodeBlock(elementType)) {
155155
descriptor = buildCodeBlockFolding(node);
156+
} else if (isReificationBlock(elementType)) {
157+
descriptor = buildReificationFolding(node);
158+
} else if (isCollectionLiteral(elementType)) {
159+
descriptor = buildCollectionBlockFolding(node);
156160
} else if (isBodyBlock(elementType)) {
157161
descriptor = buildBodyBlockFolding(node);
158162
} else if (isComment(elementType, node)) {
@@ -270,12 +274,18 @@ private static void buildCCMarkerRegions(List<FoldingDescriptor> descriptors, Li
270274
}
271275

272276
private static boolean isCodeBlock(IElementType elementType) {
273-
return elementType == BLOCK_STATEMENT;
277+
return BLOCK_TYPES.contains(elementType);
278+
}
279+
private static boolean isReificationBlock(IElementType elementType) {
280+
return elementType == MACRO_EXPRESSION_REIFICATION;
274281
}
275282

276283
private static boolean isBodyBlock(IElementType elementType) {
277284
return CLASS_BODY_TYPES.contains(elementType);
278285
}
286+
private static boolean isCollectionLiteral(IElementType elementType) {
287+
return COLLECTION_LITERAL.contains(elementType);
288+
}
279289

280290
private static boolean isComment(IElementType elementType, ASTNode node) {
281291
return ONLY_COMMENTS.contains(elementType);
@@ -361,19 +371,35 @@ private static FoldingDescriptor buildCodeBlockFolding(@NotNull ASTNode node) {
361371
final ASTNode openBrace = node.getFirstChildNode();
362372
final ASTNode closeBrace = node.getLastChildNode();
363373

364-
return buildBlockFolding(node, openBrace, closeBrace);
374+
return buildBlockFolding(node, openBrace, closeBrace, PLCURLY, PRCURLY);
375+
}
376+
private static FoldingDescriptor buildReificationFolding(@NotNull ASTNode node) {
377+
// MACRO_EXPRESSION_REIFICATION contains a set of different reification expressions so we need to go one level deeper.
378+
ASTNode reification = node.getFirstChildNode();
379+
380+
final ASTNode openBrace = reification.getFirstChildNode().getTreeNext();
381+
final ASTNode closeBrace = reification.getLastChildNode();
382+
383+
return buildBlockFolding(node, openBrace, closeBrace, PLCURLY, PRCURLY);
384+
}
385+
386+
private static FoldingDescriptor buildCollectionBlockFolding(@NotNull ASTNode node) {
387+
final ASTNode openBrace = node.getFirstChildNode();
388+
final ASTNode closeBrace = node.getLastChildNode();
389+
390+
return buildBlockFolding(node, openBrace, closeBrace, PLBRACK, PRBRACK);
365391
}
366392

367393
private static FoldingDescriptor buildBodyBlockFolding(@NotNull ASTNode node) {
368-
final ASTNode openBrace = UsefulPsiTreeUtil.getPrevSiblingSkipWhiteSpacesAndComments(node);
369-
final ASTNode closeBrace = UsefulPsiTreeUtil.getNextSiblingSkipWhiteSpacesAndComments(node);
394+
final ASTNode openBrace = node.getFirstChildNode();
395+
final ASTNode closeBrace = node.getLastChildNode();
370396

371-
return buildBlockFolding(node, openBrace, closeBrace);
397+
return buildBlockFolding(node, openBrace, closeBrace, PLCURLY, PRCURLY );
372398
}
373399

374-
private static FoldingDescriptor buildBlockFolding(@NotNull ASTNode node, ASTNode openBrace, ASTNode closeBrace) {
400+
private static FoldingDescriptor buildBlockFolding(@NotNull ASTNode node, ASTNode openBrace, ASTNode closeBrace, IElementType openElementType, IElementType closeElementType) {
375401
TextRange textRange;
376-
if (openBrace != null && closeBrace != null && openBrace.getElementType() == PLCURLY && closeBrace.getElementType() == PRCURLY) {
402+
if (openBrace != null && closeBrace != null && openBrace.getElementType() == openElementType && closeBrace.getElementType() == closeElementType) {
377403
textRange = new TextRange(openBrace.getTextRange().getEndOffset(), closeBrace.getStartOffset());
378404
} else {
379405
textRange = node.getTextRange();

src/main/java/com/intellij/plugins/haxe/lang/lexer/HaxeTokenTypeSets.java

+12
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,18 @@ public interface HaxeTokenTypeSets {
290290
INTERFACE_BODY
291291
);
292292

293+
TokenSet BLOCK_TYPES = TokenSet.create(
294+
BLOCK_STATEMENT,
295+
SWITCH_BLOCK,
296+
SWITCH_CASE_BLOCK,
297+
OBJECT_LITERAL
298+
);
299+
300+
TokenSet COLLECTION_LITERAL = TokenSet.create(
301+
ARRAY_LITERAL,
302+
MAP_LITERAL
303+
);
304+
293305
TokenSet CLASS_TYPES = TokenSet.create(
294306
ABSTRACT_TYPE_DECLARATION,
295307
CLASS_DECLARATION,

0 commit comments

Comments
 (0)