Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
### Removed

### Fixed
- Rudimentary Torque Shader Language (TLSL) support
- Syntax highlighting and checking

### Security

Expand Down
30 changes: 29 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import org.jetbrains.changelog.Changelog
import org.jetbrains.grammarkit.tasks.GenerateLexerTask
import org.jetbrains.grammarkit.tasks.GenerateParserTask
import org.jetbrains.intellij.tasks.PublishPluginTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

Expand Down Expand Up @@ -120,6 +122,32 @@ tasks {
outputs.dir("${targetRoot.get()}${pathToPsiRoot.get()}")
}

register<GenerateLexerTask>("generateTslLexer").configure {
sourceFile.set(file("src/org/lukasj/idea/torquescript/grammar/TorqueShaderLanguage.flex"))

targetDir.set("gen/org/lukasj/idea/torquescript/lexer")
targetClass.set("TslLexer")

purgeOldFiles.set(true)

outputs.file("${targetDir.get()}/${targetClass.get()}.java")
}

register<GenerateParserTask>("generateTslParser").configure {
sourceFile.set(file("src/org/lukasj/idea/torquescript/grammar/TorqueShaderLanguage.bnf"))

targetRoot.set("gen")

pathToParser.set("/org/lukasj/idea/torquescript/parser/TslParser")

pathToPsiRoot.set("/org/lukasj/idea/torquescript/psi")

purgeOldFiles.set(true)

outputs.file("${targetRoot.get()}${pathToParser.get()}.java")
outputs.dir("${targetRoot.get()}${pathToPsiRoot.get()}")
}

// https://plugins.jetbrains.com/docs/intellij/dynamic-plugins.html#diagnosing-leaks
runIde {
jvmArgs = mutableListOf("-XX:+UnlockDiagnosticVMOptions")
Expand All @@ -145,7 +173,7 @@ tasks {

// Specify the right jvm target for Kotlin
withType<KotlinCompile>().configureEach {
dependsOn("generateLexer", "generateParser")
dependsOn("generateLexer", "generateParser", "generateTslLexer", "generateTslParser")
kotlinOptions {
jvmTarget = "17"
freeCompilerArgs = listOf("-Xjvm-default=all")
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ kotlin.code.style=official
kotlin.stdlib.default.dependency = false

publishToken=token
publishChannel=stable
publishChannel=beta
pluginVersion=1.14.8

legacyBuild=false
20 changes: 19 additions & 1 deletion resources/META-INF/extensions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@
fieldName="INSTANCE"
language="TAML"
extensions="module"/>
<fileType name="Torque Shader Language"
implementationClass="org.lukasj.idea.torquescript.TslFileType"
fieldName="INSTANCE"
language="Torque Shader Language"
extensions="tlsl"/>

<!-- TAML -->
<lang.parserDefinition language="TAML"
implementationClass="org.lukasj.idea.torquescript.parser.TamlParserDefinition"/>

Expand All @@ -29,7 +35,19 @@
implementationClass="org.lukasj.idea.torquescript.annotator.TamlPathAnnotator"/>
<!-- <xml.namespaceHelper implementation="org.lukasj.idea.torquescript.editor.TamlNamespaceHelper" /> -->

<!-- <treeStructureProvider implementation="org.lukasj.idea.torquescript.editor.TSTreeStructureProvider" /> -->
<!-- Torque Shader Language -->
<lang.parserDefinition language="Torque Shader Language"
implementationClass="org.lukasj.idea.torquescript.parser.TslParserDefinition" />

<lang.syntaxHighlighterFactory language="Torque Shader Language"
implementationClass="org.lukasj.idea.torquescript.TslSyntaxHighlighterFactory"/>

<lang.braceMatcher language="Torque Shader Language"
implementationClass="org.lukasj.idea.torquescript.editor.TslBraceMatcher"/>

<colorSettingsPage implementation="org.lukasj.idea.torquescript.editor.TslColorSettingsPage"/>

<!-- TorqueScript -->

<internalFileTemplate name="TorqueScript Module"/>
<internalFileTemplate name="TorqueScript File"/>
Expand Down
19 changes: 19 additions & 0 deletions src/org/lukasj/idea/torquescript/TslFileType.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.lukasj.idea.torquescript

import com.intellij.openapi.fileTypes.LanguageFileType
import icons.TSIcons

class TslFileType : LanguageFileType(TslLanguage.INSTANCE) {
override fun getName() = "Torque Shader Language"

override fun getDescription() = "Torque Shader Language file"

override fun getDefaultExtension() = "tlsl"

override fun getIcon() = TSIcons.FILE

companion object {
@JvmField
val INSTANCE = TslFileType()
}
}
16 changes: 16 additions & 0 deletions src/org/lukasj/idea/torquescript/TslLanguage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.lukasj.idea.torquescript

import com.intellij.lang.Language
import com.intellij.lang.xml.XMLLanguage
import com.intellij.lang.xml.XMLParserDefinition
import com.intellij.psi.FileViewProvider
import com.intellij.psi.impl.source.xml.XmlFileImpl
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.IFileElementType

class TslLanguage : Language("Torque Shader Language") {
companion object {
@JvmField
val INSTANCE = TslLanguage()
}
}
12 changes: 12 additions & 0 deletions src/org/lukasj/idea/torquescript/TslSyntaxHighlighterFactory.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.lukasj.idea.torquescript

import com.intellij.openapi.fileTypes.SyntaxHighlighter
import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlighter

class TslSyntaxHighlighterFactory : SyntaxHighlighterFactory() {
override fun getSyntaxHighlighter(project: Project?, virtualFile: VirtualFile?): SyntaxHighlighter =
TslSyntaxHighlighter()
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,10 @@ import com.intellij.lang.annotation.AnnotationHolder
import com.intellij.lang.annotation.Annotator
import com.intellij.lang.annotation.HighlightSeverity
import com.intellij.openapi.editor.colors.CodeInsightColors
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import com.intellij.psi.util.elementType
import com.intellij.psi.xml.XmlAttributeValue
import com.intellij.psi.xml.XmlElementType
import com.intellij.psi.xml.XmlTokenType
import com.intellij.refactoring.suggested.startOffset
import org.lukasj.idea.torquescript.ModuleFileType
import org.lukasj.idea.torquescript.TamlFileType
import org.lukasj.idea.torquescript.TamlLanguage
import org.lukasj.idea.torquescript.psi.TSLiteralExpression
import org.lukasj.idea.torquescript.reference.TSFileReference

class TamlPathAnnotator : Annotator {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,7 @@ import com.intellij.patterns.StandardPatterns
import com.intellij.psi.PsiElement
import com.intellij.psi.TokenType
import com.intellij.psi.tree.TokenSet
import com.intellij.psi.xml.XmlAttributeValue
import com.intellij.psi.xml.XmlTokenType
import org.lukasj.idea.torquescript.TSLanguage
import org.lukasj.idea.torquescript.TamlLanguage
import org.lukasj.idea.torquescript.psi.TSFieldAssignment
import org.lukasj.idea.torquescript.psi.TSLiteralExpression
import org.lukasj.idea.torquescript.psi.TSProperty
import org.lukasj.idea.torquescript.psi.TSTypes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,8 @@ import com.intellij.codeInsight.completion.CompletionContributor
import com.intellij.codeInsight.completion.CompletionType
import com.intellij.patterns.ElementPattern
import com.intellij.patterns.PlatformPatterns.psiElement
import com.intellij.patterns.StandardPatterns
import com.intellij.psi.PsiElement
import com.intellij.psi.TokenType
import com.intellij.psi.tree.TokenSet
import com.intellij.psi.xml.XmlAttributeValue
import com.intellij.psi.xml.XmlTokenType
import org.lukasj.idea.torquescript.TSLanguage
import org.lukasj.idea.torquescript.TamlLanguage
import org.lukasj.idea.torquescript.psi.TSFieldAssignment
import org.lukasj.idea.torquescript.psi.TSLiteralExpression
import org.lukasj.idea.torquescript.psi.TSProperty
import org.lukasj.idea.torquescript.psi.TSTypes


class TamlCompletionContributor : CompletionContributor() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import com.intellij.usages.impl.rules.UsageType
import com.intellij.usages.impl.rules.UsageTypeProvider
import org.lukasj.idea.torquescript.psi.TSLiteralExpression
import org.lukasj.idea.torquescript.psi.TSTypes
import org.lukasj.idea.torquescript.psi.impl.TSFunctionIdentifierElementImpl
import org.lukasj.idea.torquescript.psi.impl.TSFunctionStatementElementImpl

object TSUsageTypes {
Expand Down
23 changes: 23 additions & 0 deletions src/org/lukasj/idea/torquescript/editor/TslBraceMatcher.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.lukasj.idea.torquescript.editor

import com.intellij.lang.BracePair
import com.intellij.lang.PairedBraceMatcher
import com.intellij.psi.PsiFile
import com.intellij.psi.tree.IElementType
import org.lukasj.idea.torquescript.psi.TslTypes

class TslBraceMatcher : PairedBraceMatcher {
override fun getPairs(): Array<BracePair> = BRACE_PAIRS

override fun isPairedBracesAllowedBeforeType(lbraceType: IElementType, contextType: IElementType?) = true

override fun getCodeConstructStart(file: PsiFile?, openingBraceOffset: Int) = openingBraceOffset

companion object {
val BRACE_PAIRS = arrayOf(
BracePair(TslTypes.LBRACE, TslTypes.RBRACE, true),
BracePair(TslTypes.LPAREN, TslTypes.RPAREN, true),
BracePair(TslTypes.LBRACK, TslTypes.RBRACK, true),
)
}
}
98 changes: 98 additions & 0 deletions src/org/lukasj/idea/torquescript/editor/TslColorSettingsPage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package org.lukasj.idea.torquescript.editor

import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.fileTypes.SyntaxHighlighter
import com.intellij.openapi.options.colors.AttributesDescriptor
import com.intellij.openapi.options.colors.ColorDescriptor
import com.intellij.openapi.options.colors.ColorSettingsPage
import icons.TSIcons
import javax.swing.Icon

class TslColorSettingsPage : ColorSettingsPage {
override fun getAttributeDescriptors(): Array<AttributesDescriptor> = DESCRIPTORS

override fun getColorDescriptors(): Array<ColorDescriptor> = ColorDescriptor.EMPTY_ARRAY

override fun getDisplayName(): String = "Torque Shader Language"

override fun getIcon(): Icon = TSIcons.FILE

override fun getHighlighter(): SyntaxHighlighter = TslSyntaxHighlighter()

override fun getDemoText(): String = """
Blueprint "diffuse"
{
struct VertData{
float3 pos : POSITION;
float2 texCoord : TEXCOORD0;
};

struct ConnectData{
float4 hpos : SV_Position;
float2 texCoord : TEXCOORD0;
};

struct FragOut{
float4 col : SV_Target;
};

VertexShader
{
#pragma entry "main"

uniform float4x4 modelview;

ConnectData main(VertData IN)
{
ConnectData OUT;

OUT.hpos = mul(modelview, float4(IN.pos, 1.0));
OUT.texCoord = IN.texCoord;

return OUT;
};
};

PixelShader
{
#pragma entry "main"

uniform sampler2D _inTex;

FragOut main(ConnectData IN)
{
FragOut OUT;
OUT.col = Sample(_inTex, IN.texCoord);
return OUT;
};
};
};
"""

override fun getAdditionalHighlightingTagToDescriptorMap(): MutableMap<String, TextAttributesKey>? = null

companion object {
private val DESCRIPTORS = arrayOf(
AttributesDescriptor("Identifier", TslSyntaxHighlightingColors.IDENTIFIER),
AttributesDescriptor("Function declaration", TslSyntaxHighlightingColors.FUNCTION_DECLARATION),
AttributesDescriptor("Function call", TslSyntaxHighlightingColors.FUNCTION_CALL),
AttributesDescriptor("Intrinsic function call", TslSyntaxHighlightingColors.INTRINSIC_FUNCTION_CALL),
AttributesDescriptor("Semantic", TslSyntaxHighlightingColors.SEMANTIC),
AttributesDescriptor("Struct type", TslSyntaxHighlightingColors.STRUCT_TYPES),
AttributesDescriptor("Number", TslSyntaxHighlightingColors.NUMBER),
AttributesDescriptor("String", TslSyntaxHighlightingColors.STRING),
AttributesDescriptor("Keyword", TslSyntaxHighlightingColors.KEYWORD),
AttributesDescriptor("Operator", TslSyntaxHighlightingColors.OPERATOR),
AttributesDescriptor("Semicolon", TslSyntaxHighlightingColors.SEMICOLON),
AttributesDescriptor("Dot", TslSyntaxHighlightingColors.DOT),
AttributesDescriptor("Comma", TslSyntaxHighlightingColors.COMMA),
AttributesDescriptor("Colon", TslSyntaxHighlightingColors.COLON),
AttributesDescriptor("Line comment", TslSyntaxHighlightingColors.LINE_COMMENT),
AttributesDescriptor("Block comment", TslSyntaxHighlightingColors.BLOCK_COMMENT),
AttributesDescriptor("Parentheses", TslSyntaxHighlightingColors.PARENTHESES),
AttributesDescriptor("Braces", TslSyntaxHighlightingColors.BRACES),
AttributesDescriptor("Brackets", TslSyntaxHighlightingColors.BRACKETS),
AttributesDescriptor("Bad value", TslSyntaxHighlightingColors.BAD_CHARACTER)
)
}
}
56 changes: 56 additions & 0 deletions src/org/lukasj/idea/torquescript/editor/TslSyntaxHighlighter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.lukasj.idea.torquescript.editor

import com.intellij.lexer.Lexer
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase
import com.intellij.psi.TokenType
import com.intellij.psi.tree.IElementType
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.ASSIGNMENT_OPERATOR
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.BAD_CHARACTER
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.BLOCK_COMMENT
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.BRACES
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.BRACKETS
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.COLON
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.IDENTIFIER
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.KEYWORD
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.LINE_COMMENT
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.NUMBER
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.OPERATOR
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.PARENTHESES
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.SEMANTIC
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.SEMICOLON
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.STRING
import org.lukasj.idea.torquescript.editor.TslSyntaxHighlightingColors.STRUCT_TYPES
import org.lukasj.idea.torquescript.lexer.TslLexerAdapter
import org.lukasj.idea.torquescript.parser.TslParserDefinition
import org.lukasj.idea.torquescript.psi.TslTypes


class TslSyntaxHighlighter : SyntaxHighlighterBase() {

override fun getHighlightingLexer(): Lexer = TslLexerAdapter()

override fun getTokenHighlights(tokenType: IElementType?): Array<TextAttributesKey> = pack(ATTRIBUTES[tokenType])

companion object {
private val ATTRIBUTES = HashMap<IElementType, TextAttributesKey>()

init
{
fillMap(ATTRIBUTES, LINE_COMMENT, TslTypes.LINE_COMMENT)
fillMap(ATTRIBUTES, BLOCK_COMMENT, TslTypes.BLOCK_COMMENT)
fillMap(ATTRIBUTES, PARENTHESES, TslTypes.LPAREN, TslTypes.RPAREN)
fillMap(ATTRIBUTES, BRACES, TslTypes.LBRACE, TslTypes.RBRACE)
fillMap(ATTRIBUTES, BRACKETS, TslTypes.LBRACK, TslTypes.RBRACK)
fillMap(ATTRIBUTES, BAD_CHARACTER, TokenType.BAD_CHARACTER)
fillMap(ATTRIBUTES, IDENTIFIER, TslTypes.IDENT)
fillMap(ATTRIBUTES, COLON, TslTypes.COLON)
fillMap(ATTRIBUTES, SEMICOLON, TslTypes.STMT_SEPARATOR)
fillMap(ATTRIBUTES, TslParserDefinition.OPERATORS, OPERATOR)
fillMap(ATTRIBUTES, TslParserDefinition.KEYWORDS, KEYWORD)
fillMap(ATTRIBUTES, TslParserDefinition.NUMBERS, NUMBER)
fillMap(ATTRIBUTES, TslParserDefinition.SEMANTICS, SEMANTIC)
fillMap(ATTRIBUTES, TslParserDefinition.ASSIGNMENT_OPERATORS, ASSIGNMENT_OPERATOR)
}
}
}
Loading