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: + Version 0.1: