From bd4ea35ed9880308872d97f804478731f19cdf49 Mon Sep 17 00:00:00 2001 From: zt515 Date: Sun, 6 Aug 2017 00:28:51 +0800 Subject: [PATCH] Feature: NeoConfigureFile interface --- .../java/io/neolang/ast/visitor/AstVisitor.kt | 5 ++ .../neolang/runtime/context/IContextMaker.kt | 8 --- .../neolang/runtime/context/NeoLangContext.kt | 4 ++ .../io/neolang/runtime/type/NeoLangValue.kt | 4 ++ app/build.gradle | 1 + app/src/main/java/io/neoterm/App.kt | 18 +------ .../neoterm/customize/color/NeoColorScheme.kt | 4 +- .../java/io/neoterm/frontend/NeoFrontend.kt | 27 ++++++++++ .../neoterm/frontend/config/ConfigVisitor.kt | 49 +++++++++++++++++++ .../frontend/config/NeoConfigureFile.kt | 36 ++++++++++++++ .../java/io/neoterm/frontend/logger/NLog.kt | 9 ++++ .../test/java/io/neoterm/ConfigureFileTest.kt | 24 +++++++++ 12 files changed, 163 insertions(+), 26 deletions(-) delete mode 100644 NeoLang/src/main/java/io/neolang/runtime/context/IContextMaker.kt create mode 100644 app/src/main/java/io/neoterm/frontend/NeoFrontend.kt create mode 100644 app/src/main/java/io/neoterm/frontend/config/ConfigVisitor.kt create mode 100644 app/src/main/java/io/neoterm/frontend/config/NeoConfigureFile.kt create mode 100644 app/src/main/java/io/neoterm/frontend/logger/NLog.kt create mode 100644 app/src/test/java/io/neoterm/ConfigureFileTest.kt diff --git a/NeoLang/src/main/java/io/neolang/ast/visitor/AstVisitor.kt b/NeoLang/src/main/java/io/neolang/ast/visitor/AstVisitor.kt index 31d1c65..ed22029 100644 --- a/NeoLang/src/main/java/io/neolang/ast/visitor/AstVisitor.kt +++ b/NeoLang/src/main/java/io/neolang/ast/visitor/AstVisitor.kt @@ -9,4 +9,9 @@ class AstVisitor(private val ast: NeoLangAst, private val visitorCallback: IVisi fun start() { AstVisitorImpl.visitStartAst(ast, visitorCallback) } + + @Suppress("UNCHECKED_CAST") + fun getCallback() : T { + return visitorCallback as T + } } diff --git a/NeoLang/src/main/java/io/neolang/runtime/context/IContextMaker.kt b/NeoLang/src/main/java/io/neolang/runtime/context/IContextMaker.kt deleted file mode 100644 index 26b2608..0000000 --- a/NeoLang/src/main/java/io/neolang/runtime/context/IContextMaker.kt +++ /dev/null @@ -1,8 +0,0 @@ -package io.neolang.runtime.context - -/** - * @author kiva - */ -interface IContextMaker { - fun makeContext() -} diff --git a/NeoLang/src/main/java/io/neolang/runtime/context/NeoLangContext.kt b/NeoLang/src/main/java/io/neolang/runtime/context/NeoLangContext.kt index b5034ad..b109178 100644 --- a/NeoLang/src/main/java/io/neolang/runtime/context/NeoLangContext.kt +++ b/NeoLang/src/main/java/io/neolang/runtime/context/NeoLangContext.kt @@ -15,4 +15,8 @@ class NeoLangContext(val contextName: String) { fun getAttribute(attributeName: String) : NeoLangValue { return attributes[attributeName] ?: NeoLangValue.UNDEFINED } + + fun getAttributes() : Map { + return attributes + } } diff --git a/NeoLang/src/main/java/io/neolang/runtime/type/NeoLangValue.kt b/NeoLang/src/main/java/io/neolang/runtime/type/NeoLangValue.kt index 5024ecc..e5c6bee 100644 --- a/NeoLang/src/main/java/io/neolang/runtime/type/NeoLangValue.kt +++ b/NeoLang/src/main/java/io/neolang/runtime/type/NeoLangValue.kt @@ -16,6 +16,10 @@ class NeoLangValue(private val rawValue: Any) { } } + fun isValid() : Boolean { + return this != UNDEFINED + } + companion object { val UNDEFINED = NeoLangValue("") } diff --git a/app/build.gradle b/app/build.gradle index 3dbc64a..2592994 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,4 +57,5 @@ dependencies { // compile 'com.ramotion.cardslider:card-slider:0.1.0' // compile 'com.github.igalata:Bubble-Picker:v0.2.4' compile project(path: ':NeoLang') + testCompile project(path: ':NeoLang') } diff --git a/app/src/main/java/io/neoterm/App.kt b/app/src/main/java/io/neoterm/App.kt index 2cc77f0..a5d42f3 100644 --- a/app/src/main/java/io/neoterm/App.kt +++ b/app/src/main/java/io/neoterm/App.kt @@ -1,14 +1,7 @@ package io.neoterm import android.app.Application -import android.util.Log -import io.neoterm.customize.color.ColorSchemeManager -import io.neoterm.customize.completion.CompletionProviderManager -import io.neoterm.customize.eks.ExtraKeysManager -import io.neoterm.customize.font.FontManager -import io.neoterm.customize.pm.NeoPackageManager -import io.neoterm.customize.script.UserScriptManager -import io.neoterm.frontend.service.ServiceManager +import io.neoterm.frontend.NeoFrontend import io.neoterm.preference.NeoPreference import io.neoterm.utils.CrashHandler @@ -21,14 +14,7 @@ class App : Application() { app = this NeoPreference.init(this) CrashHandler.init() - - // ensure that we can access these any time - ServiceManager.registerService(ColorSchemeManager::class.java) - ServiceManager.registerService(FontManager::class.java) - ServiceManager.registerService(UserScriptManager::class.java) - ServiceManager.registerService(ExtraKeysManager::class.java) - ServiceManager.registerService(CompletionProviderManager::class.java) - ServiceManager.registerService(NeoPackageManager::class.java) + NeoFrontend.initialize() } companion object { diff --git a/app/src/main/java/io/neoterm/customize/color/NeoColorScheme.kt b/app/src/main/java/io/neoterm/customize/color/NeoColorScheme.kt index 1484616..babb3cb 100644 --- a/app/src/main/java/io/neoterm/customize/color/NeoColorScheme.kt +++ b/app/src/main/java/io/neoterm/customize/color/NeoColorScheme.kt @@ -14,7 +14,6 @@ import java.util.* open class NeoColorScheme(val colorName: String) { companion object { private const val COLOR_PREFIX = "color" - const val COLOR_DIM_BLACK = 0 const val COLOR_DIM_RED = 1 const val COLOR_DIM_GREEN = 2 @@ -64,7 +63,7 @@ open class NeoColorScheme(val colorName: String) { } fun createConfig(): Properties { - // TODO: 设计新的配色方案语法,这个只是临时用一下 + // TODO: 兼容旧版本的配置并且解析新版本的配置文件 validateColors() val prop = Properties() prop.put("foreground", foregroundColor) @@ -77,6 +76,7 @@ open class NeoColorScheme(val colorName: String) { } fun parseConfig(file: File): Boolean { + // TODO: 兼容旧版本的配置并且解析新版本的配置文件 try { return FileInputStream(file).use { val prop = Properties() diff --git a/app/src/main/java/io/neoterm/frontend/NeoFrontend.kt b/app/src/main/java/io/neoterm/frontend/NeoFrontend.kt new file mode 100644 index 0000000..fc66560 --- /dev/null +++ b/app/src/main/java/io/neoterm/frontend/NeoFrontend.kt @@ -0,0 +1,27 @@ +package io.neoterm.frontend + +import io.neoterm.customize.color.ColorSchemeManager +import io.neoterm.customize.completion.CompletionProviderManager +import io.neoterm.customize.eks.ExtraKeysManager +import io.neoterm.customize.font.FontManager +import io.neoterm.customize.pm.NeoPackageManager +import io.neoterm.customize.script.UserScriptManager +import io.neoterm.frontend.logger.NLog +import io.neoterm.frontend.service.ServiceManager + +/** + * @author kiva + */ +object NeoFrontend { + fun initialize() { + // ensure that we can access these any time + ServiceManager.registerService(ColorSchemeManager::class.java) + ServiceManager.registerService(FontManager::class.java) + ServiceManager.registerService(UserScriptManager::class.java) + ServiceManager.registerService(ExtraKeysManager::class.java) + ServiceManager.registerService(CompletionProviderManager::class.java) + ServiceManager.registerService(NeoPackageManager::class.java) + + NLog.initialize() + } +} \ No newline at end of file diff --git a/app/src/main/java/io/neoterm/frontend/config/ConfigVisitor.kt b/app/src/main/java/io/neoterm/frontend/config/ConfigVisitor.kt new file mode 100644 index 0000000..6f24413 --- /dev/null +++ b/app/src/main/java/io/neoterm/frontend/config/ConfigVisitor.kt @@ -0,0 +1,49 @@ +package io.neoterm.frontend.config + +import io.neolang.ast.visitor.IVisitorCallback +import io.neolang.runtime.context.NeoLangContext +import io.neolang.runtime.type.NeoLangValue +import java.util.* + +class ConfigVisitor : IVisitorCallback { + private val emptyContext = NeoLangContext("") + private val contextStack = Stack() + private val definedContext = mutableListOf() + + fun getContext(contextName: String) : NeoLangContext { + definedContext.forEach { + if (it.contextName == contextName) { + return it + } + } + return emptyContext + } + + fun getAttribute(contextName: String, attrName: String) : NeoLangValue { + return getContext(contextName).getAttribute(attrName) + } + + override fun onStart() { + onEnterContext("global") + } + + override fun onFinish() { + while (contextStack.isNotEmpty()) { + onExitContext() + } + } + + override fun onEnterContext(contextName: String) { + val context = NeoLangContext(contextName) + contextStack.push(context) + } + + override fun onExitContext() { + val context = contextStack.pop() + definedContext.add(context) + } + + override fun getCurrentContext(): NeoLangContext { + return contextStack.peek() + } +} \ No newline at end of file diff --git a/app/src/main/java/io/neoterm/frontend/config/NeoConfigureFile.kt b/app/src/main/java/io/neoterm/frontend/config/NeoConfigureFile.kt new file mode 100644 index 0000000..f1b411f --- /dev/null +++ b/app/src/main/java/io/neoterm/frontend/config/NeoConfigureFile.kt @@ -0,0 +1,36 @@ +package io.neoterm.frontend.config + +import io.neolang.parser.NeoLangParser +import io.neoterm.utils.FileUtils +import java.io.File + +/** + * @author kiva + */ +class NeoConfigureFile(val configureFile: String) { + private val configParser = NeoLangParser() + private var configVisitor : ConfigVisitor? = null + + fun getVisitor(): ConfigVisitor { + checkParsed() + return configVisitor!! + } + + fun parseConfigure(): Boolean { + val configContent = FileUtils.readFile(File(configureFile)) ?: return false + val programCode = String(configContent) + configParser.setInputSource(programCode) + + val ast = configParser.parse() + val astVisitor = ast.visit().getVisitor(ConfigVisitor::class.java) ?: return false + astVisitor.start() + configVisitor = astVisitor.getCallback() + return true + } + + private fun checkParsed() { + if (configVisitor == null) { + throw IllegalStateException("Configure file not loaded.") + } + } +} diff --git a/app/src/main/java/io/neoterm/frontend/logger/NLog.kt b/app/src/main/java/io/neoterm/frontend/logger/NLog.kt new file mode 100644 index 0000000..e41dffa --- /dev/null +++ b/app/src/main/java/io/neoterm/frontend/logger/NLog.kt @@ -0,0 +1,9 @@ +package io.neoterm.frontend.logger + +/** + * @author kiva + */ +object NLog { + fun initialize() { + } +} \ 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 new file mode 100644 index 0000000..79c89f8 --- /dev/null +++ b/app/src/test/java/io/neoterm/ConfigureFileTest.kt @@ -0,0 +1,24 @@ +package io.neoterm + +import io.neoterm.frontend.config.ConfigVisitor +import io.neoterm.frontend.config.NeoConfigureFile +import org.junit.Test + +/** + * @author kiva + */ +class ConfigureFileTest { + private fun printAttr(visitor: ConfigVisitor, contextName: String, attrName: String) { + println("attr [$contextName->$attrName]: ${visitor.getAttribute(contextName, attrName).asString()}") + } + + @Test + fun configureFileTest() { + val config = NeoConfigureFile("NeoLang/example/color-scheme.nl") + if (config.parseConfigure()) { + println("Parsed!") + val visitor = config.getVisitor() + printAttr(visitor, "colors", "foreground") + } + } +} \ No newline at end of file