diff --git a/.gitignore b/.gitignore index 5aeb71169aa6d044dd5b11125f0c4d74338f81c8..9766e5f66553ff7b693453de9917098679a47493 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar .mvn/wrapper/maven-wrapper.jar .idea/ *.iml diff --git a/README.md b/README.md index 4a5cd39fb67c4e0b8f1f2e984f5b6026f9a0bcc5..5fa53a8f5d2eb2f37ccf694a320eb8a16348af0d 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,20 @@ 一种轻量的转译型语言,可生成Java代码。它致力于减少Java代码的冗余,并提供流畅的开发体验。它能够和Java代码无缝集成,并减少60%的代码量。 +## 名词解释 + +### 转译 + +源代码,不直接编译成机器码或者字节码,而是转换成另外一种高级语言代码。例如:TypeScript编译成JavaScript。 + +### 轻量 + +仅提供核心功能,将有限的人力投入到开发核心代码中。例如:生成的Java代码,是否还有优化空间,就交给IntelliJ IDEA。 + +### 无缝集成 + +利用语法和Java相近的特点,支持在源代码中直接调用Java的库。(因为编译器就是Java写的,可以解析依赖的jar包) + ## 代码示例 ### 原始代码 @@ -31,15 +45,21 @@ public class Main { ## 快速开始 +### 原理解析 + +Spirit提供名为spirit:compile的Maven插件。它能够将Maven项目中,src/main/resources/sources目录下(如果不存在sources文件夹,请手动创建),后缀名为.sp的源码文件,转译成Java代码。目标代码会生成在src/main/java目录下。 + +**src/main/resources/sources目录下的.sp文件 ==编译==> src/main/java目录下的.java文件** + ### 依赖配置 在pom.xml中引入以下jar包: ```xml - com.gitee.chentaoah + com.gitee.digital-engine spirit-stdlib - 最新版(>= 2.1.30) + 3.0.0 org.slf4j @@ -53,17 +73,41 @@ public class Main { ``` -### 代码编辑 +### 插件配置 -1. 下载并安装sublime编辑器。 +在pom.xml中引入以下插件: -2. 打开sublime,点击上方Preferences->Browse Packages按钮。 +```xml + + + + com.gitee.digital-engine + spirit-maven-plugin + 3.0.0 + + + + compile + generateConfig + + + + + + +``` -3. 将spirit项目中sublime-plugs目录下的所有文件,拷贝到User文件夹中。 +### 编辑器安装 -4. 在项目src/main/resources目录下,创建sources子目录。在sources目录下,创建一个文件夹。例如:com.gitee.spirit.example。 +因为IntelliJ IDEA 、Eclipse等集成开发环境,目前还不支持编辑Spirit代码,所以需要使用编辑器。在这里,选用sublime编辑器。 -5. 在文件夹下,创建Main.sp文件,并在sublime中打开,输入如下内容: +1. 下载并安装sublime编辑器。 + +2. 打开sublime,点击上方Preferences->Browse Packages按钮,找到User文件夹。 + +3. 将spirit-editor项目中,sublime-plugs目录下的所有文件,都拷贝到User文件夹中。(spirit-editor项目地址:https://gitee.com/digital-engine/spirit-editor.git) + +4. 在任意目录下,创建Main.sp文件,并在sublime中打开,输入如下内容,观察代码是否已经有样式: ```go func main() { @@ -73,214 +117,314 @@ public class Main { ### 代码编译 -1. 在pom.xml中引入插件。 - - ```xml - - - - com.gitee.chentaoah - spirit-maven-plugin - 最新版(>= 2.1.30) - - - - compile - - - - - - +1. 在src/main/resources/sources目录下,创建com.gitee.spirit.example文件夹,该文件夹将直接作为包。 + +2. 在以上文件夹下,创建Main.sp文件,并在sublime中打开,输入如下内容: + + ```go + func main() { + print "hello world!" + } + ``` + +3. 执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,观察生成的Java代码: + + ```java + package com.sum.test.main; + + import lombok.extern.slf4j.Slf4j; + + @Slf4j + public class Main { + + public static void main(String[] args) { + log.info("hello world!"); + } + + } ``` -2. 执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成的Java代码。 +## 语法速成(10min) -## 一般语法 +作为一种“新”的编程语言,Spirit确实有一定的“学习成本”。如果之前接触过Java、JavaScript等语言,你会感到十分亲切。从设计之初,Spirit便支持和Java混编(混编的意思是:你可以在Spirit代码中,尽情地调用Java代码)。所以作者的建议是,项目可以以Java为主,适当合理地使用Spirit(反正Spirit代码也会转译成Java代码的嘛:sweat_smile:)。Spirit的语法是比较懒散的,如果你掌握了这个核心特点,那么就掌握了这门语言。 -### 类型声明 +### 缺省public -```go -class Horse { - name = "xiao ma" - age = 18 - func Horse(String name, int age) { - this.name = name - this.age = age +Spirit代码: + +```java +class People { + String name + Integer age +} +``` + +转译成Java代码: + +```java +public class People { + public String name; + public Integer age; +} +``` + +### 缺省new + +Spirit代码: + +```java +class PeopleFactory { + People newPeople(String name, Integer age) { + return People(name, age) } - func bark() { - print "I am xiao ma!" +} +``` + +转译成Java代码: + +```java +public class PeopleFactory { + public People newPeople(String name, Integer age) { + return new People(name, age); } } ``` -### 赋值语句 +### 缺省括号 -Spirit编译器会自动推导类型,所以 +Spirit代码: -```go -name = "xiao ma" +```java +if "Jessica".equals(name) { + log.info("Name is equal!") +} ``` -等效于 +转译成Java代码: -```go -String name = "xiao ma" +```java +if ("Jessica".equals(name)) { + log.info("Name is equal!"); +} ``` -### 方法声明 +### 缺省类型 -Spirit编译器会自动推导类型,所以 +Spirit代码: -```go -func getName() { - return name +```java +class People { + name = "Jessica" + age = 18 + func toString() { + return name + "_" + age + } } ``` -等效于 +转译成Java代码: -```go -String getName() { - return name +```java +public class People { + public String name = "Jessica"; + public Integer age = 18; + public String toString() { + return name + "_" + age; + } } ``` -### 构造方法 +### 缺省集合 -一般构造方法(省略了new关键字) +Spirit代码: -```go -horse1 = Horse("xiao ma", 18) +```java +class Example { + list = ["Jessica", "Jessie"] + map = {"Jessica": 18, "Jessie": 18} +} ``` -builder模式(只要有默认构造方法,可以初始化任意属性,配合lombok的@Builder使用) +转译成Java代码: -```go -horse2 = Horse{name = "zhong ma", age = 20} +```java +public class Example { + public List list = Lists.of("Jessica", "Jessie"); + public Map map = Maps.of("Jessica": 18, "Jessie": 18); +} ``` -智能builder模式(方法入参类型非常明确的情况下,可以用“$”符号替代类型) +### 缺省遍历 -```go -addHorseToStable(${name = "lao ma", age = 38}) +Spirit代码: + +```java +for str in list { + log.info("The item is {}", str) +} +// Or something like this +for str in list : log.info("The item is {}", str) ``` -### 集合声明 +转译成Java代码: ```go -list = ["xiao ma", "lao ma"] +for (String str : list) { + log.info("The item is {}", str); +} ``` -```go -map = {"xiao ma": horse1, "lao ma": horse2} -``` +## 进阶语法(10min) -### if判断 +### 日志输出 -Spirit重载了字符串的“==”操作符,所以 +Spirit代码: ```go -if str == "xiao ma" { - print str +class PeopleLogger { + func logPeople(People people) { + print people.toString() + } } ``` -等效于 +转译成Java代码: -```go -if StringUtils.equals(str, "xiao ma") { - print str +```java +@Slf4j +public class PeopleLogger { + public void logPeople(People people) { + log.info(people.toString()); + } } ``` -### for循环 +### builder模式 -普通 +Spirit代码(建议配合lombok的@Builder使用): -```go -for (i=0; i < list.size(); i++) { - print "The item is {}", list.get(i) +```java +class PeopleFactory { + func newPeople(String name, Integer age) { + return People{name = name, age = age} + } } ``` -快速 +转译成Java代码: -```go -for str in list { - print "The item is {}", str +```java +public class PeopleFactory { + public People newPeople(String name, Integer age) { + return People.builder().name(name).age(age).build(); + } } ``` -### 异常处理 +### 缺省builder模式 -```go -try { - throw Exception("Exception occurred!") -} catch Exception e { - error "Exception occurred!", e +Spirit代码(方法入参类型非常明确的情况下,可以用“$”符号替代类型): + +```java +class PeopleLogger { + func logPeople(People people) { + log.info(people.toString()) + } + func logPeople(String name, Integer age) { + logPeople(${name = name, age = age}) + } +} +``` + +转译成Java代码: + +```java +public class PeopleLogger { + public void logPeople(People people) { + log.info(people.toString()); + } + public void logPeople(String name, Integer age) { + logPeople(People.builder().name(name).age(age).build()); + } } ``` -## 进阶语法 +## 高阶语法(10min) ### JSON构造 -Spirit的map声明方式,恰好是标准JSON的格式,所以,你可以这样写: +Spirit代码: -```go +```java jsonMap = { - "name": "xiao ma", + "name": "Jessica", "age": 18, - "father": {"lao ma": horse2}, - "brother": ["da ma", "zhong ma"] + "father": {"Jack": 38}, + "sisters": ["jessie", "jenny"] } print JSON.toJSONString(jsonMap) ``` -### 宏构造模式 +转译成Java代码: -设计背景:在Java中,写一个简单的SQL查询,总感觉很麻烦。原因是,Java无法像SQL这种标准查询语言一样,直接并简洁地表达出相同的查询语义。所以,Spirit提出了一种折中的方式,支持书写和SQL语法相近的表达式,由插件转译成Java代码。 +```java +Map jsonMap = Maps.of( + "name": "Jessica", + "age": 18, + "father": Maps.of("Jack", 38), + "sisters": Lists.of("jessie", "jenny") +); +log.info(JSON.toJSONString(jsonMap)); +``` + +### 宏构造模式 -**宏构造模式:简单来说,和类型Example绑定的插件,会根据”{}“内的表达式,智能地去构造一个Example实例。** +格式为 obj = $Type{ expression }的语义单元,被称为宏构造语义单元。编译器会查找和Type类型,绑定的插件,解析“{}”内的表达式,并生成额外的Java代码。例如:在使用tk.mybatis时,利用宏构造模式,创建一个用来查询的Example对象。 -以下为tk-mapper的一个简单SQL查询: +Spirit代码: ```go example = $Example{ - class = Horse.class, - name != horse.getName()?, - age >= horse.getAge()!, - alias like "%" + horse.getName() + "%", + class = People.class, + name != people.getName()?, + age >= people.getAge()!, + alias like "%" + people.getName() + "%", order by id desc } ``` -生成的Java代码(减少约70%的代码): +转译成Java代码(减少约70%的代码): ```java -Example example$1 = new Example(Horse.class); +Example example$1 = new Example(People.class); Example.Criteria criteria$1 = example$1.createCriteria(); -if (horse.getName() != null) { - criteria$1.andNotEqualTo("name", horse.getName()); +if (people.getName() != null) { + criteria$1.andNotEqualTo("name", people.getName()); } -Objects.requireNonNull(horse.getAge(), "horse.getAge()为空!"); -criteria$1.andGreaterThanOrEqualTo("age", horse.getAge()); -criteria$1.andLike("alias", "%"+horse.getName()+"%"); +Objects.requireNonNull(people.getAge(), "people.getAge() is null!"); +criteria$1.andGreaterThanOrEqualTo("age", people.getAge()); +criteria$1.andLike("alias", "%" + people.getName() + "%"); example$1.orderBy("id").desc(); Example example = example$1; ``` +## 版本说明 + +| 版本 | 说明 | +| :--- | ---------------------------------------------------------- | +| 1.0 | 调研编译器的可行性。 | +| 2.0 | 完成编译器的基本设计,并完成核心功能。 | +| 3.0 | 参考Java编译器一部分逻辑,重构了核心功能,进入预发布状态。 | + ## 未来 -1. 推出稳定版3.0 -2. 支持Lambda表达式 -3. 提供更多sublime插件,增强代码提示。 -4. 考虑支持转译成其他语言(Java以外) +提供更多的sublime插件。 ## 加入我(们) -如果你对编程,也充满了热忱,想要参与进来,请发送邮件到以下邮箱。 +欢迎通过以下方式联系作者。 + +QQ群(1群):777458862 -邮箱:609580885@qq.com +邮箱:digital_engine@163.com diff --git a/pom.xml b/pom.xml index 4f0a398d93bb343c2890c9e5998b3f2d19612987..3647e7b89fa67bed43a51a5a30860335d1109682 100644 --- a/pom.xml +++ b/pom.xml @@ -3,14 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-parent 3.0.0 pom spirit A new programming language based on Java. - https://gitee.com/chentaoah/spirit + https://gitee.com/digital-engine/spirit @@ -21,26 +21,26 @@ - chentaoah - 609580885@qq.com + tao chen + digital_engine@163.com gitee https://gitee.com - scm:git:https://gitee.com/chentaoah/spirit.git - scm:git:https://gitee.com/chentaoah/spirit.git - https://gitee.com/chentaoah/spirit/tree/master + scm:git:https://gitee.com/digital-engine/spirit.git + scm:git:https://gitee.com/digital-engine/spirit.git + https://gitee.com/digital-engine/spirit/tree/master spirit-stdlib spirit-common spirit-core3 - spirit-starter spirit-plugin - spirit-example + spirit-starter + spirit-test diff --git a/spirit-common/pom.xml b/spirit-common/pom.xml index ebd13bd3cbdd512ad6e4af0a1a32e85e442f6e34..48ed230c5a80f4f8eeb372e3107122f5db71446c 100644 --- a/spirit-common/pom.xml +++ b/spirit-common/pom.xml @@ -3,17 +3,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-parent 3.0.0 spirit-common + - - com.gitee.chentaoah - spirit-stdlib - ${project.version} - org.springframework.boot spring-boot-starter @@ -38,5 +34,12 @@ com.google.guava guava + + + com.gitee.digital-engine + spirit-stdlib + ${project.version} + + \ No newline at end of file diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/constants/AccessLevel.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/AccessLevel.java deleted file mode 100644 index 069eed2c72384bab25565145e824b386a4d18eea..0000000000000000000000000000000000000000 --- a/spirit-common/src/main/java/com/gitee/spirit/common/constants/AccessLevel.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gitee.spirit.common.constants; - -import java.lang.reflect.Modifier; - -public interface AccessLevel { - int EVEN_PRIVATE = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE; - int PROTECTED = Modifier.PUBLIC | Modifier.PROTECTED; - int ONLY_PUBLIC = Modifier.PUBLIC; -} diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attachment.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attachment.java index 476001b1df1ec866490cbd65054b78dd286d4f5b..da210612b566d8cd7b7536bd48af0225392da263 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attachment.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attachment.java @@ -5,9 +5,10 @@ public interface Attachment { String MEMBER_NAME = "MEMBER_NAME"; // 字段名或者方法名 String OPERAND = "OPERAND"; // 操作数 String TREE_ID = "TREE_ID"; // 树节点id - String POSITION = "POSITION"; // 在语句中的位置 - String LENGTH = "LENGTH"; // 字符串的宽度 String TYPE = "TYPE"; // 类型 String DERIVED = "DERIVED"; // 是否声明 String VARIABLE_SIGN = "VARIABLE_SIGN"; // 变量标识 + String HAS_SMART_BUILDER = "HAS_SMART_BUILDER"; // 是否开启智能构造模式 + String MARKED_TREE_ID = "MARKED_TREE_ID"; // 是否已经标识了树节点id + String HAS_CLASS_VISITED = "HAS_CLASS_VISITED"; // 是否已经被推导过 } diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/constants/Config.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Config.java index ee1a336e7bae9e9837b1a6f868eb8e4eab7d24fc..c63a74f2028bdf425be015a453cfb6652b00e0aa 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/constants/Config.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Config.java @@ -2,11 +2,14 @@ package com.gitee.spirit.common.constants; public interface Config { String INPUT_PATH = "inputPath"; - String OUTPUT_PATH = "outputPath"; + String TARGET_PACKAGE = "targetPackage"; String FILE_EXTENSION = "fileExtension"; + String OUTPUT_PATH = "outputPath"; String LANG_PACKAGE = "langPackage"; String UTIL_PACKAGE = "utilPackage"; String USE_LOMBOK = "useLombok"; String CLASS_PATHS = "classPaths"; - String DEBUG = "debug"; + String DEBUG_MODE = "debugMode"; + String COMPILE_LISTENERS = "compileListeners"; + String ELEMENT_LISTENERS = "elementListeners"; } \ No newline at end of file diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/constants/Constants.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Constants.java index d9bdd076a72550f07b4b711c7547812623598498..96c6f404f52773ef3a4a55e11a081511a6a34b8f 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/constants/Constants.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Constants.java @@ -1,9 +1,6 @@ package com.gitee.spirit.common.constants; public interface Constants { - boolean DEFAULT_DEBUG = true; - String DEFAULT_FILE_EXTENSION = "sp"; - String DEFAULT_CHARSET = "UTF-8"; String DEFAULT_INDENT = " "; String DEFAULT_DOUBLE_INDENT = DEFAULT_INDENT + DEFAULT_INDENT; } diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/enums/SyntaxEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/element/SyntaxEnum.java similarity index 62% rename from spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/enums/SyntaxEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/element/SyntaxEnum.java index 0bb67cf16231ea21726e8d1c531e0f10a3549258..81bf87bd5b3d393ec3861305c4839f2f56563abb 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/enums/SyntaxEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/element/SyntaxEnum.java @@ -1,7 +1,6 @@ -package com.gitee.spirit.core3.element.enums; +package com.gitee.spirit.common.enums.element; -import com.gitee.spirit.common.enums.TokenType; -import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.ArrayList; import java.util.List; @@ -12,50 +11,50 @@ public enum SyntaxEnum { // package xxx.xxx.xxx PACKAGE(new Object[]{"package"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.STATEMENT), - // import com.gitee.spirit.example.Animal + // import xxx.xxx.xxx.Type IMPORT(new Object[]{"import"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.STATEMENT), - // @Animal + // @Annotation ANNOTATION(new Object[]{TokenType.MarkEnum.ANNOTATION}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.STATEMENT), - // interface Horse { + // interface Type { INTERFACE(new Object[]{"interface"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.MERGE), - // abstract Horse { + // abstract Type { ABSTRACT(new Object[]{"abstract"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.MERGE), - // class Horse { + // class Type { CLASS(new Object[]{"class"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.MERGE), - // func call() { + // func method() { FUNC(new Object[]{"func"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.MERGE), - // String call() { + // String method() { DEFINE_FUNC(new Object[]{"@Type", TokenType.AccessEnum.LOCAL_METHOD, "@End:{"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.MERGE), - // String call() + // String method() DECLARE_FUNC(new Object[]{"@Type", TokenType.AccessEnum.LOCAL_METHOD}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.STATEMENT), - // if name == "Jessie" { + // if var == "string" { IF(new Object[]{"if"}, CategoryEnum.WITH_TREE, MergeMethodEnum.MERGE), // for (i=0; i<100; i++) { // for (i=0; i<100; i++) : xxx : xxx FOR(new Object[]{"for", TokenType.ExpressionEnum.SUBEXPRESSION}, CategoryEnum.WITH_TREE, MergeMethodEnum.MERGE), // for item in list { FOR_IN(new Object[]{"for", TokenType.IdentifierEnum.VARIABLE, "in"}, CategoryEnum.WITH_TREE, MergeMethodEnum.MERGE), - // while name == "Jessie" { + // while var == "string" { WHILE(new Object[]{"while"}, CategoryEnum.WITH_TREE, MergeMethodEnum.MERGE), - // sync horse { + // sync var { SYNC(new Object[]{"sync"}, CategoryEnum.WITH_TREE, MergeMethodEnum.MERGE), // continue CONTINUE(new Object[]{"continue"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.STATEMENT), // break BREAK(new Object[]{"break"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.STATEMENT), - // return "I am Jessie!" + // return "string" RETURN(new Object[]{"return"}, CategoryEnum.WITH_TREE, MergeMethodEnum.STATEMENT), // throw RuntimeException(e) THROW(new Object[]{"throw"}, CategoryEnum.WITH_TREE, MergeMethodEnum.STATEMENT), - // print "Jessie" + // print "string" PRINT(new Object[]{"print"}, CategoryEnum.WITH_TREE, MergeMethodEnum.STATEMENT), - // debug "Jessie" + // debug "string" DEBUG(new Object[]{"debug"}, CategoryEnum.WITH_TREE, MergeMethodEnum.STATEMENT), - // error "Jessie" + // error "string" ERROR(new Object[]{"error"}, CategoryEnum.WITH_TREE, MergeMethodEnum.STATEMENT), - // } else if name == "Jessie" { + // } else if var == "string" { ELSE_IF(new Object[]{"}", "else", "if", "@End:{"}, CategoryEnum.WITH_TREE, MergeMethodEnum.END_AND_MERGE), // } else { ELSE(new Object[]{"}", "else", "{"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.END_AND_MERGE), @@ -68,24 +67,26 @@ public enum SyntaxEnum { // } END(new Object[]{"}"}, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.END_MERGE), - // horse = { + // var = { STRUCT_ASSIGN(null, CategoryEnum.WITHOUT_TREE, MergeMethodEnum.MERGE_LINE), // super() SUPER(null, CategoryEnum.WITH_TREE, MergeMethodEnum.STATEMENT), // this() THIS(null, CategoryEnum.WITH_TREE, MergeMethodEnum.STATEMENT), - // String name + // String var DECLARE(null, CategoryEnum.BY_TREE, MergeMethodEnum.STATEMENT), - // String name = "Jessie" + // String var = "string" DECLARE_ASSIGN(null, CategoryEnum.BY_TREE, MergeMethodEnum.STATEMENT), - // name = "Jessie" + // var = "string" ASSIGN(null, CategoryEnum.BY_TREE, MergeMethodEnum.STATEMENT), - // horse.name = "Jessie" + // obj.field = "string" FIELD_ASSIGN(null, CategoryEnum.BY_TREE, MergeMethodEnum.STATEMENT), - // horse.call() + // obj.method() INVOKE(null, CategoryEnum.BY_TREE, MergeMethodEnum.STATEMENT); + // 根据首个字符串,进行精确匹配的集合 public static final Map> SYNTAX_MAP = new ConcurrentHashMap<>(); + // 未能找到精确匹配记录时,进行通配的集合 public static final List SYNTAX_LIST = new ArrayList<>(); static { @@ -108,55 +109,9 @@ public enum SyntaxEnum { } } - public static SyntaxEnum parseSyntax(List tokens) { - Token firstToken = tokens.get(0); - List syntaxEnums = SYNTAX_MAP.get(firstToken.toString()); - if (syntaxEnums == null) { - syntaxEnums = SYNTAX_LIST; - } - for (SyntaxEnum syntaxEnum : syntaxEnums) { - boolean isMatch = doParseSyntax(syntaxEnum, tokens); - if (isMatch) { - return syntaxEnum; - } - } - return null; - } - - private static boolean doParseSyntax(SyntaxEnum syntaxEnum, List tokens) { - for (int index = 0; index < syntaxEnum.values.length; index++) { - Object value = syntaxEnum.values[index]; - if (value == null) { - continue; - } - if (index < tokens.size()) { - Token token = tokens.get(index); - if (value instanceof String) { - String string = (String) value; - if ("@Type".equals(string)) { - if (!token.isAnyType()) { - return false; - } - } else if (string.startsWith("@End:")) { - Token lastToken = tokens.get(tokens.size() - 1); - if (!string.equals("@End:" + lastToken)) { - return false; - } - - } else if (!string.equals(token.toString())) { - return false; - } - } else if (value instanceof TokenType) { - TokenType tokenType = (TokenType) value; - if (tokenType != token.getTokenType()) { - return false; - } - } - } else { - return false; - } - } - return true; + public static List getSyntaxEnums(String value) { + List syntaxEnums = SYNTAX_MAP.get(value); + return syntaxEnums != null ? syntaxEnums : SYNTAX_LIST; } public Object[] values; @@ -169,26 +124,6 @@ public enum SyntaxEnum { this.mergeMethod = mergeMethod; } - public boolean isStatement() { - return mergeMethod == MergeMethodEnum.STATEMENT; - } - - public boolean isMerge() { - return mergeMethod == MergeMethodEnum.MERGE; - } - - public boolean isEndMerge() { - return mergeMethod == MergeMethodEnum.END_MERGE; - } - - public boolean isEndAndMerge() { - return mergeMethod == MergeMethodEnum.END_AND_MERGE; - } - - public boolean isMergeLine() { - return mergeMethod == MergeMethodEnum.MERGE_LINE; - } - public enum CategoryEnum { WITHOUT_TREE, WITH_TREE, BY_TREE } diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/enums/KeywordEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/KeywordEnum.java similarity index 96% rename from spirit-common/src/main/java/com/gitee/spirit/common/enums/KeywordEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/token/KeywordEnum.java index a64197ed47a8d7b7a5baf509bb3de913f84eb0a0..4360d1c0327a8ecd76c059fe0619cac593716ec7 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/enums/KeywordEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/KeywordEnum.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.common.enums; +package com.gitee.spirit.common.enums.token; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/enums/ModifierEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/ModifierEnum.java similarity index 94% rename from spirit-common/src/main/java/com/gitee/spirit/common/enums/ModifierEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/token/ModifierEnum.java index 87cf0a18a1c89ec51f23164b0378cddcf46dfc13..dcc6f7cdc96d8317eb08ad36ace5e93af9beb305 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/enums/ModifierEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/ModifierEnum.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.common.enums; +package com.gitee.spirit.common.enums.token; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/enums/OperatorEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/OperatorEnum.java similarity index 98% rename from spirit-common/src/main/java/com/gitee/spirit/common/enums/OperatorEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/token/OperatorEnum.java index 4fd4bfa336efba6d512a35f7525fd3ee3f4a9960..ec660e0bb976b0ac6776ee2396345f36e22e905d 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/enums/OperatorEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/OperatorEnum.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.common.enums; +package com.gitee.spirit.common.enums.token; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveArrayEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/PrimitiveArrayEnum.java similarity index 97% rename from spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveArrayEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/token/PrimitiveArrayEnum.java index e5a5d7d5445e2a430adabd151236fc123b47736f..f5c93bb6d74c62d5c74344ab835af1ed6f4a9478 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveArrayEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/PrimitiveArrayEnum.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.common.enums; +package com.gitee.spirit.common.enums.token; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/PrimitiveEnum.java similarity index 97% rename from spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/token/PrimitiveEnum.java index 3cfc9bcabdd4a7a039acbb13491963254ea242bc..5ec7a80e6acd9ac18616206acdc6af1c15a83805 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/PrimitiveEnum.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.common.enums; +package com.gitee.spirit.common.enums.token; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/enums/SeparatorEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/SeparatorEnum.java similarity index 94% rename from spirit-common/src/main/java/com/gitee/spirit/common/enums/SeparatorEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/token/SeparatorEnum.java index 8c29ae14d683b5b374ab0b293aef567afdc15b48..7685b80a8bf65e14676b4ace9b0c4575dbc3e6d1 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/enums/SeparatorEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/SeparatorEnum.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.common.enums; +package com.gitee.spirit.common.enums.token; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/enums/TokenType.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/TokenType.java similarity index 97% rename from spirit-common/src/main/java/com/gitee/spirit/common/enums/TokenType.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/token/TokenType.java index 475736886d30ae2c3747b101625341c2c3835d4d..7c4085853004d7354c900e3bd650bfe566e1c159 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/enums/TokenType.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/token/TokenType.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.common.enums; +package com.gitee.spirit.common.enums.token; public interface TokenType { diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/AccessPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/AccessPattern.java index ed8bcff0fa971c6853f058903bdbd84499469037..71ee2de1a89e38ce38683559f32f9989d8af3337 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/AccessPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/AccessPattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CollectionPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CollectionPattern.java index 0ff9d0903193fde11fc0b88b7f890feb196d3933..86be80fab9080ebf77aff942f9a049069ddd7e28 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CollectionPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CollectionPattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/ExpressionPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/ExpressionPattern.java index 7df70dc4c93cfb9aad5f5c4f41a077d14f21c27a..010dd1a397d0c5b09b93bbd42ee472fecc1e8e0c 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/ExpressionPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/ExpressionPattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import com.gitee.spirit.common.utils.PatternUtils; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/IdentifierPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/IdentifierPattern.java index f0a08ee9d30f11de758ab69801518d9d8a124dbf..b989a2c19951267595893e804571800cb63ee73e 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/IdentifierPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/IdentifierPattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/InitializePattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/InitializePattern.java index 5b7b24b56d3c783be6f3ee5b722f4f6d58268c5e..298b1354b158ee70e3166cd5aeb8fe97e49b6d36 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/InitializePattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/InitializePattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/LiteralPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/LiteralPattern.java index 6a84a3071e3ffe71a757c4cc693423769f6d854e..1985605b52f3cb3dd6d55f57645291b8f0666f1c 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/LiteralPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/LiteralPattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/MarkPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/MarkPattern.java index d32b02f108d99f3611d174f57c325ce62531dae2..eadf1006503ba43f18465241dffd9624b45ec823 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/MarkPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/MarkPattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/TypeDeclarePattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/TypeDeclarePattern.java index 9c17835da625793b9943b1bf955f4c63738f277b..c702c9a2c46c631633e796de8c7a06c8f0838ea4 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/pattern/TypeDeclarePattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/TypeDeclarePattern.java @@ -1,6 +1,6 @@ package com.gitee.spirit.common.pattern; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/utils/FileUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/FileUtils.java index cff000460b5471e484d2e938ea9c68edaa5216cf..673fb2e3ff45988bac678f962e328850375af967 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/utils/FileUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/FileUtils.java @@ -1,29 +1,17 @@ package com.gitee.spirit.common.utils; -import com.google.common.base.Charsets; -import com.google.common.io.Files; - -import java.io.File; import java.net.URL; public class FileUtils { - public static void generateFile(String outputPath, String relativePath, String text) { - try { - URL outputUrl = new File(outputPath).toURI().toURL(); - File file = new File(new URL(outputUrl + relativePath).toURI()); - File directory = file.getParentFile(); - if (!directory.exists()) { - directory.mkdirs(); - } - if (!file.exists()) { - file.createNewFile(); - } - Files.asCharSink(file, Charsets.UTF_8).write(text); + public static String getPath(URL inputFileURL, URL fileURL, String fileExtension) { + String path = fileURL.toString().replace(inputFileURL.toString(), "").replaceAll("/", "."); + path = path.endsWith("." + fileExtension) ? path.substring(0, path.lastIndexOf('.')) : path; + return path; + } - } catch (Exception e) { - throw new RuntimeException("Failed to generate file!"); - } + public static String getRelativePath(String path, String fileExtension) { + return path.replaceAll("\\.", "/") + "." + fileExtension; } } diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/utils/PatternUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/PatternUtils.java index 2f5c392bc6b079babd47418424016bbd904dbddd..eadd8aafeb35449195dc3c1bfbfd48606f223379 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/utils/PatternUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/PatternUtils.java @@ -1,7 +1,7 @@ package com.gitee.spirit.common.utils; -import com.gitee.spirit.common.enums.PrimitiveEnum; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.PrimitiveEnum; +import com.gitee.spirit.common.enums.token.TokenType; import com.gitee.spirit.common.pattern.TypeDeclarePattern; import java.util.regex.Pattern; diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/utils/PrimitiveUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/PrimitiveUtils.java index fb6cb48cb91a157e7f5a890516c1f1a6b19884f9..4bae3315730e694c0c4a3f9db6a75243ddba4ebd 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/utils/PrimitiveUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/PrimitiveUtils.java @@ -1,8 +1,8 @@ package com.gitee.spirit.common.utils; import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.enums.PrimitiveArrayEnum; -import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.common.enums.token.PrimitiveArrayEnum; +import com.gitee.spirit.common.enums.token.PrimitiveEnum; public class PrimitiveUtils { diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java index f895f26bd863ae17af64a7006c828df979d03184..0e211edaaf4763240325b506c4fbf95495cb40f0 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java @@ -13,30 +13,30 @@ import org.springframework.stereotype.Component; @Component public class SpringUtils implements ApplicationContextAware { - public static ApplicationContext context; - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - context = applicationContext; - } - - public static T getBean(Class requiredType) { - return context.getBean(requiredType); - } - - public static T getBean(String name, Class requiredType) { - return context.getBean(name, requiredType); - } - - public static Map getBeansOfType(Class type) { - return context.getBeansOfType(type); - } - - public static List getBeans(Class requiredType) { - Map beanMap = getBeansOfType(requiredType); - List beans = new ArrayList<>(beanMap.values()); - beans.sort(new AnnotationAwareOrderComparator()); - return beans; - } + public static ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + public static T getBean(Class requiredType) { + return context.getBean(requiredType); + } + +// public static T getBean(String name, Class requiredType) { +// return context.getBean(name, requiredType); +// } +// +// public static Map getBeansOfType(Class type) { +// return context.getBeansOfType(type); +// } +// +// public static List getBeans(Class requiredType) { +// Map beanMap = getBeansOfType(requiredType); +// List beans = new ArrayList<>(beanMap.values()); +// beans.sort(new AnnotationAwareOrderComparator()); +// return beans; +// } } \ No newline at end of file diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/utils/SymbolUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SymbolUtils.java index b7649edf3d818020d702cf0e96191834624875c7..84d666ab08969e7e9ca4cdf74cf4b6369964af1d 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/utils/SymbolUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SymbolUtils.java @@ -1,8 +1,8 @@ package com.gitee.spirit.common.utils; import cn.hutool.core.util.ArrayUtil; -import com.gitee.spirit.common.enums.OperatorEnum; -import com.gitee.spirit.common.enums.SeparatorEnum; +import com.gitee.spirit.common.enums.token.OperatorEnum; +import com.gitee.spirit.common.enums.token.SeparatorEnum; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-core3/pom.xml b/spirit-core3/pom.xml index b56a4b4c6d4eec6c9bc9aa4346814816017c7b6c..fcae80618b835c56de88ca0df0e223ba205c7425 100644 --- a/spirit-core3/pom.xml +++ b/spirit-core3/pom.xml @@ -4,12 +4,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-parent 3.0.0 spirit-core3 pom + spirit-core3-compile spirit-core3-element @@ -17,4 +18,5 @@ spirit-core3-visitor spirit-core3-xcode + \ No newline at end of file diff --git a/spirit-core3/spirit-core3-compile/pom.xml b/spirit-core3/spirit-core3-compile/pom.xml index 7ff5f988c009b4d2908a701bf1575afd1bf6c425..d3c47f30344a4786ea8d8da85dfacac5314d36a2 100644 --- a/spirit-core3/spirit-core3-compile/pom.xml +++ b/spirit-core3/spirit-core3-compile/pom.xml @@ -4,27 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3 3.0.0 spirit-core3-compile + - com.gitee.chentaoah + com.gitee.digital-engine spirit-common ${project.version} - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - + \ No newline at end of file diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/utils/ConfigUtils.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/ConfigManager.java similarity index 31% rename from spirit-common/src/main/java/com/gitee/spirit/common/utils/ConfigUtils.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/ConfigManager.java index 0d7b2be3c8fe2c285ff6953b3c295a60d9bbce92..d963f32c147e05f8534f0af1c7fd494d6a589f00 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/utils/ConfigUtils.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/ConfigManager.java @@ -1,76 +1,81 @@ -package com.gitee.spirit.common.utils; - -import com.gitee.spirit.common.constants.Constants; -import org.springframework.context.EnvironmentAware; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.constants.Config; - -@Component -public class ConfigUtils implements EnvironmentAware { - - public static Environment environment; - - @Override - public void setEnvironment(Environment environment) { - ConfigUtils.environment = environment; - } - - public static boolean contains(String key) { - return environment.containsProperty(key); - } - - public static String getProperty(String key) { - return environment.getProperty(key); - } - - public static String getProperty(String key, String defaultValue) { - return environment.getProperty(key, defaultValue); - } - - public static Boolean getProperty(String key, Boolean defaultValue) { - return environment.containsProperty(key) ? environment.getProperty(key, Boolean.class) : defaultValue; - } - - public static Integer getProperty(String key, Integer defaultValue) { - return environment.containsProperty(key) ? environment.getProperty(key, Integer.class) : defaultValue; - } - - public static Long getProperty(String key, Long defaultValue) { - return environment.containsProperty(key) ? environment.getProperty(key, Long.class) : defaultValue; - } - - public static String getInputPath() { - return ConfigUtils.getProperty(Config.INPUT_PATH); - } - - public static String getOutputPath() { - return ConfigUtils.getProperty(Config.OUTPUT_PATH); - } - - public static String getFileExtension() { - return ConfigUtils.getProperty(Config.FILE_EXTENSION, Constants.DEFAULT_FILE_EXTENSION); - } - - public static String getLangPackage() { - return ConfigUtils.getProperty(Config.LANG_PACKAGE); - } - - public static String getUtilPackage() { - return ConfigUtils.getProperty(Config.UTIL_PACKAGE); - } - - public static boolean isUseLombok() { - return Boolean.parseBoolean(ConfigUtils.getProperty(Config.USE_LOMBOK)); - } - - public static String getClassPaths() { - return ConfigUtils.getProperty(Config.CLASS_PATHS); - } - - public static boolean isDebug() { - return ConfigUtils.getProperty(Config.DEBUG, Constants.DEFAULT_DEBUG); - } - -} +package com.gitee.spirit.core3.compile; + +import cn.hutool.core.convert.Convert; +import com.gitee.spirit.core3.compile.api.CompileListenerAdapter; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.gitee.spirit.common.constants.Config; + +import java.util.Properties; + +@Component +@Order(-200) +public class ConfigManager extends CompileListenerAdapter { + + private static Properties properties; + + @Override + public void compileStarted(ParseContext parseContext, CoreCompiler coreCompiler) { + properties = parseContext.getProperties(); + } + + @Override + public void compileFinished(ParseContext parseContext, CoreCompiler coreCompiler) { + properties = null; + } + + public static boolean contains(String key) { + return properties.containsKey(key); + } + + public static String getProperty(String key) { + return properties.getProperty(key); + } + + public static String getProperty(String key, String defaultValue) { + return properties.getProperty(key, defaultValue); + } + + public static Boolean getProperty(String key, Boolean defaultValue) { + return Convert.convert(Boolean.class, getProperty(key), defaultValue); + } + + public static String getInputPath() { + return getProperty(Config.INPUT_PATH); + } + + public static String getTargetPackage() { + String targetPackage = getProperty(Config.TARGET_PACKAGE); + return "null".equals(targetPackage) || "none".equals(targetPackage) ? null : targetPackage; + } + + public static String getFileExtension() { + return getProperty(Config.FILE_EXTENSION, "sp"); + } + + public static String getOutputPath() { + return getProperty(Config.OUTPUT_PATH); + } + + public static String getLangPackage() { + return getProperty(Config.LANG_PACKAGE); + } + + public static String getUtilPackage() { + return getProperty(Config.UTIL_PACKAGE); + } + + public static boolean isUseLombok() { + return getProperty(Config.USE_LOMBOK, true); + } + + public static String getClassPaths() { + return getProperty(Config.CLASS_PATHS); + } + + public static boolean isDebugMode() { + return getProperty(Config.DEBUG_MODE, true); + } + +} diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/CoreCompiler.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/CoreCompiler.java index 5b6be29f293c8385f7212a92e5b9fa7be25c5438..aceef33f97ede4e9e4970d0e191afae703cd7545 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/CoreCompiler.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/CoreCompiler.java @@ -1,5 +1,6 @@ package com.gitee.spirit.core3.compile; +import com.gitee.spirit.common.constants.Config; import com.gitee.spirit.core3.compile.api.*; import com.gitee.spirit.core3.compile.entity.CompilationUnit; import com.gitee.spirit.core3.compile.entity.FileObject; @@ -13,12 +14,10 @@ import org.springframework.context.annotation.DependsOn; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @Slf4j @Component -@DependsOn("configUtils") public class CoreCompiler { @Autowired @@ -26,20 +25,31 @@ public class CoreCompiler { @Autowired private ApplicationContext applicationContext; @Autowired + private PropertiesMerger propertiesMerger; + @Autowired private FileManager fileManager; @Autowired(required = false) private TaskListener taskListener; @Autowired - private ParserFactory parserFactory; + private CoreParserFactory coreParserFactory; @Autowired(required = false) private SemanticParser semanticParser; @Autowired(required = false) private CodeGenerator codeGenerator; - public void compile(String[] args) { + public void compile(Properties properties) { log.info("Compiling started."); long start = System.currentTimeMillis(); - ParseContext parseContext = new ParseContext(environment, applicationContext); + ParseContext parseContext = ParseContext.builder() + .environment(environment).applicationContext(applicationContext) + .properties(properties).dependencies(new LinkedHashMap<>()).build(); + + propertiesMerger.mergeEnvironment(parseContext); + propertiesMerger.mergeBeans(parseContext, CompileListener.class, Config.COMPILE_LISTENERS); + @SuppressWarnings("unchecked") + List compileListeners = (List) parseContext.getProperties().get(Config.COMPILE_LISTENERS); + + compileStarted(parseContext, compileListeners, this); long now = System.currentTimeMillis(); List fileObjects = fileManager.parseFiles(parseContext); @@ -50,21 +60,43 @@ public class CoreCompiler { fileObjects.forEach(fileObject -> compilationUnits.add(parseFile(parseContext, fileObject))); log.info("[Main-2] Parsing all compilation units done. elapsed: {}ms", System.currentTimeMillis() - now); + compilationUnitsParsed(parseContext, compileListeners, compilationUnits); + if (semanticParser != null) { now = System.currentTimeMillis(); semanticParser.parseSemantic(parseContext, compilationUnits); log.info("[Main-3] Parsing all semantic units done. elapsed: {}ms", System.currentTimeMillis() - now); } + semanticsParsed(parseContext, compileListeners, compilationUnits); + if (codeGenerator != null) { now = System.currentTimeMillis(); codeGenerator.generateCode(parseContext, compilationUnits); log.info("[Main-4] Generating all code done. elapsed: {}ms", System.currentTimeMillis() - now); } + compileFinished(parseContext, compileListeners, this); + log.info("Compiling done. elapsed: {}ms", System.currentTimeMillis() - start); } + private void compileStarted(ParseContext parseContext, List compileListeners, CoreCompiler coreCompiler) { + compileListeners.forEach(compileListener -> compileListener.compileStarted(parseContext, coreCompiler)); + } + + private void compilationUnitsParsed(ParseContext parseContext, List compileListeners, List compilationUnits) { + compileListeners.forEach(compileListener -> compileListener.compilationUnitsParsed(parseContext, compilationUnits)); + } + + private void semanticsParsed(ParseContext parseContext, List compileListeners, List compilationUnits) { + compileListeners.forEach(compileListener -> compileListener.semanticsParsed(parseContext, compilationUnits)); + } + + private void compileFinished(ParseContext parseContext, List compileListeners, CoreCompiler coreCompiler) { + compileListeners.forEach(compileListener -> compileListener.compileFinished(parseContext, coreCompiler)); + } + private CompilationUnit parseFile(ParseContext parseContext, FileObject fileObject) { if (StringUtils.isBlank(fileObject.getContent())) { log.warn("The file content is empty! filename: {}", fileObject.getFilename()); @@ -75,7 +107,7 @@ public class CoreCompiler { if (taskListener != null) { taskListener.started(new TaskEvent(fileObject, null)); } - CoreParser coreParser = parserFactory.newParser(parseContext, fileObject); + CoreParser coreParser = coreParserFactory.newParser(parseContext, fileObject); CompilationUnit compilationUnit = coreParser.parseCompilationUnit(); log.info("Parsing done. elapsed: {}ms", System.currentTimeMillis() - now); if (taskListener != null) { diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/FileManager.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/FileManager.java index deda8d7edb127bfacbd96bc0970924f119076a8c..a48b749310a56cb58a522334d16c5b8d89308f70 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/FileManager.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/FileManager.java @@ -2,11 +2,15 @@ package com.gitee.spirit.core3.compile; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.utils.ConfigUtils; +import cn.hutool.core.util.URLUtil; +import com.gitee.spirit.common.constants.Config; +import com.gitee.spirit.core3.compile.api.CompileListener; import com.gitee.spirit.core3.compile.entity.FileObject; import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.google.common.base.Charsets; +import com.google.common.io.Files; import org.apache.commons.io.FileUtils; -import org.springframework.context.annotation.DependsOn; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.io.File; @@ -19,24 +23,50 @@ import java.util.List; public class FileManager { public List parseFiles(ParseContext parseContext) { - String inputPath = ConfigUtils.getInputPath(); - String fileExtension = ConfigUtils.getFileExtension(); + String inputPath = ConfigManager.getInputPath(); + String fileExtension = ConfigManager.getFileExtension(); + + File inputFile = new File(inputPath); + Assert.isTrue(inputFile.isDirectory(), "The input path must be a directory!"); + URL inputFileURL = URLUtil.getURL(inputFile); + + Collection files = FileUtils.listFiles(inputFile, new String[]{fileExtension}, true); + List fileObjects = new ArrayList<>(); + for (File file : files) { + URL fileURL = URLUtil.getURL(file); + String path = com.gitee.spirit.common.utils.FileUtils.getPath(inputFileURL, fileURL, fileExtension); + String filename = file.getName(); + String content = FileUtil.readUtf8String(file); + FileObject fileObject = new FileObject(fileURL, path, filename, content); + // 发布事件 + fileObjectParsed(parseContext, fileObject); + fileObjects.add(fileObject); + } + return fileObjects; + } + + @SuppressWarnings("unchecked") + private void fileObjectParsed(ParseContext parseContext, FileObject fileObject) { + List compileListeners = (List) parseContext.getProperties().get(Config.COMPILE_LISTENERS); + compileListeners.forEach(compileListener -> compileListener.fileObjectParsed(parseContext, fileObject)); + } + + public void generateFile(String path, String fileExtension, String content) { + String outputPath = ConfigManager.getOutputPath(); + if (StringUtils.isBlank(outputPath)) return; + + File outputFile = new File(outputPath); + Assert.isTrue(outputFile.isDirectory(), "The input path must be a directory!"); + URL outputFileURL = URLUtil.getURL(outputFile); + + String relativePath = com.gitee.spirit.common.utils.FileUtils.getRelativePath(path, fileExtension); + URL fileURL = URLUtil.url(outputFileURL + relativePath); + File file = FileUtil.file(fileURL); + File directory = file.getParentFile(); + if (!directory.exists()) directory.mkdirs(); try { - assert inputPath != null; - File inputFile = new File(inputPath); - Assert.isTrue(inputFile.isDirectory(), "The input path must be a directory!"); - URL inputFileUrl = inputFile.toURI().toURL(); - Collection files = FileUtils.listFiles(inputFile, new String[]{fileExtension}, true); - List fileObjects = new ArrayList<>(); - for (File file : files) { - URL fileUrl = file.toURI().toURL(); - String path = fileUrl.toString().replace(inputFileUrl.toString(), "").replaceAll("/", "."); - path = path.endsWith("." + fileExtension) ? path.substring(0, path.lastIndexOf('.')) : path; - String filename = file.getName(); - String content = FileUtil.readUtf8String(file); - fileObjects.add(new FileObject(path, filename, content)); - } - return fileObjects; + if (!file.exists()) file.createNewFile(); + Files.asCharSink(file, Charsets.UTF_8).write(content); } catch (Exception e) { throw new RuntimeException(e); diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/PropertiesMerger.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/PropertiesMerger.java new file mode 100644 index 0000000000000000000000000000000000000000..a9ef6459855eff63fa97cc1dc0f464f30a3d78f7 --- /dev/null +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/PropertiesMerger.java @@ -0,0 +1,43 @@ +package com.gitee.spirit.core3.compile; + +import com.gitee.spirit.core3.compile.entity.ParseContext; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.util.*; + +@Component +public class PropertiesMerger { + + public void mergeEnvironment(ParseContext parseContext) { + Environment environment = parseContext.getEnvironment(); + Properties properties = parseContext.getProperties(); + Map bindMap = Binder.get(environment).bind("", Bindable.mapOf(String.class, String.class)).get(); + bindMap.forEach((key, value) -> { + if (!properties.containsKey(key)) properties.put(key, value); + }); + } + + @SuppressWarnings("unchecked") + public void mergeBeans(ParseContext parseContext, Class requireType, String key) { + ApplicationContext applicationContext = parseContext.getApplicationContext(); + Properties properties = parseContext.getProperties(); + Map beanMap = applicationContext.getBeansOfType(requireType); + List beans = new ArrayList<>(beanMap.values()); + Object value = properties.get(key); + if (value != null) { + if (value instanceof List) { + beans.addAll((Collection) value); + } else { + beans.add((T) value); + } + } + beans.sort(new AnnotationAwareOrderComparator()); + properties.put(key, beans); + } + +} diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CompileListener.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CompileListener.java new file mode 100644 index 0000000000000000000000000000000000000000..1162711a7d442b7b95a0d4f14128341029580acc --- /dev/null +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CompileListener.java @@ -0,0 +1,22 @@ +package com.gitee.spirit.core3.compile.api; + +import com.gitee.spirit.core3.compile.CoreCompiler; +import com.gitee.spirit.core3.compile.entity.CompilationUnit; +import com.gitee.spirit.core3.compile.entity.FileObject; +import com.gitee.spirit.core3.compile.entity.ParseContext; + +import java.util.List; + +public interface CompileListener { + + void compileStarted(ParseContext parseContext, CoreCompiler coreCompiler); + + void fileObjectParsed(ParseContext parseContext, FileObject fileObject); + + void compilationUnitsParsed(ParseContext parseContext, List compilationUnits); + + void semanticsParsed(ParseContext parseContext, List compilationUnits); + + void compileFinished(ParseContext parseContext, CoreCompiler coreCompiler); + +} diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CompileListenerAdapter.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CompileListenerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..5e11e738cb75a8c9012b7346563c738d6df52c5b --- /dev/null +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CompileListenerAdapter.java @@ -0,0 +1,37 @@ +package com.gitee.spirit.core3.compile.api; + +import com.gitee.spirit.core3.compile.CoreCompiler; +import com.gitee.spirit.core3.compile.entity.CompilationUnit; +import com.gitee.spirit.core3.compile.entity.FileObject; +import com.gitee.spirit.core3.compile.entity.ParseContext; + +import java.util.List; + +public abstract class CompileListenerAdapter implements CompileListener { + + @Override + public void compileStarted(ParseContext parseContext, CoreCompiler coreCompiler) { + // ignore + } + + @Override + public void fileObjectParsed(ParseContext parseContext, FileObject fileObject) { + // ignore + } + + @Override + public void compilationUnitsParsed(ParseContext parseContext, List compilationUnits) { + // ignore + } + + @Override + public void semanticsParsed(ParseContext parseContext, List compilationUnits) { + // ignore + } + + @Override + public void compileFinished(ParseContext parseContext, CoreCompiler coreCompiler) { + // ignore + } + +} diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/LexerFactory.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreLexerFactory.java similarity index 38% rename from spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/LexerFactory.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreLexerFactory.java index 99b387201b77ab515b9f7a7989c58a9b985f1a85..4f4fa318ff53efb6e8f210ef7914cec804c347c0 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/LexerFactory.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreLexerFactory.java @@ -4,10 +4,10 @@ import com.gitee.spirit.core3.compile.entity.ParseContext; import java.util.List; -public interface LexerFactory { +public interface CoreLexerFactory { - CoreLexer newLexer(ParseContext parseContext, CharSequence charSequence); + CoreLexer newLexer(CharSequence charSequence); - CoreLexer newLexer(ParseContext parseContext, CharSequence charSequence, List splitChars); + CoreLexer newLexer(CharSequence charSequence, List splitChars); } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/ParserFactory.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreParserFactory.java similarity index 86% rename from spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/ParserFactory.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreParserFactory.java index a7fbca3b5c49d4ffc0a1384b9bcb42c577c49929..7efde6d2a962fcc484f86b2247502caeec16a60b 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/ParserFactory.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreParserFactory.java @@ -3,7 +3,7 @@ package com.gitee.spirit.core3.compile.api; import com.gitee.spirit.core3.compile.entity.FileObject; import com.gitee.spirit.core3.compile.entity.ParseContext; -public interface ParserFactory { +public interface CoreParserFactory { CoreParser newParser(ParseContext parseContext, FileObject fileObject); diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreScanner.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreScanner.java index c2fd805c7866ac6940a5790f5d43ee23dfe67da5..d5ee91b169ac6b10bed0dd2f42111c867074902d 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreScanner.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreScanner.java @@ -7,8 +7,8 @@ import java.util.List; public interface CoreScanner { - SCTree parseTree(); - List parseTokens(CharSequence charSequence); + SCTree parseTree(); + } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/ScannerFactory.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreScannerFactory.java similarity index 86% rename from spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/ScannerFactory.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreScannerFactory.java index 2e1c44a4cbfe9e48cf3646cbf6fb50f9ee0e6492..714a124e2dc336d5d92604dddeb8baf87b5af4d5 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/ScannerFactory.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/CoreScannerFactory.java @@ -3,7 +3,7 @@ package com.gitee.spirit.core3.compile.api; import com.gitee.spirit.core3.compile.entity.FileObject; import com.gitee.spirit.core3.compile.entity.ParseContext; -public interface ScannerFactory { +public interface CoreScannerFactory { CoreScanner newScanner(ParseContext parseContext, FileObject fileObject); diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/MergeTreeParser.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/MergeTreeMaker.java similarity index 65% rename from spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/MergeTreeParser.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/MergeTreeMaker.java index b7f74a8d833ac8979cfa065ca634a57956c04bb1..8c7a82735f08895800f2daf1936228ac1a32948e 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/MergeTreeParser.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/MergeTreeMaker.java @@ -4,8 +4,8 @@ import com.gitee.spirit.core3.compile.entity.FileObject; import com.gitee.spirit.core3.compile.entity.ParseTreeContext; import com.gitee.spirit.core3.compile.entity.SCTree; -public interface MergeTreeParser { +public interface MergeTreeMaker { - SCTree parseTree(ParseTreeContext parseTreeContext, FileObject fileObject); + SCTree parseMergeTree(ParseTreeContext parseTreeContext, FileObject fileObject); } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/TokenListener.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/TokensProcessor.java similarity index 54% rename from spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/TokenListener.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/TokensProcessor.java index eebfab1a6e0cc2916cbf6681146181f4c403077c..23cdaa88e47a066fe3e123cecb6bf76541c041ba 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/TokenListener.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/api/TokensProcessor.java @@ -4,8 +4,8 @@ import com.gitee.spirit.core3.compile.entity.Token; import java.util.List; -public interface TokenListener { +public interface TokensProcessor { - List postProcessTokens(boolean isSyntax, List tokens); + List processTokens(boolean parseSyntax, List tokens); } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/AbstractToken.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/AbstractToken.java index 89fe35f7d806397406e1822053438e72c696e1e8..2104766aedd4d13df121b4551e5978f6027b2777 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/AbstractToken.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/AbstractToken.java @@ -1,6 +1,6 @@ package com.gitee.spirit.core3.compile.entity; -import com.gitee.spirit.common.enums.*; +import com.gitee.spirit.common.enums.token.*; public abstract class AbstractToken { diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/AccessRule.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/AccessRule.java new file mode 100644 index 0000000000000000000000000000000000000000..220e7d7ccdb354c4ac2b31c7625344f20496856e --- /dev/null +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/AccessRule.java @@ -0,0 +1,31 @@ +package com.gitee.spirit.core3.compile.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.lang.reflect.Modifier; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AccessRule { + + public static final int EVEN_PRIVATE = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE; + public static final int PROTECTED = Modifier.PUBLIC | Modifier.PROTECTED; + public static final int ONLY_PUBLIC = Modifier.PUBLIC; + + // 是否静态 + private boolean isStatic; + // 进行位运算后得到的修饰符 + private int modifiers; + + public AccessRule lowerAccessLevel() { + if (modifiers == EVEN_PRIVATE) { + modifiers = PROTECTED; + } + return this; + } +} diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/FileObject.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/FileObject.java index 13ee09abc1f3767270aa8a2e84aec3001fb28654..d49ed6fa9aa915a8ece82d6d3d7a735cf3d12e3f 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/FileObject.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/FileObject.java @@ -3,9 +3,12 @@ package com.gitee.spirit.core3.compile.entity; import lombok.AllArgsConstructor; import lombok.Data; +import java.net.URL; + @Data @AllArgsConstructor public class FileObject { + private URL fileURL; private String path; private String filename; private String content; diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/ParseContext.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/ParseContext.java index dad1f1e5e6bbc7f73daca2af39a42ffa781544b1..8da1cce5b7f7120db30d417cb3e79764518f4761 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/ParseContext.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/ParseContext.java @@ -1,15 +1,23 @@ package com.gitee.spirit.core3.compile.entity; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + @Data +@Builder @NoArgsConstructor @AllArgsConstructor public class ParseContext { private Environment environment; private ApplicationContext applicationContext; + private Properties properties; + private Map> dependencies; } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/SCType.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/SCType.java index c41157b820e02ef9ed35a5ffda65a3278fb45f06..c3a62daa266a939583ec3f86c404e8869775b3f6 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/SCType.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/SCType.java @@ -19,14 +19,13 @@ public class SCType { private String className; private String simpleName; private String typeName; - private String genericName;// T K - private boolean isPrimitive;// 是否原始类型 - private boolean isArray;// 是否数组 - private boolean isNull;// 是否空值 - private boolean isWildcard;// 是否“?” - private boolean isNative;// 是否本地类型 - private int modifiers;// 进行位运算后得到的修饰符 - private List genericTypes;// 泛型参数 + private String genericName; // T K + private boolean isPrimitive; // 是否原始类型 + private boolean isArray; // 是否数组 + private boolean isNull; // 是否空值 + private boolean isWildcard; // 是否“?” + private boolean isNative; // 是否本地类型 + private List genericTypes; // 泛型参数 public boolean isTypeVariable() { return StringUtils.isNotEmpty(genericName); diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/Token.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/Token.java index e988092b4a0f79215a0123eebbfacd01bf7d87e7..e57d37b94ebe0bd0b2290ab4ddde629dffa2b1d0 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/Token.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/entity/Token.java @@ -1,8 +1,8 @@ package com.gitee.spirit.core3.compile.entity; -import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.common.enums.OperatorEnum; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.KeywordEnum; +import com.gitee.spirit.common.enums.token.OperatorEnum; +import com.gitee.spirit.common.enums.token.TokenType; import lombok.*; import java.util.Map; diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCharsParser.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCharsParser.java index 28eb48652cf4396f66ff15d93e2df33a13a226e5..dc639f5df78f712895f1ece3b304872549614996 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCharsParser.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCharsParser.java @@ -3,12 +3,9 @@ package com.gitee.spirit.core3.compile.impl; import com.gitee.spirit.core3.compile.NamesManager; import com.gitee.spirit.core3.compile.api.*; import com.gitee.spirit.core3.compile.entity.Name; -import com.gitee.spirit.core3.compile.entity.ParseContext; import com.gitee.spirit.core3.compile.entity.Region; import com.gitee.spirit.core3.compile.entity.Token; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -18,22 +15,17 @@ import java.util.List; public class DefaultCharsParser implements CharsParser { @Autowired - private Environment environment; - @Autowired - private ApplicationContext applicationContext; - @Autowired - private LexerFactory lexerFactory; + private CoreLexerFactory coreLexerFactory; @Autowired private NamesManager namesManager; @Autowired private TokenParser tokenParser; @Autowired(required = false) - private TokenListener tokenListener; + private TokensProcessor tokensProcessor; @Override public List parseWords(CharSequence charSequence) { - ParseContext parseContext = new ParseContext(environment, applicationContext); - CoreLexer coreLexer = lexerFactory.newLexer(parseContext, charSequence); + CoreLexer coreLexer = coreLexerFactory.newLexer(charSequence); List regions = coreLexer.parseRegions(); List words = new ArrayList<>(); for (Region region : regions) { @@ -45,8 +37,7 @@ public class DefaultCharsParser implements CharsParser { @Override public List parseTokens(CharSequence charSequence) { - ParseContext parseContext = new ParseContext(environment, applicationContext); - CoreLexer coreLexer = lexerFactory.newLexer(parseContext, charSequence); + CoreLexer coreLexer = coreLexerFactory.newLexer(charSequence); List regions = coreLexer.parseRegions(); List tokens = new ArrayList<>(); for (Region region : regions) { @@ -54,16 +45,15 @@ public class DefaultCharsParser implements CharsParser { Token token = tokenParser.parseToken(name.getValue()); tokens.add(token); } - if (tokenListener != null) { - tokens = tokenListener.postProcessTokens(true, tokens); + if (tokensProcessor != null) { + tokens = tokensProcessor.processTokens(true, tokens); } return tokens; } @Override public List parseTokens(CharSequence charSequence, Token token, List splitChars) { - ParseContext parseContext = new ParseContext(environment, applicationContext); - CoreLexer coreLexer = lexerFactory.newLexer(parseContext, charSequence, splitChars); + CoreLexer coreLexer = coreLexerFactory.newLexer(charSequence, splitChars); List regions = coreLexer.parseRegions(); List tokens = new ArrayList<>(); for (Region region : regions) { @@ -71,8 +61,8 @@ public class DefaultCharsParser implements CharsParser { Token subToken = tokenParser.parseToken(token, name.getValue()); tokens.add(subToken); } - if (tokenListener != null) { - tokens = tokenListener.postProcessTokens(false, tokens); + if (tokensProcessor != null) { + tokens = tokensProcessor.processTokens(false, tokens); } return tokens; } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreLexer.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreLexer.java index 45ec4e9172a68d911f990dda1072177d248a3e1d..f2065ed12cd7bad56a9fe2dc4a040a235709d708 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreLexer.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreLexer.java @@ -1,6 +1,5 @@ package com.gitee.spirit.core3.compile.impl; -import com.gitee.spirit.common.utils.SpringUtils; import com.gitee.spirit.core3.compile.api.CharHandler; import com.gitee.spirit.core3.compile.api.CharListener; import com.gitee.spirit.core3.compile.api.CoreLexer; @@ -10,7 +9,6 @@ import com.gitee.spirit.core3.compile.entity.Region; import com.gitee.spirit.core3.compile.handler.SpaceCharHandler; import com.gitee.spirit.core3.compile.utils.RegionUtils; import lombok.Data; -import org.springframework.context.ApplicationContext; import java.util.ArrayList; import java.util.List; @@ -18,7 +16,6 @@ import java.util.List; @Data public class DefaultCoreLexer implements CoreLexer { - private ParseContext parseContext; private CharSequence charSequence; private CharListener charListener; private List charHandlers; @@ -27,16 +24,18 @@ public class DefaultCoreLexer implements CoreLexer { private List splitChars; private List ignoreIndexes; - public DefaultCoreLexer(ParseContext parseContext, CharSequence charSequence) { - this.parseContext = parseContext; + public DefaultCoreLexer(CharSequence charSequence, CharListener charListener, + List charHandlers) { this.charSequence = charSequence; - ApplicationContext applicationContext = parseContext.getApplicationContext(); - this.charListener = applicationContext.getBean(CharListener.class); - this.charHandlers = SpringUtils.getBeans(CharHandler.class); + this.charListener = charListener; + this.charHandlers = charHandlers; } - public DefaultCoreLexer(ParseContext parseContext, CharSequence charSequence, List splitChars) { - this(parseContext, charSequence); + public DefaultCoreLexer(CharSequence charSequence, CharListener charListener, + List charHandlers, List splitChars) { + this.charSequence = charSequence; + this.charListener = charListener; + this.charHandlers = charHandlers; this.splitChars = splitChars; } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreLexerFactory.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreLexerFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..36af20c58fbc861182b4055e73e556a6beaa2714 --- /dev/null +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreLexerFactory.java @@ -0,0 +1,31 @@ +package com.gitee.spirit.core3.compile.impl; + +import com.gitee.spirit.core3.compile.api.CharHandler; +import com.gitee.spirit.core3.compile.api.CharListener; +import com.gitee.spirit.core3.compile.api.CoreLexer; +import com.gitee.spirit.core3.compile.api.CoreLexerFactory; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class DefaultCoreLexerFactory implements CoreLexerFactory { + + @Autowired + private CharListener charListener; + @Autowired + private List charHandlers; + + @Override + public CoreLexer newLexer(CharSequence charSequence) { + return new DefaultCoreLexer(charSequence, charListener, charHandlers); + } + + @Override + public CoreLexer newLexer(CharSequence charSequence, List splitChars) { + return new DefaultCoreLexer(charSequence, charListener, charHandlers, splitChars); + } + +} diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreParser.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreParser.java index fe59feca2c330f6ad270818df1501da9ab6c387d..84c1ab3573780e632d1676d934e4e12529c759de 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreParser.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreParser.java @@ -2,13 +2,13 @@ package com.gitee.spirit.core3.compile.impl; import com.gitee.spirit.core3.compile.api.CoreParser; import com.gitee.spirit.core3.compile.api.CoreScanner; -import com.gitee.spirit.core3.compile.api.ScannerFactory; import com.gitee.spirit.core3.compile.api.TreeMaker; import com.gitee.spirit.core3.compile.entity.*; +import lombok.AllArgsConstructor; import lombok.Data; -import org.springframework.context.ApplicationContext; @Data +@AllArgsConstructor public class DefaultCoreParser implements CoreParser { private ParseContext parseContext; @@ -16,15 +16,6 @@ public class DefaultCoreParser implements CoreParser { private CoreScanner coreScanner; private TreeMaker treeMaker; - public DefaultCoreParser(ParseContext parseContext, FileObject fileObject) { - this.parseContext = parseContext; - this.fileObject = fileObject; - ApplicationContext applicationContext = parseContext.getApplicationContext(); - ScannerFactory scannerFactory = applicationContext.getBean(ScannerFactory.class); - this.coreScanner = scannerFactory.newScanner(parseContext, fileObject); - this.treeMaker = applicationContext.getBean(TreeMaker.class); - } - @Override public CompilationUnit parseCompilationUnit() { SCTree scTree = coreScanner.parseTree(); diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultParserFactory.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreParserFactory.java similarity index 41% rename from spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultParserFactory.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreParserFactory.java index 7fa6ba45a977a6ccb4e1abaf5d9599929b2c275e..a49740a6313c674f181f1559636a56a6c60708e6 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultParserFactory.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreParserFactory.java @@ -1,17 +1,23 @@ package com.gitee.spirit.core3.compile.impl; -import com.gitee.spirit.core3.compile.api.CoreParser; -import com.gitee.spirit.core3.compile.api.ParserFactory; +import com.gitee.spirit.core3.compile.api.*; import com.gitee.spirit.core3.compile.entity.FileObject; import com.gitee.spirit.core3.compile.entity.ParseContext; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class DefaultParserFactory implements ParserFactory { +public class DefaultCoreParserFactory implements CoreParserFactory { + + @Autowired + private CoreScannerFactory coreScannerFactory; + @Autowired + private TreeMaker treeMaker; @Override public CoreParser newParser(ParseContext parseContext, FileObject fileObject) { - return new DefaultCoreParser(parseContext, fileObject); + CoreScanner coreScanner = coreScannerFactory.newScanner(parseContext, fileObject); + return new DefaultCoreParser(parseContext, fileObject, coreScanner, treeMaker); } } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreScanner.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreScanner.java index 87a1b9e17b987452497e873b3bac81f4a2b1b270..109d83f9b02b40582985d81c7408b8ff3f153959 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreScanner.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreScanner.java @@ -2,37 +2,30 @@ package com.gitee.spirit.core3.compile.impl; import com.gitee.spirit.core3.compile.api.CharsParser; import com.gitee.spirit.core3.compile.api.CoreScanner; -import com.gitee.spirit.core3.compile.api.MergeTreeParser; +import com.gitee.spirit.core3.compile.api.MergeTreeMaker; import com.gitee.spirit.core3.compile.entity.*; +import lombok.AllArgsConstructor; import lombok.Data; -import org.springframework.context.ApplicationContext; import java.util.List; @Data +@AllArgsConstructor public class DefaultCoreScanner implements CoreScanner { private ParseContext parseContext; private FileObject fileObject; - private MergeTreeParser mergeTreeParser; private CharsParser charsParser; - - public DefaultCoreScanner(ParseContext parseContext, FileObject fileObject) { - this.parseContext = parseContext; - this.fileObject = fileObject; - ApplicationContext applicationContext = parseContext.getApplicationContext(); - this.mergeTreeParser = applicationContext.getBean(MergeTreeParser.class); - this.charsParser = applicationContext.getBean(CharsParser.class); - } + private MergeTreeMaker mergeTreeMaker; @Override - public SCTree parseTree() { - return mergeTreeParser.parseTree(new ParseTreeContext(parseContext, fileObject, this), fileObject); + public List parseTokens(CharSequence charSequence) { + return charsParser.parseTokens(charSequence); } @Override - public List parseTokens(CharSequence charSequence) { - return charsParser.parseTokens(charSequence); + public SCTree parseTree() { + return mergeTreeMaker.parseMergeTree(new ParseTreeContext(parseContext, fileObject, this), fileObject); } } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultScannerFactory.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreScannerFactory.java similarity index 43% rename from spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultScannerFactory.java rename to spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreScannerFactory.java index c688db5044c20948a7349b963c40201d59762d2a..4f605aaef0bbd1fee26dd074c7a041fefa2115f7 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultScannerFactory.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultCoreScannerFactory.java @@ -1,17 +1,25 @@ package com.gitee.spirit.core3.compile.impl; +import com.gitee.spirit.core3.compile.api.CharsParser; import com.gitee.spirit.core3.compile.api.CoreScanner; -import com.gitee.spirit.core3.compile.api.ScannerFactory; +import com.gitee.spirit.core3.compile.api.MergeTreeMaker; +import com.gitee.spirit.core3.compile.api.CoreScannerFactory; import com.gitee.spirit.core3.compile.entity.FileObject; import com.gitee.spirit.core3.compile.entity.ParseContext; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class DefaultScannerFactory implements ScannerFactory { +public class DefaultCoreScannerFactory implements CoreScannerFactory { + + @Autowired + private CharsParser charsParser; + @Autowired + private MergeTreeMaker mergeTreeMaker; @Override public CoreScanner newScanner(ParseContext parseContext, FileObject fileObject) { - return new DefaultCoreScanner(parseContext, fileObject); + return new DefaultCoreScanner(parseContext, fileObject, charsParser, mergeTreeMaker); } } diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultLexerFactory.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultLexerFactory.java deleted file mode 100644 index e52e3d24bc5cf6a234f5e7825d80e0c16f75a653..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultLexerFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gitee.spirit.core3.compile.impl; - -import com.gitee.spirit.core3.compile.api.CoreLexer; -import com.gitee.spirit.core3.compile.api.LexerFactory; -import com.gitee.spirit.core3.compile.entity.ParseContext; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class DefaultLexerFactory implements LexerFactory { - - @Override - public CoreLexer newLexer(ParseContext parseContext, CharSequence charSequence) { - return new DefaultCoreLexer(parseContext, charSequence); - } - - @Override - public CoreLexer newLexer(ParseContext parseContext, CharSequence charSequence, List splitChars) { - return new DefaultCoreLexer(parseContext, charSequence, splitChars); - } - -} diff --git a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultTokenParser.java b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultTokenParser.java index 8b7eb458370b772b875fd4987a401be6f88ad278..12732ef2999ac85c6da016a6de6a251dfa51bcba 100644 --- a/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultTokenParser.java +++ b/spirit-core3/spirit-core3-compile/src/main/java/com/gitee/spirit/core3/compile/impl/DefaultTokenParser.java @@ -1,7 +1,7 @@ package com.gitee.spirit.core3.compile.impl; import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.enums.*; +import com.gitee.spirit.common.enums.token.*; import com.gitee.spirit.common.pattern.*; import com.gitee.spirit.common.utils.PatternUtils; import com.gitee.spirit.core3.compile.api.CharsParser; @@ -60,20 +60,20 @@ public class DefaultTokenParser implements TokenParser { } private TokenType getTokenTypeByName(String value) { - TokenType tokenType = KeywordEnum.getKeyword(value);// 关键字 + TokenType tokenType = KeywordEnum.getKeyword(value); // 关键字 if (tokenType == null) { // 描述符 tokenType = ModifierEnum.getModifier(value); } - if (tokenType == null) {// 操作符 + if (tokenType == null) { // 操作符 tokenType = OperatorEnum.getOperator(value); } if (tokenType == null) { // 分隔符 tokenType = SeparatorEnum.getSeparator(value); } - if (tokenType == null) {// 原始类型 + if (tokenType == null) { // 原始类型 tokenType = PrimitiveEnum.getPrimitiveBySimple(value); } - if (tokenType == null) {// 原始类型 + if (tokenType == null) { // 原始类型 tokenType = PrimitiveArrayEnum.getPrimitiveArrayBySimple(value); } return tokenType; @@ -81,25 +81,25 @@ public class DefaultTokenParser implements TokenParser { private TokenType getTokenTypeByPattern(String value) { TokenType tokenType = MarkPattern.getTokenType(value); // 注解 - if (tokenType == null) {// 类型 + if (tokenType == null) { // 类型 tokenType = TypeDeclarePattern.getTokenType(value); } if (tokenType == null) { // 初始化 tokenType = InitializePattern.getTokenType(value); } - if (tokenType == null) {// 访问 + if (tokenType == null) { // 访问 tokenType = AccessPattern.getTokenType(value); } if (tokenType == null) { // 字面值 tokenType = LiteralPattern.getTokenType(value); } - if (tokenType == null) {// 集合 + if (tokenType == null) { // 集合 tokenType = CollectionPattern.getTokenType(value); } - if (tokenType == null) {// 表达式 + if (tokenType == null) { // 表达式 tokenType = ExpressionPattern.getTokenType(value); } - if (tokenType == null) {// 标识符 + if (tokenType == null) { // 标识符 tokenType = IdentifierPattern.getTokenType(value); } return tokenType; diff --git a/spirit-core3/spirit-core3-element/pom.xml b/spirit-core3/spirit-core3-element/pom.xml index 662f4a645b76a5ae3f6d4c5a5882fe00b6b20adb..056f583b2f1c8d53f5ae0816918cc1082cbfb451 100644 --- a/spirit-core3/spirit-core3-element/pom.xml +++ b/spirit-core3/spirit-core3-element/pom.xml @@ -4,16 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3 3.0.0 spirit-core3-element + - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3-compile ${project.version} + \ No newline at end of file diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/ElementTokenListener.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/ElementTokensProcessor.java similarity index 73% rename from spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/ElementTokenListener.java rename to spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/ElementTokensProcessor.java index 268abdfef0986ad35fa615d85678f7b98df6307a..7acf408f4c03ad01dce785c4ec8d0eb26846f070 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/ElementTokenListener.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/ElementTokensProcessor.java @@ -2,28 +2,28 @@ package com.gitee.spirit.core3.element; import cn.hutool.core.lang.Assert; import com.gitee.spirit.common.utils.Collectors; -import com.gitee.spirit.core3.compile.api.TokenListener; +import com.gitee.spirit.core3.compile.api.TokensProcessor; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.api.SyntaxParser; -import com.gitee.spirit.core3.element.api.SyntaxTreeMaker; +import com.gitee.spirit.core3.element.api.TreeNodeParser; import com.gitee.spirit.core3.element.entity.*; -import com.gitee.spirit.core3.element.enums.SyntaxEnum; +import com.gitee.spirit.common.enums.element.SyntaxEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; @Component -public class ElementTokenListener implements TokenListener { +public class ElementTokensProcessor implements TokensProcessor { @Autowired private SyntaxParser syntaxParser; @Autowired - private SyntaxTreeMaker syntaxTreeMaker; + private TreeNodeParser treeNodeParser; @Override - public List postProcessTokens(boolean isSyntax, List tokens) { - if (isSyntax) { + public List processTokens(boolean parseSyntax, List tokens) { + if (parseSyntax) { Statement modifiers = parseModifiers(tokens); return newElement(modifiers, tokens); } @@ -39,10 +39,10 @@ public class ElementTokenListener implements TokenListener { List treeNodes = null; if (syntaxEnum != null) { if (syntaxEnum.category == SyntaxEnum.CategoryEnum.WITH_TREE) { - treeNodes = syntaxTreeMaker.parseNodes(tokens); + treeNodes = treeNodeParser.parseNodes(tokens); } } else { - treeNodes = syntaxTreeMaker.parseNodes(tokens); + treeNodes = treeNodeParser.parseNodes(tokens); syntaxEnum = syntaxParser.parseSyntaxByTree(treeNodes); } Assert.notNull(syntaxEnum, "Unable to parse syntax!tokens: " + tokens); diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxEnumParser.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxEnumParser.java new file mode 100644 index 0000000000000000000000000000000000000000..7a849c58a1fc9b45f65301ce35075d078c41cfcb --- /dev/null +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxEnumParser.java @@ -0,0 +1,12 @@ +package com.gitee.spirit.core3.element.api; + +import com.gitee.spirit.common.enums.element.SyntaxEnum; +import com.gitee.spirit.core3.compile.entity.Token; + +import java.util.List; + +public interface SyntaxEnumParser { + + SyntaxEnum parseSyntaxEnum(List tokens); + +} diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxParser.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxParser.java index 6eefa247ff56c2947fefc63fd12b8f74ab5e076a..9235003340aecf271d1748f101d656565320a423 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxParser.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxParser.java @@ -2,7 +2,7 @@ package com.gitee.spirit.core3.element.api; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.TreeNode; -import com.gitee.spirit.core3.element.enums.SyntaxEnum; +import com.gitee.spirit.common.enums.element.SyntaxEnum; import java.util.List; diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/TreeNodeDelegate.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/TreeNodeDelegate.java new file mode 100644 index 0000000000000000000000000000000000000000..f09088f509eef19d2b4c2eea1b0639ef099d28b9 --- /dev/null +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/TreeNodeDelegate.java @@ -0,0 +1,16 @@ +package com.gitee.spirit.core3.element.api; + +import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.element.entity.TreeNode; + +import java.util.List; + +public interface TreeNodeDelegate { + + void markTreeId(List treeNodes); + + int findFromIndex(Statement statement, int index); + + int findToIndex(Statement statement, int index); + +} diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxTreeMaker.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/TreeNodeParser.java similarity index 86% rename from spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxTreeMaker.java rename to spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/TreeNodeParser.java index 69bfbccf3c198ea3bb9c879d3b22e69860aa0047..a3664c5987aa561372b40c665ba366511eb60465 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/SyntaxTreeMaker.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/api/TreeNodeParser.java @@ -5,7 +5,7 @@ import com.gitee.spirit.core3.element.entity.TreeNode; import java.util.List; -public interface SyntaxTreeMaker { +public interface TreeNodeParser { List parseNodes(List tokens); diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/Element.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/Element.java index 6fdfd2b8c3000dea5f0f9655534031c44dff6f58..620de348509924f7fe1d28cba639b8130bcc46e1 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/Element.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/Element.java @@ -2,8 +2,8 @@ package com.gitee.spirit.core3.element.entity; import com.gitee.spirit.common.utils.Collectors; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.common.enums.ModifierEnum; -import com.gitee.spirit.core3.element.enums.SyntaxEnum; +import com.gitee.spirit.common.enums.token.ModifierEnum; +import com.gitee.spirit.common.enums.element.SyntaxEnum; import lombok.Getter; import lombok.Setter; diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/SyntaxTree.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/SyntaxTree.java index 481843bbee19202f4d5e004f5e889dfc25850b96..3fc4a24664b96f4a44e93a69d504c581d19d70dc 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/SyntaxTree.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/entity/SyntaxTree.java @@ -1,7 +1,7 @@ package com.gitee.spirit.core3.element.entity; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.enums.SyntaxEnum; +import com.gitee.spirit.common.enums.element.SyntaxEnum; import lombok.Getter; import lombok.Setter; diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxEnumParser.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxEnumParser.java new file mode 100644 index 0000000000000000000000000000000000000000..c19244522fb79caf484487dbf3e858ff30e6ba61 --- /dev/null +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxEnumParser.java @@ -0,0 +1,59 @@ +package com.gitee.spirit.core3.element.impl; + +import com.gitee.spirit.common.enums.token.TokenType; +import com.gitee.spirit.common.enums.element.SyntaxEnum; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.api.SyntaxEnumParser; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class DefaultSyntaxEnumParser implements SyntaxEnumParser { + + @Override + public SyntaxEnum parseSyntaxEnum(List tokens) { + Token firstToken = tokens.get(0); + List syntaxEnums = SyntaxEnum.getSyntaxEnums(firstToken.toString()); + for (SyntaxEnum syntaxEnum : syntaxEnums) { + boolean isMatch = doParseSyntaxEnum(syntaxEnum, tokens); + if (isMatch) return syntaxEnum; + } + return null; + } + + private boolean doParseSyntaxEnum(SyntaxEnum syntaxEnum, List tokens) { + for (int index = 0; index < syntaxEnum.values.length; index++) { + Object value = syntaxEnum.values[index]; + if (value == null) continue; + if (index < tokens.size()) { + Token token = tokens.get(index); + if (value instanceof String) { + String string = (String) value; + if ("@Type".equals(string)) { + if (!token.isAnyType()) { + return false; + } + } else if (string.startsWith("@End:")) { + Token lastToken = tokens.get(tokens.size() - 1); + if (!string.equals("@End:" + lastToken)) { + return false; + } + + } else if (!string.equals(token.toString())) { + return false; + } + } else if (value instanceof TokenType) { + TokenType tokenType = (TokenType) value; + if (tokenType != token.getTokenType()) { + return false; + } + } + } else { + return false; + } + } + return true; + } + +} diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxParser.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxParser.java index b1224257a0a337364161e1a20d6cc21f4762acc6..a44213df493d0b29cc27183c209f955764777c56 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxParser.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxParser.java @@ -1,11 +1,13 @@ package com.gitee.spirit.core3.element.impl; import com.gitee.spirit.common.constants.Attachment; -import com.gitee.spirit.common.enums.OperatorEnum; +import com.gitee.spirit.common.enums.token.OperatorEnum; import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.api.SyntaxEnumParser; import com.gitee.spirit.core3.element.api.SyntaxParser; import com.gitee.spirit.core3.element.entity.TreeNode; -import com.gitee.spirit.core3.element.enums.SyntaxEnum; +import com.gitee.spirit.common.enums.element.SyntaxEnum; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; @@ -14,12 +16,14 @@ import java.util.Objects; @Component public class DefaultSyntaxParser implements SyntaxParser { + @Autowired + private SyntaxEnumParser syntaxEnumParser; + @Override public SyntaxEnum parseSyntaxByTokens(List tokens) { - SyntaxEnum syntaxEnum = SyntaxEnum.parseSyntax(tokens); - if (syntaxEnum != null) { - return syntaxEnum; - } + SyntaxEnum syntaxEnum = syntaxEnumParser.parseSyntaxEnum(tokens); + if (syntaxEnum != null) return syntaxEnum; + Token firstToken = tokens.get(0); Token secondToken = tokens.size() >= 2 ? tokens.get(1) : null; Token thirdToken = tokens.size() >= 3 ? tokens.get(2) : null; @@ -28,11 +32,11 @@ public class DefaultSyntaxParser implements SyntaxParser { if (firstToken.isVariable()) { if (secondToken != null && "=".equals(secondToken.toString())) { if (tokens.size() == 3 && "{".equals(Objects.requireNonNull(thirdToken).toString())) { - return SyntaxEnum.STRUCT_ASSIGN;// var = { + return SyntaxEnum.STRUCT_ASSIGN; // var = { } else if (thirdToken != null && (thirdToken.isAnyType() || thirdToken.isVariable())) { if (tokens.size() == 4 && "{".equals(Objects.requireNonNull(fourthToken).toString())) { - return SyntaxEnum.STRUCT_ASSIGN;// var = Example{ // var = $Example{ + return SyntaxEnum.STRUCT_ASSIGN; // var = Example{ // var = $Example{ } } } @@ -63,20 +67,20 @@ public class DefaultSyntaxParser implements SyntaxParser { } else if (firstToken.getTokenType() == OperatorEnum.EQ) { Token prevToken = firstNode.getPrev().getToken(); - if (prevToken.isAnyType()) {// String text = "abc" + if (prevToken.isAnyType()) { // String text = "abc" return SyntaxEnum.DECLARE_ASSIGN; - } else if (prevToken.isIdentifier()) {// text = "abc" + } else if (prevToken.isIdentifier()) { // text = "abc" return SyntaxEnum.ASSIGN; - } else if (prevToken.isVisitIdentifier()) {// var.text = "abc" + } else if (prevToken.isVisitIdentifier()) { // var.text = "abc" return SyntaxEnum.FIELD_ASSIGN; } - } else if (firstToken.isLocalMethod()) {// doSomething() + } else if (firstToken.isLocalMethod()) { // doSomething() return SyntaxEnum.INVOKE; - } else if (firstToken.isVisitMethod()) {// list.get(0) + } else if (firstToken.isVisitMethod()) { // list.get(0) return SyntaxEnum.INVOKE; } return null; diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/utils/TreeUtils.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultTreeNodeDelegate.java similarity index 30% rename from spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/utils/TreeUtils.java rename to spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultTreeNodeDelegate.java index 006edcc7d57ea2c106fd3db58d99b8ec68b4e1b8..e8e43fa5e213e881f17e779ac3aec1d9a9052409 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/utils/TreeUtils.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultTreeNodeDelegate.java @@ -1,11 +1,53 @@ -package com.gitee.spirit.core3.xcode.utils; +package com.gitee.spirit.core3.element.impl; import com.gitee.spirit.common.constants.Attachment; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.api.TreeNodeDelegate; import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.element.entity.TreeNode; +import org.springframework.stereotype.Component; -public class TreeUtils { +import java.util.List; - public static int findIndex(Statement statement, int index, int step) { +@Component +public class DefaultTreeNodeDelegate implements TreeNodeDelegate { + + @Override + public void markTreeId(List treeNodes) { + for (int index = 0; index < treeNodes.size(); index++) { + TreeNode treeNode = treeNodes.get(index); + markTreeId(String.valueOf(index), treeNode); + } + } + + @SuppressWarnings("unchecked") + private void markTreeId(String treeId, TreeNode treeNode) { + Token token = treeNode.getToken(); + token.getAttachment().put(Attachment.TREE_ID, treeId); + if (treeNode.getPrev() != null) { + markTreeId(treeId + "-" + "0", treeNode.getPrev()); + } + if (treeNode.getNext() != null) { + markTreeId(treeId + "-" + "1", treeNode.getNext()); + } + Object value = token.getValue(); + if (!(value instanceof Statement) && value instanceof List) { + markTreeId((List) token.getValue()); + } + } + + @Override + public int findFromIndex(Statement statement, int index) { + return findIndexByStep(statement, index, -1); + } + + @Override + public int findToIndex(Statement statement, int index) { + int finalIndex = findIndexByStep(statement, index, 1); + return finalIndex >= 0 ? finalIndex + 1 : finalIndex; + } + + private int findIndexByStep(Statement statement, int index, int step) { int finalIndex = -1; String treeId = (String) statement.get(index).getAttachment().get(Attachment.TREE_ID); for (int idx = index + step; idx >= 0 && idx < statement.size(); idx += step) { @@ -17,13 +59,4 @@ public class TreeUtils { return finalIndex; } - public static int findStart(Statement statement, int index) { - return findIndex(statement, index, -1); - } - - public static int findEnd(Statement statement, int index) { - int finalIndex = findIndex(statement, index, 1); - return finalIndex >= 0 ? finalIndex + 1 : finalIndex; - } - } diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxTreeMaker.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultTreeNodeParser.java similarity index 95% rename from spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxTreeMaker.java rename to spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultTreeNodeParser.java index 3667da8d37879d8029df1a514df51781cfc91d02..c6e390831125cb6caea52b82a5d5816f84fb9f1c 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultSyntaxTreeMaker.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/impl/DefaultTreeNodeParser.java @@ -3,8 +3,8 @@ package com.gitee.spirit.core3.element.impl; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.common.utils.Collectors; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.common.enums.OperatorEnum; -import com.gitee.spirit.core3.element.api.SyntaxTreeMaker; +import com.gitee.spirit.common.enums.token.OperatorEnum; +import com.gitee.spirit.core3.element.api.TreeNodeParser; import com.gitee.spirit.core3.element.entity.TreeNode; import com.gitee.spirit.core3.element.utils.PriorityNode; import org.springframework.stereotype.Component; @@ -12,7 +12,7 @@ import org.springframework.stereotype.Component; import java.util.*; @Component -public class DefaultSyntaxTreeMaker implements SyntaxTreeMaker { +public class DefaultTreeNodeParser implements TreeNodeParser { @Override @SuppressWarnings("unchecked") @@ -111,7 +111,7 @@ public class DefaultSyntaxTreeMaker implements SyntaxTreeMaker { throw new RuntimeException("Unable to know the operand of the symbol!"); } } - return treeNodes.stream().filter(Objects::nonNull).collect(java.util.stream.Collectors.toList());// 过滤掉所有null + return treeNodes.stream().filter(Objects::nonNull).collect(java.util.stream.Collectors.toList()); // 过滤掉所有null } private void resetOperandIfMultiple(List nodes, int index, Token currentToken) { diff --git a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/utils/StatementUtils.java b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/utils/StatementUtils.java index b1873aa2d6a13151316e34bc10d520d490e88c8c..62c01f5ed81bf1c267324a91113abe2a7175c131 100644 --- a/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/utils/StatementUtils.java +++ b/spirit-core3/spirit-core3-element/src/main/java/com/gitee/spirit/core3/element/utils/StatementUtils.java @@ -1,8 +1,8 @@ package com.gitee.spirit.core3.element.utils; import com.gitee.spirit.common.constants.Attachment; -import com.gitee.spirit.common.enums.OperatorEnum.OperandEnum; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.OperatorEnum.OperandEnum; +import com.gitee.spirit.common.enums.token.TokenType; import com.gitee.spirit.common.utils.Collectors; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Statement; diff --git a/spirit-core3/spirit-core3-tree/pom.xml b/spirit-core3/spirit-core3-tree/pom.xml index 8925e9a850c80d47c606123832ce091b7532b9cf..cfe94338875881ba5b011cc4387db3d58367cd90 100644 --- a/spirit-core3/spirit-core3-tree/pom.xml +++ b/spirit-core3/spirit-core3-tree/pom.xml @@ -4,16 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3 3.0.0 spirit-core3-tree + - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3-element ${project.version} + \ No newline at end of file diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/CompilationTreeMaker.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/CompilationTreeMaker.java index 22f7f53353ad48be0ebb51322428dfd76b6bcd25..60c78d4e84c2ea22f9a79eb9052331176b49b514 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/CompilationTreeMaker.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/CompilationTreeMaker.java @@ -1,10 +1,8 @@ package com.gitee.spirit.core3.tree; import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.common.enums.ModifierEnum; -import com.gitee.spirit.common.enums.SeparatorEnum; -import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.common.enums.token.KeywordEnum; +import com.gitee.spirit.common.enums.token.ModifierEnum; import com.gitee.spirit.common.utils.PatternUtils; import com.gitee.spirit.common.utils.TypeUtils; import com.gitee.spirit.core3.compile.api.CoreScanner; @@ -17,7 +15,9 @@ import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; import com.gitee.spirit.core3.tree.entity.*; -import com.gitee.spirit.core3.tree.enums.AccessState; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; +import com.gitee.spirit.core3.tree.entity.clazz.*; +import com.gitee.spirit.core3.tree.entity.VisitState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -39,31 +39,32 @@ public class CompilationTreeMaker implements TreeMaker { compilationTree.setFieldTrees(new LinkedHashMap<>()); compilationTree.setMethodTrees(new LinkedHashMap<>()); - MergeTree rootMergeTree = (MergeTree) scTree; - compilationTree.setMergeTree(rootMergeTree); + MergeElementTree rootMergeElementTree = (MergeElementTree) scTree; + compilationTree.setMergeElementTree(rootMergeElementTree); List annotationTrees = new ArrayList<>(); - for (StatementTree statementTree : rootMergeTree.getChildren()) { - Element element = statementTree.getElement(); + for (ElementTree elementTree : rootMergeElementTree.getChildren()) { + Element element = elementTree.getElement(); if (element.isPackage()) { - PackageTree packageTree = packageDeclaration(statementTree); + PackageTree packageTree = packageDeclaration(elementTree); compilationTree.setPackageTree(packageTree); } else if (element.isImport()) { - ImportTree importTree = importDeclaration(statementTree); + ImportTree importTree = importDeclaration(elementTree); + // Note that short names are used here compilationTree.getImportTrees().put(importTree.getShortName(), importTree); } else if (element.isAnnotation()) { - AnnotationTree annotationTree = annotationDeclaration(statementTree); + AnnotationTree annotationTree = annotationDeclaration(elementTree); annotationTrees.add(annotationTree); } else if (element.isFieldDeclare()) { element.addModifiers(ModifierEnum.PUBLIC, ModifierEnum.STATIC); - FieldTree fieldTree = fieldDeclaration(annotationTrees, statementTree); + FieldTree fieldTree = fieldDeclaration(annotationTrees, elementTree); compilationTree.getFieldTrees().put(fieldTree.getFieldName(), fieldTree); } else if (element.isMethodDeclare()) { element.addModifiers(ModifierEnum.PUBLIC, ModifierEnum.STATIC); - MethodTree methodTree = methodDeclaration(annotationTrees, statementTree); + MethodTree methodTree = methodDeclaration(annotationTrees, elementTree); Map> allMethodTrees = compilationTree.getMethodTrees(); allMethodTrees.computeIfAbsent(methodTree.getMethodName(), key -> new ArrayList<>()); List methodTrees = allMethodTrees.get(methodTree.getMethodName()); @@ -76,44 +77,46 @@ public class CompilationTreeMaker implements TreeMaker { } else if (element.isClassDeclare()) { Assert.isNull(compilationTree.getClassTree(), "There can only be one class tree!"); - ClassTree classTree = classDeclaration(annotationTrees, (MergeTree) statementTree); + ClassTree classTree = classDeclaration(annotationTrees, (MergeElementTree) elementTree); compilationTree.setClassTree(classTree); } } + if (compilationTree.getPackageTree() == null) { CoreScanner coreScanner = parseTreeContext.getCoreScanner(); String path = parseTreeContext.getFileObject().getPath(); Element element = (Element) coreScanner.parseTokens("package " + TypeUtils.getPackage(path)); - PackageTree packageTree = packageDeclaration(new StatementTree(element)); + PackageTree packageTree = packageDeclaration(new ElementTree(element)); compilationTree.setPackageTree(packageTree); } + if (compilationTree.getClassTree() == null) { CoreScanner coreScanner = parseTreeContext.getCoreScanner(); String path = parseTreeContext.getFileObject().getPath(); Element element = (Element) coreScanner.parseTokens("class " + TypeUtils.getShortName(path) + " {"); - MergeTree mergeTree = new MergeTree(new ArrayList<>()); - mergeTree.setElement(element); - ClassTree classTree = classDeclaration(new ArrayList<>(), mergeTree); + MergeElementTree mergeElementTree = new MergeElementTree(new ArrayList<>()); + mergeElementTree.setElement(element); + ClassTree classTree = classDeclaration(new ArrayList<>(), mergeElementTree); compilationTree.setClassTree(classTree); } + + compilationTree.setClassName(compilationTree.getPackageTree().getPackageName() + "." + compilationTree.getClassTree().getTypeName()); return compilationTree; } - public PackageTree packageDeclaration(StatementTree statementTree) { - Element element = statementTree.getElement(); + public PackageTree packageDeclaration(ElementTree elementTree) { + Element element = elementTree.getElement(); StringBuilder builder = new StringBuilder(); for (Token token : element) { if (token.isVariable() || token.isVisitIdentifier()) { builder.append(token); } } - // add semi - element.add(new Token(SeparatorEnum.SEMI, SeparatorEnum.SEMI.value, null)); - return new PackageTree(statementTree, builder.toString()); + return new PackageTree(elementTree, builder.toString()); } - public ImportTree importDeclaration(StatementTree statementTree) { - Element element = statementTree.getElement(); + public ImportTree importDeclaration(ElementTree elementTree) { + Element element = elementTree.getElement(); boolean isStatic = element.get(1).getTokenType() == ModifierEnum.STATIC; String shortName = PatternUtils.getPrefix(element.get(element.size() - 1).toString()); StringBuilder builder = new StringBuilder(); @@ -124,82 +127,86 @@ public class CompilationTreeMaker implements TreeMaker { } String qualifiedName = builder.toString(); boolean isAlias = !qualifiedName.endsWith("." + shortName); - // add semi - element.add(new Token(SeparatorEnum.SEMI, SeparatorEnum.SEMI.value, null)); - return new ImportTree(statementTree, isStatic, isAlias, qualifiedName, shortName); + return new ImportTree(elementTree, isStatic, isAlias, qualifiedName, shortName); } - public AnnotationTree annotationDeclaration(StatementTree statementTree) { - return new AnnotationTree(statementTree.getElement().get(0)); + public AnnotationTree annotationDeclaration(ElementTree elementTree) { + return new AnnotationTree(elementTree.getElement().get(0)); } - public FieldTree fieldDeclaration(List annotationTrees, StatementTree statementTree) { + public FieldTree fieldDeclaration(List annotationTrees, ElementTree elementTree) { FieldTree fieldTree = new FieldTree(); - fieldTree.setStatementTree(statementTree); + fieldTree.setElementTree(elementTree); fieldTree.setAnnotationTrees(new ArrayList<>(annotationTrees)); annotationTrees.clear(); - fieldTree.setAccessState(AccessState.NOT_VISITED); + fieldTree.setVisitState(VisitState.NOT_VISITED); fieldTree.setFieldType(null); - Element element = statementTree.getElement(); + Element element = elementTree.getElement(); if (element.isDeclare() || element.isDeclareAssign()) { fieldTree.setFieldName(element.getStr(1)); } else if (element.isAssign()) { fieldTree.setFieldName(element.getStr(0)); } - element.add(new Token(SeparatorEnum.SEMI, SeparatorEnum.SEMI.value, null)); return fieldTree; } - public MethodTree methodDeclaration(List annotationTrees, StatementTree statementTree) { + public MethodTree methodDeclaration(List annotationTrees, ElementTree elementTree) { // create a new merge tree for DECLARE_FUNC - MergeTree mergeTree; - if (statementTree instanceof MergeTree) { - mergeTree = (MergeTree) statementTree; + MergeElementTree mergeElementTree; + if (elementTree instanceof MergeElementTree) { + mergeElementTree = (MergeElementTree) elementTree; } else { - Element element = statementTree.getElement(); - element.add(new Token(SeparatorEnum.SEMI, SeparatorEnum.SEMI.value, null)); - mergeTree = new MergeTree(new ArrayList<>()); - mergeTree.setElement(element); + Element element = elementTree.getElement(); + mergeElementTree = new MergeElementTree(new ArrayList<>()); + mergeElementTree.setElement(element); } + MethodTree methodTree = new MethodTree(); - methodTree.setMergeTree(mergeTree); + methodTree.setMergeElementTree(mergeElementTree); methodTree.setAnnotationTrees(new ArrayList<>(annotationTrees)); annotationTrees.clear(); - methodTree.setAccessState(AccessState.NOT_VISITED); - methodTree.setReturnType(null); - Element element = mergeTree.getElement(); + + Element element = mergeElementTree.getElement(); // replace keyword synch element.replaceModifier(ModifierEnum.SYNCH, ModifierEnum.SYNCHRONIZED); - Token token = element.get(1); - if (token.isTypeInit()) { + Token methodToken = element.get(1); + + methodTree.setMethodToken(methodToken); + methodTree.setVisitState(VisitState.NOT_VISITED); + methodTree.setReturnType(null); + + if (methodToken.isTypeInit()) { methodTree.setConstructor(true); - Statement statement = (Statement) token.getValue(); + Statement statement = (Statement) methodToken.getValue(); methodTree.setMethodName(statement.getStr(0)); - } else if (token.isLocalMethod()) { + } else if (methodToken.isLocalMethod()) { methodTree.setConstructor(false); - Statement statement = (Statement) token.getValue(); + Statement statement = (Statement) methodToken.getValue(); methodTree.setMethodName(statement.getStr(0)); } + methodTree.setParameterTrees(null); methodTree.setThrowTypes(null); + // the constructor no return type if (methodTree.isConstructor()) { element.removeToken(item -> item.getTokenType() == KeywordEnum.FUNC); } + return methodTree; } - public ClassTree classDeclaration(List annotationTrees, MergeTree mergeTree) { + public ClassTree classDeclaration(List annotationTrees, MergeElementTree mergeElementTree) { ClassTree classTree = new ClassTree(); classTree.setFieldTrees(new LinkedHashMap<>()); classTree.setMethodTrees(new LinkedHashMap<>()); - classTree.setMergeTree(mergeTree); + classTree.setMergeElementTree(mergeElementTree); classTree.setAnnotationTrees(new ArrayList<>(annotationTrees)); annotationTrees.clear(); - Element element = mergeTree.getElement(); + Element element = mergeElementTree.getElement(); // add modifier element.addModifiers(ModifierEnum.PUBLIC); @@ -222,10 +229,6 @@ public class CompilationTreeMaker implements TreeMaker { Token typeToken = classTree.getTypeToken(); if (typeToken.isAnyType()) { classTree.setTypeName(TypeUtils.getTargetName(typeToken.toString())); - - } else if (typeToken.isGenericType()) { - Statement statement = (Statement) typeToken.getValue(); - classTree.setTypeName(statement.getStr(0)); } // set type for class tree classTree.setType(null); @@ -233,20 +236,20 @@ public class CompilationTreeMaker implements TreeMaker { classTree.setInterfaceTypes(null); annotationTrees = new ArrayList<>(); - for (StatementTree statementTree : mergeTree.getChildren()) { - Element subElement = statementTree.getElement(); + for (ElementTree elementTree : mergeElementTree.getChildren()) { + Element subElement = elementTree.getElement(); if (subElement.isAnnotation()) { - AnnotationTree annotationTree = annotationDeclaration(statementTree); + AnnotationTree annotationTree = annotationDeclaration(elementTree); annotationTrees.add(annotationTree); } else if (subElement.isFieldDeclare()) { subElement.addModifiers(ModifierEnum.PUBLIC); - FieldTree fieldTree = fieldDeclaration(annotationTrees, statementTree); + FieldTree fieldTree = fieldDeclaration(annotationTrees, elementTree); classTree.getFieldTrees().put(fieldTree.getFieldName(), fieldTree); } else if (subElement.isMethodDeclare()) { subElement.addModifiers(ModifierEnum.PUBLIC); - MethodTree methodTree = methodDeclaration(annotationTrees, statementTree); + MethodTree methodTree = methodDeclaration(annotationTrees, elementTree); // add abstract keyword for DECLARE_FUNC if (element.isAbstract() && subElement.isDeclareFunc()) { subElement.add(0, new Token(KeywordEnum.ABSTRACT, KeywordEnum.ABSTRACT.value, null)); diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementCompileListener.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementCompileListener.java new file mode 100644 index 0000000000000000000000000000000000000000..abdd1c9ec12de5ff32e4a48bd826214fbc648185 --- /dev/null +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementCompileListener.java @@ -0,0 +1,25 @@ +package com.gitee.spirit.core3.tree; + +import com.gitee.spirit.common.constants.Config; +import com.gitee.spirit.core3.compile.CoreCompiler; +import com.gitee.spirit.core3.compile.PropertiesMerger; +import com.gitee.spirit.core3.compile.api.CompileListenerAdapter; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.tree.api.ElementListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(-180) +public class ElementCompileListener extends CompileListenerAdapter { + + @Autowired + private PropertiesMerger propertiesMerger; + + @Override + public void compileStarted(ParseContext parseContext, CoreCompiler coreCompiler) { + propertiesMerger.mergeBeans(parseContext, ElementListener.class, Config.ELEMENT_LISTENERS); + } + +} diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementMergeTreeParser.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementMergeTreeMaker.java similarity index 45% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementMergeTreeParser.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementMergeTreeMaker.java index e6281a8ebc461212d48bc8ed314c073e9912b609..76400e8cf71dfe20687fc3fe5366be2759773725 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementMergeTreeParser.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/ElementMergeTreeMaker.java @@ -2,80 +2,109 @@ package com.gitee.spirit.core3.tree; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; -import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.common.constants.Config; +import com.gitee.spirit.core3.compile.ConfigManager; +import com.gitee.spirit.core3.compile.PropertiesMerger; import com.gitee.spirit.core3.compile.api.CoreScanner; -import com.gitee.spirit.core3.compile.api.MergeTreeParser; +import com.gitee.spirit.core3.compile.api.MergeTreeMaker; import com.gitee.spirit.common.constants.Constants; import com.gitee.spirit.core3.compile.entity.FileObject; +import com.gitee.spirit.core3.compile.entity.ParseContext; import com.gitee.spirit.core3.compile.entity.ParseTreeContext; import com.gitee.spirit.core3.compile.entity.SCTree; import com.gitee.spirit.core3.compile.utils.LineUtils; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.element.enums.SyntaxEnum; -import com.gitee.spirit.core3.tree.entity.MergeTree; -import com.gitee.spirit.core3.tree.entity.StatementTree; +import com.gitee.spirit.common.enums.element.SyntaxEnum; +import com.gitee.spirit.core3.tree.api.ElementListener; +import com.gitee.spirit.core3.tree.entity.ElementEvent; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; +import com.gitee.spirit.core3.tree.entity.ElementTree; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; +import java.util.*; @Component -public class ElementMergeTreeParser implements MergeTreeParser { +public class ElementMergeTreeMaker implements MergeTreeMaker { @Override - public SCTree parseTree(ParseTreeContext parseTreeContext, FileObject fileObject) { - boolean isDebug = ConfigUtils.isDebug(); + public SCTree parseMergeTree(ParseTreeContext parseTreeContext, FileObject fileObject) { CoreScanner coreScanner = parseTreeContext.getCoreScanner(); List lines = IoUtil.readLines(new StringReader(fileObject.getContent()), new ArrayList<>()); - MergeTree root = new MergeTree(new ArrayList<>()); - Stack stack = new Stack<>(); + MergeElementTree root = new MergeElementTree(new ArrayList<>()); + Stack stack = new Stack<>(); stack.push(root); for (int index = 0; index < lines.size(); index++) { String originalLine = lines.get(index); String line = originalLine.trim(); - if (line.startsWith("//") || StringUtils.isBlank(line)) { - continue; - } + if (line.startsWith("//") || StringUtils.isBlank(line)) continue; + + String indent = LineUtils.getIndent(originalLine); + ElementEvent elementEvent = ElementEvent.builder() + .lines(lines).index(index).originalLine(originalLine).indent(indent).line(line).build(); + + beforeInitialized(parseTreeContext, elementEvent); + // 支持修改行 + index = elementEvent.getIndex(); + line = elementEvent.getLine(); + Element element = (Element) coreScanner.parseTokens(line); + elementEvent.setElement(element); + + afterInitialized(parseTreeContext, elementEvent); + SyntaxEnum syntaxEnum = element.getSyntaxEnum(); - if (syntaxEnum.isStatement()) { - stack.peek().getChildren().add(new StatementTree(element)); + if (syntaxEnum.mergeMethod == SyntaxEnum.MergeMethodEnum.STATEMENT) { + stack.peek().getChildren().add(new ElementTree(element)); - } else if (syntaxEnum.isMerge()) { - if (splitLineByColon(lines, index, LineUtils.getIndent(originalLine), element)) { + } else if (syntaxEnum.mergeMethod == SyntaxEnum.MergeMethodEnum.MERGE) { + if (splitLineByColon(lines, index, indent, element)) { index--; } else { - MergeTree mergeTree = new MergeTree(new ArrayList<>()); - mergeTree.setElement(element); - stack.peek().getChildren().add(mergeTree); - stack.push(mergeTree); + MergeElementTree mergeElementTree = new MergeElementTree(new ArrayList<>()); + mergeElementTree.setElement(element); + stack.peek().getChildren().add(mergeElementTree); + stack.push(mergeElementTree); } - } else if (syntaxEnum.isEndMerge()) { + } else if (syntaxEnum.mergeMethod == SyntaxEnum.MergeMethodEnum.END_MERGE) { stack.pop(); - stack.peek().getChildren().add(new StatementTree(element)); + stack.peek().getChildren().add(new ElementTree(element)); - } else if (syntaxEnum.isEndAndMerge()) { + } else if (syntaxEnum.mergeMethod == SyntaxEnum.MergeMethodEnum.END_AND_MERGE) { stack.pop(); - MergeTree mergeTree = new MergeTree(new ArrayList<>()); - mergeTree.setElement(element); - stack.peek().getChildren().add(mergeTree); - stack.push(mergeTree); + MergeElementTree mergeElementTree = new MergeElementTree(new ArrayList<>()); + mergeElementTree.setElement(element); + stack.peek().getChildren().add(mergeElementTree); + stack.push(mergeElementTree); - } else if (syntaxEnum.isMergeLine()) { + } else if (syntaxEnum.mergeMethod == SyntaxEnum.MergeMethodEnum.MERGE_LINE) { mergeLines(lines, index); index--; } - if (isDebug) printElementForDebug(originalLine, stack, element); + if (ConfigManager.isDebugMode()) printElementForDebug(originalLine, stack, element); } return root; } + @SuppressWarnings("unchecked") + private void beforeInitialized(ParseTreeContext parseTreeContext, ElementEvent elementEvent) { + Properties properties = parseTreeContext.getParseContext().getProperties(); + List elementListeners = (List) properties.get(Config.ELEMENT_LISTENERS); + elementListeners.forEach(elementListener -> elementListener.beforeInitialized(parseTreeContext, elementEvent)); + } + + @SuppressWarnings("unchecked") + private void afterInitialized(ParseTreeContext parseTreeContext, ElementEvent elementEvent) { + Properties properties = parseTreeContext.getParseContext().getProperties(); + List elementListeners = (List) properties.get(Config.ELEMENT_LISTENERS); + elementListeners.forEach(elementListener -> elementListener.afterInitialized(parseTreeContext, elementEvent)); + } + private boolean splitLineByColon(List lines, int fromIndex, String indent, Element element) { if (element.contains(":")) { List subLines = new ArrayList<>(); @@ -104,7 +133,7 @@ public class ElementMergeTreeParser implements MergeTreeParser { lines.add(fromIndex, stringBuilder.toString()); } - private void printElementForDebug(String originalLine, Stack stack, Element element) { + private void printElementForDebug(String originalLine, Stack stack, Element element) { originalLine = originalLine + " ====> " + stack.size(); System.out.println(originalLine + LineUtils.getSpaces(100 - originalLine.length()) + " >>>> " + element.debug()); diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/api/ElementListener.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/api/ElementListener.java new file mode 100644 index 0000000000000000000000000000000000000000..08b525d397917f083e584810573cf1907cfbffc2 --- /dev/null +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/api/ElementListener.java @@ -0,0 +1,12 @@ +package com.gitee.spirit.core3.tree.api; + +import com.gitee.spirit.core3.compile.entity.ParseTreeContext; +import com.gitee.spirit.core3.tree.entity.ElementEvent; + +public interface ElementListener { + + void beforeInitialized(ParseTreeContext parseTreeContext, ElementEvent elementEvent); + + void afterInitialized(ParseTreeContext parseTreeContext, ElementEvent elementEvent); + +} diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/api/ElementListenerAdapter.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/api/ElementListenerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..06c2bd48bb24767f9701e9b3f8c87b34343f2cf6 --- /dev/null +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/api/ElementListenerAdapter.java @@ -0,0 +1,18 @@ +package com.gitee.spirit.core3.tree.api; + +import com.gitee.spirit.core3.compile.entity.ParseTreeContext; +import com.gitee.spirit.core3.tree.entity.ElementEvent; + +public abstract class ElementListenerAdapter implements ElementListener { + + @Override + public void beforeInitialized(ParseTreeContext parseTreeContext, ElementEvent elementEvent) { + // ignore + } + + @Override + public void afterInitialized(ParseTreeContext parseTreeContext, ElementEvent elementEvent) { + // ignore + } + +} diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ElementEvent.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ElementEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..59443b91f5db882003ac6243cebacceb42f811d3 --- /dev/null +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ElementEvent.java @@ -0,0 +1,18 @@ +package com.gitee.spirit.core3.tree.entity; + +import com.gitee.spirit.core3.element.entity.Element; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Data +@Builder +public class ElementEvent { + private List lines; + private int index; + private String originalLine; + private String indent; + private String line; + private Element element; +} diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/StatementTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ElementTree.java similarity index 91% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/StatementTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ElementTree.java index 9c10b7eb50ac9d2de97ea01acd714d2b687d8a39..31374382eaf1e0c5be02ad8e5c2ce34a8632d84c 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/StatementTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ElementTree.java @@ -11,7 +11,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) -public class StatementTree extends SCTree { +public class ElementTree extends SCTree { private Element element; diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MergeTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MergeElementTree.java similarity index 70% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MergeTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MergeElementTree.java index a202a2d02f7e0c295b88efa94428e306d1805e02..de496000d425569347d9a0ad091edd7fc603973e 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MergeTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MergeElementTree.java @@ -9,6 +9,6 @@ import java.util.List; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) @ToString(exclude = "children", callSuper = true) -public class MergeTree extends StatementTree { - private List children; +public class MergeElementTree extends ElementTree { + private List children; } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/VisitState.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/VisitState.java new file mode 100644 index 0000000000000000000000000000000000000000..b3f75d69b7579c0f31a535b059aeb9e5615ec554 --- /dev/null +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/VisitState.java @@ -0,0 +1,7 @@ +package com.gitee.spirit.core3.tree.entity; + +public enum VisitState { + NOT_VISITED, + VISITING, + VISITED +} diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/AnnotationTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/AnnotationTree.java similarity index 64% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/AnnotationTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/AnnotationTree.java index cdccb11ab4f8322be84d70856123d54177f244fc..6074dc95b8b4cd2d07933b2cb376ed9c21d7086c 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/AnnotationTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/AnnotationTree.java @@ -1,6 +1,7 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; +import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; import lombok.AllArgsConstructor; import lombok.Data; @@ -13,4 +14,9 @@ import lombok.NoArgsConstructor; @EqualsAndHashCode(callSuper = true) public class AnnotationTree extends SCTree { private Token token; + private SCType AnnotationType; + + public AnnotationTree(Token token) { + this.token = token; + } } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ClassTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ClassTree.java similarity index 50% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ClassTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ClassTree.java index b858a1e9a12a670f38ecb1905d7cbc57e2838a87..a8f3a52c17073be4dd5dd66203db20f6d869c493 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ClassTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ClassTree.java @@ -1,12 +1,11 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.tree.utils.TypeBuilder; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; import lombok.*; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -16,7 +15,7 @@ import java.util.Map; @EqualsAndHashCode(callSuper = true) @ToString(exclude = {"fieldTrees", "methodTrees"}) public class ClassTree extends SCTree { - private MergeTree mergeTree; + private MergeElementTree mergeElementTree; private List annotationTrees; private Token typeToken; private String typeName; @@ -25,21 +24,4 @@ public class ClassTree extends SCTree { private List interfaceTypes; private Map fieldTrees; private Map> methodTrees; - - public SCType getType() { - return type != null ? TypeBuilder.copy(type) : null; - } - - public SCType getSuperType() { - return superType != null ? TypeBuilder.copy(superType) : null; - } - - public List getInterfaceTypes() { - if (interfaceTypes == null) return null; - List copyInterfaceTypes = new ArrayList<>(); - for (SCType interfaceType : interfaceTypes) { - copyInterfaceTypes.add(TypeBuilder.copy(interfaceType)); - } - return copyInterfaceTypes; - } } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/CompilationTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/CompilationTree.java similarity index 74% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/CompilationTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/CompilationTree.java index 5ab3b65df4ad11778bf8c182afbcc7f60634d42b..a3e75a6f3c60f1cc2af82bf7ccd44677ea08c948 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/CompilationTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/CompilationTree.java @@ -1,6 +1,7 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -14,14 +15,11 @@ import java.util.Map; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class CompilationTree extends SCTree { - private MergeTree mergeTree; + private MergeElementTree mergeElementTree; private PackageTree packageTree; private Map importTrees; private Map fieldTrees; private Map> methodTrees; private ClassTree classTree; - - public String getClassName() { - return packageTree.getPackageName() + "." + classTree.getTypeName(); - } + private String className; } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/FieldTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/FieldTree.java similarity index 58% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/FieldTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/FieldTree.java index 2e093fd528145dbd91fedb08f15ad9ebe15d1183..9ce12bcd1fcb06da9ad9f14b7b4a08bb4d2582fd 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/FieldTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/FieldTree.java @@ -1,9 +1,9 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.enums.AccessState; -import com.gitee.spirit.core3.tree.utils.TypeBuilder; +import com.gitee.spirit.core3.tree.entity.ElementTree; +import com.gitee.spirit.core3.tree.entity.VisitState; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -16,13 +16,9 @@ import java.util.List; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class FieldTree extends SCTree { - private StatementTree statementTree; + private ElementTree elementTree; private List annotationTrees; - private AccessState accessState; + private VisitState visitState; private SCType fieldType; private String fieldName; - - public SCType getFieldType() { - return fieldType != null ? TypeBuilder.copy(fieldType) : null; - } } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ImportTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ImportTree.java similarity index 74% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ImportTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ImportTree.java index 6ceb43ff7ce535795a58e02df866dceebf035a94..d755ccfdf742bfe9e97b0e0be04fbf582b0b0bf2 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ImportTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ImportTree.java @@ -1,6 +1,7 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; +import com.gitee.spirit.core3.tree.entity.ElementTree; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,7 +12,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class ImportTree extends SCTree { - private StatementTree statementTree; + private ElementTree elementTree; private boolean isStatic; private boolean isAlias; private String qualifiedName; diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MethodTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/MethodTree.java similarity index 46% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MethodTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/MethodTree.java index bb843b75f6186611f2b15ab112ca2f226bf52f0d..7583ea98ec3f8e0b54c71e18fa6b1104b82b5190 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/MethodTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/MethodTree.java @@ -1,15 +1,15 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.enums.AccessState; -import com.gitee.spirit.core3.tree.utils.TypeBuilder; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; +import com.gitee.spirit.core3.tree.entity.VisitState; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import java.util.ArrayList; import java.util.List; @Data @@ -17,25 +17,14 @@ import java.util.List; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class MethodTree extends SCTree { - private MergeTree mergeTree; + private MergeElementTree mergeElementTree; private List annotationTrees; - private AccessState accessState; - private boolean isConstructor; + private Token methodToken; + private VisitState visitState; private SCType returnType; + private boolean isConstructor; private String methodName; private List parameterTrees; + private List parameterTypes; private List throwTypes; - - public SCType getReturnType() { - return returnType != null ? TypeBuilder.copy(returnType) : null; - } - - public List getParameterTypes() { - if (parameterTrees == null) return null; - List parameterTypes = new ArrayList<>(); - for (ParameterTree parameterTree : parameterTrees) { - parameterTypes.add(parameterTree.getParameterType()); - } - return parameterTypes; - } } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/PackageTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/PackageTree.java similarity index 70% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/PackageTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/PackageTree.java index c37bcec38b0aba135bbf585b85e0154848d7de9e..ef0904ac2557f21b903cb74a2a6443af688d209b 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/PackageTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/PackageTree.java @@ -1,6 +1,7 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; +import com.gitee.spirit.core3.tree.entity.ElementTree; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,6 +12,6 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class PackageTree extends SCTree { - private StatementTree statementTree; + private ElementTree elementTree; private String packageName; } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ParameterTree.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ParameterTree.java similarity index 76% rename from spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ParameterTree.java rename to spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ParameterTree.java index d9a9c52877bc1b85bf4f03f550c868e3ef144389..9aef1f7afa47595adc2520b06bd3a5d37738b6a7 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/ParameterTree.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/entity/clazz/ParameterTree.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.core3.tree.entity; +package com.gitee.spirit.core3.tree.entity.clazz; import com.gitee.spirit.core3.compile.entity.SCTree; import com.gitee.spirit.core3.compile.entity.SCType; @@ -18,8 +18,4 @@ public class ParameterTree extends SCTree { private List annotationTrees; private SCType parameterType; private String parameterName; - - public SCType getParameterType() { - return parameterType != null ? TypeBuilder.copy(parameterType) : null; - } } diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/enums/AccessState.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/enums/AccessState.java deleted file mode 100644 index dfae58af3e6fc2c8c2ad95eb26f8acc08a0db0a9..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/enums/AccessState.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gitee.spirit.core3.tree.enums; - -public enum AccessState { - NOT_VISITED, VISITING, VISITED -} diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/impl/DefaultElementListener.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/impl/DefaultElementListener.java new file mode 100644 index 0000000000000000000000000000000000000000..3482ddcf9e142e942afca97d47644fe69fa9632a --- /dev/null +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/impl/DefaultElementListener.java @@ -0,0 +1,47 @@ +package com.gitee.spirit.core3.tree.impl; + +import com.gitee.spirit.common.utils.PatternUtils; +import com.gitee.spirit.core3.compile.entity.FileObject; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.compile.entity.ParseTreeContext; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.tree.api.ElementListenerAdapter; +import com.gitee.spirit.core3.tree.entity.ElementEvent; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Component +public class DefaultElementListener extends ElementListenerAdapter { + + // 替换字符串 + public static final String STRING_REGEX = "(?<=\").*?(?=\")"; + // 间接忽略了泛型 + public static final Pattern TYPE_PATTERN = Pattern.compile("(\\b[A-Z]+\\w+\\b)"); + + @Override + public void afterInitialized(ParseTreeContext parseTreeContext, ElementEvent elementEvent) { + String line = elementEvent.getLine(); + Element element = elementEvent.getElement(); + if (element.isPackage() || element.isImport()) return; + ParseContext parseContext = parseTreeContext.getParseContext(); + FileObject fileObject = parseTreeContext.getFileObject(); + Map> dependencies = parseContext.getDependencies(); + Set typeNames = dependencies.computeIfAbsent(fileObject.getPath(), key -> new LinkedHashSet<>()); + parseLine(typeNames, line); + } + + private void parseLine(Set typeNames, String line) { + line = line.replaceAll(STRING_REGEX, "").trim(); + Matcher matcher = TYPE_PATTERN.matcher(line); + while (matcher.find() && matcher.groupCount() > 0) { + String typeName = matcher.group(matcher.groupCount() - 1); + if (PatternUtils.isAnyType(typeName)) { + typeNames.add(typeName); + } + } + } + +} diff --git a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/utils/TypeBuilder.java b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/utils/TypeBuilder.java index cfa83e9244e2252a29f20d2d79fddbbfdcbff7ac..545da94214164bf2b113edf49c4b66bc51f5453e 100644 --- a/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/utils/TypeBuilder.java +++ b/spirit-core3/spirit-core3-tree/src/main/java/com/gitee/spirit/core3/tree/utils/TypeBuilder.java @@ -1,8 +1,7 @@ package com.gitee.spirit.core3.tree.utils; -import com.gitee.spirit.common.constants.AccessLevel; -import com.gitee.spirit.common.enums.PrimitiveArrayEnum; -import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.common.enums.token.PrimitiveArrayEnum; +import com.gitee.spirit.common.enums.token.PrimitiveEnum; import com.gitee.spirit.core3.compile.entity.SCType; import java.util.ArrayList; @@ -22,7 +21,6 @@ public class TypeBuilder { scType.setNull(isNull); scType.setWildcard(isWildcard); scType.setNative(isNative); - scType.setModifiers(AccessLevel.ONLY_PUBLIC); scType.setGenericTypes(new ArrayList<>()); return scType; } @@ -38,7 +36,6 @@ public class TypeBuilder { scType.setNull(false); scType.setWildcard(false); scType.setNative(false); - scType.setModifiers(AccessLevel.ONLY_PUBLIC); scType.setGenericTypes(new ArrayList<>()); return scType; } @@ -54,7 +51,6 @@ public class TypeBuilder { scType.setNull(false); scType.setWildcard(false); scType.setNative(false); - scType.setModifiers(AccessLevel.ONLY_PUBLIC); scType.setGenericTypes(new ArrayList<>()); return scType; } @@ -70,7 +66,6 @@ public class TypeBuilder { newType.setNull(oldType.isNull()); newType.setWildcard(oldType.isWildcard()); newType.setNative(oldType.isNative()); - newType.setModifiers(oldType.getModifiers()); if (oldType.getGenericTypes() != null) { newType.setGenericTypes(Collections.unmodifiableList(oldType.getGenericTypes())); } diff --git a/spirit-core3/spirit-core3-visitor/pom.xml b/spirit-core3/spirit-core3-visitor/pom.xml index 308c8755ec72d51be3d150b14df0df021af4764f..661131cce5499e4a9c68ef4da69f0769018ba805 100644 --- a/spirit-core3/spirit-core3-visitor/pom.xml +++ b/spirit-core3/spirit-core3-visitor/pom.xml @@ -4,16 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3 3.0.0 spirit-core3-visitor + - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3-tree ${project.version} + \ No newline at end of file diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/AutoImporter.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/AutoImporter.java deleted file mode 100644 index fc8c62a8a2f660f4461a25f84e3846f5b6667b07..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/AutoImporter.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.gitee.spirit.core3.visitor; - -import com.gitee.spirit.common.utils.ConfigUtils; -import com.gitee.spirit.common.utils.PatternUtils; -import com.gitee.spirit.core3.compile.api.TokenParser; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.tree.entity.CompilationTree; -import com.gitee.spirit.core3.tree.entity.MergeTree; -import com.gitee.spirit.core3.tree.entity.StatementTree; -import com.gitee.spirit.core3.visitor.api.ClassProxy; -import com.gitee.spirit.core3.visitor.api.CompilationFactory; -import com.gitee.spirit.core3.visitor.api.ImportSelector; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@Slf4j -@Component -public class AutoImporter { - - public static final String STRING_REGEX = "(?<=\").*?(?=\")";// 把字符串都替换掉 - public static final Pattern TYPE_PATTERN = Pattern.compile("(\\b[A-Z]+\\w+\\b)");// 间接排除了泛型类型T - - @Autowired - private CompilationFactory compilationFactory; - @Autowired - private ImportSelector importSelector; - - public void parseImport(CompilationTree compilationTree) { - boolean isDebug = ConfigUtils.isDebug(); - if (isDebug) log.info("Importing started. className: {}", compilationTree.getClassName()); - Set typeNames = new HashSet<>(); - parseMergeTree(typeNames, compilationTree.getMergeTree()); - ClassProxy classProxy = compilationFactory.getClassProxy(compilationTree.getClassName()); - for (String typeName : typeNames) { - String className = importSelector.findClassName(classProxy, typeName); - importSelector.addImport(classProxy, className); - if (isDebug) log.info(" >>>> className: {}", className); - } - } - - private void parseMergeTree(Set typeNames, MergeTree mergeTree) { - for (StatementTree statementTree : mergeTree.getChildren()) { - Element element = statementTree.getElement(); - if (element.isPackage() || element.isImport()) { - continue; - } - parseLine(typeNames, element.toString()); - if (statementTree instanceof MergeTree) { - parseMergeTree(typeNames, (MergeTree) statementTree); - } - } - } - - private void parseLine(Set typeNames, String line) { - line = line.replaceAll(STRING_REGEX, "").trim(); // 剔除掉字符串 - Matcher matcher = TYPE_PATTERN.matcher(line); // 进行正则匹配 - while (matcher.find() && matcher.groupCount() > 0) { - String typeName = matcher.group(matcher.groupCount() - 1); - if (PatternUtils.isAnyType(typeName)) { - typeNames.add(typeName); - } - } - } - -} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/TreeSemanticParser.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/CompilationCompileListener.java similarity index 40% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/TreeSemanticParser.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/CompilationCompileListener.java index f4ab0006c37eb5b322aa332e99c1b85d64ca1741..bbf3847c06b4023bffd964c22cab575cd2cbc825 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/TreeSemanticParser.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/CompilationCompileListener.java @@ -1,32 +1,31 @@ package com.gitee.spirit.core3.visitor; -import com.gitee.spirit.core3.compile.api.SemanticParser; +import com.gitee.spirit.core3.compile.CoreCompiler; +import com.gitee.spirit.core3.compile.api.CompileListenerAdapter; import com.gitee.spirit.core3.compile.entity.CompilationUnit; import com.gitee.spirit.core3.compile.entity.ParseContext; -import com.gitee.spirit.core3.tree.entity.CompilationTree; -import com.gitee.spirit.core3.visitor.api.ClassVisitor; import com.gitee.spirit.core3.visitor.api.CompilationFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.util.List; @Component -public class TreeSemanticParser implements SemanticParser { +@Order(-160) +public class CompilationCompileListener extends CompileListenerAdapter { @Autowired private CompilationFactory compilationFactory; - @Autowired - private AutoImporter autoImporter; - @Autowired - private ClassVisitor classVisitor; @Override - public void parseSemantic(ParseContext parseContext, List compilationUnits) { + public void compilationUnitsParsed(ParseContext parseContext, List compilationUnits) { compilationFactory.loadCompilationUnits(parseContext, compilationUnits); - compilationUnits.forEach(compilationUnit -> autoImporter.parseImport((CompilationTree) compilationUnit)); - compilationUnits.forEach(compilationUnit -> classVisitor.prepareForVisit((CompilationTree) compilationUnit)); - compilationUnits.forEach(compilationUnit -> classVisitor.visitCompilationTree((CompilationTree) compilationUnit)); + } + + @Override + public void compileFinished(ParseContext parseContext, CoreCompiler coreCompiler) { + compilationFactory.clear(); } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/CompilationSemanticParser.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/CompilationSemanticParser.java new file mode 100644 index 0000000000000000000000000000000000000000..47018fde8499ed29beffcd323df4c98ce94c505e --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/CompilationSemanticParser.java @@ -0,0 +1,46 @@ +package com.gitee.spirit.core3.visitor; + +import com.gitee.spirit.core3.compile.ConfigManager; +import com.gitee.spirit.core3.compile.api.SemanticParser; +import com.gitee.spirit.core3.compile.entity.CompilationUnit; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; +import com.gitee.spirit.core3.visitor.api.CompilationImporter; +import com.gitee.spirit.core3.visitor.api.CompilationVisitor; +import com.gitee.spirit.core3.visitor.api.CompilationParser; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class CompilationSemanticParser implements SemanticParser { + + @Autowired + private CompilationImporter compilationImporter; + @Autowired + private CompilationParser compilationParser; + @Autowired + private CompilationVisitor compilationVisitor; + + @Override + public void parseSemantic(ParseContext parseContext, List compilationUnits) { + compilationUnits.forEach(compilationUnit -> compilationImporter.parseImportTrees(parseContext, (CompilationTree) compilationUnit)); + compilationUnits.forEach(compilationUnit -> compilationParser.parseCompilationTree(parseContext, (CompilationTree) compilationUnit)); + // 支持部分编译 + compilationUnits.forEach(compilationUnit -> { + String targetPackage = ConfigManager.getTargetPackage(); + CompilationTree compilationTree = (CompilationTree) compilationUnit; + if (StringUtils.isNotBlank(targetPackage)) { + String className = compilationTree.getClassName(); + if (className.startsWith(targetPackage)) { + compilationVisitor.visitCompilationTree(parseContext, compilationTree); + } + } else { + compilationVisitor.visitCompilationTree(parseContext, compilationTree); + } + }); + } + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassProxy.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassProxy.java index 652d0c68a3de98d0085cb8697f365f17d7ed6c3d..a46203e950146b34ba6de70f4db358bac7b5d96b 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassProxy.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassProxy.java @@ -1,7 +1,8 @@ package com.gitee.spirit.core3.visitor.api; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.entity.*; +import com.gitee.spirit.core3.tree.entity.clazz.*; import java.util.List; import java.util.Map; @@ -16,6 +17,8 @@ public interface ClassProxy { String getClassName(); + boolean isAnnotated(String className); + ClassTree getClassTree(); String getSimpleName(); @@ -28,8 +31,8 @@ public interface ClassProxy { int getTypeVariableIndex(String genericName); - FieldTree getField(String fieldName); + FieldTree getField(AccessRule accessRule, String fieldName); - List getMethod(String methodName); + List getMethod(AccessRule accessRule, String methodName); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassVisitor.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassVisitor.java deleted file mode 100644 index a9f8525d201a555647a74c7c9db59b3e94c5635e..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassVisitor.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gitee.spirit.core3.visitor.api; - -import com.gitee.spirit.core3.tree.entity.*; -import com.gitee.spirit.core3.visitor.entity.VisitContext; - -public interface ClassVisitor { - - void prepareForVisit(CompilationTree compilationTree); - - void visitCompilationTree(CompilationTree compilationTree); - - void visitClassTree(VisitContext visitContext, ClassTree classTree); - - void visitFieldTree(VisitContext visitContext, FieldTree fieldTree); - - void visitMethodTree(VisitContext visitContext, MethodTree methodTree); - - void visitStatementTree(VisitContext visitContext, StatementTree statementTree); - -} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationFactory.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationFactory.java index 344d0389aa36818234a3204b2eafd719506cbbe5..37569bfe04621d327b927852f7c4612dbbce4e35 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationFactory.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationFactory.java @@ -15,4 +15,6 @@ public interface CompilationFactory { ClassProxy getClassProxy(String className); + void clear(); + } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..866737f02f41aac341c85bd7ca15289f5fdd18d7 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationHandler.java @@ -0,0 +1,10 @@ +package com.gitee.spirit.core3.visitor.api; + +import com.gitee.spirit.core3.tree.entity.ElementTree; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; + +public interface CompilationHandler { + + void handleElementTree(ParseClassContext parseClassContext, ElementTree elementTree); + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationImporter.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationImporter.java new file mode 100644 index 0000000000000000000000000000000000000000..10611c4d3743aac34c14b6361154c89171af14c5 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationImporter.java @@ -0,0 +1,10 @@ +package com.gitee.spirit.core3.visitor.api; + +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; + +public interface CompilationImporter { + + void parseImportTrees(ParseContext parseContext, CompilationTree compilationTree); + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassLinker.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationLinker.java similarity index 39% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassLinker.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationLinker.java index e30bdc2d352e8272122c945a1aea3fb333e1c7bb..f316001dd213a2707a7af4da4c8f22ce26c6149a 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ClassLinker.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationLinker.java @@ -1,10 +1,13 @@ package com.gitee.spirit.core3.visitor.api; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; import java.util.List; -public interface ClassLinker { +public interface CompilationLinker { + + Object getClassObject(SCType scType); int getTypeVariableIndex(SCType scType, String genericName); @@ -12,10 +15,10 @@ public interface ClassLinker { List getInterfaceTypes(SCType scType); - SCType visitField(SCType scType, String fieldName); + SCType visitField(SCType scType, AccessRule accessRule, String fieldName); - SCType visitMethod(SCType scType, String methodName, List parameterTypes); + SCType visitMethod(SCType scType, AccessRule accessRule, String methodName, List parameterTypes); - List getParameterTypes(SCType scType, String methodName, List parameterTypes); + List getParameterTypes(SCType scType, AccessRule accessRule, String methodName, List parameterTypes); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationParser.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationParser.java new file mode 100644 index 0000000000000000000000000000000000000000..e28a5a84f76534780854eb651c02f2c78024649b --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationParser.java @@ -0,0 +1,10 @@ +package com.gitee.spirit.core3.visitor.api; + +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; + +public interface CompilationParser { + + void parseCompilationTree(ParseContext parseContext, CompilationTree compilationTree); + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ImportSelector.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationSelector.java similarity index 86% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ImportSelector.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationSelector.java index 3df86612c2eb7e40ff4a4548680eddbb8ea8869e..8ba9765867f597bf0b39916537d6b771b5a57b86 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ImportSelector.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationSelector.java @@ -1,6 +1,6 @@ package com.gitee.spirit.core3.visitor.api; -public interface ImportSelector { +public interface CompilationSelector { String findClassName(ClassProxy classProxy, String simpleName); diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationVisitor.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationVisitor.java new file mode 100644 index 0000000000000000000000000000000000000000..b00a51f633c270dde88632abd20e22620975fed2 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/CompilationVisitor.java @@ -0,0 +1,24 @@ +package com.gitee.spirit.core3.visitor.api; + +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.tree.entity.*; +import com.gitee.spirit.core3.tree.entity.clazz.*; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; + +public interface CompilationVisitor { + + void visitCompilationTree(ParseContext parseContext, CompilationTree compilationTree); + + void visitPackageTree(ParseClassContext parseClassContext, PackageTree packageTree); + + void visitImportTree(ParseClassContext parseClassContext, ImportTree importTree); + + void visitFieldTree(ParseClassContext parseClassContext, FieldTree fieldTree); + + void visitMethodTree(ParseClassContext parseClassContext, MethodTree methodTree); + + void visitClassTree(ParseClassContext parseClassContext, ClassTree classTree); + + void visitElementTree(ParseClassContext parseClassContext, ElementTree elementTree); + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ElementHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ElementHandler.java index bb4263d9d468c2bd4c489241f844532619d8aab0..e1c0c5dfb56683041f7c69e32dd07e280d62634c 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ElementHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/ElementHandler.java @@ -1,10 +1,10 @@ package com.gitee.spirit.core3.visitor.api; import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; public interface ElementHandler { - void visitElement(VisitContext visitContext, Element element); + void handleElement(ParseClassContext parseClassContext, Element element); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MergeElementTreeListener.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MergeElementTreeListener.java new file mode 100644 index 0000000000000000000000000000000000000000..8af768436186f3aa153d4dbd195c0e6151e397f6 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MergeElementTreeListener.java @@ -0,0 +1,10 @@ +package com.gitee.spirit.core3.visitor.api; + +import com.gitee.spirit.core3.tree.entity.MergeElementTree; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; + +public interface MergeElementTreeListener { + + Integer postProcessMergeElementTree(ParseClassContext parseClassContext, MergeElementTree mergeElementTree, int index); + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MergeTreeListener.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MergeTreeListener.java deleted file mode 100644 index 2fc90fe5fb7b358005ebcc3315e7df478ec34f5f..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MergeTreeListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gitee.spirit.core3.visitor.api; - -import com.gitee.spirit.core3.tree.entity.MergeTree; -import com.gitee.spirit.core3.visitor.entity.VisitContext; - -public interface MergeTreeListener { - - Integer postProcessMergeTree(VisitContext visitContext, MergeTree mergeTree, int index); - -} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MethodMatcher.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MethodMatcher.java index 7c7cb8a414bc8ed21d4b0dff0cc03ec04dc11011..3066c0944bd1e8b205938e1aba57d87eb9453b4e 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MethodMatcher.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/MethodMatcher.java @@ -1,7 +1,7 @@ package com.gitee.spirit.core3.visitor.api; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.entity.MethodTree; +import com.gitee.spirit.core3.tree.entity.clazz.MethodTree; import com.gitee.spirit.core3.visitor.entity.MethodResult; import java.util.List; diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/StatementParser.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/StatementParser.java index 7bd7e0a450fbd9ef9d0ed4d3727271fcd832d72b..75a4e4d48a43511f63b1234d5ca972abce60f1ca 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/StatementParser.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/StatementParser.java @@ -5,6 +5,6 @@ import com.gitee.spirit.core3.element.entity.Statement; public interface StatementParser { - SCType parseType(Statement statement); + SCType parseStmtType(Statement statement); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TokenHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TokenHandler.java index b6fd33ba610912dc12960ab74a81dc509e366f25..0809b3c36c226a8a2f60da8a83b37e2052a9de7d 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TokenHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TokenHandler.java @@ -1,14 +1,12 @@ package com.gitee.spirit.core3.visitor.api; -import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; public interface TokenHandler { - boolean isHandle(VisitContext visitContext, Element element, Statement statement, int index, Token token); + boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent); - void visitToken(VisitContext visitContext, Element element, Statement statement, int index, Token token); + void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeFactory.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeFactory.java index 685570fe6685673996624856b4383d0362ee41a9..9a55e6c2691daa812c8a1b399dc88a459f592a72 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeFactory.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeFactory.java @@ -9,10 +9,10 @@ public interface TypeFactory { SCType newType(String className); - SCType newType(String className, SCType... genericTypes); - SCType newType(String className, List genericTypes); + SCType newType(String className, SCType... genericTypes); + SCType newTypeVariable(String genericName); SCType newType(ClassProxy classProxy, Token token); diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeParser.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeParser.java index 38569ed87212c501911fb124fa4a693ff0ac6712..c7ad47b2211d51f97fd6af4ec3ad24428f3397ea 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeParser.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/TypeParser.java @@ -7,12 +7,6 @@ import java.util.List; public interface TypeParser { - SCType withProtected(SCType scType); - - SCType evenPrivate(SCType scType); - - SCType lowerAccessLevel(SCType scType); - SCType toTarget(SCType scType); SCType toBox(SCType scType); diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/VariableTracker.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/VariableTracker.java index 27fcc7799a801e8b207bebd3a29b2c256a62ed1a..96cb3555e0ce183149395490f6d1405bb7d21a37 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/VariableTracker.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/api/VariableTracker.java @@ -1,10 +1,10 @@ package com.gitee.spirit.core3.visitor.api; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; public interface VariableTracker { - SCType findVariableType(VisitContext visitContext, String variableName); + SCType findVariableType(ParseClassContext parseClassContext, String variableName); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/constant/BasicTypes.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/CommonTypes.java similarity index 94% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/constant/BasicTypes.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/CommonTypes.java index d397fab33e988e26ae97b4869a2abdf98ad849a4..f87570199743cd2b00527adda838aea1a4e773fc 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/constant/BasicTypes.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/CommonTypes.java @@ -1,15 +1,15 @@ -package com.gitee.spirit.core3.visitor.constant; +package com.gitee.spirit.core3.visitor.entity; -import com.gitee.spirit.common.enums.PrimitiveArrayEnum; -import com.gitee.spirit.common.enums.PrimitiveEnum; -import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.common.enums.token.PrimitiveArrayEnum; +import com.gitee.spirit.common.enums.token.PrimitiveEnum; +import com.gitee.spirit.core3.compile.ConfigManager; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.tree.utils.TypeBuilder; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class BasicTypes { +public class CommonTypes { public static final SCType VOID; public static final SCType BOOLEAN; @@ -72,8 +72,8 @@ public class BasicTypes { FLOAT_ARRAY = TypeBuilder.build(PrimitiveArrayEnum.FLOAT_ARRAY); DOUBLE_ARRAY = TypeBuilder.build(PrimitiveArrayEnum.DOUBLE_ARRAY); - String langPackage = ConfigUtils.getLangPackage() + "."; - String utilPackage = ConfigUtils.getUtilPackage() + "."; + String langPackage = ConfigManager.getLangPackage() + "."; + String utilPackage = ConfigManager.getUtilPackage() + "."; VOID_BOX = TypeBuilder.build(langPackage + "Void", "Void", langPackage + "Void", false, false, false, false, true); BOOLEAN_BOX = TypeBuilder.build(langPackage + "Boolean", "Boolean", langPackage + "Boolean", diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/MethodResult.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/MethodResult.java index c0bee4c200db63c3819e0ad785f1a901de7c523e..35bdb18be21b9f53274c7bd4c0a5fe3c99ec32a5 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/MethodResult.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/MethodResult.java @@ -1,7 +1,7 @@ package com.gitee.spirit.core3.visitor.entity; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.entity.MethodTree; +import com.gitee.spirit.core3.tree.entity.clazz.MethodTree; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/VisitContext.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/ParseClassContext.java similarity index 52% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/VisitContext.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/ParseClassContext.java index 62dfd32d636f2d859e5ed772de83a3a9f4c6d569..baa782c915d3d2ed3dbe992b2163dd65e7c929c6 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/VisitContext.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/ParseClassContext.java @@ -1,10 +1,9 @@ package com.gitee.spirit.core3.visitor.entity; -import com.gitee.spirit.core3.tree.entity.FieldTree; -import com.gitee.spirit.core3.tree.entity.MergeTree; -import com.gitee.spirit.core3.tree.entity.MethodTree; +import com.gitee.spirit.core3.tree.entity.clazz.*; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; import com.gitee.spirit.core3.visitor.api.ClassProxy; -import com.gitee.spirit.core3.visitor.api.MergeTreeListener; +import com.gitee.spirit.core3.visitor.api.MergeElementTreeListener; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -17,11 +16,14 @@ import java.util.Stack; @Builder @NoArgsConstructor @AllArgsConstructor -public class VisitContext { +public class ParseClassContext { private ClassProxy classProxy; + private PackageTree packageTree; + private ImportTree importTree; + private ClassTree classTree; private FieldTree fieldTree; private MethodTree methodTree; - private MergeTree mergeTree; + private MergeElementTree mergeElementTree; private Stack> variables; - private MergeTreeListener mergeTreeListener; + private MergeElementTreeListener mergeElementTreeListener; } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/ParseElementContext.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/ParseElementContext.java new file mode 100644 index 0000000000000000000000000000000000000000..56db8331a71ce39b39a19218d16ec0a5144948eb --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/ParseElementContext.java @@ -0,0 +1,15 @@ +package com.gitee.spirit.core3.visitor.entity; + +import com.gitee.spirit.core3.element.entity.Element; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Map; + +@Data +@AllArgsConstructor +public class ParseElementContext { + private ParseClassContext parseClassContext; + private Element element; + private Map attachment; +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/SCVariable.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/SCVariable.java index c3c0b0a2c9668ed38eb93c7316c98cadb8d27eda..139920ce308028ce5bb6da4e34a97f3b1e142fbc 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/SCVariable.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/SCVariable.java @@ -9,6 +9,6 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class SCVariable { - private SCType scType; + private SCType variableType; private String variableName; } diff --git a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/pojo/MethodInfo.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/TokenEvent.java similarity index 34% rename from spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/pojo/MethodInfo.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/TokenEvent.java index 29df1d2460e61d16d5e35a81dca0b477436af144..5447c3ef36c78bff7942db6376cacad4f2c2fc41 100644 --- a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/pojo/MethodInfo.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/entity/TokenEvent.java @@ -1,5 +1,8 @@ -package com.gitee.spirit.code.tools.pojo; +package com.gitee.spirit.core3.visitor.entity; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.element.entity.Statement; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,7 +12,8 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class MethodInfo { - public String tipText; - public String actualText; +public class TokenEvent { + private Statement statement; + private int index; + private Token token; } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ContentCompilationHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ContentCompilationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..a9b2bedb88e8de840e5b5f186746330131ada947 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ContentCompilationHandler.java @@ -0,0 +1,42 @@ +package com.gitee.spirit.core3.visitor.handler; + +import com.gitee.spirit.core3.compile.ConfigManager; +import com.gitee.spirit.core3.compile.utils.LineUtils; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.tree.entity.ElementTree; +import com.gitee.spirit.core3.visitor.api.ElementHandler; +import com.gitee.spirit.core3.visitor.api.CompilationHandler; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Order(-200) +public class ContentCompilationHandler implements CompilationHandler { + + @Autowired + private List elementHandlers; + + @Override + public void handleElementTree(ParseClassContext parseClassContext, ElementTree elementTree) { + if (parseClassContext.getFieldTree() == null && parseClassContext.getMethodTree() == null) return; + Element element = elementTree.getElement(); + if (element.isMethodDeclare()) return; + try { + for (ElementHandler elementHandler : elementHandlers) { + elementHandler.handleElement(parseClassContext, element); + } + } finally { + if (ConfigManager.isDebugMode()) printElementForDebug(element); + } + } + + private void printElementForDebug(Element element) { + String originalLine = element.toString(); + System.out.println(originalLine + LineUtils.getSpaces(100 - originalLine.length()) + " >>>> " + element.debug()); + } + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/VisitContextHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/ClassContextElementHandler.java similarity index 62% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/VisitContextHandler.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/ClassContextElementHandler.java index 7460883425f1a446043e8b0464f48c490e758f88..10e60f7895eeda5992d5f51908d6637c8be605c1 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/VisitContextHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/ClassContextElementHandler.java @@ -1,18 +1,18 @@ -package com.gitee.spirit.core3.visitor.handler; +package com.gitee.spirit.core3.visitor.handler.element; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.tree.entity.FieldTree; -import com.gitee.spirit.core3.tree.entity.MethodTree; +import com.gitee.spirit.core3.tree.entity.clazz.FieldTree; +import com.gitee.spirit.core3.tree.entity.clazz.MethodTree; import com.gitee.spirit.core3.visitor.api.ElementHandler; import com.gitee.spirit.core3.visitor.api.StatementParser; import com.gitee.spirit.core3.visitor.api.TypeParser; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import com.gitee.spirit.core3.visitor.entity.SCVariable; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -21,7 +21,7 @@ import java.util.List; @Component @Order(-140) -public class VisitContextHandler implements ElementHandler { +public class ClassContextElementHandler implements ElementHandler { @Autowired private StatementParser statementParser; @@ -29,13 +29,13 @@ public class VisitContextHandler implements ElementHandler { private TypeParser typeParser; @Override - public void visitElement(VisitContext visitContext, Element element) { - List variables = visitContext.getVariables().peek(); + public void handleElement(ParseClassContext parseClassContext, Element element) { + List variables = parseClassContext.getVariables().peek(); if (element.isAssign()) { Token varToken = element.get(0); SCType scType = (SCType) varToken.getAttachment().get(Attachment.TYPE); variables.add(new SCVariable(scType, varToken.toString())); - FieldTree fieldTree = visitContext.getFieldTree(); + FieldTree fieldTree = parseClassContext.getFieldTree(); if (fieldTree != null) { fieldTree.setFieldType(scType); } @@ -52,20 +52,20 @@ public class VisitContextHandler implements ElementHandler { } else if (element.isReturn()) { Statement statement = element.subStmt(1, element.size()); - SCType scType = statementParser.parseType(statement); - MethodTree methodTree = visitContext.getMethodTree(); + SCType statementType = statementParser.parseStmtType(statement); + MethodTree methodTree = parseClassContext.getMethodTree(); if (methodTree != null) { - Element methodElement = methodTree.getMergeTree().getElement(); + Element methodElement = methodTree.getMergeElementTree().getElement(); if (methodElement.isFunc()) { if (methodTree.getReturnType() == null) { - methodTree.setReturnType(scType); + methodTree.setReturnType(statementType); } else { - SCType existType = methodTree.getReturnType(); - if (!scType.isNull()) { - if (typeParser.isAssignableFrom(scType, existType)) { - methodTree.setReturnType(scType); + SCType existReturnType = methodTree.getReturnType(); + if (!statementType.isNull()) { + if (typeParser.isAssignableFrom(statementType, existReturnType)) { + methodTree.setReturnType(statementType); } else { - methodTree.setReturnType(BasicTypes.OBJECT); + methodTree.setReturnType(CommonTypes.OBJECT); } } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ExpressionHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/ExpressionElementHandler.java similarity index 31% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ExpressionHandler.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/ExpressionElementHandler.java index 2ac862f6345ad0ad2db97f410e244c93dbbd1af4..2f92b7f2e093bfc3c3966df266501f04024895f7 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ExpressionHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/ExpressionElementHandler.java @@ -1,72 +1,82 @@ -package com.gitee.spirit.core3.visitor.handler; +package com.gitee.spirit.core3.visitor.handler.element; -import com.gitee.spirit.common.enums.SeparatorEnum; -import com.gitee.spirit.common.enums.TokenType; -import com.gitee.spirit.common.utils.SpringUtils; -import com.gitee.spirit.core3.compile.api.TokenListener; +import com.gitee.spirit.core3.compile.api.TokensProcessor; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.tree.entity.StatementTree; +import com.gitee.spirit.core3.tree.entity.ElementTree; import com.gitee.spirit.core3.visitor.api.*; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; +import java.util.HashMap; + @Component @Order(-180) -public class ExpressionHandler implements ElementHandler { +public class ExpressionElementHandler implements ElementHandler { @Autowired private VariableTracker variableTracker; @Autowired - private ElementTokenHandler elementTokenHandler; + private FirstPhaseElementHandler firstPhaseElementHandler; @Autowired private StatementParser statementParser; @Autowired private TypeParser typeParser; @Autowired - private TokenListener tokenListener; + private TokensProcessor tokensProcessor; + @Autowired + private CompilationVisitor compilationVisitor; @Override - public void visitElement(VisitContext visitContext, Element element) { - if (element.isAssign()) {// text = "abc" + public void handleElement(ParseClassContext parseClassContext, Element element) { + if (element.isAssign()) { // var = "string" // CONST_VAR = "string" Token varToken = element.get(0); - SCType scType = null; - if (visitContext.getMethodTree() != null) {// 如果是字段声明,则不用进行上下文推导 - scType = variableTracker.findVariableType(visitContext, varToken.toString()); + SCType varType = null; + // 如果在方法上下文中,则可以尝试从上下文中,获取变量的类型 + if (parseClassContext.getMethodTree() != null) { + varType = variableTracker.findVariableType(parseClassContext, varToken.toString()); } - if (scType == null) {// 如果找不到,则必须通过推导获取类型 - Token lastToken = element.get(element.size() - 1); - int toIndex = lastToken.getTokenType() == SeparatorEnum.SEMI ? element.size() - 1 : element.size(); - Statement statement = element.subStmt(2, toIndex); - elementTokenHandler.visitStatement(visitContext, element, statement); - scType = statementParser.parseType(statement); - varToken.getAttachment().put(Attachment.DERIVED, true);// 标记类型是否经过推导而来 + if (varType == null) { + // 获取语句的右值 + Statement statement = element.subStmt(2, element.size()); + // 构造解析元素上下文 + ParseElementContext parseElementContext = new ParseElementContext(parseClassContext, element, new HashMap<>(4)); + // 推导语句的右值 + firstPhaseElementHandler.handleStatement(parseElementContext, statement); + // 推导右值的类型 + varType = statementParser.parseStmtType(statement); + // 标记该变量类型由推导而来 + varToken.getAttachment().put(Attachment.DERIVED, true); } - varToken.getAttachment().put(Attachment.TYPE, scType); + varToken.getAttachment().put(Attachment.TYPE, varType); - } else if (element.isForIn()) {// for item in list { + } else if (element.isForIn()) { // for item in list { Statement statement = element.subStmt(3, element.size() - 1); - elementTokenHandler.visitStatement(visitContext, element, statement); - SCType scType = statementParser.parseType(statement); - scType = scType.isArray() ? typeParser.toTarget(scType) : scType.getGenericTypes().get(0);// 获取数组内部类型和泛型类型 + // 构造解析元素上下文 + ParseElementContext parseElementContext = new ParseElementContext(parseClassContext, element, new HashMap<>(4)); + firstPhaseElementHandler.handleStatement(parseElementContext, statement); + SCType statementType = statementParser.parseStmtType(statement); + // 语句类型可能是数组或者泛型 + statementType = statementType.isArray() ? typeParser.toTarget(statementType) : statementType.getGenericTypes().get(0); Token varToken = element.get(1); - varToken.getAttachment().put(Attachment.TYPE, scType); + varToken.getAttachment().put(Attachment.TYPE, statementType); - } else if (element.isFor()) {// for (i=0; i<100; i++) { + } else if (element.isFor()) { // for (i=0; i<100; i++) { Token secondToken = element.get(1); if (secondToken.isSubexpression()) { Statement statement = (Statement) secondToken.getValue(); Statement subStatement = statement.subStmt(1, statement.indexOf(";")); - if (subStatement.size() > 0) { - Element subElement = (Element) tokenListener.postProcessTokens(true, subStatement); - StatementTree statementTree = new StatementTree(subElement); - ClassVisitor classVisitor = SpringUtils.getBean(ClassVisitor.class); - classVisitor.visitStatementTree(visitContext, statementTree); + if (!subStatement.isEmpty()) { + // 将子语句转换成一个完整的元素 + Element subElement = (Element) tokensProcessor.processTokens(true, subStatement); + ElementTree elementTree = new ElementTree(subElement); + compilationVisitor.visitElementTree(parseClassContext, elementTree); } } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ElementTokenHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/FirstPhaseElementHandler.java similarity index 44% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ElementTokenHandler.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/FirstPhaseElementHandler.java index 0d4bf40c30f7cf88c9b10e23dab4fc840bf1600f..1e4c0ce84f461025646e072e49996f68aa12dc4e 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/ElementTokenHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/FirstPhaseElementHandler.java @@ -1,42 +1,42 @@ -package com.gitee.spirit.core3.visitor.handler; +package com.gitee.spirit.core3.visitor.handler.element; -import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.constants.Attachment; -import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; import com.gitee.spirit.core3.visitor.api.*; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import java.util.ArrayList; +import java.util.HashMap; import java.util.List; @Component @Order(-160) -public class ElementTokenHandler implements ElementHandler { +public class FirstPhaseElementHandler implements ElementHandler { @Autowired private List tokenHandlers; @Override - public void visitElement(VisitContext visitContext, Element element) { - visitStatement(visitContext, element, element); + public void handleElement(ParseClassContext parseClassContext, Element element) { + ParseElementContext parseElementContext = new ParseElementContext(parseClassContext, element, new HashMap<>(4)); + handleStatement(parseElementContext, element); } - public void visitStatement(VisitContext visitContext, Element element, Statement statement) { + public void handleStatement(ParseElementContext parseElementContext, Statement statement) { for (int index = 0; index < statement.size(); index++) { Token token = statement.get(index); if (token.isVisitStmt()) { - visitStatement(visitContext, element, (Statement) token.getValue()); + handleStatement(parseElementContext, (Statement) token.getValue()); } + TokenEvent tokenEvent = new TokenEvent(statement, index, token); for (TokenHandler tokenHandler : tokenHandlers) { - if (tokenHandler.isHandle(visitContext, element, statement, index, token)) { - tokenHandler.visitToken(visitContext, element, statement, index, token); + if (tokenHandler.isHandle(parseElementContext, tokenEvent)) { + tokenHandler.handleToken(parseElementContext, tokenEvent); break; } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/TypeDeclareHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/TypeDeclareElementHandler.java similarity index 51% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/TypeDeclareHandler.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/TypeDeclareElementHandler.java index 8fd65144731857ed0592c24fb631b54e2c5b8a74..bc209573ed79b76300f7f879fb20e08317cd7e50 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/TypeDeclareHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/element/TypeDeclareElementHandler.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.core3.visitor.handler; +package com.gitee.spirit.core3.visitor.handler.element; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.core3.compile.entity.SCType; @@ -6,31 +6,31 @@ import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.visitor.api.ElementHandler; import com.gitee.spirit.core3.visitor.api.TypeFactory; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(-200) -public class TypeDeclareHandler implements ElementHandler { +public class TypeDeclareElementHandler implements ElementHandler { @Autowired private TypeFactory typeFactory; @Override - public void visitElement(VisitContext visitContext, Element element) { - if (element.isDeclare() || element.isDeclareAssign()) {// String text + public void handleElement(ParseClassContext parseClassContext, Element element) { + if (element.isDeclare() || element.isDeclareAssign()) { // String var Token typeToken = element.get(0); Token varToken = element.get(1); - SCType scType = typeFactory.newType(visitContext.getClassProxy(), typeToken); - varToken.getAttachment().put(Attachment.TYPE, scType); + SCType varType = typeFactory.newType(parseClassContext.getClassProxy(), typeToken); + varToken.getAttachment().put(Attachment.TYPE, varType); - } else if (element.isCatch()) {// } catch Exception e { + } else if (element.isCatch()) { // } catch Exception e { Token typeToken = element.get(2); Token varToken = element.get(3); - SCType scType = typeFactory.newType(visitContext.getClassProxy(), typeToken); - varToken.getAttachment().put(Attachment.TYPE, scType); + SCType varType = typeFactory.newType(parseClassContext.getClassProxy(), typeToken); + varToken.getAttachment().put(Attachment.TYPE, varType); } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/CommonTokenHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/CommonTokenHandler.java index 8a2a1fc7eb3ca5db07272974f9f4262f0abe137c..545c3c1c2e44240bb04d30c7d4c71d66871f0881 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/CommonTokenHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/CommonTokenHandler.java @@ -3,19 +3,20 @@ package com.gitee.spirit.core3.visitor.handler.token; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; import com.gitee.spirit.core3.visitor.api.StatementParser; import com.gitee.spirit.core3.visitor.api.TokenHandler; import com.gitee.spirit.core3.visitor.api.TypeFactory; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component -@Order(-100) +@Order(-200) public class CommonTokenHandler implements TokenHandler { @Autowired @@ -24,29 +25,27 @@ public class CommonTokenHandler implements TokenHandler { private TypeFactory typeFactory; @Override - public boolean isHandle(VisitContext visitContext, Element element, Statement statement, int index, Token token) { - if (token.isTypeSmartBuilder()) { - return true; - - } else if (token.isAnyType() + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); + return token.isTypeSmartBuilder() + || token.isAnyType() || token.isAnyInit() || token.isTypeBuilder() || token.isTypeMacroBuilder() || token.isLiteral() || token.isCollection() - || token.isCast()) { - return true; - - } else if (token.isSubexpression()) { - return true; - } - return false; + || token.isCast() + || token.isSubexpression(); } @Override - public void visitToken(VisitContext visitContext, Element element, Statement statement, int index, Token token) { + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + Token token = tokenEvent.getToken(); if (token.isTypeSmartBuilder()) { - token.getAttachment().put(Attachment.TYPE, BasicTypes.NULL); + // 暂时为智能构造token设置一个null类型 + token.getAttachment().put(Attachment.TYPE, CommonTypes.NULL); + parseElementContext.getAttachment().put(Attachment.HAS_SMART_BUILDER, true); } else if (token.isAnyType() || token.isAnyInit() @@ -55,12 +54,16 @@ public class CommonTokenHandler implements TokenHandler { || token.isLiteral() || token.isCollection() || token.isCast()) { - token.getAttachment().put(Attachment.TYPE, typeFactory.newType(visitContext.getClassProxy(), token)); + // 以上这些类型,一般都能直接推导出类型 + SCType tokenType = typeFactory.newType(parseClassContext.getClassProxy(), token); + token.getAttachment().put(Attachment.TYPE, tokenType); } else if (token.isSubexpression()) { - Statement subStatement = (Statement) token.getValue(); - SCType scType = statementParser.parseType(subStatement.subStmt("(", ")")); - token.getAttachment().put(Attachment.TYPE, scType); + // 通过语句片段推导出类型 + Statement statement = (Statement) token.getValue(); + Statement subStatement = statement.subStmt("(", ")"); + SCType statementType = statementParser.parseStmtType(subStatement); + token.getAttachment().put(Attachment.TYPE, statementType); } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/InvocationTokenHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/InvocationTokenHandler.java index 9697bdfd90cb7f891755f87ba70e4e089ae3f122..cbdbefed7ca632042ae86d7a91b0cd7ca15fb1e8 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/InvocationTokenHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/InvocationTokenHandler.java @@ -1,15 +1,17 @@ package com.gitee.spirit.core3.visitor.handler.token; import com.gitee.spirit.common.constants.Attachment; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.api.ClassLinker; +import com.gitee.spirit.core3.visitor.api.CompilationLinker; import com.gitee.spirit.core3.visitor.api.StatementParser; import com.gitee.spirit.core3.visitor.api.TokenHandler; import com.gitee.spirit.core3.visitor.api.TypeParser; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -18,62 +20,94 @@ import java.util.ArrayList; import java.util.List; @Component -@Order(-60) +@Order(-160) public class InvocationTokenHandler implements TokenHandler { @Autowired - private ClassLinker classLinker; + private CompilationLinker compilationLinker; @Autowired private StatementParser statementParser; @Autowired private TypeParser typeParser; @Override - public boolean isHandle(VisitContext visitContext, Element element, Statement statement, int index, Token token) { + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); return token.isVisitIdentifier() || token.isLocalMethod() || token.isVisitMethod() || token.isVisitIndex(); } @Override - public void visitToken(VisitContext visitContext, Element element, Statement statement, int index, Token token) { - List parameterTypes = token.isInvoke() ? getParameterTypes(token) : null; - if (token.isVisitIdentifier()) { - SCType scType = (SCType) statement.get(index - 1).getAttachment().get(Attachment.TYPE); - String memberName = (String) token.getAttachment().get(Attachment.MEMBER_NAME); - SCType returnType = classLinker.visitField(scType, memberName); - token.getAttachment().put(Attachment.TYPE, returnType); + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + Statement statement = tokenEvent.getStatement(); + int index = tokenEvent.getIndex(); + Token token = tokenEvent.getToken(); - } else if (token.isLocalMethod()) { - SCType scType = visitContext.getClassProxy().getType(); - String memberName = (String) token.getAttachment().get(Attachment.MEMBER_NAME); - SCType returnType = classLinker.visitMethod(scType, memberName, parameterTypes); - token.getAttachment().put(Attachment.TYPE, returnType); - //for smart builder - parameterTypes = classLinker.getParameterTypes(scType, memberName, parameterTypes); - setTypeForSmartBuilder((Statement) token.getValue(), parameterTypes); - - } else if (token.isVisitMethod()) { - SCType scType = (SCType) statement.get(index - 1).getAttachment().get(Attachment.TYPE); - String memberName = (String) token.getAttachment().get(Attachment.MEMBER_NAME); - SCType returnType = classLinker.visitMethod(scType, memberName, parameterTypes); + if (token.isVisitIdentifier()) { // what like ".field" + Token lastToken = statement.get(index - 1); + SCType scType = (SCType) lastToken.getAttachment().get(Attachment.TYPE); + AccessRule accessRule = getAccessRuleByLastToken(lastToken); + String fieldName = (String) token.getAttachment().get(Attachment.MEMBER_NAME); + SCType returnType = compilationLinker.visitField(scType, accessRule, fieldName); token.getAttachment().put(Attachment.TYPE, returnType); - //for smart builder - parameterTypes = classLinker.getParameterTypes(scType, memberName, parameterTypes); - setTypeForSmartBuilder((Statement) token.getValue(), parameterTypes); - } else if (token.isVisitIndex()) {// what like "[0]" - SCType scType = (SCType) statement.get(index - 1).getAttachment().get(Attachment.TYPE); - scType = typeParser.toTarget(scType);// 转换数组类型为目标类型 + } else if (token.isLocalMethod()) { // what like "method()" + SCType scType = parseClassContext.getClassProxy().getType(); + AccessRule accessRule = new AccessRule(false, AccessRule.EVEN_PRIVATE); + handleMethodToken(parseElementContext, token, scType, accessRule); + + } else if (token.isVisitMethod()) { // what like ".method()" + Token lastToken = statement.get(index - 1); + SCType scType = (SCType) lastToken.getAttachment().get(Attachment.TYPE); + AccessRule accessRule = getAccessRuleByLastToken(lastToken); + handleMethodToken(parseElementContext, token, scType, accessRule); + + } else if (token.isVisitIndex()) { // what like "[0]" + Token lastToken = statement.get(index - 1); + SCType scType = (SCType) lastToken.getAttachment().get(Attachment.TYPE); + scType = typeParser.toTarget(scType); token.getAttachment().put(Attachment.TYPE, scType); } } + private AccessRule getAccessRuleByLastToken(Token lastToken) { + if (lastToken.isKeyword()) { + if ("super".equals(lastToken.toString())) { + return new AccessRule(false, AccessRule.PROTECTED); + + } else if ("this".equals(lastToken.toString())) { + return new AccessRule(false, AccessRule.EVEN_PRIVATE); + } + throw new RuntimeException("Unknown keyword!"); + + } else if (lastToken.isAnyType()) { + return new AccessRule(true, AccessRule.ONLY_PUBLIC); + } + return new AccessRule(false, AccessRule.ONLY_PUBLIC); + } + + private void handleMethodToken(ParseElementContext parseElementContext, Token token, SCType scType, AccessRule accessRule) { + String methodName = (String) token.getAttachment().get(Attachment.MEMBER_NAME); + List parameterTypes = getParameterTypes(token); + SCType returnType = compilationLinker.visitMethod(scType, accessRule, methodName, parameterTypes); + token.getAttachment().put(Attachment.TYPE, returnType); + // for smart builder + if (!parameterTypes.isEmpty()) { + Boolean hasSmartBuilder = (Boolean) parseElementContext.getAttachment().get(Attachment.HAS_SMART_BUILDER); + if (hasSmartBuilder != null && hasSmartBuilder) { + parameterTypes = compilationLinker.getParameterTypes(scType, accessRule, methodName, parameterTypes); + setTypeForSmartBuilder((Statement) token.getValue(), parameterTypes); + } + } + } + private List getParameterTypes(Token token) { List parameterTypes = new ArrayList<>(); Statement statement = (Statement) token.getValue(); if (statement.size() > 3) { List subStatements = statement.subStmt(2, statement.size() - 1).splitStmt(","); for (Statement subStatement : subStatements) { - SCType parameterType = statementParser.parseType(subStatement); + SCType parameterType = statementParser.parseStmtType(subStatement); parameterTypes.add(parameterType); } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/VariableTokenHandler.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/VariableTokenHandler.java index e0600615ac2f602288cce06fd4cb0e356bea1fd3..e3c49c2f5b9b50f25dbf68dbbc00c5902f6b202f 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/VariableTokenHandler.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/handler/token/VariableTokenHandler.java @@ -4,32 +4,35 @@ import cn.hutool.core.lang.Assert; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; import com.gitee.spirit.core3.visitor.api.TokenHandler; import com.gitee.spirit.core3.visitor.api.VariableTracker; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component -@Order(-80) +@Order(-180) public class VariableTokenHandler implements TokenHandler { @Autowired private VariableTracker variableTracker; @Override - public boolean isHandle(VisitContext visitContext, Element element, Statement statement, int index, Token token) { + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); return token.isVariable() || token.isSuper() || token.isThis(); } @Override - public void visitToken(VisitContext visitContext, Element element, Statement statement, int index, Token token) { + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + Token token = tokenEvent.getToken(); if (token.getAttachment().get(Attachment.TYPE) == null) { String variableName = token.toString(); - SCType scType = variableTracker.findVariableType(visitContext, variableName); + SCType scType = variableTracker.findVariableType(parseClassContext, variableName); Assert.notNull(scType, "Variable must be declared!variableName:" + variableName); token.getAttachment().put(Attachment.TYPE, scType); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/AbstractCollectionTypeFactory.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/AbstractCollectionTypeFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..123cfe6ffd6923c816249aecda3516b32b3eaf16 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/AbstractCollectionTypeFactory.java @@ -0,0 +1,73 @@ +package com.gitee.spirit.core3.visitor.impl; + +import cn.hutool.core.lang.Assert; +import com.gitee.spirit.core3.compile.entity.SCType; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.visitor.api.StatementParser; +import com.gitee.spirit.core3.visitor.api.TypeParser; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractCollectionTypeFactory extends AbstractTypeFactory { + + @Autowired + private StatementParser statementParser; + @Autowired + private TypeParser typeParser; + + protected SCType getCollectionType(Token token) { + if (token.isList()) { + return getListType(token); + + } else if (token.isMap()) { + return getMapType(token); + } + return null; + } + + private SCType getListType(Token token) { + Statement statement = (Statement) token.getValue(); + List statements = statement.subStmt(1, statement.size() - 1).splitStmt(","); + return newType(CommonTypes.LIST.getClassName(), getGenericType(statements)); + } + + private SCType getMapType(Token token) { + Statement statement = (Statement) token.getValue(); + List keyStatements = new ArrayList<>(); + List valueStatements = new ArrayList<>(); + for (Statement subStatement : statement.subStmt(1, statement.size() - 1).splitStmt(",")) { + List subStatements = subStatement.splitStmt(":"); + keyStatements.add(subStatements.get(0)); + valueStatements.add(subStatements.get(1)); + } + return newType(CommonTypes.MAP.getClassName(), getGenericType(keyStatements), getGenericType(valueStatements)); + } + + private SCType getGenericType(List statements) { + // 如果没有元素,则返回Object类型 + if (statements.size() == 0) return CommonTypes.OBJECT; + SCType genericType = null; + for (Statement statement : statements) { + SCType statementType = statementParser.parseStmtType(statement); + SCType boxType = typeParser.toBox(statementType); + if (genericType == null) { + genericType = boxType; + continue; + } + if (typeParser.isAssignableFrom(boxType, genericType)) { // 更抽象则替换 + genericType = boxType; + + } else if (!typeParser.isAssignableFrom(genericType, boxType)) { // 不同则使用Object + genericType = CommonTypes.OBJECT; + break; + } + } + Assert.notNull(genericType, "Generic type cannot be null!"); + return genericType; + } + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/AbstractTypeFactory.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/AbstractTypeFactory.java index 2dfe7578edea5974818de56f7d0db4859ae1c421..9f468a8e8334d37a213d7a8efe673cd52df12ade 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/AbstractTypeFactory.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/AbstractTypeFactory.java @@ -4,7 +4,7 @@ import com.gitee.spirit.core3.compile.api.TokenParser; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.visitor.api.ClassProxy; import com.gitee.spirit.core3.visitor.api.TypeFactory; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import org.springframework.beans.factory.annotation.Autowired; import java.util.Arrays; @@ -16,11 +16,6 @@ public abstract class AbstractTypeFactory implements TypeFactory { @Autowired private TokenParser tokenParser; - @Override - public SCType newType(String className, SCType... genericTypes) { - return newType(className, Arrays.asList(genericTypes)); - } - @Override public SCType newType(String className, List genericTypes) { SCType scType = newType(className); @@ -30,9 +25,14 @@ public abstract class AbstractTypeFactory implements TypeFactory { return scType; } + @Override + public SCType newType(String className, SCType... genericTypes) { + return newType(className, Arrays.asList(genericTypes)); + } + @Override public SCType newTypeVariable(String genericName) { - SCType scType = newType(BasicTypes.OBJECT.getClassName()); + SCType scType = newType(CommonTypes.OBJECT.getClassName()); scType.setGenericName(genericName); return scType; } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultClassProxy.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultClassProxy.java index ff8353cc539804e9d736dcd028efb8ea509156ed..aee6189fab23d57891303d82e23f2d09b2231529 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultClassProxy.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultClassProxy.java @@ -1,8 +1,12 @@ package com.gitee.spirit.core3.visitor.impl; +import cn.hutool.core.lang.Assert; +import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.common.utils.Collectors; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.entity.*; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.tree.entity.clazz.*; import com.gitee.spirit.core3.visitor.api.ClassProxy; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; @@ -19,7 +23,7 @@ public class DefaultClassProxy implements ClassProxy { private CompilationTree compilationTree; private Map attachment; - + @Override public ImportTree findImport(String shortName) { return compilationTree.getImportTrees().get(shortName); @@ -30,6 +34,18 @@ public class DefaultClassProxy implements ClassProxy { return compilationTree.getClassName(); } + @Override + public boolean isAnnotated(String className) { + ClassTree classTree = compilationTree.getClassTree(); + List annotationTrees = classTree.getAnnotationTrees(); + AnnotationTree annotationTree = Collectors.findOne(annotationTrees, item -> { + SCType annotationType = item.getAnnotationType(); + Assert.notNull(annotationType, "The type of annotation cannot be null!"); + return className.equals(annotationType.getClassName()); + }); + return annotationTree != null; + } + @Override public ClassTree getClassTree() { return compilationTree.getClassTree(); @@ -63,8 +79,11 @@ public class DefaultClassProxy implements ClassProxy { } @Override - public FieldTree getField(String fieldName) { - FieldTree fieldTree = getClassTree().getFieldTrees().get(fieldName); + public FieldTree getField(AccessRule accessRule, String fieldName) { + FieldTree fieldTree = null; + if (!accessRule.isStatic()) { + fieldTree = getClassTree().getFieldTrees().get(fieldName); + } if (fieldTree == null) { fieldTree = compilationTree.getFieldTrees().get(fieldName); } @@ -72,8 +91,11 @@ public class DefaultClassProxy implements ClassProxy { } @Override - public List getMethod(String methodName) { - List methodTrees = getClassTree().getMethodTrees().get(methodName); + public List getMethod(AccessRule accessRule, String methodName) { + List methodTrees = null; + if (!accessRule.isStatic()) { + methodTrees = getClassTree().getMethodTrees().get(methodName); + } if (methodTrees == null) { methodTrees = compilationTree.getMethodTrees().get(methodName); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationFactory.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationFactory.java index 1e036f6b7474ac077a4d22087b728e9b1401a976..3276985448b280604b33310ac1e340e94ed4d145 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationFactory.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationFactory.java @@ -3,7 +3,7 @@ package com.gitee.spirit.core3.visitor.impl; import cn.hutool.core.collection.CollUtil; import com.gitee.spirit.core3.compile.entity.CompilationUnit; import com.gitee.spirit.core3.compile.entity.ParseContext; -import com.gitee.spirit.core3.tree.entity.CompilationTree; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; import com.gitee.spirit.core3.visitor.api.ClassProxy; import com.gitee.spirit.core3.visitor.api.CompilationFactory; import lombok.Data; @@ -27,8 +27,8 @@ public class DefaultCompilationFactory implements CompilationFactory { @Override public void loadCompilationUnits(ParseContext parseContext, List compilationUnits) { this.parseContext = parseContext; - compilationTreeMap = new LinkedHashMap<>(); - classProxyMap = new LinkedHashMap<>(); + this.compilationTreeMap = new LinkedHashMap<>(); + this.classProxyMap = new LinkedHashMap<>(); for (CompilationUnit compilationUnit : compilationUnits) { CompilationTree compilationTree = (CompilationTree) compilationUnit; compilationTreeMap.put(compilationTree.getClassName(), compilationTree); @@ -51,9 +51,17 @@ public class DefaultCompilationFactory implements CompilationFactory { public ClassProxy getClassProxy(String className) { if (!classProxyMap.containsKey(className)) { CompilationTree compilationTree = compilationTreeMap.get(className); - return new DefaultClassProxy(compilationTree, new ConcurrentHashMap<>()); + ClassProxy classProxy = new DefaultClassProxy(compilationTree, new ConcurrentHashMap<>()); + classProxyMap.put(className, classProxy); } return classProxyMap.get(className); } + @Override + public void clear() { + parseContext = null; + compilationTreeMap = null; + classProxyMap = null; + } + } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationImporter.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationImporter.java new file mode 100644 index 0000000000000000000000000000000000000000..05b4247015f32bf85e1d2f769eb2d6562e0fac59 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationImporter.java @@ -0,0 +1,42 @@ +package com.gitee.spirit.core3.visitor.impl; + +import com.gitee.spirit.core3.compile.ConfigManager; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; +import com.gitee.spirit.core3.visitor.api.ClassProxy; +import com.gitee.spirit.core3.visitor.api.CompilationFactory; +import com.gitee.spirit.core3.visitor.api.CompilationImporter; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; +import java.util.Set; + +@Slf4j +@Component +public class DefaultCompilationImporter implements CompilationImporter { + + @Autowired + private CompilationFactory compilationFactory; + @Autowired + private CompilationSelector compilationSelector; + + @Override + public void parseImportTrees(ParseContext parseContext, CompilationTree compilationTree) { + boolean isDebugMode = ConfigManager.isDebugMode(); + if (isDebugMode) log.info("Importing started. className: {}", compilationTree.getClassName()); + + Map> dependencies = parseContext.getDependencies(); + Set typeNames = dependencies.get(compilationTree.getClassName()); + ClassProxy classProxy = compilationFactory.getClassProxy(compilationTree.getClassName()); + + for (String typeName : typeNames) { + String className = compilationSelector.findClassName(classProxy, typeName); + compilationSelector.addImport(classProxy, className); + if (isDebugMode) log.info(" >>>> className: {}", className); + } + } + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultClassVisitor.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationParser.java similarity index 40% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultClassVisitor.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationParser.java index 86175ab1b0a589e2ef14decf748d55a8d715ecc3..7d99bd5122df32a6f10fffbaf1146410bfb181cc 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultClassVisitor.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationParser.java @@ -1,51 +1,42 @@ package com.gitee.spirit.core3.visitor.impl; -import com.gitee.spirit.common.enums.KeywordEnum; import com.gitee.spirit.common.utils.Collectors; -import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.core3.compile.ConfigManager; +import com.gitee.spirit.core3.compile.entity.ParseContext; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.compile.utils.LineUtils; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.tree.entity.*; -import com.gitee.spirit.core3.tree.enums.AccessState; +import com.gitee.spirit.core3.tree.entity.clazz.*; +import com.gitee.spirit.core3.visitor.api.ClassProxy; +import com.gitee.spirit.core3.visitor.api.CompilationFactory; +import com.gitee.spirit.core3.visitor.api.CompilationParser; +import com.gitee.spirit.core3.visitor.api.TypeFactory; import com.gitee.spirit.core3.visitor.utils.CompilationTreeUtils; -import com.gitee.spirit.core3.visitor.api.*; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; -import com.gitee.spirit.core3.visitor.entity.SCVariable; -import com.gitee.spirit.core3.visitor.entity.VisitContext; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Stack; -@Slf4j @Component -public class DefaultClassVisitor implements ClassVisitor { +public class DefaultCompilationParser implements CompilationParser { @Autowired private CompilationFactory compilationFactory; @Autowired - private List elementHandlers; - @Autowired private TypeFactory typeFactory; - @Autowired - private TypeParser typeParser; @Override - public void prepareForVisit(CompilationTree compilationTree) { - boolean isDebug = ConfigUtils.isDebug(); + public void parseCompilationTree(ParseContext parseContext, CompilationTree compilationTree) { try { ClassProxy classProxy = compilationFactory.getClassProxy(compilationTree.getClassName()); // parse static field Collection allFieldTrees = compilationTree.getFieldTrees().values(); for (FieldTree fieldTree : allFieldTrees) { + visitAnnotationType(classProxy, fieldTree.getAnnotationTrees()); visitFieldType(classProxy, fieldTree); } @@ -53,13 +44,16 @@ public class DefaultClassVisitor implements ClassVisitor { Collection> allMethodTrees = compilationTree.getMethodTrees().values(); for (List methodTrees : allMethodTrees) { for (MethodTree methodTree : methodTrees) { + visitAnnotationType(classProxy, methodTree.getAnnotationTrees()); visitReturnType(classProxy, methodTree); visitParameters(classProxy, methodTree); } } ClassTree classTree = compilationTree.getClassTree(); - Element element = classTree.getMergeTree().getElement(); + // Annotation of access type + visitAnnotationType(classProxy, classTree.getAnnotationTrees()); + Element element = classTree.getMergeElementTree().getElement(); Token typeToken = classTree.getTypeToken(); SCType scType = typeFactory.newType(classProxy, typeToken); @@ -71,18 +65,19 @@ public class DefaultClassVisitor implements ClassVisitor { classTree.setSuperType(superType); } + List interfaceTypes = new ArrayList<>(); List interfaceTokens = element.nextTokens("implements", ",", Token::isAnyType); if (interfaceTokens != null) { - List interfaceTypes = new ArrayList<>(); for (Token interfaceToken : interfaceTokens) { interfaceTypes.add(typeFactory.newType(classProxy, interfaceToken)); } - classTree.setInterfaceTypes(interfaceTypes); } + classTree.setInterfaceTypes(interfaceTypes); // parse static field allFieldTrees = classTree.getFieldTrees().values(); for (FieldTree fieldTree : allFieldTrees) { + visitAnnotationType(classProxy, fieldTree.getAnnotationTrees()); visitFieldType(classProxy, fieldTree); } @@ -90,18 +85,27 @@ public class DefaultClassVisitor implements ClassVisitor { allMethodTrees = compilationTree.getClassTree().getMethodTrees().values(); for (List methodTrees : allMethodTrees) { for (MethodTree methodTree : methodTrees) { + visitAnnotationType(classProxy, methodTree.getAnnotationTrees()); visitReturnType(classProxy, methodTree); visitParameters(classProxy, methodTree); } } } finally { - if (isDebug) CompilationTreeUtils.showCompilationTree(compilationTree); + if (ConfigManager.isDebugMode()) CompilationTreeUtils.showCompilationTree(compilationTree); + } + } + + private void visitAnnotationType(ClassProxy classProxy, List annotationTrees) { + for (AnnotationTree annotationTree : annotationTrees) { + Token annotationToken = annotationTree.getToken(); + SCType annotationType = typeFactory.newType(classProxy, annotationToken); + annotationTree.setAnnotationType(annotationType); } } private void visitFieldType(ClassProxy classProxy, FieldTree fieldTree) { - Element element = fieldTree.getStatementTree().getElement(); + Element element = fieldTree.getElementTree().getElement(); if (element.isDeclare() || element.isDeclareAssign()) { Token typeToken = element.get(0); SCType scType = typeFactory.newType(classProxy, typeToken); @@ -110,8 +114,8 @@ public class DefaultClassVisitor implements ClassVisitor { } private void visitReturnType(ClassProxy classProxy, MethodTree methodTree) { - Element element = methodTree.getMergeTree().getElement(); - if (element.isDefineFunc()) { + Element element = methodTree.getMergeElementTree().getElement(); + if (element.isDefineFunc() || element.isDeclareFunc()) { Token typeToken = element.get(0); SCType scType = typeFactory.newType(classProxy, typeToken); methodTree.setReturnType(scType); @@ -120,123 +124,23 @@ public class DefaultClassVisitor implements ClassVisitor { private void visitParameters(ClassProxy classProxy, MethodTree methodTree) { methodTree.setParameterTrees(new ArrayList<>()); - Element element = methodTree.getMergeTree().getElement(); + methodTree.setParameterTypes(new ArrayList<>()); + Element element = methodTree.getMergeElementTree().getElement(); Token methodToken = element.findToken(token -> token.isTypeInit() || token.isLocalMethod()); Statement statement = (Statement) methodToken.getValue(); List statements = statement.subStmt("(", ")").splitStmt(","); for (Statement subStatement : statements) { - List annotationTrees = Collectors.findAllAtHead(subStatement, Token::isAnnotation, AnnotationTree::new); ParameterTree parameterTree = new ParameterTree(); + List annotationTrees = Collectors.findAllAtHead(subStatement, Token::isAnnotation, AnnotationTree::new); + // Derive the type of Parameter annotation + visitAnnotationType(classProxy, annotationTrees); parameterTree.setAnnotationTrees(annotationTrees); - parameterTree.setParameterType(typeFactory.newType(classProxy, subStatement.get(0))); + SCType parameterType = typeFactory.newType(classProxy, subStatement.get(0)); + parameterTree.setParameterType(parameterType); parameterTree.setParameterName(subStatement.getStr(1)); methodTree.getParameterTrees().add(parameterTree); + methodTree.getParameterTypes().add(parameterType); } } - @Override - public void visitCompilationTree(CompilationTree compilationTree) { - ClassProxy classProxy = compilationFactory.getClassProxy(compilationTree.getClassName()); - VisitContext visitContext = VisitContext.builder() - .classProxy(classProxy) - .variables(new Stack<>()) - .build(); - visitContext.getVariables().add(new ArrayList<>()); - compilationTree.getFieldTrees().values().forEach(fieldTree -> visitFieldTree(visitContext, fieldTree)); - compilationTree.getMethodTrees().values().forEach(methodTrees -> - methodTrees.forEach(methodTree -> visitMethodTree(visitContext, methodTree))); - visitClassTree(visitContext, compilationTree.getClassTree()); - } - - @Override - public void visitClassTree(VisitContext visitContext, ClassTree classTree) { - classTree.getFieldTrees().values().forEach(fieldTree -> visitFieldTree(visitContext, fieldTree)); - classTree.getMethodTrees().values().forEach(methodTrees -> - methodTrees.forEach(methodTree -> visitMethodTree(visitContext, methodTree))); - } - - @Override - public void visitFieldTree(VisitContext visitContext, FieldTree fieldTree) { - if (fieldTree.getAccessState() == AccessState.NOT_VISITED) { - visitContext.setFieldTree(fieldTree); - fieldTree.setAccessState(AccessState.VISITING); - visitStatementTree(visitContext, fieldTree.getStatementTree()); - fieldTree.setAccessState(AccessState.VISITED); - visitContext.setFieldTree(null); - } - } - - @Override - public void visitMethodTree(VisitContext visitContext, MethodTree methodTree) { - if (methodTree.getAccessState() == AccessState.NOT_VISITED) { - visitContext.setMethodTree(methodTree); - methodTree.setAccessState(AccessState.VISITING); - visitStatementTree(visitContext, methodTree.getMergeTree()); - // modify the merge tree - Element element = methodTree.getMergeTree().getElement(); - if (element.isFunc()) { - if (methodTree.getReturnType() == null) { - methodTree.setReturnType(BasicTypes.VOID); - } - Token typeToken = typeParser.toToken(visitContext.getClassProxy(), methodTree.getReturnType()); - element.replaceToken(token -> token.getTokenType() == KeywordEnum.FUNC, typeToken); - } - methodTree.setAccessState(AccessState.VISITED); - visitContext.setMethodTree(null); - } - } - - @Override - public void visitStatementTree(VisitContext visitContext, StatementTree statementTree) { - boolean isDebug = ConfigUtils.isDebug(); - Element element = statementTree.getElement(); - if (element.isVariableDeclare()) { - visitContext.getVariables().add(new ArrayList<>()); - } - try { - if (element.isMethodDeclare()) { - List variables = visitContext.getVariables().peek(); - MethodTree methodTree = visitContext.getMethodTree(); - if (methodTree != null) { - List parameterTrees = methodTree.getParameterTrees(); - for (ParameterTree parameterTree : parameterTrees) { - variables.add(new SCVariable(parameterTree.getParameterType(), parameterTree.getParameterName())); - } - } - } else { - for (ElementHandler elementHandler : elementHandlers) { - elementHandler.visitElement(visitContext, element); - } - } - } finally { - if (isDebug) printElementForDebug(element); - } - if (statementTree instanceof MergeTree) { - MergeTree mergeTree = (MergeTree) statementTree; - visitContext.setMergeTree(mergeTree); - visitContext.getVariables().add(new ArrayList<>()); - List statementTrees = mergeTree.getChildren(); - for (int index = 0; index < statementTrees.size(); index++) { - StatementTree childStatementTree = statementTrees.get(index); - visitStatementTree(visitContext, childStatementTree); - // for macro builder - MergeTreeListener mergeTreeListener = visitContext.getMergeTreeListener(); - if (mergeTreeListener != null) { - index = mergeTreeListener.postProcessMergeTree(visitContext, mergeTree, index); - visitContext.setMergeTreeListener(null); - } - } - visitContext.getVariables().pop(); - } - if (element.isVariableDeclare()) { - visitContext.getVariables().pop(); - } - } - - private void printElementForDebug(Element element) { - String originalLine = element.toString(); - System.out.println(originalLine + LineUtils.getSpaces(100 - originalLine.length()) - + " >>>> " + element.debug()); - } - } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationVisitor.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationVisitor.java new file mode 100644 index 0000000000000000000000000000000000000000..340bed153c75df7c21cbe281ac2ab693f9340327 --- /dev/null +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultCompilationVisitor.java @@ -0,0 +1,181 @@ +package com.gitee.spirit.core3.visitor.impl; + +import com.gitee.spirit.common.constants.Attachment; +import com.gitee.spirit.common.enums.token.KeywordEnum; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.tree.entity.*; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; +import com.gitee.spirit.core3.tree.entity.clazz.*; +import com.gitee.spirit.core3.tree.entity.VisitState; +import com.gitee.spirit.core3.visitor.api.*; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; +import com.gitee.spirit.core3.visitor.entity.SCVariable; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +@Slf4j +@Component +public class DefaultCompilationVisitor implements CompilationVisitor { + + @Autowired + private CompilationFactory compilationFactory; + @Autowired + private List compilationHandlers; + @Autowired + private TypeParser typeParser; + + @Override + public void visitCompilationTree(ParseContext parseContext, CompilationTree compilationTree) { + ClassProxy classProxy = compilationFactory.getClassProxy(compilationTree.getClassName()); + Boolean hasClassVisited = (Boolean) classProxy.getAttachment().get(Attachment.HAS_CLASS_VISITED); + if (hasClassVisited == null || !hasClassVisited) { + doVisitCompilationTree(compilationTree, classProxy); + classProxy.getAttachment().put(Attachment.HAS_CLASS_VISITED, true); + } + } + + private void doVisitCompilationTree(CompilationTree compilationTree, ClassProxy classProxy) { + // 初始化上下文 + ParseClassContext parseClassContext = ParseClassContext.builder() + .classProxy(classProxy) + .variables(new Stack<>()) + .build(); + parseClassContext.getVariables().add(new ArrayList<>()); + // 访问包体 + visitPackageTree(parseClassContext, compilationTree.getPackageTree()); + // 访问引入体 + compilationTree.getImportTrees().values().forEach(importTree -> visitImportTree(parseClassContext, importTree)); + // 访问静态字段体 + compilationTree.getFieldTrees().values().forEach(fieldTree -> visitFieldTree(parseClassContext, fieldTree)); + // 访问静态方法体 + compilationTree.getMethodTrees().values().forEach(methodTrees -> methodTrees.forEach( + methodTree -> visitMethodTree(parseClassContext, methodTree))); + // 访问类型体 + visitClassTree(parseClassContext, compilationTree.getClassTree()); + } + + @Override + public void visitPackageTree(ParseClassContext parseClassContext, PackageTree packageTree) { + parseClassContext.setPackageTree(packageTree); + visitElementTree(parseClassContext, packageTree.getElementTree()); + parseClassContext.setPackageTree(null); + } + + @Override + public void visitImportTree(ParseClassContext parseClassContext, ImportTree importTree) { + parseClassContext.setImportTree(importTree); + visitElementTree(parseClassContext, importTree.getElementTree()); + parseClassContext.setImportTree(null); + } + + @Override + public void visitFieldTree(ParseClassContext parseClassContext, FieldTree fieldTree) { + if (fieldTree.getVisitState() == VisitState.NOT_VISITED) { + parseClassContext.setFieldTree(fieldTree); + fieldTree.setVisitState(VisitState.VISITING); + visitElementTree(parseClassContext, fieldTree.getElementTree()); + fieldTree.setVisitState(VisitState.VISITED); + parseClassContext.setFieldTree(null); + } + } + + @Override + public void visitMethodTree(ParseClassContext parseClassContext, MethodTree methodTree) { + if (methodTree.getVisitState() == VisitState.NOT_VISITED) { + parseClassContext.setMethodTree(methodTree); + methodTree.setVisitState(VisitState.VISITING); + visitElementTree(parseClassContext, methodTree.getMergeElementTree()); + // 根据方法的返回类型,替换关键字func + Element element = methodTree.getMergeElementTree().getElement(); + if (element.isFunc()) { + if (methodTree.getReturnType() == null) { + methodTree.setReturnType(CommonTypes.VOID); + } + Token returnTypeToken = typeParser.toToken(parseClassContext.getClassProxy(), methodTree.getReturnType()); + element.replaceToken(token -> token.getTokenType() == KeywordEnum.FUNC, returnTypeToken); + } + methodTree.setVisitState(VisitState.VISITED); + parseClassContext.setMethodTree(null); + } + } + + @Override + public void visitClassTree(ParseClassContext parseClassContext, ClassTree classTree) { + parseClassContext.setClassTree(classTree); + visitElementTree(parseClassContext, classTree.getMergeElementTree()); + // 访问字段体 + classTree.getFieldTrees().values().forEach(fieldTree -> visitFieldTree(parseClassContext, fieldTree)); + // 访问方法体 + classTree.getMethodTrees().values().forEach(methodTrees -> methodTrees.forEach( + methodTree -> visitMethodTree(parseClassContext, methodTree))); + parseClassContext.setClassTree(null); + } + + @Override + public void visitElementTree(ParseClassContext parseClassContext, ElementTree elementTree) { + if (parseClassContext.getMethodTree() == null) { + doVisitElementTree(parseClassContext, elementTree); + } else { + visitMethodContent(parseClassContext, elementTree); + } + } + + private void doVisitElementTree(ParseClassContext parseClassContext, ElementTree elementTree) { + for (CompilationHandler compilationHandler : compilationHandlers) { + compilationHandler.handleElementTree(parseClassContext, elementTree); + } + } + + private void visitMethodContent(ParseClassContext parseClassContext, ElementTree elementTree) { + Element element = elementTree.getElement(); + // 复杂语句可以声明变量,此时需要加深变量栈 + if (element.isVariableDeclare()) parseClassContext.getVariables().add(new ArrayList<>()); + // 将方法参数作为变量,添加到上下文中 + if (element.isMethodDeclare()) { + List variables = parseClassContext.getVariables().peek(); + MethodTree methodTree = parseClassContext.getMethodTree(); + List parameterTrees = methodTree.getParameterTrees(); + for (ParameterTree parameterTree : parameterTrees) { + variables.add(new SCVariable(parameterTree.getParameterType(), parameterTree.getParameterName())); + } + } + // 真正解析语句 + doVisitElementTree(parseClassContext, elementTree); + // 访问子语句 + if (elementTree instanceof MergeElementTree) { + // 注意:递归可能会修改上下文中的mergeElementTree,此时需要修正回来 + MergeElementTree previousMergeElementTree = parseClassContext.getMergeElementTree(); + MergeElementTree mergeElementTree = (MergeElementTree) elementTree; + parseClassContext.setMergeElementTree(mergeElementTree); + parseClassContext.getVariables().add(new ArrayList<>()); + List elementTrees = mergeElementTree.getChildren(); + for (int index = 0; index < elementTrees.size(); index++) { + ElementTree childElementTree = elementTrees.get(index); + visitMethodContent(parseClassContext, childElementTree); + index = postProcessElementTree(parseClassContext, mergeElementTree, index); + } + parseClassContext.getVariables().pop(); + parseClassContext.setMergeElementTree(previousMergeElementTree); + } + if (element.isVariableDeclare()) parseClassContext.getVariables().pop(); + } + + private int postProcessElementTree(ParseClassContext parseClassContext, MergeElementTree mergeElementTree, int index) { + // for macro builder + MergeElementTreeListener mergeElementTreeListener = parseClassContext.getMergeElementTreeListener(); + if (mergeElementTreeListener != null) { + index = mergeElementTreeListener.postProcessMergeElementTree(parseClassContext, mergeElementTree, index); + parseClassContext.setMergeElementTreeListener(null); + } + return index; + } + +} diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultMethodMatcher.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultMethodMatcher.java index c2e160418b9fe680ec911e59ff6b1c568d5943e8..bf6fa9e5a81db4080ad2b28df74680b3ea1bd8ad 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultMethodMatcher.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultMethodMatcher.java @@ -2,7 +2,7 @@ package com.gitee.spirit.core3.visitor.impl; import com.gitee.spirit.common.utils.Collectors; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.entity.MethodTree; +import com.gitee.spirit.core3.tree.entity.clazz.MethodTree; import com.gitee.spirit.core3.visitor.api.MethodMatcher; import com.gitee.spirit.core3.visitor.api.TypeParser; import com.gitee.spirit.core3.visitor.entity.MethodResult; @@ -26,7 +26,6 @@ public class DefaultMethodMatcher implements MethodMatcher { List methodParameterTypes = populateParameterTypes(scType, methodTree); return new MethodResult(methodTree, methodParameterTypes); } - } else { List methodResults = new ArrayList<>(); for (MethodTree methodTree : methodTrees) { @@ -47,11 +46,12 @@ public class DefaultMethodMatcher implements MethodMatcher { private List populateParameterTypes(SCType scType, MethodTree methodTree) { List methodParameterTypes = methodTree.getParameterTypes(); - for (int index = 0; index < methodParameterTypes.size(); index++) { - SCType methodParameterType = typeParser.populate(scType, methodParameterTypes.get(index)); - methodParameterTypes.set(index, methodParameterType); + List parameterTypes = new ArrayList<>(); + for (SCType methodParameterType : methodParameterTypes) { + SCType parameterType = typeParser.populate(scType, methodParameterType); + parameterTypes.add(parameterType); } - return methodParameterTypes; + return parameterTypes; } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultStatementParser.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultStatementParser.java index d9388937c34d4ec56bb918c8aeba1c1b2ba8e0d0..3710bd2cf9d64204d238df8a961f55797dccf732 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultStatementParser.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultStatementParser.java @@ -5,11 +5,11 @@ import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.common.utils.Collectors; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.api.SyntaxTreeMaker; +import com.gitee.spirit.core3.element.api.TreeNodeParser; import com.gitee.spirit.core3.element.entity.Statement; import com.gitee.spirit.core3.element.entity.TreeNode; import com.gitee.spirit.core3.visitor.api.StatementParser; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import com.gitee.spirit.core3.visitor.utils.NodeVisitor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -20,18 +20,18 @@ import java.util.List; public class DefaultStatementParser implements StatementParser { @Autowired - private SyntaxTreeMaker syntaxTreeMaker; + private TreeNodeParser treeNodeParser; @Override - public SCType parseType(Statement statement) { - List treeNodes = syntaxTreeMaker.parseNodes(statement); + public SCType parseStmtType(Statement statement) { + List treeNodes = treeNodeParser.parseNodes(statement); SCType scType = (SCType) NodeVisitor.forEachNode(treeNodes, treeNode -> { Token token = treeNode.getToken(); if (token.getAttachment().get(Attachment.TYPE) != null) { return token.getAttachment().get(Attachment.TYPE); } if (token.isLogical() || token.isRelation() || token.isInstanceof()) { - return BasicTypes.BOOLEAN; + return CommonTypes.BOOLEAN; } else if (token.isArithmetic() || token.isBitwise()) { return Collectors.asListNonNull(treeNode.getPrev(), treeNode.getNext()); diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeFactory.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeFactory.java index bae331ad3b5e053581645d2ed0fa4d72c5c60b6a..a5ca1041a3ac2bb6cdc13f3b690402d536448508 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeFactory.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeFactory.java @@ -1,16 +1,15 @@ package com.gitee.spirit.core3.visitor.impl; -import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.enums.PrimitiveEnum; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.common.utils.PrimitiveUtils; +import com.gitee.spirit.common.utils.TypeUtils; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.api.*; -import com.gitee.spirit.common.constants.AccessLevel; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; -import com.gitee.spirit.common.utils.TypeUtils; +import com.gitee.spirit.core3.visitor.api.ClassProxy; +import com.gitee.spirit.core3.visitor.api.CompilationFactory; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -18,16 +17,12 @@ import java.util.ArrayList; import java.util.List; @Component -public class DefaultTypeFactory extends AbstractTypeFactory { +public class DefaultTypeFactory extends AbstractCollectionTypeFactory { @Autowired private CompilationFactory compilationFactory; @Autowired - private ImportSelector importSelector; - @Autowired - private StatementParser statementParser; - @Autowired - private TypeParser typeParser; + private CompilationSelector compilationSelector; @Override public SCType newType(String className) { @@ -41,15 +36,14 @@ public class DefaultTypeFactory extends AbstractTypeFactory { scType.setNull(false); scType.setWildcard(false); scType.setNative(!compilationFactory.contains(TypeUtils.getTargetName(className))); - scType.setModifiers(AccessLevel.ONLY_PUBLIC); - scType.setGenericTypes(new ArrayList<>()); + scType.setGenericTypes(new ArrayList<>(0)); return scType; } @Override public SCType newType(ClassProxy classProxy, Token token) { if (token.isAnyType()) { - return doCreate(classProxy, token); + return doNewType(classProxy, token); } else if (token.isAnnotation() || token.isAnyInit() @@ -58,27 +52,30 @@ public class DefaultTypeFactory extends AbstractTypeFactory { || token.isCast()) { return newType(classProxy, (String) token.getAttachment().get(Attachment.SIMPLE_NAME)); - } else if (token.isLiteral() || token.isCollection()) {// 1, 1.1, "xxxx" + } else if (token.isLiteral()) { // 1, 1.1, "string" return getLiteralType(token); + + } else if (token.isCollection()) { // ["string"], {"key": "value"} + return getCollectionType(token); } return null; } - private SCType doCreate(ClassProxy classProxy, Token token) { - if (token.getValue() instanceof String) {// String // String[] //? //T,K + private SCType doNewType(ClassProxy classProxy, Token token) { + if (token.getValue() instanceof String) { // String // String[] // ? // T, K String simpleName = (String) token.getValue(); if ("?".equals(simpleName)) { - return BasicTypes.WILDCARD;// ? + return CommonTypes.WILDCARD; // ? } else if (classProxy.getTypeVariableIndex(simpleName) >= 0) { - return newTypeVariable(simpleName);// T or K + return newTypeVariable(simpleName); // T or K } - return newType(importSelector.findClassName(classProxy, simpleName)); + return newType(compilationSelector.findClassName(classProxy, simpleName)); } else if (token.getValue() instanceof Statement) { Statement statement = (Statement) token.getValue(); // List // Class String simpleName = statement.getStr(0); - SCType scType = newType(importSelector.findClassName(classProxy, simpleName)); + SCType scType = newType(compilationSelector.findClassName(classProxy, simpleName)); scType.setGenericTypes(getGenericTypes(classProxy, statement)); return scType; } @@ -99,79 +96,30 @@ public class DefaultTypeFactory extends AbstractTypeFactory { private SCType getLiteralType(Token token) { if (token.isIntLiteral()) { - return BasicTypes.INT; + return CommonTypes.INT; } else if (token.isLongLiteral()) { - return BasicTypes.LONG; + return CommonTypes.LONG; } else if (token.isFloatLiteral()) { - return BasicTypes.FLOAT; + return CommonTypes.FLOAT; } else if (token.isDoubleLiteral()) { - return BasicTypes.DOUBLE; + return CommonTypes.DOUBLE; } else if (token.isCharLiteral()) { - return BasicTypes.CHAR; + return CommonTypes.CHAR; } else if (token.isStringLiteral()) { - return BasicTypes.STRING; + return CommonTypes.STRING; } else if (token.isBooleanLiteral()) { - return BasicTypes.BOOLEAN; + return CommonTypes.BOOLEAN; } else if (token.isNull()) { - return BasicTypes.NULL; - - } else if (token.isList()) { - return getListType(token); - - } else if (token.isMap()) { - return getMapType(token); + return CommonTypes.NULL; } return null; } - private SCType getListType(Token token) { - Statement statement = (Statement) token.getValue(); - List statements = statement.subStmt(1, statement.size() - 1).splitStmt(","); - return newType(BasicTypes.LIST.getClassName(), getGenericType(statements)); - } - - private SCType getMapType(Token token) { - Statement statement = (Statement) token.getValue(); - List keyStatements = new ArrayList<>(); - List valueStatements = new ArrayList<>(); - for (Statement subStatement : statement.subStmt(1, statement.size() - 1).splitStmt(",")) { - List subStatements = subStatement.splitStmt(":"); - keyStatements.add(subStatements.get(0)); - valueStatements.add(subStatements.get(1)); - } - return newType(BasicTypes.MAP.getClassName(), - getGenericType(keyStatements), getGenericType(valueStatements)); - } - - private SCType getGenericType(List statements) { - if (statements.size() == 0) {// 如果没有元素,则返回Object类型 - return BasicTypes.OBJECT; - } - SCType genericType = null; - for (Statement statement : statements) { - SCType scType = statementParser.parseType(statement); - SCType boxType = typeParser.toBox(scType); - if (genericType == null) { - genericType = boxType; - continue; - } - if (typeParser.isAssignableFrom(boxType, genericType)) {// 更抽象则替换 - genericType = boxType; - - } else if (!typeParser.isAssignableFrom(genericType, boxType)) {// 不同则使用Object - genericType = BasicTypes.OBJECT; - break; - } - } - Assert.notNull(genericType, "Generic type cannot be null!"); - return genericType; - } - } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeParser.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeParser.java index e8e1f06f6dcf5001b164cf4f0fae430bdf21b1ba..67f4294c252233dc42c76e38fa61fb122d05caf2 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeParser.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultTypeParser.java @@ -1,16 +1,14 @@ package com.gitee.spirit.core3.visitor.impl; import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.enums.PrimitiveArrayEnum; -import com.gitee.spirit.common.enums.PrimitiveEnum; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.PrimitiveArrayEnum; +import com.gitee.spirit.common.enums.token.PrimitiveEnum; +import com.gitee.spirit.common.enums.token.TokenType; import com.gitee.spirit.common.utils.SpringUtils; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.visitor.api.*; -import com.gitee.spirit.common.constants.AccessLevel; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; -import com.gitee.spirit.core3.tree.utils.TypeBuilder; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import com.gitee.spirit.common.utils.TypeUtils; import com.gitee.spirit.core3.visitor.utils.TypeVisitor; import org.springframework.beans.factory.annotation.Autowired; @@ -22,35 +20,9 @@ import java.util.List; public class DefaultTypeParser implements TypeParser { @Autowired - private ClassLinker classLinker; + private CompilationLinker compilationLinker; @Autowired - private ImportSelector importSelector; - - @Override - public SCType evenPrivate(SCType scType) { - scType = TypeBuilder.copy(scType); - scType.setModifiers(AccessLevel.EVEN_PRIVATE); - return scType; - } - - @Override - public SCType withProtected(SCType scType) { - scType = TypeBuilder.copy(scType); - scType.setModifiers(AccessLevel.PROTECTED); - return scType; - } - - @Override - public SCType lowerAccessLevel(SCType scType) { - scType = TypeBuilder.copy(scType); - if (scType.getModifiers() == AccessLevel.EVEN_PRIVATE) { - scType.setModifiers(AccessLevel.PROTECTED); - - } else if (scType.getModifiers() == AccessLevel.PROTECTED) { - scType.setModifiers(AccessLevel.ONLY_PUBLIC); - } - return scType; - } + private CompilationSelector compilationSelector; @Override public SCType toTarget(SCType scType) { @@ -60,7 +32,7 @@ public class DefaultTypeParser implements TypeParser { @Override public SCType toBox(SCType scType) { - SCType boxType = BasicTypes.getBoxType(scType.getClassName()); + SCType boxType = CommonTypes.getBoxType(scType.getClassName()); return boxType != null ? boxType : scType; } @@ -68,10 +40,10 @@ public class DefaultTypeParser implements TypeParser { public SCType populate(SCType instanceType, SCType targetType) { return TypeVisitor.forEachType(targetType, eachType -> { if (eachType.isTypeVariable()) { - int index = classLinker.getTypeVariableIndex(instanceType, eachType.getGenericName()); + int index = compilationLinker.getTypeVariableIndex(instanceType, eachType.getGenericName()); Assert.isTrue(index >= 0, "Index of type variable less than 0!"); Assert.isTrue(instanceType.isGenericType(), "Type must be a generic type!"); - return TypeBuilder.copy(instanceType.getGenericTypes().get(index)); + return instanceType.getGenericTypes().get(index); } return eachType; }); @@ -98,7 +70,7 @@ public class DefaultTypeParser implements TypeParser { @Override public String getQualifiedName(ClassProxy classProxy, SCType scType) { return TypeVisitor.forEachTypeName(scType, eachType -> - !importSelector.addImport(classProxy, eachType.getClassName()) ? eachType.getTypeName() : eachType.toString()); + !compilationSelector.addImport(classProxy, eachType.getClassName()) ? eachType.getTypeName() : eachType.toString()); } @Override @@ -127,22 +99,22 @@ public class DefaultTypeParser implements TypeParser { if (abstractType == null || targetType == null) { return null; } - if (abstractType.isNull()) {// null类型不能比任何类型抽象 + if (abstractType.isNull()) { // null类型不能比任何类型抽象 return null; } - if (targetType.isNull()) {// 任何类型都能比null抽象 + if (targetType.isNull()) { // 任何类型都能比null抽象 return 0; } - if (targetType.equals(abstractType)) {// 这个方法还要判断泛型 + if (targetType.equals(abstractType)) { // 这个方法还要判断泛型 return 0; } - SCType boxType = toBox(targetType);// 这个方法中,还要考虑到自动拆组包 - SCType superType = classLinker.getSuperType(boxType); + SCType boxType = toBox(targetType); // 这个方法中,还要考虑到自动拆组包 + SCType superType = compilationLinker.getSuperType(boxType); Integer superSimilarity = parseBloodRelationship(abstractType, superType); if (superSimilarity != null) { return superSimilarity - 1; } - for (SCType interfaceType : classLinker.getInterfaceTypes(targetType)) { // 接口 + for (SCType interfaceType : compilationLinker.getInterfaceTypes(targetType)) { // 接口 Integer interfaceSimilarity = parseBloodRelationship(abstractType, interfaceType); if (interfaceSimilarity != null) { return interfaceSimilarity - 1; diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultVariableTracker.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultVariableTracker.java index 26c7aca880f6617c6ba64eb5f2f1d64643193c6e..da1d0361670a59fc6b325fbbc25d23bdbb30cfb9 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultVariableTracker.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/impl/DefaultVariableTracker.java @@ -1,11 +1,11 @@ package com.gitee.spirit.core3.visitor.impl; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.visitor.api.ClassLinker; -import com.gitee.spirit.core3.visitor.api.TypeParser; +import com.gitee.spirit.core3.visitor.api.CompilationLinker; import com.gitee.spirit.core3.visitor.api.VariableTracker; import com.gitee.spirit.core3.visitor.entity.SCVariable; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -16,46 +16,47 @@ import java.util.Stack; public class DefaultVariableTracker implements VariableTracker { @Autowired - private ClassLinker classLinker; - @Autowired - private TypeParser typeParser; + private CompilationLinker compilationLinker; @Override - public SCType findVariableType(VisitContext visitContext, String variableName) { - SCType scType = findTypeByKeyword(visitContext, variableName); - scType = scType == null ? findTypeByContext(visitContext, variableName) : scType; - scType = scType == null ? findTypeByLinker(visitContext, variableName) : scType; - return scType; + public SCType findVariableType(ParseClassContext parseClassContext, String variableName) { + SCType variableType = findVariableTypeByKeyword(parseClassContext, variableName); + if (variableType == null) variableType = findVariableTypeByContext(parseClassContext, variableName); + if (variableType == null) variableType = findVariableTypeByLinker(parseClassContext, variableName); + return variableType; } - private SCType findTypeByKeyword(VisitContext visitContext, String variableName) { + private SCType findVariableTypeByKeyword(ParseClassContext parseClassContext, String variableName) { if ("super".equals(variableName)) { - return typeParser.withProtected(visitContext.getClassProxy().getSuperType()); + return parseClassContext.getClassProxy().getSuperType(); } else if ("this".equals(variableName)) { - return typeParser.evenPrivate(visitContext.getClassProxy().getType()); + return parseClassContext.getClassProxy().getType(); } return null; } - private SCType findTypeByContext(VisitContext context, String variableName) { + private SCType findVariableTypeByContext(ParseClassContext context, String variableName) { Stack> stack = context.getVariables(); for (int index = stack.size() - 1; index >= 0; index--) { List variables = stack.get(index); for (int idx = variables.size() - 1; idx >= 0; idx--) { - SCVariable scVariable = variables.get(idx); - if (variableName.equals(scVariable.getVariableName())) { - return scVariable.getScType(); + SCVariable variable = variables.get(idx); + if (variableName.equals(variable.getVariableName())) { + return variable.getVariableType(); } } } return null; } - private SCType findTypeByLinker(VisitContext visitContext, String variableName) { + private SCType findVariableTypeByLinker(ParseClassContext parseClassContext, String variableName) { try { - // 从本身和父类里面寻找,父类可能是native的 - return classLinker.visitField(typeParser.evenPrivate(visitContext.getClassProxy().getType()), variableName); + // 从自身和父类中,查找字段字段类型,注意父类可能是本地类型 + SCType scType = parseClassContext.getClassProxy().getType(); + AccessRule accessRule = new AccessRule(false, AccessRule.EVEN_PRIVATE); + return compilationLinker.visitField(scType, accessRule, variableName); + } catch (Exception e) { return null; } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AdaptiveClassLinker.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AdaptiveCompilationLinker.java similarity index 58% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AdaptiveClassLinker.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AdaptiveCompilationLinker.java index 033482f55ffd488d4db668344da882d41084b6ca..351f4f1ca72daceedd3e8ed24e7f9557d45c59b2 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AdaptiveClassLinker.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AdaptiveCompilationLinker.java @@ -1,11 +1,12 @@ package com.gitee.spirit.core3.visitor.linker; import cn.hutool.core.lang.Assert; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.visitor.api.ClassLinker; +import com.gitee.spirit.core3.visitor.api.CompilationLinker; import com.gitee.spirit.core3.visitor.api.TypeFactory; import com.gitee.spirit.core3.visitor.api.TypeParser; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; @@ -15,23 +16,23 @@ import java.util.List; @Primary @Component -public class AdaptiveClassLinker implements ClassLinker { +public class AdaptiveCompilationLinker implements CompilationLinker { @Autowired - private PrimitiveClassLinker primitiveClassLinker; + private PrimitiveCompilationLinker primitiveClassLinker; @Autowired - private ArrayClassLinker arrayClassLinker; + private ArrayCompilationLinker arrayClassLinker; @Autowired - private AppClassLinker appClassLinker; + private AppCompilationLinker appClassLinker; @Autowired - @Qualifier("extClassLinker") - private ClassLinker extClassLinker; + @Qualifier("extCompilationLinker") + private CompilationLinker extCompilationLinker; @Autowired private TypeFactory typeFactory; @Autowired private TypeParser typeParser; - private ClassLinker chooseLinker(SCType scType) { + private CompilationLinker chooseLinker(SCType scType) { if (scType.isPrimitive()) { return primitiveClassLinker; @@ -39,13 +40,18 @@ public class AdaptiveClassLinker implements ClassLinker { return arrayClassLinker; } else if (scType.isNative()) { - return extClassLinker; + return extCompilationLinker; } else { return appClassLinker; } } + @Override + public Object getClassObject(SCType scType) { + return chooseLinker(scType).getClassObject(scType); + } + @Override public int getTypeVariableIndex(SCType scType, String genericName) { return chooseLinker(scType).getTypeVariableIndex(scType, genericName); @@ -53,17 +59,11 @@ public class AdaptiveClassLinker implements ClassLinker { @Override public SCType getSuperType(SCType scType) { - // Object已经没有父类了 - if (scType.isPrimitive() || BasicTypes.OBJECT.equals(scType)) { - return null; - } + // 原始类型和Object没有父类 + if (scType.isPrimitive() || CommonTypes.OBJECT.equals(scType)) return null; // 如果不存在显式的父类,则返回Object SCType superType = chooseLinker(scType).getSuperType(scType); - if (superType == null) { - return BasicTypes.OBJECT; - } - // 降低访问权限 - return typeParser.lowerAccessLevel(superType); + return superType != null ? superType : CommonTypes.OBJECT; } @Override @@ -72,18 +72,18 @@ public class AdaptiveClassLinker implements ClassLinker { } @Override - public SCType visitField(SCType scType, String fieldName) { + public SCType visitField(SCType scType, AccessRule accessRule, String fieldName) { Assert.notNull(scType, "Type cannot be null!"); Assert.notEmpty(fieldName, "Field name cannot be empty!"); - // obj.class class是关键字 + // class是关键字,例如"obj.class",返回obj的类型 if ("class".equals(fieldName)) { - return typeFactory.newType(BasicTypes.CLASS.getClassName(), typeParser.toBox(scType)); + return typeFactory.newType(CommonTypes.CLASS.getClassName(), typeParser.toBox(scType)); } - SCType returnType = chooseLinker(scType).visitField(scType, fieldName); + SCType returnType = chooseLinker(scType).visitField(scType, accessRule, fieldName); if (returnType == null) { SCType superType = getSuperType(scType); if (superType != null) { - return visitField(superType, fieldName); + return visitField(superType, accessRule.lowerAccessLevel(), fieldName); } } if (returnType == null) { @@ -93,22 +93,22 @@ public class AdaptiveClassLinker implements ClassLinker { } @Override - public SCType visitMethod(SCType scType, String methodName, List parameterTypes) { + public SCType visitMethod(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { Assert.notNull(scType, "Type cannot be null!"); Assert.notEmpty(methodName, "Method name cannot be empty!"); - // super()和this()指代父类或者本身的构造函数,返回这个类本身 + // super()和this()是调用父类或者本身的构造方法,类型为类本身 if ("super".equals(methodName) || "this".equals(methodName)) { return scType; } - // 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 - if (BasicTypes.OBJECT.equals(scType) && "empty".equals(methodName)) { - return BasicTypes.BOOLEAN; + // 如果用户没有自定义empty方法,则视Object自带empty方法,返回布尔类型 + if (CommonTypes.OBJECT.equals(scType) && "empty".equals(methodName)) { + return CommonTypes.BOOLEAN; } - SCType returnType = chooseLinker(scType).visitMethod(scType, methodName, parameterTypes); + SCType returnType = chooseLinker(scType).visitMethod(scType, accessRule, methodName, parameterTypes); if (returnType == null) { SCType superType = getSuperType(scType); if (superType != null) { - return visitMethod(superType, methodName, parameterTypes); + return visitMethod(superType, accessRule.lowerAccessLevel(), methodName, parameterTypes); } } if (returnType == null) { @@ -118,22 +118,22 @@ public class AdaptiveClassLinker implements ClassLinker { } @Override - public List getParameterTypes(SCType scType, String methodName, List parameterTypes) { + public List getParameterTypes(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { Assert.notNull(scType, "Type cannot be null!"); Assert.notEmpty(methodName, "Method name cannot be empty!"); - // super()和this()指代父类或者本身的构造函数,返回这个类本身 + // super()和this()是调用父类或者本身的构造方法,类型为类本身 if ("super".equals(methodName) || "this".equals(methodName)) { return parameterTypes; } - // 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 - if (BasicTypes.OBJECT.equals(scType) && "empty".equals(methodName)) { + // 如果用户没有自定义empty方法,则视Object自带empty方法,返回布尔类型 + if (CommonTypes.OBJECT.equals(scType) && "empty".equals(methodName)) { return parameterTypes; } - List methodParameterTypes = chooseLinker(scType).getParameterTypes(scType, methodName, parameterTypes); + List methodParameterTypes = chooseLinker(scType).getParameterTypes(scType, accessRule, methodName, parameterTypes); if (methodParameterTypes == null) { SCType superType = getSuperType(scType); if (superType != null) { - return getParameterTypes(superType, methodName, parameterTypes); + return getParameterTypes(superType, accessRule.lowerAccessLevel(), methodName, parameterTypes); } } if (methodParameterTypes == null) { diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AppClassLinker.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AppCompilationLinker.java similarity index 52% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AppClassLinker.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AppCompilationLinker.java index bdaab7798ce34605497036827ae86a8055697233..e7d9895835c7c681cdaf166044ebce1c5683dbdb 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AppClassLinker.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/AppCompilationLinker.java @@ -1,12 +1,14 @@ package com.gitee.spirit.core3.visitor.linker; +import cn.hutool.core.lang.Assert; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.tree.entity.FieldTree; -import com.gitee.spirit.core3.tree.entity.MethodTree; -import com.gitee.spirit.core3.tree.enums.AccessState; +import com.gitee.spirit.core3.tree.entity.clazz.FieldTree; +import com.gitee.spirit.core3.tree.entity.clazz.MethodTree; +import com.gitee.spirit.core3.tree.entity.VisitState; import com.gitee.spirit.core3.visitor.api.*; import com.gitee.spirit.core3.visitor.entity.MethodResult; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -15,37 +17,38 @@ import java.util.List; import java.util.Stack; @Component -public class AppClassLinker implements ClassLinker { +public class AppCompilationLinker implements CompilationLinker { @Autowired private CompilationFactory compilationFactory; @Autowired - private ClassVisitor classVisitor; + private CompilationVisitor compilationVisitor; @Autowired private MethodMatcher methodMatcher; @Autowired private TypeParser typeParser; - private ClassProxy getClassProxy(SCType scType) { + @Override + public Object getClassObject(SCType scType) { return compilationFactory.getClassProxy(scType.getClassName()); } @Override public int getTypeVariableIndex(SCType scType, String genericName) { - ClassProxy classProxy = getClassProxy(scType); + ClassProxy classProxy = (ClassProxy) getClassObject(scType); return classProxy.getTypeVariableIndex(genericName); } @Override public SCType getSuperType(SCType scType) { - ClassProxy classProxy = getClassProxy(scType); + ClassProxy classProxy = (ClassProxy) getClassObject(scType); SCType superType = classProxy.getSuperType(); return superType != null ? typeParser.populate(scType, superType) : null; } @Override public List getInterfaceTypes(SCType scType) { - ClassProxy classProxy = getClassProxy(scType); + ClassProxy classProxy = (ClassProxy) getClassObject(scType); List interfaceTypes = new ArrayList<>(); for (SCType interfaceType : classProxy.getInterfaceTypes()) { interfaceTypes.add(typeParser.populate(scType, interfaceType)); @@ -54,41 +57,43 @@ public class AppClassLinker implements ClassLinker { } @Override - public SCType visitField(SCType scType, String fieldName) { - ClassProxy classProxy = getClassProxy(scType); - FieldTree fieldTree = classProxy.getField(fieldName); + public SCType visitField(SCType scType, AccessRule accessRule, String fieldName) { + ClassProxy classProxy = (ClassProxy) getClassObject(scType); + FieldTree fieldTree = classProxy.getField(accessRule, fieldName); if (fieldTree != null) { - if (fieldTree.getAccessState() == AccessState.NOT_VISITED) { - VisitContext visitContext = VisitContext.builder() + if (fieldTree.getVisitState() == VisitState.NOT_VISITED) { + ParseClassContext parseClassContext = ParseClassContext.builder() .classProxy(classProxy) .fieldTree(fieldTree) .variables(new Stack<>()) .build(); - visitContext.getVariables().add(new ArrayList<>()); - classVisitor.visitFieldTree(visitContext, fieldTree); + parseClassContext.getVariables().add(new ArrayList<>()); + compilationVisitor.visitFieldTree(parseClassContext, fieldTree); } + Assert.notNull(fieldTree.getFieldType(), "The type of field cannot be null!"); return typeParser.populate(scType, fieldTree.getFieldType()); } return null; } @Override - public SCType visitMethod(SCType scType, String methodName, List parameterTypes) { - ClassProxy classProxy = getClassProxy(scType); - List methodTrees = classProxy.getMethod(methodName); + public SCType visitMethod(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { + ClassProxy classProxy = (ClassProxy) getClassObject(scType); + List methodTrees = classProxy.getMethod(accessRule, methodName); if (methodTrees != null) { MethodResult methodResult = methodMatcher.matchMethod(scType, methodTrees, parameterTypes); if (methodResult != null) { MethodTree methodTree = methodResult.getMethodTree(); - if (methodTree.getAccessState() == AccessState.NOT_VISITED) { - VisitContext visitContext = VisitContext.builder() + if (methodTree.getVisitState() == VisitState.NOT_VISITED) { + ParseClassContext parseClassContext = ParseClassContext.builder() .classProxy(classProxy) .methodTree(methodTree) .variables(new Stack<>()) .build(); - visitContext.getVariables().add(new ArrayList<>()); - classVisitor.visitMethodTree(visitContext, methodTree); + parseClassContext.getVariables().add(new ArrayList<>()); + compilationVisitor.visitMethodTree(parseClassContext, methodTree); } + Assert.notNull(methodTree.getReturnType(), "The return type of method cannot be null!"); return typeParser.populate(scType, methodTree.getReturnType()); } } @@ -96,9 +101,9 @@ public class AppClassLinker implements ClassLinker { } @Override - public List getParameterTypes(SCType scType, String methodName, List parameterTypes) { - ClassProxy classProxy = getClassProxy(scType); - List methodTrees = classProxy.getMethod(methodName); + public List getParameterTypes(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { + ClassProxy classProxy = (ClassProxy) getClassObject(scType); + List methodTrees = classProxy.getMethod(accessRule, methodName); if (methodTrees != null) { MethodResult methodResult = methodMatcher.matchMethod(scType, methodTrees, parameterTypes); if (methodResult != null) { diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/ArrayClassLinker.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/ArrayCompilationLinker.java similarity index 52% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/ArrayClassLinker.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/ArrayCompilationLinker.java index f8c4916a7b323a37dd9118ed8c0104795d75ee17..ee7a366ae16e33ac31fc0be1d7f66bbabd4043bf 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/ArrayClassLinker.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/ArrayCompilationLinker.java @@ -1,15 +1,21 @@ package com.gitee.spirit.core3.visitor.linker; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.visitor.api.ClassLinker; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; +import com.gitee.spirit.core3.visitor.api.CompilationLinker; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component -public class ArrayClassLinker implements ClassLinker { +public class ArrayCompilationLinker implements CompilationLinker { + + @Override + public Object getClassObject(SCType scType) { + return null; + } @Override public int getTypeVariableIndex(SCType type, String genericName) { @@ -18,7 +24,7 @@ public class ArrayClassLinker implements ClassLinker { @Override public SCType getSuperType(SCType type) { - return BasicTypes.OBJECT; + return CommonTypes.OBJECT; } @Override @@ -27,20 +33,18 @@ public class ArrayClassLinker implements ClassLinker { } @Override - public SCType visitField(SCType type, String fieldName) { - if ("length".equals(fieldName)) { - return BasicTypes.INT; - } + public SCType visitField(SCType type, AccessRule accessRule, String fieldName) { + if ("length".equals(fieldName)) return CommonTypes.INT; throw new RuntimeException("The array type has no other fields!"); } @Override - public SCType visitMethod(SCType type, String methodName, List parameterTypes) { + public SCType visitMethod(SCType type, AccessRule accessRule, String methodName, List parameterTypes) { throw new RuntimeException("The array type has no method!"); } @Override - public List getParameterTypes(SCType type, String methodName, List parameterTypes) { + public List getParameterTypes(SCType type, AccessRule accessRule, String methodName, List parameterTypes) { throw new RuntimeException("The array type has no method!"); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/PrimitiveClassLinker.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/PrimitiveCompilationLinker.java similarity index 57% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/PrimitiveClassLinker.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/PrimitiveCompilationLinker.java index f0d1400e7d98b45ca145e7372600cff1f3c879d1..49af4bc67fcae3ff242db79dd8e658693d3ae175 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/PrimitiveClassLinker.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/linker/PrimitiveCompilationLinker.java @@ -1,10 +1,11 @@ package com.gitee.spirit.core3.visitor.linker; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.visitor.api.ClassLinker; +import com.gitee.spirit.core3.visitor.api.CompilationLinker; import com.gitee.spirit.core3.visitor.api.TypeFactory; import com.gitee.spirit.core3.visitor.api.TypeParser; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -12,13 +13,18 @@ import java.util.ArrayList; import java.util.List; @Component -public class PrimitiveClassLinker implements ClassLinker { +public class PrimitiveCompilationLinker implements CompilationLinker { @Autowired private TypeFactory typeFactory; @Autowired private TypeParser typeParser; + @Override + public Object getClassObject(SCType scType) { + return null; + } + @Override public int getTypeVariableIndex(SCType scType, String genericName) { throw new RuntimeException("This method is not supported!"); @@ -35,21 +41,21 @@ public class PrimitiveClassLinker implements ClassLinker { } @Override - public SCType visitField(SCType scType, String fieldName) { + public SCType visitField(SCType scType, AccessRule accessRule, String fieldName) { if ("class".equals(fieldName)) { - return typeFactory.newType(BasicTypes.CLASS.getClassName(), typeParser.toBox(scType)); + return typeFactory.newType(CommonTypes.CLASS.getClassName(), typeParser.toBox(scType)); } throw new RuntimeException("The primitive type has no other fields!"); } @Override - public SCType visitMethod(SCType scType, String methodName, List parameterTypes) { + public SCType visitMethod(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { throw new RuntimeException("The primitive type has no method!"); } @Override - public List getParameterTypes(SCType scType, String methodName, List parameterTypes) { - throw new RuntimeException("The array type has no method!"); + public List getParameterTypes(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { + throw new RuntimeException("The primitive type has no method!"); } } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AdaptiveImportSelector.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AdaptiveCompilationSelector.java similarity index 58% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AdaptiveImportSelector.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AdaptiveCompilationSelector.java index 5e84d53be66ad1ed99ad272d04868dc6df788c3f..26c7177bdcb81379984f102cc2db7c6441b96bb0 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AdaptiveImportSelector.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AdaptiveCompilationSelector.java @@ -1,101 +1,104 @@ package com.gitee.spirit.core3.visitor.selector; import cn.hutool.core.lang.Assert; -import com.gitee.spirit.common.enums.PrimitiveEnum; import com.gitee.spirit.common.utils.Collectors; import com.gitee.spirit.common.utils.PrimitiveUtils; import com.gitee.spirit.common.utils.TypeUtils; import com.gitee.spirit.core3.compile.api.CharsParser; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.tree.CompilationTreeMaker; -import com.gitee.spirit.core3.tree.entity.CompilationTree; -import com.gitee.spirit.core3.tree.entity.ImportTree; -import com.gitee.spirit.core3.tree.entity.StatementTree; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; +import com.gitee.spirit.core3.tree.entity.clazz.ImportTree; +import com.gitee.spirit.core3.tree.entity.ElementTree; import com.gitee.spirit.core3.visitor.api.ClassProxy; import com.gitee.spirit.core3.visitor.api.CompilationFactory; -import com.gitee.spirit.core3.visitor.api.ImportSelector; +import com.gitee.spirit.core3.visitor.api.CompilationVisitor; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.Stack; + @Primary @Component -public class AdaptiveImportSelector implements ImportSelector { +public class AdaptiveCompilationSelector implements CompilationSelector { @Autowired private CompilationFactory compilationFactory; @Autowired - private AppImportSelector appImportSelector; + private AppCompilationSelector appCompilationSelector; @Autowired - @Qualifier("extImportSelector") - private ImportSelector extImportSelector; + @Qualifier("extCompilationSelector") + private CompilationSelector extCompilationSelector; @Autowired private CharsParser charsParser; @Autowired private CompilationTreeMaker compilationTreeMaker; + @Autowired + private CompilationVisitor compilationVisitor; @Override public String findClassName(ClassProxy classProxy, String simpleName) { - // 不能是className Assert.notContain(simpleName, ".", "Simple name cannot contains \".\""); - // 拆解数组 + String targetName = TypeUtils.getTargetName(simpleName); boolean isArray = TypeUtils.isArray(simpleName); - // 1.原始类型 + + // 原始类型 String className = PrimitiveUtils.findClassName(targetName); - // 2.指定引入的复杂类型 + + // 引入类型 if (className == null) { ImportTree importTree = classProxy.findImport(targetName); - className = importTree != null ? importTree.getQualifiedName() : null; - } - // 3.从已经加载的类型去找 - if (className == null) { - className = appImportSelector.findClassName(classProxy, targetName); - } - if (className == null) { - className = extImportSelector.findClassName(classProxy, targetName); + if (importTree != null) className = importTree.getQualifiedName(); } + + // 由类型加载器,隐式加载的类型。例如:"java.lang.String" + if (className == null) className = appCompilationSelector.findClassName(classProxy, targetName); + if (className == null) className = extCompilationSelector.findClassName(classProxy, targetName); + Assert.notNull(className, "No import info found!simpleName:[" + simpleName + "]"); return TypeUtils.getClassName(isArray, className); } @Override public boolean addImport(ClassProxy classProxy, String className) { - // 拆解数组 String targetName = TypeUtils.getTargetName(className); String shortName = TypeUtils.getShortName(className); - // 1.原始类型 - if (PrimitiveUtils.isPrimitive(targetName)) { - return true; - } - // 2.如果已经被引入了,不能是别名 + + // 原始类型,视为默认引入 + if (PrimitiveUtils.isPrimitive(targetName)) return true; + + // 判断全名是否已经引入,别名引入,不认为是真正的引入 ImportTree importTree = Collectors.findOne(classProxy.getCompilationTree().getImportTrees().values(), item -> item.getQualifiedName().equals(targetName)); - if (importTree != null) { - return !importTree.isAlias(); - } - // 3.如果没有引入过,则不能和别人的简称冲突 + if (importTree != null) return !importTree.isAlias(); + + // 如果存在短名称一致的,则不能引入 importTree = classProxy.findImport(shortName); - if (importTree != null) { - return false; - } - // 4.相同类型,同个包下的类型,相当于自动引入 - if (classProxy.getClassName().equals(targetName) - || TypeUtils.isSamePackage(classProxy.getClassName(), targetName)) { + if (importTree != null) return false; + + // 类名相同或者在同个包下,视为默认引入 + if (classProxy.getClassName().equals(targetName) || TypeUtils.isSamePackage(classProxy.getClassName(), targetName)) { return true; } - // 5.由选取器决定是否引入 + + // 最后,由类型加载器决定是否真正地引入 boolean flag; if (compilationFactory.contains(targetName)) { - flag = appImportSelector.addImport(classProxy, targetName); + flag = appCompilationSelector.addImport(classProxy, targetName); } else { - flag = extImportSelector.addImport(classProxy, targetName); + flag = extCompilationSelector.addImport(classProxy, targetName); } if (flag) { Element element = (Element) charsParser.parseTokens("import " + targetName); addImportTree(classProxy, element); } + return true; } @@ -110,9 +113,12 @@ public class AdaptiveImportSelector implements ImportSelector { } private void addImportTree(ClassProxy classProxy, Element element) { + ElementTree elementTree = new ElementTree(element); + ImportTree importTree = compilationTreeMaker.importDeclaration(elementTree); + ParseClassContext parseClassContext = ParseClassContext.builder().classProxy(classProxy).variables(new Stack<>()).build(); + parseClassContext.getVariables().add(new ArrayList<>()); + compilationVisitor.visitImportTree(parseClassContext, importTree); CompilationTree compilationTree = classProxy.getCompilationTree(); - StatementTree statementTree = new StatementTree(element); - ImportTree importTree = compilationTreeMaker.importDeclaration(statementTree); compilationTree.getImportTrees().put(importTree.getShortName(), importTree); } diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AppImportSelector.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AppCompilationSelector.java similarity index 85% rename from spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AppImportSelector.java rename to spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AppCompilationSelector.java index bc9e591772dd242e597ba2620e15aac168ef88dd..3ae160b854133b766f335eba107dcabc7835e9d8 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AppImportSelector.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/selector/AppCompilationSelector.java @@ -2,12 +2,12 @@ package com.gitee.spirit.core3.visitor.selector; import com.gitee.spirit.core3.visitor.api.ClassProxy; import com.gitee.spirit.core3.visitor.api.CompilationFactory; -import com.gitee.spirit.core3.visitor.api.ImportSelector; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component -public class AppImportSelector implements ImportSelector { +public class AppCompilationSelector implements CompilationSelector { @Autowired private CompilationFactory compilationFactory; diff --git a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/utils/CompilationTreeUtils.java b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/utils/CompilationTreeUtils.java index 936551ae0fc023cfce2c41d42064a3f5c740cea4..d8c1a216cbd29ae82a35b59a18be7b36ad0a81f1 100644 --- a/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/utils/CompilationTreeUtils.java +++ b/spirit-core3/spirit-core3-visitor/src/main/java/com/gitee/spirit/core3/visitor/utils/CompilationTreeUtils.java @@ -1,7 +1,7 @@ package com.gitee.spirit.core3.visitor.utils; -import com.gitee.spirit.core3.tree.entity.ClassTree; -import com.gitee.spirit.core3.tree.entity.CompilationTree; +import com.gitee.spirit.core3.tree.entity.clazz.ClassTree; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; public class CompilationTreeUtils { diff --git a/spirit-core3/spirit-core3-xcode/pom.xml b/spirit-core3/spirit-core3-xcode/pom.xml index 1896b43db32d8f2452f19098e968bc14eb1a03f1..60bb610662090f793015599ae98aec0e18e36655 100644 --- a/spirit-core3/spirit-core3-xcode/pom.xml +++ b/spirit-core3/spirit-core3-xcode/pom.xml @@ -4,16 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3 3.0.0 spirit-core3-xcode + - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3-visitor ${project.version} + \ No newline at end of file diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/JavaCodeGenerator.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/JavaCodeGenerator.java index e23a7bd97fcb8f7900706a5b430f06ce99454b15..9caefd4ec8f70a23ab0ad78713eb20e8cac74c19 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/JavaCodeGenerator.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/JavaCodeGenerator.java @@ -1,38 +1,50 @@ package com.gitee.spirit.core3.xcode; -import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.core3.compile.ConfigManager; import com.gitee.spirit.common.utils.FileUtils; +import com.gitee.spirit.core3.compile.FileManager; import com.gitee.spirit.core3.compile.api.CodeGenerator; import com.gitee.spirit.core3.compile.entity.CompilationUnit; import com.gitee.spirit.core3.compile.entity.ParseContext; -import com.gitee.spirit.core3.tree.entity.CompilationTree; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; import com.gitee.spirit.core3.xcode.api.CodeBuilder; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import java.util.List; @Component +@Profile("compile") public class JavaCodeGenerator implements CodeGenerator { @Autowired private CodeBuilder codeBuilder; + @Autowired + private FileManager fileManager; @Override public void generateCode(ParseContext parseContext, List compilationUnits) { - String outputPath = ConfigUtils.getOutputPath(); - boolean isDebug = ConfigUtils.isDebug(); + String targetPackage = ConfigManager.getTargetPackage(); for (CompilationUnit compilationUnit : compilationUnits) { CompilationTree compilationTree = (CompilationTree) compilationUnit; - String javaCode = codeBuilder.buildCode(compilationTree); - if (isDebug) System.out.println(javaCode); - if (StringUtils.isNotBlank(outputPath)) { - String relativePath = compilationTree.getClassName().replaceAll("\\.", "/") + ".java"; - FileUtils.generateFile(outputPath, relativePath, javaCode); + if (StringUtils.isNotBlank(targetPackage)) { + String className = compilationTree.getClassName(); + if (className.startsWith(targetPackage)) { + doGenerateCode(compilationTree); + } + } else { + doGenerateCode(compilationTree); } } } + private void doGenerateCode(CompilationTree compilationTree) { + boolean isDebugMode = ConfigManager.isDebugMode(); + String javaCode = codeBuilder.buildCode(compilationTree); + if (isDebugMode) System.out.println(javaCode); + fileManager.generateFile(compilationTree.getClassName(), "java", javaCode); + } + } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/JavaCompileListener.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/JavaCompileListener.java new file mode 100644 index 0000000000000000000000000000000000000000..d82ccc18a70e51c87656ce3c6821cf2ec6a4961a --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/JavaCompileListener.java @@ -0,0 +1,42 @@ +package com.gitee.spirit.core3.xcode; + +import com.gitee.spirit.core3.compile.ConfigManager; +import com.gitee.spirit.core3.compile.CoreCompiler; +import com.gitee.spirit.core3.compile.api.CompileListenerAdapter; +import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.xcode.api.ClassLoader; +import com.gitee.spirit.core3.xcode.utils.ReflectUtils; +import com.google.common.base.Splitter; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Order(-140) +public class JavaCompileListener extends CompileListenerAdapter { + + @Autowired + private ClassLoader classLoader; + + @Override + public void compileStarted(ParseContext parseContext, CoreCompiler coreCompiler) { + String classPathsStr = ConfigManager.getClassPaths(); + java.lang.ClassLoader nativeClassLoader; + if (StringUtils.isNotBlank(classPathsStr)) { + List classPaths = Splitter.on(",").trimResults().splitToList(classPathsStr); + nativeClassLoader = ReflectUtils.getClassLoader(classPaths); + } else { + nativeClassLoader = this.getClass().getClassLoader(); + } + classLoader.loadClassLoader(nativeClassLoader); + } + + @Override + public void compileFinished(ParseContext parseContext, CoreCompiler coreCompiler) { + classLoader.clear(); + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/ClassLoader.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/ClassLoader.java index 1d64aaa2f30577c5dd2512e6f526d97960ca2ec8..dbf0475e41ebcef7a9bcc8ac0faaba8f40fb1b94 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/ClassLoader.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/ClassLoader.java @@ -2,8 +2,12 @@ package com.gitee.spirit.core3.xcode.api; public interface ClassLoader { + void loadClassLoader(java.lang.ClassLoader classLoader); + boolean contains(String className); Class loadClass(String className); + void clear(); + } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/CodeBuilder.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/CodeBuilder.java index 5c32d19cf1e12195bd37cfea5a79c2eca1d80cce..f5d868cbe9af0902c2a44918d3afe03acc30c44d 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/CodeBuilder.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/CodeBuilder.java @@ -1,6 +1,6 @@ package com.gitee.spirit.core3.xcode.api; -import com.gitee.spirit.core3.tree.entity.CompilationTree; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; public interface CodeBuilder { diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/ExtTokenHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/ExtTokenHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..b128db6f5daa164c697149fcde563e4e55902042 --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/ExtTokenHandler.java @@ -0,0 +1,12 @@ +package com.gitee.spirit.core3.xcode.api; + +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; + +public interface ExtTokenHandler { + + boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent); + + void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent); + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/MacroParser.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/MacroParser.java index 7c7755455700c712fdf6864bc472d95a7be71586..01a160c8242ace48adb6522b74d82aa8cd330b31 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/MacroParser.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/api/MacroParser.java @@ -1,14 +1,12 @@ package com.gitee.spirit.core3.xcode.api; -import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; public interface MacroParser { boolean isHandle(String className); - void parseToken(VisitContext visitContext, Element element, Statement statement, Token token); + void parseToken(ParseClassContext parseClassContext, TokenEvent tokenEvent); } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/SeparatorHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/BracketsCompilationHandler.java similarity index 59% rename from spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/SeparatorHandler.java rename to spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/BracketsCompilationHandler.java index aa5effe691fd9d79523de785d5dfad39be4f9ce4..37660954df2430c24fc41b84807e3f377139ceeb 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/SeparatorHandler.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/BracketsCompilationHandler.java @@ -1,23 +1,26 @@ package com.gitee.spirit.core3.xcode.handler; +import com.gitee.spirit.common.enums.token.SeparatorEnum; +import com.gitee.spirit.common.enums.token.TokenType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.common.enums.SeparatorEnum; -import com.gitee.spirit.common.enums.TokenType; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.api.ElementHandler; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.tree.entity.ElementTree; +import com.gitee.spirit.core3.visitor.api.CompilationHandler; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.util.Collections; @Component -@Order(-50) -public class SeparatorHandler implements ElementHandler { +@Order(-100) +public class BracketsCompilationHandler implements CompilationHandler { @Override - public void visitElement(VisitContext visitContext, Element element) { + public void handleElementTree(ParseClassContext parseClassContext, ElementTree elementTree) { + if (parseClassContext.getMethodTree() == null) return; + Element element = elementTree.getElement(); if (element.isIf() || element.isElseIf() || element.isWhile() @@ -25,27 +28,13 @@ public class SeparatorHandler implements ElementHandler { || element.isSync()) { insertBrackets(element); } - if (element.isDeclare() - || element.isDeclareAssign() - || element.isAssign() - || element.isFieldAssign() - || element.isInvoke() - || element.isReturn() - || element.isSuper() - || element.isThis() - || element.isThrow() - || element.isContinue() - || element.isBreak()) { - appendSemi(element); - } } private void insertBrackets(Statement statement) { int keywordIndex = findLastKeyword(statement); int fromIndex = keywordIndex >= 0 ? keywordIndex + 1 : -1; Token lastToken = statement.get(statement.size() - 1); - int toIndex = lastToken.getTokenType() == SeparatorEnum.LBRACE ? - statement.size() - 1 : statement.size(); + int toIndex = lastToken.getTokenType() == SeparatorEnum.LBRACE ? statement.size() - 1 : statement.size(); if (toIndex != -1) { Statement subStatement = statement.subStmt(fromIndex, toIndex); subStatement.add(0, new Token(SeparatorEnum.LPAREN, "(", null)); @@ -68,12 +57,4 @@ public class SeparatorHandler implements ElementHandler { return -1; } - private void appendSemi(Element element) { - Token lastToken = element.get(element.size() - 1); - if (lastToken.getTokenType() != SeparatorEnum.LBRACE - && lastToken.getTokenType() != SeparatorEnum.SEMI) { - element.add(new Token(SeparatorEnum.SEMI, ";", null)); - } - } - } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/CommonHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/CommonHandler.java deleted file mode 100644 index 518096e0fa5278a930cc38e59ea2f085ccaa75b1..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/CommonHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.gitee.spirit.core3.xcode.handler; - -import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.common.enums.SeparatorEnum; -import com.gitee.spirit.common.enums.TokenType; -import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.api.ElementHandler; -import com.gitee.spirit.core3.visitor.api.ImportSelector; -import com.gitee.spirit.core3.visitor.entity.VisitContext; -import com.gitee.spirit.stdlib.Lists; -import com.gitee.spirit.stdlib.Maps; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -@Component -@Order(-80) -public class CommonHandler implements ElementHandler { - - @Autowired - private ImportSelector importSelector; - - @Override - public void visitElement(VisitContext visitContext, Element element) { - visitStatement(visitContext, element); - } - - private void visitStatement(VisitContext visitContext, Statement statement) { - for (Token token : statement) { - if (token.isVisitStmt()) { - visitStatement(visitContext, (Statement) token.getValue()); - } - if (token.isAnyInit()) {// String[10] => new String[10] // User() => new User() - Statement subStatement = (Statement) token.getValue(); - subStatement.add(0, new Token(KeywordEnum.NEW, "new", null)); - - } else if (token.isList()) {// ["value"] => Lists.of("value"); - Statement subStatement = (Statement) token.getValue(); - subStatement.set(0, new Token(TokenType.CustomEnum.CUSTOM_PREFIX, "Lists.of(", null)); - subStatement.set(subStatement.size() - 1, new Token(TokenType.CustomEnum.CUSTOM_SUFFIX, ")", null)); - importSelector.addImport(visitContext.getClassProxy(), Lists.class.getName()); - - } else if (token.isMap()) {// {"key":"value"} => Maps.of("key","value"); - Statement subStatement = (Statement) token.getValue(); - for (Token subToken : subStatement) { - if (subToken.getTokenType() == SeparatorEnum.COLON) { - subToken.setValue(","); - } - } - subStatement.set(0, new Token(TokenType.CustomEnum.CUSTOM_PREFIX, "Maps.of(", null)); - subStatement.set(subStatement.size() - 1, new Token(TokenType.CustomEnum.CUSTOM_SUFFIX, ")", null)); - importSelector.addImport(visitContext.getClassProxy(), Maps.class.getName()); - } - } - } - -} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/EmptyHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/EmptyHandler.java deleted file mode 100644 index c00b3a9aa502d98b8b58091cb54b769abf398677..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/EmptyHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gitee.spirit.core3.xcode.handler; - -import com.gitee.spirit.common.constants.Attachment; -import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.api.ElementHandler; -import com.gitee.spirit.core3.visitor.api.ImportSelector; -import com.gitee.spirit.core3.visitor.entity.VisitContext; -import com.gitee.spirit.stdlib.Emptys; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -@Component -@Order(-90) -public class EmptyHandler implements ElementHandler { - - @Autowired - private ImportSelector importSelector; - - @Override - public void visitElement(VisitContext visitContext, Element element) { - visitStatement(visitContext, element); - } - - private void visitStatement(VisitContext visitContext, Statement statement) { - for (Token token : statement) { - if (token.isVisitStmt()) { - visitStatement(visitContext, (Statement) token.getValue()); - } - if (token.isLocalMethod()) { - String methodName = (String) token.getAttachment().get(Attachment.MEMBER_NAME); - if ("empty".equals(methodName)) { - importSelector.addStaticImport(visitContext.getClassProxy(), Emptys.class.getName() + ".empty"); - } - } - } - } - -} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/SemiCompilationHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/SemiCompilationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..f9e423320c4c0aa36cea6073259d787352aa08fb --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/SemiCompilationHandler.java @@ -0,0 +1,42 @@ +package com.gitee.spirit.core3.xcode.handler; + +import com.gitee.spirit.common.enums.token.SeparatorEnum; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.tree.entity.ElementTree; +import com.gitee.spirit.core3.visitor.api.CompilationHandler; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(-80) +public class SemiCompilationHandler implements CompilationHandler { + + @Override + public void handleElementTree(ParseClassContext parseClassContext, ElementTree elementTree) { + Element element = elementTree.getElement(); + if (element.isPackage() + || element.isImport() + || element.isDeclareFunc() + || element.isFieldDeclare() + || element.isFieldAssign() + || element.isInvoke() + || element.isReturn() + || element.isSuper() + || element.isThis() + || element.isThrow() + || element.isContinue() + || element.isBreak()) { + appendSemi(element); + } + } + + private void appendSemi(Element element) { + Token lastToken = element.get(element.size() - 1); + if (lastToken.getTokenType() != SeparatorEnum.LBRACE && lastToken.getTokenType() != SeparatorEnum.SEMI) { + element.add(new Token(SeparatorEnum.SEMI, ";", null)); + } + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/StatementHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/StatementHandler.java deleted file mode 100644 index 458318a450b895be447a14bfe2a5cd5cad55a764..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/StatementHandler.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.gitee.spirit.core3.xcode.handler; - -import com.gitee.spirit.common.constants.Attachment; -import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.common.enums.ModifierEnum; -import com.gitee.spirit.common.enums.TokenType; -import com.gitee.spirit.common.utils.Collectors; -import com.gitee.spirit.common.utils.ConfigUtils; -import com.gitee.spirit.core3.compile.api.CharsParser; -import com.gitee.spirit.core3.compile.api.TokenParser; -import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.tree.CompilationTreeMaker; -import com.gitee.spirit.core3.tree.entity.*; -import com.gitee.spirit.core3.visitor.api.*; -import com.gitee.spirit.core3.visitor.entity.VisitContext; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -@Component -@Order(-60) -public class StatementHandler implements ElementHandler { - - @Autowired - private StatementParser statementParser; - @Autowired - private TypeParser typeParser; - @Autowired - private CharsParser charsParser; - @Autowired - private TokenParser tokenParser; - @Autowired - private CompilationTreeMaker compilationTreeMaker; - @Autowired - private ImportSelector importSelector; - - @Override - public void visitElement(VisitContext visitContext, Element element) { - - if (element.isDeclare() || element.isDeclareAssign() || element.isAssign()) { - element.replaceModifier(ModifierEnum.CONST, ModifierEnum.FINAL); - } - - if (element.isSync()) { // sync s { - element.replaceToken(token -> token.getTokenType() == KeywordEnum.SYNC, - new Token(KeywordEnum.SYNCHRONIZED, KeywordEnum.SYNCHRONIZED.value, null)); - - } else if (element.isFor()) {// for (i=0; i<100; i++) { - Token secondToken = element.get(1); - if (secondToken.isSubexpression()) { - Statement statement = (Statement) secondToken.getValue(); - Token token = statement.get(1); - if (!token.isAnyType() && token.isVariable()) { - boolean derived = (boolean) token.getAttachment().getOrDefault(Attachment.DERIVED, false); - if (derived) { - SCType scType = (SCType) token.getAttachment().get(Attachment.TYPE); - Token typeToken = typeParser.toToken(visitContext.getClassProxy(), scType); - statement.add(1, typeToken); - } - } - } - - } else if (element.isForIn()) {// for item in list { - Token item = element.get(1); - SCType scType = (SCType) item.getAttachment().get(Attachment.TYPE); - Statement statement = element.subStmt(3, element.size() - 1); - String qualifiedName = typeParser.getQualifiedName(visitContext.getClassProxy(), scType); - String text = String.format("for (%s %s : %s) {", qualifiedName, item, statement); - element.replaceTokens(0, element.size(), - Collections.singletonList(new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, text, null))); - - } else if (element.isAssign()) {// var = list.get(0) - Token token = element.get(0); - boolean derived = (boolean) token.getAttachment().getOrDefault(Attachment.DERIVED, false); - SCType scType = (SCType) token.getAttachment().get(Attachment.TYPE); - if (token.isIdentifier() && derived) { - Token typeToken = typeParser.toToken(visitContext.getClassProxy(), scType); - element.add(0, typeToken); - } - - } else if (element.isIf() || element.isWhile()) {// if s { // while s { - Statement statement = element.subStmt(1, element.size() - 1); - SCType scType = statementParser.parseType(statement); - if (String.class.getName().equals(scType.getClassName())) { - String text = String.format("StringUtils.isNotEmpty(%s)", statement); - element.replaceTokens(1, element.size() - 1, - Collections.singletonList(new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, text, null))); - } - - } else if (element.isPrint() || element.isDebug() || element.isError()) { - String methodName = null; - if (element.isPrint()) { - methodName = "info"; - } else if (element.isDebug()) { - methodName = "debug"; - } else if (element.isError()) { - methodName = "error"; - } - element.set(0, new Token(TokenType.CustomEnum.CUSTOM_PREFIX, "log." + methodName + "(", null)); - element.add(new Token(TokenType.CustomEnum.CUSTOM_SUFFIX, ");", null)); - - ClassProxy classProxy = visitContext.getClassProxy(); - if (ConfigUtils.isUseLombok()) { //是否使用lombok - ClassTree classTree = classProxy.getClassTree(); - List annotationTrees = classTree.getAnnotationTrees(); - AnnotationTree annotationTree = Collectors.findOne(annotationTrees, item -> { - Token token = item.getToken(); - String simpleName = (String) token.getAttachment().get(Attachment.SIMPLE_NAME); - return "Slf4j".equals(simpleName); - }); - if (annotationTree == null) { - importSelector.addImport(classProxy, Slf4j.class.getName()); - Token token = tokenParser.parseToken("@" + Slf4j.class.getSimpleName()); - classTree.getAnnotationTrees().add(0, new AnnotationTree(token)); - } - - } else if (classProxy.getField("log") == null) { - importSelector.addImport(classProxy, Logger.class.getName()); - importSelector.addImport(classProxy, LoggerFactory.class.getName()); - // add fieldTree - String line = "Logger log = LoggerFactory.getLogger(" + classProxy.getSimpleName() + ".class)"; - Element loggerElement = (Element) charsParser.parseTokens(line); - loggerElement.addModifiers(ModifierEnum.PUBLIC, ModifierEnum.STATIC, ModifierEnum.FINAL); - StatementTree statementTree = new StatementTree(loggerElement); - FieldTree fieldTree = compilationTreeMaker.fieldDeclaration(new ArrayList<>(), statementTree); - CompilationTree compilationTree = visitContext.getClassProxy().getCompilationTree(); - compilationTree.getFieldTrees().put(fieldTree.getFieldName(), fieldTree); - } - } - } - -} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/StringEqualsHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/StringEqualsHandler.java deleted file mode 100644 index 6c6a7936b0e5a4371c1787edee43668148067c9c..0000000000000000000000000000000000000000 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/StringEqualsHandler.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.gitee.spirit.core3.xcode.handler; - -import com.gitee.spirit.common.constants.Attachment; -import com.gitee.spirit.common.enums.TokenType; -import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.element.entity.TreeNode; -import com.gitee.spirit.core3.visitor.api.ElementHandler; -import com.gitee.spirit.core3.visitor.api.ImportSelector; -import com.gitee.spirit.core3.visitor.api.StatementParser; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; -import com.gitee.spirit.core3.visitor.entity.VisitContext; -import com.gitee.spirit.core3.xcode.utils.TreeUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -@Component -@Order(-70) -public class StringEqualsHandler implements ElementHandler { - - @Autowired - private StatementParser statementParser; - @Autowired - private ImportSelector importSelector; - - @Override - public void visitElement(VisitContext visitContext, Element element) { - if (element.getTreeNodes() != null) { - markTreeId(element.getTreeNodes()); - visitStatement(visitContext, element); - } - } - - private void markTreeId(List treeNodes) { - for (int index = 0; index < treeNodes.size(); index++) { - TreeNode treeNode = treeNodes.get(index); - markTreeId(String.valueOf(index), treeNode); - } - } - - @SuppressWarnings("unchecked") - private void markTreeId(String treeId, TreeNode treeNode) { - Token token = treeNode.getToken(); - token.getAttachment().put(Attachment.TREE_ID, treeId); - if (treeNode.getPrev() != null) { - markTreeId(treeId + "-" + "0", treeNode.getPrev()); - } - if (treeNode.getNext() != null) { - markTreeId(treeId + "-" + "1", treeNode.getNext()); - } - Object value = token.getValue(); - if (!(value instanceof Statement) && value instanceof List) { - markTreeId((List) token.getValue()); - } - } - - private void visitStatement(VisitContext visitContext, Statement statement) { - for (Token token : statement) { - if (token.isVisitStmt()) { - visitStatement(visitContext, (Statement) token.getValue()); - } - } - doVisitStatement(visitContext, statement); - } - - private void doVisitStatement(VisitContext visitContext, Statement statement) { - for (int index = 0; index < statement.size(); index++) { - Token token = statement.get(index); - if (token.isEquals() || token.isUnequals()) { - int fromIndex = TreeUtils.findStart(statement, index); - Statement prevStatement = statement.subStmt(fromIndex, index); - SCType prevType = statementParser.parseType(prevStatement); - if (!BasicTypes.STRING.equals(prevType)) { - continue; - } - int toIndex = TreeUtils.findEnd(statement, index); - Statement nextStatement = statement.subStmt(index + 1, toIndex); - SCType nextType = statementParser.parseType(nextStatement); - if (BasicTypes.STRING.equals(nextType)) { - String format = token.isEquals() ? "StringUtils.equals(%s, %s)" : "!StringUtils.equals(%s, %s)"; - String text = String.format(format, prevStatement, nextStatement); - Token expressionToken = new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, text, new HashMap<>()); - expressionToken.getAttachment().put(Attachment.TYPE, BasicTypes.BOOLEAN); - statement.replaceTokens(fromIndex, toIndex, Collections.singletonList(expressionToken)); - importSelector.addImport(visitContext.getClassProxy(), StringUtils.class.getName()); - } - } - } - } - -} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/CommonElementHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/CommonElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..7a632e6ea73c1d00b31fd490dbe929d72e2e0775 --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/CommonElementHandler.java @@ -0,0 +1,46 @@ +package com.gitee.spirit.core3.xcode.handler.element; + +import com.gitee.spirit.common.enums.token.KeywordEnum; +import com.gitee.spirit.common.enums.token.ModifierEnum; +import com.gitee.spirit.common.enums.token.TokenType; +import com.gitee.spirit.core3.compile.entity.SCType; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.visitor.api.ElementHandler; +import com.gitee.spirit.core3.visitor.api.StatementParser; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.Collections; + +@Component +@Order(-60) +public class CommonElementHandler implements ElementHandler { + + @Autowired + private StatementParser statementParser; + + @Override + public void handleElement(ParseClassContext parseClassContext, Element element) { + if (element.isFieldDeclare()) { + element.replaceModifier(ModifierEnum.CONST, ModifierEnum.FINAL); + + } else if (element.isSync()) { // sync var { + element.replaceToken(token -> token.getTokenType() == KeywordEnum.SYNC, + new Token(KeywordEnum.SYNCHRONIZED, KeywordEnum.SYNCHRONIZED.value, null)); + + } else if (element.isIf() || element.isWhile()) { // if var { // while var { + Statement statement = element.subStmt(1, element.size() - 1); + SCType statementType = statementParser.parseStmtType(statement); + if (String.class.getName().equals(statementType.getClassName())) { + String expression = String.format("StringUtils.isNotEmpty(%s)", statement); + element.replaceTokens(1, element.size() - 1, + Collections.singletonList(new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, expression, null))); + } + } + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/ExtExpressionElementHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/ExtExpressionElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..9e2c9d03d00fdb31ab7d26829c16310dd85ee5c7 --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/ExtExpressionElementHandler.java @@ -0,0 +1,62 @@ +package com.gitee.spirit.core3.xcode.handler.element; + +import com.gitee.spirit.common.constants.Attachment; +import com.gitee.spirit.common.enums.token.TokenType; +import com.gitee.spirit.core3.compile.entity.SCType; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.visitor.api.ElementHandler; +import com.gitee.spirit.core3.visitor.api.TypeParser; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.Collections; + +@Component +@Order(-80) +public class ExtExpressionElementHandler implements ElementHandler { + + @Autowired + private TypeParser typeParser; + + @Override + public void handleElement(ParseClassContext parseClassContext, Element element) { + if (element.isAssign()) { // var = "string" // CONST_VAR = "string" + Token varToken = element.get(0); + SCType varType = (SCType) varToken.getAttachment().get(Attachment.TYPE); + boolean derived = (boolean) varToken.getAttachment().getOrDefault(Attachment.DERIVED, false); + if (varToken.isIdentifier() && derived) { // VARIABLE // CONSTANT + Token typeToken = typeParser.toToken(parseClassContext.getClassProxy(), varType); + element.add(0, typeToken); + } + + } else if (element.isForIn()) { // for item in list { + Token itemToken = element.get(1); + SCType itemType = (SCType) itemToken.getAttachment().get(Attachment.TYPE); + String qualifiedName = typeParser.getQualifiedName(parseClassContext.getClassProxy(), itemType); + Statement statement = element.subStmt(3, element.size() - 1); + String expression = String.format("for (%s %s : %s) {", qualifiedName, itemToken, statement); + element.replaceTokens(0, element.size(), + Collections.singletonList(new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, expression, null))); + + } else if (element.isFor()) { // for (i=0; i<100; i++) { + Token secondToken = element.get(1); + if (secondToken.isSubexpression()) { + Statement statement = (Statement) secondToken.getValue(); + Token token = statement.get(1); + if (!token.isAnyType() && token.isVariable()) { + boolean derived = (boolean) token.getAttachment().getOrDefault(Attachment.DERIVED, false); + if (derived) { + SCType varType = (SCType) token.getAttachment().get(Attachment.TYPE); + Token typeToken = typeParser.toToken(parseClassContext.getClassProxy(), varType); + statement.add(1, typeToken); + } + } + } + } + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/LogPrintElementHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/LogPrintElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..454d44590c97589c15db4ec44ad948dadc407fce --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/LogPrintElementHandler.java @@ -0,0 +1,102 @@ +package com.gitee.spirit.core3.xcode.handler.element; + +import com.gitee.spirit.common.enums.token.ModifierEnum; +import com.gitee.spirit.common.enums.token.TokenType; +import com.gitee.spirit.core3.compile.ConfigManager; +import com.gitee.spirit.core3.compile.api.CharsParser; +import com.gitee.spirit.core3.compile.api.TokenParser; +import com.gitee.spirit.core3.compile.entity.AccessRule; +import com.gitee.spirit.core3.compile.entity.SCType; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.tree.CompilationTreeMaker; +import com.gitee.spirit.core3.tree.entity.ElementTree; +import com.gitee.spirit.core3.tree.entity.clazz.AnnotationTree; +import com.gitee.spirit.core3.tree.entity.clazz.ClassTree; +import com.gitee.spirit.core3.tree.entity.clazz.CompilationTree; +import com.gitee.spirit.core3.tree.entity.clazz.FieldTree; +import com.gitee.spirit.core3.visitor.api.ClassProxy; +import com.gitee.spirit.core3.visitor.api.ElementHandler; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.api.TypeFactory; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; + +@Component +@Order(-40) +public class LogPrintElementHandler implements ElementHandler { + + @Autowired + private TypeFactory typeFactory; + @Autowired + private CharsParser charsParser; + @Autowired + private TokenParser tokenParser; + @Autowired + private CompilationTreeMaker compilationTreeMaker; + @Autowired + private CompilationSelector compilationSelector; + + @Override + public void handleElement(ParseClassContext parseClassContext, Element element) { + if (element.isPrint() || element.isDebug() || element.isError()) { + String methodName = null; + if (element.isPrint()) { + methodName = "info"; + } else if (element.isDebug()) { + methodName = "debug"; + } else if (element.isError()) { + methodName = "error"; + } + element.set(0, new Token(TokenType.CustomEnum.CUSTOM_PREFIX, "log." + methodName + "(", null)); + element.add(new Token(TokenType.CustomEnum.CUSTOM_SUFFIX, ");", null)); + + if (ConfigManager.isUseLombok()) { + addSlf4jAnnotationToClass(parseClassContext); + } else { + addStaticFieldToClass(parseClassContext); + } + } + } + + private void addSlf4jAnnotationToClass(ParseClassContext parseClassContext) { + ClassProxy classProxy = parseClassContext.getClassProxy(); + String className = Slf4j.class.getName(); + String simpleName = Slf4j.class.getSimpleName(); + if (classProxy.isAnnotated(className)) return; + compilationSelector.addImport(classProxy, className); + Token annotationToken = tokenParser.parseToken("@" + simpleName); + SCType annotationType = typeFactory.newType(classProxy, annotationToken); + AnnotationTree annotationTree = new AnnotationTree(annotationToken, annotationType); + ClassTree classTree = classProxy.getClassTree(); + classTree.getAnnotationTrees().add(0, annotationTree); + } + + private void addStaticFieldToClass(ParseClassContext parseClassContext) { + ClassProxy classProxy = parseClassContext.getClassProxy(); + AccessRule accessRule = new AccessRule(false, AccessRule.EVEN_PRIVATE); + if (classProxy.getField(accessRule, "log") != null) return; + // 添加依赖 + compilationSelector.addImport(classProxy, Logger.class.getName()); + compilationSelector.addImport(classProxy, LoggerFactory.class.getName()); + // 将表达式转换成语句 + String expression = "Logger log = LoggerFactory.getLogger(" + classProxy.getSimpleName() + ".class)"; + Element loggerElement = (Element) charsParser.parseTokens(expression); + // 添加修饰符 + loggerElement.addModifiers(ModifierEnum.PUBLIC, ModifierEnum.STATIC, ModifierEnum.FINAL); + // 将语句转换成字段体 + ElementTree elementTree = new ElementTree(loggerElement); + FieldTree fieldTree = compilationTreeMaker.fieldDeclaration(new ArrayList<>(), elementTree); + // 添加字段体到编译体 + CompilationTree compilationTree = classProxy.getCompilationTree(); + compilationTree.getFieldTrees().put(fieldTree.getFieldName(), fieldTree); + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/SecondPhaseElementHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/SecondPhaseElementHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..4fef55960090e2dd415ad4f0e590a3f3be6cd47b --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/element/SecondPhaseElementHandler.java @@ -0,0 +1,47 @@ +package com.gitee.spirit.core3.xcode.handler.element; + +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.visitor.api.ElementHandler; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import com.gitee.spirit.core3.xcode.api.ExtTokenHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +@Component +@Order(-100) +public class SecondPhaseElementHandler implements ElementHandler { + + @Autowired + private List extTokenHandlers; + + @Override + public void handleElement(ParseClassContext parseClassContext, Element element) { + ParseElementContext parseElementContext = new ParseElementContext(parseClassContext, element, new HashMap<>(4)); + handleStatement(parseElementContext, element); + } + + public void handleStatement(ParseElementContext parseElementContext, Statement statement) { + for (int index = 0; index < statement.size(); index++) { + Token token = statement.get(index); + if (token.isVisitStmt()) { + handleStatement(parseElementContext, (Statement) token.getValue()); + } + TokenEvent tokenEvent = new TokenEvent(statement, index, token); + for (ExtTokenHandler extTokenHandler : extTokenHandlers) { + if (extTokenHandler.isHandle(parseElementContext, tokenEvent)) { + extTokenHandler.handleToken(parseElementContext, tokenEvent); + break; + } + } + } + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/BuilderHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/BuilderExtTokenHandler.java similarity index 52% rename from spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/BuilderHandler.java rename to spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/BuilderExtTokenHandler.java index 3d6e07677c7001a329d47225c5155569899ad744..44585478daf854ddf3fe3c0020fd091b6dab0e3e 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/BuilderHandler.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/BuilderExtTokenHandler.java @@ -1,15 +1,16 @@ -package com.gitee.spirit.core3.xcode.handler; +package com.gitee.spirit.core3.xcode.handler.token; import cn.hutool.core.lang.Assert; import com.gitee.spirit.common.constants.Attachment; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.api.ElementHandler; -import com.gitee.spirit.core3.visitor.api.ImportSelector; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import com.gitee.spirit.core3.xcode.api.ExtTokenHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -17,30 +18,29 @@ import org.springframework.stereotype.Component; import java.util.List; @Component -@Order(-100) -public class BuilderHandler implements ElementHandler { +@Order(-60) +public class BuilderExtTokenHandler implements ExtTokenHandler { @Autowired - private ImportSelector importSelector; + private CompilationSelector compilationSelector; @Override - public void visitElement(VisitContext visitContext, Element element) { - visitStatement(visitContext, element); + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); + return token.isTypeBuilder() || token.isTypeSmartBuilder(); } - private void visitStatement(VisitContext visitContext, Statement statement) { - for (Token token : statement) { - if (token.isVisitStmt()) { - visitStatement(visitContext, (Statement) token.getValue()); - } - if (token.isTypeBuilder()) {//User{name="chen",age=18} => User.builder().name("chen").age(18).build() - buildCustomToken(token, (String) token.getAttachment().get(Attachment.SIMPLE_NAME)); + @Override + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + Token token = tokenEvent.getToken(); + if (token.isTypeBuilder()) { // User{name = "chen", age = 18} => User.builder().name("chen").age(18).build() + buildCustomToken(token, (String) token.getAttachment().get(Attachment.SIMPLE_NAME)); - } else if (token.isTypeSmartBuilder()) { - SCType scType = (SCType) token.getAttachment().get(Attachment.TYPE); - importSelector.addImport(visitContext.getClassProxy(), scType.getClassName()); - buildCustomToken(token, scType.getSimpleName()); - } + } else if (token.isTypeSmartBuilder()) { + SCType scType = (SCType) token.getAttachment().get(Attachment.TYPE); + compilationSelector.addImport(parseClassContext.getClassProxy(), scType.getClassName()); + buildCustomToken(token, scType.getSimpleName()); } } @@ -68,4 +68,5 @@ public class BuilderHandler implements ElementHandler { statement.add(new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, builder.toString(), null)); } + } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/CommonExtTokenHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/CommonExtTokenHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..121568d6f7d7d083931f5e43d4a98564e10f85a5 --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/CommonExtTokenHandler.java @@ -0,0 +1,59 @@ +package com.gitee.spirit.core3.xcode.handler.token; + +import com.gitee.spirit.common.enums.token.KeywordEnum; +import com.gitee.spirit.common.enums.token.SeparatorEnum; +import com.gitee.spirit.common.enums.token.TokenType; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import com.gitee.spirit.core3.xcode.api.ExtTokenHandler; +import com.gitee.spirit.stdlib.Lists; +import com.gitee.spirit.stdlib.Maps; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(-100) +public class CommonExtTokenHandler implements ExtTokenHandler { + + @Autowired + private CompilationSelector compilationSelector; + + @Override + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); + return token.isAnyInit() || token.isList() || token.isMap(); + } + + @Override + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + Token token = tokenEvent.getToken(); + if (token.isAnyInit()) { // String[10] => new String[10] // User() => new User() + Statement subStatement = (Statement) token.getValue(); + subStatement.add(0, new Token(KeywordEnum.NEW, "new", null)); + + } else if (token.isList()) { // ["value"] => Lists.of("value"); + Statement subStatement = (Statement) token.getValue(); + subStatement.set(0, new Token(TokenType.CustomEnum.CUSTOM_PREFIX, "Lists.of(", null)); + subStatement.set(subStatement.size() - 1, new Token(TokenType.CustomEnum.CUSTOM_SUFFIX, ")", null)); + compilationSelector.addImport(parseClassContext.getClassProxy(), Lists.class.getName()); + + } else if (token.isMap()) { // {"key":"value"} => Maps.of("key","value"); + Statement subStatement = (Statement) token.getValue(); + for (Token subToken : subStatement) { + if (subToken.getTokenType() == SeparatorEnum.COLON) { + subToken.setValue(","); + } + } + subStatement.set(0, new Token(TokenType.CustomEnum.CUSTOM_PREFIX, "Maps.of(", null)); + subStatement.set(subStatement.size() - 1, new Token(TokenType.CustomEnum.CUSTOM_SUFFIX, ")", null)); + compilationSelector.addImport(parseClassContext.getClassProxy(), Maps.class.getName()); + } + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/EmptyExtTokenHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/EmptyExtTokenHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..7e243d500c3eccaca05eb5ccafde5ff8d5dd36cf --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/EmptyExtTokenHandler.java @@ -0,0 +1,38 @@ +package com.gitee.spirit.core3.xcode.handler.token; + +import com.gitee.spirit.common.constants.Attachment; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import com.gitee.spirit.core3.xcode.api.ExtTokenHandler; +import com.gitee.spirit.stdlib.Emptys; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(-80) +public class EmptyExtTokenHandler implements ExtTokenHandler { + + @Autowired + private CompilationSelector compilationSelector; + + @Override + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); + if (token.isLocalMethod()) { + String methodName = (String) token.getAttachment().get(Attachment.MEMBER_NAME); + return "empty".equals(methodName); + } + return false; + } + + @Override + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + compilationSelector.addStaticImport(parseClassContext.getClassProxy(), Emptys.class.getName() + ".empty"); + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/MacroBuilderHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/MacroBuilderExtTokenHandler.java similarity index 32% rename from spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/MacroBuilderHandler.java rename to spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/MacroBuilderExtTokenHandler.java index 5ce148855cdb6f6d4a788ce8c87041bb92652199..236df446decdd550c13180af7cae3ab604e895e5 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/MacroBuilderHandler.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/MacroBuilderExtTokenHandler.java @@ -1,12 +1,12 @@ -package com.gitee.spirit.core3.xcode.handler; +package com.gitee.spirit.core3.xcode.handler.token; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.compile.entity.Token; -import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.visitor.api.ElementHandler; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import com.gitee.spirit.core3.xcode.api.ExtTokenHandler; import com.gitee.spirit.core3.xcode.api.MacroParser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; @@ -16,28 +16,25 @@ import java.util.List; @Component @Order(-40) -public class MacroBuilderHandler implements ElementHandler { +public class MacroBuilderExtTokenHandler implements ExtTokenHandler { @Autowired public List macroParsers; @Override - public void visitElement(VisitContext visitContext, Element element) { - visitStatement(visitContext, element, element); + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); + return token.isTypeMacroBuilder(); } - private void visitStatement(VisitContext visitContext, Element element, Statement statement) { - for (Token token : statement) { - if (token.isVisitStmt()) { - visitStatement(visitContext, element, (Statement) token.getValue()); - } - if (token.isTypeMacroBuilder()) { - SCType scType = (SCType) token.getAttachment().get(Attachment.TYPE); - for (MacroParser macroParser : macroParsers) { - if (macroParser.isHandle(scType.getClassName())) { - macroParser.parseToken(visitContext, element, statement, token); - } - } + @Override + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + Token token = tokenEvent.getToken(); + SCType scType = (SCType) token.getAttachment().get(Attachment.TYPE); + for (MacroParser macroParser : macroParsers) { + if (macroParser.isHandle(scType.getClassName())) { + macroParser.parseToken(parseClassContext, tokenEvent); } } } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/StringEqualsExtTokenHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/StringEqualsExtTokenHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..381726407318f00c10d9dcaf20c4314846f04bbe --- /dev/null +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/handler/token/StringEqualsExtTokenHandler.java @@ -0,0 +1,79 @@ +package com.gitee.spirit.core3.xcode.handler.token; + +import com.gitee.spirit.common.constants.Attachment; +import com.gitee.spirit.common.enums.token.TokenType; +import com.gitee.spirit.core3.compile.entity.SCType; +import com.gitee.spirit.core3.compile.entity.Token; +import com.gitee.spirit.core3.element.api.TreeNodeDelegate; +import com.gitee.spirit.core3.element.entity.Element; +import com.gitee.spirit.core3.element.entity.Statement; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.api.StatementParser; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; +import com.gitee.spirit.core3.visitor.entity.ParseElementContext; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.xcode.api.ExtTokenHandler; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Component +@Order(-20) +public class StringEqualsExtTokenHandler implements ExtTokenHandler { + + @Autowired + private TreeNodeDelegate treeNodeDelegate; + @Autowired + private StatementParser statementParser; + @Autowired + private CompilationSelector compilationSelector; + + @Override + public boolean isHandle(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); + return token.isEquals() || token.isUnequals(); + } + + @Override + public void handleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + Element element = parseElementContext.getElement(); + Map attachment = parseElementContext.getAttachment(); + Boolean isMarkedTreeId = (Boolean) attachment.getOrDefault(Attachment.MARKED_TREE_ID, false); + if (!isMarkedTreeId && element.getTreeNodes() != null) { + treeNodeDelegate.markTreeId(element.getTreeNodes()); + attachment.put(Attachment.MARKED_TREE_ID, true); + } + doHandleToken(parseElementContext, tokenEvent); + } + + private void doHandleToken(ParseElementContext parseElementContext, TokenEvent tokenEvent) { + ParseClassContext parseClassContext = parseElementContext.getParseClassContext(); + Statement statement = tokenEvent.getStatement(); + int index = tokenEvent.getIndex(); + Token token = tokenEvent.getToken(); + + int fromIndex = treeNodeDelegate.findFromIndex(statement, index); + Statement prevStatement = statement.subStmt(fromIndex, index); + SCType prevType = statementParser.parseStmtType(prevStatement); + if (!CommonTypes.STRING.equals(prevType)) return; + + int toIndex = treeNodeDelegate.findToIndex(statement, index); + Statement nextStatement = statement.subStmt(index + 1, toIndex); + SCType nextType = statementParser.parseStmtType(nextStatement); + if (!CommonTypes.STRING.equals(nextType)) return; + + String format = token.isEquals() ? "StringUtils.equals(%s, %s)" : "!StringUtils.equals(%s, %s)"; + String expression = String.format(format, prevStatement, nextStatement); + Token expressionToken = new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, expression, new HashMap<>()); + expressionToken.getAttachment().put(Attachment.TYPE, CommonTypes.BOOLEAN); + statement.replaceTokens(fromIndex, toIndex, Collections.singletonList(expressionToken)); + compilationSelector.addImport(parseClassContext.getClassProxy(), StringUtils.class.getName()); + } + +} diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/AliasElementPostHandler.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/AliasElementPostHandler.java index cf1423290782aefc203b2e5da0abef929700b3d2..2e7ad8f965a06b4c4f260b7a028186f9c5e082ff 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/AliasElementPostHandler.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/AliasElementPostHandler.java @@ -1,7 +1,7 @@ package com.gitee.spirit.core3.xcode.impl; import com.gitee.spirit.core3.compile.utils.CharUtils; -import com.gitee.spirit.core3.tree.entity.ImportTree; +import com.gitee.spirit.core3.tree.entity.clazz.ImportTree; import com.gitee.spirit.core3.xcode.api.ElementPostHandler; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultClassLoader.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultClassLoader.java index 4cb407a0576154e0f4c1513a952d5418ed785cd2..cab151f61a7f129fd15c863085994a88d893b1c8 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultClassLoader.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultClassLoader.java @@ -1,30 +1,25 @@ package com.gitee.spirit.core3.xcode.impl; -import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.core3.compile.ConfigManager; import com.gitee.spirit.core3.xcode.api.ClassLoader; import com.gitee.spirit.core3.xcode.utils.ReflectUtils; import com.google.common.base.Splitter; +import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; import java.util.List; +@Data @Component -public class DefaultClassLoader implements ClassLoader, InitializingBean { +public class DefaultClassLoader implements ClassLoader { private java.lang.ClassLoader classLoader; @Override - public void afterPropertiesSet() { - String classPathsStr = ConfigUtils.getClassPaths(); - if (StringUtils.isNotBlank(classPathsStr)) { - List classPaths = Splitter.on(",").trimResults().splitToList(classPathsStr); - classLoader = ReflectUtils.getClassLoader(classPaths); - } else { - classLoader = this.getClass().getClassLoader(); - } + public void loadClassLoader(java.lang.ClassLoader classLoader) { + this.classLoader = classLoader; } @Override @@ -45,4 +40,9 @@ public class DefaultClassLoader implements ClassLoader, InitializingBean { } } + @Override + public void clear() { + classLoader = null; + } + } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultCodeBuilder.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultCodeBuilder.java index d2743d3d3a7f7025e4ada5abdf91e2b3f1d1eeee..b1cc9c8aeedf3ac013fc1b64996d7c90532f57e1 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultCodeBuilder.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultCodeBuilder.java @@ -3,6 +3,8 @@ package com.gitee.spirit.core3.xcode.impl; import com.gitee.spirit.common.constants.Constants; import com.gitee.spirit.core3.element.entity.Element; import com.gitee.spirit.core3.tree.entity.*; +import com.gitee.spirit.core3.tree.entity.MergeElementTree; +import com.gitee.spirit.core3.tree.entity.clazz.*; import com.gitee.spirit.core3.xcode.ElementStringBuilder; import com.gitee.spirit.core3.xcode.api.CodeBuilder; import org.springframework.stereotype.Component; @@ -18,14 +20,14 @@ public class DefaultCodeBuilder implements CodeBuilder { @Override public String buildCode(CompilationTree compilationTree) { ElementStringBuilder elementStringBuilder = new ElementStringBuilder(new StringBuilder(), new ArrayList<>()); - elementStringBuilder.append(compilationTree.getPackageTree().getStatementTree().getElement()).append("\n\n"); + elementStringBuilder.append(compilationTree.getPackageTree().getElementTree().getElement()).append("\n\n"); List importTrees = new ArrayList<>(compilationTree.getImportTrees().values()); // sort the import tree importTrees.sort(Comparator.comparing(ImportTree::getQualifiedName)); for (ImportTree importTree : importTrees) { if (!importTree.isAlias()) { - elementStringBuilder.append(importTree.getStatementTree().getElement()).append("\n"); + elementStringBuilder.append(importTree.getElementTree().getElement()).append("\n"); } else { elementStringBuilder.getElementPostHandlers().add(new AliasElementPostHandler(importTree)); } @@ -34,7 +36,7 @@ public class DefaultCodeBuilder implements CodeBuilder { ClassTree classTree = compilationTree.getClassTree(); appendAnnotations(elementStringBuilder, "", classTree.getAnnotationTrees()); - elementStringBuilder.append(classTree.getMergeTree().getElement()).append("\n\n"); + elementStringBuilder.append(classTree.getMergeElementTree().getElement()).append("\n\n"); appendClassContent(elementStringBuilder, compilationTree); elementStringBuilder.append("}\n"); @@ -54,7 +56,7 @@ public class DefaultCodeBuilder implements CodeBuilder { allFieldTrees.addAll(compilationTree.getClassTree().getFieldTrees().values()); for (FieldTree fieldTree : allFieldTrees) { appendAnnotations(elementStringBuilder, Constants.DEFAULT_INDENT, fieldTree.getAnnotationTrees()); - elementStringBuilder.append(Constants.DEFAULT_INDENT).append(fieldTree.getStatementTree().getElement()).append("\n"); + elementStringBuilder.append(Constants.DEFAULT_INDENT).append(fieldTree.getElementTree().getElement()).append("\n"); } if (!allFieldTrees.isEmpty()) elementStringBuilder.append("\n"); // methods @@ -67,23 +69,23 @@ public class DefaultCodeBuilder implements CodeBuilder { } for (MethodTree methodTree : allMethodTrees) { appendAnnotations(elementStringBuilder, Constants.DEFAULT_INDENT, methodTree.getAnnotationTrees()); - Element element = methodTree.getMergeTree().getElement(); + Element element = methodTree.getMergeElementTree().getElement(); if (element.isDefineFunc() || element.isFunc()) { - elementStringBuilder.append(Constants.DEFAULT_INDENT).append(methodTree.getMergeTree().getElement()).append("\n"); - appendMergeTreeContent(elementStringBuilder, methodTree.getMergeTree(), Constants.DEFAULT_DOUBLE_INDENT); + elementStringBuilder.append(Constants.DEFAULT_INDENT).append(methodTree.getMergeElementTree().getElement()).append("\n"); + appendMergeElementTreeContent(elementStringBuilder, methodTree.getMergeElementTree(), Constants.DEFAULT_DOUBLE_INDENT); elementStringBuilder.append(Constants.DEFAULT_INDENT).append("}\n\n"); } else if (element.isDeclareFunc()) { - elementStringBuilder.append(Constants.DEFAULT_INDENT).append(methodTree.getMergeTree().getElement()).append("\n\n"); + elementStringBuilder.append(Constants.DEFAULT_INDENT).append(methodTree.getMergeElementTree().getElement()).append("\n\n"); } } } - private void appendMergeTreeContent(ElementStringBuilder stringBuilder, MergeTree mergeTree, String indent) { - for (StatementTree statementTree : mergeTree.getChildren()) { - stringBuilder.append(indent).append(statementTree.getElement()).append("\n"); - if (statementTree instanceof MergeTree) { - appendMergeTreeContent(stringBuilder, (MergeTree) statementTree, indent + Constants.DEFAULT_INDENT); + private void appendMergeElementTreeContent(ElementStringBuilder stringBuilder, MergeElementTree mergeElementTree, String indent) { + for (ElementTree elementTree : mergeElementTree.getChildren()) { + stringBuilder.append(indent).append(elementTree.getElement()).append("\n"); + if (elementTree instanceof MergeElementTree) { + appendMergeElementTreeContent(stringBuilder, (MergeElementTree) elementTree, indent + Constants.DEFAULT_INDENT); } } } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtMethodMatcher.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtMethodMatcher.java index d87f445948f993aede82bb1d57b505fc42bf491c..c64118ea819ec4a56200b5d2b7022291f4fd231c 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtMethodMatcher.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtMethodMatcher.java @@ -33,14 +33,13 @@ public class DefaultExtMethodMatcher implements ExtMethodMatcher { if (methods.size() == 1) { Method method = methods.get(0); if (checkParameterCount(method, parameterTypes)) { - return populateParameterTypes(scType, method, parameterTypes); + return getMethodResult(scType, method, parameterTypes); } - } else { List methodResults = new ArrayList<>(); for (Method method : methods) { if (checkParameterCount(method, parameterTypes)) { - MethodResult methodResult = populateParameterTypes(scType, method, parameterTypes); + MethodResult methodResult = getMethodResult(scType, method, parameterTypes); if (methodResult != null) methodResults.add(methodResult); } } @@ -58,35 +57,29 @@ public class DefaultExtMethodMatcher implements ExtMethodMatcher { } } - private MethodResult populateParameterTypes(SCType scType, Method method, List parameterTypes) { + private MethodResult getMethodResult(SCType scType, Method method, List parameterTypes) { List nativeParameterTypes = new ArrayList<>(); Map qualifyingTypes = new HashMap<>(); for (int index = 0; index < parameterTypes.size(); index++) { SCType parameterType = parameterTypes.get(index); - //保证索引不会溢出 + // 保证在推导不定项方法时,不会产生数组越界问题 int idx = Math.min(index, method.getParameterCount() - 1); - //分为两种情况,一种是最后一个参数之前的,一种是最后一个参数 Parameter parameter = method.getParameters()[idx]; - //获取本地参数类型 + // 如果最后一个参数是不定项方法参数,则解析出数组内的类型 SCType nativeParameterType = extTypeFactory.newType(parameter.getParameterizedType()); - //如果最后一个参数,而且是不定项参数,则取数组里的类型 if (idx == method.getParameterCount() - 1 && ReflectUtils.isIndefinite(parameter)) { nativeParameterType = typeParser.toTarget(nativeParameterType); } - //从继承关系中,找出适当的类型 + // 向上造型,不然在填充时,就会造成两个类型不一致问题 parameterType = extTypeParser.upcastTo(parameterType, nativeParameterType); - //没有找到对应的,则直接返回 - if (parameterType == null) { - return null; - } - //如果因为限定冲突,则直接返回null + if (parameterType == null) return null; try { nativeParameterType = extTypeParser.populateParameter( scType, parameterType, nativeParameterType, qualifyingTypes); } catch (IllegalArgumentException e) { + // 如果限定类型冲突,则直接返回null return null; } - //添加到待返回的集合中 nativeParameterTypes.add(nativeParameterType); } return new MethodResult(method, nativeParameterTypes, qualifyingTypes); diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeFactory.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeFactory.java index 291d55453f7626a28f3c3a97371ec594cd6ff6fb..a081adbff07943d41d0fa9609c813b93235ed882 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeFactory.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeFactory.java @@ -2,7 +2,7 @@ package com.gitee.spirit.core3.xcode.impl; import com.gitee.spirit.core3.compile.entity.SCType; import com.gitee.spirit.core3.visitor.api.TypeFactory; -import com.gitee.spirit.core3.visitor.constant.BasicTypes; +import com.gitee.spirit.core3.visitor.entity.CommonTypes; import com.gitee.spirit.core3.xcode.api.ExtTypeFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -36,16 +36,16 @@ public class DefaultExtTypeFactory implements ExtTypeFactory { @Override public SCType newType(Type nativeType) { - if (nativeType instanceof Class) {// String + if (nativeType instanceof Class) { // String return newType((Class) nativeType); - } else if (nativeType instanceof WildcardType) {// ? - return BasicTypes.WILDCARD; + } else if (nativeType instanceof WildcardType) { // ? + return CommonTypes.WILDCARD; - } else if (nativeType instanceof TypeVariable) {// T or K + } else if (nativeType instanceof TypeVariable) { // T or K return typeFactory.newTypeVariable(nativeType.toString()); - } else if (nativeType instanceof ParameterizedType) {// List + } else if (nativeType instanceof ParameterizedType) { // List ParameterizedType parameterizedType = (ParameterizedType) nativeType; Class rawType = (Class) parameterizedType.getRawType(); List genericTypes = new ArrayList<>(); diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeParser.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeParser.java index fb2e9e71208e4cac1c99fac48f306c5cb9aa3983..01027877dcc4cfc8d9498b6791f615ab654cecd4 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeParser.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/impl/DefaultExtTypeParser.java @@ -2,7 +2,7 @@ package com.gitee.spirit.core3.xcode.impl; import cn.hutool.core.lang.Assert; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.visitor.api.ClassLinker; +import com.gitee.spirit.core3.visitor.api.CompilationLinker; import com.gitee.spirit.core3.visitor.api.TypeParser; import com.gitee.spirit.core3.tree.utils.TypeBuilder; import com.gitee.spirit.core3.visitor.utils.TypeVisitor; @@ -16,7 +16,7 @@ import java.util.Map; public class DefaultExtTypeParser implements ExtTypeParser { @Autowired - private ClassLinker classLinker; + private CompilationLinker compilationLinker; @Autowired private TypeParser typeParser; @@ -41,12 +41,12 @@ public class DefaultExtTypeParser implements ExtTypeParser { return instanceType; } SCType boxType = typeParser.toBox(instanceType); - SCType superType = classLinker.getSuperType(boxType); + SCType superType = compilationLinker.getSuperType(boxType); superType = upcastTo(superType, targetType); if (superType != null) { return superType; } - for (SCType interfaceType : classLinker.getInterfaceTypes(instanceType)) { + for (SCType interfaceType : compilationLinker.getInterfaceTypes(instanceType)) { interfaceType = upcastTo(interfaceType, targetType); if (interfaceType != null) { return interfaceType; @@ -59,9 +59,9 @@ public class DefaultExtTypeParser implements ExtTypeParser { public SCType populate(SCType instanceType, SCType targetType) { return TypeVisitor.forEachType(targetType, eachType -> { if (eachType.isTypeVariable()) { - int index = classLinker.getTypeVariableIndex(instanceType, eachType.getGenericName()); + int index = compilationLinker.getTypeVariableIndex(instanceType, eachType.getGenericName()); if (index >= 0) { - return TypeBuilder.copy(instanceType.getGenericTypes().get(index)); + return instanceType.getGenericTypes().get(index); } } return eachType; @@ -79,18 +79,17 @@ public class DefaultExtTypeParser implements ExtTypeParser { return TypeVisitor.forEachType(parameterType, targetType, (referType, eachType) -> { if (eachType.isTypeVariable()) { String genericName = eachType.getGenericName(); - if (qualifyingTypes.containsKey(genericName)) {// 如果已经存在了,则必须统一 + // 如果已经存在了,则必须统一 + if (qualifyingTypes.containsKey(genericName)) { SCType existType = qualifyingTypes.get(genericName); if (!existType.equals(referType)) { throw new IllegalArgumentException("Parameter qualification types are not uniform!"); } - return TypeBuilder.copy(referType); } else { - referType = TypeBuilder.copy(referType); qualifyingTypes.put(genericName, referType); - return referType; } + return referType; } return eachType; }); diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/linker/ExtClassLinker.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/linker/ExtCompilationLinker.java similarity index 65% rename from spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/linker/ExtClassLinker.java rename to spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/linker/ExtCompilationLinker.java index 1012e84236156cc90de14be8d4c77b131d73b305..657b80a592fad2e6c2a83daa597520ed2b8e6940 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/linker/ExtClassLinker.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/linker/ExtCompilationLinker.java @@ -2,9 +2,9 @@ package com.gitee.spirit.core3.xcode.linker; import cn.hutool.core.lang.Assert; import com.gitee.spirit.common.utils.Collectors; +import com.gitee.spirit.core3.compile.entity.AccessRule; import com.gitee.spirit.core3.compile.entity.SCType; -import com.gitee.spirit.core3.visitor.api.ClassLinker; -import com.gitee.spirit.core3.visitor.api.TypeParser; +import com.gitee.spirit.core3.visitor.api.CompilationLinker; import com.gitee.spirit.core3.xcode.api.ClassLoader; import com.gitee.spirit.core3.xcode.api.ExtMethodMatcher; import com.gitee.spirit.core3.xcode.api.ExtTypeFactory; @@ -23,7 +23,7 @@ import java.util.Arrays; import java.util.List; @Component -public class ExtClassLinker implements ClassLinker { +public class ExtCompilationLinker implements CompilationLinker { @Autowired private ClassLoader classLoader; @@ -34,13 +34,14 @@ public class ExtClassLinker implements ClassLinker { @Autowired private ExtMethodMatcher extMethodMatcher; - private Class toClass(SCType scType) { + @Override + public Object getClassObject(SCType scType) { return classLoader.loadClass(scType.getClassName()); } @Override public int getTypeVariableIndex(SCType scType, String genericName) { - Class clazz = toClass(scType); + Class clazz = (Class) getClassObject(scType); TypeVariable[] typeVariables = clazz.getTypeParameters(); for (int index = 0; index < typeVariables.length; index++) { TypeVariable typeVariable = typeVariables[index]; @@ -53,7 +54,7 @@ public class ExtClassLinker implements ClassLinker { @Override public SCType getSuperType(SCType scType) { - Class clazz = toClass(scType); + Class clazz = (Class) getClassObject(scType); Type nativeSuperType = clazz.getGenericSuperclass(); SCType superType = nativeSuperType != null ? extTypeFactory.newType(nativeSuperType) : null; return superType != null ? extTypeParser.populate(scType, superType) : null; @@ -61,32 +62,34 @@ public class ExtClassLinker implements ClassLinker { @Override public List getInterfaceTypes(SCType scType) { - Class clazz = toClass(scType); + Class clazz = (Class) getClassObject(scType); List interfaceTypes = new ArrayList<>(); - for (Type interfaceType : clazz.getGenericInterfaces()) { - interfaceTypes.add(extTypeParser.populate(scType, extTypeFactory.newType(interfaceType))); + for (Type nativeInterfaceType : clazz.getGenericInterfaces()) { + SCType interfaceType = extTypeFactory.newType(nativeInterfaceType); + interfaceTypes.add(extTypeParser.populate(scType, interfaceType)); } return interfaceTypes; } @Override - public SCType visitField(SCType scType, String fieldName) { - Assert.isTrue(scType.getModifiers() != 0, + public SCType visitField(SCType scType, AccessRule accessRule, String fieldName) { + Assert.isTrue(accessRule.getModifiers() != 0, "Modifiers for accessible members must be set!fieldName:" + fieldName); - Class clazz = toClass(scType); + Class clazz = (Class) getClassObject(scType); Field field = ReflectUtils.getDeclaredField(clazz, fieldName); - if (field != null && ReflectUtils.isAccessible(field, scType.getModifiers())) { - return extTypeParser.populate(scType, extTypeFactory.newType(field.getGenericType())); + if (field != null && ReflectUtils.isAccessible(field, accessRule.getModifiers())) { + SCType fieldType = extTypeFactory.newType(field.getGenericType()); + return extTypeParser.populate(scType, fieldType); } return null; } @Override - public SCType visitMethod(SCType scType, String methodName, List parameterTypes) { - Assert.isTrue(scType.getModifiers() != 0, + public SCType visitMethod(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { + Assert.isTrue(accessRule.getModifiers() != 0, "Modifiers for accessible members must be set!methodName:" + methodName); MethodResult methodResult = matchMethod(scType, methodName, parameterTypes); - if (methodResult != null && ReflectUtils.isAccessible(methodResult.getMethod(), scType.getModifiers())) { + if (methodResult != null && ReflectUtils.isAccessible(methodResult.getMethod(), accessRule.getModifiers())) { SCType returnType = extTypeFactory.newType(methodResult.getMethod().getGenericReturnType()); return extTypeParser.populateReturnType(scType, methodResult.getQualifyingTypes(), returnType); } @@ -94,20 +97,20 @@ public class ExtClassLinker implements ClassLinker { } @Override - public List getParameterTypes(SCType scType, String methodName, List parameterTypes) { - Assert.isTrue(scType.getModifiers() != 0, + public List getParameterTypes(SCType scType, AccessRule accessRule, String methodName, List parameterTypes) { + Assert.isTrue(accessRule.getModifiers() != 0, "Modifiers for accessible members must be set!methodName:" + methodName); MethodResult matchResult = matchMethod(scType, methodName, parameterTypes); - if (matchResult != null && ReflectUtils.isAccessible(matchResult.getMethod(), scType.getModifiers())) { + if (matchResult != null && ReflectUtils.isAccessible(matchResult.getMethod(), accessRule.getModifiers())) { return matchResult.getParameterTypes(); } return null; } public MethodResult matchMethod(SCType scType, String methodName, List parameterTypes) { - Class clazz = toClass(scType); - List methods = Collectors.findAll( - Arrays.asList(clazz.getDeclaredMethods()), method -> methodName.equals(method.getName())); + Class clazz = (Class) getClassObject(scType); + List methods = Collectors.findAll(Arrays.asList(clazz.getDeclaredMethods()), + method -> methodName.equals(method.getName())); return extMethodMatcher.matchMethod(scType, methods, parameterTypes); } diff --git a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/selector/ExtImportSelector.java b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/selector/ExtCompilationSelector.java similarity index 61% rename from spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/selector/ExtImportSelector.java rename to spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/selector/ExtCompilationSelector.java index f797aef2841402d0cfcdb8b951510f94e9543c89..4879fdfe51316d6c2d6c5c2805e66f9f27f8fd07 100644 --- a/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/selector/ExtImportSelector.java +++ b/spirit-core3/spirit-core3-xcode/src/main/java/com/gitee/spirit/core3/xcode/selector/ExtCompilationSelector.java @@ -1,34 +1,28 @@ package com.gitee.spirit.core3.xcode.selector; -import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.core3.compile.ConfigManager; import com.gitee.spirit.core3.visitor.api.ClassProxy; -import com.gitee.spirit.core3.visitor.api.ImportSelector; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; import com.gitee.spirit.core3.xcode.api.ClassLoader; -import com.google.common.base.Splitter; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; -import java.util.List; - @Component -public class ExtImportSelector implements ImportSelector { +public class ExtCompilationSelector implements CompilationSelector { @Autowired private ClassLoader classLoader; @Override public String findClassName(ClassProxy classProxy, String simpleName) { - String langPackage = ConfigUtils.getLangPackage(); + String langPackage = ConfigManager.getLangPackage(); String className = langPackage + "." + simpleName; return classLoader.contains(className) ? className : null; } @Override public boolean addImport(ClassProxy classProxy, String className) { - return !className.startsWith(ConfigUtils.getLangPackage()); + return !className.startsWith(ConfigManager.getLangPackage()); } @Override diff --git a/spirit-example/pom.xml b/spirit-example/pom.xml deleted file mode 100644 index 1e44e556a7e55647afca00a32046d3617d852ef9..0000000000000000000000000000000000000000 --- a/spirit-example/pom.xml +++ /dev/null @@ -1,16 +0,0 @@ - - 4.0.0 - - com.gitee.chentaoah - spirit-parent - 3.0.0 - - spirit-example - pom - - spirit-example-dependency - spirit-example-plugin - - \ No newline at end of file diff --git a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/ClassGenericTest.java b/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/ClassGenericTest.java deleted file mode 100644 index dbb67d612b3f336c056d3134edd2a25d037fbe15..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/ClassGenericTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gitee.spirit.example; - -@MyTest -public class ClassGenericTest { - - public Class getClazz() { - return null; - } - - public void getAnno() { - MyTest myTest = ClassGenericTest.class.getAnnotation(MyTest.class); - System.out.println(myTest); - } - -} diff --git a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/GenericType.java b/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/GenericType.java deleted file mode 100644 index d0384afc3e8cd593cc9de410f30347f85fd5746e..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/GenericType.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gitee.spirit.example; - -import java.util.HashMap; -import java.util.Map; - -public class GenericType extends HashMap { - - public static final long serialVersionUID = 1L; - - public String test(T t) { - return ""; - } - -// public int test(K k) { -// return ""; -// } - - public void Test(String string) { - Map map = new HashMap<>(); -// map.put(123, null); - map.put("", 123); - } - -} diff --git a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/MyTest.java b/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/MyTest.java deleted file mode 100644 index f6ae44c2f63a597431c2784a9fbddb30afb41066..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/MyTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gitee.spirit.example; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface MyTest { - - String value() default ""; - -} diff --git a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/User.java b/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/User.java deleted file mode 100644 index e5dfd9f2bbaa2ba76fc23f23a511b3fd745e26ab..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-dependency/src/main/java/com/gitee/spirit/example/User.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gitee.spirit.example; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class User { - private String name; - private Integer age; -} diff --git a/spirit-example/spirit-example-plugin/pom.xml b/spirit-example/spirit-example-plugin/pom.xml deleted file mode 100644 index 1c5f11718fbbc49aecf1a1d0cabe26be67b5d6dd..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - 4.0.0 - - com.gitee.chentaoah - spirit-example - 3.0.0 - - spirit-example-plugin - - - com.gitee.chentaoah - spirit-example-dependency - ${project.version} - - - - - - com.gitee.chentaoah - spirit-maven-plugin - ${project.version} - - - - compile - - - - - - - \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Alias.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Alias.java deleted file mode 100644 index 57783e4d20d4cdf4382f6397ed07015a4a43b240..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Alias.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gitee.spirit.example.auto; - -public class Alias { - - public String getName() { - return "I am alias"; - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Friend.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Friend.java deleted file mode 100644 index 2171f225def0a8fe9c73f9be7ca27a6cc9def9ba..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Friend.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gitee.spirit.example.auto; - -public class Friend { - - public String sayHello() { - return "hello"; - } - - public String sayHello1() { - return "hello"; - } - - public String sayHello2() { - return "hello"; - } - - public String sayYes(String text, Integer number) { - return "hello"; - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Import.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Import.java deleted file mode 100644 index 7bc82b7e59c0bbe4b3d464bb133ce53fd03bec9d..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Import.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gitee.spirit.example.auto; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class Import { - - public Friend f = new Friend(); - public com.gitee.spirit.example.auto.Alias a = new com.gitee.spirit.example.auto.Alias(); - public String xxxxG_Alias = "Clock moved backwards.G_Alias to generate id for %d milliseconds"; - - public String testFriend(String text, Integer number) { - return f.sayHello2(); - } - - public String testAlias() { - return a.getName(); - } - - public void testStr() { - log.info(xxxxG_Alias); - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/block/Block.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/block/Block.java deleted file mode 100644 index dedb714f7df7650d91ba5e40db75c47b226b151f..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/block/Block.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.gitee.spirit.example.block; - -import static com.gitee.spirit.stdlib.Emptys.empty; -import com.gitee.spirit.stdlib.Lists; -import com.gitee.spirit.stdlib.Maps; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -@Slf4j -public class Block { - - public String s = "hello"; - - public void testIf() { - if (StringUtils.equals(s, "hello")) { - log.info(s); - } - if (!StringUtils.equals(s, "hello")) { - log.info(s); - } - if (empty(s)) { - log.info(s); - } else if (s.length() >= 10) { - log.info(s); - } - if (!empty(s)) { - log.info(s); - } - if (StringUtils.isNotEmpty(s)) { - log.info(s); - } - if (StringUtils.isNotEmpty(s)) { - log.info(s); - log.info("yes"); - } - } - - public void testFor() { - Map map = Maps.of("key", 100, "key", 100); - for (String key : map.keySet()) { - log.info(key); - } - for (Integer value : map.values()) { - log.info("number is {}", value); - } - for (Entry entry : map.entrySet()) { - log.info("test entry!", entry.getKey()); - } - List list = Lists.of("first", "second", "third"); - for (String str : list) { - log.info(str); - break; - } - for (int i = 0; i < list.size(); i++) { - s = list.get(i); - log.info("thank {} very much!", "you"); - continue; - } - for (int i = 0; i < list.size(); i++) { - s = list.get(i); - s = String.valueOf(12345); - s = "caixukun"; - continue; - } - int[] nums = new int[100]; - for (int num : nums) { - log.info("num is {}", num); - } - } - - public void testWhile() { - String y = "hi!"; - while (StringUtils.isNotEmpty(y)) { - log.info(y); - break; - } - } - - public String testTry() { - try { - if (StringUtils.equals(s, "hello")) { - throw new Exception("test"); - } - return s; - } catch (Exception e) { - log.error("error is", e); - } finally { - log.info("hello"); - } - return null; - } - - public synchronized void testSync() { - synchronized (s) { - log.info("in sync!"); - } - } - - public String testThrows() throws Exception { - return s; - } - - public void testGetLines() { - if (StringUtils.equals(s, "hello\\")) { - log.info("test"); - } - if (StringUtils.equals(s, "hello")) { - log.info("test}"); - } - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/AbsService.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/AbsService.java deleted file mode 100644 index f9cd95829b00bf26db6765d7b9ff54e49fec3e0a..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/AbsService.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.gitee.spirit.example.clazz; - -public abstract class AbsService implements Service { - - public abstract String testAbsMethod(String test); - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/Service.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/Service.java deleted file mode 100644 index 37d3df4e9400bafd51109967cfdb711dc95e7f10..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/Service.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gitee.spirit.example.clazz; - -public interface Service { - - public String one(); - - public int two(); - - public byte[] three(); - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/ServiceImpl.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/ServiceImpl.java deleted file mode 100644 index 8742628308dfaf35eb6397e312d2456b4ef10ca8..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/ServiceImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gitee.spirit.example.clazz; - -public class ServiceImpl extends AbsService { - - public T key; - public K value; - public String name; - - public ServiceImpl() { - this("chentao"); - } - - public ServiceImpl(String name) { - super(); - this.name = name; - } - - public String one() { - return "one"; - } - - public int two() { - return 10; - } - - public byte[] three() { - return new byte[10]; - } - - public K testT(T t) { - return value; - } - - public String testAbsMethod(String test) { - return "success"; - } - - public T testReturnGenericType(T t) { - return t; - } - - public String test1(T t) { - return "hello"; - } - - public int test1(int number) { - return 1; - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Child.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Child.java deleted file mode 100644 index 47d4ca79e917bf1025fecf8a8b4d7f8a024b6b91..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Child.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.gitee.spirit.example.deduce; - -import com.gitee.spirit.example.ClassGenericTest; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class Child extends Father { - - public Father father = new Father(); - public int age = 18; - public ClassGenericTest t = new ClassGenericTest(); - - public String sayHello() { - return super.sayHello(); - } - - public Father getFather() { - return father; - } - - public String testMembers() { - String a = getFather().getChild().getFather().name; - String b = father.child.father.child.father.name; - Child c = father.getChild(); - log.info("test members {} {}", a, b, c); - return this.sayHello(); - } - - public String testClassGeneric() { - Class a = t.getClazz(); - return a.getName(); - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Father.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Father.java deleted file mode 100644 index ef869bd4333e6cd2bcee58d5f22fa90142341dca..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Father.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gitee.spirit.example.deduce; - -public class Father { - - public Child child = new Child(); - public String name = "caixukun"; - - public String sayHello() { - return "hello"; - } - - public Child getChild() { - return child; - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Inner.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Inner.java deleted file mode 100644 index bc545654f5758304d8599507ceba5b6b0120a40d..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Inner.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gitee.spirit.example.inner; - -import com.gitee.spirit.example.deduce.Father; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class Inner { - - public String f1 = "I am Inner!"; - public String f2 = "hello world!"; - - public int getAge() { - return 18; - } - - public void testImport() { - log.info(new Father().toString()); - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Outside.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Outside.java deleted file mode 100644 index a1604e77650a7854be6aef1d4f82ff283866df6c..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Outside.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gitee.spirit.example.inner; - -public class Outside { - - public int f1 = 100; - public double f2 = 100.01; - - public String getName() { - return "I am Outside"; - } - - public int getF1() { - return f1; - } - - public int testInner() { - Inner inner = new Inner(); - return inner.getAge(); - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/process/Main.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/process/Main.java deleted file mode 100644 index 93c184d67f6abd71f79ade60d8f90819d78caa61..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/process/Main.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gitee.spirit.example.process; - -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -@Slf4j -public class Main { - - public static int x = 100; - public static double y = 100.0; - - public static void main(String[] args) { - doSomething(); - } - - public static boolean doSomething() { - String s = "hello"; - if (StringUtils.equals(s, "hello")) { - log.info("hi!"); - return true; - } - return false; - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/snow/IdWorker.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/snow/IdWorker.java deleted file mode 100644 index 962626f0928a61cff923d12e9f5b0b2ca2066d3d..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/snow/IdWorker.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gitee.spirit.example.snow; - -public class IdWorker { - - public long twepoch = 1420041600000L; - public long workerIdBits = 5L; - public long datacenterIdBits = 5L; - public long maxWorkerId = -1L ^ (-1L << workerIdBits); - public long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); - public long sequenceBits = 12L; - public long workerIdShift = sequenceBits; - public long datacenterIdShift = sequenceBits + workerIdBits; - public long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; - public long sequenceMask = -1L ^ (-1L << sequenceBits); - public long workerId; - public long datacenterId; - public long sequence = 0L; - public long lastTimestamp = -1L; - - public IdWorker(long workerId, long datacenterId) { - if (workerId > maxWorkerId || workerId < 0) { - String message = String.format("worker id can't be greater than %d or less than 0", maxWorkerId); - throw new IllegalArgumentException(message); - } - if (datacenterId > maxDatacenterId || datacenterId < 0) { - String message = String.format("datacenter id can't be greater than %d or less than 0", maxDatacenterId); - throw new IllegalArgumentException(message); - } - this.workerId = workerId; - this.datacenterId = datacenterId; - } - - public synchronized long nextId() { - long timestamp = timeGen(); - if (timestamp < lastTimestamp) { - String message = String.format("Clock moved backwards.Refusing to generate id for %d milliseconds", lastTimestamp - timestamp); - throw new RuntimeException(message); - } - if (timestamp == lastTimestamp) { - sequence = (sequence + 1) & sequenceMask; - if (sequence == 0) { - timestamp = tilNextMillis(lastTimestamp); - } - } else { - sequence = 0L; - } - lastTimestamp = timestamp; - return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; - } - - public long tilNextMillis(long lastTimestamp) { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) { - timestamp = timeGen(); - } - return timestamp; - } - - public long timeGen() { - return System.currentTimeMillis(); - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/subexpress/Express.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/subexpress/Express.java deleted file mode 100644 index 9535e306b01a5f0b7946910a451a925f9c33b34f..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/subexpress/Express.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.gitee.spirit.example.subexpress; - -import static com.gitee.spirit.stdlib.Emptys.empty; -import com.gitee.spirit.stdlib.Lists; -import java.util.List; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; - -@Slf4j -public class Express { - - public int x = 1; - public int y = 100; - public String s = "test"; - public double d = 1.1; - public double e = d + 10; - - public void testSubexpress() { - if (((x + 1 > 0) && (y < 100)) && StringUtils.equals(s, "test")) { - log.info("hello"); - } - } - - public void testCast() { - String s1 = "I am a str"; - Object o1 = (Object) s1; - log.info("test success", o1); - } - - public String testTree() { - boolean b = (x + 1 > 0 && y < 100) && StringUtils.equals(s, "test") && s instanceof Object; - log.info("test tree", b); - List list = Lists.of("one", "two", "three"); - boolean b1 = ((Object) list.get(1)).toString().length() + 100 > 0; - log.info("tree", b1); - String s1 = ((Object) list.get(1)).toString(); - log.info("tree", s1); - double d1 = 100.0; - int i1 = 100; - double num = d1 + i1; - log.info("tree", num); - boolean express = (x + 1 > 0 && y < 100); - log.info("{}", express); - Object express1 = ((Object) list.get(1)); - log.info("{}", express1); - boolean b11 = (x + 1 > 0 && y < 100) && StringUtils.equals(list.get(0), "test") && s instanceof Object; - log.info("{}", b11); - boolean b111 = (!StringUtils.equals(s, "test")) && StringUtils.equals(s, "test") && !empty(list.get(0)); - log.info("{}", b111); - String b222 = list.get(1).toString(); - log.info("{}", b222); - if (StringUtils.isNotEmpty(s)) { - return null; - } else { - return "this is return type test"; - } - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/syntax/Syntax.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/syntax/Syntax.java deleted file mode 100644 index b3d7dbe208076a6a8d62d1300c44dbec3c112a7c..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/syntax/Syntax.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gitee.spirit.example.syntax; - -import com.gitee.spirit.stdlib.Lists; -import com.gitee.spirit.stdlib.Maps; -import java.util.List; -import java.util.Map; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class Syntax { - - public List list = Lists.of("first", "second"); - public Map map = Maps.of("key", 100, "key", 100); - - public void testJudge() { - boolean b = list.get(1) != null; - boolean bb = list instanceof Object; - if (b && bb) { - log.info("yes"); - } - if (list.get(1) != null && list instanceof Object) { - log.info("test success"); - } - } - - public void testLog() { - try { - log.info("test print keyword"); - log.debug("test debug keyword"); - throw new Exception("test"); - } catch (Exception e) { - log.error("There is a Exception!", e); - } - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/GenericType.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/GenericType.java deleted file mode 100644 index b15f206adeedbc86c5c05d03c72a5314f725436c..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/GenericType.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gitee.spirit.example.type; - -import java.util.HashMap; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@SuppressWarnings("serial") -public class GenericType extends HashMap { - - public Integer testGeneric() { - return get("test"); - } - - public HashMap test() { - return new HashMap(); - } - - public Integer test1() { - GenericType g = new GenericType(); - return g.get("test"); - } - - public HashMap test2() { - GenericType g = new GenericType(); - return g.test(); - } - - public void testB() { - Class clazz = int.class; - log.info(clazz.getName()); - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/People.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/People.java deleted file mode 100644 index 35d291dac54a96f523fc44c7d4e1762b2a4c3d13..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/People.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gitee.spirit.example.type; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class People { - - public String name = "chentao"; - public int age = 28; - public double money = -10.0; - - public Object show() { - log.info(name); - log.info("age:{}", age); - log.info("money:{}", money); - return null; - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/Type.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/Type.java deleted file mode 100644 index bc43d8d39dfef9c19af54b453abfef5ca5c93ae8..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/Type.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.gitee.spirit.example.type; - -import com.gitee.spirit.example.ClassGenericTest; -import com.gitee.spirit.example.GenericType; -import com.gitee.spirit.example.MyTest; -import com.gitee.spirit.example.User; -import com.gitee.spirit.example.clazz.ServiceImpl; -import com.gitee.spirit.example.process.Main; -import com.gitee.spirit.stdlib.Lists; -import com.gitee.spirit.stdlib.Maps; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import lombok.extern.slf4j.Slf4j; -import tk.mybatis.mapper.entity.Example; - -@Slf4j -@Deprecated -public class Type { - - public static final double NUMBER = 100.0; - public static final String NAME = "chentao"; - @Deprecated - public boolean b = true; - public boolean b1 = false; - public int i = 100; - public double d = 100.0; - public String s = "string"; - public List emptyList = Lists.of(); - public Map emptyMap = Maps.of(); - public List list = Lists.of("first", "second", "third"); - public List list1 = Lists.of("string", 100); - public List> map = Lists.of(Maps.of("key1", 123, "key2", "123"), Maps.of("key1", 123, "key2", "123")); - public Map map1 = Maps.of("key1", "string", "key2", 100); - public boolean[] bArray = new boolean[10]; - public char[] cArray = new char[10]; - public short[] sArray = new short[10]; - public int[] iArray = new int[10]; - public float[] fArray = new float[10]; - public double[] dArray = new double[10]; - public Object[] objArray = new Object[10]; - public String[] strArray = new String[10]; - public String s111 = "I am a new assign syntax!"; - public int num = Main.x; - public char myChar = 'c'; - public final String cv = "test const voliate"; - public volatile boolean vo = false; - - @Deprecated - public void testType() { - boolean a1 = bArray[0]; - char a2 = cArray[0]; - short a3 = sArray[0]; - int a4 = iArray[0]; - float a5 = fArray[0]; - double a6 = dArray[0]; - Object a7 = objArray[0]; - String a8 = strArray[0]; - log.info("test array{}{}{}{}{}{}{}{}{}", a1, a2, a3, a4, a5, a6, a7, a8); - Class clazz; - clazz = Type.class; - Class clz = clazz; - log.info("test class {}", clz); - Type self = this; - log.info("test this {}", self); - HashMap hmap = new HashMap(); - hmap.put("key", "value"); - long long1 = 100L; - log.info("long1 is ", long1); - long mask = 1L << 8; - log.info("mask", mask); - int yyy = 1; - int iii = 100 + yyy++ + 100; - iii = yyy + 100; - log.info(iii + ""); - MyTest objxxx = ClassGenericTest.class.getAnnotation(MyTest.class); - String ssss = objxxx.value(); - log.info("" + ssss); - String xxss = testParam(null, null); - log.info(xxss); - ServiceImpl service = new ServiceImpl(); - String type = service.testReturnGenericType("text"); - log.info(type.toString()); - String key = service.key; - log.info(key); - int serNum = service.test1(123); - log.info("" + serNum); - String serStr = service.test1("hello"); - log.info("" + serStr); - GenericType generic = new GenericType(); - Integer gKey = generic.get("test"); - log.info(gKey + ""); - List intsss = Lists.of(1, 123, 8987879); - Integer integer = intsss.get(0); - int numberxxx = integer.intValue(); - log.info("" + numberxxx); - final int finalNum = 1000; - log.info("" + finalNum); - final String strxxxx; - strxxxx = "hello"; - log.info(strxxxx); - boolean bbxxx = getArray()[0]; - log.info("" + bbxxx); - Map objvar = Maps.of("name", "chen", "age", 18, "from", "China", "brother", Lists.of("wanhao", "chenzhe")); - String str0 = objvar.toString(); - log.info(str0); - User user = User.builder().name("chen").age(18).build(); - log.info(user.getName()); - testSmartBuilder(User.builder().name("chen").age(18).build()); - Example example$1 = new Example(User.class); - Example.Criteria criteria$1 = example$1.createCriteria(); - if (user.getName() != null) { - criteria$1.andNotEqualTo("name", user.getName()); - } - Objects.requireNonNull(user.getAge(), "user.getAge() is null!"); - criteria$1.andGreaterThanOrEqualTo("age", user.getAge()); - criteria$1.andLike("alias", "%"+user.getName()+"%"); - example$1.orderBy("id").desc(); - Example example = example$1; - log.info(example.toString()); - } - - public String testParam(@Deprecated String str, Object obj) { - return "yes"; - } - - public String testReturnType() { - int anumx = 1111; - return "I am a Str!" + anumx; - } - - public void testSmartBuilder(User user) { - log.info("hello user {}", user.getName()); - } - - public boolean[] getArray() { - return bArray; - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Alias.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Alias.sp deleted file mode 100644 index 5073e473edd2fcb589f49599c283210c22f9a276..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Alias.sp +++ /dev/null @@ -1,8 +0,0 @@ - -class Alias{ - - func getName(){ - return "I am alias" - } - -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Friend.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Friend.sp deleted file mode 100644 index 225a0a538c5310f8758deace018728cf74fc1566..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Friend.sp +++ /dev/null @@ -1,20 +0,0 @@ - -class Friend { - - func sayHello(){ - return "hello" - } - - func sayHello1(){ - return "hello" - } - - func sayHello2(){ - return "hello" - } - - func sayYes(String text, Integer number){ - return "hello" - } - -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Import.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Import.sp deleted file mode 100644 index 2ec8112ae51902cd2cee232e342e278a8359de46..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Import.sp +++ /dev/null @@ -1,27 +0,0 @@ - -//别名 -import com.gitee.spirit.example.auto.Alias G_Alias - -class Import { - - f=Friend() - a=G_Alias() - xxxxG_Alias="Clock moved backwards.G_Alias to generate id for %d milliseconds" - - func testFriend(String text, Integer number){ - return f.sayHello2() - } - - func testAlias(){ - return a.getName() - } - - func testStr(){ - print xxxxG_Alias - } - - -} - - - diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/block/Block.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/block/Block.sp deleted file mode 100644 index 6dd377859ad623313c1d57d6ab6917f88d636951..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/block/Block.sp +++ /dev/null @@ -1,104 +0,0 @@ - -//代码块 -class Block { - - s="hello" - - func testIf(){ - if s=="hello"{ - print s - } - if s!="hello"{ - print s - } - if empty(s) { - print s - } else if s.length() >= 10 { - print s - } - if !empty(s) { - print s - } - - if s : print s - - if s : print s : print "yes" - } - - func testFor(){ - //遍历Map - map={"key":100,"key":100} - for key in map.keySet(){ - print key - } - for value in map.values(){ - print "number is {}",value - } - for entry in map.entrySet(){ - print "test entry!",entry.getKey() - } - - //遍历List - list=["first","second","third"] - for str in list : print str : break - - //索引遍历 - for (i=0; i extends AbsService{ - - T key - - K value - - String name - //测试构造方法 - func ServiceImpl(){ - this("chentao") - } - - func ServiceImpl(String name){ - super() - this.name=name - } - - func one(){ - return "one" - } - - func two(){ - return 10 - } - - func three(){ - return byte[10] - } - - func testT(T t){ - return value - } - - func testAbsMethod(String test){ - return "success" - } - - T testReturnGenericType(T t){ - return t - } - - func test1(T t){ - return "hello" - } - - func test1(int number){ - return 1 - } - -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Child.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Child.sp deleted file mode 100644 index 51a5b2710d91c9f7850e219425244516bebc9b34..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Child.sp +++ /dev/null @@ -1,35 +0,0 @@ - -import com.gitee.spirit.example.ClassGenericTest - -class Child extends Father{ - - father=Father() - age=18 - t=ClassGenericTest() - - func sayHello(){ - return super.sayHello() - } - - func getFather(){ - return father - } - - func testMembers(){ - a=getFather().getChild().getFather().name - b=father.child.father.child.father.name - c=father.getChild() - print "test members {} {}",a,b,c - return this.sayHello() - } - - func testClassGeneric(){ - a = t.getClazz() - return a.getName() - } - - - - - -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Father.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Father.sp deleted file mode 100644 index 55547484944d3fe5acd57304aa5056543410ce64..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Father.sp +++ /dev/null @@ -1,19 +0,0 @@ - -class Father { - - child=Child() - name="caixukun" - - func sayHello(){ - return "hello" - } - - func getChild(){ - return child - } - - -} - - - diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Inner.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Inner.sp deleted file mode 100644 index a3054936602f9fa154cb24c2c4a33730a6a3e2c8..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Inner.sp +++ /dev/null @@ -1,15 +0,0 @@ -//测试内部类 -class Inner { - - f1="I am Inner!" - f2="hello world!" - - func getAge(){ - return 18 - } - - func testImport(){ - print Father().toString() - } - -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Outside.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Outside.sp deleted file mode 100644 index 179e61e8f4bef62e43bfe6be49a8aa774193f77c..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Outside.sp +++ /dev/null @@ -1,20 +0,0 @@ - -//主类 -class Outside { - - f1=100 - f2=100.01 - func getName(){ - return "I am Outside" - } - - func getF1(){ - return f1 - } - - func testInner(){ - inner=Inner() - return inner.getAge() - } - -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/process/Main.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/process/Main.sp deleted file mode 100644 index d2c87bcf48a08641e99e31b50b9d8f0a94baba24..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/process/Main.sp +++ /dev/null @@ -1,16 +0,0 @@ - -x=100 -y=100.0 -//面向过程 -func main(){ - doSomething() -} - -func doSomething(){ - s="hello" - if s=="hello" { - print "hi!" - return true - } - return false -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/snow/IdWorker.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/snow/IdWorker.sp deleted file mode 100644 index 34d9aa1fb078392a486dc9ec21fe3bb4fdd638a6..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/snow/IdWorker.sp +++ /dev/null @@ -1,72 +0,0 @@ - -//雪花分片实现 -class IdWorker { - //开始时间截 (2015-01-01) - twepoch = 1420041600000L - //机器id所占的位数 - workerIdBits = 5L - //数据标识id所占的位数 - datacenterIdBits = 5L - //支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) - maxWorkerId = -1L ^ (-1L << workerIdBits) - //支持的最大数据标识id,结果是31 - maxDatacenterId = -1L ^ (-1L << datacenterIdBits) - //序列在id中占的位数 - sequenceBits = 12L - //机器ID向左移12位 - workerIdShift = sequenceBits - //数据标识id向左移17位(12+5) - datacenterIdShift = sequenceBits + workerIdBits - //时间截向左移22位(5+5+12) - timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits - //生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) - sequenceMask = -1L ^ (-1L << sequenceBits) - //工作机器ID(0~31) - long workerId - //数据中心ID(0~31) - long datacenterId - //毫秒内序列(0~4095) - sequence = 0L - //上次生成ID的时间截 - lastTimestamp = -1L - - func IdWorker(long workerId, long datacenterId){ - if workerId > maxWorkerId || workerId < 0 { - message = String.format("worker id can't be greater than %d or less than 0", maxWorkerId) - throw IllegalArgumentException(message) - } - if datacenterId > maxDatacenterId || datacenterId < 0 { - message = String.format("datacenter id can't be greater than %d or less than 0", maxDatacenterId) - throw IllegalArgumentException(message) - } - this.workerId = workerId - this.datacenterId = datacenterId - } - - synch func nextId(){ - timestamp = timeGen() - if timestamp < lastTimestamp { - message = String.format("Clock moved backwards.Refusing to generate id for %d milliseconds", lastTimestamp - timestamp) - throw RuntimeException(message) - } - if timestamp == lastTimestamp { - sequence = (sequence + 1) & sequenceMask - if sequence == 0 : timestamp = tilNextMillis(lastTimestamp) - } else { - sequence = 0L - } - lastTimestamp = timestamp - return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence - } - - func tilNextMillis(long lastTimestamp){ - timestamp = timeGen() - while timestamp <= lastTimestamp : timestamp = timeGen() - return timestamp - } - - func timeGen(){ - return System.currentTimeMillis() - } - -} diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/subexpress/Express.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/subexpress/Express.sp deleted file mode 100644 index 9e9fdf3baae60075354c685cf3f0aaec0f7563cf..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/subexpress/Express.sp +++ /dev/null @@ -1,58 +0,0 @@ - -class Express { - - x=1 - y=100 - s="test" - d=1.1 - e=d+10 - - func testSubexpress(){ - if ((x+1>0)&&(y<100)) && s=="test"{ - print "hello" - } - } - - func testCast(){ - s1="I am a str" - o1=(Object)s1 - print "test success",o1 - } - - func testTree(){ - //这里有一个问题s=="test"必须转换成equals - b=(x +1 >0 && y <100 ) && s=="test" && s instanceof Object - print "test tree",b - list=["one","two","three"] - b1=((Object)list.get(1)).toString().length()+100>0 - print "tree",b1 - s1=((Object)list.get(1)).toString() - print "tree",s1 - d1=100.0 - i1=100 - num=d1+i1 - print "tree",num - express=(x+1>0 && y<100) - print "{}",express - express1=((Object)list.get(1)) - print "{}",express1 - b11=(x +1 >0 && y <100 ) && list.get(0)=="test" && s instanceof Object - print "{}",b11 - - b111=( s!="test" ) && s=="test" && !empty(list.get(0)) - print "{}",b111 - - b222=list.get(1).toString() - print "{}",b222 - if s { - return null - } else { - return "this is return type test" - } - - } - - - - -} diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/syntax/Syntax.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/syntax/Syntax.sp deleted file mode 100644 index 94f4d3e331a28ce2fcc0ae8f88fb2148a4df274c..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/syntax/Syntax.sp +++ /dev/null @@ -1,29 +0,0 @@ - -//特殊语法 -class Syntax { - - list=["first","second"] - map={"key":100,"key":100} - - //一般判断 - func testJudge(){ - b=list.get(1) != null - bb=list instanceof Object - if b && bb : print "yes" - if list.get(1)!=null && list instanceof Object : print "test success" - } - - //异常处理 - func testLog(){ - try{ - print "test print keyword" - debug "test debug keyword" - throw Exception("test") - }catch Exception e{ - error "There is a Exception!",e - } - } - -} - - diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/GenericType.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/GenericType.sp deleted file mode 100644 index e9be60f906484521a5904ee25edfe559daece494..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/GenericType.sp +++ /dev/null @@ -1,30 +0,0 @@ - -import java.util.HashMap - -@SuppressWarnings("serial") -class GenericType extends HashMap { - - func testGeneric(){ - return get("test") - } - - func test(){ - return HashMap() - } - - func test1(){ - g=GenericType() - return g.get("test") - } - - func test2(){ - g=GenericType() - return g.test() - } - - func testB(){ - clazz=int.class - print clazz.getName() - } - -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/People.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/People.sp deleted file mode 100644 index ec1dcf393083e01bc02e63fceeb051b249912322..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/People.sp +++ /dev/null @@ -1,14 +0,0 @@ - -class People { - - name = "chentao" - age = 28 - money = -10.0 - - func show() { - print name - print "age:{}", age - print "money:{}", money - return null - } -} \ No newline at end of file diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/Type.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/Type.sp deleted file mode 100644 index c477bb8d9417165be493eaeb28b6055e18590188..0000000000000000000000000000000000000000 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/Type.sp +++ /dev/null @@ -1,171 +0,0 @@ - -import java.util.HashMap -import com.gitee.spirit.example.ClassGenericTest -import com.gitee.spirit.example.MyTest -import com.gitee.spirit.example.GenericType -import com.gitee.spirit.example.User -import tk.mybatis.mapper.entity.Example - -const NUMBER = 100.0 -const NAME = "chentao" - -@Deprecated -class Type { - @Deprecated - b=true - b1=false - i=100 - d=100.0 - s="string" - emptyList=[] - emptyMap={} - list=["first","second","third"] - list1=["string",100] - map=[{"key1":123,"key2":"123"},{"key1":123,"key2":"123"}] - map1={"key1":"string","key2":100} - bArray=boolean[10] - cArray=char[10] - sArray=short[10] - iArray=int[10] - fArray=float[10] - dArray=double[10] - objArray=Object[10] - strArray=String[10] - String s111="I am a new assign syntax!" - //测试静态访问 - num=Main.x - myChar='c' - const cv = "test const voliate" - volatile vo = false - - @Deprecated - func testType(){ - - //list << "fourth" - //测试不同类型 - //list1 << 100.0 - - //map << "key3",100 - //测试不同类型 - //map1 << "key3",100.0 - - //测试数组返回 - a1=bArray[0] - a2=cArray[0] - a3=sArray[0] - a4=iArray[0] - a5=fArray[0] - a6=dArray[0] - a7=objArray[0] - a8=strArray[0] - print "test array{}{}{}{}{}{}{}{}{}",a1,a2,a3,a4,a5,a6,a7,a8 - - //测试class - Class clazz - clazz=Type.class - clz=clazz - print "test class {}",clz - - //测试this - self=this - print "test this {}",self - - //测试泛型类型 - hmap=HashMap() - hmap.put("key","value") - - //测试long - long1=100L - print "long1 is ",long1 - - //测试位操作符 - mask= 1L << 8 - print "mask",mask - - yyy=1 - iii=100+yyy+++100 - iii=yyy+100 - print iii+"" - - objxxx=ClassGenericTest.class.getAnnotation(MyTest.class) - ssss=objxxx.value() - print ""+ssss - - xxss = testParam(null, null) - print xxss - - service=ServiceImpl() - type=service.testReturnGenericType("text") - print type.toString() - - key = service.key - print key - - serNum=service.test1(123) - print "" + serNum - - serStr=service.test1("hello") - print "" + serStr - - generic=GenericType() - gKey=generic.get("test") - print gKey + "" - - intsss=[1,123,8987879] - integer=intsss.get(0) - numberxxx=integer.intValue() - print ""+numberxxx - - const finalNum=1000 - print "" + finalNum - - const String strxxxx - strxxxx="hello" - print strxxxx - - bbxxx=getArray()[0] - print "" + bbxxx - - objvar = { - "name" : "chen", - "age" : 18, - "from" : "China", - "brother" : ["wanhao", "chenzhe"] - } - str0 = objvar.toString() - print str0 - - user = User{name="chen",age=18} - print user.getName() - - //测试智能builder模式 - testSmartBuilder(${name="chen",age=18}) - - example = $Example{ - class = User.class, - name != user.getName()?, - age >= user.getAge()!, - alias like "%" + user.getName() + "%", - order by id desc - } - print example.toString() - } - - func testParam(@Deprecated String str, Object obj){ - return "yes" - } - - String testReturnType(){ - anumx=1111 - return "I am a Str!" + anumx - } - - func testSmartBuilder(User user){ - print "hello user {}", user.getName() - } - - func getArray(){ - return bArray - } - -} \ No newline at end of file diff --git a/spirit-plugin/pom.xml b/spirit-plugin/pom.xml index c94674135ce5139f3c1165a07f75f99d2560117f..82d3a257f40f177af379b20bbaa12e964fee0de9 100644 --- a/spirit-plugin/pom.xml +++ b/spirit-plugin/pom.xml @@ -3,14 +3,16 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-parent 3.0.0 spirit-plugin pom + - spirit-maven-plugin spirit-data-plugin + spirit-maven-plugin + \ No newline at end of file diff --git a/spirit-plugin/spirit-data-plugin/pom.xml b/spirit-plugin/spirit-data-plugin/pom.xml index 0359e3f882fc331cfc2569248c102d0fee5d0d58..33b99ae08867c2bbbab00f7535064b836e88b82b 100644 --- a/spirit-plugin/spirit-data-plugin/pom.xml +++ b/spirit-plugin/spirit-data-plugin/pom.xml @@ -4,16 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-plugin 3.0.0 spirit-data-plugin + - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3-xcode ${project.version} + \ No newline at end of file diff --git a/spirit-plugin/spirit-data-plugin/src/main/java/com/gitee/spirit/data/plugin/TKExampleMacroParser.java b/spirit-plugin/spirit-data-plugin/src/main/java/com/gitee/spirit/data/plugin/TKExampleMacroParser.java index b3a4775fc321142e4c94ae4dab00d1d428831aed..fea4d353eb320523e93a3d48d99b92df74cb0f46 100644 --- a/spirit-plugin/spirit-data-plugin/src/main/java/com/gitee/spirit/data/plugin/TKExampleMacroParser.java +++ b/spirit-plugin/spirit-data-plugin/src/main/java/com/gitee/spirit/data/plugin/TKExampleMacroParser.java @@ -4,15 +4,15 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.gitee.spirit.common.constants.Attachment; import com.gitee.spirit.common.constants.Constants; -import com.gitee.spirit.common.enums.TokenType; +import com.gitee.spirit.common.enums.token.TokenType; import com.gitee.spirit.core3.compile.api.CharsParser; import com.gitee.spirit.core3.compile.entity.Token; import com.gitee.spirit.core3.element.entity.Element; -import com.gitee.spirit.core3.element.entity.Statement; -import com.gitee.spirit.core3.tree.entity.StatementTree; +import com.gitee.spirit.core3.tree.entity.ElementTree; import com.gitee.spirit.core3.visitor.api.ClassProxy; -import com.gitee.spirit.core3.visitor.api.ImportSelector; -import com.gitee.spirit.core3.visitor.entity.VisitContext; +import com.gitee.spirit.core3.visitor.api.CompilationSelector; +import com.gitee.spirit.core3.visitor.entity.TokenEvent; +import com.gitee.spirit.core3.visitor.entity.ParseClassContext; import com.gitee.spirit.core3.xcode.api.MacroParser; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +26,7 @@ public class TKExampleMacroParser implements MacroParser, InitializingBean { @Autowired private CharsParser charsParser; @Autowired - private ImportSelector importSelector; + private CompilationSelector compilationSelector; private final Map operatorFormatMapping = new HashMap<>(); @@ -47,9 +47,10 @@ public class TKExampleMacroParser implements MacroParser, InitializingBean { } @Override - public void parseToken(VisitContext visitContext, Element element, Statement statement, Token token) { + public void parseToken(ParseClassContext parseClassContext, TokenEvent tokenEvent) { + Token token = tokenEvent.getToken(); // 上下文参数 - ClassProxy classProxy = visitContext.getClassProxy(); + ClassProxy classProxy = parseClassContext.getClassProxy(); Map attachment = classProxy.getAttachment(); attachment.putIfAbsent(Attachment.VARIABLE_SIGN, 1); Integer variableSign = (Integer) attachment.get(Attachment.VARIABLE_SIGN); @@ -63,13 +64,13 @@ public class TKExampleMacroParser implements MacroParser, InitializingBean { parseExpression(lines, classProxy, variableSign, subExpression); } // 插入行 - visitContext.setMergeTreeListener((visitContext1, mergeTree1, index1) -> { + parseClassContext.setMergeElementTreeListener((visitContext1, mergeElementTree, index1) -> { int count = 0; for (String line : lines) { - Token token1 = new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, line, null); - Element element1 = new Element(null, Collections.singletonList(token1), null, null); - StatementTree statementTree = new StatementTree(element1); - mergeTree1.getChildren().add(index1 + count++, statementTree); + Token expressionToken = new Token(TokenType.CustomEnum.CUSTOM_EXPRESSION, line, null); + Element element = new Element(null, Collections.singletonList(expressionToken), null, null); + ElementTree elementTree = new ElementTree(element); + mergeElementTree.getChildren().add(index1 + count++, elementTree); } return index1 + lines.size(); }); @@ -101,7 +102,7 @@ public class TKExampleMacroParser implements MacroParser, InitializingBean { String content = String.format(format, sign, property, value); if ("!".equals(endChar)) { - importSelector.addImport(classProxy, Objects.class.getName()); + compilationSelector.addImport(classProxy, Objects.class.getName()); lines.add(String.format("Objects.requireNonNull(%s, \"%s is null!\");", value, value)); } diff --git a/spirit-plugin/spirit-maven-plugin/pom.xml b/spirit-plugin/spirit-maven-plugin/pom.xml index e3a71308e152e4e51e5044e595f78f0e1ad6bf19..0ec4dec4ff92a37cb17cc988a130cb0f8f51fe54 100644 --- a/spirit-plugin/spirit-maven-plugin/pom.xml +++ b/spirit-plugin/spirit-maven-plugin/pom.xml @@ -4,15 +4,16 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-plugin 3.0.0 spirit-maven-plugin maven-plugin + - com.gitee.chentaoah + com.gitee.digital-engine spirit-starter-java ${project.version} @@ -38,6 +39,7 @@ test + @@ -55,38 +57,6 @@ maven-plugin-plugin 3.6.0 - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - - org.apache.maven.plugins - - - maven-plugin-plugin - - - [3.2,) - - - descriptor - - - - - - - - - - diff --git a/spirit-plugin/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritCompileMojo.java b/spirit-plugin/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritCompileMojo.java index f07ec0db0bad4285b3f6a4bd7afbbb2c160c4c8b..be026520cbf99c394ee24f70d8b3ad8706a87cb1 100644 --- a/spirit-plugin/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritCompileMojo.java +++ b/spirit-plugin/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritCompileMojo.java @@ -11,18 +11,19 @@ import org.apache.maven.project.MavenProject; import java.util.List; -@Mojo(name = "compile", defaultPhase = LifecyclePhase.NONE, - requiresDependencyResolution = ResolutionScope.COMPILE) +@Mojo(name = "compile", defaultPhase = LifecyclePhase.NONE, requiresDependencyResolution = ResolutionScope.COMPILE) public class SpiritCompileMojo extends AbstractMojo { @Parameter(defaultValue = "${project}") public MavenProject project; @Parameter private String inputPath; - @Parameter - private String outputPath; + @Parameter(defaultValue = "none") + private String targetPackage; @Parameter(defaultValue = "sp") private String fileExtension; + @Parameter + private String outputPath; @Parameter(defaultValue = "java.lang") private String langPackage; @Parameter(defaultValue = "java.util") @@ -41,8 +42,9 @@ public class SpiritCompileMojo extends AbstractMojo { getLog().info(""); getLog().info("-----------------------[ parameters ]------------------------"); getLog().info("inputPath = " + inputPath); - getLog().info("outputPath = " + outputPath); + getLog().info("targetPackage = " + targetPackage); getLog().info("fileExtension = " + fileExtension); + getLog().info("outputPath = " + outputPath); getLog().info("langPackage = " + langPackage); getLog().info("utilPackage = " + utilPackage); getLog().info("useLombok = " + useLombok); @@ -54,14 +56,15 @@ public class SpiritCompileMojo extends AbstractMojo { classPaths.forEach(getLog()::info); getLog().info(""); - JavaStarter.main(new String[]{ // - "--inputPath=" + inputPath, // - "--outputPath=" + outputPath, // - "--fileExtension=" + fileExtension, // - "--langPackage=" + langPackage, // - "--utilPackage=" + utilPackage, // - "--useLombok=" + useLombok, // - "--classPaths=" + Joiner.on(", ").join(classPaths) // + JavaStarter.main(new String[]{ + "--inputPath=" + inputPath, + "--targetPackage=" + targetPackage, + "--fileExtension=" + fileExtension, + "--outputPath=" + outputPath, + "--langPackage=" + langPackage, + "--utilPackage=" + utilPackage, + "--useLombok=" + useLombok, + "--classPaths=" + Joiner.on(", ").join(classPaths) }); } catch (Exception e) { @@ -70,24 +73,44 @@ public class SpiritCompileMojo extends AbstractMojo { } public static void main(String[] args) { + String OSName = System.getProperty("os.name"); String userHome = System.getProperty("user.home"); - String inputPath = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\src\\main\\resources\\sources"; - String outputPath = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\src\\main\\java"; - String classPaths = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\target\\classes, "; - classPaths += userHome + "\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-example-dependency\\2.1.30\\spirit-example-dependency-2.1.30.jar, "; - classPaths += userHome + "\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-stdlib\\2.1.30\\spirit-stdlib-2.1.30.jar, "; - classPaths += userHome + "\\.m2\\repository\\org\\slf4j\\slf4j-api\\1.7.25\\slf4j-api-1.7.25.jar, "; - classPaths += userHome + "\\.m2\\repository\\org\\apache\\commons\\commons-lang3\\3.9\\commons-lang3-3.9.jar, "; - classPaths += userHome + "\\.m2\\repository\\tk\\mybatis\\mapper\\4.0.0\\mapper-4.0.0.jar, "; - classPaths += "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\target\\test-classes"; - JavaStarter.main(new String[]{ // - "--inputPath=" + inputPath, // - "--outputPath=" + outputPath, // - "--fileExtension=" + "sp", // - "--langPackage=" + "java.lang", // - "--utilPackage=" + "java.util", // - "--useLombok=" + "true", // - "--classPaths=" + classPaths // + String inputPath; + String targetPackage = "none"; +// String targetPackage = "com.gitee.spirit.example.type"; + String outputPath; + String classPaths; + if ("Mac OS X".equals(OSName)) { + inputPath = userHome + "/Work/CloudSpace/spirit-example/spirit-example-plugin/src/main/resources/sources"; + outputPath = userHome + "/Work/CloudSpace/spirit-example/spirit-example-plugin/src/main/java"; + classPaths = userHome + "/Work/CloudSpace/spirit-example/spirit-example-plugin/target/classes, "; + classPaths += userHome + "/.m2/repository/com/gitee/digital-engine/spirit-example-dependency/3.0.0/spirit-example-dependency-3.0.0.jar, "; + classPaths += userHome + "/.m2/repository/com/gitee/digital-engine/spirit-stdlib/3.0.0/spirit-stdlib-3.0.0.jar, "; + classPaths += userHome + "/.m2/repository/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar, "; + classPaths += userHome + "/.m2/repository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar, "; + classPaths += userHome + "/.m2/repository/tk/mybatis/mapper/4.0.0/mapper-4.0.0.jar, "; + classPaths += userHome + "/Work/CloudSpace/spirit-example/spirit-example-plugin/target/test-classes"; + + } else { + inputPath = "D:\\Work\\CloudSpace\\spirit-example\\spirit-example-plugin\\src\\main\\resources\\sources"; + outputPath = "D:\\Work\\CloudSpace\\spirit-example\\spirit-example-plugin\\src\\main\\java"; + classPaths = "D:\\Work\\CloudSpace\\spirit-example\\spirit-example-plugin\\target\\classes, "; + classPaths += userHome + "\\.m2\\repository\\com\\gitee\\digital-engine\\spirit-example-dependency\\3.0.0\\spirit-example-dependency-3.0.0.jar, "; + classPaths += userHome + "\\.m2\\repository\\com\\gitee\\digital-engine\\spirit-stdlib\\3.0.0\\spirit-stdlib-3.0.0.jar, "; + classPaths += userHome + "\\.m2\\repository\\org\\slf4j\\slf4j-api\\1.7.25\\slf4j-api-1.7.25.jar, "; + classPaths += userHome + "\\.m2\\repository\\org\\apache\\commons\\commons-lang3\\3.9\\commons-lang3-3.9.jar, "; + classPaths += userHome + "\\.m2\\repository\\tk\\mybatis\\mapper\\4.0.0\\mapper-4.0.0.jar, "; + classPaths += "D:\\Work\\CloudSpace\\spirit-example\\spirit-example-plugin\\target\\test-classes"; + } + JavaStarter.main(new String[]{ + "--inputPath=" + inputPath, + "--targetPackage=" + targetPackage, + "--fileExtension=" + "sp", + "--outputPath=" + outputPath, + "--langPackage=" + "java.lang", + "--utilPackage=" + "java.util", + "--useLombok=" + "true", + "--classPaths=" + classPaths }); } } diff --git a/spirit-plugin/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritGenerateConfigMojo.java b/spirit-plugin/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritGenerateConfigMojo.java new file mode 100644 index 0000000000000000000000000000000000000000..1cb392e64bd9a7092fa77d7db26aca9ad30dcd53 --- /dev/null +++ b/spirit-plugin/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritGenerateConfigMojo.java @@ -0,0 +1,81 @@ +package com.gitee.spirit.maven.plugin; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.setting.dialect.Props; +import com.google.common.base.Joiner; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; + +import java.io.File; +import java.util.List; + +@Mojo(name = "generateConfig", defaultPhase = LifecyclePhase.NONE, requiresDependencyResolution = ResolutionScope.COMPILE) +public class SpiritGenerateConfigMojo extends AbstractMojo { + + @Parameter(defaultValue = "${project}") + public MavenProject project; + @Parameter + private String inputPath; + @Parameter(defaultValue = "none") + private String targetPackage; + @Parameter(defaultValue = "sp") + private String fileExtension; + @Parameter + private String outputPath; + @Parameter(defaultValue = "java.lang") + private String langPackage; + @Parameter(defaultValue = "java.util") + private String utilPackage; + @Parameter(defaultValue = "true") + private String useLombok; + + public void execute() { + try { + if (inputPath == null) { + inputPath = project.getResources().get(0).getDirectory(); + inputPath = inputPath.endsWith("\\resources") ? inputPath + "\\sources" : inputPath + "/sources"; + } + outputPath = outputPath == null ? project.getBuild().getSourceDirectory() : outputPath; + + getLog().info(""); + getLog().info("-----------------------[ parameters ]------------------------"); + getLog().info("inputPath = " + inputPath); + getLog().info("targetPackage = " + targetPackage); + getLog().info("fileExtension = " + fileExtension); + getLog().info("outputPath = " + outputPath); + getLog().info("langPackage = " + langPackage); + getLog().info("utilPackage = " + utilPackage); + getLog().info("useLombok = " + useLombok); + getLog().info(""); + + getLog().info("-----------------------------[ classPaths ]-----------------------------"); + List classPaths = project.getCompileClasspathElements(); + classPaths.add(project.getBuild().getTestOutputDirectory()); + classPaths.forEach(getLog()::info); + getLog().info(""); + + String configPath = inputPath.endsWith("\\") ? inputPath + "\\compile_env.properties" : inputPath + "/compile_env.properties"; + File file = new File(configPath); + if (!file.exists()) file.createNewFile(); + + Props props = new Props(); + props.setProperty("inputPath", inputPath); + props.setProperty("targetPackage", targetPackage); + props.setProperty("fileExtension", fileExtension); + props.setProperty("outputPath", outputPath); + props.setProperty("langPackage", langPackage); + props.setProperty("utilPackage", utilPackage); + props.setProperty("useLombok", useLombok); + props.setProperty("classPaths", Joiner.on(", ").join(classPaths)); + props.store(configPath); + + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/spirit-starter/pom.xml b/spirit-starter/pom.xml index a22b0d520b92fe17006857e3367e3cda4d7d2b02..76d2e473ab2eef0713f274c32a25835e1b416925 100644 --- a/spirit-starter/pom.xml +++ b/spirit-starter/pom.xml @@ -1,16 +1,18 @@ - 4.0.0 - - com.gitee.chentaoah - spirit-parent - 3.0.0 - - spirit-starter - pom - - spirit-starter-java - spirit-starter-editor + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + com.gitee.digital-engine + spirit-parent + 3.0.0 + + spirit-starter + pom + + + spirit-starter-core + spirit-starter-java + \ No newline at end of file diff --git a/spirit-starter/spirit-starter-editor/pom.xml b/spirit-starter/spirit-starter-core/pom.xml similarity index 66% rename from spirit-starter/spirit-starter-editor/pom.xml rename to spirit-starter/spirit-starter-core/pom.xml index 9ff1f68bc94d8fc70750689d7e7eda6a4690133e..0911849c6c078804553e075176a8540a8b6a7cd4 100644 --- a/spirit-starter/spirit-starter-editor/pom.xml +++ b/spirit-starter/spirit-starter-core/pom.xml @@ -4,20 +4,23 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-starter 3.0.0 - spirit-starter-editor + spirit-starter-core + - com.gitee.chentaoah + com.gitee.digital-engine spirit-core3-xcode ${project.version} - org.springframework.boot - spring-boot-starter-web + com.gitee.digital-engine + spirit-data-plugin + ${project.version} + \ No newline at end of file diff --git a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/CodeToolsStarter.java b/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/CodeToolsStarter.java deleted file mode 100644 index 99b16a2197de77573aeb69373e107aba4e872a0f..0000000000000000000000000000000000000000 --- a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/CodeToolsStarter.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gitee.spirit.code.tools; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication(scanBasePackages = "com.gitee.spirit") -public class CodeToolsStarter { - public static void main(String[] args) { - SpringApplication.run(CodeToolsStarter.class, args); - } -} diff --git a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/controller/CodeToolsController.java b/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/controller/CodeToolsController.java deleted file mode 100644 index b85dc89ec2775e01abbfb0eeba9d6a1b4475629a..0000000000000000000000000000000000000000 --- a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/controller/CodeToolsController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gitee.spirit.code.tools.controller; - -import com.gitee.spirit.code.tools.pojo.MethodInfo; -import com.gitee.spirit.code.tools.pojo.Result; -import com.gitee.spirit.code.tools.service.MethodService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.Map; - -@RestController -@RequestMapping("/spirit/kit") -public class CodeToolsController { - - @Autowired - public MethodService service; - - @PostMapping("/getMethodInfos") - public Result> getMethodInfos(@RequestBody Map params) { -// String filePath = (String) params.get("filePath"); -// String content = (String) params.get("content"); -// Integer lineNumber = (Integer) params.get("lineNumber"); -// List methodInfos = service.getMethodInfos(filePath, content, lineNumber); -// return Result.success(methodInfos); - return null; - } - -} diff --git a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java b/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java deleted file mode 100644 index 70129b78bdfd023ee45832249ef8dcf38e285379..0000000000000000000000000000000000000000 --- a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gitee.spirit.code.tools.core; - -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - -@Primary -@Component -public class CustomClassLoader /*extends AppClassLoader*/ { - -// public IClass loadClass(String name, InputStream input, String... arguments) { -// // 清理所有的上一次编译的缓存信息 -// clear(); -// Map classes = compiler.compile(name, input, arguments); -// this.classes.putAll(classes); -// resolveClasses(classes); -// visitClasses(getAllClasses()); -// return loadClass(name); -// } -// -// public void resolveClasses(Map classes) { -// classes.values().forEach(clazz -> { -// Set classNames = importer.dependencies(clazz); -// classNames.forEach(className -> { -// if (contains(className) && loadClass(className) == null) { -// // 注意:这里间接要求,部分编译时,依赖项目不能是内部类 -// Map classes0 = compiler.compile(className, FileUtils.asStream(getResource(className))); -// this.classes.putAll(classes0); -// resolveClasses(classes0); -// } -// }); -// }); -// } -// -// public String getName(String filePath) { -// URL fileUrl = FileUtils.toURL(new File(filePath)); -// for (Map.Entry entry : urls.entrySet()) { -// if (fileUrl.sameFile(entry.getValue())) { -// return entry.getKey(); -// } -// } -// return null; -// } - -} diff --git a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java b/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java deleted file mode 100644 index a339bf37663092ac657e78cf43d3ef7188a3d260..0000000000000000000000000000000000000000 --- a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gitee.spirit.code.tools.core; - -import org.springframework.stereotype.Component; - -@Component -public class ElementSelector /*extends CoreCompiler*/ { - -// @Autowired -// public ElementVisitor visitor; -// -// public IType findElementAndGetType(IClass clazz, Integer lineNumber) { -//// Element element = findElement(Arrays.asList(clazz.element), lineNumber); -//// if (element != null) { -//// IVariable variable = visitor.getVariableIfPossible(clazz, element); -//// return variable.getType(); -//// } -// return null; -// } -// -// public Element findElement(List elements, Integer lineNumber) { -// for (Element element : elements) { -// if (element.line.number == lineNumber) { -// return element; -// } -// if (element.hasChild()) { -// Element subElement = findElement(element.children, lineNumber); -// if (subElement != null) { -// return subElement; -// } -// } -// } -// return null; -// } - -} diff --git a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/pojo/Result.java b/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/pojo/Result.java deleted file mode 100644 index 186da16c0e37eed9b239dab86bab8e9c378744bb..0000000000000000000000000000000000000000 --- a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/pojo/Result.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gitee.spirit.code.tools.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class Result implements Serializable { - - private static final long serialVersionUID = 1322531227433710974L; - private Integer code; - private String msg; - private T data; - - public static Result success(T data) { - return new Result(200, "success", data); - } - - public static Result failed(String message) { - return new Result(500, message, null); - } - -} diff --git a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/service/MethodService.java b/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/service/MethodService.java deleted file mode 100644 index 0673a8e09d0f53cb526c37d8a828e077a72d19b3..0000000000000000000000000000000000000000 --- a/spirit-starter/spirit-starter-editor/src/main/java/com/gitee/spirit/code/tools/service/MethodService.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.gitee.spirit.code.tools.service; - -import org.springframework.stereotype.Service; - -@Service -public class MethodService { - -// @Autowired -// public CustomClassLoader loader; -// @Autowired -// public ElementSelector selector; -// @Autowired -// public ClassLinker linker; - -// public List getMethodInfos(String filePath, String content, Integer lineNumber) { -// -// // 删除后面的行,将该行进行补全,然后截断,剩下待推导部分 -// Map result = completeCode(content, lineNumber); -// content = result.get("content"); -// String incompleteName = result.get("incompleteName"); -// -// // 根据文件名,获取className -// String className = loader.getName(filePath); -// // 找到对应class,并找到印记,获取推导出的类型,并返回所有该类型的方法信息 -// IClass clazz = loader.loadClass(className, IoUtil.toStream(content, Constants.DEFAULT_CHARSET)); -// IType type = selector.findElementAndGetType(clazz, lineNumber); -// Object clazzObj = linker.toClass(type); -// -// List methodInfos = new ArrayList<>(); -// if (clazzObj instanceof IClass) { -// for (IMethod method : ((IClass) clazzObj).methods) { -// if (method.getName().startsWith(incompleteName)) { -// methodInfos.add(createMethodInfo(method, incompleteName)); -// } -// } -// } else if (clazzObj instanceof Class) { -// for (Method method : ((Class) clazzObj).getMethods()) { -// if (method.getName().startsWith(incompleteName)) { -// methodInfos.add(createMethodInfo(method, incompleteName)); -// } -// } -// } -// return methodInfos; -// } -// -// public Map completeCode(String content, Integer lineNumber) { -// Map result = new HashMap<>(); -// List lines = IoUtil.readLines(new StringReader(content), new ArrayList()); -// String line = lines.get(lineNumber - 1); -// if (line.contains("@")) { -// String indent = new Line(line).getIndent();// 缩进 -// line = line.trim(); -// int index = line.indexOf('@'); -// line = line.substring(0, index + 1); -// for (int idx = index - 1; idx >= 0; idx--) { -// char c = line.charAt(idx); -// if (c == '(' || c == '[' || c == '{' || c == '<') { -// boolean isMatch = matches(line, idx, c); -// if (!isMatch) { -// line = line.substring(idx + 1); -// } -// } else if (c == ',') { -// line = line.substring(idx + 1); -// } -// } -// String incompleteName = line.substring(line.lastIndexOf('.') + 1, line.lastIndexOf('@')); -// result.put("incompleteName", incompleteName); -// line = line.substring(0, line.lastIndexOf('.')); -// if (!line.startsWith("return")) { -// line = "return " + line; -// } -// lines.set(lineNumber - 1, indent + line); -// -// } else { -// throw new RuntimeException("No symbol '@' found!"); -// } -// StringBuilder builder = new StringBuilder(); -// lines.forEach(line0 -> builder.append(line0 + "\n")); -// result.put("content", builder.toString()); -// return result; -// } -// -// public boolean matches(String line, int index, char leftChar) { -// char rigthChar = LineUtils.flipChar(leftChar); -// int end = LineUtils.findEndIndex(line, index, leftChar, rigthChar); -// return end != -1; -// } -// -// public MethodInfo createMethodInfo(IMethod method, String incompleteName) { -// String tipText = method.toString(); -// String actualText = method.toSimpleString(); -// if (actualText.startsWith(incompleteName)) { -// actualText = actualText.replace(incompleteName, ""); -// } -// return new MethodInfo(tipText, actualText); -// } -// -// public MethodInfo createMethodInfo(Method method, String incompleteName) { -// String tipText = method.toString(); -// String actualText = method.toString(); -// return new MethodInfo(tipText, actualText); -// } - -} diff --git a/spirit-starter/spirit-starter-editor/src/main/resources/application.properties b/spirit-starter/spirit-starter-editor/src/main/resources/application.properties deleted file mode 100644 index dde2df47a3e87238ad53bb0925a55e24fe6b985e..0000000000000000000000000000000000000000 --- a/spirit-starter/spirit-starter-editor/src/main/resources/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.profiles.active=tools -server.port=8729 \ No newline at end of file diff --git a/spirit-starter/spirit-starter-java/pom.xml b/spirit-starter/spirit-starter-java/pom.xml index f38bb2592406786fef288b910dada57c6df336de..79e583dca95862c5c98f699177e3b93bdd20de2a 100644 --- a/spirit-starter/spirit-starter-java/pom.xml +++ b/spirit-starter/spirit-starter-java/pom.xml @@ -3,21 +3,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-starter 3.0.0 spirit-starter-java + - com.gitee.chentaoah - spirit-core3-xcode - ${project.version} - - - com.gitee.chentaoah - spirit-data-plugin + com.gitee.digital-engine + spirit-starter-core ${project.version} + \ No newline at end of file diff --git a/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaRunner.java b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaRunner.java index df0c5c894e1824df5b3bb41bd7128b1410dfad2e..4ff8e0a2f86b73149c5fd0a7cf4afb606245c461 100644 --- a/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaRunner.java +++ b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaRunner.java @@ -7,6 +7,8 @@ import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; +import java.util.Properties; + @Component @Profile("compile") public class JavaRunner implements ApplicationRunner { @@ -16,7 +18,7 @@ public class JavaRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { - coreCompiler.compile(args.getSourceArgs()); + coreCompiler.compile(new Properties()); } } diff --git a/spirit-stdlib/pom.xml b/spirit-stdlib/pom.xml index e86d1cd0ca9a4634595139ebd59bcfb3ec9fbcc9..fe57c2412720b075151125cdd50cb2dcd394a2f7 100644 --- a/spirit-stdlib/pom.xml +++ b/spirit-stdlib/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah + com.gitee.digital-engine spirit-parent 3.0.0 diff --git a/spirit-example/spirit-example-dependency/pom.xml b/spirit-test/pom.xml similarity index 35% rename from spirit-example/spirit-example-dependency/pom.xml rename to spirit-test/pom.xml index 423b2efd6976955ec3ee1ed59235f11af2adc300..49a92380120639ba44127dea425be1daa6970f44 100644 --- a/spirit-example/spirit-example-dependency/pom.xml +++ b/spirit-test/pom.xml @@ -1,35 +1,33 @@ + + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.chentaoah - spirit-example + com.gitee.digital-engine + spirit-parent 3.0.0 - spirit-example-dependency + spirit-test + - com.gitee.chentaoah - spirit-stdlib + com.gitee.digital-engine + spirit-starter-core ${project.version} + - org.slf4j - slf4j-api - - - org.projectlombok - lombok - - - org.apache.commons - commons-lang3 - - - tk.mybatis - mapper - 4.0.0 + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + \ No newline at end of file diff --git a/spirit-core3/spirit-core3-compile/src/test/java/com/gitee/spirit/test/LexerTest.java b/spirit-test/src/test/java/com/gitee/spirit/test/LexerTest.java similarity index 45% rename from spirit-core3/spirit-core3-compile/src/test/java/com/gitee/spirit/test/LexerTest.java rename to spirit-test/src/test/java/com/gitee/spirit/test/LexerTest.java index aead25be7740fa6a87d0abb206c8bd4ae44d7810..bfb4fc9bca7401b41f1923e79075c977a5992c55 100644 --- a/spirit-core3/spirit-core3-compile/src/test/java/com/gitee/spirit/test/LexerTest.java +++ b/spirit-test/src/test/java/com/gitee/spirit/test/LexerTest.java @@ -1,47 +1,36 @@ package com.gitee.spirit.test; import com.gitee.spirit.core3.compile.api.CoreLexer; -import com.gitee.spirit.core3.compile.api.LexerFactory; -import com.gitee.spirit.core3.compile.entity.ParseContext; +import com.gitee.spirit.core3.compile.api.CoreLexerFactory; + import com.gitee.spirit.core3.compile.entity.Region; -import com.gitee.spirit.core3.compile.impl.DefaultCoreLexer; import com.gitee.spirit.core3.compile.utils.RegionUtils; import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.ApplicationContext; -import org.springframework.core.env.Environment; import java.util.Arrays; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - @Slf4j @SpringBootTest @DisplayName("词法测试") public class LexerTest { @Autowired - private Environment environment; - @Autowired - private ApplicationContext applicationContext; - @Autowired - public LexerFactory lexerFactory; + public CoreLexerFactory coreLexerFactory; public List getWords(String text) { - ParseContext parseContext = new ParseContext(environment, applicationContext); - CoreLexer coreLexer = lexerFactory.newLexer(parseContext, text); + CoreLexer coreLexer = coreLexerFactory.newLexer(text); List regions = coreLexer.parseRegions(); return RegionUtils.subRegions(text, regions); } private List getSubWords(String text, Character... characters) { - ParseContext parseContext = new ParseContext(environment, applicationContext); - CoreLexer coreLexer = lexerFactory.newLexer(parseContext, text, Arrays.asList(characters)); + CoreLexer coreLexer = coreLexerFactory.newLexer(text, Arrays.asList(characters)); List regions = coreLexer.parseRegions(); return RegionUtils.subRegions(text, regions); } @@ -52,11 +41,11 @@ public class LexerTest { String text = "name = \"Jessie\""; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "name"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "\"Jessie\""); + Assertions.assertEquals(words.get(count++), "name"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "\"Jessie\""); } @Test @@ -65,11 +54,11 @@ public class LexerTest { String text = "ch = 'c'"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "ch"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "'c'"); + Assertions.assertEquals(words.get(count++), "ch"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "'c'"); } @Test @@ -78,11 +67,11 @@ public class LexerTest { String text = "horse = {\"name\" : \"Jessie\"}"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "horse"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "{\"name\" : \"Jessie\"}"); + Assertions.assertEquals(words.get(count++), "horse"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "{\"name\" : \"Jessie\"}"); } @Test @@ -91,13 +80,13 @@ public class LexerTest { String text = "{\"name\" : \"Jessie\"}"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 5); + Assertions.assertEquals(5, words.size()); int count = 0; - assertEquals(words.get(count++), "{"); - assertEquals(words.get(count++), "\"name\""); - assertEquals(words.get(count++), ":"); - assertEquals(words.get(count++), "\"Jessie\""); - assertEquals(words.get(count++), "}"); + Assertions.assertEquals(words.get(count++), "{"); + Assertions.assertEquals(words.get(count++), "\"name\""); + Assertions.assertEquals(words.get(count++), ":"); + Assertions.assertEquals(words.get(count++), "\"Jessie\""); + Assertions.assertEquals(words.get(count++), "}"); } @Test @@ -106,13 +95,13 @@ public class LexerTest { String text = "{\"horse\" : {\"name\" : \"Jessie\"}}"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 5); + Assertions.assertEquals(5, words.size()); int count = 0; - assertEquals(words.get(count++), "{"); - assertEquals(words.get(count++), "\"horse\""); - assertEquals(words.get(count++), ":"); - assertEquals(words.get(count++), "{\"name\" : \"Jessie\"}"); - assertEquals(words.get(count++), "}"); + Assertions.assertEquals(words.get(count++), "{"); + Assertions.assertEquals(words.get(count++), "\"horse\""); + Assertions.assertEquals(words.get(count++), ":"); + Assertions.assertEquals(words.get(count++), "{\"name\" : \"Jessie\"}"); + Assertions.assertEquals(words.get(count++), "}"); } @Test @@ -121,11 +110,11 @@ public class LexerTest { String text = "func call() {"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "func"); - assertEquals(words.get(count++), "call()"); - assertEquals(words.get(count++), "{"); + Assertions.assertEquals(words.get(count++), "func"); + Assertions.assertEquals(words.get(count++), "call()"); + Assertions.assertEquals(words.get(count++), "{"); } @Test @@ -134,14 +123,14 @@ public class LexerTest { String text = "call(name, age)"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 6); + Assertions.assertEquals(6, words.size()); int count = 0; - assertEquals(words.get(count++), "call"); - assertEquals(words.get(count++), "("); - assertEquals(words.get(count++), "name"); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "age"); - assertEquals(words.get(count++), ")"); + Assertions.assertEquals(words.get(count++), "call"); + Assertions.assertEquals(words.get(count++), "("); + Assertions.assertEquals(words.get(count++), "name"); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "age"); + Assertions.assertEquals(words.get(count++), ")"); } @Test @@ -150,11 +139,11 @@ public class LexerTest { String text = "horses = [horse0, horse1, horse2]"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "horses"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "[horse0, horse1, horse2]"); + Assertions.assertEquals(words.get(count++), "horses"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "[horse0, horse1, horse2]"); } @Test @@ -163,15 +152,15 @@ public class LexerTest { String text = "[horse0, horse1, horse2]"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 7); + Assertions.assertEquals(7, words.size()); int count = 0; - assertEquals(words.get(count++), "["); - assertEquals(words.get(count++), "horse0"); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "horse1"); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "horse2"); - assertEquals(words.get(count++), "]"); + Assertions.assertEquals(words.get(count++), "["); + Assertions.assertEquals(words.get(count++), "horse0"); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "horse1"); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "horse2"); + Assertions.assertEquals(words.get(count++), "]"); } @Test @@ -180,15 +169,15 @@ public class LexerTest { String text = "[[horse0], horse1, horse2]"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 7); + Assertions.assertEquals(7, words.size()); int count = 0; - assertEquals(words.get(count++), "["); - assertEquals(words.get(count++), "[horse0]"); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "horse1"); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "horse2"); - assertEquals(words.get(count++), "]"); + Assertions.assertEquals(words.get(count++), "["); + Assertions.assertEquals(words.get(count++), "[horse0]"); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "horse1"); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "horse2"); + Assertions.assertEquals(words.get(count++), "]"); } @Test @@ -197,11 +186,11 @@ public class LexerTest { String text = "horses = Horse[1]"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "horses"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "Horse[1]"); + Assertions.assertEquals(words.get(count++), "horses"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "Horse[1]"); } @Test @@ -210,12 +199,12 @@ public class LexerTest { String text = "Horse[1]"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 4); + Assertions.assertEquals(4, words.size()); int count = 0; - assertEquals(words.get(count++), "Horse"); - assertEquals(words.get(count++), "["); - assertEquals(words.get(count++), "1"); - assertEquals(words.get(count++), "]"); + Assertions.assertEquals(words.get(count++), "Horse"); + Assertions.assertEquals(words.get(count++), "["); + Assertions.assertEquals(words.get(count++), "1"); + Assertions.assertEquals(words.get(count++), "]"); } // @Test @@ -240,12 +229,12 @@ public class LexerTest { String text = "horse = horses[0]"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 4); + Assertions.assertEquals(4, words.size()); int count = 0; - assertEquals(words.get(count++), "horse"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "horses"); - assertEquals(words.get(count++), "[0]"); + Assertions.assertEquals(words.get(count++), "horse"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "horses"); + Assertions.assertEquals(words.get(count++), "[0]"); } @Test @@ -254,12 +243,12 @@ public class LexerTest { String text = "horses[0]"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 4); + Assertions.assertEquals(4, words.size()); int count = 0; - assertEquals(words.get(count++), "horses"); - assertEquals(words.get(count++), "["); - assertEquals(words.get(count++), "0"); - assertEquals(words.get(count++), "]"); + Assertions.assertEquals(words.get(count++), "horses"); + Assertions.assertEquals(words.get(count++), "["); + Assertions.assertEquals(words.get(count++), "0"); + Assertions.assertEquals(words.get(count++), "]"); } @Test @@ -268,11 +257,11 @@ public class LexerTest { String text = "class Horse {"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "class"); - assertEquals(words.get(count++), "Horse"); - assertEquals(words.get(count++), "{"); + Assertions.assertEquals(words.get(count++), "class"); + Assertions.assertEquals(words.get(count++), "Horse"); + Assertions.assertEquals(words.get(count++), "{"); } @Test @@ -281,14 +270,14 @@ public class LexerTest { String text = "Horse"; List words = getSubWords(text, '<', '>'); log.info(words.toString()); - assertTrue(words.size() == 6); + Assertions.assertEquals(6, words.size()); int count = 0; - assertEquals(words.get(count++), "Horse"); - assertEquals(words.get(count++), "<"); - assertEquals(words.get(count++), "T"); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "K"); - assertEquals(words.get(count++), ">"); + Assertions.assertEquals(words.get(count++), "Horse"); + Assertions.assertEquals(words.get(count++), "<"); + Assertions.assertEquals(words.get(count++), "T"); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "K"); + Assertions.assertEquals(words.get(count++), ">"); } @Test @@ -297,14 +286,14 @@ public class LexerTest { String text = "Horse, Object>"; List words = getSubWords(text, '<', '>'); log.info(words.toString()); - assertTrue(words.size() == 6); + Assertions.assertEquals(6, words.size()); int count = 0; - assertEquals(words.get(count++), "Horse"); - assertEquals(words.get(count++), "<"); - assertEquals(words.get(count++), "Horse"); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "Object"); - assertEquals(words.get(count++), ">"); + Assertions.assertEquals(words.get(count++), "Horse"); + Assertions.assertEquals(words.get(count++), "<"); + Assertions.assertEquals(words.get(count++), "Horse"); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "Object"); + Assertions.assertEquals(words.get(count++), ">"); } @Test @@ -313,11 +302,11 @@ public class LexerTest { String text = "horse = Horse()"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "horse"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "Horse()"); + Assertions.assertEquals(words.get(count++), "horse"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "Horse()"); } @Test @@ -326,11 +315,11 @@ public class LexerTest { String text = "Horse()"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "Horse"); - assertEquals(words.get(count++), "("); - assertEquals(words.get(count++), ")"); + Assertions.assertEquals(words.get(count++), "Horse"); + Assertions.assertEquals(words.get(count++), "("); + Assertions.assertEquals(words.get(count++), ")"); } @Test @@ -339,11 +328,11 @@ public class LexerTest { String text = "Horse, Object>()"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "Horse, Object>"); - assertEquals(words.get(count++), "("); - assertEquals(words.get(count++), ")"); + Assertions.assertEquals(words.get(count++), "Horse, Object>"); + Assertions.assertEquals(words.get(count++), "("); + Assertions.assertEquals(words.get(count++), ")"); } @Test @@ -352,11 +341,11 @@ public class LexerTest { String text = "xxxxG_Alias=\"Clock moved backwards.G_Alias to generate id for %d milliseconds\""; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "xxxxG_Alias"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "\"Clock moved backwards.G_Alias to generate id for %d milliseconds\""); + Assertions.assertEquals(words.get(count++), "xxxxG_Alias"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "\"Clock moved backwards.G_Alias to generate id for %d milliseconds\""); } @Test @@ -365,13 +354,13 @@ public class LexerTest { String text = "if s==\"hello\"{"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 5); + Assertions.assertEquals(5, words.size()); int count = 0; - assertEquals(words.get(count++), "if"); - assertEquals(words.get(count++), "s"); - assertEquals(words.get(count++), "=="); - assertEquals(words.get(count++), "\"hello\""); - assertEquals(words.get(count++), "{"); + Assertions.assertEquals(words.get(count++), "if"); + Assertions.assertEquals(words.get(count++), "s"); + Assertions.assertEquals(words.get(count++), "=="); + Assertions.assertEquals(words.get(count++), "\"hello\""); + Assertions.assertEquals(words.get(count++), "{"); } @Test @@ -380,16 +369,16 @@ public class LexerTest { String text = "b=father.child.father.child.father.name"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 8); + Assertions.assertEquals(8, words.size()); int count = 0; - assertEquals(words.get(count++), "b"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "father"); - assertEquals(words.get(count++), ".child"); - assertEquals(words.get(count++), ".father"); - assertEquals(words.get(count++), ".child"); - assertEquals(words.get(count++), ".father"); - assertEquals(words.get(count++), ".name"); + Assertions.assertEquals(words.get(count++), "b"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "father"); + Assertions.assertEquals(words.get(count++), ".child"); + Assertions.assertEquals(words.get(count++), ".father"); + Assertions.assertEquals(words.get(count++), ".child"); + Assertions.assertEquals(words.get(count++), ".father"); + Assertions.assertEquals(words.get(count++), ".name"); } @Test @@ -398,16 +387,16 @@ public class LexerTest { String text = ".format(\"Clock moved backwards.Refusing to generate id for %d milliseconds\", lastTimestamp - timestamp)"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 8); + Assertions.assertEquals(8, words.size()); int count = 0; - assertEquals(words.get(count++), ".format"); - assertEquals(words.get(count++), "("); - assertEquals(words.get(count++), "\"Clock moved backwards.Refusing to generate id for %d milliseconds\""); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "lastTimestamp"); - assertEquals(words.get(count++), "-"); - assertEquals(words.get(count++), "timestamp"); - assertEquals(words.get(count++), ")"); + Assertions.assertEquals(words.get(count++), ".format"); + Assertions.assertEquals(words.get(count++), "("); + Assertions.assertEquals(words.get(count++), "\"Clock moved backwards.Refusing to generate id for %d milliseconds\""); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "lastTimestamp"); + Assertions.assertEquals(words.get(count++), "-"); + Assertions.assertEquals(words.get(count++), "timestamp"); + Assertions.assertEquals(words.get(count++), ")"); } @Test @@ -416,11 +405,11 @@ public class LexerTest { String text = "user = User{name = \"chen\", age = \"30\"}"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "user"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "User{name = \"chen\", age = \"30\"}"); + Assertions.assertEquals(words.get(count++), "user"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "User{name = \"chen\", age = \"30\"}"); } @Test @@ -429,18 +418,18 @@ public class LexerTest { String text = "User{name = \"chen\", age = \"30\"}"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 10); + Assertions.assertEquals(10, words.size()); int count = 0; - assertEquals(words.get(count++), "User"); - assertEquals(words.get(count++), "{"); - assertEquals(words.get(count++), "name"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "\"chen\""); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "age"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "\"30\""); - assertEquals(words.get(count++), "}"); + Assertions.assertEquals(words.get(count++), "User"); + Assertions.assertEquals(words.get(count++), "{"); + Assertions.assertEquals(words.get(count++), "name"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "\"chen\""); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "age"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "\"30\""); + Assertions.assertEquals(words.get(count++), "}"); } @Test @@ -449,11 +438,11 @@ public class LexerTest { String text = "user = ${name = \"chen\", age = \"30\"}"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 3); + Assertions.assertEquals(3, words.size()); int count = 0; - assertEquals(words.get(count++), "user"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "${name = \"chen\", age = \"30\"}"); + Assertions.assertEquals(words.get(count++), "user"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "${name = \"chen\", age = \"30\"}"); } @Test @@ -462,18 +451,18 @@ public class LexerTest { String text = "${name = \"chen\", age = \"30\"}"; List words = getSubWords(text, '(', ')', '[', ']', '{', '}'); log.info(words.toString()); - assertTrue(words.size() == 10); + Assertions.assertEquals(10, words.size()); int count = 0; - assertEquals(words.get(count++), "$"); - assertEquals(words.get(count++), "{"); - assertEquals(words.get(count++), "name"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "\"chen\""); - assertEquals(words.get(count++), ","); - assertEquals(words.get(count++), "age"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "\"30\""); - assertEquals(words.get(count++), "}"); + Assertions.assertEquals(words.get(count++), "$"); + Assertions.assertEquals(words.get(count++), "{"); + Assertions.assertEquals(words.get(count++), "name"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "\"chen\""); + Assertions.assertEquals(words.get(count++), ","); + Assertions.assertEquals(words.get(count++), "age"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "\"30\""); + Assertions.assertEquals(words.get(count++), "}"); } @Test @@ -482,21 +471,21 @@ public class LexerTest { String text = "number = 10.0 + father.child0 + father.1child(xxx).0father + father.ch1ild(abcd)"; List words = getWords(text); log.info(words.toString()); - assertTrue(words.size() == 13); + Assertions.assertEquals(13, words.size()); int count = 0; - assertEquals(words.get(count++), "number"); - assertEquals(words.get(count++), "="); - assertEquals(words.get(count++), "10.0"); - assertEquals(words.get(count++), "+"); - assertEquals(words.get(count++), "father"); - assertEquals(words.get(count++), ".child0"); - assertEquals(words.get(count++), "+"); - assertEquals(words.get(count++), "father"); - assertEquals(words.get(count++), ".1child(xxx)"); - assertEquals(words.get(count++), ".0father"); - assertEquals(words.get(count++), "+"); - assertEquals(words.get(count++), "father"); - assertEquals(words.get(count++), ".ch1ild(abcd)"); + Assertions.assertEquals(words.get(count++), "number"); + Assertions.assertEquals(words.get(count++), "="); + Assertions.assertEquals(words.get(count++), "10.0"); + Assertions.assertEquals(words.get(count++), "+"); + Assertions.assertEquals(words.get(count++), "father"); + Assertions.assertEquals(words.get(count++), ".child0"); + Assertions.assertEquals(words.get(count++), "+"); + Assertions.assertEquals(words.get(count++), "father"); + Assertions.assertEquals(words.get(count++), ".1child(xxx)"); + Assertions.assertEquals(words.get(count++), ".0father"); + Assertions.assertEquals(words.get(count++), "+"); + Assertions.assertEquals(words.get(count++), "father"); + Assertions.assertEquals(words.get(count++), ".ch1ild(abcd)"); } } diff --git a/spirit-core3/spirit-core3-compile/src/test/java/com/gitee/spirit/test/MyApplication.java b/spirit-test/src/test/java/com/gitee/spirit/test/MyApplication.java similarity index 100% rename from spirit-core3/spirit-core3-compile/src/test/java/com/gitee/spirit/test/MyApplication.java rename to spirit-test/src/test/java/com/gitee/spirit/test/MyApplication.java diff --git a/spirit/bin/tools.bat b/spirit/bin/tools.bat deleted file mode 100644 index e173bad35aba807099da8a47d657eee15ecd54ca..0000000000000000000000000000000000000000 --- a/spirit/bin/tools.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -title SPIRIT-CODE-TOOLS -echo path:%~dp0 -java -Xms512m -Xmx512m -cp ".;../lib/*" com.sum.spirit.code.tools.CodeToolsStarter -@pause \ No newline at end of file diff --git a/spirit/lib/checker-qual-2.11.1.jar b/spirit/lib/checker-qual-2.11.1.jar deleted file mode 100644 index a337df04f129c4b7af7da6361d78ca1dab401f6f..0000000000000000000000000000000000000000 Binary files a/spirit/lib/checker-qual-2.11.1.jar and /dev/null differ diff --git a/spirit/lib/classmate-1.3.4.jar b/spirit/lib/classmate-1.3.4.jar deleted file mode 100644 index 5be6d9961f53680ce6753a22b061cc373320d020..0000000000000000000000000000000000000000 Binary files a/spirit/lib/classmate-1.3.4.jar and /dev/null differ diff --git a/spirit/lib/commons-io-2.8.0.jar b/spirit/lib/commons-io-2.8.0.jar deleted file mode 100644 index 177e58dc65d1e2ba706a7535ec9f6f29927401be..0000000000000000000000000000000000000000 Binary files a/spirit/lib/commons-io-2.8.0.jar and /dev/null differ diff --git a/spirit/lib/commons-lang3-3.9.jar b/spirit/lib/commons-lang3-3.9.jar deleted file mode 100644 index 0d896939269b3bf1ce6208a872db1fcabe40e0df..0000000000000000000000000000000000000000 Binary files a/spirit/lib/commons-lang3-3.9.jar and /dev/null differ diff --git a/spirit/lib/error_prone_annotations-2.3.4.jar b/spirit/lib/error_prone_annotations-2.3.4.jar deleted file mode 100644 index c9bea2abc4e3ef344685bed2f1fea53a633979ef..0000000000000000000000000000000000000000 Binary files a/spirit/lib/error_prone_annotations-2.3.4.jar and /dev/null differ diff --git a/spirit/lib/failureaccess-1.0.1.jar b/spirit/lib/failureaccess-1.0.1.jar deleted file mode 100644 index 9b56dc751c1cc7dff75ed80ccbb45f027058e8ce..0000000000000000000000000000000000000000 Binary files a/spirit/lib/failureaccess-1.0.1.jar and /dev/null differ diff --git a/spirit/lib/guava-29.0-jre.jar b/spirit/lib/guava-29.0-jre.jar deleted file mode 100644 index e1fc1791f09c1c4bb2c1d194bd2cb27571358f74..0000000000000000000000000000000000000000 Binary files a/spirit/lib/guava-29.0-jre.jar and /dev/null differ diff --git a/spirit/lib/hibernate-validator-6.0.18.Final.jar b/spirit/lib/hibernate-validator-6.0.18.Final.jar deleted file mode 100644 index 347bb421ccc42abc2c9d732302b9728cdebd348b..0000000000000000000000000000000000000000 Binary files a/spirit/lib/hibernate-validator-6.0.18.Final.jar and /dev/null differ diff --git a/spirit/lib/hutool-all-5.5.1.jar b/spirit/lib/hutool-all-5.5.1.jar deleted file mode 100644 index fa0379ac8e501fb0fa2e9dc4decc03570a1c868d..0000000000000000000000000000000000000000 Binary files a/spirit/lib/hutool-all-5.5.1.jar and /dev/null differ diff --git a/spirit/lib/j2objc-annotations-1.3.jar b/spirit/lib/j2objc-annotations-1.3.jar deleted file mode 100644 index a429c7219d30e797d4a6b3cfb579266f323dd030..0000000000000000000000000000000000000000 Binary files a/spirit/lib/j2objc-annotations-1.3.jar and /dev/null differ diff --git a/spirit/lib/jackson-annotations-2.10.1.jar b/spirit/lib/jackson-annotations-2.10.1.jar deleted file mode 100644 index a10399ce3e8744888df8739723a445894004d2d1..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jackson-annotations-2.10.1.jar and /dev/null differ diff --git a/spirit/lib/jackson-core-2.10.1.jar b/spirit/lib/jackson-core-2.10.1.jar deleted file mode 100644 index 1640a4e08fe3acaa6b15d52fdb77910223da7b3d..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jackson-core-2.10.1.jar and /dev/null differ diff --git a/spirit/lib/jackson-databind-2.10.1.jar b/spirit/lib/jackson-databind-2.10.1.jar deleted file mode 100644 index abe3748dbd1165b0a2a4107749fdc41cf2cf79cf..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jackson-databind-2.10.1.jar and /dev/null differ diff --git a/spirit/lib/jackson-datatype-jdk8-2.10.1.jar b/spirit/lib/jackson-datatype-jdk8-2.10.1.jar deleted file mode 100644 index fc00dc9676f70885f30774a8e997513b5ccbd5f4..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jackson-datatype-jdk8-2.10.1.jar and /dev/null differ diff --git a/spirit/lib/jackson-datatype-jsr310-2.10.1.jar b/spirit/lib/jackson-datatype-jsr310-2.10.1.jar deleted file mode 100644 index fc7c3f3f87c02035edacfa6677b147edbb127ddb..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jackson-datatype-jsr310-2.10.1.jar and /dev/null differ diff --git a/spirit/lib/jackson-module-parameter-names-2.10.1.jar b/spirit/lib/jackson-module-parameter-names-2.10.1.jar deleted file mode 100644 index 527e449c11934f56f5c8b5a7951a4dba3522fbdf..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jackson-module-parameter-names-2.10.1.jar and /dev/null differ diff --git a/spirit/lib/jakarta.annotation-api-1.3.5.jar b/spirit/lib/jakarta.annotation-api-1.3.5.jar deleted file mode 100644 index 606d992eb235afffc3284caf6a2f97939e8a1682..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jakarta.annotation-api-1.3.5.jar and /dev/null differ diff --git a/spirit/lib/jakarta.validation-api-2.0.1.jar b/spirit/lib/jakarta.validation-api-2.0.1.jar deleted file mode 100644 index bf9f9654ab209224089ee46604626fd6d7646a38..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jakarta.validation-api-2.0.1.jar and /dev/null differ diff --git a/spirit/lib/jboss-logging-3.3.2.Final.jar b/spirit/lib/jboss-logging-3.3.2.Final.jar deleted file mode 100644 index 67cde710fc8f91eb3deb28ed2bdb025753761ca0..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jboss-logging-3.3.2.Final.jar and /dev/null differ diff --git a/spirit/lib/jsr305-3.0.2.jar b/spirit/lib/jsr305-3.0.2.jar deleted file mode 100644 index 59222d9ca5e5654f5dcf6680783d0e265baa848f..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jsr305-3.0.2.jar and /dev/null differ diff --git a/spirit/lib/jul-to-slf4j-1.7.29.jar b/spirit/lib/jul-to-slf4j-1.7.29.jar deleted file mode 100644 index 451f94d080ca80c7097a3a292eb29a5a65e34860..0000000000000000000000000000000000000000 Binary files a/spirit/lib/jul-to-slf4j-1.7.29.jar and /dev/null differ diff --git a/spirit/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar b/spirit/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar deleted file mode 100644 index 45832c052a10428a5b18613470458e1a2e0e941a..0000000000000000000000000000000000000000 Binary files a/spirit/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar and /dev/null differ diff --git a/spirit/lib/log4j-api-2.12.1.jar b/spirit/lib/log4j-api-2.12.1.jar deleted file mode 100644 index d34694fce9e1e83e3575a4d7b730dfb35beeb658..0000000000000000000000000000000000000000 Binary files a/spirit/lib/log4j-api-2.12.1.jar and /dev/null differ diff --git a/spirit/lib/log4j-to-slf4j-2.12.1.jar b/spirit/lib/log4j-to-slf4j-2.12.1.jar deleted file mode 100644 index 3e4852f408e358c8d4645f4f90ca89285035fead..0000000000000000000000000000000000000000 Binary files a/spirit/lib/log4j-to-slf4j-2.12.1.jar and /dev/null differ diff --git a/spirit/lib/logback-classic-1.2.3.jar b/spirit/lib/logback-classic-1.2.3.jar deleted file mode 100644 index bed00c0a58a0a6e8aa5f1009320a3ff885cecea7..0000000000000000000000000000000000000000 Binary files a/spirit/lib/logback-classic-1.2.3.jar and /dev/null differ diff --git a/spirit/lib/logback-core-1.2.3.jar b/spirit/lib/logback-core-1.2.3.jar deleted file mode 100644 index 487b3956adea508a750a4325d5bc7f59e2142861..0000000000000000000000000000000000000000 Binary files a/spirit/lib/logback-core-1.2.3.jar and /dev/null differ diff --git a/spirit/lib/lombok-1.18.16.jar b/spirit/lib/lombok-1.18.16.jar deleted file mode 100644 index 20f85ff2e00325f61d3987233be813794c30986b..0000000000000000000000000000000000000000 Binary files a/spirit/lib/lombok-1.18.16.jar and /dev/null differ diff --git a/spirit/lib/slf4j-api-1.7.25.jar b/spirit/lib/slf4j-api-1.7.25.jar deleted file mode 100644 index 0143c099699ee843cde6d95c9dbc7751039d2463..0000000000000000000000000000000000000000 Binary files a/spirit/lib/slf4j-api-1.7.25.jar and /dev/null differ diff --git a/spirit/lib/snakeyaml-1.25.jar b/spirit/lib/snakeyaml-1.25.jar deleted file mode 100644 index 00049850591bb5daded1d3c8b53363eb0db31806..0000000000000000000000000000000000000000 Binary files a/spirit/lib/snakeyaml-1.25.jar and /dev/null differ diff --git a/spirit/lib/spirit-code-plugin-2.1.30.jar b/spirit/lib/spirit-code-plugin-2.1.30.jar deleted file mode 100644 index b78fdd999c960ad84c8031352cc268526a5f0842..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-code-plugin-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-code-tools-2.1.30.jar b/spirit/lib/spirit-code-tools-2.1.30.jar deleted file mode 100644 index 82b0756e37e7f43564f328015f19458476543e12..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-code-tools-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-common-2.1.30.jar b/spirit/lib/spirit-common-2.1.30.jar deleted file mode 100644 index 2f69e952b624fbd56a46abc6d7ab45caf416e92d..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-common-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-core-class-2.1.30.jar b/spirit/lib/spirit-core-class-2.1.30.jar deleted file mode 100644 index 785cf54176bf021690d22181628d33683db85b2d..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-core-class-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-core-compile-2.1.30.jar b/spirit/lib/spirit-core-compile-2.1.30.jar deleted file mode 100644 index 52549625b450cea4e380443c9c4175a98fc87363..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-core-compile-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-core-element-2.1.30.jar b/spirit/lib/spirit-core-element-2.1.30.jar deleted file mode 100644 index e8a5021f2a7d9923849fe52f3d6cc87596f8ad54..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-core-element-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-core-lexer-2.1.30.jar b/spirit/lib/spirit-core-lexer-2.1.30.jar deleted file mode 100644 index f90892c718a0cb2508616be7241a22faebec2445..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-core-lexer-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-output-java-2.1.30.jar b/spirit/lib/spirit-output-java-2.1.30.jar deleted file mode 100644 index 8e771914b41fd2f2986dbb1e9109d2dc20e4d6da..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-output-java-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-starter-java-2.1.30.jar b/spirit/lib/spirit-starter-java-2.1.30.jar deleted file mode 100644 index fc8aa89c6d2fee7559f0b19780ecd976cd2d1033..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-starter-java-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spirit-stdlib-2.1.30.jar b/spirit/lib/spirit-stdlib-2.1.30.jar deleted file mode 100644 index b244b0fe78a85a48f364cdd339220a82b5d04934..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spirit-stdlib-2.1.30.jar and /dev/null differ diff --git a/spirit/lib/spring-aop-5.2.2.RELEASE.jar b/spirit/lib/spring-aop-5.2.2.RELEASE.jar deleted file mode 100644 index 595f6eaea2064eed5352bf46870ffcc232829190..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-aop-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-beans-5.2.2.RELEASE.jar b/spirit/lib/spring-beans-5.2.2.RELEASE.jar deleted file mode 100644 index 8ba7ecf59aea6e679474349cd92096d1b3d47780..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-beans-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-2.2.2.RELEASE.jar deleted file mode 100644 index 96d2041cad8e104d2412dfa6e81ab4848ffa214f..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-autoconfigure-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-autoconfigure-2.2.2.RELEASE.jar deleted file mode 100644 index c907d7da3298c04a2997ef09cdd8e17795111da6..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-autoconfigure-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-starter-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-starter-2.2.2.RELEASE.jar deleted file mode 100644 index 96ef57dab43350f928ae8b366a57183bf3b36a82..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-starter-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-starter-json-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-starter-json-2.2.2.RELEASE.jar deleted file mode 100644 index 9e67447ae1a8d275b4d93e8980b5fdd60ff15411..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-starter-json-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-starter-logging-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-starter-logging-2.2.2.RELEASE.jar deleted file mode 100644 index 9cdc22a1fe47870b1b7cb545f37b5d60d164eeca..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-starter-logging-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-starter-tomcat-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-starter-tomcat-2.2.2.RELEASE.jar deleted file mode 100644 index 9cc1158fd05715592c01cf91f8774e1fcae11ec9..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-starter-tomcat-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-starter-validation-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-starter-validation-2.2.2.RELEASE.jar deleted file mode 100644 index fb6dbfdb663dba6fa1c1b77e13eadbefa07196d0..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-starter-validation-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-boot-starter-web-2.2.2.RELEASE.jar b/spirit/lib/spring-boot-starter-web-2.2.2.RELEASE.jar deleted file mode 100644 index b15ec018f6a79c0606170e92c0a78b291a1ad8c4..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-boot-starter-web-2.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-context-5.2.2.RELEASE.jar b/spirit/lib/spring-context-5.2.2.RELEASE.jar deleted file mode 100644 index 14e38ffe6aa619f78a6f849119e586a6909e7ad2..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-context-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-core-5.2.2.RELEASE.jar b/spirit/lib/spring-core-5.2.2.RELEASE.jar deleted file mode 100644 index d32f78201173dd35fedc0f4d5cb9e5d877d4754a..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-core-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-expression-5.2.2.RELEASE.jar b/spirit/lib/spring-expression-5.2.2.RELEASE.jar deleted file mode 100644 index 1e89f4b9616a75108161b906dbc9ce2ee01c32a9..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-expression-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-jcl-5.2.2.RELEASE.jar b/spirit/lib/spring-jcl-5.2.2.RELEASE.jar deleted file mode 100644 index ea0f6150b07e055e4d49e0a4168c20cd47f47d3c..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-jcl-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-web-5.2.2.RELEASE.jar b/spirit/lib/spring-web-5.2.2.RELEASE.jar deleted file mode 100644 index d950f29c9395071d1dd677661243874c4c33e9bf..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-web-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/spring-webmvc-5.2.2.RELEASE.jar b/spirit/lib/spring-webmvc-5.2.2.RELEASE.jar deleted file mode 100644 index 8baf6820f32cd529340086cd4dd2437e9cc3faa7..0000000000000000000000000000000000000000 Binary files a/spirit/lib/spring-webmvc-5.2.2.RELEASE.jar and /dev/null differ diff --git a/spirit/lib/tomcat-embed-core-9.0.29.jar b/spirit/lib/tomcat-embed-core-9.0.29.jar deleted file mode 100644 index 6e9b4c78645d679f12d98ebc03f0c8653f749aff..0000000000000000000000000000000000000000 Binary files a/spirit/lib/tomcat-embed-core-9.0.29.jar and /dev/null differ diff --git a/spirit/lib/tomcat-embed-el-9.0.29.jar b/spirit/lib/tomcat-embed-el-9.0.29.jar deleted file mode 100644 index 944c15a276ab8148590410439e4085769e7b2827..0000000000000000000000000000000000000000 Binary files a/spirit/lib/tomcat-embed-el-9.0.29.jar and /dev/null differ diff --git a/spirit/lib/tomcat-embed-websocket-9.0.29.jar b/spirit/lib/tomcat-embed-websocket-9.0.29.jar deleted file mode 100644 index fc8d92725b4d040473bbeb52ae4f040522be694f..0000000000000000000000000000000000000000 Binary files a/spirit/lib/tomcat-embed-websocket-9.0.29.jar and /dev/null differ diff --git a/sublime-plugs/Default (Windows).sublime-keymap b/sublime-plugs/Default (Windows).sublime-keymap deleted file mode 100644 index aa215c8b77bc9ec8b89576f94fc5af0798ca75c7..0000000000000000000000000000000000000000 --- a/sublime-plugs/Default (Windows).sublime-keymap +++ /dev/null @@ -1,14 +0,0 @@ -[ - //快速换行 - { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line.sublime-macro"} }, - //快速跳过结束符 - { "keys": ["tab"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "following_text", "operator": "regex_contains", "operand": "^[)\\]\\}\\>\\'\\\"]", "match_all": true } - ] - }, - //快速删除一行 - { "keys": ["ctrl+d"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Line.sublime-macro"} }, - //自动提示 - { "keys": ["ctrl+enter"], "command": "tip" } -] diff --git a/sublime-plugs/Spirit.sublime-syntax b/sublime-plugs/Spirit.sublime-syntax deleted file mode 100644 index 9e986f259e8d2565ecc51ec126987f763e9323e0..0000000000000000000000000000000000000000 --- a/sublime-plugs/Spirit.sublime-syntax +++ /dev/null @@ -1,90 +0,0 @@ -%YAML 1.2 ---- -# See http://www.sublimetext.com/docs/3/syntax.html -file_extensions: - - sp -scope: source.sp -contexts: - main: - # Annotation - - match: '@' - scope: string - push: annotation - - # String - - match: '"' - scope: string - push: double_string - - # Char - - match: "\'" - scope: string - push: double_char - - # Keyword - - match: '\b(package|import|interface|abstract|class|extends|impls|func|throws)\b' - scope: keyword - - # Block - - match: '\b(if|else|for|in|do|while|try|catch|finally|sync)\b' - scope: keyword - - # Block Keyword - - match: '\b(super|this|return|continue|break|throw|instanceof|print|debug|error|empty)\b' - scope: keyword - - # Basic Type - - match: '\b(boolean|char|short|int|long|float|double|byte)\b' - scope: keyword - - # Modifier - - match: '\b(const|volatile|synch)\b' - scope: keyword - - # Literal - - match: '\b(null|true|false)\b' - scope: keyword - - # Constant - - match: '\b[A-Z_]{2,}\b' - scope: string - - # Number - - match: '\b\d+(\.\d+)?(L)?\b' - scope: constant.numeric - - # Type - - match: '\b[A-Z]+\w*\b' - scope: entity.name.class - - # Accessible Entity - - match: '\b[a-z]+\w*\b' - scope: storage.type - - # Comment - - match: '//' - scope: comment - push: line_comment - - annotation: - - meta_scope: string - - match: '[A-Za-z0-9]+' - scope: variable - pop: true - - double_string: - - meta_scope: string - - match: '"' - scope: string - pop: true - - double_char: - - meta_scope: string - - match: "\'" - scope: string - pop: true - - line_comment: - - meta_scope: comment - - match: $ - pop: true diff --git a/sublime-plugs/TipCommand.py b/sublime-plugs/TipCommand.py deleted file mode 100644 index 8a837eb1df3883d566490bb4adc55d01ba913833..0000000000000000000000000000000000000000 --- a/sublime-plugs/TipCommand.py +++ /dev/null @@ -1,49 +0,0 @@ -import sublime -import sublime_plugin -import urllib.parse -import urllib.request - -class TipCommand(sublime_plugin.TextCommand): - def run(self, edit): - # 获取文件名 - filePath = self.view.file_name() - print(filePath) - # 获取光标位置 - point = self.view.sel()[0].a - # 获取文件内容 - content = self.view.substr(sublime.Region(0, self.view.size())) - strs = list(content) - strs.insert(point, "@") - content = "".join(strs) - print(content) - # 获取行号 - row, col = self.view.rowcol(point) - print(row + 1) - # 发送请求 - response = self.sendHttpRequest(filePath, content, row + 1) - result = sublime.decode_value(response) - print(result) - # 解析返回的方法信息 - data = result["data"] - items = [] - for item in data: - items.append(item["tipText"]) - # 显示提示框 - self.edit = edit - self.data = data - self.view.show_popup_menu(items, self.on_done) - - def sendHttpRequest(self, filePath, content, lineNumber): - url = "http://localhost:8729/spirit/kit/getMethodInfos" - headers = { "Content-Type" : "application/json" } - params = { "filePath" : filePath, "content" : content, "lineNumber" : lineNumber } - jsonStr = sublime.encode_value(params, True) - # print(jsonStr) - request = urllib.request.Request(url, bytes(jsonStr, "utf8"), headers) - response = urllib.request.urlopen(request) - return response.read().decode("utf8") - - def on_done(self, index): - if index >= 0: - point = self.view.sel()[0].a - self.view.insert(self.edit, point, self.data[index]["actualText"])