diff --git a/NeoLang/example/profile.nl b/NeoLang/example/profile.nl new file mode 100644 index 0000000..3e57241 --- /dev/null +++ b/NeoLang/example/profile.nl @@ -0,0 +1,3 @@ +profile-shell: { + bell: true +} diff --git a/NeoLang/src/main/java/io/neolang/ast/node/NeoLangGroupNode.kt b/NeoLang/src/main/java/io/neolang/ast/node/NeoLangGroupNode.kt index 48e6f12..bf16c57 100644 --- a/NeoLang/src/main/java/io/neolang/ast/node/NeoLangGroupNode.kt +++ b/NeoLang/src/main/java/io/neolang/ast/node/NeoLangGroupNode.kt @@ -10,4 +10,10 @@ class NeoLangGroupNode(val attributes: Array) : NeoLangBas override fun toString(): String { return "NeoLangGroupNode { attrs: $attributes }" } + + companion object { + fun emptyNode() : NeoLangGroupNode { + return NeoLangGroupNode(arrayOf()) + } + } } \ No newline at end of file diff --git a/NeoLang/src/main/java/io/neolang/visitor/ConfigVisitor.kt b/NeoLang/src/main/java/io/neolang/visitor/ConfigVisitor.kt index a07ad55..045acbd 100644 --- a/NeoLang/src/main/java/io/neolang/visitor/ConfigVisitor.kt +++ b/NeoLang/src/main/java/io/neolang/visitor/ConfigVisitor.kt @@ -6,8 +6,13 @@ import io.neolang.runtime.type.NeoLangArray import io.neolang.runtime.type.NeoLangValue class ConfigVisitor : IVisitorCallback { + private var rootContext: NeoLangContext? = null private var currentContext: NeoLangContext? = null + fun getRootContext(): NeoLangContext { + return rootContext!! + } + fun getContext(contextPath: Array): NeoLangContext { var context = getCurrentContext() contextPath.forEach { @@ -27,6 +32,7 @@ class ConfigVisitor : IVisitorCallback { override fun onStart() { currentContext = NeoLangContext("global") + rootContext = currentContext } override fun onFinish() { diff --git a/app/src/main/java/io/neoterm/component/NeoInitializer.kt b/app/src/main/java/io/neoterm/component/NeoInitializer.kt index 379cb60..fc08b34 100644 --- a/app/src/main/java/io/neoterm/component/NeoInitializer.kt +++ b/app/src/main/java/io/neoterm/component/NeoInitializer.kt @@ -21,6 +21,10 @@ import io.neoterm.frontend.session.shell.ShellProfile object NeoInitializer { fun init(context: Context) { NLog.init(context) + initComponents() + } + + fun initComponents() { ComponentManager.registerComponent(ConfigureComponent::class.java) ComponentManager.registerComponent(CodeGenComponent::class.java) ComponentManager.registerComponent(ColorSchemeComponent::class.java) diff --git a/app/src/main/java/io/neoterm/component/profile/NeoProfile.kt b/app/src/main/java/io/neoterm/component/profile/NeoProfile.kt index 5a1f2f5..ffbb91b 100644 --- a/app/src/main/java/io/neoterm/component/profile/NeoProfile.kt +++ b/app/src/main/java/io/neoterm/component/profile/NeoProfile.kt @@ -1,8 +1,20 @@ package io.neoterm.component.profile +import io.neolang.visitor.ConfigVisitor +import io.neoterm.component.codegen.CodeGenParameter +import io.neoterm.component.codegen.generator.ICodeGenerator +import io.neoterm.component.codegen.impl.NeoProfileGenerator +import io.neoterm.component.codegen.model.CodeGenObject + /** * @author kiva */ -abstract class NeoProfile { +abstract class NeoProfile : CodeGenObject { abstract val profileMetaName: String + + abstract fun onProfileLoaded(visitor: ConfigVisitor): Boolean + + override fun getCodeGenerator(parameter: CodeGenParameter): ICodeGenerator { + return NeoProfileGenerator(parameter) + } } \ No newline at end of file diff --git a/app/src/main/java/io/neoterm/component/profile/ProfileComponent.kt b/app/src/main/java/io/neoterm/component/profile/ProfileComponent.kt index 2fb4000..67cc315 100644 --- a/app/src/main/java/io/neoterm/component/profile/ProfileComponent.kt +++ b/app/src/main/java/io/neoterm/component/profile/ProfileComponent.kt @@ -1,7 +1,11 @@ package io.neoterm.component.profile +import io.neoterm.component.config.ConfigureComponent +import io.neoterm.frontend.component.ComponentManager import io.neoterm.frontend.component.NeoComponent +import io.neoterm.frontend.config.NeoConfigureFile import io.neoterm.frontend.config.NeoTermPath +import io.neoterm.frontend.logging.NLog import io.neoterm.frontend.session.shell.ShellProfile import java.io.File @@ -20,11 +24,39 @@ class ProfileComponent : NeoComponent { profileRegistry.remove(metaName) } - private fun checkForFiles() { - val profileDir = File(NeoTermPath.PROFILE_PATH) - if (!profileDir.exists()) { - profileDir.mkdirs() + inline fun loadConfigure(file: File): T { + return loadConfigure(file, T::class.java) as T + } + + @Suppress("UNCHECKED_CAST") + fun loadConfigure(file: File, clazz: Class): NeoProfile { + val loaderService = ComponentManager.getComponent() + + val configure: NeoConfigureFile? + try { + configure = loaderService.newLoader(file).loadConfigure() + if (configure == null) { + throw RuntimeException("Parse configuration failed.") + } + } catch (e: Exception) { + NLog.e("Profile", "Failed to load profile: ${file.absolutePath}: ${e.localizedMessage}") + throw e } + + val visitor = configure.getVisitor() + val rootContext = visitor.getRootContext() + + val profileClass = rootContext.children + .mapNotNull { profileRegistry[it.contextName] } + .singleOrNull() + + if (profileClass != null) { + val profile = profileClass.newInstance() + profile.onProfileLoaded(visitor) + return profile + } + + throw IllegalArgumentException("No profile registry for ${clazz.simpleName} found") } override fun onServiceInit() { @@ -37,4 +69,11 @@ class ProfileComponent : NeoComponent { override fun onServiceObtained() { checkForFiles() } + + private fun checkForFiles() { + val profileDir = File(NeoTermPath.PROFILE_PATH) + if (!profileDir.exists()) { + profileDir.mkdirs() + } + } } \ No newline at end of file diff --git a/app/src/main/java/io/neoterm/frontend/session/shell/ShellProfile.kt b/app/src/main/java/io/neoterm/frontend/session/shell/ShellProfile.kt index 2b0ef78..5841528 100644 --- a/app/src/main/java/io/neoterm/frontend/session/shell/ShellProfile.kt +++ b/app/src/main/java/io/neoterm/frontend/session/shell/ShellProfile.kt @@ -1,5 +1,6 @@ package io.neoterm.frontend.session.shell +import io.neolang.visitor.ConfigVisitor import io.neoterm.component.color.ColorSchemeComponent import io.neoterm.component.font.FontComponent import io.neoterm.component.profile.NeoProfile @@ -32,20 +33,27 @@ class ShellProfile : NeoProfile() { var profileColorScheme: String init { - val fontComp = ComponentManager.getComponent() - val colorComp = ComponentManager.getComponent() +// val fontComp = ComponentManager.getComponent() +// val colorComp = ComponentManager.getComponent() +// +// profileFont = fontComp.getCurrentFontName() +// profileColorScheme = colorComp.getCurrentColorSchemeName() - profileFont = fontComp.getCurrentFontName() - profileColorScheme = colorComp.getCurrentColorSchemeName() + profileFont = "" + profileColorScheme = "" - loginShell = NeoPreference.getLoginShellPath() - initialCommand = NeoPreference.getInitialCommand() - enableBell = NeoPreference.isBellEnabled() - enableVibrate = NeoPreference.isVibrateEnabled() - enableExecveWrapper = NeoPreference.isExecveWrapperEnabled() - enableSpecialVolumeKeys = NeoPreference.isSpecialVolumeKeysEnabled() - enableAutoCompletion = NeoPreference.isAutoCompletionEnabled() - enableBackButtonBeMappedToEscape = NeoPreference.isBackButtonBeMappedToEscapeEnabled() - enableExtraKeys = NeoPreference.isExtraKeysEnabled() +// loginShell = NeoPreference.getLoginShellPath() +// initialCommand = NeoPreference.getInitialCommand() +// enableBell = NeoPreference.isBellEnabled() +// enableVibrate = NeoPreference.isVibrateEnabled() +// enableExecveWrapper = NeoPreference.isExecveWrapperEnabled() +// enableSpecialVolumeKeys = NeoPreference.isSpecialVolumeKeysEnabled() +// enableAutoCompletion = NeoPreference.isAutoCompletionEnabled() +// enableBackButtonBeMappedToEscape = NeoPreference.isBackButtonBeMappedToEscapeEnabled() +// enableExtraKeys = NeoPreference.isExtraKeysEnabled() + } + + override fun onProfileLoaded(visitor: ConfigVisitor): Boolean { + return true } } \ No newline at end of file diff --git a/app/src/test/java/io/neoterm/ConfigureFileTest.kt b/app/src/test/java/io/neoterm/ConfigureFileTest.kt index 122c9ed..ad17251 100644 --- a/app/src/test/java/io/neoterm/ConfigureFileTest.kt +++ b/app/src/test/java/io/neoterm/ConfigureFileTest.kt @@ -2,6 +2,9 @@ package io.neoterm import io.neoterm.component.color.NeoColorScheme import io.neoterm.component.extrakey.NeoExtraKey +import io.neoterm.component.profile.ProfileComponent +import io.neoterm.frontend.component.ComponentManager +import io.neoterm.frontend.session.shell.ShellProfile import org.junit.Test import java.io.File @@ -35,7 +38,7 @@ class ConfigureFileTest { } val extraKey = NeoExtraKey() - if (extraKey.loadConfigure(File("/Users/kiva/Documents/NeoTerm/app/src/main/assets/eks/vim.nl"))) { + if (extraKey.loadConfigure(File("app/src/main/assets/eks/vim.nl"))) { println("programs: ${extraKey.programNames}") println("version: ${extraKey.version}") println("with-default: ${extraKey.withDefaultKeys}") @@ -43,9 +46,26 @@ class ConfigureFileTest { } } + @Test + fun profileConfigureTest() { + try { + TestInitializer.init() + } catch (ignore: Throwable) { + } + + ComponentManager.registerComponent(ProfileComponent::class.java) + + val profileComp = ComponentManager.getComponent() + profileComp.registerProfile(ShellProfile.PROFILE_META_NAME, ShellProfile::class.java) + + val comp = ComponentManager.getComponent() + val profile = comp.loadConfigure(File("NeoLang/example/profile.nl")) + } + @Test fun configureFileTest() { colorConfigureTest() extraKeyConfigureTest() + profileConfigureTest() } } \ No newline at end of file diff --git a/app/src/test/java/io/neoterm/TestInitializer.kt b/app/src/test/java/io/neoterm/TestInitializer.kt index f8aa16a..8f63bf7 100644 --- a/app/src/test/java/io/neoterm/TestInitializer.kt +++ b/app/src/test/java/io/neoterm/TestInitializer.kt @@ -1,5 +1,6 @@ package io.neoterm +import io.neoterm.component.NeoInitializer import io.neoterm.component.codegen.CodeGenComponent import io.neoterm.component.color.ColorSchemeComponent import io.neoterm.component.completion.CompletionComponent @@ -15,13 +16,6 @@ import io.neoterm.frontend.component.ComponentManager */ object TestInitializer { fun init() { - ComponentManager.registerComponent(ConfigureComponent::class.java) - ComponentManager.registerComponent(CodeGenComponent::class.java) - ComponentManager.registerComponent(ColorSchemeComponent::class.java) - ComponentManager.registerComponent(FontComponent::class.java) - ComponentManager.registerComponent(UserScriptComponent::class.java) - ComponentManager.registerComponent(ExtraKeysComponent::class.java) - ComponentManager.registerComponent(CompletionComponent::class.java) - ComponentManager.registerComponent(PackageComponent::class.java) + NeoInitializer.initComponents() } } \ No newline at end of file