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 extends T>) 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