Skip to content

Commit 8d85260

Browse files
committed
feat: setup base classes for language support
1 parent e5533bf commit 8d85260

24 files changed

+502
-0
lines changed

build.gradle.kts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,26 @@ kover {
133133
}
134134

135135
tasks {
136+
withType<KotlinCompile> {
137+
dependsOn(generateParser)
138+
}
139+
140+
generateLexer {
141+
sourceFile.set(file("src/main/kotlin/com/github/xepozz/php_opcodes_language/language/parser/PHPOp.flex"))
142+
targetOutputDir.set(file("src/main/gen/com/github/xepozz/php_opcodes_language/language/parser"))
143+
purgeOldFiles.set(true)
144+
}
145+
146+
generateParser {
147+
dependsOn(generateLexer)
148+
149+
sourceFile.set(file("src/main/kotlin/com/github/xepozz/php_opcodes_language/language/parser/PHPOp.bnf"))
150+
targetRootOutputDir.set(file("src/main/gen"))
151+
pathToParser.set("/com/github/xepozz/php_opcodes_language/language/parser/PHPOpParser")
152+
pathToPsiRoot.set("/com/github/xepozz/php_opcodes_language/language/psi")
153+
purgeOldFiles.set(true)
154+
}
155+
136156
wrapper {
137157
gradleVersion = providers.gradleProperty("gradleVersion").get()
138158
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.github.xepozz.php_opcodes_language
2+
3+
import com.intellij.openapi.util.IconLoader
4+
import kotlin.jvm.java
5+
6+
object PHPOpIcons {
7+
@JvmStatic
8+
val FILE = IconLoader.getIcon("/icons/php-op.svg", PHPOpIcons::class.java)
9+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.intellij.lang.annotation.AnnotationHolder
4+
import com.intellij.lang.annotation.Annotator
5+
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
6+
import com.intellij.openapi.editor.colors.TextAttributesKey
7+
import com.intellij.psi.PsiElement
8+
9+
class PHPOpAnnotator : Annotator {
10+
override fun annotate(element: PsiElement, holder: AnnotationHolder) {
11+
}
12+
13+
companion object {
14+
val PATTERN_HIGHLIGHT = TextAttributesKey.createTextAttributesKey(
15+
"PHP_OPCODES_LANGUAGE_PATTERN",
16+
DefaultLanguageHighlighterColors.STRING,
17+
)
18+
val REFERENCE_DECLARATION_HIGHLIGHT = TextAttributesKey.createTextAttributesKey(
19+
"PHP_OPCODES_LANGUAGE_DIRECTIVE",
20+
DefaultLanguageHighlighterColors.FUNCTION_DECLARATION,
21+
)
22+
val REFERENCE_USAGE_HIGHLIGHT = TextAttributesKey.createTextAttributesKey(
23+
"PHP_OPCODES_LANGUAGE_ARGUMENT",
24+
DefaultLanguageHighlighterColors.FUNCTION_CALL,
25+
)
26+
val BLOCK_NAME_HIGHLIGHT = TextAttributesKey.createTextAttributesKey(
27+
"PHP_OPCODES_LANGUAGE_BLOCK_NAME",
28+
DefaultLanguageHighlighterColors.CLASS_NAME,
29+
)
30+
private val IDENTIFIER_HIGHLIGHT = TextAttributesKey.createTextAttributesKey(
31+
"PHP_OPCODES_LANGUAGE_IDENTIFIER",
32+
DefaultLanguageHighlighterColors.KEYWORD,
33+
)
34+
}
35+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.intellij.lang.BracePair
4+
import com.intellij.lang.PairedBraceMatcher
5+
import com.intellij.psi.PsiFile
6+
import com.intellij.psi.tree.IElementType
7+
8+
class PHPOpBraceMatcher : PairedBraceMatcher {
9+
private val bracePairs = emptyArray<BracePair>()
10+
11+
override fun getPairs() = bracePairs
12+
13+
override fun isPairedBracesAllowedBeforeType(
14+
p0: IElementType,
15+
p1: IElementType?
16+
) = true
17+
18+
override fun getCodeConstructStart(
19+
file: PsiFile,
20+
openingBraceOffset: Int
21+
): Int = openingBraceOffset
22+
23+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.intellij.lang.Commenter
4+
5+
class PHPOpCommenter : Commenter {
6+
override fun getLineCommentPrefix(): String = ";"
7+
8+
override fun getBlockCommentPrefix(): String? = null
9+
10+
override fun getBlockCommentSuffix(): String? = null
11+
12+
override fun getCommentedBlockCommentPrefix(): String? = null
13+
14+
override fun getCommentedBlockCommentSuffix(): String? = null
15+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.intellij.extapi.psi.PsiFileBase
4+
import com.intellij.psi.FileViewProvider
5+
6+
class PHPOpFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, PHPOpLanguage.INSTANCE) {
7+
override fun getFileType() = PHPOpFileType.INSTANCE
8+
9+
override fun toString() = "PHP Opcodes File"
10+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.github.xepozz.php_opcodes_language.PHPOpIcons
4+
import com.intellij.openapi.fileTypes.LanguageFileType
5+
import java.io.Serializable
6+
7+
class PHPOpFileType private constructor() : LanguageFileType(PHPOpLanguage.INSTANCE), Serializable {
8+
override fun getName() = "PHP Opcodes"
9+
10+
override fun getDescription() = "PHP Opcodes language"
11+
12+
override fun getDefaultExtension() = ""
13+
14+
override fun getIcon() = PHPOpIcons.FILE
15+
16+
companion object {
17+
@JvmStatic
18+
val INSTANCE = PHPOpFileType()
19+
}
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.intellij.lang.ASTNode
4+
import com.intellij.lang.folding.FoldingBuilderEx
5+
import com.intellij.lang.folding.FoldingDescriptor
6+
import com.intellij.openapi.editor.Document
7+
import com.intellij.openapi.project.DumbAware
8+
import com.intellij.psi.PsiElement
9+
10+
class PHPOpFoldingBuilder : FoldingBuilderEx(), DumbAware {
11+
override fun buildFoldRegions(root: PsiElement, document: Document, quick: Boolean) = emptyArray<FoldingDescriptor>()
12+
13+
override fun getPlaceholderText(node: ASTNode) = "{ ... }"
14+
15+
override fun isCollapsedByDefault(node: ASTNode) = false
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.intellij.lang.Language
4+
5+
class PHPOpLanguage : Language("PHP Opcodes") {
6+
companion object {
7+
@JvmStatic
8+
val INSTANCE = PHPOpLanguage();
9+
}
10+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.github.xepozz.php_opcodes_language.language
2+
3+
import com.github.xepozz.php_opcodes_language.language.parser.PHPOpLexerAdapter
4+
import com.github.xepozz.php_opcodes_language.language.psi.PHPOpTypes
5+
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
6+
import com.intellij.openapi.editor.HighlighterColors
7+
import com.intellij.openapi.editor.colors.TextAttributesKey
8+
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase
9+
import com.intellij.psi.TokenType
10+
import com.intellij.psi.tree.IElementType
11+
12+
class PHPOpSyntaxHighlighter : SyntaxHighlighterBase() {
13+
override fun getHighlightingLexer() = PHPOpLexerAdapter()
14+
15+
override fun getTokenHighlights(tokenType: IElementType) = when (tokenType) {
16+
PHPOpTypes.NUMBER -> NUMBER_KEYS
17+
// PHPOpTypes.TEXT -> TEXT_KEYS
18+
PHPOpTypes.COMMENT -> COMMENT_KEYS
19+
TokenType.BAD_CHARACTER -> BAD_CHAR_KEYS
20+
else -> EMPTY_KEYS
21+
}
22+
23+
companion object {
24+
private val BAD_CHAR_KEYS = arrayOf(
25+
HighlighterColors.BAD_CHARACTER,
26+
)
27+
28+
private val COMMENT_KEYS = arrayOf(
29+
DefaultLanguageHighlighterColors.DOC_COMMENT
30+
)
31+
private val TEXT_KEYS = arrayOf(
32+
DefaultLanguageHighlighterColors.STRING
33+
)
34+
private val NUMBER_KEYS = arrayOf(
35+
DefaultLanguageHighlighterColors.NUMBER
36+
)
37+
private val HEREDOC_MARKER_KEYS = arrayOf(
38+
DefaultLanguageHighlighterColors.KEYWORD
39+
)
40+
private val HEREDOC_CONTENT_KEYS = arrayOf(
41+
DefaultLanguageHighlighterColors.STRING
42+
)
43+
private val EMPTY_KEYS = emptyArray<TextAttributesKey>()
44+
}
45+
}

0 commit comments

Comments
 (0)