Skip to content

Commit

Permalink
Play around with eex style plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
Simon J committed Sep 20, 2024
1 parent 0cd69b0 commit dbf2f84
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 11 deletions.
50 changes: 43 additions & 7 deletions src/main/kotlin/com/mwnciau/rblade/RBladeFileViewProvider.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,34 @@ import com.intellij.psi.MultiplePsiFilesPerDocumentFileViewProvider
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.impl.source.PsiFileImpl
import com.intellij.psi.templateLanguages.ConfigurableTemplateLanguageFileViewProvider
import com.intellij.psi.templateLanguages.TemplateDataElementType
import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider
import com.intellij.psi.tree.IElementType
import com.mwnciau.rblade.psi.RBladeFile
import com.mwnciau.rblade.psi.RBladeOuterElementType
import com.mwnciau.rblade.psi.RBladeTypes
import org.jetbrains.plugins.ruby.ruby.lang.RubyLanguage
import java.util.concurrent.ConcurrentHashMap


class RBladeFileViewProvider(
manager: PsiManager,
virtualFile: VirtualFile,
eventSystemEnabled: Boolean
) : MultiplePsiFilesPerDocumentFileViewProvider(manager, virtualFile, eventSystemEnabled), TemplateLanguageFileViewProvider {
) : MultiplePsiFilesPerDocumentFileViewProvider(manager, virtualFile, eventSystemEnabled),
ConfigurableTemplateLanguageFileViewProvider {
companion object {
val OUTER_RBLADE = RBladeOuterElementType("Outer RBlade");
val OUTER_RBLADE = RBladeOuterElementType("Outer RBlade")
val ELEMENT_TYPE_BY_LANGUAGE_ID = ConcurrentHashMap<String, IElementType>();
}

override fun getBaseLanguage(): Language {
return RBladeLanguage.INSTANCE
}

override fun getLanguages(): MutableSet<Language> {
return mutableSetOf(RBladeLanguage.INSTANCE, HTMLLanguage.INSTANCE/*, RubyLanguage.INSTANCE*/)
return mutableSetOf(RBladeLanguage.INSTANCE, HTMLLanguage.INSTANCE, RubyLanguage.INSTANCE)
}

override fun getTemplateDataLanguage(): Language {
Expand All @@ -43,20 +48,51 @@ class RBladeFileViewProvider(
}

override fun createFile(lang: Language): PsiFile? {
if (lang === RBladeLanguage.INSTANCE) {
/*if (lang === RBladeLanguage.INSTANCE) {
return RBladeFile(this)
}
}*/

val parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(lang) ?: return null

val psiFile = parserDefinition.createFile(this)
if (lang.isKindOf(RBladeLanguage.INSTANCE)) {
return parserDefinition.createFile(this)
}

val psiFileImpl = parserDefinition.createFile(this) as PsiFileImpl
psiFileImpl.contentElementType = elementType(lang)

return psiFileImpl
/*val psiFile = parserDefinition.createFile(this)
if (lang === HTMLLanguage.INSTANCE && psiFile is PsiFileImpl) {
psiFile.contentElementType = TemplateDataElementType("HTML embedded in RBlade", RBladeLanguage.INSTANCE, RBladeTypes.HTML_TEMPLATE, OUTER_RBLADE)
}/* else if (lang === RubyLanguage.INSTANCE && psiFile is PsiFileImpl) {
psiFile.contentElementType = TemplateDataElementType("Ruby embedded in RBlade", RBladeLanguage.INSTANCE, RBladeTypes.RUBY_TEMPLATE, OUTER_RBLADE)
//return LanguageParserDefinitions.INSTANCE.forLanguage(RubyLanguage.INSTANCE).createFile(this) as PsiFileImpl;
}*/
return psiFile
return psiFile*/
}

fun elementType(lang : Language) : IElementType {
return ELEMENT_TYPE_BY_LANGUAGE_ID.computeIfAbsent(
lang.getID(),
{
languageID : String ->
val elementType : IElementType

/*if (language == RubyLanguage.INSTANCE) {
elementType = EmbeddedElixir();
} else {
elementType = new TemplateData(language);
}*/
elementType = TemplateData(language)

elementType
}
)
}

override fun supportsIncrementalReparse(rootLanguage: Language): Boolean {
return false
}
}
15 changes: 15 additions & 0 deletions src/main/kotlin/com/mwnciau/rblade/psi/HtmlElementType.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.mwnciau.rblade.psi

import com.intellij.lang.Language
import com.intellij.lang.html.HTMLLanguage
import com.intellij.psi.templateLanguages.TemplateDataElementType
import com.intellij.psi.tree.IElementType
import org.jetbrains.annotations.NonNls

class HtmlElementType : TemplateDataElementType(
"HTML_TEMPLATE",
HTMLLanguage.INSTANCE,
RBladeTypes.HTML_TEMPLATE
outerElementType,
) {
}
2 changes: 1 addition & 1 deletion src/main/kotlin/com/mwnciau/rblade/psi/RBladeTokenSets.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import com.intellij.psi.tree.TokenSet

interface RBladeTokenSets {
companion object {
val COMMENTS: TokenSet = TokenSet.create(RBladeTypes.COMMENT, RBladeTypes.RUBY_EXPRESSION)
val COMMENTS: TokenSet = TokenSet.create(RBladeTypes.COMMENT)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.mwnciau.rblade.rails

import com.intellij.lang.Language
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.fileTypes.FileType
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.tree.IElementType
import org.jetbrains.plugins.ruby.ruby.lang.psi.controlStructures.blocks.RCompoundStatement
import org.jetbrains.plugins.ruby.ruby.lang.psi.expressions.RExpression
import org.jetbrains.plugins.ruby.templates.TemplateIntegration
import org.jetbrains.plugins.ruby.templates.TemplateIntegrationUtils

class RubyRBladeIntegrationImpl : TemplateIntegration {
override fun getOuterElements(): MutableCollection<out IElementType> {
TODO("Not yet implemented")
}

override fun getContinuationElements(): MutableCollection<out IElementType> {
TODO("Not yet implemented")
}

override fun getEndElements(): MutableCollection<out IElementType> {
TODO("Not yet implemented")
}

override fun isTemplateFile(p0: PsiFile?): Boolean {
TODO("Not yet implemented")
}

override fun canModifyPsiInsert(p0: FileViewProvider): Boolean {
TODO("Not yet implemented")
}

override fun addRubyStatement(
p0: FileViewProvider,
p1: RCompoundStatement,
p2: PsiElement,
p3: PsiElement?,
p4: Boolean
): PsiElement? {
TODO("Not yet implemented")
}

override fun getFileType(p0: TemplateIntegrationUtils.TemplateLang): FileType? {
TODO("Not yet implemented")
}

override fun getFileType(): FileType {
TODO("Not yet implemented")
}

override fun getTemplateLanguage(): TemplateIntegrationUtils.TemplateLang {
TODO("Not yet implemented")
}

override fun getLanguage(): Language {
TODO("Not yet implemented")
}

override fun getTextForI18n(p0: Editor, p1: PsiFile): String? {
TODO("Not yet implemented")
}

override fun replaceTextWithI18n(p0: Editor, p1: PsiFile, p2: RExpression): Boolean {
TODO("Not yet implemented")
}

override fun mustCloseRubyBlock(): Boolean {
TODO("Not yet implemented")
}
}
3 changes: 0 additions & 3 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@
<lang.inspectionSuppressor
language="HTML"
implementationClass="com.mwnciau.rblade.inspections.HtmlInspectionSuppressor"/>
<languageInjectionContributor
language="RBlade"
implementationClass="com.mwnciau.rblade.injection.RubyLanguageInjectorContributor"/>

<internalFileTemplate name="Rblade File"/>
</extensions>
Expand Down

0 comments on commit dbf2f84

Please sign in to comment.