From 1bf6814de6609cdd9ca62f84467c22ce97dfcc69 Mon Sep 17 00:00:00 2001 From: Justin Tennant Date: Fri, 24 May 2019 12:48:46 -0700 Subject: [PATCH] Add brace matching/folding feature --- README.md | 4 +- build.gradle | 2 +- .../lang/psi/impl/usdPrimSpecImpl.java | 21 ------ .../justint/usdidea/lang/psi/usdPrimSpec.java | 9 --- .../folding/USDFoldingBuilder.java | 68 +++++++++++++++++++ .../highlighting/USDBraceMatcher.java | 35 ++++++++++ .../java/com/justint/usdidea/lang/USD.bnf | 2 +- src/main/resources/META-INF/change-notes.html | 6 ++ src/main/resources/META-INF/plugin.xml | 6 +- 9 files changed, 117 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/justint/usdidea/codeinsight/folding/USDFoldingBuilder.java create mode 100644 src/main/java/com/justint/usdidea/codeinsight/highlighting/USDBraceMatcher.java diff --git a/README.md b/README.md index 8f44eb9..4de6724 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ _NOTE_: This plugin is in active development and features are still being implem ## Features - `.usd`/`.usda` filetype syntax highlighting & validation + +- Brace matching/folding TODO: @@ -31,8 +33,6 @@ TODO: - Line markers for overrides, inheritance, etc -- Brace matching - - Python autocompletions for the `pxr.Usd` library ## License diff --git a/build.gradle b/build.gradle index 1043d75..0e7ab84 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group 'com.justint' -version '0.1.3' +version '0.2' sourceSets.main.java.srcDirs = ['src/main/gen','src/main/java'] diff --git a/src/main/gen/com/justint/usdidea/lang/psi/impl/usdPrimSpecImpl.java b/src/main/gen/com/justint/usdidea/lang/psi/impl/usdPrimSpecImpl.java index 21d08ec..7957c44 100644 --- a/src/main/gen/com/justint/usdidea/lang/psi/impl/usdPrimSpecImpl.java +++ b/src/main/gen/com/justint/usdidea/lang/psi/impl/usdPrimSpecImpl.java @@ -10,7 +10,6 @@ import static com.justint.usdidea.lang.psi.USDTypes.*; import com.intellij.extapi.psi.ASTWrapperPsiElement; import com.justint.usdidea.lang.psi.*; -import com.intellij.navigation.ItemPresentation; public class usdPrimSpecImpl extends ASTWrapperPsiElement implements usdPrimSpec { @@ -45,24 +44,4 @@ public usdSpecifier getSpecifier() { return findNotNullChildByClass(usdSpecifier.class); } - @Override - public String getPrimName() { - return USDPsiImplUtil.getPrimName(this); - } - - @Override - public String getPrimType() { - return USDPsiImplUtil.getPrimType(this); - } - - @Override - public String getName() { - return USDPsiImplUtil.getName(this); - } - - @Override - public ItemPresentation getPresentation() { - return USDPsiImplUtil.getPresentation(this); - } - } diff --git a/src/main/gen/com/justint/usdidea/lang/psi/usdPrimSpec.java b/src/main/gen/com/justint/usdidea/lang/psi/usdPrimSpec.java index 9931b18..37108fb 100644 --- a/src/main/gen/com/justint/usdidea/lang/psi/usdPrimSpec.java +++ b/src/main/gen/com/justint/usdidea/lang/psi/usdPrimSpec.java @@ -4,7 +4,6 @@ import java.util.List; import org.jetbrains.annotations.*; import com.intellij.psi.PsiElement; -import com.intellij.navigation.ItemPresentation; public interface usdPrimSpec extends PsiElement { @@ -17,12 +16,4 @@ public interface usdPrimSpec extends PsiElement { @NotNull usdSpecifier getSpecifier(); - String getPrimName(); - - String getPrimType(); - - String getName(); - - ItemPresentation getPresentation(); - } diff --git a/src/main/java/com/justint/usdidea/codeinsight/folding/USDFoldingBuilder.java b/src/main/java/com/justint/usdidea/codeinsight/folding/USDFoldingBuilder.java new file mode 100644 index 0000000..655e059 --- /dev/null +++ b/src/main/java/com/justint/usdidea/codeinsight/folding/USDFoldingBuilder.java @@ -0,0 +1,68 @@ +package com.justint.usdidea.codeinsight.folding; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.FoldingBuilder; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.lang.folding.NamedFoldingDescriptor; +import com.intellij.openapi.editor.Document; +import com.intellij.psi.tree.IElementType; +import com.justint.usdidea.lang.psi.USDTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class USDFoldingBuilder implements FoldingBuilder { + + private static final IElementType[] BRACKET_TYPES = new IElementType[] { + USDTypes.BODY, + USDTypes.DICT, + USDTypes.TIME_SAMPLE + }; + + @NotNull + @Override + public FoldingDescriptor[] buildFoldRegions(@NotNull ASTNode astNode, @NotNull Document document) { + List descriptors = new ArrayList<>(); + collectRegionsRecursively(astNode, document, descriptors); + return descriptors.toArray(FoldingDescriptor.EMPTY); + } + + private void collectRegionsRecursively(@NotNull final ASTNode astNode, + @NotNull final Document document, + @NotNull List descriptors) { + final IElementType elementType = astNode.getElementType(); + + if (elementType == USDTypes.METADATA) { + descriptors.add(new NamedFoldingDescriptor( + astNode, + astNode.getTextRange(), + null, + "(...)" + )); + } else if (Arrays.asList(BRACKET_TYPES).contains(elementType)) { + descriptors.add(new NamedFoldingDescriptor( + astNode, + astNode.getTextRange(), + null, + "{...}")); + } + + for (ASTNode child : astNode.getChildren(null)) { + collectRegionsRecursively(child, document, descriptors); + } + } + + @Nullable + @Override + public String getPlaceholderText(@NotNull ASTNode astNode) { + return "..."; + } + + @Override + public boolean isCollapsedByDefault(@NotNull ASTNode astNode) { + return false; + } +} diff --git a/src/main/java/com/justint/usdidea/codeinsight/highlighting/USDBraceMatcher.java b/src/main/java/com/justint/usdidea/codeinsight/highlighting/USDBraceMatcher.java new file mode 100644 index 0000000..407dc75 --- /dev/null +++ b/src/main/java/com/justint/usdidea/codeinsight/highlighting/USDBraceMatcher.java @@ -0,0 +1,35 @@ +package com.justint.usdidea.codeinsight.highlighting; + +import com.intellij.lang.BracePair; +import com.intellij.lang.PairedBraceMatcher; +import com.intellij.psi.PsiFile; +import com.intellij.psi.tree.IElementType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static com.justint.usdidea.lang.psi.USDTypes.*; + +public class USDBraceMatcher implements PairedBraceMatcher { + + private static final BracePair[] PAIRS = new BracePair[] { + new BracePair(LEFTBRACE, RIGHTBRACE, true), + new BracePair(LEFTPARENS, RIGHTPARENS, true), + new BracePair(LEFTBRACKET, RIGHTBRACKET, false) + }; + + @NotNull + @Override + public BracePair[] getPairs() { + return PAIRS; + } + + @Override + public boolean isPairedBracesAllowedBeforeType(@NotNull IElementType lBraceType, @Nullable IElementType contextType) { + return true; + } + + @Override + public int getCodeConstructStart(PsiFile file, int openingBraceOffset) { + return openingBraceOffset; + } +} diff --git a/src/main/java/com/justint/usdidea/lang/USD.bnf b/src/main/java/com/justint/usdidea/lang/USD.bnf index ea6daba..caa07b4 100644 --- a/src/main/java/com/justint/usdidea/lang/USD.bnf +++ b/src/main/java/com/justint/usdidea/lang/USD.bnf @@ -174,7 +174,7 @@ Identifier ::= alpha (alpha | number)* NamespacedIdentifier ::= Identifier (colon Identifier)+ -PrimSpec ::= Specifier Metadata? Body {methods=[getPrimName getPrimType getName getPresentation]} +PrimSpec ::= Specifier Metadata? Body Specifier ::= def [Typename] PrimName | over PrimName | class [Typename] PrimName diff --git a/src/main/resources/META-INF/change-notes.html b/src/main/resources/META-INF/change-notes.html index ac74a89..c44b018 100644 --- a/src/main/resources/META-INF/change-notes.html +++ b/src/main/resources/META-INF/change-notes.html @@ -1,6 +1,12 @@ +Version 0.2: +
    +
  • Added brace matching and block folding features
  • +
  • Improved syntax highlighting (Prim names, special metadata keywords)
  • +
  • Set a wider release version support for IDE versions 2016-2019 (builds 145-191.*)
  • +
Version 0.1:
  • Basic syntax highlighting
  • diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index d12f19f..34d1b7d 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -12,12 +12,12 @@
    • Syntax highlighting
    • Parser
    • +
    • Brace matching & block folding
    Planned features:
    • Reference Contributor implementation (Go to declaration feature)
    • Structure View
    • -
    • Brace matching
    • Line markers for overrides, inherits, and more
    ]]> @@ -35,7 +35,9 @@ - + + +