Refactor script definitions loading

Make ScriptDefinitionProvider an interface
    and provide different implementation for cli and IDEA
Rework ide extension point to a simpler interface (ScriptDefinitionContributor)
Move template loading logic into a top level function
Allow script definitions to be reloaded in IDE
This commit is contained in:
Pavel V. Talanov
2017-10-19 20:02:30 +03:00
parent f063254cc1
commit cdfdc1d19b
32 changed files with 481 additions and 419 deletions
@@ -23,14 +23,14 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider;
import org.jetbrains.kotlin.script.ScriptDefinitionProvider;
public class KotlinParser implements PsiParser {
private final KotlinScriptDefinitionProvider scriptDefinitionProvider;
private final ScriptDefinitionProvider scriptDefinitionProvider;
public KotlinParser(Project project) {
scriptDefinitionProvider = KotlinScriptDefinitionProvider.getInstance(project);
scriptDefinitionProvider = ScriptDefinitionProvider.Companion.getInstance(project);
}
@Override
@@ -17,67 +17,23 @@
package org.jetbrains.kotlin.script
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.fileTypes.LanguageFileType
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import kotlin.concurrent.read
import kotlin.concurrent.write
class KotlinScriptDefinitionProvider {
private val definitions: MutableList<KotlinScriptDefinition> = arrayListOf(StandardScriptDefinition)
private val definitionsLock = java.util.concurrent.locks.ReentrantReadWriteLock()
fun setScriptDefinitions(newDefinitions: List<KotlinScriptDefinition>): Boolean {
var changed = false
definitionsLock.read {
if (newDefinitions != definitions) {
definitionsLock.write {
definitions.clear()
definitions.addAll(newDefinitions)
}
changed = true
}
}
return changed
}
interface ScriptDefinitionProvider {
fun findScriptDefinition(fileName: String): KotlinScriptDefinition?
fun isScript(fileName: String): Boolean
fun findScriptDefinition(file: VirtualFile): KotlinScriptDefinition? = findScriptDefinition(file.name)
fun findScriptDefinition(fileName: String): KotlinScriptDefinition? = definitionsLock.read {
definitions.firstOrNull { it.isScript(fileName) }
}
fun isScript(fileName: String): Boolean = definitionsLock.read {
definitions.any { it.isScript(fileName) }
}
fun addScriptDefinition(scriptDefinition: KotlinScriptDefinition) {
definitionsLock.write {
definitions.add(0, scriptDefinition)
}
}
fun removeScriptDefinition(scriptDefinition: KotlinScriptDefinition) {
definitionsLock.write {
definitions.remove(scriptDefinition)
}
}
fun getAllKnownFileTypes(): Iterable<LanguageFileType> = definitionsLock.read {
definitions.map { it.fileType }.distinct()
}
companion object {
@JvmStatic
fun getInstance(project: Project): KotlinScriptDefinitionProvider? =
ServiceManager.getService(project, KotlinScriptDefinitionProvider::class.java)
fun getInstance(project: Project): ScriptDefinitionProvider =
ServiceManager.getService(project, ScriptDefinitionProvider::class.java)
}
}
fun getScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? =
KotlinScriptDefinitionProvider.getInstance(project)?.findScriptDefinition(file)
ScriptDefinitionProvider.getInstance(project).findScriptDefinition(file)
fun getScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? =
KotlinScriptDefinitionProvider.getInstance(psiFile.project)?.findScriptDefinition(psiFile.name)
ScriptDefinitionProvider.getInstance(psiFile.project).findScriptDefinition(psiFile.name)