From 0307ecf93e254de668f2836eab26320afc955bd2 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 20 May 2021 18:37:45 +0800 Subject: [PATCH 01/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 88 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index f94170b8..0d1ee102 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,15 @@ ## 代码示例 +### Spirit代码: + ``` func main() { print "hello world!" } ``` -生成代码如下: +### Java代码: ```java package com.sum.test.main; @@ -31,47 +33,9 @@ public class Main { ## 快速开始 -1、在pom文件中,引入Maven插件。 - -```xml - - - - com.gitee.chentaoah - spirit-maven-plugin - 最新版(>= 2.1.30) - - - - compile - - - - - - -``` - -2、在src/main/resources目录下,创建sources子目录。在sources目录下,创建一个文件夹,作为包。例如:com.sum.spirit.example。 - -3、在刚创建的包下,创建Main.sp文本文件。内容如下: - -``` -func main() { - print "hello world!" -} -``` - -4、执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成Java代码。 - -## 编辑器 - -1. 下载安装sublime编辑器,并将项目中sublime-plugs目录下的所有文件,拷贝到sublime插件目录下的User文件夹中。 -2. 在sublime中打开后缀名为sp的文件,即可看到代码样式。 - -## Maven依赖 +### Maven依赖 -请确保项目中有如下依赖: +在pom.xml中引入jar包: ```xml @@ -94,3 +58,45 @@ func main() { ``` +### Sublime编辑器 + +1. 下载并安装sublime编辑器。 +2. 打开sublime,点击上方Preferences->Browse Packages按钮。 +3. 将项目sublime-plugs目录下的所有文件,拷贝到User文件夹中。 +4. 打开后缀名为sp的文件,即可看到代码样式。 + +### Maven插件 + +1、在pom.xml中引入插件。 + +```xml + + + + com.gitee.chentaoah + spirit-maven-plugin + 最新版(>= 2.1.30) + + + + compile + + + + + + +``` + +2、在src/main/resources目录下,创建sources子目录。在sources目录下,创建一个文件夹,作为包。例如:com.sum.spirit.example。 + +3、在刚创建的包下,创建Main.sp文本文件。内容如下: + +``` +func main() { + print "hello world!" +} +``` + +4、执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成Java代码。 + -- Gitee From 91ece82f2429eef7dfd7b328647e6fcad075a89b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 20 May 2021 18:41:34 +0800 Subject: [PATCH 02/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0d1ee102..afd7ea51 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## 代码示例 -### Spirit代码: +### Spirit ``` func main() { @@ -12,7 +12,7 @@ func main() { } ``` -### Java代码: +### Java ```java package com.sum.test.main; -- Gitee From 27d4a464daea141a3adce12a89c42227c8ab85ef Mon Sep 17 00:00:00 2001 From: chenT Date: Fri, 21 May 2021 00:01:44 +0800 Subject: [PATCH 03/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 73 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index afd7ea51..42906788 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ## 代码示例 -### Spirit +### 原始代码 ``` func main() { @@ -12,7 +12,7 @@ func main() { } ``` -### Java +### 目标代码 ```java package com.sum.test.main; @@ -33,9 +33,9 @@ public class Main { ## 快速开始 -### Maven依赖 +### 依赖配置 -在pom.xml中引入jar包: +在pom.xml中引入以下jar包: ```xml @@ -58,45 +58,48 @@ public class Main { ``` -### Sublime编辑器 +### 代码编辑 1. 下载并安装sublime编辑器。 + 2. 打开sublime,点击上方Preferences->Browse Packages按钮。 -3. 将项目sublime-plugs目录下的所有文件,拷贝到User文件夹中。 -4. 打开后缀名为sp的文件,即可看到代码样式。 -### Maven插件 +3. 将spirit项目中sublime-plugs目录下的所有文件,拷贝到User文件夹中。 -1、在pom.xml中引入插件。 +4. 在项目src/main/resources目录下,创建sources子目录。在sources目录下,创建一个文件夹。例如:com.sum.spirit.example。 -```xml - - - - com.gitee.chentaoah - spirit-maven-plugin - 最新版(>= 2.1.30) - - - - compile - - - - - - -``` +5. 在文件夹下,创建Main.sp文件,并在sublime中打开,输入如下内容: -2、在src/main/resources目录下,创建sources子目录。在sources目录下,创建一个文件夹,作为包。例如:com.sum.spirit.example。 + ``` + func main() { + print "hello world!" + } + ``` -3、在刚创建的包下,创建Main.sp文本文件。内容如下: +### 代码编译 + +1. 在pom.xml中引入插件。 + + ```xml + + + + com.gitee.chentaoah + spirit-maven-plugin + 最新版(>= 2.1.30) + + + + compile + + + + + + + ``` + +2. 执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成Java代码。 -``` -func main() { - print "hello world!" -} -``` -4、执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成Java代码。 -- Gitee From 63884e79f9c39797af6aa3ab8586cdd4ff92bf00 Mon Sep 17 00:00:00 2001 From: chenT Date: Fri, 21 May 2021 00:08:25 +0800 Subject: [PATCH 04/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42906788..f3b663e3 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ public class Main { ``` -2. 执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成Java代码。 +2. 执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成的Java代码。 -- Gitee From 375d8ab370420ae3c7acf443584c4cde1c0a7dad Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 09:39:45 +0800 Subject: [PATCH 05/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f3b663e3..45b0412b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ### 原始代码 -``` +```go func main() { print "hello world!" } @@ -42,19 +42,19 @@ public class Main { com.gitee.chentaoah spirit-stdlib - ${project.version} + 最新版(>= 2.1.30) org.slf4j slf4j-api - ${slf4j.version} + 1.7.25 org.apache.commons commons-lang3 - ${lang3.version} + 3.9 ``` @@ -70,7 +70,7 @@ public class Main { 5. 在文件夹下,创建Main.sp文件,并在sublime中打开,输入如下内容: - ``` + ```go func main() { print "hello world!" } -- Gitee From 0132593cd96c36ea8e604c4f70c3cc27c7337e8f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 10:26:23 +0800 Subject: [PATCH 06/66] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9B=86=E5=90=88?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E7=A9=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/sum/spirit/stdlib/Emptys.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java b/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java index 86c526fa..ec384c78 100644 --- a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java +++ b/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java @@ -1,9 +1,20 @@ package com.sum.spirit.stdlib; +import java.util.Collection; +import java.util.Map; + public class Emptys { public static boolean empty(String str) { return str == null || str.length() == 0; } + public static boolean empty(Collection collection) { + return collection == null || collection.isEmpty(); + } + + public static boolean empty(Map map) { + return map == null || map.isEmpty(); + } + } -- Gitee From c7bcdf181bba697d0eb3588ce534f23dd1c9b329 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 10:33:48 +0800 Subject: [PATCH 07/66] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=BA=86=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E7=9A=84=E5=BC=82=E5=B8=B8=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/exception/UnhandledException.java | 26 ------------------- .../core/compile/deduce/FragmentDeducer.java | 3 +-- .../core/lexer/action/RegionAction.java | 3 +-- .../core/lexer/action/SymbolAction.java | 3 +-- 4 files changed, 3 insertions(+), 32 deletions(-) delete mode 100644 spirit-common/src/main/java/com/sum/spirit/common/exception/UnhandledException.java diff --git a/spirit-common/src/main/java/com/sum/spirit/common/exception/UnhandledException.java b/spirit-common/src/main/java/com/sum/spirit/common/exception/UnhandledException.java deleted file mode 100644 index b839a02b..00000000 --- a/spirit-common/src/main/java/com/sum/spirit/common/exception/UnhandledException.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sum.spirit.common.exception; - -@SuppressWarnings("serial") -public class UnhandledException extends RuntimeException { - - public UnhandledException() { - super(); - } - - public UnhandledException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } - - public UnhandledException(String message, Throwable cause) { - super(message, cause); - } - - public UnhandledException(String message) { - super(message); - } - - public UnhandledException(Throwable cause) { - super(cause); - } - -} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java index aa7a3840..0b13d78b 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.exception.UnhandledException; import com.sum.spirit.core.api.TreeBuilder; import com.sum.spirit.core.clazz.entity.IClass; import com.sum.spirit.core.clazz.entity.IType; @@ -29,7 +28,7 @@ public class FragmentDeducer { return type; } } - throw new UnhandledException(); + throw new RuntimeException("Unhandled branch!"); } public static IType getTypeByNode(IClass clazz, Node node) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java index 813cf941..8c48af34 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java @@ -5,7 +5,6 @@ import java.util.List; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.exception.UnhandledException; import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.common.utils.ListUtils; import com.sum.spirit.core.api.LexerAction; @@ -91,7 +90,7 @@ public class RegionAction implements LexerAction { return pushStack(event, ListUtils.toListNonNull(region0, region1, region2)); } - throw new UnhandledException(); + throw new RuntimeException("Unhandled branch!"); } public LexerResult pushStack(CharEvent event, List regions) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java index 9818575a..8b235c51 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java @@ -4,7 +4,6 @@ import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.sum.spirit.common.enums.SymbolEnum; -import com.sum.spirit.common.exception.UnhandledException; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.LexerContext; @@ -41,7 +40,7 @@ public class SymbolAction implements LexerAction { return new LexerResult(State.BREAK, region); } - throw new UnhandledException(); + throw new RuntimeException("Unhandled branch!"); } } \ No newline at end of file -- Gitee From 86f9b76ced842b2aeaf7fe056f5b62f5d50983ad Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 10:41:53 +0800 Subject: [PATCH 08/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/common/annotation/App.java | 1 - .../sum/spirit/common/annotation/Native.java | 1 - .../sum/spirit/common/constants/AppConfig.java | 18 +++++++++--------- .../sum/spirit/common/constants/Attribute.java | 18 +++++++++--------- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java b/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java index 8af61838..7d6745eb 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java @@ -10,5 +10,4 @@ import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface App { - } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java b/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java index ac015a41..837ec443 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java @@ -10,5 +10,4 @@ import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Native { - } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java b/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java index ff25b5e5..acb07250 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java @@ -1,17 +1,17 @@ package com.sum.spirit.common.constants; -public class AppConfig { +public interface AppConfig { - public static final String DEFAULT_CHARSET = "UTF-8"; + String DEFAULT_CHARSET = "UTF-8"; - public static final String INPUT_ARG_KEY = "input"; - public static final String OUTPUT_ARG_KEY = "output"; - public static final String CLASSPATHS_ARG_KEY = "classpaths"; + String INPUT_ARG_KEY = "input"; + String OUTPUT_ARG_KEY = "output"; + String CLASSPATHS_ARG_KEY = "classpaths"; - public static final String FILENAME_EXTENSION_KEY = "spirit.compile.file.extension"; - public static final String DEBUG_KEY = "spirit.compile.debug"; + String FILENAME_EXTENSION_KEY = "spirit.compile.file.extension"; + String DEBUG_KEY = "spirit.compile.debug"; - public static final String DEFAULT_FILENAME_EXTENSION = "sp"; - public static final boolean DEFAULT_DEBUG = true; + String DEFAULT_FILENAME_EXTENSION = "sp"; + boolean DEFAULT_DEBUG = true; } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java b/spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java index f1fb1423..dfa70cf0 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java @@ -1,17 +1,17 @@ package com.sum.spirit.common.constants; -public class Attribute { +public interface Attribute { - public static final String SIMPLE_NAME = "SIMPLE_NAME"; // 类名 - public static final String MEMBER_NAME = "MEMBER_NAME"; // 字段名或者方法名 + String SIMPLE_NAME = "SIMPLE_NAME"; // 类名 + String MEMBER_NAME = "MEMBER_NAME"; // 字段名或者方法名 - public static final String OPERAND = "OPERAND"; // 操作数 - public static final String TREE_ID = "TREE_ID"; // 树节点id + String OPERAND = "OPERAND"; // 操作数 + String TREE_ID = "TREE_ID"; // 树节点id - public static final String POSITION = "POSITION"; // 在语句中的位置 - public static final String LENGTH = "LENGTH"; // 字符串的宽度 + String POSITION = "POSITION"; // 在语句中的位置 + String LENGTH = "LENGTH"; // 字符串的宽度 - public static final String TYPE = "TYPE"; // 类型 - public static final String DERIVED = "DERIVED"; // 是否声明 + String TYPE = "TYPE"; // 类型 + String DERIVED = "DERIVED"; // 是否声明 } -- Gitee From 10446de26867a75488d089b02a55bd47bfad439b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 11:24:04 +0800 Subject: [PATCH 09/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/sum/spirit/core/api/CharAction.java | 4 ++-- .../main/java/com/sum/spirit/core/api/LexerAction.java | 8 +------- .../com/sum/spirit/core/lexer/AbstractCharsHandler.java | 5 ++--- .../com/sum/spirit/core/lexer/AbstractCursorLexer.java | 3 ++- .../java/com/sum/spirit/core/lexer/AbstractLexer.java | 3 ++- .../java/com/sum/spirit/core/lexer/AliasCharsHandler.java | 3 ++- 6 files changed, 11 insertions(+), 15 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java index 83047a91..9e837f23 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java @@ -2,10 +2,10 @@ package com.sum.spirit.core.api; import com.sum.spirit.core.lexer.entity.CharEvent; -public interface CharAction { +public interface CharAction { boolean isTrigger(CharEvent event); - void handle(CharEvent event); + T handle(CharEvent event); } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java index 59c84cb6..03c4359d 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java @@ -1,12 +1,6 @@ package com.sum.spirit.core.api; -import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.LexerResult; -public interface LexerAction { - - boolean isTrigger(CharEvent event); - - LexerResult handle(CharEvent event); - +public interface LexerAction extends CharAction { } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java index 890b1aed..52bb806f 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java @@ -6,11 +6,11 @@ import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.CharsContext; import com.sum.spirit.core.lexer.entity.CharsResult; -public abstract class AbstractCharsHandler implements CharsHandler, CharAction { +public abstract class AbstractCharsHandler implements CharsHandler, CharAction { @Override public CharsResult handle(CharsContext context, StringBuilder builder) { - for (; context.index < builder.length(); context.index++) { + for (context.index = 0; context.index < builder.length(); context.index++) { char ch = builder.charAt(context.index); CharEvent event = new CharEvent(context, ch); if (this.isTrigger(event)) { @@ -18,7 +18,6 @@ public abstract class AbstractCharsHandler implements CharsHandler, CharAction { } } return buildResult(context, builder); - } public CharsResult buildResult(CharsContext context, StringBuilder builder) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java index b7bb00f4..b3e5b6cd 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java @@ -7,7 +7,7 @@ import com.sum.spirit.core.lexer.entity.LexerContext; public abstract class AbstractCursorLexer extends AbstractLexer { @Override - public void handle(CharEvent event) { + public Void handle(CharEvent event) { LexerContext context = (LexerContext) event.context; char ch = event.ch; if ((context.startIndex < 0 && isContinuous(ch)) || isRefreshed(ch)) { @@ -17,6 +17,7 @@ public abstract class AbstractCursorLexer extends AbstractLexer { if (!isContinuous(ch)) { context.startIndex = -1; } + return null; } public boolean isContinuous(char ch) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index 73200dac..97a03a3b 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -49,7 +49,7 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe } @Override - public void handle(CharEvent event) { + public Void handle(CharEvent event) { for (LexerAction action : actions) { if (action.isTrigger(event)) { LexerResult result = action.handle(event); @@ -64,6 +64,7 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe } } } + return null; } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java index 1d02911c..0e6d25ce 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java @@ -36,7 +36,7 @@ public class AliasCharsHandler extends AbstractCharsHandler { } @Override - public void handle(CharEvent event) { + public Void handle(CharEvent event) { AliasCharsContext context = (AliasCharsContext) event.context; StringBuilder builder = context.builder; String alias = context.alias; @@ -50,6 +50,7 @@ public class AliasCharsHandler extends AbstractCharsHandler { } } } + return null; } public static class AliasCharsContext extends CharsContext { -- Gitee From 552e60e62af11a977a69147b815d2d27d3837b3f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 12:38:06 +0800 Subject: [PATCH 10/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/core/lexer/CoreLexer.java | 17 ++++++++--------- .../spirit/core/lexer/entity/CharsResult.java | 7 +++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java index 3870b871..9cb2188c 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java @@ -15,32 +15,31 @@ import cn.hutool.core.lang.Assert; public class CoreLexer extends AbstractCursorLexer { @Override - @SuppressWarnings("unchecked") public List getWords(String text) { Assert.notBlank(text, "Text cannot be blank!"); StringBuilder builder = new StringBuilder(text.trim()); LexerContext context = new LexerContext(builder); CharsResult result = handle(context, builder); - return (List) result.payload; + return result.get(); } @Override - @SuppressWarnings("unchecked") public List getSubWords(String text, Character... splitChars) { Assert.notBlank(text, "Text cannot be blank!"); StringBuilder builder = new StringBuilder(text.trim()); LexerContext context = new LexerContext(builder, BorderAction.PROFILE, splitChars); CharsResult result = handle(context, builder); - Assert.notNull(result.payload, "Payload of result cannot be null!"); - List words = new ArrayList<>(); - for (String word : (List) result.payload) { + List words = result.get(); + Assert.notNull(words, "Payload of result cannot be null!"); + List finalWords = new ArrayList<>(); + for (String word : words) { if (word.length() == 1) { - words.add(word); + finalWords.add(word); } else { - words.addAll(getWords(word)); + finalWords.addAll(getWords(word)); } } - return words; + return finalWords; } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java index 99405d86..9f9d8386 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java @@ -8,5 +8,12 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class CharsResult { + public Object payload; + + @SuppressWarnings("unchecked") + public T get() { + return (T) payload; + } + } -- Gitee From b7acfef9243d4801d7994e3c70caa616e085d148 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 13:08:41 +0800 Subject: [PATCH 11/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/core/lexer/CoreLexer.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java index 9cb2188c..e1b5739e 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java @@ -6,6 +6,7 @@ import java.util.List; import org.springframework.stereotype.Component; import com.sum.spirit.core.lexer.action.BorderAction; +import com.sum.spirit.core.lexer.entity.CharsContext; import com.sum.spirit.core.lexer.entity.CharsResult; import com.sum.spirit.core.lexer.entity.LexerContext; @@ -29,17 +30,26 @@ public class CoreLexer extends AbstractCursorLexer { StringBuilder builder = new StringBuilder(text.trim()); LexerContext context = new LexerContext(builder, BorderAction.PROFILE, splitChars); CharsResult result = handle(context, builder); - List words = result.get(); - Assert.notNull(words, "Payload of result cannot be null!"); - List finalWords = new ArrayList<>(); - for (String word : words) { - if (word.length() == 1) { - finalWords.add(word); - } else { - finalWords.addAll(getWords(word)); + return result.get(); + } + + @Override + public CharsResult buildResult(CharsContext context, StringBuilder builder) { + LexerContext lexerContext = (LexerContext) context; + CharsResult result = super.buildResult(context, builder); + if (BorderAction.PROFILE.equals(lexerContext.profile)) { + List finalWords = new ArrayList<>(); + List words = result.get(); + for (String word : words) { + if (word.length() == 1) { + finalWords.add(word); + } else { + finalWords.addAll(getWords(word)); + } } + return new CharsResult(finalWords); } - return finalWords; + return result; } } -- Gitee From 40bab43920bfb25dcfca06c06c06b91689ace7b5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 13:42:36 +0800 Subject: [PATCH 12/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sum/spirit/core/lexer/CoreLexer.java | 7 ++++--- .../com/sum/spirit/core/lexer/action/BorderAction.java | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java index e1b5739e..9508c19d 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java @@ -5,7 +5,6 @@ import java.util.List; import org.springframework.stereotype.Component; -import com.sum.spirit.core.lexer.action.BorderAction; import com.sum.spirit.core.lexer.entity.CharsContext; import com.sum.spirit.core.lexer.entity.CharsResult; import com.sum.spirit.core.lexer.entity.LexerContext; @@ -15,6 +14,8 @@ import cn.hutool.core.lang.Assert; @Component public class CoreLexer extends AbstractCursorLexer { + public static final String BORDER_PROFILE = "BORDER_PROFILE"; + @Override public List getWords(String text) { Assert.notBlank(text, "Text cannot be blank!"); @@ -28,7 +29,7 @@ public class CoreLexer extends AbstractCursorLexer { public List getSubWords(String text, Character... splitChars) { Assert.notBlank(text, "Text cannot be blank!"); StringBuilder builder = new StringBuilder(text.trim()); - LexerContext context = new LexerContext(builder, BorderAction.PROFILE, splitChars); + LexerContext context = new LexerContext(builder, BORDER_PROFILE, splitChars); CharsResult result = handle(context, builder); return result.get(); } @@ -37,7 +38,7 @@ public class CoreLexer extends AbstractCursorLexer { public CharsResult buildResult(CharsContext context, StringBuilder builder) { LexerContext lexerContext = (LexerContext) context; CharsResult result = super.buildResult(context, builder); - if (BorderAction.PROFILE.equals(lexerContext.profile)) { + if (BORDER_PROFILE.equals(lexerContext.profile)) { List finalWords = new ArrayList<>(); List words = result.get(); for (String word : words) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java index 05031f0a..3e88cd47 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java @@ -6,6 +6,7 @@ import java.util.List; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; +import com.sum.spirit.core.lexer.CoreLexer; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.LexerResult; @@ -17,12 +18,10 @@ import com.sum.spirit.core.lexer.entity.LexerResult.State; @Order(-100) public class BorderAction extends RegionAction { - public static final String PROFILE = "BORDER_ACTION"; - @Override public boolean isTrigger(CharEvent event) { LexerContext context = (LexerContext) event.context; - return PROFILE.equals(context.profile) && super.isTrigger(event); + return CoreLexer.BORDER_PROFILE.equals(context.profile) && super.isTrigger(event); } @Override @@ -41,7 +40,8 @@ public class BorderAction extends RegionAction { } } - context.regions = RegionUtils.completeRegions(builder, newRegions, (startIndex, endIndex) -> new Region(startIndex, endIndex)); + context.regions = RegionUtils.completeRegions(builder, newRegions, + (startIndex, endIndex) -> new Region(startIndex, endIndex)); context.index = builder.length(); return new LexerResult(State.BREAK, null); } -- Gitee From 8552c0221d2771d343246640d2cb98a944f9f96a Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 14:46:55 +0800 Subject: [PATCH 13/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/core/api/CharAction.java | 5 +++-- .../com/sum/spirit/core/api/CharsHandler.java | 4 ++-- .../com/sum/spirit/core/api/LexerAction.java | 4 +--- .../spirit/core/lexer/AbstractCharsHandler.java | 10 +++++----- .../spirit/core/lexer/AbstractCursorLexer.java | 3 ++- .../sum/spirit/core/lexer/AbstractLexer.java | 17 +++++++++-------- .../spirit/core/lexer/AliasCharsHandler.java | 8 ++++---- .../com/sum/spirit/core/lexer/CoreLexer.java | 12 ++++++------ .../spirit/core/lexer/action/RegionAction.java | 3 ++- .../{CharsResult.java => CommonResult.java} | 6 +++--- .../spirit/core/lexer/entity/LexerResult.java | 10 ++++++---- 11 files changed, 43 insertions(+), 39 deletions(-) rename spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/{CharsResult.java => CommonResult.java} (76%) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java index 9e837f23..c37f8b7c 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java @@ -1,11 +1,12 @@ package com.sum.spirit.core.api; import com.sum.spirit.core.lexer.entity.CharEvent; +import com.sum.spirit.core.lexer.entity.CommonResult; -public interface CharAction { +public interface CharAction { boolean isTrigger(CharEvent event); - T handle(CharEvent event); + CommonResult handle(CharEvent event); } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java index 92ce39d9..49458a55 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java @@ -1,10 +1,10 @@ package com.sum.spirit.core.api; import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CharsResult; +import com.sum.spirit.core.lexer.entity.CommonResult; public interface CharsHandler { - CharsResult handle(CharsContext context, StringBuilder builder); + CommonResult handle(CharsContext context, StringBuilder builder); } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java index 03c4359d..250ad027 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java @@ -1,6 +1,4 @@ package com.sum.spirit.core.api; -import com.sum.spirit.core.lexer.entity.LexerResult; - -public interface LexerAction extends CharAction { +public interface LexerAction extends CharAction { } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java index 52bb806f..8b25599f 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java @@ -4,12 +4,12 @@ import com.sum.spirit.core.api.CharAction; import com.sum.spirit.core.api.CharsHandler; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CharsResult; +import com.sum.spirit.core.lexer.entity.CommonResult; -public abstract class AbstractCharsHandler implements CharsHandler, CharAction { +public abstract class AbstractCharsHandler implements CharsHandler, CharAction { @Override - public CharsResult handle(CharsContext context, StringBuilder builder) { + public CommonResult handle(CharsContext context, StringBuilder builder) { for (context.index = 0; context.index < builder.length(); context.index++) { char ch = builder.charAt(context.index); CharEvent event = new CharEvent(context, ch); @@ -20,8 +20,8 @@ public abstract class AbstractCharsHandler implements CharsHandler, CharAction actions; @Override - public CharsResult buildResult(CharsContext context, StringBuilder builder) { + public CommonResult buildResult(CharsContext context, StringBuilder builder) { LexerContext lexerContext = (LexerContext) context; List regions = RegionUtils.completeRegions(builder, lexerContext.regions);// 使用标记收集算法后,补全未标记的部分 List words = RegionUtils.subRegions(builder, regions, this::addToWords); - return new CharsResult(words); + return new CommonResult(words); } public void addToWords(List words, Region region, String text) { @@ -49,13 +49,14 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe } @Override - public Void handle(CharEvent event) { + public CommonResult handle(CharEvent event) { + LexerContext context = (LexerContext) event.context; for (LexerAction action : actions) { if (action.isTrigger(event)) { - LexerResult result = action.handle(event); - if (result.region != null) { - LexerContext context = (LexerContext) event.context; - context.regions.add(result.region); + LexerResult result = (LexerResult) action.handle(event); + Region region = result.get(); + if (region != null) { + context.regions.add(region); } if (result.state == State.CONTINUE) { continue; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java index 0e6d25ce..17752807 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Component; import com.sum.spirit.common.utils.LineUtils; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CharsResult; +import com.sum.spirit.core.lexer.entity.CommonResult; @Component public class AliasCharsHandler extends AbstractCharsHandler { @@ -16,8 +16,8 @@ public class AliasCharsHandler extends AbstractCharsHandler { context.builder = builder; context.alias = alias; context.className = className; - CharsResult result = handle(context, builder); - builder = (StringBuilder) result.payload; + CommonResult result = handle(context, builder); + builder = (StringBuilder) result.value; return builder.toString(); } @@ -36,7 +36,7 @@ public class AliasCharsHandler extends AbstractCharsHandler { } @Override - public Void handle(CharEvent event) { + public CommonResult handle(CharEvent event) { AliasCharsContext context = (AliasCharsContext) event.context; StringBuilder builder = context.builder; String alias = context.alias; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java index 9508c19d..1fc94386 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java @@ -6,7 +6,7 @@ import java.util.List; import org.springframework.stereotype.Component; import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CharsResult; +import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import cn.hutool.core.lang.Assert; @@ -21,7 +21,7 @@ public class CoreLexer extends AbstractCursorLexer { Assert.notBlank(text, "Text cannot be blank!"); StringBuilder builder = new StringBuilder(text.trim()); LexerContext context = new LexerContext(builder); - CharsResult result = handle(context, builder); + CommonResult result = handle(context, builder); return result.get(); } @@ -30,14 +30,14 @@ public class CoreLexer extends AbstractCursorLexer { Assert.notBlank(text, "Text cannot be blank!"); StringBuilder builder = new StringBuilder(text.trim()); LexerContext context = new LexerContext(builder, BORDER_PROFILE, splitChars); - CharsResult result = handle(context, builder); + CommonResult result = handle(context, builder); return result.get(); } @Override - public CharsResult buildResult(CharsContext context, StringBuilder builder) { + public CommonResult buildResult(CharsContext context, StringBuilder builder) { LexerContext lexerContext = (LexerContext) context; - CharsResult result = super.buildResult(context, builder); + CommonResult result = super.buildResult(context, builder); if (BORDER_PROFILE.equals(lexerContext.profile)) { List finalWords = new ArrayList<>(); List words = result.get(); @@ -48,7 +48,7 @@ public class CoreLexer extends AbstractCursorLexer { finalWords.addAll(getWords(word)); } } - return new CharsResult(finalWords); + return new CommonResult(finalWords); } return result; } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java index 8c48af34..db25253f 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java @@ -9,6 +9,7 @@ import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.common.utils.ListUtils; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; +import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.LexerResult; import com.sum.spirit.core.lexer.entity.LexerResult.State; @@ -44,7 +45,7 @@ public class RegionAction implements LexerAction { } @Override - public LexerResult handle(CharEvent event) { + public CommonResult handle(CharEvent event) { LexerContext context = (LexerContext) event.context; StringBuilder builder = context.builder; char ch = event.ch; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java similarity index 76% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java rename to spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java index 9f9d8386..4c8974b0 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java @@ -7,13 +7,13 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor -public class CharsResult { +public class CommonResult { - public Object payload; + public Object value; @SuppressWarnings("unchecked") public T get() { - return (T) payload; + return (T) value; } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java index 76ad3d79..e1577523 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java @@ -1,19 +1,21 @@ package com.sum.spirit.core.lexer.entity; import lombok.AllArgsConstructor; -import lombok.Data; import lombok.NoArgsConstructor; -@Data @NoArgsConstructor @AllArgsConstructor -public class LexerResult { +public class LexerResult extends CommonResult { public enum State { CONTINUE, BREAK } public State state; - public Region region; + + public LexerResult(State state, Object value) { + super(value); + this.state = state; + } } -- Gitee From 6fc8611cf86514c99b5c8c2172507f167a94e757 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 15:04:08 +0800 Subject: [PATCH 14/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sum/spirit/core/lexer/AbstractLexer.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index 90ce42f4..194e33f1 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -24,25 +24,6 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe @Autowired public List actions; - @Override - public CommonResult buildResult(CharsContext context, StringBuilder builder) { - LexerContext lexerContext = (LexerContext) context; - List regions = RegionUtils.completeRegions(builder, lexerContext.regions);// 使用标记收集算法后,补全未标记的部分 - List words = RegionUtils.subRegions(builder, regions, this::addToWords); - return new CommonResult(words); - } - - public void addToWords(List words, Region region, String text) { - if (region instanceof completedRegion) { - if (text.indexOf(".") > 0 && !LiteralPattern.isDouble(text) && !TypePattern.isTypeEnd(text)) { - List subWords = Arrays.asList(text.replaceAll("\\.", " .").split(" ")); - words.addAll(subWords); - return; - } - } - words.add(text); - } - @Override public boolean isTrigger(CharEvent event) { return true; @@ -68,4 +49,23 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe return null; } + @Override + public CommonResult buildResult(CharsContext context, StringBuilder builder) { + LexerContext lexerContext = (LexerContext) context; + List regions = RegionUtils.completeRegions(builder, lexerContext.regions);// 使用标记收集算法后,补全未标记的部分 + List words = RegionUtils.subRegions(builder, regions, this::addToWords); + return new CommonResult(words); + } + + public void addToWords(List words, Region region, String text) { + if (region instanceof completedRegion) { + if (text.indexOf(".") > 0 && !LiteralPattern.isDouble(text) && !TypePattern.isTypeEnd(text)) { + List subWords = Arrays.asList(text.replaceAll("\\.", " .").split(" ")); + words.addAll(subWords); + return; + } + } + words.add(text); + } + } -- Gitee From 4f882ecc4f405290eb6fb57cc1763a88c21163b5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 21 May 2021 21:25:03 +0800 Subject: [PATCH 15/66] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/lexer/AbstractCharsHandler.java | 3 +-- .../sum/spirit/core/lexer/AbstractLexer.java | 9 ++++---- .../core/lexer/action/BorderAction.java | 8 +++---- .../core/lexer/action/RegionAction.java | 7 +++---- .../spirit/core/lexer/action/SpaceAction.java | 8 +++---- .../core/lexer/action/SymbolAction.java | 10 ++++----- .../spirit/core/lexer/entity/CharsState.java | 5 +++++ .../core/lexer/entity/CommonResult.java | 5 +++++ .../spirit/core/lexer/entity/LexerResult.java | 21 ------------------- 9 files changed, 31 insertions(+), 45 deletions(-) create mode 100644 spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsState.java delete mode 100644 spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java index 8b25599f..4fdec5d8 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java @@ -11,8 +11,7 @@ public abstract class AbstractCharsHandler implements CharsHandler, CharAction { @Override public CommonResult handle(CharsContext context, StringBuilder builder) { for (context.index = 0; context.index < builder.length(); context.index++) { - char ch = builder.charAt(context.index); - CharEvent event = new CharEvent(context, ch); + CharEvent event = new CharEvent(context, builder.charAt(context.index)); if (this.isTrigger(event)) { this.handle(event); } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index 194e33f1..fe4b0224 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -11,13 +11,12 @@ import com.sum.spirit.core.api.Lexer; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.CharsContext; +import com.sum.spirit.core.lexer.entity.CharsState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.LexerResult; import com.sum.spirit.core.lexer.entity.Region; import com.sum.spirit.core.lexer.utils.RegionUtils; import com.sum.spirit.core.lexer.utils.RegionUtils.completedRegion; -import com.sum.spirit.core.lexer.entity.LexerResult.State; public abstract class AbstractLexer extends AbstractCharsHandler implements Lexer { @@ -34,14 +33,14 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe LexerContext context = (LexerContext) event.context; for (LexerAction action : actions) { if (action.isTrigger(event)) { - LexerResult result = (LexerResult) action.handle(event); + CommonResult result = action.handle(event); Region region = result.get(); if (region != null) { context.regions.add(region); } - if (result.state == State.CONTINUE) { + if (result.state == CharsState.CONTINUE) { continue; - } else if (result.state == State.BREAK) { + } else if (result.state == CharsState.BREAK) { break; } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java index 3e88cd47..94639fe1 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java @@ -8,11 +8,11 @@ import org.springframework.stereotype.Component; import com.sum.spirit.core.lexer.CoreLexer; import com.sum.spirit.core.lexer.entity.CharEvent; +import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.LexerResult; import com.sum.spirit.core.lexer.entity.Region; import com.sum.spirit.core.lexer.utils.RegionUtils; -import com.sum.spirit.core.lexer.entity.LexerResult.State; @Component @Order(-100) @@ -25,7 +25,7 @@ public class BorderAction extends RegionAction { } @Override - public LexerResult pushStack(CharEvent event, List regions) { + public CommonResult pushStack(CharEvent event, List regions) { LexerContext context = (LexerContext) event.context; StringBuilder builder = context.builder; List splitChars = context.splitChars; @@ -43,7 +43,7 @@ public class BorderAction extends RegionAction { context.regions = RegionUtils.completeRegions(builder, newRegions, (startIndex, endIndex) -> new Region(startIndex, endIndex)); context.index = builder.length(); - return new LexerResult(State.BREAK, null); + return new CommonResult(CharsState.BREAK, null); } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java index db25253f..6a842604 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java @@ -9,10 +9,9 @@ import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.common.utils.ListUtils; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; +import com.sum.spirit.core.lexer.entity.CharsState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.LexerResult; -import com.sum.spirit.core.lexer.entity.LexerResult.State; import com.sum.spirit.core.lexer.entity.Region; import com.sum.spirit.core.lexer.utils.RegionUtils; @@ -94,11 +93,11 @@ public class RegionAction implements LexerAction { throw new RuntimeException("Unhandled branch!"); } - public LexerResult pushStack(CharEvent event, List regions) { + public CommonResult pushStack(CharEvent event, List regions) { LexerContext context = (LexerContext) event.context; Region mergedRegion = RegionUtils.mergeRegions(regions); context.index = mergedRegion.endIndex - 1; - return new LexerResult(State.BREAK, mergedRegion); + return new CommonResult(CharsState.BREAK, mergedRegion); } public boolean isCharAt(StringBuilder builder, int index, char ch) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java index 4a68a104..954ac65e 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java @@ -5,10 +5,10 @@ import org.springframework.stereotype.Component; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; +import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.LexerResult; import com.sum.spirit.core.lexer.entity.Region; -import com.sum.spirit.core.lexer.entity.LexerResult.State; @Component @Order(-40) @@ -20,9 +20,9 @@ public class SpaceAction implements LexerAction { } @Override - public LexerResult handle(CharEvent event) { + public CommonResult handle(CharEvent event) { LexerContext context = (LexerContext) event.context; - return new LexerResult(State.BREAK, new Region(context.index, context.index + 1)); + return new CommonResult(CharsState.BREAK, new Region(context.index, context.index + 1)); } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java index 8b235c51..b67d2365 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java @@ -6,10 +6,10 @@ import org.springframework.stereotype.Component; import com.sum.spirit.common.enums.SymbolEnum; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; +import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.LexerResult; import com.sum.spirit.core.lexer.entity.Region; -import com.sum.spirit.core.lexer.entity.LexerResult.State; @Component @Order(-60) @@ -21,7 +21,7 @@ public class SymbolAction implements LexerAction { } @Override - public LexerResult handle(CharEvent event) { + public CommonResult handle(CharEvent event) { LexerContext context = (LexerContext) event.context; StringBuilder builder = context.builder; @@ -30,14 +30,14 @@ public class SymbolAction implements LexerAction { if (SymbolEnum.isDoubleSymbol(str)) { Region region = new Region(context.index, context.index + 2); context.index++;// 符合条件,则跳过一个单位 - return new LexerResult(State.BREAK, region); + return new CommonResult(CharsState.BREAK, region); } } String str = builder.substring(context.index, context.index + 1); if (SymbolEnum.isSingleSymbol(str)) { Region region = new Region(context.index, context.index + 1); - return new LexerResult(State.BREAK, region); + return new CommonResult(CharsState.BREAK, region); } throw new RuntimeException("Unhandled branch!"); diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsState.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsState.java new file mode 100644 index 00000000..6713c811 --- /dev/null +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsState.java @@ -0,0 +1,5 @@ +package com.sum.spirit.core.lexer.entity; + +public enum CharsState { + CONTINUE, BREAK, FINISH +} diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java index 4c8974b0..b805001b 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java @@ -9,8 +9,13 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class CommonResult { + public CharsState state; public Object value; + public CommonResult(Object value) { + this.value = value; + } + @SuppressWarnings("unchecked") public T get() { return (T) value; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java deleted file mode 100644 index e1577523..00000000 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sum.spirit.core.lexer.entity; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -public class LexerResult extends CommonResult { - - public enum State { - CONTINUE, BREAK - } - - public State state; - - public LexerResult(State state, Object value) { - super(value); - this.state = state; - } - -} -- Gitee From 5a47e2db13528ad2004d242e0c5f186e27367b10 Mon Sep 17 00:00:00 2001 From: chenT Date: Fri, 21 May 2021 22:47:19 +0800 Subject: [PATCH 16/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/lexer/AbstractCharsHandler.java | 6 +++++- .../core/lexer/AbstractCursorLexer.java | 4 ++-- .../sum/spirit/core/lexer/AbstractLexer.java | 20 ++++++++++--------- .../core/lexer/action/BorderAction.java | 8 +++----- .../core/lexer/action/RegionAction.java | 4 ++-- .../spirit/core/lexer/action/SpaceAction.java | 4 ++-- .../core/lexer/action/SymbolAction.java | 6 +++--- .../core/lexer/entity/CommonResult.java | 2 +- .../{CharsState.java => CommonState.java} | 4 ++-- 9 files changed, 31 insertions(+), 27 deletions(-) rename spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/{CharsState.java => CommonState.java} (47%) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java index 4fdec5d8..6e34fdf1 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java @@ -4,6 +4,7 @@ import com.sum.spirit.core.api.CharAction; import com.sum.spirit.core.api.CharsHandler; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.CharsContext; +import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; public abstract class AbstractCharsHandler implements CharsHandler, CharAction { @@ -13,7 +14,10 @@ public abstract class AbstractCharsHandler implements CharsHandler, CharAction { for (context.index = 0; context.index < builder.length(); context.index++) { CharEvent event = new CharEvent(context, builder.charAt(context.index)); if (this.isTrigger(event)) { - this.handle(event); + CommonResult result = this.handle(event); + if (result != null && result.state == CommonState.BREAK) { + break; + } } } return buildResult(context, builder); diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java index ee82db90..ed50ebbc 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java @@ -14,11 +14,11 @@ public abstract class AbstractCursorLexer extends AbstractLexer { if ((context.startIndex < 0 && isContinuous(ch)) || isRefreshed(ch)) { context.startIndex = context.index; } - super.handle(event); + CommonResult result = super.handle(event); if (!isContinuous(ch)) { context.startIndex = -1; } - return null; + return result; } public boolean isContinuous(char ch) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index fe4b0224..78ea3351 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -11,7 +11,7 @@ import com.sum.spirit.core.api.Lexer; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.Region; @@ -34,14 +34,16 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe for (LexerAction action : actions) { if (action.isTrigger(event)) { CommonResult result = action.handle(event); - Region region = result.get(); - if (region != null) { - context.regions.add(region); - } - if (result.state == CharsState.CONTINUE) { - continue; - } else if (result.state == CharsState.BREAK) { - break; + if (result != null) { + if (result.value instanceof Region) { + context.regions.add(result.get()); + + } else if (result.value instanceof List) { + context.regions.addAll(result.get()); + } + if (result.state == CommonState.SKIP || result.state == CommonState.BREAK) { + return result; + } } } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java index 94639fe1..117406d4 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; import com.sum.spirit.core.lexer.CoreLexer; import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.Region; @@ -40,10 +40,8 @@ public class BorderAction extends RegionAction { } } - context.regions = RegionUtils.completeRegions(builder, newRegions, - (startIndex, endIndex) -> new Region(startIndex, endIndex)); - context.index = builder.length(); - return new CommonResult(CharsState.BREAK, null); + List finalRegions = RegionUtils.completeRegions(builder, newRegions, (startIndex, endIndex) -> new Region(startIndex, endIndex)); + return new CommonResult(CommonState.BREAK, finalRegions); } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java index 6a842604..64f8e76b 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java @@ -9,7 +9,7 @@ import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.common.utils.ListUtils; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.Region; @@ -97,7 +97,7 @@ public class RegionAction implements LexerAction { LexerContext context = (LexerContext) event.context; Region mergedRegion = RegionUtils.mergeRegions(regions); context.index = mergedRegion.endIndex - 1; - return new CommonResult(CharsState.BREAK, mergedRegion); + return new CommonResult(CommonState.SKIP, mergedRegion); } public boolean isCharAt(StringBuilder builder, int index, char ch) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java index 954ac65e..76b6711e 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java @@ -5,7 +5,7 @@ import org.springframework.stereotype.Component; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.Region; @@ -22,7 +22,7 @@ public class SpaceAction implements LexerAction { @Override public CommonResult handle(CharEvent event) { LexerContext context = (LexerContext) event.context; - return new CommonResult(CharsState.BREAK, new Region(context.index, context.index + 1)); + return new CommonResult(CommonState.SKIP, new Region(context.index, context.index + 1)); } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java index b67d2365..368d76e6 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Component; import com.sum.spirit.common.enums.SymbolEnum; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CharsState; +import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.Region; @@ -30,14 +30,14 @@ public class SymbolAction implements LexerAction { if (SymbolEnum.isDoubleSymbol(str)) { Region region = new Region(context.index, context.index + 2); context.index++;// 符合条件,则跳过一个单位 - return new CommonResult(CharsState.BREAK, region); + return new CommonResult(CommonState.SKIP, region); } } String str = builder.substring(context.index, context.index + 1); if (SymbolEnum.isSingleSymbol(str)) { Region region = new Region(context.index, context.index + 1); - return new CommonResult(CharsState.BREAK, region); + return new CommonResult(CommonState.SKIP, region); } throw new RuntimeException("Unhandled branch!"); diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java index b805001b..a59d5c7e 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class CommonResult { - public CharsState state; + public CommonState state; public Object value; public CommonResult(Object value) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsState.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java similarity index 47% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsState.java rename to spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java index 6713c811..b91c25f0 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsState.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java @@ -1,5 +1,5 @@ package com.sum.spirit.core.lexer.entity; -public enum CharsState { - CONTINUE, BREAK, FINISH +public enum CommonState { + CONTINUE, SKIP, BREAK } -- Gitee From a20b91ffc24cc9e9e18d13f6aaf974249993d3e2 Mon Sep 17 00:00:00 2001 From: chenT Date: Fri, 21 May 2021 22:50:05 +0800 Subject: [PATCH 17/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sum/spirit/core/lexer/AbstractLexer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index 78ea3351..ab54325e 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -41,7 +41,9 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe } else if (result.value instanceof List) { context.regions.addAll(result.get()); } - if (result.state == CommonState.SKIP || result.state == CommonState.BREAK) { + if (result.state == CommonState.SKIP) { + break; + } else if (result.state == CommonState.BREAK) { return result; } } -- Gitee From 7ccdd8fc73cecb0b516a4d1109a6a1f2a122e64d Mon Sep 17 00:00:00 2001 From: chenT Date: Fri, 21 May 2021 23:14:35 +0800 Subject: [PATCH 18/66] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spirit-core/target/spirit-core-2.1.30.pom | 18 --- spirit-core/target/spirit-core-2.1.30.pom.asc | 14 -- .../target/spirit-example-2.1.30.pom | 16 -- .../target/spirit-example-2.1.30.pom.asc | 14 -- spirit-output/target/spirit-output-2.1.30.pom | 15 -- .../target/spirit-output-2.1.30.pom.asc | 14 -- .../target/spirit-starter-2.1.30.pom | 15 -- .../target/spirit-starter-2.1.30.pom.asc | 14 -- .../maven/plugin/SpiritCompileMojo.java | 5 +- spirit-tools/target/spirit-tools-2.1.30.pom | 16 -- .../target/spirit-tools-2.1.30.pom.asc | 14 -- spirit/lib/spirit-code-tools-2.1.30.jar | Bin 14997 -> 14993 bytes spirit/lib/spirit-common-2.1.30.jar | Bin 39828 -> 38806 bytes spirit/lib/spirit-core-class-2.1.30.jar | Bin 41396 -> 41386 bytes spirit/lib/spirit-core-compile-2.1.30.jar | Bin 44595 -> 44603 bytes spirit/lib/spirit-core-element-2.1.30.jar | Bin 52241 -> 52230 bytes spirit/lib/spirit-core-lexer-2.1.30.jar | Bin 28558 -> 27748 bytes spirit/lib/spirit-output-java-2.1.30.jar | Bin 34395 -> 34383 bytes spirit/lib/spirit-starter-java-2.1.30.jar | Bin 6442 -> 6440 bytes spirit/lib/spirit-stdlib-2.1.30.jar | Bin 5516 -> 5725 bytes target/spirit-parent-2.1.30.pom | 151 ------------------ target/spirit-parent-2.1.30.pom.asc | 14 -- 22 files changed, 4 insertions(+), 316 deletions(-) delete mode 100644 spirit-core/target/spirit-core-2.1.30.pom delete mode 100644 spirit-core/target/spirit-core-2.1.30.pom.asc delete mode 100644 spirit-example/target/spirit-example-2.1.30.pom delete mode 100644 spirit-example/target/spirit-example-2.1.30.pom.asc delete mode 100644 spirit-output/target/spirit-output-2.1.30.pom delete mode 100644 spirit-output/target/spirit-output-2.1.30.pom.asc delete mode 100644 spirit-starter/target/spirit-starter-2.1.30.pom delete mode 100644 spirit-starter/target/spirit-starter-2.1.30.pom.asc delete mode 100644 spirit-tools/target/spirit-tools-2.1.30.pom delete mode 100644 spirit-tools/target/spirit-tools-2.1.30.pom.asc delete mode 100644 target/spirit-parent-2.1.30.pom delete mode 100644 target/spirit-parent-2.1.30.pom.asc diff --git a/spirit-core/target/spirit-core-2.1.30.pom b/spirit-core/target/spirit-core-2.1.30.pom deleted file mode 100644 index 8a75fef9..00000000 --- a/spirit-core/target/spirit-core-2.1.30.pom +++ /dev/null @@ -1,18 +0,0 @@ - - 4.0.0 - - com.gitee.chentaoah - spirit-parent - 2.1.30 - - spirit-core - pom - - spirit-core-lexer - spirit-core-element - spirit-core-class - spirit-core-compile - - \ No newline at end of file diff --git a/spirit-core/target/spirit-core-2.1.30.pom.asc b/spirit-core/target/spirit-core-2.1.30.pom.asc deleted file mode 100644 index c05aab4c..00000000 --- a/spirit-core/target/spirit-core-2.1.30.pom.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQGzBAABCAAdFiEEqOc4k/2bIzSwX8nzS1qmeLEMVg4FAmClx2IACgkQS1qmeLEM -Vg4kzgv8DWJJ9PktdD8eRvsApdiFlaQhLfASStmgNfR6HWxypijldrptGu6MswZw -Se+ONTbbCRW9Fcot4P6tcCrWyMy1adDBRmSN6Hkz5RccMSa9iJaCW++dq2pebt2a -q0A3mLrXeInay3r+IYOTVjuA2dqBMXLfGjJ54DQVoT67vGrtgF4qHq5/tJZbS/Ga -ZXTpc6XJ23Fs6LW4+Td+lzMJY2jyy/5w5ROTgI77MgiDXIeX3gOXBiuvOuRaKycr -I1AROTh8F2av5oupMqj/lQpqIoyMqizFgLhp9iBAEJnAlNlmKbSAttZ/h9MAAjsz -sYcwEpQUVb1C1brbtQZUOb9kUr4A8eehxPFYivMoyHB63EOYXSILrJQBbv5LwCEy -i/zxPMcUcXCw6hixgmTwgrpHSm9MDZBc6CbICE4KZ0Os8dE2vRebkDsb4PtC5DkS -6A1wkiAlWHWn/ouGrh3NCWacFjObz6JrAzVRDCJUgy11hIEaZQ8k1OBGaU2Jdrwm -yD2CcZEL -=UXdc ------END PGP SIGNATURE----- diff --git a/spirit-example/target/spirit-example-2.1.30.pom b/spirit-example/target/spirit-example-2.1.30.pom deleted file mode 100644 index 156d0a35..00000000 --- a/spirit-example/target/spirit-example-2.1.30.pom +++ /dev/null @@ -1,16 +0,0 @@ - - 4.0.0 - - com.gitee.chentaoah - spirit-parent - 2.1.30 - - spirit-example - pom - - spirit-example-common - spirit-example-plugin - - \ No newline at end of file diff --git a/spirit-example/target/spirit-example-2.1.30.pom.asc b/spirit-example/target/spirit-example-2.1.30.pom.asc deleted file mode 100644 index 89b83698..00000000 --- a/spirit-example/target/spirit-example-2.1.30.pom.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQGzBAABCAAdFiEEqOc4k/2bIzSwX8nzS1qmeLEMVg4FAmClx7EACgkQS1qmeLEM -Vg7CLgwAoReQ1YclT6ca3PCJgCENn227+VBwy7HgIgh1Bi71EmbZ0MslIR/cL2I+ -LMMf3/7gBsUpfJ6ql05vtd+C1x6CfFc/NnJcjr3TA07hr8QA3BN10bNeP6zBW0ka -xaMVdUkaScr3NP9ydKGK0ZC/F9dNo09qnmmBE8WEARE+IMnIZOX+60Yn2D5KqUCA -vxo2S69Z0aPNmjy6iQCXXxbJpX2g35Fia3tdZm1u+ErEW6ug0ReFLtS0u4PuVbIh -LUOYcd/f9Dyyls/lswfv9iLHCZ9P2pBFAW/DOavk0crj4ICDHhI7SYFVnFhIFPdJ -s9486CI7EiLYkuRsps4gLy+lUvOX1hSrGoGVNvpmQLe6UIkDv7PqFQS/tMyPV3gC -TZI4o8q65yal0T6HFPPWO52iyaSdAHFuwlyxucs3UT4rW5+tfSLpo4gbrzgChavC -MVS4txoNvk5HqHJ+P10KSyxbb60SEr/YfxUTrB93hdxRK/Gm0yn8J2gpoUSRZiUG -4J0R0Eci -=Vfrt ------END PGP SIGNATURE----- diff --git a/spirit-output/target/spirit-output-2.1.30.pom b/spirit-output/target/spirit-output-2.1.30.pom deleted file mode 100644 index af7cceaf..00000000 --- a/spirit-output/target/spirit-output-2.1.30.pom +++ /dev/null @@ -1,15 +0,0 @@ - - 4.0.0 - - com.gitee.chentaoah - spirit-parent - 2.1.30 - - spirit-output - pom - - spirit-output-java - - \ No newline at end of file diff --git a/spirit-output/target/spirit-output-2.1.30.pom.asc b/spirit-output/target/spirit-output-2.1.30.pom.asc deleted file mode 100644 index 57f09d98..00000000 --- a/spirit-output/target/spirit-output-2.1.30.pom.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQGzBAABCAAdFiEEqOc4k/2bIzSwX8nzS1qmeLEMVg4FAmClx4gACgkQS1qmeLEM -Vg6wKgv+LFxOcOJhyqE+6yOFcMUDp5kTGlMr08nmzBzQ93yOs4x4vT0bF19D7HgN -YAYZCtZp63pVAu/RIoGVQBK3z9eyVc2I6W84LVpgTPM64nwuBkhupSUavF965lNq -Ei07XxibPwummfKbDOUz5zNAY1NNOpl9ezYJinvK5xmssyXgKISoDCnkCnQ5RlQu -9gV6hSHXtEMaGmegeFnNphkb6CBWs6n9m+0yTpjCYb//Bc+DHx075fmMcSqOrwQr -pzG62CxlZSvRDg88G+rkGaexND/KdNzb92s9a3J1Dc3JdXjgPwJ229gHqpql40qD -9ewqYngXzvrsBPMiJ10EGqWtde/xwEPjLr+JuquhEiUp0f7e79zAvVKcsZ7PGRcB -kt/3sdxaKzDjtBas2jsh1YA3kUEEK9yluOLRdaJeTsYT1M3c7bnR4L0Zny2aZuXZ -FvqBDfI0dvdLvxwZE3NM/VehEEQ1SRGrRe+Gs50K7Zq9tg4jdLXA2Zq6lvqMUJKi -an9W6kUP -=vQvx ------END PGP SIGNATURE----- diff --git a/spirit-starter/target/spirit-starter-2.1.30.pom b/spirit-starter/target/spirit-starter-2.1.30.pom deleted file mode 100644 index c7c747de..00000000 --- a/spirit-starter/target/spirit-starter-2.1.30.pom +++ /dev/null @@ -1,15 +0,0 @@ - - 4.0.0 - - com.gitee.chentaoah - spirit-parent - 2.1.30 - - spirit-starter - pom - - spirit-starter-java - - \ No newline at end of file diff --git a/spirit-starter/target/spirit-starter-2.1.30.pom.asc b/spirit-starter/target/spirit-starter-2.1.30.pom.asc deleted file mode 100644 index a2662504..00000000 --- a/spirit-starter/target/spirit-starter-2.1.30.pom.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQGzBAABCAAdFiEEqOc4k/2bIzSwX8nzS1qmeLEMVg4FAmClx5MACgkQS1qmeLEM -Vg5abgv/ZB3FGay0ROBWs/xVvhk/GzJXJ6mnNEsN+AvfoLaPxFQMNeCgOk3SXCeS -EhuMzxu4jKRMLFe+hQIzvTC/AXog0whi+JfUwe0IqPrUU2C4kHVC4w2AJBb81LcE -6CVELM1a9D8ZjTUM3ed7/BkrCYmyWg/buFjHCYdLvLq+vZJ0cqIQkwZA3L58qsnw -Tb42iEp4Mc5zV5q70rxrNLtP+r1F1hL3ZaA6JxMBHKIb1err45h5Vxx5/xvsY3ZS -JztJFYEHv4lUMCgAD8N13ip3f5uR8PHKql1k9qJrHCGvmZQBMsJnYGY8FIuOnf19 -9g7U+pnzRKM96YksLaYepZt3nowSJxS5jGrmaC3EA2B7XPBurvoUszgW2hBkn0pr -vOJI2eGYo4Qjhe/p6beYWBb4VX7+RizJh41gy6X0Z5GSL5+hfCNxewxFZ6Xn7fFd -L0eE7tf0hQrclrOvFMs07XgXYNTmjeI7yd9rttOSPA46oSIN1R7yVmcMPnJpieKt -vXKjwHUJ -=Xv2Y ------END PGP SIGNATURE----- diff --git a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java b/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java index 069aa9fb..548cb064 100644 --- a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java +++ b/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java @@ -56,7 +56,10 @@ public class SpiritCompileMojo extends AbstractMojo { String inputPath = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\src\\main\\resources\\sources"; String outputPath = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\src\\main\\java"; String classpaths = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\target\\classes, "; - classpaths += "C:\\Users\\tao.chen1\\.m2\\repository\\com\\sum\\spirit\\spirit-example-common\\2.1.30\\spirit-example-common-2.1.30.jar, "; + classpaths += "C:\\Users\\chenT\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-example-common\\2.1.30\\spirit-example-common-2.1.30.jar, "; + classpaths += "C:\\Users\\chenT\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-stdlib\\2.1.30\\spirit-stdlib-2.1.30.jar, "; + classpaths += "C:\\Users\\chenT\\.m2\\repository\\org\\slf4j\\slf4j-api\\1.7.25\\slf4j-api-1.7.25.jar, "; + classpaths += "C:\\Users\\chenT\\.m2\\repository\\org\\apache\\commons\\commons-lang3\\3.9\\commons-lang3-3.9.jar, "; classpaths += "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\target\\test-classes"; JavaStarter.main(new String[] { "--input=" + inputPath, "--output=" + outputPath, "--classpaths=" + classpaths }); } diff --git a/spirit-tools/target/spirit-tools-2.1.30.pom b/spirit-tools/target/spirit-tools-2.1.30.pom deleted file mode 100644 index 354d707b..00000000 --- a/spirit-tools/target/spirit-tools-2.1.30.pom +++ /dev/null @@ -1,16 +0,0 @@ - - 4.0.0 - - com.gitee.chentaoah - spirit-parent - 2.1.30 - - spirit-tools - pom - - spirit-maven-plugin - spirit-code-tools - - \ No newline at end of file diff --git a/spirit-tools/target/spirit-tools-2.1.30.pom.asc b/spirit-tools/target/spirit-tools-2.1.30.pom.asc deleted file mode 100644 index a05ffbd4..00000000 --- a/spirit-tools/target/spirit-tools-2.1.30.pom.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQGzBAABCAAdFiEEqOc4k/2bIzSwX8nzS1qmeLEMVg4FAmClx50ACgkQS1qmeLEM -Vg62dAv/YeqLwmGtIurdXFruO0tC17ntDmVWFq2ipq3YJZpA5jUk5DvV31mRySFC -dWjsjym1YFl/bYjjTO+MK8kL+GpzfAPBZelD/GLc7QwI2YhiCkYHjA8vl73yA+dB -V1G0OPyHD5ggog+UzrHOoglqdyyTALLVPn03Jm/sJRd8DGC7zu8PMPCln/1OZBWy -gHsH76wGBzMvMmISGbTmqzQQXfBSn0ZK/JH1LchcrjJ55ihgtvBUhImNNBAhyS+d -q+yQHuEqQDGC1SBq8h1BqMNE7I7Gbg3EhstuSIUKa5zDiTRIVx2iHzzDU9pyM5Zh -3g3dmar0jF1Q8SqybwqeNQ1rPR3f+gQMUN4nDEZ2BHpO/aekYF5Uw6CUfqK2X+UY -ehnKxP0StWYLXOrlrAMYTxeEFngad66XloheGiMf4yBGg7fhfBmGqPuUv2TR96Ut -VeEG5g2ZKF4liERJeT6SJy6VMIuV77+wKXHStWvsUDP1Mx0fClXxhBgMM+u57US8 -UZIshZOp -=hmsr ------END PGP SIGNATURE----- diff --git a/spirit/lib/spirit-code-tools-2.1.30.jar b/spirit/lib/spirit-code-tools-2.1.30.jar index c27c014b4568b2d5931d051c0482ffaed78420e3..65e288cc05029e29259f523117e23d0680d82cd8 100644 GIT binary patch delta 2958 zcmZWrc|4Ts7oQpXGWNk3WS1?%jGZKeNQQ2Sikd7xehykSV6Q7*k>{fG&6L9ZZ@Q81`q}-(yb|2 zm2RWKNV=^9pP^e-h!P+M;Xd+p={5*rz|csot%h8utzR^<@k8j2v1B;|FEwJil9BsXu@Np99IuhCR zrvRedVzY=OIU1VL7Ec>br*&rrVUUOnySsbQxB6A_>ZTxxE{`2&V z#l4E;9_jQ?=gg6#zBlBNCCLYHyY))Z$dbl9knn=`~oOZhN%)hD}_xIx@k*^wvGRu1bwj3h0^1qBIzW#-T zypHlPcOjwmfH2Fb+6}h$tfd`M3B1KkDMDHJIdn;DK(4SH#V+&ZYJ|+Kw)e8T!40{| zpV#^7g_bSkBVUtF4{k~;g~w+QxaTPDxN?}423QM|(9gXP8>HGWXjbL`LlPn7?h0NRWXxMY!sYoS-^J0ht#IER0Ub{0GTdkRW+XYV0moN%e{Jc6fvuc(Jv2-$uH9@c<*+qn*(6B9D0gmB`FM4w-YL`|=!%qHB;+ zW<_e#_*B6Ioy)_Qh9%UumIiVG>|3#DWd2@Z?UN>Ne3Q@Zmnz#Ct;%*a)!5}~#gVF< z2%D3af|S*wo>cZP^gHo7^!bX`g=dg*u7qk`brEr34tpAm3`>q5Yue0GP4cI3;oUH3 zH5;3P8O5&GOS7?`J?A%n#{TqI65IURyf|~!%0RZhcMeED$dyPO`8 zY7aE@(e>hxnukR#=(NpRk#$Q-AA=WWfZg1YFzU6!8#_?Zg}bnNBQ(rBdHkBoaNgP5 zzxHjHT~G<1D92{WFPnn9_(aYrx&qy0S#_naPn_!GlHzZplXN!~X`YO2SP(c|fi@ zbF~RW<0OsJDEPa%s6RQ)vAKl$vbu&}E)2)y$@*BF(uiB(puZhvX>S39zrtd$v%+52VH@p|k@*oGs zR>g<{(G|ka%U#x*%_eZXG|Cor%7C9mpeTvbQ4m(T%ijAAeIOVc9afj9j#-Xb;PKUr z{l(VF9sk&Ecxl<$j063J-Mc>Zy{=33tff+l>-f30+fS9=SIjQj;~FbVsReOK_y3Sy zp1SkY`^o-*>%6GfVA0A`PbIEB-W7TZ$=-s+2fPrP!k4joj)uq>1oOx_#d^%-JQDZws49~r}%Bz@f2vxae zD~>j{CvNM14hiZhToY1jf8D5!=EBGR-Fh-}sb$x&{lJJO82)`%ACn|6mSj2^>GyiI zLh|7Sk5u+Mj1;NqFmU`!zPylNz%tWwdpQE2LSTphgTQ~K4X~zx)TQYIsy6xluzmM< zKr6<1)RncVy|IdgjhU*g6^)1;bfjPaH%)|47d62vH26OlRucgx12vjLE(1yqW}q{w8W1MM2_Y7fdMc?6u=-kY3Bi?BN31yT1XrS zk!0ikaZ58)m`sDEp~v@110*1HDtBcjAP99x7l%SXTo1zsTC6}jHB6IYeJBLD0QiKG zr4P5BdqJRux=#=T2&DFXI1s2Lk(Yta_>oQUXp-+=2}sjMK;)T@29*N-*5+iRZIu3d z0IJ$B$S^Avl%z^IA>gL=;WS^UHN!mgFhUjvT+lfTJL@1ISulDhcV%v1K|vU3JA!(t z5JLC}f&s$1ob-w7)yL6O5D@4lRjcY8n>bnYFj-d;=+I%OA1SvM0@8cpD9iz%wfN{9 od}^^_d{7YRk{AetJjQWVj-Gs=B__bcOhaJQw}R@8XwX*w2PD4g9{>OV delta 2956 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 VPJ+BB7x$J2&U(vO7EOC=_CNVT?Pvf1 diff --git a/spirit/lib/spirit-common-2.1.30.jar b/spirit/lib/spirit-common-2.1.30.jar index d227df6489a53143bd19d0cef9754afc240eb8a3..edde1d6e6dd52e51ef58cdf1228d92503d6a6317 100644 GIT binary patch delta 8072 zcmZWu1z3|^8{P&|gAvk$kpt;&3_u#BK|%p(q`N02QWB%21nE$^k?s~ONQnBy z?79E}>dM$Se{@h)tjfmF1fna>j&9c=C`424 zjtTf2)zNAolFyn3nFR#L$Kh8kQc+&<8rd~52`+glczqF8Kmb4*sm^-?=@Sn@Si}x% zcHF`5t)f>~zjgPn)b8S{l+W&bQ~{o$X=!No>zs$;dE}g0Q;=ElTWQ#IZDB4dQd#S! zBB$^)yYthZJ{N!|VA0{W04!U~2zz$C)ZF#g&w14gm9jWhqx6D3@jZt)>@1rWIY6gL zD_BELlW!M7$g$n=-IrVP*E{Cr5UqJJG&Dpv4g?SNHi)Kcn58t%f~GV+?qUTNe@-mq zoYBa*Rj94oc+)#hf-%;9;_>Fn8eiaVuV*f_(zXl zL}Htvc3Vp-y*Qvb6CPk-&nxfiX+K2eTuC2%gjUV89T|ZVZ=YH{ru>QsZ&S-5Qph5L z*v5ts;eUTpNt$$(^<&5hs(PObhTUhEPV!)!ka{fi+a!vgi ze$YQ_3j6o6t(w1Wel?XWIm2CG)D$HGks7>02-UH{dmVR3vF0xT<3LV5N68>)lk-Y( zU!kgx@^oxHW2j(mZZ%f^t#mMIZunum@AQX;PWexfh;QG2EM9NBnUD2`V1~%2VlniM z(OE4ku9;_AOMz}&5|l&tNArv%(NJ%(WMQ>-WOboHAWMPd+OWBs5-ues6OM)X57$5l zf+;-LNIVKA6(Y64d~Y6{5>m_YYh_8+AGjG;iDCS|ZsUjd?mGh1JL{C$IshhKV5 z*T_t#WMk`dlvC3ikB`~k4wJTBE%-cj`gjbfrp4n|j2-NvqvQ*VhY4lqmzh;z9&_{z&vs$lpKOhg0TVTSET z^HXYBOLE2NpPcG-ceD3z3Pc;^FDYxmnYO==N$mUNm{nx8aCd!^3M75sbuzn@?V~b| z*(X$yQX5HJp%=DGyq@nkhIH_W$n=;HSu=Dv6ZYN6t#Md4i;-WI5M^yzYdW|oa#Los z(*7CedX!vrJ@JHGle?LyI1z%!?VYRa0kgxL6@Nh1IN_|@wO=^U+a4492SG|al@vUt zwvB772i4Mv{+&JqbVou`(f*Ae?LIuluPumPtr?5k0wo5l=f8Y6I!jv6&UkjsymiR@ zd|b6`ti@P0O3#5inyXT~eI`Xu!HT>CH1pD8Iq7n>h>J+X#VSO>2!>b<5jI zVT^LEkh$w|_(@ZQ6e_5hxUvWX7o*blzks^>cW&q5hxHYWq(zu&&6bSNOwTr{>^ zU}NNZ-d^#HtP+RW$!^_5&?AtXMz^rXRa(<>-AIjI;%Vqbd-5aYJj7h%n&*MM$gDJ- z%f#@83)5`Kfl};K#_62tgKyklTHgr>dE1T9DM}U{SZQnO2{zi})9sGJODI4?9!(D; z@k0*1G888>sS+0XD(AS=w(^Shx|$DPIDWESaN-dMr5{inEZZz-6s~u)l!cTXUBL%8=vNt&U%yZQ_Al zSWEIA9qaTr4D**Jp4$r;ORIYxBCxG;9`^)M_G1kTv+zZu)~XrrkQsvI5k;4&)vs?M z7Jlo|PjPWvoR;_5us?wY@}yHkFZK&5m8`VDcE;g{2K1&+KOpY-3#=xMHSiKzj(KM> zjQJKNCUtCBuxZ=J+cxCx1sBt*Ss?}VGJ^OElsL2v!b?D(moG5YussLa4Y+8ku#Sy{ zcPj>GoG?9ECMC*p#w8TFLyt6S>RjTrp{KOb%g+@DD&E~(DxGQl1Su{1e571z<%&HL zjN~W`VK=oW+d+)VgxHGpkSlO!SBc7DA8_XG2eyq=J4bcteJ?NA`4CzS(xpMaArnF1`Qfpns6xY#ldtAe&Uv{JA;nxNc9Bju z#Mcbt7VvyVQ7L$!F|YDdD3hT*$0n|xPc8>Emjles0Yk9VxTMpNaWtqImnxi8<0;`# zjf9Y!gjo#w<(3hSt}u9WwI+3lPLx5+pDlmV#m&)aD-SHecDx=SB&OP0t7QEeM7{qQ zS1cw@M&rw?P?Kb4ZrUTh&n)@cyi55vv=+4xzSp zC(XPSxP1M+*{_`AXYe}Iqr3I-4h2u{8tqkRJdv5~I(c8Bb6s*8zXQE+xCzUytg&0gG`KwRqxvvaWq0DR}XW+qgj);E~wGqLdDQ&XFwM zTk!B+kR8i{_{o_xbEi-7Q?ZAn$%LbWvHSR2K4aRESl^_p_IGe9@$Pd6@+1=*aWnSm z4pDjZA&%ZPRjkB@>vK_ODEIAvsZiin5J<4`1K#NHKn}pMalxhZO%_Kew03^vV96H> zY3CGIkiBjb+R9h7v#*%*+DIcnZlTIk>XcjK1Vg=W!bCWeaBS&M$UmwsHS#enNls4@ks#~7Dj{OwCN~h_1zi;q?ytV!!aq8>| zWnw~;llRyVk?*e2kL%h#u>(7`v8|@egjx;_B~3Gv0=EvI@x+m<@a$={%@MVxI?)Ygs?7{*rwn)#INLhnvUhsdg%mU% zBII@RQqt|?1#XDRx7&=@g$ouje41X;U9)xLc|XW!yBt}f$6;~7xS~Vr{*Ky(jOLqj5dCLcFBky8v2<$_GsB2%ZQ7 z%)vv4GN(%X=E`O5cZ3YZqhj?dmCO|(MhIuvkzH&}N*(cp819I0|5|c7@bV`aN2Hf29i zA3NRfis|YFnPnFf7k;*ls+D;O-lM!Faa(k=ZGd6-MS4I#RcyKhyujFH3sew}uoM|H z!T_rXdYZlznlkt?fcN-Tvaq%nhnHD;E}q0@jVVp*i(A!4Z91Q%`(cI64>P~mStC~> z^L04_KaBgX`LoGB;83;N{=#F)NoOF8|60lPJIwBZ@+Vxwmn8kG%1{FxMVXTEp6};4 zXZ08Y-)nNQ95RO-+WZ=bYrll#j39=s$Li*1U%TjjpyzwDvZjkyr>`~08h7Gll921# z$thOiM}myOmLkT5vuLZn>N#?`Pe)XqNmibe`{Coyp(&UBDNs-N`$@rMa6Rn@H|z`< zPteE%QNS#hY2rebz0NxlT+8sGIymE8Qr=jdqEBlsp~6|lBTVHd?zm6rFxwDN^X{KA zemZUu2B=t<<#6Tf{rOM@`48&J#&`>c?<|X2JSXG9-gF)Aw}}uWn@7Nd=rE_;Io8MD zY2HbsIEus9?}ayNWsLw^XqyL;@|^3?P5QMY8|5i4M#b_|-Fp|Nq#}c?tXMi^AL?D4?Mh#{I+b<$1Gm7=#vwnp z*VGQM+2v_ehY07lrS9%aRh(7dR~^d{+;zMRj4xv^0RjNPm<1Ko;s5)2t_rC>a19;0 ziTEz!pesk1t5-1`A5-a7<(!%u1KmW(BX||n$;#I!c~`4XqCd5t2{VGO8b*ygO1AT7a(OBG+fSUnaZ%~o}zHoiCx&eU%& z@MA!@lOO*_DW^b2-p0yUetPG^ir7!p^wTfMM}tZ6iYM(pYTL8RO><4#4^LZ-jn6@C z41R?RN|Nt_Id*0xTf(*@dkMQb-`86frwryqMPQL7-HY%hpw8?wgOYb0u@MO0i~Q6b zU{JEW%j`!0l;$fb5uG5swh|HvC%D}e6S5kk^Yd=En$Ay^K!c;1F>wlZN;dEFAmaCa z(+^UPhl|}mBE@WI;V~Sm>3i%+L0{rG4dmB9hz-6JTA_J!klb9kMkC^H*xVbLvA~A( zwV^>UemkhUS>7Q?bWMapIO0Lurig%wjps`aL!k=N!V|Gm{qhdQK{qlZy&D{~DrDf347RZf8 zy`4`roh=w^ub7;kc;2hE!#FE-i)rWPqqH_dTBO^CO&?H;i$a89>3!^CaF#w0-2*-pX-DR<7shf-;1%o ztE|7a`K+l6CeXt3+T)jxv%TZQgZ>!z^e%Qm=GPlW;XW?mpW2G_UNN(L>s(t^dlMEj ztcxhgIIkv;8PDc5Q{Idw>z(e4v##n2nKy$nGE7X{4%t2C7g%U~cq8&@kc^GN$4;fP z$#MpZK1aME^+$PZ4uWr$jaGz7_e5MOso{EJmhNvJZH+#%ypV!Tr_OXKVAHMaj`p8T zz5Jq6&bpin=R1xO{O*FBw-dqBvfEd&PNG0~cYgIL8TN8-wVO4IOm4YbMMcg+YUEtH z_0;2oxC6E@St@X^FXF{bRvfOmy}S1O`OUV&u3RECADo5WyxZk6%KJ(o9zjVGlji0J zt-C>K-SKkA-&L_I>ua)jK&UZzctlN{qrso`@fZCb`=6K$Ko_+(=~Xg24PlO0@}XvW zyNn4jV*MJpt4WcD70GHhN!o60tSC6uXKG5HLRyx)zKj+02_*_O)L+l|3@6w?JPUb* z@yG)suH4q;OTTmM=g;|%a*mxyAvJ2T9NalfVKFBkb4D* z;x^+lMy@X*8}a$^-K0ks4}%C?^mu3H z94Muy6@+n{4#r^&uIe}~S{wieKc{xW4|vSz!+0uQ<9bB8iKxh9g;U1ei9|R9h}HR; z(wO&+A)ZWG)TXn8`e7k62_n>c$3jc2s9&vHpbLOv08t+0Pgfc}g)fq{3$Vth&BqJR zE6<7iX-4SvhVm`&a6x)ZBJtwmv9|HP)oR!C1X^l5on*bfQ=Q>UM7%Uz39U`@6^-k@ zInKAVL1~#aMyl*=w|?Kw);#Nm9haFN#8GNfa!R!0&&bgJ@MxX2uFzg%K?(3N;_^0%zN29Q0OchA`)vm5QO4~a)#3AoF*09X`I}9vRyP*3y=V9;Ki<(sy*=sLNHIH0J2X>9Ot8vJjy z6XC&k*H5LyGY8@PY>=LK)`23DlC)eJf%i;@_MER%@@=h^X`T(eU1qPamqdm;)J zOnj_T5q$Km#Wbh_q^99gAx*}UdF%8)JloHs5nNTR3l$L`m^;^LT0j%5?_s!S=-R#FNTbwB42YQq?(#ygrC+ z>$_-@Ut4)vkh98sO~0CK?M+colDTvz_~ysd;D?WiMevvL%VMV*i;J+>3<`2`lY|vQ zQ{`~3S=YV}WY)AQNU`C?xxtwl+>{xb$ z&8(yN-GU1BsivO}0fb!HwHA{fjig+=-rm)I{jjLpVC~*~QZVa}1+9z(>T8GxJS7ny zZ@@U@a-1xSqo*nyQV3qXh^~A?D+C#Ad?c*oLt8>0G{-YsNknpSeE#rUo@2@Sob`R2 zILsq2f>Zh}^V@8j{2dvaQ%x^F5L0=ayTTj?y1WjV@$ znuZfKsgpG9+^UlSbTN-~KGM57V05~Abuym|smvRz0eY-g=53>daTg7R)u#QXzfq-a zf2OGw>!>Fbor-_v=}aN>Ew(8K0XT+oH<~~y!l=Ac^ZzA+vzWgd5BlLh&n7~?s;%s4yqS97j!3r^bdj|w_F3;-YwnA{K{ zna32;P|v=@DHou)iCws=;UgNeucHhHKup7ajy5Qy+gbj}?3mENSKn1~<2I%iwofOp z21U%9%$7!QSd-#`kHTHV19;L5^IgJlZ@q8}k?>oD;j((+tPUi_Cs&G7j5cs=nD z=mn*b74{dL8KU@|DQQRibV=tJ}MxcBcZ@lWOO8@(B<<2 zD!=mQgE~Qfe~18^Qtha^nWH_Ay7HwW9^iMT2ssrAg)aVXb9Mj!cA_XK5EscA1w&g? zje>%Nfk=jAO2YpYibFNoqMJ~;9Rh;Ct<0kui>?|`nIhml4%f2Tgy`Eq7{l#-As0)NN#egHH ze-qYG&@~JcB!rZV!9#aRF$N0K#z0#_rKphMF=S|%HU;GXCK|r9km*Q*R6$-@X^Vw| z=<)u!B0i4t@`89I6yy#5!E0c9PP$`_RA|^V8460J z`UB@DU%?zG_Bb^Ph9RSM!N_Vka^&|HSAG{IK|wXNznh5vz}~2l8o7an$=pf)z!EQ@ zpllAbzSE1VoS}Xy6g0<)hAw-OnR?~PzaO;!cAJ75O}>Lq_Gj=lP@Tw;K*O;}2r?mw z1no@*%9@iD3Wgy+zd$EJk=dw;)m1`6xA^gpCUIEEjTrP?A?M?`AS&iP-(OY)J~N6YyP5j z{wU7GGoZ=fR9zBx)a!-sv;Y9-Uu4PqzsW?GgNY{d6v~ZcqgF;YY9Iei23w-ZQHuX1 z|2yL1`b!zh?y|ecSR@YeA{mNS_F>m|p+qTf-~s@DFC!IK6!|8a^zTFMZ&JG#TJb7m zqs2g-bI3;2Ecf`M_Lu_E5_n!0I>-9Y6NU20kYDA?`Q$j-rgRro$Kp`4+8uN1e;rbvD$Q=e%Bu+BR)C=3h?BFR%98n!3~3yZMt^&M9L<=n;ohoI zBMsBtqUy;&fvj$zg4C2SvHnZ(iWdkAbjd5BkOl2>7`cfY4wx?ofE)yb-Mha*^xkX{=Wp3&0ZtLX8cYTc)RrDWBVdR*Hdc|QJ^*+(1 z$_P#W{P6=T{(}F|{>LP>rf3={mx#6Iid(42FQvge=!E~Z8sn&lc`XMoJ~~t*^rwoD zU5#H1lR#9STmX5Io%WXBsB&%!$BzlEfp=%k3;@|@mm&+k?PQ_aP3_vmx>mos+@_9wnC9OK>_ zYGAA>5}+1Zl~bnqG8MD3CDj5QlN}`+2b%n|2TlVOCEej<$ISNUGmud@4rl8-)W*S}SWLv*hyOMwA<=xlQGV;whT0e_30^}q;H8XESZBfKu+yQi?tRSlQ|Qcc2QReQT3_y)QRkzhgEXQTScYD~i^S3NTC;_Xe%k!TSu1;+3QoVY&i)(0ACFm?$s=*=tIz2VTMhhvJ(8(q##p!KzxeRn zA)H!!#%Aejr54-&E}&83O=`g)$u!>TePWx&@w6n|kN>)C+F2 zJ^j3H-9!s7EcRPs757=*kj}|}_&BJb;jr#0m?F-`(J%KszSi}(v3OOR**stM%V9bZ z0+ota#3dp1+8vTm0-}-)N&|*BAtS4lbYr#gBbcb-@IHQGlk)DDU5_ayeAM)sAR~93 z6Qz`bI6);I^k!!U7Mdk-ikbV%GaossjBq*bE@)S_t}txe>HeZXRr8!ibebjMM)3kJ z{360L;0Nz>&w?6W_MMbLV~SY&`trJ4hT91h_VE?mMP*)T(8)m;SFN)3`~KBTD{xMB zMhg)V{pWNkJVyy__a(B!*6Yvp!E4IxV)2YACI+n0Iw;*YD(G7vryte@FXlLN>cKYe zD_PeiwyrtHOC};nZ#wFUk(M|l4MP@l5?Bvi@f1nakx&$LGrtO zeEpD;68U>VOl#Z>`Bj0kp(wVAQt1!5wGNJ%xgZSKKcROO_EV2h6rc*O4W*n874_Je zsi>Re&C1K?;(OelDUTU&OVGA04L+wePU@|ec|9lhQp&VqYWCaUMVZmwOJ{dU5vefz zOq=Z^ie2*}WM_E?Cjob-nEI2Ky5W5Zz6T=$O*_(>Jk)78!z10y?>L{lL2omZbAA)f zV8CxZ!#EF>-|u_*fX%Aj#+{e3o6q95^~@U_@Yt3PmxM4^9BRupY^b_9sDjjSCP*9( z>^q2{*KRS8LGs9c_2qSq-im2(mHj~#I{Fb~HXE=G3Rg7{)JJ+xWw`wtWwCxY`{mcMGP+UtTte=;@57@uYNJsLJ;t_=z!uhwZX3Kf>vCh}m0PJlsv>3FLeUw=_DUxjgb(nVCJ{6I-IDW?nm*4;DNI8~9UHGzxt$pNKPKZ{M!O((iFO+F#Eg?hqOZ1o|OQ<)CV;A$bz z94MaW_B6o;*FZc^>kYII_S?5*tOhs}SVf(Cq24pK(o<$1<&-yBMCMrvOt0f3z`z@vOty6B zqLdpR_wDh8Q2!|#yDwZ^Wj_q()K`X+LlP?{49%5Z3i50m)YA^`X?j^`z_DNj;mLlux)!LO zID%KZUiMW%`93|mEK5?FnotDw{E(@?RELjFhkl}t!I6O7(6Aj2idl;)+Yzl#S1_eB}YY{A+pA1AV!qgYIvok5Rw6)d-d#kG>M><>azhgA<_4pI* zwHHc`-z=ha5#*PA-i}E$jM@7cZYCrhH__9Ma@k*A_Fe*bAdm?g2&9Jl-)6R!2ds0| zxm~F8qTyfmdhqujZ|9?fK)Yaoh=LZNdyWNMco9RB7j@?42>az{p6G@1tq?NUVucXS zqbn-_Y=Kg=t7`duO$|yoltuP9x@JnT+(3LYg@5!{)YbtA+-)M$_!#A<+Py5Jfd*U+ zKA)8z`y(U21jVgAF1|}be_?=3I_yx`o1>7(ug=783TtFGtRgSN{zNrBQiguIVK&R# z8vkKOPTgO6OYa8Vhx9^g3Px}(Q&AOr7c_NpA!GnV8|jSRkHWx|*-;8gk}VqRis;N?n<`PWY0_c3()jc-}xRJo15^# zmdL%xOz(RJ%DAn4(g}Ba#?k}TqAz+4FSxd1n;OGQK5*6RmM&mtx*k|a`jr40xzJZT zmfGXgz2?0(q$A4p>f%#)wbFvM>QnW(eWrSk-^(dfno~SHILp^dky-t{w>0$ICZBfr zcL;6qn)6-1mZP35@q)Rim8os!(jU$O?5jrL)cK&rvAtizT@m_q)K%J*)-yrLoDLbK z^pzBtfstn9aoWMbz9Xd#Fxi2U${lElj#esDDt$Yi9Xt`oJ9nUVK<{wgcstbe{^x>El;bg)+ z&oNi4xy3yd_k!mK~%={R=&3sguvhbWn*|Ie0?5AV{#U?lHABr{Z+liNf>?#S^7$e!5q} zFU%E&ml?OEy(Nwr3IrkvIv|uC@}`7v>aL2E+X<%8v9&?>&L}R6-oJGWQS`3WJQYY8 zDzel`d8TuWpnyPUsEAT`3&119hsGpAoZwP~u%+Qbnu)q34VxUPANG;qe6;aWkJz5s zgt(N<#XeVBZ<_buvUZrY>seY2=?T2q5hoL!6+qeKe6V|8pte?^^804xz9dMZUj;{d z!OpBS;tW^m?Wc|dZqJD&0eo7xrEay##b_J-&#$_kT1@MQO0eDl7R?PMA?QhWw4Ik! zMNaGf8*|B{Kk=$u2vM>)mw-0` zERD6ZNw+E_@x1T5lAf;2s6K>_SdXNO5pi^Da)n#@q>ocXJ!H>vCRfn^6qMIY)Sow! z@b1}DQS}sbKZdX1tf)tPsdX_lO#@>W`#!issqJQh_cj8}ihTE$XL0mHqXkywl8VjX zU>Qk>xk;AVbjH!@Jx+Q}zSi7@1HQ;1t%r%G-zrZTv#s1sSYxU~!LAoj!LnSK*cSLT zIK4+df+F02wM}M$_mIh@ut%w9h_y|zMPt>jr?e@c)2`0^jfKVZKrRLDq-R^8Kaa-U zcXz?oWR33{HnE#xhR;!!RT7?k7rqRIfBpPdC}>#mm$J#BfYQ&R1cBE&rSJ!mIu%yj=C=GJ(Raf_`o z;bR94a3HLQgkxrz*akBDvsL1S*8$pTPBh%CPM#p^i<4OG_WRB0GtB31w3Z1S(l^4W zCMk7%d`iv317~fpVKw~KCiV_b-

f`fbPZQGSJtW^v7H`}8ZlMBC1(Vs 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 U#2Et!bQ|$9CIo>PqAq{^KZ5NKg8%>k diff --git a/spirit/lib/spirit-core-class-2.1.30.jar b/spirit/lib/spirit-core-class-2.1.30.jar index 8ef7c5b70290328d3706c41ac4f25d5c6594ce2f..ac85a896232f28adf345aa45ef980c73f24f7c4c 100644 GIT binary patch delta 11603 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 delta 11571 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 W$hRHeKhuT|#QFmWNK?k2)c*%W8d2*2 delta 16150 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 B>v#YF diff --git a/spirit/lib/spirit-core-element-2.1.30.jar b/spirit/lib/spirit-core-element-2.1.30.jar index e37a7ed92b09735873775a0ba7d670b2f25c1305..b93faed84072aa0a17999f9960752564b5d08a11 100644 GIT binary patch delta 14191 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 delta 14403 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 diff --git a/spirit/lib/spirit-output-java-2.1.30.jar b/spirit/lib/spirit-output-java-2.1.30.jar index ed0dcf18deb9dc157f2dc7f290fcf32321d737aa..ceab67e946d9eed2e6489e0c073dbcd270e400f3 100644 GIT binary patch delta 13450 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 brV{8lga91N``^P02@(m#fG+d-gZzI0hAJXw delta 13526 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 D)uj&0 diff --git a/spirit/lib/spirit-starter-java-2.1.30.jar b/spirit/lib/spirit-starter-java-2.1.30.jar index cafa1707d3f9136551efa9dcd9ae0036181498f1..dfc3c2ba8301a4b1d8aea5752bbc4a418ea1f129 100644 GIT binary patch delta 842 zcmZ2ww8BU_z?+$ci-CiKgJH{#twC39Ci_P)Ffb$lvB+dY5%GyeiXk57JkD}Id|IUE z<*VcA%gAjhro!YZS|fZq=(9-A*E3&w6s3Yn_6BWoWQ%wqc|*unz&Mh8AM%>2UDMvLDXakMlCSy%4h_ps~F9}^cJZ2LqU#RQ=?8c-GKnyAF+hDXxlcq|{2)+4a(*s`+yN2k`o~bY z;!+HG6f5~rtmI^bmYLE$6TI=M!i2Q1tT z6kf{>73Q4$mYY`x-Sj0Y!jg5&3=GTJ7#IxTW-~A>Y23pL)+i&PDi2H}L7Codg{nX& nEMj6{utQNeV{(FoFW9~f64FeX!jlsvY$tO`O0ltsfYbp1OcmRJ delta 780 zcmZ2sw8}_2z?+$ci-CiKgJEgVmY~~ih8Eh_v`& zpj>i(u6}?wBa;X-7X#FzllO^8OFxCm6_;Yl9}tyhnP*j@9f^qUfW=S11 zgHRkIgW`}}kOnz^G!2u1CNnK(oP3Z`c=88PF0k=`fkIapC+jn*PPP~00SozwNi&Hu z0fnrSKn@oHrv_l)24z+l$utA)kzizC0D1=wmNaHDF)$=0=H;ap>6KKJK&(aRD@@_I zAqP|q!eVe;3=B&eRhcJW5Cg~iWPNdIrgmnav-Kudi9;OH2^3n-4HQzE{F<9r8`)S; zJSzY7#I>Jira*Eobx!#{qSj#o|mtVr!OP7 zrI-qnt7whz>7dUdJzvj!=~0vlD%l&f$&oGMh2#o z!2q&h;z|`}5OqNwOnp)YQIjPYwZOD1qam2Cgz}d$+JX7c8GZOb&f5^?>nYB}z>vl= z*^x=3zBTA{-em_7+hA+M${A*!@>8ZbH983`NV_Q7sk9_WAd9OzBJ#kg!nGw`$?o4+ zR?cU#KhVZ2Eua&z>A_-w@*L)}!h@5ZpSyG15=gwa-&e!Bq5F5L$i~oPrFT|5P}`=x zqcxXzyXh8*F57p77t;fx-U>GFdMp8P?+VBBFXt-`vcTA5DX%$?#1ve=@j3STM%M3pIhN)8w=-Vz?DO1aH{VvSsW*8dd|v2tgHd_)v*sx`o<9~o_4eE6rAHZp;%(>J~y02f(WREQt(X6~;eIil*uYaJF%C5Bw?fG+_8&2OF{%HHHi7!Jlb}U#J>&jkk za%b%$xiS+89_jy8>1|6lGa0S>;hFg;=J@Q6#~F|28Rn)ZVIRba?U4gN@$TMAj6zl<1j1v0jNmgG7-TV&0w zrmMjlcy*Fn-((%z{H@(%y36!MeAksN4xN53ud)kG%9AsvTYLwmaLN z5tIlKsRfn@p~-ynDQ0t4P{P{G!WqQI{B6tT&5`^bjNqiUMBqFxD5=3y@Z<(TQ!9`N zFe$?UC!8g~@YZn_kmu_f;;8HC=cXUv&B!Fe%*6mr@RQ#QN{b%^DoD=H#gJ1Jl4g87 z*;YtA2HgUF6bm>RA^M9;bM=c0GK(@x(2YWIofwK{v&kETR0&v+1+)O}gWSZj)I7Wv zD5F>~eX^mjkvzH&3{lkF0IE@&+{@3W4GA9+c#(q~OGu~VR zs@E(G43mMuqKKlVk7e>kA&JReBI00$%{#2R+1VHvc*GeP6i^hN;GEnjqNf0i>!8$S z0b8B|B{u^-ZGoalR$%gZ5jU_&Nz${nCj%wZf!H2JQHCH;k@@5tQ7JYHA&?9JQmEG3 delta 1096 zcmcbs)1xgO;LXg!#lXSA!B88tCFr)BVMi1L14Hseahos=&okG(&v~3Re)6RkTLD%l&f$+0csh2)XhjJ}VaGBE^rvva^r0-6S~ zgMotqWXHtiD$F%N>YO~7`k)M=CW|p@foW$(LuR0&$>l&kh+e{I2d1Ag`tSkO1+9DI zdE14Nf#DtFWP2u!`q}_r@52rvb8;^oS+@4?gW&5l0>Nk(5d&|G8IgfsQUlnNxwZ$Iq zRx2}FY%98PLYdO<#)7w(Plnu6mu=g#-jAnunen6YJA4%u8+IFsJzQ{k*U~pG$Fv@u zS9RX0z0-W(lgm1nUb$_)@%em<($UI8`#w#b(4LsIxWzZe@Xep^s%@{7Ufq)YIq#3^ z*~^(0jq-d?3}nx-ep_(y$CXo!D@|4IfK}ko2P8rtR>*V2#%Ff!SlQ*$!2n(kSSQEQ%G874lwF{ zT|*poJ^kGD1H2iTM3}i4K&b!};Rl4IjSquTT7E9NTo6zg4uHy`K!D+`CYIfw&;ED6<5wQDQKY7(hl@Ol}lb1-lh!lzk4+D7ag56U$QbP>ce3 z60RG_P=<3rM$KfLyg*cSvW5tc0=hy&6ot1y3XQcPVIcy}b*PD&fk6qbfq`L3qvqsI zB8CbeH4X>gta{DDz%ZGgfk6>P&0glot5}qE&<$nsV8kD*$V9QgW!p*>-ut3q^!w+<}8#t_9ib^w1pFCgGVzRB66kEC=NF4x2Lufhx diff --git a/target/spirit-parent-2.1.30.pom b/target/spirit-parent-2.1.30.pom deleted file mode 100644 index 9277799c..00000000 --- a/target/spirit-parent-2.1.30.pom +++ /dev/null @@ -1,151 +0,0 @@ - - - 4.0.0 - com.gitee.chentaoah - spirit-parent - 2.1.30 - pom - - spirit - A new programming language based on Java. - https://gitee.com/chentaoah/spirit - - - - GNU General Public License - http://www.gnu.org/licenses/gpl-3.0.txt - - - - - - chentaoah - 609580885@qq.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 - - - - - - spirit-stdlib - spirit-common - spirit-core - spirit-output - spirit-starter - spirit-tools - spirit-example - - - - UTF-8 - UTF-8 - 1.8 - 1.8 - 2.2.2.RELEASE - 1.18.16 - 1.7.25 - 3.9 - 2.8.0 - 5.5.1 - 29.0-jre - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - 2.22.2 - - - org.apache.maven.plugins - maven-jar-plugin - 3.0.2 - - - org.apache.maven.plugins - maven-deploy-plugin - 2.8.2 - - - - - - - - release - - - ossrh - https://s01.oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - - - - - - - \ No newline at end of file diff --git a/target/spirit-parent-2.1.30.pom.asc b/target/spirit-parent-2.1.30.pom.asc deleted file mode 100644 index 09b4daa3..00000000 --- a/target/spirit-parent-2.1.30.pom.asc +++ /dev/null @@ -1,14 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQGzBAABCAAdFiEEqOc4k/2bIzSwX8nzS1qmeLEMVg4FAmClxz4ACgkQS1qmeLEM -Vg6Mvwv/RkGD7cT3kgaK83GRLn0L7jR5Pl8LbxVj3xUOdZDjP0PzcDESvN7Jj7tc -p9GcnmBT+gRjhmNFTBS/3/HLFWMJnMqKzOTu7/U7ilK22+iec4zMjRABgaZOkrTM -YOhE1pBLvdOA9GPqtlEI+1cScVKKtN/dh6y2A8xxESm+6CqLcfRRn8pGmx5FTow7 -qpgV3mNr7qzZuwOYMH4o09hNJvfQOrWpEu+Z1330zMH40itvh4pZ+czFRubOcPj9 -F075frD/tunHN6tvfyV1tNrv0keq3XR4Vpt3Awc3l6okS2EC3S+ZAut769eUWQQ1 -pgl2K1841xLyEfRc8aNfWAcA5UMrlY9Gp+Gt/SACVQNzRD6+4MiCAhwPp+66CUkS -7/QDviJvuk77omY0Oem0AYwgimynfi11lBCrTNVZ+/msCA+P41CBa7ph4gc7EXAm -cIYLY57f4RHiSINrW8XmUKfjvKoo4FerkF8QOQPq6pkC/2GROp8AkSUbzUuj1uAV -XvSNH+cb -=v7z9 ------END PGP SIGNATURE----- -- Gitee From e48ff4d3384e396f8234619e8d325c695e709a91 Mon Sep 17 00:00:00 2001 From: chenT Date: Sat, 22 May 2021 21:51:09 +0800 Subject: [PATCH 19/66] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=AF=8D=E6=B3=95?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/lexer/AbstractCharsHandler.java | 8 +++- .../sum/spirit/core/lexer/AbstractLexer.java | 40 ++++++++++++++++--- .../com/sum/spirit/core/lexer/CoreLexer.java | 21 ---------- .../core/lexer/action/BorderAction.java | 12 +++--- .../core/lexer/action/RegionAction.java | 2 - .../core/lexer/action/SymbolAction.java | 1 - .../spirit/core/lexer/entity/CommonState.java | 2 +- .../core/lexer/entity/LexerContext.java | 4 +- .../sum/spirit/core/lexer/entity/Region.java | 4 ++ .../spirit/core/lexer/utils/RegionUtils.java | 14 ++----- 10 files changed, 57 insertions(+), 51 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java index 6e34fdf1..4983c9be 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java @@ -15,8 +15,12 @@ public abstract class AbstractCharsHandler implements CharsHandler, CharAction { CharEvent event = new CharEvent(context, builder.charAt(context.index)); if (this.isTrigger(event)) { CommonResult result = this.handle(event); - if (result != null && result.state == CommonState.BREAK) { - break; + if (result != null) { + if (result.state == CommonState.RESET) { + context.index = 0; + } else if (result.state == CommonState.BREAK) { + break; + } } } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index ab54325e..ec0bf38a 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -25,6 +25,18 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe @Override public boolean isTrigger(CharEvent event) { + LexerContext context = (LexerContext) event.context; + List regions = context.regions; + if (regions != null && !regions.isEmpty()) { + for (int index = regions.size() - 1; index >= 0; index--) { + Region existRegion = regions.get(index); + if (existRegion.contains(context.index)) { + return false; + } else if (context.index >= existRegion.endIndex) { + return true; + } + } + } return true; } @@ -35,15 +47,18 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe if (action.isTrigger(event)) { CommonResult result = action.handle(event); if (result != null) { - if (result.value instanceof Region) { - context.regions.add(result.get()); + if (result.value != null) { + if (result.value instanceof Region) { + appendRegion(context, result.get()); - } else if (result.value instanceof List) { - context.regions.addAll(result.get()); + } else if (result.value instanceof List) { + List regions = result.get(); + regions.forEach(region -> appendRegion(context, region)); + } } if (result.state == CommonState.SKIP) { break; - } else if (result.state == CommonState.BREAK) { + } else if (result.state == CommonState.RESET || result.state == CommonState.BREAK) { return result; } } @@ -52,6 +67,21 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe return null; } + public void appendRegion(LexerContext context, Region region) { + List regions = context.regions; + if (regions.isEmpty()) { + regions.add(region); + } else { + for (int index = regions.size() - 1; index >= 0; index--) { + Region existRegion = regions.get(index); + if (region.after(existRegion)) { + regions.add(index + 1, region); + break; + } + } + } + } + @Override public CommonResult buildResult(CharsContext context, StringBuilder builder) { LexerContext lexerContext = (LexerContext) context; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java index 1fc94386..bf170ec2 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java @@ -1,11 +1,9 @@ package com.sum.spirit.core.lexer; -import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; -import com.sum.spirit.core.lexer.entity.CharsContext; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; @@ -34,23 +32,4 @@ public class CoreLexer extends AbstractCursorLexer { return result.get(); } - @Override - public CommonResult buildResult(CharsContext context, StringBuilder builder) { - LexerContext lexerContext = (LexerContext) context; - CommonResult result = super.buildResult(context, builder); - if (BORDER_PROFILE.equals(lexerContext.profile)) { - List finalWords = new ArrayList<>(); - List words = result.get(); - for (String word : words) { - if (word.length() == 1) { - finalWords.add(word); - } else { - finalWords.addAll(getWords(word)); - } - } - return new CommonResult(finalWords); - } - return result; - } - } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java index 117406d4..75c55cb6 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java @@ -12,7 +12,6 @@ import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; import com.sum.spirit.core.lexer.entity.Region; -import com.sum.spirit.core.lexer.utils.RegionUtils; @Component @Order(-100) @@ -30,18 +29,19 @@ public class BorderAction extends RegionAction { StringBuilder builder = context.builder; List splitChars = context.splitChars; - List newRegions = new ArrayList<>(); + List borderRegions = new ArrayList<>(); for (Region region : regions) { char startChar = builder.charAt(region.startIndex); char endChar = builder.charAt(region.endIndex - 1); if (splitChars.contains(startChar) && splitChars.contains(endChar)) { - newRegions.add(new Region(region.startIndex, region.startIndex + 1)); - newRegions.add(new Region(region.endIndex - 1, region.endIndex)); + borderRegions.add(new Region(region.startIndex, region.startIndex + 1)); + borderRegions.add(new Region(region.endIndex - 1, region.endIndex)); } } - List finalRegions = RegionUtils.completeRegions(builder, newRegions, (startIndex, endIndex) -> new Region(startIndex, endIndex)); - return new CommonResult(CommonState.BREAK, finalRegions); + context.profile = null; + context.index = borderRegions.get(0).startIndex; + return new CommonResult(CommonState.SKIP, borderRegions); } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java index 64f8e76b..5994daf6 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java @@ -94,9 +94,7 @@ public class RegionAction implements LexerAction { } public CommonResult pushStack(CharEvent event, List regions) { - LexerContext context = (LexerContext) event.context; Region mergedRegion = RegionUtils.mergeRegions(regions); - context.index = mergedRegion.endIndex - 1; return new CommonResult(CommonState.SKIP, mergedRegion); } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java index 368d76e6..23038a03 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java @@ -29,7 +29,6 @@ public class SymbolAction implements LexerAction { String str = builder.substring(context.index, context.index + 2); if (SymbolEnum.isDoubleSymbol(str)) { Region region = new Region(context.index, context.index + 2); - context.index++;// 符合条件,则跳过一个单位 return new CommonResult(CommonState.SKIP, region); } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java index b91c25f0..36285a47 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java @@ -1,5 +1,5 @@ package com.sum.spirit.core.lexer.entity; public enum CommonState { - CONTINUE, SKIP, BREAK + CONTINUE, SKIP, RESET, BREAK } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerContext.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerContext.java index d81588eb..1a926deb 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerContext.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerContext.java @@ -11,10 +11,10 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class LexerContext extends CharsContext { - public int startIndex = -1; - public List regions = new ArrayList<>(); public String profile; public List splitChars; + public int startIndex = -1; + public List regions = new ArrayList<>(); public LexerContext(StringBuilder builder) { this.builder = builder; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java index 8b95018f..e2882505 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java @@ -20,4 +20,8 @@ public class Region { return startIndex <= index && index < endIndex; } + public boolean after(Region region) { + return startIndex >= region.endIndex; + } + } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/utils/RegionUtils.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/utils/RegionUtils.java index fecd72ba..a60e42b8 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/utils/RegionUtils.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/utils/RegionUtils.java @@ -29,28 +29,24 @@ public class RegionUtils { return new Region(startRegion.startIndex, endRegion.endIndex); } - public static List completeRegions(StringBuilder builder, List regions, Factory factory) { + public static List completeRegions(StringBuilder builder, List regions) { List completedRegions = new ArrayList<>(); int lastIndex = 0; for (Region region : regions) { if (region.startIndex > lastIndex) { - Region newRegion = factory.newRegion(lastIndex, region.startIndex); + Region newRegion = new completedRegion(lastIndex, region.startIndex); completedRegions.add(newRegion); } completedRegions.add(region); lastIndex = region.endIndex; } if (lastIndex < builder.length()) { - Region newRegion = factory.newRegion(lastIndex, builder.length()); + Region newRegion = new completedRegion(lastIndex, builder.length()); completedRegions.add(newRegion); } return completedRegions; } - public static List completeRegions(StringBuilder builder, List regions) { - return completeRegions(builder, regions, (startIndex, endIndex) -> new completedRegion(startIndex, endIndex)); - } - public static List subRegions(StringBuilder builder, List regions, Consumer consumer) { List words = new ArrayList<>(); for (Region region : regions) { @@ -62,10 +58,6 @@ public class RegionUtils { return words; } - public static interface Factory { - Region newRegion(int startIndex, int endIndex); - } - public static interface Consumer { void accept(List words, Region region, String text); } -- Gitee From d5c044b68d89ce57b26f54fd559dbcbe90670b8a Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 23 May 2021 22:07:01 +0800 Subject: [PATCH 20/66] =?UTF-8?q?=E6=B7=BB=E5=8A=A0region=E9=87=8D?= =?UTF-8?q?=E5=90=88=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sum/spirit/core/lexer/AbstractLexer.java | 5 ++++- .../main/java/com/sum/spirit/core/lexer/entity/Region.java | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index ec0bf38a..bf043711 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -74,7 +74,10 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe } else { for (int index = regions.size() - 1; index >= 0; index--) { Region existRegion = regions.get(index); - if (region.after(existRegion)) { + if (region.isOverlap(existRegion)) { + throw new RuntimeException("There are overlapping regions!"); + } + if (region.isAfter(existRegion)) { regions.add(index + 1, region); break; } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java index e2882505..45f5806b 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java @@ -20,8 +20,12 @@ public class Region { return startIndex <= index && index < endIndex; } - public boolean after(Region region) { + public boolean isAfter(Region region) { return startIndex >= region.endIndex; } + public boolean isOverlap(Region region) { + return contains(region.startIndex) || contains(region.endIndex - 1); + } + } -- Gitee From ba3f21c104cd1be16aa7303ea0eee8f5e4c1cb73 Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 23 May 2021 22:09:56 +0800 Subject: [PATCH 21/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/sum/spirit/core/lexer/CoreLexer.java | 5 ++--- .../java/com/sum/spirit/core/lexer/action/BorderAction.java | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java index bf170ec2..b1c84288 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java @@ -4,6 +4,7 @@ import java.util.List; import org.springframework.stereotype.Component; +import com.sum.spirit.core.lexer.action.BorderAction; import com.sum.spirit.core.lexer.entity.CommonResult; import com.sum.spirit.core.lexer.entity.LexerContext; @@ -12,8 +13,6 @@ import cn.hutool.core.lang.Assert; @Component public class CoreLexer extends AbstractCursorLexer { - public static final String BORDER_PROFILE = "BORDER_PROFILE"; - @Override public List getWords(String text) { Assert.notBlank(text, "Text cannot be blank!"); @@ -27,7 +26,7 @@ public class CoreLexer extends AbstractCursorLexer { public List getSubWords(String text, Character... splitChars) { Assert.notBlank(text, "Text cannot be blank!"); StringBuilder builder = new StringBuilder(text.trim()); - LexerContext context = new LexerContext(builder, BORDER_PROFILE, splitChars); + LexerContext context = new LexerContext(builder, BorderAction.BORDER_PROFILE, splitChars); CommonResult result = handle(context, builder); return result.get(); } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java index 75c55cb6..20e25bec 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java @@ -6,7 +6,6 @@ import java.util.List; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.core.lexer.CoreLexer; import com.sum.spirit.core.lexer.entity.CharEvent; import com.sum.spirit.core.lexer.entity.CommonState; import com.sum.spirit.core.lexer.entity.CommonResult; @@ -17,10 +16,12 @@ import com.sum.spirit.core.lexer.entity.Region; @Order(-100) public class BorderAction extends RegionAction { + public static final String BORDER_PROFILE = "BORDER_PROFILE"; + @Override public boolean isTrigger(CharEvent event) { LexerContext context = (LexerContext) event.context; - return CoreLexer.BORDER_PROFILE.equals(context.profile) && super.isTrigger(event); + return BORDER_PROFILE.equals(context.profile) && super.isTrigger(event); } @Override -- Gitee From a23f59107b9cfed68fb7edab4f576ad4043de8fe Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 23 May 2021 23:56:57 +0800 Subject: [PATCH 22/66] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=BA=9F=E5=BC=83?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sum/spirit/common/utils/LineUtils.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/LineUtils.java b/spirit-common/src/main/java/com/sum/spirit/common/utils/LineUtils.java index 3c9e4284..185114e9 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/LineUtils.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/utils/LineUtils.java @@ -6,14 +6,6 @@ public class LineUtils { return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == '_'; } - public static String mergeSpaces(String line) { - line = line.trim(); - while (line.contains(" ")) { - line = line.replaceAll(" ", " ");// 这里需要考虑一种情况,就是四个变两个,两个变一个 - } - return line; - } - public static String getSpaces(int number) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < number; i++) { -- Gitee From 1ce0c643d89d83596a7fe1b4d77a7afa8db75c02 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 24 May 2021 19:10:55 +0800 Subject: [PATCH 23/66] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BE=B9=E7=95=8C?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E5=8A=A0=E4=BE=BF=E5=88=A9=E7=9A=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=90=AF=E5=8A=A8=E5=99=A8=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/core/lexer/action/BorderAction.java | 8 +++++++- .../com/sum/spirit/maven/plugin/SpiritCompileMojo.java | 9 +++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java index 20e25bec..a2e42393 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java @@ -41,7 +41,13 @@ public class BorderAction extends RegionAction { } context.profile = null; - context.index = borderRegions.get(0).startIndex; + if (!borderRegions.isEmpty()) { + int borderIndex = borderRegions.get(0).startIndex; + context.index = borderIndex; + if (borderIndex > 0) { + borderRegions.add(0, new Region(0, borderIndex)); + } + } return new CommonResult(CommonState.SKIP, borderRegions); } diff --git a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java b/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java index 548cb064..52dfd4c3 100644 --- a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java +++ b/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java @@ -53,13 +53,14 @@ public class SpiritCompileMojo extends AbstractMojo { } public static void main(String[] args) throws ClassNotFoundException { + String userHome = System.getProperty("user.home"); String inputPath = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\src\\main\\resources\\sources"; String outputPath = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\src\\main\\java"; String classpaths = "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\target\\classes, "; - classpaths += "C:\\Users\\chenT\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-example-common\\2.1.30\\spirit-example-common-2.1.30.jar, "; - classpaths += "C:\\Users\\chenT\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-stdlib\\2.1.30\\spirit-stdlib-2.1.30.jar, "; - classpaths += "C:\\Users\\chenT\\.m2\\repository\\org\\slf4j\\slf4j-api\\1.7.25\\slf4j-api-1.7.25.jar, "; - classpaths += "C:\\Users\\chenT\\.m2\\repository\\org\\apache\\commons\\commons-lang3\\3.9\\commons-lang3-3.9.jar, "; + classpaths += userHome + "\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-example-common\\2.1.30\\spirit-example-common-2.1.30.jar, "; + classpaths += userHome + "\\.m2\\repository\\com\\gitee\\chentaoah\\spirit-stdlib\\2.1.30\\spirit-stdlib-2.1.30.jar, "; + classpaths += userHome + "\\.m2\\repository\\org\\slf4j\\slf4j-api\\1.7.25\\slf4j-api-1.7.25.jar, "; + classpaths += userHome + "\\.m2\\repository\\org\\apache\\commons\\commons-lang3\\3.9\\commons-lang3-3.9.jar, "; classpaths += "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\target\\test-classes"; JavaStarter.main(new String[] { "--input=" + inputPath, "--output=" + outputPath, "--classpaths=" + classpaths }); } -- Gitee From 67c673451e2d62acd359ce1d1dc81808fa2ba560 Mon Sep 17 00:00:00 2001 From: chenT Date: Mon, 24 May 2021 21:30:01 +0800 Subject: [PATCH 24/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/common/pattern/CommonPattern.java | 33 +++++++++++++++++++ .../spirit/common/pattern/LiteralPattern.java | 4 +-- .../core/element/DefaultElementBuilder.java | 14 ++++---- .../action/AbstractSemanticParser.java | 16 +++------ .../element/action/DefaultSemanticParser.java | 3 +- .../sum/spirit/core/lexer/AbstractLexer.java | 3 +- 6 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java new file mode 100644 index 00000000..27b20f36 --- /dev/null +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java @@ -0,0 +1,33 @@ +package com.sum.spirit.common.pattern; + +import java.util.regex.Pattern; + +public class CommonPattern { + + private static final Pattern PATH_PATTERN = Pattern.compile("^(\\w+\\.)+\\w+$"); + private static final Pattern ANNOTATION_PATTERN = Pattern.compile("^@[A-Z]+\\w+(\\([\\s\\S]+\\))?$"); + private static final Pattern SUBEXPRESS_PATTERN = Pattern.compile("^\\([\\s\\S]+\\)$"); + private static final Pattern VARIABLE_PATTERN = Pattern.compile("^[a-z]+\\w*$"); + private static final Pattern PREFIX_PATTERN = Pattern.compile("^(\\.)?\\w+$"); + + public static boolean isPath(String word) { + return PATH_PATTERN.matcher(word).matches(); + } + + public static boolean isAnnotation(String word) { + return ANNOTATION_PATTERN.matcher(word).matches(); + } + + public static boolean isSubexpress(String word) { + return SUBEXPRESS_PATTERN.matcher(word).matches(); + } + + public static boolean isVariable(String word) { + return VARIABLE_PATTERN.matcher(word).matches(); + } + + public static boolean isPrefix(String word) { + return PREFIX_PATTERN.matcher(word).matches(); + } + +} diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java index f09c8d33..5210067d 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java @@ -13,8 +13,8 @@ public class LiteralPattern { public static final Pattern STRING_PATTERN = Pattern.compile("^\"[\\s\\S]*\"$"); public static final Pattern LIST_PATTERN = Pattern.compile("^\\[[\\s\\S]*\\]$"); public static final Pattern MAP_PATTERN = Pattern.compile("^\\{[\\s\\S]*\\}$"); - - public static final Pattern CONST_VARIABLE_PATTERN = Pattern.compile("^[A-Z_]{2,}$");// 常量也被认为是字面值的一种 + // 常量也被认为是字面值的一种 + public static final Pattern CONST_VARIABLE_PATTERN = Pattern.compile("^[A-Z_]{2,}$"); public static boolean isNull(String word) { return NULL_PATTERN.matcher(word).matches(); diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java index d7db82c1..84784c63 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java @@ -40,13 +40,13 @@ public class DefaultElementBuilder implements ElementBuilder { @Override public Element build(Line line) { try { - checker.check(line); // 语法校验 - List words = lexer.getWords(line.text);// 1.词法分析 - List tokens = parser.getTokens(new SemanticContext(), words);// 2.语义分析 - Modifiers modifiers = new Modifiers(tokens);// 3.修饰词 - Statement statement = new Statement(tokens);// 4.语句 - SyntaxResult result = syntaxParser.parseSyntax(tokens, statement);// 5.分析语法 - Element element = new Element(line, modifiers, statement, result.syntax, result.syntaxTree);// 6.创建元素 + checker.check(line); + List words = lexer.getWords(line.text); + List tokens = parser.getTokens(new SemanticContext(), words); + Modifiers modifiers = new Modifiers(tokens); + Statement statement = new Statement(tokens); + SyntaxResult result = syntaxParser.parseSyntax(tokens, statement); + Element element = new Element(line, modifiers, statement, result.syntax, result.syntaxTree); return element; } catch (Exception e) { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java index 255f3e78..341543ad 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java @@ -1,7 +1,6 @@ package com.sum.spirit.core.element.action; import java.util.List; -import java.util.regex.Pattern; import com.sum.spirit.common.enums.KeywordEnum; import com.sum.spirit.common.enums.SymbolEnum; @@ -9,6 +8,7 @@ import com.sum.spirit.common.enums.TokenTypeEnum; import com.sum.spirit.common.pattern.LiteralPattern; import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.common.pattern.AccessPattern; +import com.sum.spirit.common.pattern.CommonPattern; import com.sum.spirit.common.utils.ListUtils; import com.sum.spirit.core.api.SemanticParser; import com.sum.spirit.core.element.entity.SemanticContext; @@ -16,23 +16,17 @@ import com.sum.spirit.core.element.entity.Token; public abstract class AbstractSemanticParser implements SemanticParser { - public static final Pattern PATH_PATTERN = Pattern.compile("^(\\w+\\.)+\\w+$"); - public static final Pattern ANNOTATION_PATTERN = Pattern.compile("^@[A-Z]+\\w+(\\([\\s\\S]+\\))?$"); - public static final Pattern SUBEXPRESS_PATTERN = Pattern.compile("^\\([\\s\\S]+\\)$"); - public static final Pattern VAR_PATTERN = Pattern.compile("^[a-z]+\\w*$"); - public static final Pattern PREFIX_PATTERN = Pattern.compile("^(\\.)?\\w+$"); - @Override public List getTokens(SemanticContext context, List words) { return ListUtils.collectAll(words, word -> true, word -> getToken(context, word)); } public boolean isPath(String word) { - return !LiteralPattern.isDouble(word) && PATH_PATTERN.matcher(word).matches(); + return !LiteralPattern.isDouble(word) && CommonPattern.isPath(word); } public boolean isAnnotation(String word) { - return ANNOTATION_PATTERN.matcher(word).matches(); + return CommonPattern.isAnnotation(word); } public boolean isKeyword(String word) { @@ -53,7 +47,7 @@ public abstract class AbstractSemanticParser implements SemanticParser { } public boolean isVariable(String word) { - return LiteralPattern.isConstVariable(word) || VAR_PATTERN.matcher(word).matches(); + return LiteralPattern.isConstVariable(word) || CommonPattern.isVariable(word); } public TokenTypeEnum getInitTokenType(String word) { @@ -101,7 +95,7 @@ public abstract class AbstractSemanticParser implements SemanticParser { } public TokenTypeEnum getSubexpressTokenType(String word) { - if (SUBEXPRESS_PATTERN.matcher(word).matches()) { + if (CommonPattern.isSubexpress(word)) { if (isType(getCastType(word))) { return TokenTypeEnum.CAST; } else { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index bd3e8819..cd1d8479 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Component; import com.sum.spirit.common.constants.Attribute; import com.sum.spirit.common.enums.TokenTypeEnum; +import com.sum.spirit.common.pattern.CommonPattern; import com.sum.spirit.core.api.Lexer; import com.sum.spirit.core.element.entity.SemanticContext; import com.sum.spirit.core.element.entity.Statement; @@ -103,7 +104,7 @@ public class DefaultSemanticParser extends AbstractSemanticParser { String first = words.get(0); // 如果第一个单词是一个前缀的话,则添加前缀 - if (PREFIX_PATTERN.matcher(first).matches()) { + if (CommonPattern.isPrefix(first)) { List subWords = words.subList(1, words.size()); tokens = getTokens(new SemanticContext(insideType), subWords); tokens.add(0, new Token(TokenTypeEnum.PREFIX, first)); diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index bf043711..f59408cb 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -88,7 +88,8 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe @Override public CommonResult buildResult(CharsContext context, StringBuilder builder) { LexerContext lexerContext = (LexerContext) context; - List regions = RegionUtils.completeRegions(builder, lexerContext.regions);// 使用标记收集算法后,补全未标记的部分 + // 使用标记收集算法后,补全未标记的部分 + List regions = RegionUtils.completeRegions(builder, lexerContext.regions); List words = RegionUtils.subRegions(builder, regions, this::addToWords); return new CommonResult(words); } -- Gitee From e5ac3574227b477b3893d79593a35b532c737b7f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 25 May 2021 17:58:11 +0800 Subject: [PATCH 25/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/clazz/AbstractTypeFactory.java | 3 +- .../sum/spirit/core/api/SemanticParser.java | 8 +++ .../core/element/DefaultElementBuilder.java | 3 +- .../action/AbstractSemanticParser.java | 10 ---- .../element/action/DefaultSemanticParser.java | 58 ++++++++++++------- .../core/element/entity/SemanticContext.java | 14 ++++- .../core/lexer/entity/CharsContext.java | 2 +- 7 files changed, 62 insertions(+), 36 deletions(-) diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java index 9006e911..513527db 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java +++ b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java @@ -11,7 +11,6 @@ import com.sum.spirit.core.api.TypeFactory; import com.sum.spirit.core.clazz.entity.IClass; import com.sum.spirit.core.clazz.entity.IType; import com.sum.spirit.core.clazz.utils.StaticTypes; -import com.sum.spirit.core.element.entity.SemanticContext; import cn.hutool.core.lang.Assert; @@ -42,7 +41,7 @@ public abstract class AbstractTypeFactory implements TypeFactory { @Override public IType create(IClass clazz, String text) { Assert.isTrue(!text.contains("."), "Text cannot contains \".\". Please use the another create method!"); - return create(clazz, parser.getToken(new SemanticContext(), text)); + return create(clazz, parser.getToken(text)); } } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SemanticParser.java index 6b0b4593..aee1bd0c 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SemanticParser.java @@ -9,8 +9,16 @@ public interface SemanticParser { List getTokens(SemanticContext context, List words); + default List getTokens(List words) { + return getTokens(new SemanticContext(), words); + } + Token getToken(SemanticContext context, String word); + default Token getToken(String word) { + return getToken(new SemanticContext(), word); + } + boolean isType(String word); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java index 84784c63..e8055080 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java @@ -13,7 +13,6 @@ import com.sum.spirit.core.element.action.LineChecker; import com.sum.spirit.core.element.entity.Element; import com.sum.spirit.core.element.entity.Line; import com.sum.spirit.core.element.entity.Modifiers; -import com.sum.spirit.core.element.entity.SemanticContext; import com.sum.spirit.core.element.entity.Statement; import com.sum.spirit.core.element.entity.SyntaxResult; import com.sum.spirit.core.element.entity.Token; @@ -42,7 +41,7 @@ public class DefaultElementBuilder implements ElementBuilder { try { checker.check(line); List words = lexer.getWords(line.text); - List tokens = parser.getTokens(new SemanticContext(), words); + List tokens = parser.getTokens(words); Modifiers modifiers = new Modifiers(tokens); Statement statement = new Statement(tokens); SyntaxResult result = syntaxParser.parseSyntax(tokens, statement); diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java index 341543ad..1b43d467 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java @@ -1,7 +1,5 @@ package com.sum.spirit.core.element.action; -import java.util.List; - import com.sum.spirit.common.enums.KeywordEnum; import com.sum.spirit.common.enums.SymbolEnum; import com.sum.spirit.common.enums.TokenTypeEnum; @@ -9,18 +7,10 @@ import com.sum.spirit.common.pattern.LiteralPattern; import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.common.pattern.AccessPattern; import com.sum.spirit.common.pattern.CommonPattern; -import com.sum.spirit.common.utils.ListUtils; import com.sum.spirit.core.api.SemanticParser; -import com.sum.spirit.core.element.entity.SemanticContext; -import com.sum.spirit.core.element.entity.Token; public abstract class AbstractSemanticParser implements SemanticParser { - @Override - public List getTokens(SemanticContext context, List words) { - return ListUtils.collectAll(words, word -> true, word -> getToken(context, word)); - } - public boolean isPath(String word) { return !LiteralPattern.isDouble(word) && CommonPattern.isPath(word); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index cd1d8479..7761e9c8 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -1,5 +1,6 @@ package com.sum.spirit.core.element.action; +import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -21,22 +22,51 @@ public class DefaultSemanticParser extends AbstractSemanticParser { @Autowired public Lexer lexer; + @Override + public List getTokens(SemanticContext context, List words) { + context.words = words; + List tokens = new ArrayList<>(); + for (context.index = 0; context.index < words.size(); context.index++) { + Token token = getToken(context, words.get(context.index)); + tokens.add(token); + } + return tokens; + } + @Override public Token getToken(SemanticContext context, String word) { Token token = new Token(); - token.tokenType = getTokenType(word, context.insideType); + token.tokenType = getTokenType(context, word); Assert.notNull(token.tokenType, "Token type cannot be null!word:[" + word + "]"); token.value = getTokenValue(token, word); Assert.notNull(token.value, "Token value cannot be null!word:[" + word + "]"); setTokenAttributes(token, word); - return token; } - public TokenTypeEnum getTokenType(String word, boolean insideType) { + public TokenTypeEnum getTokenType(SemanticContext context, String word) { + if (!context.substatement) { + return getCommonTokenType(context, word); + } else { + if (context.insideType) { + if ("<".equals(word) || ">".equals(word)) { + return TokenTypeEnum.SEPARATOR; + + } else if ("?".equals(word)) { + return TokenTypeEnum.TYPE; + } + } + if (context.index == 0 && CommonPattern.isPrefix(word)) { + return TokenTypeEnum.PREFIX; + } + return getCommonTokenType(context, word); + } + } + + public TokenTypeEnum getCommonTokenType(SemanticContext context, String word) { if (isPath(word)) { return TokenTypeEnum.PATH; @@ -46,13 +76,13 @@ public class DefaultSemanticParser extends AbstractSemanticParser { } else if (isKeyword(word)) { return TokenTypeEnum.KEYWORD; - } else if (isOperator(word) && !insideType) {// 类型声明中,一般不包含操作符 + } else if (isOperator(word)) { return TokenTypeEnum.OPERATOR; } else if (isSeparator(word)) { return TokenTypeEnum.SEPARATOR; - } else if (isType(word) || (insideType && "?".equals(word))) { + } else if (isType(word)) { return TokenTypeEnum.TYPE; } @@ -88,7 +118,8 @@ public class DefaultSemanticParser extends AbstractSemanticParser { return getStatement(word, true); } else if (token.isArrayInit() || token.isList() || token.isMap() || token.isSubexpress() || token.isInvoke()) { - return getStatement(word, false);// 拆分数组是为了更好的添加new这个关键字 + // 拆分数组是为了更好的添加new这个关键字 + return getStatement(word, false); } return word; } @@ -97,22 +128,9 @@ public class DefaultSemanticParser extends AbstractSemanticParser { if (insideType && (!word.contains("<") && !word.contains(">"))) { return word; } - // 如果是类型,则直接用尖括号进行拆分,如果是其他,则不使用尖括号进行拆分 List words = insideType ? lexer.getSubWords(word, '<', '>') : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); - List tokens = null; - - String first = words.get(0); - // 如果第一个单词是一个前缀的话,则添加前缀 - if (CommonPattern.isPrefix(first)) { - List subWords = words.subList(1, words.size()); - tokens = getTokens(new SemanticContext(insideType), subWords); - tokens.add(0, new Token(TokenTypeEnum.PREFIX, first)); - - } else { - tokens = getTokens(new SemanticContext(insideType), words); - } - + List tokens = getTokens(new SemanticContext(true, insideType), words); Assert.notNull(tokens, "Tokens cannot be null!"); return new Statement(tokens); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SemanticContext.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SemanticContext.java index 44076cf3..b28c8bbc 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SemanticContext.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SemanticContext.java @@ -1,5 +1,7 @@ package com.sum.spirit.core.element.entity; +import java.util.List; + import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -8,5 +10,15 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class SemanticContext { - public boolean insideType; + + public List words; + public int index = -1; + public boolean substatement = false; + public boolean insideType = false; + + public SemanticContext(boolean substatement, boolean insideType) { + this.substatement = substatement; + this.insideType = insideType; + } + } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsContext.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsContext.java index 079956be..179e696e 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsContext.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsContext.java @@ -9,5 +9,5 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class CharsContext { public StringBuilder builder; - public int index; + public int index = -1; } -- Gitee From 4d82cdcc08b9aff8b7f68104cfd8368aa7ff02b7 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Tue, 25 May 2021 20:17:39 +0800 Subject: [PATCH 26/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/core/element/action/DefaultSemanticParser.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index 7761e9c8..cb407781 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -115,7 +115,7 @@ public class DefaultSemanticParser extends AbstractSemanticParser { public Object getTokenValue(Token token, String word) { if (token.isType()) { - return getStatement(word, true); + return !word.contains("<") && !word.contains(">") ? word : getStatement(word, true); } else if (token.isArrayInit() || token.isList() || token.isMap() || token.isSubexpress() || token.isInvoke()) { // 拆分数组是为了更好的添加new这个关键字 @@ -124,10 +124,7 @@ public class DefaultSemanticParser extends AbstractSemanticParser { return word; } - public Object getStatement(String word, boolean insideType) { - if (insideType && (!word.contains("<") && !word.contains(">"))) { - return word; - } + public Statement getStatement(String word, boolean insideType) { // 如果是类型,则直接用尖括号进行拆分,如果是其他,则不使用尖括号进行拆分 List words = insideType ? lexer.getSubWords(word, '<', '>') : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); List tokens = getTokens(new SemanticContext(true, insideType), words); -- Gitee From 803bf0272b693cd81ed01aa779e62d1b4bb1496e Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 20:58:33 +0800 Subject: [PATCH 27/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sum/spirit/core/element/action/DefaultSemanticParser.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index cb407781..8b09e7b4 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -115,7 +115,7 @@ public class DefaultSemanticParser extends AbstractSemanticParser { public Object getTokenValue(Token token, String word) { if (token.isType()) { - return !word.contains("<") && !word.contains(">") ? word : getStatement(word, true); + return word.contains("<") || word.contains(">") ? getStatement(word, true) : word; } else if (token.isArrayInit() || token.isList() || token.isMap() || token.isSubexpress() || token.isInvoke()) { // 拆分数组是为了更好的添加new这个关键字 @@ -125,7 +125,6 @@ public class DefaultSemanticParser extends AbstractSemanticParser { } public Statement getStatement(String word, boolean insideType) { - // 如果是类型,则直接用尖括号进行拆分,如果是其他,则不使用尖括号进行拆分 List words = insideType ? lexer.getSubWords(word, '<', '>') : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); List tokens = getTokens(new SemanticContext(true, insideType), words); Assert.notNull(tokens, "Tokens cannot be null!"); -- Gitee From e68992b3b0ebba5538f23fb80ff7890233a6ffa0 Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 21:46:08 +0800 Subject: [PATCH 28/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sum/spirit/common/pattern/CommonPattern.java | 16 ++++++++-------- .../sum/spirit/common/pattern/TypePattern.java | 11 ++--------- .../element/action/AbstractSemanticParser.java | 2 +- .../com/sum/spirit/core/lexer/AbstractLexer.java | 4 ++-- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java index 27b20f36..3cac0676 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java @@ -4,14 +4,14 @@ import java.util.regex.Pattern; public class CommonPattern { - private static final Pattern PATH_PATTERN = Pattern.compile("^(\\w+\\.)+\\w+$"); - private static final Pattern ANNOTATION_PATTERN = Pattern.compile("^@[A-Z]+\\w+(\\([\\s\\S]+\\))?$"); - private static final Pattern SUBEXPRESS_PATTERN = Pattern.compile("^\\([\\s\\S]+\\)$"); - private static final Pattern VARIABLE_PATTERN = Pattern.compile("^[a-z]+\\w*$"); - private static final Pattern PREFIX_PATTERN = Pattern.compile("^(\\.)?\\w+$"); - - public static boolean isPath(String word) { - return PATH_PATTERN.matcher(word).matches(); + public static final Pattern ACCESS_PATH_PATTERN = Pattern.compile("^(\\w+\\.)+[A-Z]+\\w+(\\.[a-z]+\\w*)?$"); + public static final Pattern ANNOTATION_PATTERN = Pattern.compile("^@[A-Z]+\\w+(\\([\\s\\S]+\\))?$"); + public static final Pattern SUBEXPRESS_PATTERN = Pattern.compile("^\\([\\s\\S]+\\)$"); + public static final Pattern VARIABLE_PATTERN = Pattern.compile("^[a-z]+\\w*$"); + public static final Pattern PREFIX_PATTERN = Pattern.compile("^(\\.)?\\w+$"); + + public static boolean isAccessPath(String word) { + return ACCESS_PATH_PATTERN.matcher(word).matches(); } public static boolean isAnnotation(String word) { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java index 7480b678..e9c06cfa 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java @@ -6,8 +6,6 @@ import com.sum.spirit.common.enums.PrimitiveEnum; public class TypePattern { - public static final Pattern TYPE_END_PATTERN = Pattern.compile("^[\\s\\S]+\\.[A-Z]+\\w+(\\.[a-z]+\\w*)?$"); - public static final Pattern TYPE_PATTERN = Pattern.compile("^[A-Z]+\\w*$"); public static final Pattern TYPE_ARRAY_PATTERN = Pattern.compile("^[A-Z]+\\w*\\[\\]$"); public static final Pattern GENERIC_TYPE_PATTERN = Pattern.compile("^[A-Z]+\\w*<[\\s\\S]+>$"); @@ -22,10 +20,6 @@ public class TypePattern { return PrimitiveEnum.isPrimitiveBySimple(word) || isType(word); } - public static boolean isTypeEnd(String word) { - return TYPE_END_PATTERN.matcher(word).matches(); - } - public static boolean isType(String word) { return !LiteralPattern.isConstVariable(word) && TYPE_PATTERN.matcher(word).matches(); } @@ -59,9 +53,8 @@ public class TypePattern { } public static boolean isAnyType(String word) { - return !LiteralPattern.isConstVariable(word) && // - (PrimitiveEnum.isPrimitiveBySimple(word) || PrimitiveEnum.isPrimitiveArrayBySimple(word) || // - isType(word) || isTypeArray(word) || isGenericType(word)); + return !LiteralPattern.isConstVariable(word) && (PrimitiveEnum.isPrimitiveBySimple(word) || PrimitiveEnum.isPrimitiveArrayBySimple(word) || isType(word) + || isTypeArray(word) || isGenericType(word)); } } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java index 1b43d467..6d539a71 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java @@ -12,7 +12,7 @@ import com.sum.spirit.core.api.SemanticParser; public abstract class AbstractSemanticParser implements SemanticParser { public boolean isPath(String word) { - return !LiteralPattern.isDouble(word) && CommonPattern.isPath(word); + return !LiteralPattern.isDouble(word) && CommonPattern.isAccessPath(word); } public boolean isAnnotation(String word) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index f59408cb..9f16ee0a 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -5,8 +5,8 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; +import com.sum.spirit.common.pattern.CommonPattern; import com.sum.spirit.common.pattern.LiteralPattern; -import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.core.api.Lexer; import com.sum.spirit.core.api.LexerAction; import com.sum.spirit.core.lexer.entity.CharEvent; @@ -96,7 +96,7 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe public void addToWords(List words, Region region, String text) { if (region instanceof completedRegion) { - if (text.indexOf(".") > 0 && !LiteralPattern.isDouble(text) && !TypePattern.isTypeEnd(text)) { + if (text.indexOf(".") > 0 && !LiteralPattern.isDouble(text) && !CommonPattern.isAccessPath(text)) { List subWords = Arrays.asList(text.replaceAll("\\.", " .").split(" ")); words.addAll(subWords); return; -- Gitee From 169b44d9fd2ac31a7a5391258eb4c2e54ca2ccbc Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 21:52:19 +0800 Subject: [PATCH 29/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/sum/spirit/common/enums/TokenTypeEnum.java | 2 +- .../spirit/core/element/action/AbstractSemanticParser.java | 2 +- .../sum/spirit/core/element/action/DefaultSemanticParser.java | 4 ++-- .../main/java/com/sum/spirit/core/element/frame/Semantic.java | 4 ++-- .../java/com/sum/spirit/core/lexer/test/SemanticTest.java | 2 +- .../test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/enums/TokenTypeEnum.java b/spirit-common/src/main/java/com/sum/spirit/common/enums/TokenTypeEnum.java index a2d294b7..b9602622 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/enums/TokenTypeEnum.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/enums/TokenTypeEnum.java @@ -1,7 +1,7 @@ package com.sum.spirit.common.enums; public enum TokenTypeEnum { - PATH, // com.sum.spirit.example.Animal + ACCESS_PATH, // com.sum.spirit.example.Animal ANNOTATION, // @Animal KEYWORD, // class OPERATOR, // = diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java index 6d539a71..3d07f6d1 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java @@ -11,7 +11,7 @@ import com.sum.spirit.core.api.SemanticParser; public abstract class AbstractSemanticParser implements SemanticParser { - public boolean isPath(String word) { + public boolean isAccessPath(String word) { return !LiteralPattern.isDouble(word) && CommonPattern.isAccessPath(word); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index 8b09e7b4..724f6d79 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -67,8 +67,8 @@ public class DefaultSemanticParser extends AbstractSemanticParser { } public TokenTypeEnum getCommonTokenType(SemanticContext context, String word) { - if (isPath(word)) { - return TokenTypeEnum.PATH; + if (isAccessPath(word)) { + return TokenTypeEnum.ACCESS_PATH; } else if (isAnnotation(word)) { return TokenTypeEnum.ANNOTATION; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java index f0d3fef2..c539d4ca 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java @@ -15,8 +15,8 @@ public abstract class Semantic extends Attributes { this.tokenType = tokenType; } - public boolean isPath() { - return tokenType == TokenTypeEnum.PATH; + public boolean isAccessPath() { + return tokenType == TokenTypeEnum.ACCESS_PATH; } public boolean isAnnotation() { diff --git a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SemanticTest.java b/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SemanticTest.java index 8514071a..57f69fe2 100644 --- a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SemanticTest.java +++ b/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SemanticTest.java @@ -24,7 +24,7 @@ public class SemanticTest { public void test0000() { String text = "com.sum.spirit.example.Animal"; Token token = parser.getToken(new SemanticContext(), text); - assertTrue(token.isPath()); + assertTrue(token.isAccessPath()); } @Test diff --git a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java b/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java index 9226a1bf..ab1da941 100644 --- a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java +++ b/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java @@ -34,7 +34,7 @@ public class SyntaxTest { assertTrue(element.size() == 2); int count = 0; assertTypeAndValue(element.get(count++), TokenTypeEnum.KEYWORD, "import"); - assertTypeAndValue(element.get(count++), TokenTypeEnum.PATH, "com.sum.spirit.example.Animal"); + assertTypeAndValue(element.get(count++), TokenTypeEnum.ACCESS_PATH, "com.sum.spirit.example.Animal"); } @Test -- Gitee From 6e9f57fdc84f5ca9a67fe1c6cfec987ed37403db Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 22:02:26 +0800 Subject: [PATCH 30/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sum/spirit/common/pattern/AccessPattern.java | 5 +++++ .../java/com/sum/spirit/common/pattern/CommonPattern.java | 5 ----- .../spirit/core/element/action/AbstractSemanticParser.java | 2 +- .../main/java/com/sum/spirit/core/lexer/AbstractLexer.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java index c567511f..e38f7de1 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java @@ -4,11 +4,16 @@ import java.util.regex.Pattern; public class AccessPattern { + public static final Pattern ACCESS_PATH_PATTERN = Pattern.compile("^(\\w+\\.)+[A-Z]+\\w+(\\.[a-z]+\\w*)?$"); public static final Pattern LOCAL_METHOD_PATTERN = Pattern.compile("^[a-z]+\\w*\\([\\s\\S]*\\)$"); public static final Pattern VISIT_FIELD_PATTERN = Pattern.compile("^\\.[a-z]+\\w*$"); public static final Pattern VISIT_METHOD_PATTERN = Pattern.compile("^\\.[a-z]+\\w*\\([\\s\\S]*\\)$"); public static final Pattern VISIT_INDEX_PATTERN = Pattern.compile("^\\[\\d+\\]$"); + public static boolean isAccessPath(String word) { + return ACCESS_PATH_PATTERN.matcher(word).matches(); + } + public static boolean isLocalMethod(String word) { return LOCAL_METHOD_PATTERN.matcher(word).matches(); } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java index 3cac0676..0e379779 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java @@ -4,16 +4,11 @@ import java.util.regex.Pattern; public class CommonPattern { - public static final Pattern ACCESS_PATH_PATTERN = Pattern.compile("^(\\w+\\.)+[A-Z]+\\w+(\\.[a-z]+\\w*)?$"); public static final Pattern ANNOTATION_PATTERN = Pattern.compile("^@[A-Z]+\\w+(\\([\\s\\S]+\\))?$"); public static final Pattern SUBEXPRESS_PATTERN = Pattern.compile("^\\([\\s\\S]+\\)$"); public static final Pattern VARIABLE_PATTERN = Pattern.compile("^[a-z]+\\w*$"); public static final Pattern PREFIX_PATTERN = Pattern.compile("^(\\.)?\\w+$"); - public static boolean isAccessPath(String word) { - return ACCESS_PATH_PATTERN.matcher(word).matches(); - } - public static boolean isAnnotation(String word) { return ANNOTATION_PATTERN.matcher(word).matches(); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java index 3d07f6d1..4f5b0ae9 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java @@ -12,7 +12,7 @@ import com.sum.spirit.core.api.SemanticParser; public abstract class AbstractSemanticParser implements SemanticParser { public boolean isAccessPath(String word) { - return !LiteralPattern.isDouble(word) && CommonPattern.isAccessPath(word); + return !LiteralPattern.isDouble(word) && AccessPattern.isAccessPath(word); } public boolean isAnnotation(String word) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java index 9f16ee0a..5b1c7cc6 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java @@ -5,7 +5,7 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; -import com.sum.spirit.common.pattern.CommonPattern; +import com.sum.spirit.common.pattern.AccessPattern; import com.sum.spirit.common.pattern.LiteralPattern; import com.sum.spirit.core.api.Lexer; import com.sum.spirit.core.api.LexerAction; @@ -96,7 +96,7 @@ public abstract class AbstractLexer extends AbstractCharsHandler implements Lexe public void addToWords(List words, Region region, String text) { if (region instanceof completedRegion) { - if (text.indexOf(".") > 0 && !LiteralPattern.isDouble(text) && !CommonPattern.isAccessPath(text)) { + if (text.indexOf(".") > 0 && !LiteralPattern.isDouble(text) && !AccessPattern.isAccessPath(text)) { List subWords = Arrays.asList(text.replaceAll("\\.", " .").split(" ")); words.addAll(subWords); return; -- Gitee From 3872225fb65798895c03f99ee072f68a63b5100b Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 22:36:19 +0800 Subject: [PATCH 31/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/common/pattern/AccessPattern.java | 18 +++++ .../spirit/common/pattern/CommonPattern.java | 13 +++ .../spirit/common/pattern/LiteralPattern.java | 33 ++++++++ .../spirit/common/pattern/TypePattern.java | 18 +++++ .../action/AbstractSemanticParser.java | 80 +------------------ .../element/action/DefaultSemanticParser.java | 13 +-- 6 files changed, 92 insertions(+), 83 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java index e38f7de1..7366e3c8 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java @@ -2,6 +2,8 @@ package com.sum.spirit.common.pattern; import java.util.regex.Pattern; +import com.sum.spirit.common.enums.TokenTypeEnum; + public class AccessPattern { public static final Pattern ACCESS_PATH_PATTERN = Pattern.compile("^(\\w+\\.)+[A-Z]+\\w+(\\.[a-z]+\\w*)?$"); @@ -30,4 +32,20 @@ public class AccessPattern { return VISIT_INDEX_PATTERN.matcher(word).matches(); } + public static TokenTypeEnum getTokenType(String word) { + if (isLocalMethod(word)) { + return TokenTypeEnum.LOCAL_METHOD; + + } else if (isVisitField(word)) { + return TokenTypeEnum.VISIT_FIELD; + + } else if (isVisitMethod(word)) { + return TokenTypeEnum.VISIT_METHOD; + + } else if (isVisitIndex(word)) { + return TokenTypeEnum.VISIT_INDEX; + } + return null; + } + } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java index 0e379779..667c368e 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java @@ -2,6 +2,8 @@ package com.sum.spirit.common.pattern; import java.util.regex.Pattern; +import com.sum.spirit.common.enums.TokenTypeEnum; + public class CommonPattern { public static final Pattern ANNOTATION_PATTERN = Pattern.compile("^@[A-Z]+\\w+(\\([\\s\\S]+\\))?$"); @@ -25,4 +27,15 @@ public class CommonPattern { return PREFIX_PATTERN.matcher(word).matches(); } + public static TokenTypeEnum getSubexpressTokenType(String word) { + if (isSubexpress(word)) { + if (TypePattern.isAnyType(TypePattern.getCastType(word))) { + return TokenTypeEnum.CAST; + } else { + return TokenTypeEnum.SUBEXPRESS; + } + } + return null; + } + } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java index 5210067d..9d96dac0 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java @@ -2,6 +2,8 @@ package com.sum.spirit.common.pattern; import java.util.regex.Pattern; +import com.sum.spirit.common.enums.TokenTypeEnum; + public class LiteralPattern { public static final Pattern NULL_PATTERN = Pattern.compile("^null$"); @@ -56,4 +58,35 @@ public class LiteralPattern { return CONST_VARIABLE_PATTERN.matcher(word).matches(); } + public static TokenTypeEnum getTokenType(String word) { + if (isNull(word)) { + return TokenTypeEnum.NULL; + + } else if (isBoolean(word)) { + return TokenTypeEnum.BOOLEAN; + + } else if (isChar(word)) { + return TokenTypeEnum.CHAR; + + } else if (isInt(word)) { + return TokenTypeEnum.INT; + + } else if (isLong(word)) { + return TokenTypeEnum.LONG; + + } else if (isDouble(word)) { + return TokenTypeEnum.DOUBLE; + + } else if (isString(word)) { + return TokenTypeEnum.STRING; + + } else if (isList(word)) { + return TokenTypeEnum.LIST; + + } else if (isMap(word)) { + return TokenTypeEnum.MAP; + } + return null; + } + } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java index e9c06cfa..a87bf221 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java @@ -3,6 +3,7 @@ package com.sum.spirit.common.pattern; import java.util.regex.Pattern; import com.sum.spirit.common.enums.PrimitiveEnum; +import com.sum.spirit.common.enums.TokenTypeEnum; public class TypePattern { @@ -57,4 +58,21 @@ public class TypePattern { || isTypeArray(word) || isGenericType(word)); } + public static TokenTypeEnum getTokenType(String word) { + if (isPrimitiveArraySizeInit(word) || isPrimitiveArrayLiteralInit(word)) { + return TokenTypeEnum.ARRAY_INIT; + + } else if (isTypeArraySizeInit(word) || isTypeArrayLiteralInit(word)) { + return TokenTypeEnum.ARRAY_INIT; + + } else if (isTypeInit(word)) { + return TokenTypeEnum.TYPE_INIT; + } + return null; + } + + public static String getCastType(String word) { + return word.substring(1, word.length() - 1); + } + } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java index 4f5b0ae9..9c800956 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java @@ -2,7 +2,6 @@ package com.sum.spirit.core.element.action; import com.sum.spirit.common.enums.KeywordEnum; import com.sum.spirit.common.enums.SymbolEnum; -import com.sum.spirit.common.enums.TokenTypeEnum; import com.sum.spirit.common.pattern.LiteralPattern; import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.common.pattern.AccessPattern; @@ -24,11 +23,11 @@ public abstract class AbstractSemanticParser implements SemanticParser { } public boolean isOperator(String word) { - return SymbolEnum.getOperator(word) != null; + return SymbolEnum.isOperator(word); } public boolean isSeparator(String word) { - return SymbolEnum.getSeparator(word) != null; + return SymbolEnum.isSeparator(word); } @Override @@ -40,79 +39,4 @@ public abstract class AbstractSemanticParser implements SemanticParser { return LiteralPattern.isConstVariable(word) || CommonPattern.isVariable(word); } - public TokenTypeEnum getInitTokenType(String word) { - if (TypePattern.isPrimitiveArraySizeInit(word) || TypePattern.isPrimitiveArrayLiteralInit(word)) { - return TokenTypeEnum.ARRAY_INIT; - - } else if (TypePattern.isTypeArraySizeInit(word) || TypePattern.isTypeArrayLiteralInit(word)) { - return TokenTypeEnum.ARRAY_INIT; - - } else if (TypePattern.isTypeInit(word)) { - return TokenTypeEnum.TYPE_INIT; - } - return null; - } - - public TokenTypeEnum getLiteralTokenType(String word) { - if (LiteralPattern.isNull(word)) { - return TokenTypeEnum.NULL; - - } else if (LiteralPattern.isBoolean(word)) { - return TokenTypeEnum.BOOLEAN; - - } else if (LiteralPattern.isChar(word)) { - return TokenTypeEnum.CHAR; - - } else if (LiteralPattern.isInt(word)) { - return TokenTypeEnum.INT; - - } else if (LiteralPattern.isLong(word)) { - return TokenTypeEnum.LONG; - - } else if (LiteralPattern.isDouble(word)) { - return TokenTypeEnum.DOUBLE; - - } else if (LiteralPattern.isString(word)) { - return TokenTypeEnum.STRING; - - } else if (LiteralPattern.isList(word)) { - return TokenTypeEnum.LIST; - - } else if (LiteralPattern.isMap(word)) { - return TokenTypeEnum.MAP; - } - return null; - } - - public TokenTypeEnum getSubexpressTokenType(String word) { - if (CommonPattern.isSubexpress(word)) { - if (isType(getCastType(word))) { - return TokenTypeEnum.CAST; - } else { - return TokenTypeEnum.SUBEXPRESS; - } - } - return null; - } - - public TokenTypeEnum getAccessTokenType(String word) { - if (AccessPattern.isLocalMethod(word)) { - return TokenTypeEnum.LOCAL_METHOD; - - } else if (AccessPattern.isVisitField(word)) { - return TokenTypeEnum.VISIT_FIELD; - - } else if (AccessPattern.isVisitMethod(word)) { - return TokenTypeEnum.VISIT_METHOD; - - } else if (AccessPattern.isVisitIndex(word)) { - return TokenTypeEnum.VISIT_INDEX; - } - return null; - } - - public String getCastType(String word) { - return word.substring(1, word.length() - 1); - } - } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index 724f6d79..404b0032 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -8,7 +8,10 @@ import org.springframework.stereotype.Component; import com.sum.spirit.common.constants.Attribute; import com.sum.spirit.common.enums.TokenTypeEnum; +import com.sum.spirit.common.pattern.AccessPattern; import com.sum.spirit.common.pattern.CommonPattern; +import com.sum.spirit.common.pattern.LiteralPattern; +import com.sum.spirit.common.pattern.TypePattern; import com.sum.spirit.core.api.Lexer; import com.sum.spirit.core.element.entity.SemanticContext; import com.sum.spirit.core.element.entity.Statement; @@ -86,17 +89,17 @@ public class DefaultSemanticParser extends AbstractSemanticParser { return TokenTypeEnum.TYPE; } - TokenTypeEnum tokenType = getInitTokenType(word); + TokenTypeEnum tokenType = TypePattern.getTokenType(word); if (tokenType != null) { return tokenType; } - tokenType = getLiteralTokenType(word); + tokenType = LiteralPattern.getTokenType(word); if (tokenType != null) { return tokenType; } - tokenType = getSubexpressTokenType(word); + tokenType = CommonPattern.getSubexpressTokenType(word); if (tokenType != null) { return tokenType; } @@ -105,7 +108,7 @@ public class DefaultSemanticParser extends AbstractSemanticParser { return TokenTypeEnum.VARIABLE; } - tokenType = getAccessTokenType(word); + tokenType = AccessPattern.getTokenType(word); if (tokenType != null) { return tokenType; } @@ -142,7 +145,7 @@ public class DefaultSemanticParser extends AbstractSemanticParser { token.setAttr(Attribute.SIMPLE_NAME, getPrefix(word)); } else if (token.isCast()) { - token.setAttr(Attribute.SIMPLE_NAME, getCastType(word)); + token.setAttr(Attribute.SIMPLE_NAME, TypePattern.getCastType(word)); } else if (token.isAccess()) { token.setAttr(Attribute.MEMBER_NAME, getPrefix(word)); -- Gitee From 53fe25f16871cfe2e07536a5e2b5f82d296bd60e Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 22:42:47 +0800 Subject: [PATCH 32/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/common/pattern/CommonPattern.java | 6 +++++- .../java/com/sum/spirit/common/pattern/TypePattern.java | 4 ---- .../core/element/action/DefaultSemanticParser.java | 9 ++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java index 667c368e..10a16a03 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java @@ -29,7 +29,7 @@ public class CommonPattern { public static TokenTypeEnum getSubexpressTokenType(String word) { if (isSubexpress(word)) { - if (TypePattern.isAnyType(TypePattern.getCastType(word))) { + if (TypePattern.isAnyType(CommonPattern.getSubexpressValue(word))) { return TokenTypeEnum.CAST; } else { return TokenTypeEnum.SUBEXPRESS; @@ -38,4 +38,8 @@ public class CommonPattern { return null; } + public static String getSubexpressValue(String word) { + return word.substring(1, word.length() - 1); + } + } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java index a87bf221..21496aeb 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java @@ -71,8 +71,4 @@ public class TypePattern { return null; } - public static String getCastType(String word) { - return word.substring(1, word.length() - 1); - } - } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index 404b0032..f44936db 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -118,16 +118,15 @@ public class DefaultSemanticParser extends AbstractSemanticParser { public Object getTokenValue(Token token, String word) { if (token.isType()) { - return word.contains("<") || word.contains(">") ? getStatement(word, true) : word; + return word.contains("<") || word.contains(">") ? getStatement(true, word) : word; } else if (token.isArrayInit() || token.isList() || token.isMap() || token.isSubexpress() || token.isInvoke()) { - // 拆分数组是为了更好的添加new这个关键字 - return getStatement(word, false); + return getStatement(false, word);// 拆分数组是为了更好的添加new这个关键字 } return word; } - public Statement getStatement(String word, boolean insideType) { + public Statement getStatement(boolean insideType, String word) { List words = insideType ? lexer.getSubWords(word, '<', '>') : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); List tokens = getTokens(new SemanticContext(true, insideType), words); Assert.notNull(tokens, "Tokens cannot be null!"); @@ -145,7 +144,7 @@ public class DefaultSemanticParser extends AbstractSemanticParser { token.setAttr(Attribute.SIMPLE_NAME, getPrefix(word)); } else if (token.isCast()) { - token.setAttr(Attribute.SIMPLE_NAME, TypePattern.getCastType(word)); + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getSubexpressValue(word)); } else if (token.isAccess()) { token.setAttr(Attribute.MEMBER_NAME, getPrefix(word)); -- Gitee From abbeaf92bcf79ab78822028591309c1cd10c2d90 Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 22:44:22 +0800 Subject: [PATCH 33/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sum/spirit/common/pattern/CommonPattern.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java index 10a16a03..a5caa4b2 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java @@ -29,11 +29,7 @@ public class CommonPattern { public static TokenTypeEnum getSubexpressTokenType(String word) { if (isSubexpress(word)) { - if (TypePattern.isAnyType(CommonPattern.getSubexpressValue(word))) { - return TokenTypeEnum.CAST; - } else { - return TokenTypeEnum.SUBEXPRESS; - } + return TypePattern.isAnyType(CommonPattern.getSubexpressValue(word)) ? TokenTypeEnum.CAST : TokenTypeEnum.SUBEXPRESS; } return null; } -- Gitee From 7ea9c6203940cee94af606f9f275605334f63371 Mon Sep 17 00:00:00 2001 From: chenT Date: Tue, 25 May 2021 22:48:26 +0800 Subject: [PATCH 34/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/common/pattern/CommonPattern.java | 21 ++++++++++++++ .../element/action/DefaultSemanticParser.java | 29 +++---------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java index a5caa4b2..347d049b 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java @@ -34,8 +34,29 @@ public class CommonPattern { return null; } + public static String getAnnotationName(String word) { + if (word.contains("(")) { + word = word.substring(0, word.indexOf('(')); + } + return word.substring(word.indexOf('@') + 1); + } + public static String getSubexpressValue(String word) { return word.substring(1, word.length() - 1); } + public static String getPrefix(String word) { + int start = word.startsWith(".") ? 1 : 0; + int end = word.length(); + if (word.contains("[")) { + int index = word.indexOf("["); + end = index < end ? index : end; + } + if (word.contains("(")) { + int index = word.indexOf("("); + end = index < end ? index : end; + } + return word.substring(start, end); + } + } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java index f44936db..ac3e093f 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java @@ -135,41 +135,20 @@ public class DefaultSemanticParser extends AbstractSemanticParser { public void setTokenAttributes(Token token, String word) { if (token.isAnnotation()) { - token.setAttr(Attribute.SIMPLE_NAME, getAnnotationName(word)); + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getAnnotationName(word)); } else if (token.isArrayInit()) { - token.setAttr(Attribute.SIMPLE_NAME, getPrefix(word) + "[]"); + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getPrefix(word) + "[]"); } else if (token.isTypeInit()) { - token.setAttr(Attribute.SIMPLE_NAME, getPrefix(word)); + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getPrefix(word)); } else if (token.isCast()) { token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getSubexpressValue(word)); } else if (token.isAccess()) { - token.setAttr(Attribute.MEMBER_NAME, getPrefix(word)); + token.setAttr(Attribute.MEMBER_NAME, CommonPattern.getPrefix(word)); } } - public String getAnnotationName(String word) { - if (word.contains("(")) { - word = word.substring(0, word.indexOf('(')); - } - return word.substring(word.indexOf('@') + 1); - } - - public String getPrefix(String word) { - int start = word.startsWith(".") ? 1 : 0; - int end = word.length(); - if (word.contains("[")) { - int index = word.indexOf("["); - end = index < end ? index : end; - } - if (word.contains("(")) { - int index = word.indexOf("("); - end = index < end ? index : end; - } - return word.substring(start, end); - } - } -- Gitee From 5244027cebae9cc7a8f6a064bfbd53c333a2255b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 26 May 2021 09:33:29 +0800 Subject: [PATCH 35/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/element/action/DefaultSyntaxParser.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java index 9ae50a30..e8c86326 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java @@ -29,20 +29,24 @@ public class DefaultSyntaxParser implements SyntaxParser { public SyntaxResult parseSyntax(List tokens, Statement statement) { Assert.notEmpty(tokens, "The tokens cannot be empty!"); - SyntaxEnum syntax = getSyntaxWithoutTree(tokens);// 1.能够不通过语法树获取语法,且后续功能不需要语法树 + // 1.能够不通过语法树获取语法,且后续功能不需要语法树 + SyntaxEnum syntax = getSyntaxWithoutTree(tokens); if (syntax != null) { return new SyntaxResult(syntax, null); } - syntax = getSyntaxWithTree(tokens);// 2.能够不通过语法树获取语法,但后续功能需要语法树 + // 2.能够不通过语法树获取语法,但后续功能需要语法树 + syntax = getSyntaxWithTree(tokens); if (syntax != null) { SyntaxTree syntaxTree = builder.buildTree(statement); return new SyntaxResult(syntax, syntaxTree); } - SyntaxTree syntaxTree = builder.buildTree(statement);// 3.必须通过语法树获取语法 + // 3.必须通过语法树获取语法 + SyntaxTree syntaxTree = builder.buildTree(statement); syntax = getSyntaxByTree(syntaxTree); Assert.notNull(syntax, "The syntax cannot be null!"); + return new SyntaxResult(syntax, syntaxTree); } -- Gitee From bfa8868aa85b0d52c68e8fcd70470ae65557070d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 26 May 2021 09:49:11 +0800 Subject: [PATCH 36/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../element/action/DefaultSyntaxParser.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java index e8c86326..533b56f2 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java @@ -7,7 +7,6 @@ import org.springframework.stereotype.Component; import com.sum.spirit.common.constants.Attribute; import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.enums.SymbolEnum; import com.sum.spirit.common.enums.SyntaxEnum; import com.sum.spirit.core.api.SyntaxParser; import com.sum.spirit.core.api.TreeBuilder; @@ -74,16 +73,16 @@ public class DefaultSyntaxParser implements SyntaxParser { } } // ELSE / CATCH / FINALLY - if (SymbolEnum.RIGHT_CURLY_BRACKET.value.equals(firstToken.toString())) { - if (KeywordEnum.ELSE.value.equals(secondToken.toString())) {// } else { - if (SymbolEnum.LEFT_CURLY_BRACKET.value.equals(thirdToken.toString())) { + if ("}".equals(firstToken.toString())) { + if ("else".equals(secondToken.toString())) {// } else { + if ("{".equals(thirdToken.toString())) { return SyntaxEnum.ELSE; } - } else if (KeywordEnum.CATCH.value.equals(secondToken.toString())) {// } catch Exception x { + } else if ("catch".equals(secondToken.toString())) {// } catch Exception x { return SyntaxEnum.CATCH; - } else if (KeywordEnum.FINALLY.value.equals(secondToken.toString())) {// } finally { + } else if ("finally".equals(secondToken.toString())) {// } finally { return SyntaxEnum.FINALLY; } } @@ -102,27 +101,27 @@ public class DefaultSyntaxParser implements SyntaxParser { // SUPER / THIS if (firstToken.isLocalMethod()) { String memberName = firstToken.attr(Attribute.MEMBER_NAME); - if (KeywordEnum.SUPER.value.equals(memberName)) { + if ("super".equals(memberName)) { return SyntaxEnum.SUPER; - } else if (KeywordEnum.THIS.value.equals(memberName)) { + } else if ("this".equals(memberName)) { return SyntaxEnum.THIS; } } // FOR / FOR_IN - if (KeywordEnum.FOR.value.equals(firstToken.toString())) { + if ("for".equals(firstToken.toString())) { if (secondToken.isSubexpress()) {// for (i=0; i<10; i++) { return SyntaxEnum.FOR; } - if (KeywordEnum.IN.value.equals(thirdToken.toString())) {// for ? in ? { + if ("in".equals(thirdToken.toString())) {// for ? in ? { return SyntaxEnum.FOR_IN; } throw new RuntimeException("Unknown syntax!"); } // ELSE_IF - if (SymbolEnum.RIGHT_CURLY_BRACKET.value.equals(firstToken.toString())) { - if (KeywordEnum.ELSE.value.equals(secondToken.toString())) { - if (KeywordEnum.IF.value.equals(thirdToken.toString())) {// } else if ? { + if ("}".equals(firstToken.toString())) { + if ("else".equals(secondToken.toString())) { + if ("if".equals(thirdToken.toString())) {// } else if ? { return SyntaxEnum.ELSE_IF; } } @@ -150,7 +149,7 @@ public class DefaultSyntaxParser implements SyntaxParser { } else if (firstToken.isAssign()) { Token prevToken = firstNode.prev.token; Token nextToken = firstNode.next.token; - if (nextToken.isSeparator() && SymbolEnum.LEFT_CURLY_BRACKET.value.equals(nextToken.toString())) {// var = { + if (nextToken.isSeparator() && "{".equals(nextToken.toString())) {// var = { return SyntaxEnum.STRUCT_ASSIGN; } else if (prevToken.isType()) {// String text = "abc" -- Gitee From ce765a5c71eead77cb255690ca1c23d9a6c2719b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 26 May 2021 09:50:47 +0800 Subject: [PATCH 37/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/core/element/action/AbstractTreeBuilder.java | 2 +- .../com/sum/spirit/core/element/action/DefaultTreeBuilder.java | 2 +- .../main/java/com/sum/spirit/core/element/frame/Semantic.java | 2 +- .../java/com/sum/spirit/core/element/utils/StmtVisiter.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java index 83f2434e..9700abdd 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java @@ -46,7 +46,7 @@ public abstract class AbstractTreeBuilder implements TreeBuilder { for (int i = 0; i < tokens.size(); i++) { Token token = tokens.get(i); token.setAttr(Attribute.POSITION, position); - if (token.canSplit()) { + if (token.hasSubStmt()) { markPositionAndLength(position, token.getValue()); } int length = token.toString().length(); diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultTreeBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultTreeBuilder.java index b6423225..3956c84c 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultTreeBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultTreeBuilder.java @@ -26,7 +26,7 @@ public class DefaultTreeBuilder extends AbstractTreeBuilder { public List buildNodes(List tokens) { final List nodes = new ArrayList<>(); ListUtils.visit(tokens, (index, token) -> { - if (token.canSplit()) {// 嵌套语法树 + if (token.hasSubStmt()) {// 嵌套语法树 SyntaxTree syntaxTree = buildTree(token.getValue()); token = new Token(token.tokenType, syntaxTree, token.attributes); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java index c539d4ca..d96d663b 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java @@ -151,7 +151,7 @@ public abstract class Semantic extends Attributes { return isVisitField() || isVisitMethod() || isVisitIndex(); } - public boolean canSplit() { + public boolean hasSubStmt() { return isList() || isMap() || isSubexpress() || isInvoke(); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtVisiter.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtVisiter.java index 7ea7edbc..8cca0528 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtVisiter.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtVisiter.java @@ -7,7 +7,7 @@ public class StmtVisiter { public static void visit(Statement statement, Consumer consumer) { for (Token token : statement) { - if (token.canSplit()) { + if (token.hasSubStmt()) { visit(token.getValue(), consumer); } } -- Gitee From d63c978bfa5da89cd339a4186944646ac649ec20 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Wed, 26 May 2021 09:52:03 +0800 Subject: [PATCH 38/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sum/spirit/core/element/action/AbstractTreeBuilder.java | 2 +- .../src/main/java/com/sum/spirit/core/element/entity/Node.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java index 9700abdd..b66ad0ec 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java @@ -35,7 +35,7 @@ public abstract class AbstractTreeBuilder implements TreeBuilder { if (node.next != null) { markTreeId(treeId + "-" + "1", node.next); } - if (node.canSplit()) { + if (node.hasSubTree()) { SyntaxTree syntaxTree = node.token.getValue(); markTreeId(syntaxTree.nodes); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Node.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Node.java index 85bd2a44..402bf640 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Node.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Node.java @@ -16,7 +16,7 @@ public class Node { return prev != null || next != null; } - public boolean canSplit() { + public boolean hasSubTree() { return token != null && token.value != null && token.value instanceof SyntaxTree; } -- Gitee From e7fcb88acf8858d0f3ca473e9cd4d6a9cfe04466 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 27 May 2021 11:08:43 +0800 Subject: [PATCH 39/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sum/spirit/output/java/ExtClassLoader.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java index 919b97a5..865c0ce8 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java +++ b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java @@ -29,9 +29,9 @@ public class ExtClassLoader extends AbstractClassLoader> implements Ini @Override public void afterPropertiesSet() throws Exception { - String classpathsArg = ConfigUtils.getClasspaths(); - if (StringUtils.isNotBlank(classpathsArg)) { - List classpaths = Splitter.on(",").trimResults().splitToList(classpathsArg); + String classpathsStr = ConfigUtils.getClasspaths(); + if (StringUtils.isNotBlank(classpathsStr)) { + List classpaths = Splitter.on(",").trimResults().splitToList(classpathsStr); classLoader = ReflectUtils.getClassLoader(classpaths); } else { classLoader = this.getClass().getClassLoader(); -- Gitee From c2ee4e2d4ff1171f63ee54ce89e07aa33065352f Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 27 May 2021 12:56:32 +0800 Subject: [PATCH 40/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/output/java/ExtClassLoader.java | 32 +-------------- .../spirit/output/java/SysClassLoader.java | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+), 31 deletions(-) create mode 100644 spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java index 865c0ce8..0f3557a4 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java +++ b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java @@ -1,9 +1,7 @@ package com.sum.spirit.output.java; import java.net.URL; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; @@ -13,17 +11,14 @@ import org.springframework.stereotype.Component; import com.google.common.base.Splitter; import com.sum.spirit.common.utils.ConfigUtils; -import com.sum.spirit.core.api.StaticTypesCtor; import com.sum.spirit.core.clazz.AbstractClassLoader; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeBuilder; import com.sum.spirit.core.clazz.utils.TypeUtils; import com.sum.spirit.output.java.utils.ReflectUtils; @Component @Order(-80) @DependsOn("configUtils") -public class ExtClassLoader extends AbstractClassLoader> implements InitializingBean, StaticTypesCtor { +public class ExtClassLoader extends AbstractClassLoader> implements InitializingBean { public ClassLoader classLoader; @@ -38,31 +33,6 @@ public class ExtClassLoader extends AbstractClassLoader> implements Ini } } - @Override - public Map prepareStaticTypes() { - Map typeMap = new HashMap<>(); - typeMap.put("VOID_BOX", TypeBuilder.build("java.lang.Void", "Void", "java.lang.Void", false, false, false, false, true)); - typeMap.put("BOOLEAN_BOX", TypeBuilder.build("java.lang.Boolean", "Boolean", "java.lang.Boolean", false, false, false, false, true)); - typeMap.put("CHAR_BOX", TypeBuilder.build("java.lang.Character", "Character", "java.lang.Character", false, false, false, false, true)); - typeMap.put("BYTE_BOX", TypeBuilder.build("java.lang.Byte", "Byte", "java.lang.Byte", false, false, false, false, true)); - typeMap.put("SHORT_BOX", TypeBuilder.build("java.lang.Short", "Short", "java.lang.Short", false, false, false, false, true)); - typeMap.put("INT_BOX", TypeBuilder.build("java.lang.Integer", "Integer", "java.lang.Integer", false, false, false, false, true)); - typeMap.put("LONG_BOX", TypeBuilder.build("java.lang.Long", "Long", "java.lang.Long", false, false, false, false, true)); - typeMap.put("FLOAT_BOX", TypeBuilder.build("java.lang.Float", "Float", "java.lang.Float", false, false, false, false, true)); - typeMap.put("DOUBLE_BOX", TypeBuilder.build("java.lang.Double", "Double", "java.lang.Double", false, false, false, false, true)); - - typeMap.put("OBJECT", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, false, false, true)); - typeMap.put("STRING", TypeBuilder.build("java.lang.String", "String", "java.lang.String", false, false, false, false, true)); - typeMap.put("OBJECT_ARRAY", TypeBuilder.build("[Ljava.lang.Object;", "Object[]", "java.lang.Object[]", false, true/* array */, false, false, true)); - typeMap.put("STRING_ARRAY", TypeBuilder.build("[Ljava.lang.String;", "String[]", "java.lang.String[]", false, true/* array */, false, false, true)); - typeMap.put("CLASS", TypeBuilder.build("java.lang.Class", "Class", "java.lang.Class", false, false, false, false, true)); - typeMap.put("LIST", TypeBuilder.build("java.util.List", "List", "java.util.List", false, false, false, false, true)); - typeMap.put("MAP", TypeBuilder.build("java.util.Map", "Map", "java.util.Map", false, false, false, false, true)); - typeMap.put("NULL", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, true/* null */, false, true)); - typeMap.put("WILDCARD", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, false, true/* wildcard */, true)); - return typeMap; - } - @Override public List getResources() { throw new RuntimeException("This method is not supported!"); diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java new file mode 100644 index 00000000..68abc50f --- /dev/null +++ b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java @@ -0,0 +1,40 @@ +package com.sum.spirit.output.java; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.stereotype.Component; + +import com.sum.spirit.core.api.StaticTypesCtor; +import com.sum.spirit.core.clazz.entity.IType; +import com.sum.spirit.core.clazz.utils.TypeBuilder; + +@Component +public class SysClassLoader implements StaticTypesCtor { + + @Override + public Map prepareStaticTypes() { + Map typeMap = new HashMap<>(); + typeMap.put("VOID_BOX", TypeBuilder.build("java.lang.Void", "Void", "java.lang.Void", false, false, false, false, true)); + typeMap.put("BOOLEAN_BOX", TypeBuilder.build("java.lang.Boolean", "Boolean", "java.lang.Boolean", false, false, false, false, true)); + typeMap.put("CHAR_BOX", TypeBuilder.build("java.lang.Character", "Character", "java.lang.Character", false, false, false, false, true)); + typeMap.put("BYTE_BOX", TypeBuilder.build("java.lang.Byte", "Byte", "java.lang.Byte", false, false, false, false, true)); + typeMap.put("SHORT_BOX", TypeBuilder.build("java.lang.Short", "Short", "java.lang.Short", false, false, false, false, true)); + typeMap.put("INT_BOX", TypeBuilder.build("java.lang.Integer", "Integer", "java.lang.Integer", false, false, false, false, true)); + typeMap.put("LONG_BOX", TypeBuilder.build("java.lang.Long", "Long", "java.lang.Long", false, false, false, false, true)); + typeMap.put("FLOAT_BOX", TypeBuilder.build("java.lang.Float", "Float", "java.lang.Float", false, false, false, false, true)); + typeMap.put("DOUBLE_BOX", TypeBuilder.build("java.lang.Double", "Double", "java.lang.Double", false, false, false, false, true)); + + typeMap.put("OBJECT", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, false, false, true)); + typeMap.put("STRING", TypeBuilder.build("java.lang.String", "String", "java.lang.String", false, false, false, false, true)); + typeMap.put("OBJECT_ARRAY", TypeBuilder.build("[Ljava.lang.Object;", "Object[]", "java.lang.Object[]", false, true/* array */, false, false, true)); + typeMap.put("STRING_ARRAY", TypeBuilder.build("[Ljava.lang.String;", "String[]", "java.lang.String[]", false, true/* array */, false, false, true)); + typeMap.put("CLASS", TypeBuilder.build("java.lang.Class", "Class", "java.lang.Class", false, false, false, false, true)); + typeMap.put("LIST", TypeBuilder.build("java.util.List", "List", "java.util.List", false, false, false, false, true)); + typeMap.put("MAP", TypeBuilder.build("java.util.Map", "Map", "java.util.Map", false, false, false, false, true)); + typeMap.put("NULL", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, true/* null */, false, true)); + typeMap.put("WILDCARD", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, false, true/* wildcard */, true)); + return typeMap; + } + +} -- Gitee From 0d8f0b0a15de298b8dd3f06d2afc557c33c5105c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 27 May 2021 15:46:21 +0800 Subject: [PATCH 41/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/common/constants/AppConfig.java | 5 +- .../sum/spirit/common/utils/ConfigUtils.java | 8 +++ .../sum/spirit/core/api/StaticTypesCtor.java | 11 ---- .../core/clazz/AbstractTypeFactory.java | 4 +- .../{StaticTypes.java => TypeTable.java} | 57 ++++++++----------- .../spirit/core/compile/AppTypeFactory.java | 26 ++++----- .../core/compile/DefaultClassVisiter.java | 8 +-- .../core/compile/deduce/FragmentDeducer.java | 4 +- .../core/compile/deduce/TypeDerivator.java | 4 +- .../compile/linker/AdaptiveClassLinker.java | 16 +++--- .../spirit/output/java/SysClassLoader.java | 40 ------------- .../java/action/StringEqualsAction.java | 4 +- .../output/java/deduce/NativeTypeFactory.java | 4 +- .../maven/plugin/SpiritCompileMojo.java | 28 +++++++-- 14 files changed, 94 insertions(+), 125 deletions(-) delete mode 100644 spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/StaticTypesCtor.java rename spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/{StaticTypes.java => TypeTable.java} (56%) delete mode 100644 spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java diff --git a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java b/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java index acb07250..ed43ffa2 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java @@ -2,15 +2,16 @@ package com.sum.spirit.common.constants; public interface AppConfig { - String DEFAULT_CHARSET = "UTF-8"; - String INPUT_ARG_KEY = "input"; String OUTPUT_ARG_KEY = "output"; String CLASSPATHS_ARG_KEY = "classpaths"; + String LANG_PKG_ARG_KEY = "langPackage"; + String UTIL_PKG_ARG_KEY = "utilPackage"; String FILENAME_EXTENSION_KEY = "spirit.compile.file.extension"; String DEBUG_KEY = "spirit.compile.debug"; + String DEFAULT_CHARSET = "UTF-8"; String DEFAULT_FILENAME_EXTENSION = "sp"; boolean DEFAULT_DEBUG = true; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java b/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java index 54036e27..bf444330 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java @@ -52,6 +52,14 @@ public class ConfigUtils implements EnvironmentAware { return ConfigUtils.getProperty(AppConfig.CLASSPATHS_ARG_KEY); } + public static String getLangPackage() { + return ConfigUtils.getProperty(AppConfig.LANG_PKG_ARG_KEY); + } + + public static String getUtilPackage() { + return ConfigUtils.getProperty(AppConfig.UTIL_PKG_ARG_KEY); + } + public static String getFileExtension() { return ConfigUtils.getProperty(AppConfig.FILENAME_EXTENSION_KEY, AppConfig.DEFAULT_FILENAME_EXTENSION); } diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/StaticTypesCtor.java b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/StaticTypesCtor.java deleted file mode 100644 index c6eab7cc..00000000 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/StaticTypesCtor.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sum.spirit.core.api; - -import java.util.Map; - -import com.sum.spirit.core.clazz.entity.IType; - -public interface StaticTypesCtor { - - public Map prepareStaticTypes(); - -} diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java index 513527db..d9567817 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java +++ b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java @@ -10,7 +10,7 @@ import com.sum.spirit.core.api.SemanticParser; import com.sum.spirit.core.api.TypeFactory; import com.sum.spirit.core.clazz.entity.IClass; import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import cn.hutool.core.lang.Assert; @@ -33,7 +33,7 @@ public abstract class AbstractTypeFactory implements TypeFactory { @Override public IType createTypeVariable(String genericName) {// T or K - IType type = create(StaticTypes.OBJECT.getClassName()); + IType type = create(TypeTable.OBJECT.getClassName()); type.setGenericName(genericName); return type; } diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/StaticTypes.java b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeTable.java similarity index 56% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/StaticTypes.java rename to spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeTable.java index 8bbe3d17..e4758180 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/StaticTypes.java +++ b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeTable.java @@ -1,15 +1,10 @@ package com.sum.spirit.core.clazz.utils; -import java.util.Map; - import com.sum.spirit.common.enums.PrimitiveEnum; -import com.sum.spirit.common.utils.SpringUtils; -import com.sum.spirit.core.api.StaticTypesCtor; +import com.sum.spirit.common.utils.ConfigUtils; import com.sum.spirit.core.clazz.entity.IType; -import cn.hutool.core.lang.Assert; - -public class StaticTypes { +public class TypeTable { public static final IType VOID; public static final IType BOOLEAN; @@ -42,11 +37,11 @@ public class StaticTypes { public static final IType OBJECT; public static final IType STRING; - public static final IType OBJECT_ARRAY; - public static final IType STRING_ARRAY; public static final IType CLASS; public static final IType LIST; public static final IType MAP; + public static final IType OBJECT_ARRAY; + public static final IType STRING_ARRAY; public static final IType NULL; public static final IType WILDCARD; @@ -70,29 +65,27 @@ public class StaticTypes { FLOAT_ARRAY = TypeBuilder.build(PrimitiveEnum.FLOAT_ARRAY); DOUBLE_ARRAY = TypeBuilder.build(PrimitiveEnum.DOUBLE_ARRAY); - StaticTypesCtor ctor = SpringUtils.getBean(StaticTypesCtor.class); - Assert.notNull(ctor, "Static types ctor must be provided!"); - Map typeMap = ctor.prepareStaticTypes(); - - VOID_BOX = typeMap.get("VOID_BOX"); - BOOLEAN_BOX = typeMap.get("BOOLEAN_BOX"); - CHAR_BOX = typeMap.get("CHAR_BOX"); - BYTE_BOX = typeMap.get("BYTE_BOX"); - SHORT_BOX = typeMap.get("SHORT_BOX"); - INT_BOX = typeMap.get("INT_BOX"); - LONG_BOX = typeMap.get("LONG_BOX"); - FLOAT_BOX = typeMap.get("FLOAT_BOX"); - DOUBLE_BOX = typeMap.get("DOUBLE_BOX"); - - OBJECT = typeMap.get("OBJECT"); - STRING = typeMap.get("STRING"); - OBJECT_ARRAY = typeMap.get("OBJECT_ARRAY"); - STRING_ARRAY = typeMap.get("STRING_ARRAY"); - CLASS = typeMap.get("CLASS"); - LIST = typeMap.get("LIST"); - MAP = typeMap.get("MAP"); - NULL = typeMap.get("NULL"); - WILDCARD = typeMap.get("WILDCARD"); + String langPackage = ConfigUtils.getLangPackage() + "."; + String utilPackage = ConfigUtils.getUtilPackage() + "."; + VOID_BOX = TypeBuilder.build(langPackage + "Void", "Void", langPackage + "Void", false, false, false, false, true); + BOOLEAN_BOX = TypeBuilder.build(langPackage + "Boolean", "Boolean", langPackage + "Boolean", false, false, false, false, true); + CHAR_BOX = TypeBuilder.build(langPackage + "Character", "Character", langPackage + "Character", false, false, false, false, true); + BYTE_BOX = TypeBuilder.build(langPackage + "Byte", "Byte", langPackage + "Byte", false, false, false, false, true); + SHORT_BOX = TypeBuilder.build(langPackage + "Short", "Short", langPackage + "Short", false, false, false, false, true); + INT_BOX = TypeBuilder.build(langPackage + "Integer", "Integer", langPackage + "Integer", false, false, false, false, true); + LONG_BOX = TypeBuilder.build(langPackage + "Long", "Long", langPackage + "Long", false, false, false, false, true); + FLOAT_BOX = TypeBuilder.build(langPackage + "Float", "Float", langPackage + "Float", false, false, false, false, true); + DOUBLE_BOX = TypeBuilder.build(langPackage + "Double", "Double", langPackage + "Double", false, false, false, false, true); + OBJECT = TypeBuilder.build(langPackage + "Object", "Object", langPackage + "Object", false, false, false, false, true); + STRING = TypeBuilder.build(langPackage + "String", "String", langPackage + "String", false, false, false, false, true); + CLASS = TypeBuilder.build(langPackage + "Class", "Class", langPackage + "Class", false, false, false, false, true); + LIST = TypeBuilder.build(utilPackage + "List", "List", utilPackage + "List", false, false, false, false, true); + MAP = TypeBuilder.build(utilPackage + "Map", "Map", utilPackage + "Map", false, false, false, false, true); + + OBJECT_ARRAY = TypeBuilder.build("[L" + langPackage + "Object;", "Object[]", langPackage + "Object[]", false, true/* array */, false, false, true); + STRING_ARRAY = TypeBuilder.build("[L" + langPackage + "String;", "String[]", langPackage + "String[]", false, true/* array */, false, false, true); + NULL = TypeBuilder.build(langPackage + "Object", "Object", langPackage + "Object", false, false, true/* null */, false, true); + WILDCARD = TypeBuilder.build(langPackage + "Object", "Object", langPackage + "Object", false, false, false, true/* wildcard */, true); } public static IType getBoxType(String className) { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppTypeFactory.java index 1cbe9348..bfbcda3e 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppTypeFactory.java @@ -13,7 +13,7 @@ import com.sum.spirit.common.enums.PrimitiveEnum; import com.sum.spirit.core.clazz.AbstractTypeFactory; import com.sum.spirit.core.clazz.entity.IClass; import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import com.sum.spirit.core.clazz.utils.TypeUtils; import com.sum.spirit.core.compile.deduce.FragmentDeducer; import com.sum.spirit.core.compile.deduce.TypeDerivator; @@ -66,7 +66,7 @@ public class AppTypeFactory extends AbstractTypeFactory { if (token.value instanceof String) {// String // String[] //? //T,K String simpleName = token.getValue(); if ("?".equals(simpleName)) { - return StaticTypes.WILDCARD;// ? + return TypeTable.WILDCARD;// ? } if (clazz.getTypeVariableIndex(simpleName) >= 0) { return createTypeVariable(simpleName);// T or K @@ -96,19 +96,19 @@ public class AppTypeFactory extends AbstractTypeFactory { public IType getValueType(IClass clazz, Token token) { if (token.isBoolean()) { - return StaticTypes.BOOLEAN; + return TypeTable.BOOLEAN; } else if (token.isChar()) { - return StaticTypes.CHAR; + return TypeTable.CHAR; } else if (token.isInt()) { - return StaticTypes.INT; + return TypeTable.INT; } else if (token.isLong()) { - return StaticTypes.LONG; + return TypeTable.LONG; } else if (token.isDouble()) { - return StaticTypes.DOUBLE; + return TypeTable.DOUBLE; } else if (token.isNull()) { - return StaticTypes.NULL; + return TypeTable.NULL; } else if (token.isString()) { - return StaticTypes.STRING; + return TypeTable.STRING; } else if (token.isList()) { return getListType(clazz, token); } else if (token.isMap()) { @@ -120,7 +120,7 @@ public class AppTypeFactory extends AbstractTypeFactory { public IType getListType(IClass clazz, Token token) { Statement statement = token.getValue(); List statements = statement.subStmt(1, statement.size() - 1).splitStmt(","); - return create(StaticTypes.LIST.getClassName(), getGenericType(clazz, statements)); + return create(TypeTable.LIST.getClassName(), getGenericType(clazz, statements)); } public IType getMapType(IClass clazz, Token token) { @@ -132,13 +132,13 @@ public class AppTypeFactory extends AbstractTypeFactory { keyStatements.add(subStatements.get(0)); valueStatements.add(subStatements.get(1)); } - return create(StaticTypes.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); + return create(TypeTable.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); } public IType getGenericType(IClass clazz, List statements) { // 如果没有元素,则返回Object类型 if (statements.size() == 0) { - return StaticTypes.OBJECT; + return TypeTable.OBJECT; } IType genericType = null; for (Statement statement : statements) { @@ -151,7 +151,7 @@ public class AppTypeFactory extends AbstractTypeFactory { genericType = boxType; } else if (!derivator.isMoreAbstract(genericType, boxType)) {// 不同则使用Object - genericType = StaticTypes.OBJECT; + genericType = TypeTable.OBJECT; break; } } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultClassVisiter.java index a20f9eae..9bc5d6de 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultClassVisiter.java @@ -20,7 +20,7 @@ import com.sum.spirit.core.clazz.entity.IParameter; import com.sum.spirit.core.clazz.entity.IType; import com.sum.spirit.core.clazz.entity.IVariable; import com.sum.spirit.core.clazz.frame.MemberEntity; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import com.sum.spirit.core.compile.deduce.TypeDerivator; import com.sum.spirit.core.compile.entity.MethodContext; import com.sum.spirit.core.element.entity.Element; @@ -108,14 +108,14 @@ public class DefaultClassVisiter implements ClassVisiter { visitChildElements(clazz, context, method.element); // 判断方法的语法 if (method.element.isFunc()) { - return context.returnType != null ? context.returnType : StaticTypes.VOID; + return context.returnType != null ? context.returnType : TypeTable.VOID; } else if (method.element.isDeclareFunc()) { // 获取声明的类型 IType declaredType = factory.create(clazz, method.element.get(0)); // 如果这个方法有方法体 if (method.element.hasChild()) { - IType returnType = context.returnType != null ? context.returnType : StaticTypes.VOID; + IType returnType = context.returnType != null ? context.returnType : TypeTable.VOID; // 进行类型校验 if (!derivator.isMoreAbstract(declaredType, returnType)) { throw new RuntimeException("The derived type does not match the declared type!"); @@ -159,7 +159,7 @@ public class DefaultClassVisiter implements ClassVisiter { if (derivator.isMoreAbstract(variable.getType(), context.returnType)) { context.returnType = variable.getType(); } else { - context.returnType = StaticTypes.OBJECT; + context.returnType = TypeTable.OBJECT; } } } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java index 0b13d78b..e4aa15c6 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java @@ -9,7 +9,7 @@ import com.sum.spirit.common.constants.Attribute; import com.sum.spirit.core.api.TreeBuilder; import com.sum.spirit.core.clazz.entity.IClass; import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import com.sum.spirit.core.element.entity.Node; import com.sum.spirit.core.element.entity.Statement; import com.sum.spirit.core.element.entity.Token; @@ -41,7 +41,7 @@ public class FragmentDeducer { // 如果是逻辑判断,或者类型判断关键字 if (token.isLogical() || token.isRelation() || token.isInstanceof()) { - return StaticTypes.BOOLEAN; + return TypeTable.BOOLEAN; } else if (token.isArithmetic() || token.isBitwise()) { // 先取左边的,再取右边的 diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/TypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/TypeDerivator.java index 0f47931c..6c09d31c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/TypeDerivator.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/TypeDerivator.java @@ -8,7 +8,7 @@ import com.sum.spirit.common.enums.ModifierEnum; import com.sum.spirit.core.api.ClassLinker; import com.sum.spirit.core.api.TypeFactory; import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import com.sum.spirit.core.clazz.utils.TypeBuilder; import com.sum.spirit.core.clazz.utils.TypeVisiter; @@ -24,7 +24,7 @@ public class TypeDerivator { public ClassLinker linker; public IType toBox(IType type) { - IType boxType = StaticTypes.getBoxType(type.getClassName()); + IType boxType = TypeTable.getBoxType(type.getClassName()); return boxType != null ? boxType : type; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AdaptiveClassLinker.java index 4663d6a1..5e600edb 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -13,7 +13,7 @@ import com.sum.spirit.common.enums.ModifierEnum; import com.sum.spirit.core.api.ClassLinker; import com.sum.spirit.core.api.TypeFactory; import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import com.sum.spirit.core.compile.deduce.TypeDerivator; import cn.hutool.core.lang.Assert; @@ -56,16 +56,16 @@ public class AdaptiveClassLinker implements ClassLinker { } if (type.isArray()) { - return StaticTypes.OBJECT; + return TypeTable.OBJECT; } - if (StaticTypes.OBJECT.equals(type)) { + if (TypeTable.OBJECT.equals(type)) { return null; } IType superType = getLinker(type).getSuperType(type);// 如果不存在父类,则返回Object if (superType == null) { - return StaticTypes.OBJECT; + return TypeTable.OBJECT; } int modifiers = type.getModifiers(); @@ -96,7 +96,7 @@ public class AdaptiveClassLinker implements ClassLinker { Assert.notEmpty(fieldName, "Field name cannot be empty!"); if (KeywordEnum.CLASS.value.equals(fieldName)) {// xxx.class class是关键字 - return factory.create(StaticTypes.CLASS.getClassName(), derivator.toBox(type)); + return factory.create(TypeTable.CLASS.getClassName(), derivator.toBox(type)); } if (type.isPrimitive()) {// 原始类型没有属性和方法 @@ -104,7 +104,7 @@ public class AdaptiveClassLinker implements ClassLinker { } if (type.isArray() && ARRAY_LENGTH.equals(fieldName)) {// 访问数组length直接返回int类型 - return StaticTypes.INT; + return TypeTable.INT; } IType returnType = getLinker(type).visitField(type, fieldName);// 向上遍历推导 @@ -139,8 +139,8 @@ public class AdaptiveClassLinker implements ClassLinker { throw new RuntimeException("Array has no method!"); } - if (StaticTypes.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 - return StaticTypes.BOOLEAN; + if (TypeTable.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 + return TypeTable.BOOLEAN; } IType returnType = getLinker(type).visitMethod(type, methodName, parameterTypes);// 向上遍历推导 diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java deleted file mode 100644 index 68abc50f..00000000 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/SysClassLoader.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sum.spirit.output.java; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.stereotype.Component; - -import com.sum.spirit.core.api.StaticTypesCtor; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeBuilder; - -@Component -public class SysClassLoader implements StaticTypesCtor { - - @Override - public Map prepareStaticTypes() { - Map typeMap = new HashMap<>(); - typeMap.put("VOID_BOX", TypeBuilder.build("java.lang.Void", "Void", "java.lang.Void", false, false, false, false, true)); - typeMap.put("BOOLEAN_BOX", TypeBuilder.build("java.lang.Boolean", "Boolean", "java.lang.Boolean", false, false, false, false, true)); - typeMap.put("CHAR_BOX", TypeBuilder.build("java.lang.Character", "Character", "java.lang.Character", false, false, false, false, true)); - typeMap.put("BYTE_BOX", TypeBuilder.build("java.lang.Byte", "Byte", "java.lang.Byte", false, false, false, false, true)); - typeMap.put("SHORT_BOX", TypeBuilder.build("java.lang.Short", "Short", "java.lang.Short", false, false, false, false, true)); - typeMap.put("INT_BOX", TypeBuilder.build("java.lang.Integer", "Integer", "java.lang.Integer", false, false, false, false, true)); - typeMap.put("LONG_BOX", TypeBuilder.build("java.lang.Long", "Long", "java.lang.Long", false, false, false, false, true)); - typeMap.put("FLOAT_BOX", TypeBuilder.build("java.lang.Float", "Float", "java.lang.Float", false, false, false, false, true)); - typeMap.put("DOUBLE_BOX", TypeBuilder.build("java.lang.Double", "Double", "java.lang.Double", false, false, false, false, true)); - - typeMap.put("OBJECT", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, false, false, true)); - typeMap.put("STRING", TypeBuilder.build("java.lang.String", "String", "java.lang.String", false, false, false, false, true)); - typeMap.put("OBJECT_ARRAY", TypeBuilder.build("[Ljava.lang.Object;", "Object[]", "java.lang.Object[]", false, true/* array */, false, false, true)); - typeMap.put("STRING_ARRAY", TypeBuilder.build("[Ljava.lang.String;", "String[]", "java.lang.String[]", false, true/* array */, false, false, true)); - typeMap.put("CLASS", TypeBuilder.build("java.lang.Class", "Class", "java.lang.Class", false, false, false, false, true)); - typeMap.put("LIST", TypeBuilder.build("java.util.List", "List", "java.util.List", false, false, false, false, true)); - typeMap.put("MAP", TypeBuilder.build("java.util.Map", "Map", "java.util.Map", false, false, false, false, true)); - typeMap.put("NULL", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, true/* null */, false, true)); - typeMap.put("WILDCARD", TypeBuilder.build("java.lang.Object", "Object", "java.lang.Object", false, false, false, true/* wildcard */, true)); - return typeMap; - } - -} diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StringEqualsAction.java b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StringEqualsAction.java index e0b1f0c2..8d6500e2 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StringEqualsAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StringEqualsAction.java @@ -12,7 +12,7 @@ import com.sum.spirit.common.constants.Attribute; import com.sum.spirit.common.enums.TokenTypeEnum; import com.sum.spirit.core.clazz.entity.IClass; import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import com.sum.spirit.core.element.entity.Statement; import com.sum.spirit.core.element.entity.Token; import com.sum.spirit.output.java.utils.TypeUtils; @@ -47,7 +47,7 @@ public class StringEqualsAction extends AbstractTreeElementAction { String format = currentToken.isEquals() ? FORMAT : "!" + FORMAT; String text = String.format(format, prevStatement, nextStatement); Token expressToken = new Token(TokenTypeEnum.CUSTOM_EXPRESS, text); - expressToken.setAttr(Attribute.TYPE, StaticTypes.BOOLEAN); + expressToken.setAttr(Attribute.TYPE, TypeTable.BOOLEAN); expressToken.setAttr(Attribute.TREE_ID, currentToken.attr(Attribute.TREE_ID)); statement.replaceTokens(start, end, expressToken); clazz.addImport(StringUtils.class.getName()); diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeFactory.java b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeFactory.java index 9cf8de68..99e2d8ec 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeFactory.java +++ b/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeFactory.java @@ -11,7 +11,7 @@ import java.util.List; import org.springframework.stereotype.Component; import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.StaticTypes; +import com.sum.spirit.core.clazz.utils.TypeTable; import com.sum.spirit.core.compile.AppTypeFactory; @Component @@ -36,7 +36,7 @@ public class NativeTypeFactory extends AppTypeFactory { return create((Class) nativeType); } else if (nativeType instanceof WildcardType) {// ? - return StaticTypes.WILDCARD; + return TypeTable.WILDCARD; } else if (nativeType instanceof TypeVariable) {// T or K return createTypeVariable(nativeType.toString()); diff --git a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java b/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java index 52dfd4c3..84d88beb 100644 --- a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java +++ b/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java @@ -23,6 +23,10 @@ public class SpiritCompileMojo extends AbstractMojo { private String inputPath; @Parameter private String outputPath; + @Parameter + private String langPackage; + @Parameter + private String utilPackage; public void execute() throws MojoExecutionException, MojoFailureException { try { @@ -30,9 +34,8 @@ public class SpiritCompileMojo extends AbstractMojo { inputPath = project.getResources().get(0).getDirectory(); inputPath = inputPath.endsWith("\\resources") ? inputPath + "\\sources" : inputPath + "/sources"; } - if (outputPath == null) { - outputPath = project.getBuild().getSourceDirectory(); - } + outputPath = outputPath == null ? project.getBuild().getSourceDirectory() : outputPath; + getLog().info(""); getLog().info("-----------------------[ inputPath, outputPath ]------------------------"); getLog().info(inputPath); @@ -45,7 +48,16 @@ public class SpiritCompileMojo extends AbstractMojo { classpaths.forEach(getLog()::info); getLog().info(""); - JavaStarter.main(new String[] { "--input=" + inputPath, "--output=" + outputPath, "--classpaths=" + Joiner.on(", ").join(classpaths) }); + langPackage = langPackage == null ? "java.lang" : langPackage; + utilPackage = utilPackage == null ? "java.util" : utilPackage; + + JavaStarter.main(new String[] { // + "--input=" + inputPath, // + "--output=" + outputPath, // + "--classpaths=" + Joiner.on(", ").join(classpaths), // + "--langPackage=" + langPackage, // + "--utilPackage=" + utilPackage // + }); } catch (Exception e) { e.printStackTrace(); @@ -62,6 +74,12 @@ public class SpiritCompileMojo extends AbstractMojo { classpaths += userHome + "\\.m2\\repository\\org\\slf4j\\slf4j-api\\1.7.25\\slf4j-api-1.7.25.jar, "; classpaths += userHome + "\\.m2\\repository\\org\\apache\\commons\\commons-lang3\\3.9\\commons-lang3-3.9.jar, "; classpaths += "D:\\Work\\CloudSpace\\spirit\\spirit-example\\spirit-example-plugin\\target\\test-classes"; - JavaStarter.main(new String[] { "--input=" + inputPath, "--output=" + outputPath, "--classpaths=" + classpaths }); + JavaStarter.main(new String[] { // + "--input=" + inputPath, // + "--output=" + outputPath, // + "--classpaths=" + classpaths, // + "--langPackage=" + "java.lang", // + "--utilPackage=" + "java.util" // + }); } } -- Gitee From 1df49c02d16a72e17f709c7acdba8808850dde07 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Thu, 27 May 2021 16:17:40 +0800 Subject: [PATCH 42/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/common/constants/AppConfig.java | 25 +++++++++++-------- .../sum/spirit/common/utils/ConfigUtils.java | 17 +++++++------ .../core/element/DefaultDocumentReader.java | 4 +-- .../code/tools/service/MethodService.java | 4 +-- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java b/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java index ed43ffa2..744eddc7 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java @@ -2,17 +2,20 @@ package com.sum.spirit.common.constants; public interface AppConfig { - String INPUT_ARG_KEY = "input"; - String OUTPUT_ARG_KEY = "output"; - String CLASSPATHS_ARG_KEY = "classpaths"; - String LANG_PKG_ARG_KEY = "langPackage"; - String UTIL_PKG_ARG_KEY = "utilPackage"; + public static interface Argument { + String INPUT = "input"; + String OUTPUT = "output"; + String CLASSPATHS = "classpaths"; + String LANG_PACKAGE = "langPackage"; + String UTIL_PACKAGE = "utilPackage"; + String FILE_EXTENSION = "fileExtension"; + String DEBUG = "debug"; + } - String FILENAME_EXTENSION_KEY = "spirit.compile.file.extension"; - String DEBUG_KEY = "spirit.compile.debug"; - - String DEFAULT_CHARSET = "UTF-8"; - String DEFAULT_FILENAME_EXTENSION = "sp"; - boolean DEFAULT_DEBUG = true; + public static interface DefaultValue { + String CHARSET = "UTF-8"; + String FILE_EXTENSION = "sp"; + boolean DEBUG = true; + } } diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java b/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java index bf444330..be3ee15d 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java +++ b/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java @@ -4,7 +4,8 @@ import org.springframework.context.EnvironmentAware; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.AppConfig; +import com.sum.spirit.common.constants.AppConfig.Argument; +import com.sum.spirit.common.constants.AppConfig.DefaultValue; @Component public class ConfigUtils implements EnvironmentAware { @@ -41,31 +42,31 @@ public class ConfigUtils implements EnvironmentAware { } public static String getInputPath() { - return ConfigUtils.getProperty(AppConfig.INPUT_ARG_KEY); + return ConfigUtils.getProperty(Argument.INPUT); } public static String getOutputPath() { - return ConfigUtils.getProperty(AppConfig.OUTPUT_ARG_KEY); + return ConfigUtils.getProperty(Argument.OUTPUT); } public static String getClasspaths() { - return ConfigUtils.getProperty(AppConfig.CLASSPATHS_ARG_KEY); + return ConfigUtils.getProperty(Argument.CLASSPATHS); } public static String getLangPackage() { - return ConfigUtils.getProperty(AppConfig.LANG_PKG_ARG_KEY); + return ConfigUtils.getProperty(Argument.LANG_PACKAGE); } public static String getUtilPackage() { - return ConfigUtils.getProperty(AppConfig.UTIL_PKG_ARG_KEY); + return ConfigUtils.getProperty(Argument.UTIL_PACKAGE); } public static String getFileExtension() { - return ConfigUtils.getProperty(AppConfig.FILENAME_EXTENSION_KEY, AppConfig.DEFAULT_FILENAME_EXTENSION); + return ConfigUtils.getProperty(Argument.FILE_EXTENSION, DefaultValue.FILE_EXTENSION); } public static boolean isDebug() { - return ConfigUtils.getProperty(AppConfig.DEBUG_KEY, AppConfig.DEFAULT_DEBUG); + return ConfigUtils.getProperty(Argument.DEBUG, DefaultValue.DEBUG); } } diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultDocumentReader.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultDocumentReader.java index 731d993b..8db21ff4 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultDocumentReader.java +++ b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultDocumentReader.java @@ -8,7 +8,7 @@ import java.util.Stack; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.AppConfig; +import com.sum.spirit.common.constants.AppConfig.DefaultValue; import com.sum.spirit.common.utils.ConfigUtils; import com.sum.spirit.common.utils.LineUtils; import com.sum.spirit.common.utils.ListUtils; @@ -31,7 +31,7 @@ public class DefaultDocumentReader implements DocumentReader { @Override public Document read(String fileName, InputStream input) { Document document = new Document(fileName); - List lines = IoUtil.readLines(input, AppConfig.DEFAULT_CHARSET, new ArrayList()); + List lines = IoUtil.readLines(input, DefaultValue.CHARSET, new ArrayList()); doReadLines(document, lines); if (ConfigUtils.isDebug()) { document.debug(); diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/service/MethodService.java b/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/service/MethodService.java index fc9d0f9b..40ea3f85 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/service/MethodService.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/service/MethodService.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; import com.sum.spirit.code.tools.core.CustomClassLoader; import com.sum.spirit.code.tools.core.ElementSelector; import com.sum.spirit.code.tools.pojo.MethodInfo; -import com.sum.spirit.common.constants.AppConfig; +import com.sum.spirit.common.constants.AppConfig.DefaultValue; import com.sum.spirit.common.utils.LineUtils; import com.sum.spirit.core.api.ClassLinker; import com.sum.spirit.core.clazz.entity.IClass; @@ -43,7 +43,7 @@ public class MethodService { // 根据文件名,获取className String className = loader.getName(filePath); // 找到对应class,并找到印记,获取推导出的类型,并返回所有该类型的方法信息 - IClass clazz = loader.loadClass(className, IoUtil.toStream(content, AppConfig.DEFAULT_CHARSET)); + IClass clazz = loader.loadClass(className, IoUtil.toStream(content, DefaultValue.CHARSET)); IType type = selector.findElementAndGetType(clazz, lineNumber); Object clazzObj = linker.toClass(type); -- Gitee From e9bb3e9eba42929da5a61736f799ef89d015449d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 28 May 2021 14:26:36 +0800 Subject: [PATCH 43/66] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8C=85=E5=90=8D=E4=B8=BAcom.gitee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/common/annotation/App.java | 2 +- .../spirit/common/annotation/Native.java | 2 +- .../spirit/common/constants/AppConfig.java | 2 +- .../spirit/common/constants/Attribute.java | 2 +- .../spirit/common/enums/KeywordEnum.java | 2 +- .../spirit/common/enums/ModifierEnum.java | 2 +- .../spirit/common/enums/PrimitiveEnum.java | 2 +- .../spirit/common/enums/SymbolEnum.java | 2 +- .../spirit/common/enums/SyntaxEnum.java | 4 +- .../spirit/common/enums/TokenTypeEnum.java | 4 +- .../spirit/common/pattern/AccessPattern.java | 4 +- .../spirit/common/pattern/CommonPattern.java | 4 +- .../spirit/common/pattern/LiteralPattern.java | 4 +- .../spirit/common/pattern/TypePattern.java | 6 +-- .../spirit/common/utils/ConfigUtils.java | 6 +-- .../spirit/common/utils/LineUtils.java | 2 +- .../spirit/common/utils/ListUtils.java | 2 +- .../spirit/common/utils/ObjectUtils.java | 2 +- .../spirit/common/utils/Splitter.java | 2 +- .../spirit/common/utils/SpringUtils.java | 2 +- .../spirit/common/utils/URLFileUtils.java | 2 +- .../spirit/core/api/ClassLoader.java | 2 +- .../spirit/core/api/ClassResolver.java | 6 +-- .../spirit/core/api/ImportSelector.java | 2 +- .../spirit/core/api/ResolverContext.java | 2 +- .../spirit/core/api/TypeFactory.java | 8 ++-- .../core/clazz/AbstractClassLoader.java | 8 ++-- .../core/clazz/AbstractTypeFactory.java | 12 ++--- .../core/clazz/AbstractURLClassLoader.java | 10 ++-- .../core/clazz/DefaultClassResolver.java | 30 ++++++------ .../spirit/core/clazz/entity/IAnnotation.java | 6 +-- .../spirit/core/clazz/entity/IClass.java | 14 +++--- .../spirit/core/clazz/entity/IField.java | 6 +-- .../spirit/core/clazz/entity/IMethod.java | 12 ++--- .../spirit/core/clazz/entity/IParameter.java | 6 +-- .../spirit/core/clazz/entity/IType.java | 4 +- .../spirit/core/clazz/entity/IVariable.java | 6 +-- .../spirit/core/clazz/entity/Import.java | 8 ++-- .../core/clazz/frame/AnnotationEntity.java | 8 ++-- .../core/clazz/frame/ContextEntity.java | 4 +- .../core/clazz/frame/ElementEntity.java | 4 +- .../spirit/core/clazz/frame/ImportEntity.java | 16 +++---- .../spirit/core/clazz/frame/MemberEntity.java | 8 ++-- .../spirit/core/clazz/frame/TokenEntity.java | 6 +-- .../spirit/core/clazz/frame/TypeEntity.java | 4 +- .../spirit/core/clazz/utils/TypeBuilder.java | 8 ++-- .../spirit/core/clazz/utils/TypeTable.java | 8 ++-- .../spirit/core/clazz/utils/TypeUtils.java | 4 +- .../spirit/core/clazz/utils/TypeVisiter.java | 4 +- .../spirit/core/api/ClassLinker.java | 4 +- .../spirit/core/api/ClassVisiter.java | 8 ++-- .../spirit/core/api/CodeBuilder.java | 4 +- .../spirit/core/api/Compiler.java | 4 +- .../spirit/core/api/ElementAction.java | 4 +- .../spirit/core/api/ElementVisiter.java | 10 ++-- .../spirit/core/compile/AppClassLoader.java | 12 ++--- .../spirit/core/compile/AppTypeFactory.java | 26 +++++------ .../spirit/core/compile/AutoImporter.java | 14 +++--- .../spirit/core/compile/CoreCompiler.java | 14 +++--- .../core/compile/DefaultClassVisiter.java | 44 +++++++++--------- .../core/compile/DefaultElementVisiter.java | 28 +++++------ .../compile/action/AbstractElementAction.java | 6 +-- .../action/AbstractScopeElementAction.java | 4 +- .../action/ElementExpressDeclarer.java | 34 +++++++------- .../compile/action/ElementInvokeVisiter.java | 8 ++-- .../compile/action/ElementTypeDeclarer.java | 16 +++---- .../action/ElementVariableTracker.java | 8 ++-- .../core/compile/deduce/FragmentDeducer.java | 18 +++---- .../compile/deduce/InvocationVisiter.java | 18 +++---- .../core/compile/deduce/TypeDerivator.java | 16 +++---- .../core/compile/deduce/VariableTracker.java | 22 ++++----- .../core/compile/entity/ElementEvent.java | 6 +-- .../core/compile/entity/MethodContext.java | 8 ++-- .../compile/linker/AdaptiveClassLinker.java | 16 +++---- .../core/compile/linker/AppClassLinker.java | 20 ++++---- .../core/compile/linker/MethodMatcher.java | 10 ++-- .../spirit/core/api/DocumentReader.java | 4 +- .../spirit/core/api/ElementBuilder.java | 8 ++-- .../spirit/core/api/SemanticParser.java | 6 +-- .../spirit/core/api/SyntaxParser.java | 12 ++--- .../spirit/core/api/TreeBuilder.java | 10 ++-- .../core/element/DefaultDocumentReader.java | 22 ++++----- .../core/element/DefaultElementBuilder.java | 24 +++++----- .../action/AbstractSemanticParser.java | 18 +++---- .../element/action/AbstractTreeBuilder.java | 16 +++---- .../element/action/DefaultSemanticParser.java | 22 ++++----- .../element/action/DefaultSyntaxParser.java | 22 ++++----- .../element/action/DefaultTreeBuilder.java | 20 ++++---- .../core/element/action/LineChecker.java | 4 +- .../spirit/core/element/entity/Document.java | 2 +- .../spirit/core/element/entity/Element.java | 8 ++-- .../spirit/core/element/entity/Line.java | 4 +- .../spirit/core/element/entity/Modifiers.java | 6 +-- .../spirit/core/element/entity/Node.java | 2 +- .../core/element/entity/SemanticContext.java | 2 +- .../spirit/core/element/entity/Statement.java | 8 ++-- .../core/element/entity/SyntaxResult.java | 4 +- .../core/element/entity/SyntaxTree.java | 2 +- .../spirit/core/element/entity/Token.java | 6 +-- .../spirit/core/element/frame/Attributes.java | 2 +- .../core/element/frame/KeywordTokenBox.java | 8 ++-- .../spirit/core/element/frame/Semantic.java | 8 ++-- .../spirit/core/element/frame/Syntactic.java | 8 ++-- .../spirit/core/element/frame/TokenBox.java | 12 ++--- .../core/element/utils/MappableList.java | 2 +- .../core/element/utils/PriorityNode.java | 2 +- .../spirit/core/element/utils/StmtFormat.java | 12 ++--- .../core/element/utils/StmtVisiter.java | 6 +-- .../spirit/core/element/utils/TreeFormat.java | 14 +++--- .../core/lexer/test/ElementStarter.java | 4 +- .../spirit/core/lexer/test/SemanticTest.java | 12 ++--- .../spirit/core/lexer/test/SyntaxTest.java | 14 +++--- .../spirit/core/api/CharAction.java | 6 +-- .../spirit/core/api/CharsHandler.java | 6 +-- .../{sum => gitee}/spirit/core/api/Lexer.java | 2 +- .../spirit/core/api/LexerAction.java | 2 +- .../core/lexer/AbstractCharsHandler.java | 14 +++--- .../core/lexer/AbstractCursorLexer.java | 10 ++-- .../spirit/core/lexer/AbstractLexer.java | 26 +++++------ .../spirit/core/lexer/AliasCharsHandler.java | 10 ++-- .../spirit/core/lexer/CoreLexer.java | 8 ++-- .../core/lexer/action/BorderAction.java | 12 ++--- .../core/lexer/action/RegionAction.java | 20 ++++---- .../spirit/core/lexer/action/SpaceAction.java | 14 +++--- .../core/lexer/action/SymbolAction.java | 16 +++---- .../spirit/core/lexer/entity/CharEvent.java | 2 +- .../core/lexer/entity/CharsContext.java | 2 +- .../core/lexer/entity/CommonResult.java | 2 +- .../spirit/core/lexer/entity/CommonState.java | 2 +- .../core/lexer/entity/LexerContext.java | 2 +- .../spirit/core/lexer/entity/Region.java | 2 +- .../spirit/core/lexer/utils/RegionUtils.java | 8 ++-- .../spirit/core/lexer/test/LexerStarter.java | 4 +- .../spirit/core/lexer/test/LexerTest.java | 4 +- .../spirit/example/ClassGenericTest.java | 2 +- .../spirit/example/GenericType.java | 2 +- .../{sum => gitee}/spirit/example/MyTest.java | 2 +- .../spirit/example/auto/Alias.java | 2 +- .../spirit/example/auto/Friend.java | 2 +- .../spirit/example/auto/Import.java | 4 +- .../spirit/example/block/Block.java | 8 ++-- .../spirit/example/clazz/AbsService.java | 2 +- .../spirit/example/clazz/Service.java | 2 +- .../spirit/example/clazz/ServiceImpl.java | 2 +- .../spirit/example/deduce/Child.java | 4 +- .../spirit/example/deduce/Father.java | 2 +- .../spirit/example/inner/Inner.java | 4 +- .../spirit/example/inner/Outside.java | 2 +- .../spirit/example/process/Main.java | 2 +- .../spirit/example/snow/IdWorker.java | 2 +- .../spirit/example/subexpress/Express.java | 6 +-- .../spirit/example/syntax/Syntax.java | 6 +-- .../spirit/example/type/GenericType.java | 2 +- .../spirit/example/type/People.java | 2 +- .../spirit/example/type/Type.java | 16 +++---- .../auto/Alias.sp | 0 .../auto/Friend.sp | 0 .../auto/Import.sp | 2 +- .../block/Block.sp | 0 .../clazz/AbsService.sp | 0 .../clazz/Service.sp | 0 .../clazz/ServiceImpl.sp | 0 .../deduce/Child.sp | 2 +- .../deduce/Father.sp | 0 .../inner/Outside.sp | 0 .../process/Main.sp | 0 .../snow/IdWorker.sp | 0 .../subexpress/Express.sp | 0 .../syntax/Syntax.sp | 0 .../type/GenericType.sp | 0 .../type/People.sp | 0 .../type/Type.sp | 6 +-- .../spirit/output/java/ExtClassLoader.java | 10 ++-- .../spirit/output/java/JavaBuilder.java | 26 +++++------ .../action/AbstractTreeElementAction.java | 20 ++++---- .../output/java/action/CommonAction.java | 22 ++++----- .../output/java/action/EmptyAction.java | 20 ++++---- .../output/java/action/SeparatorAction.java | 18 +++---- .../output/java/action/StatementAction.java | 36 +++++++------- .../java/action/StringEqualsAction.java | 20 ++++---- .../java/deduce/NativeTypeDerivator.java | 12 ++--- .../output/java/deduce/NativeTypeFactory.java | 8 ++-- .../output/java/linker/NativeClassLinker.java | 16 +++---- .../java/linker/NativeMethodMatcher.java | 10 ++-- .../output/java/utils/ReflectUtils.java | 2 +- .../spirit/output/java/utils/TreeUtils.java | 6 +-- .../spirit/output/java/utils/TypeUtils.java | 4 +- .../spirit/starter/java/JavaRunner.java | 16 +++---- .../spirit/starter/java/JavaStarter.java | 4 +- .../spirit/starter/java/RunningMonitor.java | 2 +- .../{sum => gitee}/spirit/stdlib/Emptys.java | 2 +- .../{sum => gitee}/spirit/stdlib/Lists.java | 2 +- .../{sum => gitee}/spirit/stdlib/Maps.java | 2 +- .../spirit/code/tools/CodeToolsStarter.java | 4 +- .../tools/controller/CodeToolsController.java | 8 ++-- .../code/tools/core/CustomClassLoader.java | 8 ++-- .../code/tools/core/ElementSelector.java | 14 +++--- .../spirit/code/tools/pojo/MethodInfo.java | 2 +- .../spirit/code/tools/pojo/Result.java | 2 +- .../code/tools/service/MethodService.java | 22 ++++----- .../maven/plugin/SpiritCompileMojo.java | 4 +- spirit/lib/spirit-code-tools-2.1.30.jar | Bin 14993 -> 15143 bytes spirit/lib/spirit-common-2.1.30.jar | Bin 38806 -> 41922 bytes spirit/lib/spirit-core-class-2.1.30.jar | Bin 41386 -> 41312 bytes spirit/lib/spirit-core-compile-2.1.30.jar | Bin 44603 -> 44837 bytes spirit/lib/spirit-core-element-2.1.30.jar | Bin 52230 -> 51145 bytes spirit/lib/spirit-core-lexer-2.1.30.jar | Bin 27748 -> 27471 bytes spirit/lib/spirit-output-java-2.1.30.jar | Bin 34383 -> 33665 bytes spirit/lib/spirit-starter-java-2.1.30.jar | Bin 6440 -> 6480 bytes spirit/lib/spirit-stdlib-2.1.30.jar | Bin 5725 -> 5760 bytes 210 files changed, 788 insertions(+), 788 deletions(-) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/annotation/App.java (87%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/annotation/Native.java (87%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/constants/AppConfig.java (91%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/constants/Attribute.java (90%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/enums/KeywordEnum.java (98%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/enums/ModifierEnum.java (88%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/enums/PrimitiveEnum.java (98%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/enums/SymbolEnum.java (99%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/enums/SyntaxEnum.java (91%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/enums/TokenTypeEnum.java (87%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/pattern/AccessPattern.java (94%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/pattern/CommonPattern.java (94%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/pattern/LiteralPattern.java (96%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/pattern/TypePattern.java (94%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/utils/ConfigUtils.java (92%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/utils/LineUtils.java (93%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/utils/ListUtils.java (99%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/utils/ObjectUtils.java (92%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/utils/Splitter.java (96%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/utils/SpringUtils.java (95%) rename spirit-common/src/main/java/com/{sum => gitee}/spirit/common/utils/URLFileUtils.java (97%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/api/ClassLoader.java (89%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/api/ClassResolver.java (48%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/api/ImportSelector.java (83%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/api/ResolverContext.java (83%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/api/TypeFactory.java (65%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/AbstractClassLoader.java (78%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/AbstractTypeFactory.java (78%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/AbstractURLClassLoader.java (91%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/DefaultClassResolver.java (85%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/IAnnotation.java (41%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/IClass.java (87%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/IField.java (74%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/IMethod.java (81%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/IParameter.java (73%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/IType.java (94%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/IVariable.java (62%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/entity/Import.java (78%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/frame/AnnotationEntity.java (77%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/frame/ContextEntity.java (45%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/frame/ElementEntity.java (62%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/frame/ImportEntity.java (91%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/frame/MemberEntity.java (58%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/frame/TokenEntity.java (76%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/frame/TypeEntity.java (65%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/utils/TypeBuilder.java (90%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/utils/TypeTable.java (96%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/utils/TypeUtils.java (96%) rename spirit-core/spirit-core-class/src/main/java/com/{sum => gitee}/spirit/core/clazz/utils/TypeVisiter.java (96%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/api/ClassLinker.java (83%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/api/ClassVisiter.java (46%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/api/CodeBuilder.java (43%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/api/Compiler.java (66%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/api/ElementAction.java (55%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/api/ElementVisiter.java (41%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/AppClassLoader.java (81%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/AppTypeFactory.java (87%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/AutoImporter.java (87%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/CoreCompiler.java (66%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/DefaultClassVisiter.java (82%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/DefaultElementVisiter.java (72%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/action/AbstractElementAction.java (52%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/action/AbstractScopeElementAction.java (79%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/action/ElementExpressDeclarer.java (73%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/action/ElementInvokeVisiter.java (65%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/action/ElementTypeDeclarer.java (70%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/action/ElementVariableTracker.java (66%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/deduce/FragmentDeducer.java (72%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/deduce/InvocationVisiter.java (86%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/deduce/TypeDerivator.java (84%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/deduce/VariableTracker.java (82%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/entity/ElementEvent.java (77%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/entity/MethodContext.java (79%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/linker/AdaptiveClassLinker.java (91%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/linker/AppClassLinker.java (80%) rename spirit-core/spirit-core-compile/src/main/java/com/{sum => gitee}/spirit/core/compile/linker/MethodMatcher.java (76%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/api/DocumentReader.java (57%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/api/ElementBuilder.java (41%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/api/SemanticParser.java (73%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/api/SyntaxParser.java (48%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/api/TreeBuilder.java (37%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/DefaultDocumentReader.java (83%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/DefaultElementBuilder.java (69%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/action/AbstractSemanticParser.java (65%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/action/AbstractTreeBuilder.java (77%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/action/DefaultSemanticParser.java (87%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/action/DefaultSyntaxParser.java (89%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/action/DefaultTreeBuilder.java (88%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/action/LineChecker.java (70%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/Document.java (87%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/Element.java (88%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/Line.java (88%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/Modifiers.java (66%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/Node.java (90%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/SemanticContext.java (90%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/Statement.java (81%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/SyntaxResult.java (70%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/SyntaxTree.java (76%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/entity/Token.java (81%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/frame/Attributes.java (92%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/frame/KeywordTokenBox.java (91%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/frame/Semantic.java (95%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/frame/Syntactic.java (92%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/frame/TokenBox.java (85%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/utils/MappableList.java (97%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/utils/PriorityNode.java (96%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/utils/StmtFormat.java (88%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/utils/StmtVisiter.java (67%) rename spirit-core/spirit-core-element/src/main/java/com/{sum => gitee}/spirit/core/element/utils/TreeFormat.java (84%) rename spirit-core/spirit-core-element/src/test/java/com/{sum => gitee}/spirit/core/lexer/test/ElementStarter.java (70%) rename spirit-core/spirit-core-element/src/test/java/com/{sum => gitee}/spirit/core/lexer/test/SemanticTest.java (94%) rename spirit-core/spirit-core-element/src/test/java/com/{sum => gitee}/spirit/core/lexer/test/SyntaxTest.java (97%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/api/CharAction.java (43%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/api/CharsHandler.java (41%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/api/Lexer.java (81%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/api/LexerAction.java (60%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/AbstractCharsHandler.java (68%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/AbstractCursorLexer.java (71%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/AbstractLexer.java (80%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/AliasCharsHandler.java (87%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/CoreLexer.java (80%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/action/BorderAction.java (82%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/action/RegionAction.java (86%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/action/SpaceAction.java (56%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/action/SymbolAction.java (71%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/entity/CharEvent.java (82%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/entity/CharsContext.java (83%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/entity/CommonResult.java (89%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/entity/CommonState.java (57%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/entity/LexerContext.java (93%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/entity/Region.java (92%) rename spirit-core/spirit-core-lexer/src/main/java/com/{sum => gitee}/spirit/core/lexer/utils/RegionUtils.java (91%) rename spirit-core/spirit-core-lexer/src/test/java/com/{sum => gitee}/spirit/core/lexer/test/LexerStarter.java (70%) rename spirit-core/spirit-core-lexer/src/test/java/com/{sum => gitee}/spirit/core/lexer/test/LexerTest.java (99%) rename spirit-example/spirit-example-common/src/main/java/com/{sum => gitee}/spirit/example/ClassGenericTest.java (86%) rename spirit-example/spirit-example-common/src/main/java/com/{sum => gitee}/spirit/example/GenericType.java (91%) rename spirit-example/spirit-example-common/src/main/java/com/{sum => gitee}/spirit/example/MyTest.java (90%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/auto/Alias.java (66%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/auto/Friend.java (86%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/auto/Import.java (78%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/block/Block.java (92%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/clazz/AbsService.java (73%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/clazz/Service.java (90%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/clazz/ServiceImpl.java (93%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/deduce/Child.java (88%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/deduce/Father.java (82%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/inner/Inner.java (79%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/inner/Outside.java (86%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/process/Main.java (92%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/snow/IdWorker.java (98%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/subexpress/Express.java (92%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/syntax/Syntax.java (87%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/type/GenericType.java (94%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/type/People.java (90%) rename spirit-example/spirit-example-plugin/src/main/java/com/{sum => gitee}/spirit/example/type/Type.java (91%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/auto/Alias.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/auto/Friend.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/auto/Import.sp (85%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/block/Block.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/clazz/AbsService.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/clazz/Service.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/clazz/ServiceImpl.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/deduce/Child.sp (89%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/deduce/Father.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/inner/Outside.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/process/Main.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/snow/IdWorker.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/subexpress/Express.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/syntax/Syntax.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/type/GenericType.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/type/People.sp (100%) rename spirit-example/spirit-example-plugin/src/main/resources/sources/{com.sum.spirit.example => com.gitee.spirit.example}/type/Type.sp (95%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/ExtClassLoader.java (86%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/JavaBuilder.java (86%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/action/AbstractTreeElementAction.java (81%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/action/CommonAction.java (72%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/action/EmptyAction.java (53%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/action/SeparatorAction.java (77%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/action/StatementAction.java (76%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/action/StringEqualsAction.java (74%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/deduce/NativeTypeDerivator.java (89%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/deduce/NativeTypeFactory.java (86%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/linker/NativeClassLinker.java (88%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/linker/NativeMethodMatcher.java (87%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/utils/ReflectUtils.java (94%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/utils/TreeUtils.java (80%) rename spirit-output/spirit-output-java/src/main/java/com/{sum => gitee}/spirit/output/java/utils/TypeUtils.java (83%) rename spirit-starter/spirit-starter-java/src/main/java/com/{sum => gitee}/spirit/starter/java/JavaRunner.java (79%) rename spirit-starter/spirit-starter-java/src/main/java/com/{sum => gitee}/spirit/starter/java/JavaStarter.java (70%) rename spirit-starter/spirit-starter-java/src/main/java/com/{sum => gitee}/spirit/starter/java/RunningMonitor.java (92%) rename spirit-stdlib/src/main/java/com/{sum => gitee}/spirit/stdlib/Emptys.java (92%) rename spirit-stdlib/src/main/java/com/{sum => gitee}/spirit/stdlib/Lists.java (97%) rename spirit-stdlib/src/main/java/com/{sum => gitee}/spirit/stdlib/Maps.java (94%) rename spirit-tools/spirit-code-tools/src/main/java/com/{sum => gitee}/spirit/code/tools/CodeToolsStarter.java (72%) rename spirit-tools/spirit-code-tools/src/main/java/com/{sum => gitee}/spirit/code/tools/controller/CodeToolsController.java (81%) rename spirit-tools/spirit-code-tools/src/main/java/com/{sum => gitee}/spirit/code/tools/core/CustomClassLoader.java (88%) rename spirit-tools/spirit-code-tools/src/main/java/com/{sum => gitee}/spirit/code/tools/core/ElementSelector.java (73%) rename spirit-tools/spirit-code-tools/src/main/java/com/{sum => gitee}/spirit/code/tools/pojo/MethodInfo.java (85%) rename spirit-tools/spirit-code-tools/src/main/java/com/{sum => gitee}/spirit/code/tools/pojo/Result.java (93%) rename spirit-tools/spirit-code-tools/src/main/java/com/{sum => gitee}/spirit/code/tools/service/MethodService.java (86%) rename spirit-tools/spirit-maven-plugin/src/main/java/com/{sum => gitee}/spirit/maven/plugin/SpiritCompileMojo.java (97%) diff --git a/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java b/spirit-common/src/main/java/com/gitee/spirit/common/annotation/App.java similarity index 87% rename from spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java rename to spirit-common/src/main/java/com/gitee/spirit/common/annotation/App.java index 7d6745eb..3709fa6d 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/annotation/App.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.annotation; +package com.gitee.spirit.common.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java b/spirit-common/src/main/java/com/gitee/spirit/common/annotation/Native.java similarity index 87% rename from spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java rename to spirit-common/src/main/java/com/gitee/spirit/common/annotation/Native.java index 837ec443..d245b9e9 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/annotation/Native.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.annotation; +package com.gitee.spirit.common.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/AppConfig.java similarity index 91% rename from spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java rename to spirit-common/src/main/java/com/gitee/spirit/common/constants/AppConfig.java index 744eddc7..1d0e8408 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/constants/AppConfig.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.constants; +package com.gitee.spirit.common.constants; public interface AppConfig { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attribute.java similarity index 90% rename from spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java rename to spirit-common/src/main/java/com/gitee/spirit/common/constants/Attribute.java index dfa70cf0..8afd1580 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attribute.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.constants; +package com.gitee.spirit.common.constants; public interface Attribute { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/enums/KeywordEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/KeywordEnum.java similarity index 98% rename from spirit-common/src/main/java/com/sum/spirit/common/enums/KeywordEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/KeywordEnum.java index 23828238..65d0d191 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/enums/KeywordEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/KeywordEnum.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.enums; +package com.gitee.spirit.common.enums; import java.util.LinkedHashMap; import java.util.Map; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/enums/ModifierEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/ModifierEnum.java similarity index 88% rename from spirit-common/src/main/java/com/sum/spirit/common/enums/ModifierEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/ModifierEnum.java index b4b8d935..7ce3dd8c 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/enums/ModifierEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/ModifierEnum.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.enums; +package com.gitee.spirit.common.enums; import java.lang.reflect.Modifier; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/enums/PrimitiveEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveEnum.java similarity index 98% rename from spirit-common/src/main/java/com/sum/spirit/common/enums/PrimitiveEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveEnum.java index b30fce8e..68002473 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/enums/PrimitiveEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/PrimitiveEnum.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.enums; +package com.gitee.spirit.common.enums; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/enums/SymbolEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/SymbolEnum.java similarity index 99% rename from spirit-common/src/main/java/com/sum/spirit/common/enums/SymbolEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/SymbolEnum.java index ea37011f..4b6e943e 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/enums/SymbolEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/SymbolEnum.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.enums; +package com.gitee.spirit.common.enums; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/enums/SyntaxEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/SyntaxEnum.java similarity index 91% rename from spirit-common/src/main/java/com/sum/spirit/common/enums/SyntaxEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/SyntaxEnum.java index 7524583a..bab6881b 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/enums/SyntaxEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/SyntaxEnum.java @@ -1,7 +1,7 @@ -package com.sum.spirit.common.enums; +package com.gitee.spirit.common.enums; public enum SyntaxEnum { - IMPORT, // import com.sum.spirit.example.Animal + IMPORT, // import com.gitee.spirit.example.Animal ANNOTATION, // @Animal INTERFACE, // interface Horse { ABSTRACT, // abstract Horse { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/enums/TokenTypeEnum.java b/spirit-common/src/main/java/com/gitee/spirit/common/enums/TokenTypeEnum.java similarity index 87% rename from spirit-common/src/main/java/com/sum/spirit/common/enums/TokenTypeEnum.java rename to spirit-common/src/main/java/com/gitee/spirit/common/enums/TokenTypeEnum.java index b9602622..dcfc6850 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/enums/TokenTypeEnum.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/enums/TokenTypeEnum.java @@ -1,7 +1,7 @@ -package com.sum.spirit.common.enums; +package com.gitee.spirit.common.enums; public enum TokenTypeEnum { - ACCESS_PATH, // com.sum.spirit.example.Animal + ACCESS_PATH, // com.gitee.spirit.example.Animal ANNOTATION, // @Animal KEYWORD, // class OPERATOR, // = diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/AccessPattern.java similarity index 94% rename from spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java rename to spirit-common/src/main/java/com/gitee/spirit/common/pattern/AccessPattern.java index 7366e3c8..dc305f5d 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/AccessPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/AccessPattern.java @@ -1,8 +1,8 @@ -package com.sum.spirit.common.pattern; +package com.gitee.spirit.common.pattern; import java.util.regex.Pattern; -import com.sum.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.enums.TokenTypeEnum; public class AccessPattern { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CommonPattern.java similarity index 94% rename from spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java rename to spirit-common/src/main/java/com/gitee/spirit/common/pattern/CommonPattern.java index 347d049b..977f437d 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/CommonPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CommonPattern.java @@ -1,8 +1,8 @@ -package com.sum.spirit.common.pattern; +package com.gitee.spirit.common.pattern; import java.util.regex.Pattern; -import com.sum.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.enums.TokenTypeEnum; public class CommonPattern { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/LiteralPattern.java similarity index 96% rename from spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java rename to spirit-common/src/main/java/com/gitee/spirit/common/pattern/LiteralPattern.java index 9d96dac0..02ddefed 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/LiteralPattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/LiteralPattern.java @@ -1,8 +1,8 @@ -package com.sum.spirit.common.pattern; +package com.gitee.spirit.common.pattern; import java.util.regex.Pattern; -import com.sum.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.enums.TokenTypeEnum; public class LiteralPattern { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/TypePattern.java similarity index 94% rename from spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java rename to spirit-common/src/main/java/com/gitee/spirit/common/pattern/TypePattern.java index 21496aeb..bb4b3d1f 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/pattern/TypePattern.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/TypePattern.java @@ -1,9 +1,9 @@ -package com.sum.spirit.common.pattern; +package com.gitee.spirit.common.pattern; import java.util.regex.Pattern; -import com.sum.spirit.common.enums.PrimitiveEnum; -import com.sum.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.common.enums.TokenTypeEnum; public class TypePattern { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/ConfigUtils.java similarity index 92% rename from spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/ConfigUtils.java index be3ee15d..5d2c19ce 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/ConfigUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/ConfigUtils.java @@ -1,11 +1,11 @@ -package com.sum.spirit.common.utils; +package com.gitee.spirit.common.utils; import org.springframework.context.EnvironmentAware; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.AppConfig.Argument; -import com.sum.spirit.common.constants.AppConfig.DefaultValue; +import com.gitee.spirit.common.constants.AppConfig.Argument; +import com.gitee.spirit.common.constants.AppConfig.DefaultValue; @Component public class ConfigUtils implements EnvironmentAware { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/LineUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/LineUtils.java similarity index 93% rename from spirit-common/src/main/java/com/sum/spirit/common/utils/LineUtils.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/LineUtils.java index 185114e9..f4c4df0e 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/LineUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/LineUtils.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.utils; +package com.gitee.spirit.common.utils; public class LineUtils { diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/ListUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/ListUtils.java similarity index 99% rename from spirit-common/src/main/java/com/sum/spirit/common/utils/ListUtils.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/ListUtils.java index 92045f41..74b1c9bf 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/ListUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/ListUtils.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.utils; +package com.gitee.spirit.common.utils; import java.util.ArrayList; import java.util.Iterator; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/ObjectUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/ObjectUtils.java similarity index 92% rename from spirit-common/src/main/java/com/sum/spirit/common/utils/ObjectUtils.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/ObjectUtils.java index 3e26459b..a7a3bca1 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/ObjectUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/ObjectUtils.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.utils; +package com.gitee.spirit.common.utils; import java.util.Set; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/Splitter.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/Splitter.java similarity index 96% rename from spirit-common/src/main/java/com/sum/spirit/common/utils/Splitter.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/Splitter.java index a70f1684..45c47e8a 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/Splitter.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/Splitter.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.utils; +package com.gitee.spirit.common.utils; import java.util.ArrayList; import java.util.List; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/SpringUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java similarity index 95% rename from spirit-common/src/main/java/com/sum/spirit/common/utils/SpringUtils.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java index eadea9c1..a2b7fe7e 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/SpringUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.utils; +package com.gitee.spirit.common.utils; import java.lang.annotation.Annotation; import java.util.ArrayList; diff --git a/spirit-common/src/main/java/com/sum/spirit/common/utils/URLFileUtils.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/URLFileUtils.java similarity index 97% rename from spirit-common/src/main/java/com/sum/spirit/common/utils/URLFileUtils.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/URLFileUtils.java index a98963ba..e5e455b5 100644 --- a/spirit-common/src/main/java/com/sum/spirit/common/utils/URLFileUtils.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/URLFileUtils.java @@ -1,4 +1,4 @@ -package com.sum.spirit.common.utils; +package com.gitee.spirit.common.utils; import java.io.File; import java.io.FileInputStream; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassLoader.java similarity index 89% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ClassLoader.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassLoader.java index 8238fea9..8d21bb7f 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassLoader.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.net.URL; import java.util.List; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ClassResolver.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassResolver.java similarity index 48% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ClassResolver.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassResolver.java index cde127f6..9d7c1ac0 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ClassResolver.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassResolver.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.Map; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.element.entity.Document; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.element.entity.Document; public interface ClassResolver { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ImportSelector.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java similarity index 83% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ImportSelector.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java index 9e993f49..b5d09ec8 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ImportSelector.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; public interface ImportSelector { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ResolverContext.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ResolverContext.java similarity index 83% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ResolverContext.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ResolverContext.java index dbd9b027..ef9d6c5c 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ResolverContext.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ResolverContext.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.List; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/TypeFactory.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/TypeFactory.java similarity index 65% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/TypeFactory.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/TypeFactory.java index 85759843..d643d828 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/TypeFactory.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/TypeFactory.java @@ -1,10 +1,10 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.List; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.element.entity.Token; public interface TypeFactory { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java similarity index 78% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractClassLoader.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java index 88605957..356b419c 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java @@ -1,10 +1,10 @@ -package com.sum.spirit.core.clazz; +package com.gitee.spirit.core.clazz; import java.net.URL; -import com.sum.spirit.core.api.ClassLoader; -import com.sum.spirit.core.api.ImportSelector; -import com.sum.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.api.ClassLoader; +import com.gitee.spirit.core.api.ImportSelector; +import com.gitee.spirit.core.clazz.utils.TypeUtils; public abstract class AbstractClassLoader implements ClassLoader, ImportSelector { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java similarity index 78% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java index d9567817..f7a2597b 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractTypeFactory.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.clazz; +package com.gitee.spirit.core.clazz; import java.util.Arrays; import java.util.Collections; @@ -6,11 +6,11 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; -import com.sum.spirit.core.api.SemanticParser; -import com.sum.spirit.core.api.TypeFactory; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.api.SemanticParser; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractURLClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java similarity index 91% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractURLClassLoader.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java index bc6ef8e1..3d124058 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractURLClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.clazz; +package com.gitee.spirit.core.clazz; import java.io.File; @@ -14,10 +14,10 @@ import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.InitializingBean; -import com.sum.spirit.common.utils.ConfigUtils; -import com.sum.spirit.common.utils.URLFileUtils; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.common.utils.URLFileUtils; +import com.gitee.spirit.core.clazz.entity.IClass; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/DefaultClassResolver.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java similarity index 85% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/DefaultClassResolver.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java index 9422ca96..27430843 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/DefaultClassResolver.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.clazz; +package com.gitee.spirit.core.clazz; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -8,20 +8,20 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.core.api.ClassResolver; -import com.sum.spirit.core.api.ResolverContext; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.api.ImportSelector; -import com.sum.spirit.core.api.TypeFactory; -import com.sum.spirit.core.clazz.entity.IAnnotation; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IField; -import com.sum.spirit.core.clazz.entity.IMethod; -import com.sum.spirit.core.clazz.entity.Import; -import com.sum.spirit.core.clazz.utils.TypeUtils; -import com.sum.spirit.core.element.entity.Document; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.api.ClassResolver; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.ImportSelector; +import com.gitee.spirit.core.api.ResolverContext; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IAnnotation; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IField; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.Import; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.element.entity.Document; +import com.gitee.spirit.core.element.entity.Element; @Component public class DefaultClassResolver implements ClassResolver, ResolverContext { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IAnnotation.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IAnnotation.java similarity index 41% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IAnnotation.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IAnnotation.java index 23663826..e88e16d7 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IAnnotation.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IAnnotation.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; -import com.sum.spirit.core.clazz.frame.TokenEntity; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.clazz.frame.TokenEntity; +import com.gitee.spirit.core.element.entity.Token; public class IAnnotation extends TokenEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IClass.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java similarity index 87% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IClass.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java index 120c7804..4881e49c 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IClass.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java @@ -1,15 +1,15 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.clazz.frame.ImportEntity; -import com.sum.spirit.core.clazz.utils.TypeUtils; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.clazz.frame.ImportEntity; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IField.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IField.java similarity index 74% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IField.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IField.java index e627f6e3..e5b6bcef 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IField.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IField.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; import java.util.List; -import com.sum.spirit.core.clazz.frame.MemberEntity; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.clazz.frame.MemberEntity; +import com.gitee.spirit.core.element.entity.Element; public class IField extends MemberEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IMethod.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IMethod.java similarity index 81% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IMethod.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IMethod.java index 47d2100e..f730dd4b 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IMethod.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IMethod.java @@ -1,14 +1,14 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; import java.util.ArrayList; import java.util.List; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.clazz.frame.MemberEntity; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Token; import com.google.common.base.Joiner; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.core.clazz.frame.MemberEntity; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Token; public class IMethod extends MemberEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IParameter.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IParameter.java similarity index 73% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IParameter.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IParameter.java index 8c25dec5..a2645cb4 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IParameter.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IParameter.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; import java.util.List; -import com.sum.spirit.core.clazz.frame.AnnotationEntity; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.clazz.frame.AnnotationEntity; +import com.gitee.spirit.core.element.entity.Element; public class IParameter extends AnnotationEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IType.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java similarity index 94% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IType.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java index 0d7bc067..06f4fb00 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IType.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import com.sum.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.clazz.utils.TypeUtils; import lombok.Getter; import lombok.Setter; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IVariable.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IVariable.java similarity index 62% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IVariable.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IVariable.java index 6353aa45..70c09e93 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/IVariable.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IVariable.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; -import com.sum.spirit.core.clazz.frame.TokenEntity; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.clazz.frame.TokenEntity; +import com.gitee.spirit.core.element.entity.Token; public class IVariable extends TokenEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/Import.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/Import.java similarity index 78% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/Import.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/Import.java index d9f77685..1d162e52 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/entity/Import.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/Import.java @@ -1,8 +1,8 @@ -package com.sum.spirit.core.clazz.entity; +package com.gitee.spirit.core.clazz.entity; -import com.sum.spirit.core.clazz.frame.ElementEntity; -import com.sum.spirit.core.clazz.utils.TypeUtils; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.clazz.frame.ElementEntity; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.element.entity.Element; public class Import extends ElementEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/AnnotationEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/AnnotationEntity.java similarity index 77% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/AnnotationEntity.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/AnnotationEntity.java index 5fbbcc93..29785e1e 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/AnnotationEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/AnnotationEntity.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.clazz.frame; +package com.gitee.spirit.core.clazz.frame; import java.util.ArrayList; import java.util.List; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.clazz.entity.IAnnotation; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.clazz.entity.IAnnotation; +import com.gitee.spirit.core.element.entity.Element; public abstract class AnnotationEntity extends ElementEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ContextEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java similarity index 45% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ContextEntity.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java index 078815b1..172025db 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ContextEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.clazz.frame; +package com.gitee.spirit.core.clazz.frame; -import com.sum.spirit.core.api.ResolverContext; +import com.gitee.spirit.core.api.ResolverContext; public abstract class ContextEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ElementEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ElementEntity.java similarity index 62% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ElementEntity.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ElementEntity.java index d8198f82..3804745f 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ElementEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ElementEntity.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.clazz.frame; +package com.gitee.spirit.core.clazz.frame; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Element; public abstract class ElementEntity extends TypeEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ImportEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java similarity index 91% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ImportEntity.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java index 8e3e7e5c..249b6496 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ImportEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java @@ -1,16 +1,16 @@ -package com.sum.spirit.core.clazz.frame; +package com.gitee.spirit.core.clazz.frame; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import com.sum.spirit.common.enums.PrimitiveEnum; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.clazz.entity.IAnnotation; -import com.sum.spirit.core.clazz.entity.Import; -import com.sum.spirit.core.clazz.utils.TypeUtils; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.clazz.entity.IAnnotation; +import com.gitee.spirit.core.clazz.entity.Import; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.element.entity.Element; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/MemberEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/MemberEntity.java similarity index 58% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/MemberEntity.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/MemberEntity.java index e5afa33e..248fc350 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/MemberEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/MemberEntity.java @@ -1,10 +1,10 @@ -package com.sum.spirit.core.clazz.frame; +package com.gitee.spirit.core.clazz.frame; import java.util.List; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.core.clazz.entity.IAnnotation; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.clazz.entity.IAnnotation; +import com.gitee.spirit.core.element.entity.Element; public abstract class MemberEntity extends AnnotationEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/TokenEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TokenEntity.java similarity index 76% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/TokenEntity.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TokenEntity.java index fd8f9609..811d5304 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/TokenEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TokenEntity.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.clazz.frame; +package com.gitee.spirit.core.clazz.frame; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.element.entity.Token; public abstract class TokenEntity extends TypeEntity { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/TypeEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TypeEntity.java similarity index 65% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/TypeEntity.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TypeEntity.java index e922d9ce..ad402389 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/TypeEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TypeEntity.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.clazz.frame; +package com.gitee.spirit.core.clazz.frame; -import com.sum.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IType; import lombok.Getter; import lombok.NonNull; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeBuilder.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeBuilder.java similarity index 90% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeBuilder.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeBuilder.java index 52e83a73..417d3b8c 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeBuilder.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeBuilder.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.clazz.utils; +package com.gitee.spirit.core.clazz.utils; import java.util.ArrayList; import java.util.Collections; -import com.sum.spirit.common.enums.ModifierEnum; -import com.sum.spirit.common.enums.PrimitiveEnum; -import com.sum.spirit.core.clazz.entity.IType; +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.core.clazz.entity.IType; public class TypeBuilder { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeTable.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeTable.java similarity index 96% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeTable.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeTable.java index e4758180..5d5951b5 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeTable.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeTable.java @@ -1,8 +1,8 @@ -package com.sum.spirit.core.clazz.utils; +package com.gitee.spirit.core.clazz.utils; -import com.sum.spirit.common.enums.PrimitiveEnum; -import com.sum.spirit.common.utils.ConfigUtils; -import com.sum.spirit.core.clazz.entity.IType; +import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.core.clazz.entity.IType; public class TypeTable { diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeUtils.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeUtils.java similarity index 96% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeUtils.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeUtils.java index a58f7089..9b901d35 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeUtils.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeUtils.java @@ -1,13 +1,13 @@ -package com.sum.spirit.core.clazz.utils; +package com.gitee.spirit.core.clazz.utils; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; +import com.gitee.spirit.common.enums.PrimitiveEnum; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; -import com.sum.spirit.common.enums.PrimitiveEnum; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeVisiter.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeVisiter.java similarity index 96% rename from spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeVisiter.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeVisiter.java index fec5a22e..4879d55b 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/utils/TypeVisiter.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeVisiter.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.clazz.utils; +package com.gitee.spirit.core.clazz.utils; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import com.gitee.spirit.core.clazz.entity.IType; import com.google.common.base.Joiner; -import com.sum.spirit.core.clazz.entity.IType; public class TypeVisiter { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ClassLinker.java similarity index 83% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ClassLinker.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ClassLinker.java index 33075203..2b6b33c4 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ClassLinker.java @@ -1,8 +1,8 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.List; -import com.sum.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IType; public interface ClassLinker { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ClassVisiter.java similarity index 46% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ClassVisiter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ClassVisiter.java index 84731e0f..33038f35 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ClassVisiter.java @@ -1,8 +1,8 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.frame.MemberEntity; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.frame.MemberEntity; public interface ClassVisiter { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/CodeBuilder.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/CodeBuilder.java similarity index 43% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/CodeBuilder.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/CodeBuilder.java index fbc83741..8a8fcffc 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/CodeBuilder.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/CodeBuilder.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; -import com.sum.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IClass; public interface CodeBuilder { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/Compiler.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/Compiler.java similarity index 66% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/Compiler.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/Compiler.java index 3fc698f7..15b92c88 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/Compiler.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/Compiler.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.io.InputStream; import java.util.Map; -import com.sum.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IClass; public interface Compiler { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java similarity index 55% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementAction.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java index db7faead..6717d313 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; -import com.sum.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.compile.entity.ElementEvent; public interface ElementAction { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java similarity index 41% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementVisiter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java index 6f762d0c..ddb21566 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IVariable; -import com.sum.spirit.core.compile.entity.MethodContext; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.entity.MethodContext; +import com.gitee.spirit.core.element.entity.Element; public interface ElementVisiter { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppClassLoader.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java similarity index 81% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppClassLoader.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java index 02415f99..b9277a2e 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppClassLoader.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile; +package com.gitee.spirit.core.compile; import java.net.URL; import java.util.List; @@ -9,11 +9,11 @@ import org.springframework.context.annotation.DependsOn; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.utils.URLFileUtils; -import com.sum.spirit.core.api.ClassVisiter; -import com.sum.spirit.core.api.Compiler; -import com.sum.spirit.core.clazz.AbstractURLClassLoader; -import com.sum.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.common.utils.URLFileUtils; +import com.gitee.spirit.core.api.ClassVisiter; +import com.gitee.spirit.core.api.Compiler; +import com.gitee.spirit.core.clazz.AbstractURLClassLoader; +import com.gitee.spirit.core.clazz.entity.IClass; @Component @Order(-100) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java similarity index 87% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppTypeFactory.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java index bfbcda3e..aa99c775 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile; +package com.gitee.spirit.core.compile; import java.util.ArrayList; import java.util.List; @@ -7,18 +7,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.ModifierEnum; -import com.sum.spirit.common.enums.PrimitiveEnum; -import com.sum.spirit.core.clazz.AbstractTypeFactory; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeTable; -import com.sum.spirit.core.clazz.utils.TypeUtils; -import com.sum.spirit.core.compile.deduce.FragmentDeducer; -import com.sum.spirit.core.compile.deduce.TypeDerivator; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.core.clazz.AbstractTypeFactory; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AutoImporter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AutoImporter.java similarity index 87% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AutoImporter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AutoImporter.java index d4ef1a99..6261b9c4 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/AutoImporter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AutoImporter.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile; +package com.gitee.spirit.core.compile; import java.util.ArrayList; import java.util.Arrays; @@ -11,12 +11,12 @@ import java.util.regex.Pattern; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.api.SemanticParser; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeVisiter; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.SemanticParser; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeVisiter; +import com.gitee.spirit.core.element.entity.Element; @Component public class AutoImporter { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/CoreCompiler.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/CoreCompiler.java similarity index 66% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/CoreCompiler.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/CoreCompiler.java index 5a8fb927..595c0459 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/CoreCompiler.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/CoreCompiler.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile; +package com.gitee.spirit.core.compile; import java.io.InputStream; import java.util.Map; @@ -7,12 +7,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import com.sum.spirit.core.api.ClassResolver; -import com.sum.spirit.core.api.Compiler; -import com.sum.spirit.core.api.DocumentReader; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.utils.TypeUtils; -import com.sum.spirit.core.element.entity.Document; +import com.gitee.spirit.core.api.ClassResolver; +import com.gitee.spirit.core.api.Compiler; +import com.gitee.spirit.core.api.DocumentReader; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.element.entity.Document; @Primary @Component diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java similarity index 82% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultClassVisiter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index 9bc5d6de..5197d298 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -1,31 +1,31 @@ -package com.sum.spirit.core.compile; +package com.gitee.spirit.core.compile; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.common.utils.ObjectUtils; -import com.sum.spirit.core.api.ClassVisiter; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.api.ElementVisiter; -import com.sum.spirit.core.api.TypeFactory; -import com.sum.spirit.core.clazz.entity.IAnnotation; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IField; -import com.sum.spirit.core.clazz.entity.IMethod; -import com.sum.spirit.core.clazz.entity.IParameter; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.entity.IVariable; -import com.sum.spirit.core.clazz.frame.MemberEntity; -import com.sum.spirit.core.clazz.utils.TypeTable; -import com.sum.spirit.core.compile.deduce.TypeDerivator; -import com.sum.spirit.core.compile.entity.MethodContext; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.common.utils.ObjectUtils; +import com.gitee.spirit.core.api.ClassVisiter; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IAnnotation; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IField; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IParameter; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.clazz.frame.MemberEntity; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.compile.entity.MethodContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java similarity index 72% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultElementVisiter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java index 0b84988b..94d732f7 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/DefaultElementVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile; +package com.gitee.spirit.core.compile; import java.util.List; @@ -7,19 +7,19 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.App; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.utils.SpringUtils; -import com.sum.spirit.core.api.ElementAction; -import com.sum.spirit.core.api.ElementVisiter; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IVariable; -import com.sum.spirit.core.compile.deduce.FragmentDeducer; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.compile.entity.MethodContext; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.annotation.App; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.utils.SpringUtils; +import com.gitee.spirit.core.api.ElementAction; +import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.compile.entity.MethodContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; @Component @DependsOn("springUtils") diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java similarity index 52% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractElementAction.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java index c33d575c..a7ad3567 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractElementAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.compile.action; +package com.gitee.spirit.core.compile.action; -import com.sum.spirit.core.api.ElementAction; -import com.sum.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.api.ElementAction; +import com.gitee.spirit.core.compile.entity.ElementEvent; public abstract class AbstractElementAction implements ElementAction { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractScopeElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractScopeElementAction.java similarity index 79% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractScopeElementAction.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractScopeElementAction.java index e8ea3688..2f533d59 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractScopeElementAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractScopeElementAction.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.compile.action; +package com.gitee.spirit.core.compile.action; -import com.sum.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.compile.entity.ElementEvent; public abstract class AbstractScopeElementAction extends AbstractElementAction { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementExpressDeclarer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementExpressDeclarer.java similarity index 73% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementExpressDeclarer.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementExpressDeclarer.java index 0e6cf76f..431253b0 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementExpressDeclarer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementExpressDeclarer.java @@ -1,25 +1,25 @@ -package com.sum.spirit.core.compile.action; +package com.gitee.spirit.core.compile.action; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.App; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.api.ElementVisiter; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.entity.IVariable; -import com.sum.spirit.core.compile.deduce.FragmentDeducer; -import com.sum.spirit.core.compile.deduce.InvocationVisiter; -import com.sum.spirit.core.compile.deduce.TypeDerivator; -import com.sum.spirit.core.compile.deduce.VariableTracker; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.compile.entity.MethodContext; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.annotation.App; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.deduce.InvocationVisiter; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.compile.deduce.VariableTracker; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.compile.entity.MethodContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; @App @Component diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementInvokeVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementInvokeVisiter.java similarity index 65% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementInvokeVisiter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementInvokeVisiter.java index f13b910b..5874b449 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementInvokeVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementInvokeVisiter.java @@ -1,12 +1,12 @@ -package com.sum.spirit.core.compile.action; +package com.gitee.spirit.core.compile.action; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.App; -import com.sum.spirit.core.compile.deduce.InvocationVisiter; -import com.sum.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.common.annotation.App; +import com.gitee.spirit.core.compile.deduce.InvocationVisiter; +import com.gitee.spirit.core.compile.entity.ElementEvent; @App @Component diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementTypeDeclarer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementTypeDeclarer.java similarity index 70% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementTypeDeclarer.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementTypeDeclarer.java index 55977293..7a84767f 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementTypeDeclarer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementTypeDeclarer.java @@ -1,16 +1,16 @@ -package com.sum.spirit.core.compile.action; +package com.gitee.spirit.core.compile.action; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.App; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.core.api.TypeFactory; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.annotation.App; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Token; @App @Component diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementVariableTracker.java similarity index 66% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementVariableTracker.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementVariableTracker.java index e1abadbc..f47715a8 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementVariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementVariableTracker.java @@ -1,12 +1,12 @@ -package com.sum.spirit.core.compile.action; +package com.gitee.spirit.core.compile.action; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.App; -import com.sum.spirit.core.compile.deduce.VariableTracker; -import com.sum.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.common.annotation.App; +import com.gitee.spirit.core.compile.deduce.VariableTracker; +import com.gitee.spirit.core.compile.entity.ElementEvent; @App @Component diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/FragmentDeducer.java similarity index 72% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/FragmentDeducer.java index e4aa15c6..59f8b3ec 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/FragmentDeducer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/FragmentDeducer.java @@ -1,18 +1,18 @@ -package com.sum.spirit.core.compile.deduce; +package com.gitee.spirit.core.compile.deduce; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.core.api.TreeBuilder; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeTable; -import com.sum.spirit.core.element.entity.Node; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.TreeBuilder; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.element.entity.Node; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; @Component public class FragmentDeducer { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/InvocationVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/InvocationVisiter.java similarity index 86% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/InvocationVisiter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/InvocationVisiter.java index 246d3632..f039659f 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/InvocationVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/InvocationVisiter.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile.deduce; +package com.gitee.spirit.core.compile.deduce; import java.util.ArrayList; import java.util.List; @@ -6,14 +6,14 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.api.TypeFactory; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.core.element.utils.StmtVisiter; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.StmtVisiter; @Component public class InvocationVisiter { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/TypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/TypeDerivator.java similarity index 84% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/TypeDerivator.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/TypeDerivator.java index 6c09d31c..a2e7594f 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/TypeDerivator.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/TypeDerivator.java @@ -1,16 +1,16 @@ -package com.sum.spirit.core.compile.deduce; +package com.gitee.spirit.core.compile.deduce; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import com.sum.spirit.common.enums.ModifierEnum; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.api.TypeFactory; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeTable; -import com.sum.spirit.core.clazz.utils.TypeBuilder; -import com.sum.spirit.core.clazz.utils.TypeVisiter; +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeBuilder; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeVisiter; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/VariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java similarity index 82% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/VariableTracker.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java index 8b6b9a64..553712ce 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/VariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java @@ -1,18 +1,18 @@ -package com.sum.spirit.core.compile.deduce; +package com.gitee.spirit.core.compile.deduce; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IParameter; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.entity.IVariable; -import com.sum.spirit.core.compile.entity.MethodContext; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.utils.StmtVisiter; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IParameter; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.entity.MethodContext; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.utils.StmtVisiter; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/entity/ElementEvent.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/ElementEvent.java similarity index 77% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/entity/ElementEvent.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/ElementEvent.java index 079c2f6d..c0f752ee 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/entity/ElementEvent.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/ElementEvent.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.compile.entity; +package com.gitee.spirit.core.compile.entity; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.element.entity.Element; public class ElementEvent { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/entity/MethodContext.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/MethodContext.java similarity index 79% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/entity/MethodContext.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/MethodContext.java index 2ff374dc..1f3b2c81 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/entity/MethodContext.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/MethodContext.java @@ -1,12 +1,12 @@ -package com.sum.spirit.core.compile.entity; +package com.gitee.spirit.core.compile.entity; import java.util.ArrayList; import java.util.List; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; import com.google.common.base.Joiner; -import com.sum.spirit.core.clazz.entity.IMethod; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.entity.IVariable; public class MethodContext { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java similarity index 91% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AdaptiveClassLinker.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index 5e600edb..ed3bb60a 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile.linker; +package com.gitee.spirit.core.compile.linker; import java.util.ArrayList; import java.util.List; @@ -8,13 +8,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.enums.ModifierEnum; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.api.TypeFactory; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeTable; -import com.sum.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AppClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java similarity index 80% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AppClassLinker.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java index 426c2373..fefa6173 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/AppClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.compile.linker; +package com.gitee.spirit.core.compile.linker; import java.util.ArrayList; import java.util.List; @@ -7,15 +7,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.api.ClassVisiter; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IField; -import com.sum.spirit.core.clazz.entity.IMethod; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.compile.AppClassLoader; -import com.sum.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.ClassVisiter; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IField; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.AppClassLoader; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/MethodMatcher.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java similarity index 76% rename from spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/MethodMatcher.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java index 740b377b..12397a89 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/linker/MethodMatcher.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java @@ -1,14 +1,14 @@ -package com.sum.spirit.core.compile.linker; +package com.gitee.spirit.core.compile.linker; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.core.clazz.entity.IMethod; -import com.sum.spirit.core.clazz.entity.IParameter; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IParameter; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; @Component public class MethodMatcher { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/DocumentReader.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/DocumentReader.java similarity index 57% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/DocumentReader.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/DocumentReader.java index 1133b212..9bb9d23c 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/DocumentReader.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/DocumentReader.java @@ -1,8 +1,8 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.io.InputStream; -import com.sum.spirit.core.element.entity.Document; +import com.gitee.spirit.core.element.entity.Document; public interface DocumentReader { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/ElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java similarity index 41% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/ElementBuilder.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java index 0c241acf..282e6ff2 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/ElementBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java @@ -1,8 +1,8 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Line; -import com.sum.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Line; +import com.gitee.spirit.core.element.entity.Statement; public interface ElementBuilder { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/SemanticParser.java similarity index 73% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SemanticParser.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/SemanticParser.java index aee1bd0c..8f64ce68 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/SemanticParser.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.List; -import com.sum.spirit.core.element.entity.SemanticContext; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.entity.SemanticContext; +import com.gitee.spirit.core.element.entity.Token; public interface SemanticParser { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SyntaxParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/SyntaxParser.java similarity index 48% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SyntaxParser.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/SyntaxParser.java index 0897d4c6..de8e4edf 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/SyntaxParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/SyntaxParser.java @@ -1,12 +1,12 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.List; -import com.sum.spirit.common.enums.SyntaxEnum; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.SyntaxResult; -import com.sum.spirit.core.element.entity.SyntaxTree; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.enums.SyntaxEnum; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.SyntaxResult; +import com.gitee.spirit.core.element.entity.SyntaxTree; +import com.gitee.spirit.core.element.entity.Token; public interface SyntaxParser { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/TreeBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/TreeBuilder.java similarity index 37% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/TreeBuilder.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/TreeBuilder.java index 9641a3cc..581c18ac 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/TreeBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/TreeBuilder.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.List; -import com.sum.spirit.core.element.entity.Node; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.SyntaxTree; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.entity.Node; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.SyntaxTree; +import com.gitee.spirit.core.element.entity.Token; public interface TreeBuilder { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultDocumentReader.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultDocumentReader.java similarity index 83% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultDocumentReader.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultDocumentReader.java index 8db21ff4..664ad9ec 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultDocumentReader.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultDocumentReader.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element; +package com.gitee.spirit.core.element; import java.io.InputStream; import java.util.ArrayList; @@ -8,16 +8,16 @@ import java.util.Stack; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.AppConfig.DefaultValue; -import com.sum.spirit.common.utils.ConfigUtils; -import com.sum.spirit.common.utils.LineUtils; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.api.DocumentReader; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.element.entity.Document; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Line; -import com.sum.spirit.core.element.entity.Statement; +import com.gitee.spirit.common.constants.AppConfig.DefaultValue; +import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.common.utils.LineUtils; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.api.DocumentReader; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.element.entity.Document; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Line; +import com.gitee.spirit.core.element.entity.Statement; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java similarity index 69% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java index e8055080..292b5f7a 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/DefaultElementBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java @@ -1,21 +1,21 @@ -package com.sum.spirit.core.element; +package com.gitee.spirit.core.element; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.api.Lexer; -import com.sum.spirit.core.api.SemanticParser; -import com.sum.spirit.core.api.SyntaxParser; -import com.sum.spirit.core.element.action.LineChecker; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Line; -import com.sum.spirit.core.element.entity.Modifiers; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.SyntaxResult; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.Lexer; +import com.gitee.spirit.core.api.SemanticParser; +import com.gitee.spirit.core.api.SyntaxParser; +import com.gitee.spirit.core.element.action.LineChecker; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Line; +import com.gitee.spirit.core.element.entity.Modifiers; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.SyntaxResult; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractSemanticParser.java similarity index 65% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractSemanticParser.java index 9c800956..0828e53f 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractSemanticParser.java @@ -1,12 +1,12 @@ -package com.sum.spirit.core.element.action; - -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.enums.SymbolEnum; -import com.sum.spirit.common.pattern.LiteralPattern; -import com.sum.spirit.common.pattern.TypePattern; -import com.sum.spirit.common.pattern.AccessPattern; -import com.sum.spirit.common.pattern.CommonPattern; -import com.sum.spirit.core.api.SemanticParser; +package com.gitee.spirit.core.element.action; + +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.enums.SymbolEnum; +import com.gitee.spirit.common.pattern.AccessPattern; +import com.gitee.spirit.common.pattern.CommonPattern; +import com.gitee.spirit.common.pattern.LiteralPattern; +import com.gitee.spirit.common.pattern.TypePattern; +import com.gitee.spirit.core.api.SemanticParser; public abstract class AbstractSemanticParser implements SemanticParser { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractTreeBuilder.java similarity index 77% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractTreeBuilder.java index b66ad0ec..7de8c45a 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractTreeBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractTreeBuilder.java @@ -1,14 +1,14 @@ -package com.sum.spirit.core.element.action; +package com.gitee.spirit.core.element.action; import java.util.List; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.core.api.TreeBuilder; -import com.sum.spirit.core.element.entity.Node; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.SyntaxTree; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.core.element.utils.StmtFormat; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.TreeBuilder; +import com.gitee.spirit.core.element.entity.Node; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.SyntaxTree; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.StmtFormat; public abstract class AbstractTreeBuilder implements TreeBuilder { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java similarity index 87% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java index ac3e093f..0add378b 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.action; +package com.gitee.spirit.core.element.action; import java.util.ArrayList; import java.util.List; @@ -6,16 +6,16 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.common.pattern.AccessPattern; -import com.sum.spirit.common.pattern.CommonPattern; -import com.sum.spirit.common.pattern.LiteralPattern; -import com.sum.spirit.common.pattern.TypePattern; -import com.sum.spirit.core.api.Lexer; -import com.sum.spirit.core.element.entity.SemanticContext; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.pattern.AccessPattern; +import com.gitee.spirit.common.pattern.CommonPattern; +import com.gitee.spirit.common.pattern.LiteralPattern; +import com.gitee.spirit.common.pattern.TypePattern; +import com.gitee.spirit.core.api.Lexer; +import com.gitee.spirit.core.element.entity.SemanticContext; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSyntaxParser.java similarity index 89% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSyntaxParser.java index 533b56f2..97370d1c 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultSyntaxParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSyntaxParser.java @@ -1,20 +1,20 @@ -package com.sum.spirit.core.element.action; +package com.gitee.spirit.core.element.action; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.enums.SyntaxEnum; -import com.sum.spirit.core.api.SyntaxParser; -import com.sum.spirit.core.api.TreeBuilder; -import com.sum.spirit.core.element.entity.Node; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.SyntaxResult; -import com.sum.spirit.core.element.entity.SyntaxTree; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.enums.SyntaxEnum; +import com.gitee.spirit.core.api.SyntaxParser; +import com.gitee.spirit.core.api.TreeBuilder; +import com.gitee.spirit.core.element.entity.Node; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.SyntaxResult; +import com.gitee.spirit.core.element.entity.SyntaxTree; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultTreeBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultTreeBuilder.java similarity index 88% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultTreeBuilder.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultTreeBuilder.java index 3956c84c..41afc737 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/DefaultTreeBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultTreeBuilder.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.action; +package com.gitee.spirit.core.element.action; import java.util.ArrayList; import java.util.List; @@ -9,15 +9,15 @@ import java.util.stream.Collectors; import org.springframework.stereotype.Component; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.SymbolEnum; -import com.sum.spirit.common.enums.SymbolEnum.OperandEnum; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.element.entity.Node; -import com.sum.spirit.core.element.entity.SyntaxTree; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.core.element.utils.PriorityNode; -import com.sum.spirit.core.element.utils.PriorityNode.PriorityComparator; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.SymbolEnum; +import com.gitee.spirit.common.enums.SymbolEnum.OperandEnum; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.element.entity.Node; +import com.gitee.spirit.core.element.entity.SyntaxTree; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.PriorityNode; +import com.gitee.spirit.core.element.utils.PriorityNode.PriorityComparator; @Component public class DefaultTreeBuilder extends AbstractTreeBuilder { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/LineChecker.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/LineChecker.java similarity index 70% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/LineChecker.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/LineChecker.java index 270202e5..09383092 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/LineChecker.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/LineChecker.java @@ -1,8 +1,8 @@ -package com.sum.spirit.core.element.action; +package com.gitee.spirit.core.element.action; import org.springframework.stereotype.Component; -import com.sum.spirit.core.element.entity.Line; +import com.gitee.spirit.core.element.entity.Line; @Component public class LineChecker { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Document.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Document.java similarity index 87% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Document.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Document.java index d442bbff..7f74795a 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Document.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Document.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; import java.util.ArrayList; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Element.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Element.java similarity index 88% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Element.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Element.java index 7f8856ec..a3cc5b95 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Element.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Element.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; import java.util.ArrayList; import java.util.List; -import com.sum.spirit.common.enums.SyntaxEnum; -import com.sum.spirit.common.utils.LineUtils; -import com.sum.spirit.core.element.frame.Syntactic; +import com.gitee.spirit.common.enums.SyntaxEnum; +import com.gitee.spirit.common.utils.LineUtils; +import com.gitee.spirit.core.element.frame.Syntactic; public class Element extends Syntactic { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Line.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Line.java similarity index 88% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Line.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Line.java index 55e59ec5..5e62e183 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Line.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Line.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; -import com.sum.spirit.common.utils.LineUtils; +import com.gitee.spirit.common.utils.LineUtils; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Modifiers.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Modifiers.java similarity index 66% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Modifiers.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Modifiers.java index be2fd3e9..6b17d57d 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Modifiers.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Modifiers.java @@ -1,10 +1,10 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; import java.util.List; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.element.frame.KeywordTokenBox; import com.google.common.base.Joiner; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.element.frame.KeywordTokenBox; public class Modifiers extends KeywordTokenBox { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Node.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Node.java similarity index 90% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Node.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Node.java index 402bf640..177b5fd1 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Node.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Node.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; public class Node { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SemanticContext.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java similarity index 90% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SemanticContext.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java index b28c8bbc..43fc33d4 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SemanticContext.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; import java.util.List; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Statement.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Statement.java similarity index 81% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Statement.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Statement.java index 3c80a931..72f5e509 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Statement.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Statement.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; import java.util.List; +import com.gitee.spirit.common.utils.Splitter; +import com.gitee.spirit.core.element.frame.KeywordTokenBox; +import com.gitee.spirit.core.element.utils.StmtFormat; import com.google.common.base.Joiner; -import com.sum.spirit.common.utils.Splitter; -import com.sum.spirit.core.element.frame.KeywordTokenBox; -import com.sum.spirit.core.element.utils.StmtFormat; public class Statement extends KeywordTokenBox { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SyntaxResult.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SyntaxResult.java similarity index 70% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SyntaxResult.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SyntaxResult.java index 13ff6fa1..ce93b00e 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SyntaxResult.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SyntaxResult.java @@ -1,6 +1,6 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; -import com.sum.spirit.common.enums.SyntaxEnum; +import com.gitee.spirit.common.enums.SyntaxEnum; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SyntaxTree.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SyntaxTree.java similarity index 76% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SyntaxTree.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SyntaxTree.java index c6a78eac..114f1f54 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/SyntaxTree.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SyntaxTree.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; import java.util.List; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Token.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Token.java similarity index 81% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Token.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Token.java index b5df7203..c0a10b44 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/entity/Token.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Token.java @@ -1,10 +1,10 @@ -package com.sum.spirit.core.element.entity; +package com.gitee.spirit.core.element.entity; import java.util.HashMap; import java.util.Map; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.core.element.frame.Semantic; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.element.frame.Semantic; public class Token extends Semantic { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Attributes.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Attributes.java similarity index 92% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Attributes.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Attributes.java index 121cd8a6..cd5e17ce 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Attributes.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Attributes.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.frame; +package com.gitee.spirit.core.element.frame; import java.util.Map; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/KeywordTokenBox.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/KeywordTokenBox.java similarity index 91% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/KeywordTokenBox.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/KeywordTokenBox.java index 28dba2ac..a1697af6 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/KeywordTokenBox.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/KeywordTokenBox.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.element.frame; +package com.gitee.spirit.core.element.frame; import java.util.ArrayList; import java.util.List; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Semantic.java similarity index 95% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Semantic.java index d96d663b..283b48e8 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Semantic.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Semantic.java @@ -1,10 +1,10 @@ -package com.sum.spirit.core.element.frame; +package com.gitee.spirit.core.element.frame; import java.util.Map; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.enums.SymbolEnum; -import com.sum.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.enums.SymbolEnum; +import com.gitee.spirit.common.enums.TokenTypeEnum; public abstract class Semantic extends Attributes { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Syntactic.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Syntactic.java similarity index 92% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Syntactic.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Syntactic.java index 891de7db..5ea06bc0 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/Syntactic.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/Syntactic.java @@ -1,10 +1,10 @@ -package com.sum.spirit.core.element.frame; +package com.gitee.spirit.core.element.frame; import java.util.List; -import com.sum.spirit.common.enums.SyntaxEnum; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.enums.SyntaxEnum; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; public abstract class Syntactic extends Statement { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/TokenBox.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/TokenBox.java similarity index 85% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/TokenBox.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/TokenBox.java index 12dd1090..847d1b5a 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/frame/TokenBox.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/frame/TokenBox.java @@ -1,13 +1,13 @@ -package com.sum.spirit.core.element.frame; +package com.gitee.spirit.core.element.frame; import java.util.ArrayList; import java.util.List; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.common.utils.Splitter; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.core.element.utils.MappableList; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.common.utils.Splitter; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.MappableList; import cn.hutool.core.util.ArrayUtil; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/MappableList.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/MappableList.java similarity index 97% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/MappableList.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/MappableList.java index d941dc93..9f4b7b32 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/MappableList.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/MappableList.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.utils; +package com.gitee.spirit.core.element.utils; import java.util.Collection; import java.util.Iterator; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/PriorityNode.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/PriorityNode.java similarity index 96% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/PriorityNode.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/PriorityNode.java index 268757c6..b6996329 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/PriorityNode.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/PriorityNode.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.element.utils; +package com.gitee.spirit.core.element.utils; import java.util.Comparator; import java.util.PriorityQueue; diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtFormat.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/StmtFormat.java similarity index 88% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtFormat.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/StmtFormat.java index 2d5f1f48..581a846e 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtFormat.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/StmtFormat.java @@ -1,12 +1,12 @@ -package com.sum.spirit.core.element.utils; +package com.gitee.spirit.core.element.utils; import java.util.List; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.common.enums.SymbolEnum.OperandEnum; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.enums.SymbolEnum.OperandEnum; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; public class StmtFormat { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtVisiter.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/StmtVisiter.java similarity index 67% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtVisiter.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/StmtVisiter.java index 8cca0528..aa0808a5 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/StmtVisiter.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/StmtVisiter.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.element.utils; +package com.gitee.spirit.core.element.utils; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; public class StmtVisiter { diff --git a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/TreeFormat.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/TreeFormat.java similarity index 84% rename from spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/TreeFormat.java rename to spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/TreeFormat.java index 07323f1c..b405e493 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/utils/TreeFormat.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/utils/TreeFormat.java @@ -1,16 +1,16 @@ -package com.sum.spirit.core.element.utils; +package com.gitee.spirit.core.element.utils; //import java.util.ArrayList; //import java.util.List; // //import org.apache.commons.lang3.StringUtils; // -//import com.sum.spirit.common.enums.AttributeEnum; -//import com.sum.spirit.common.utils.LineUtils; -//import com.sum.spirit.core.element.entity.Line; -//import com.sum.spirit.core.element.entity.Node; -//import com.sum.spirit.core.element.entity.SyntaxTree; -//import com.sum.spirit.core.element.entity.Token; +//import com.gitee.spirit.common.enums.AttributeEnum; +//import com.gitee.spirit.common.utils.LineUtils; +//import com.gitee.spirit.core.element.entity.Line; +//import com.gitee.spirit.core.element.entity.Node; +//import com.gitee.spirit.core.element.entity.SyntaxTree; +//import com.gitee.spirit.core.element.entity.Token; public class TreeFormat { diff --git a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/ElementStarter.java b/spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/ElementStarter.java similarity index 70% rename from spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/ElementStarter.java rename to spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/ElementStarter.java index 21e96504..ed9aa144 100644 --- a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/ElementStarter.java +++ b/spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/ElementStarter.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.lexer.test; +package com.gitee.spirit.core.lexer.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication(scanBasePackages = "com.sum.spirit") +@SpringBootApplication(scanBasePackages = "com.gitee.spirit") public class ElementStarter { public static void main(String[] args) { SpringApplication.run(ElementStarter.class, args); diff --git a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SemanticTest.java b/spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/SemanticTest.java similarity index 94% rename from spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SemanticTest.java rename to spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/SemanticTest.java index 57f69fe2..42a94fc0 100644 --- a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SemanticTest.java +++ b/spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/SemanticTest.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.test; +package com.gitee.spirit.core.lexer.test; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -7,10 +7,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import com.sum.spirit.core.api.SemanticParser; -import com.sum.spirit.core.element.entity.SemanticContext; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.core.api.SemanticParser; +import com.gitee.spirit.core.element.entity.SemanticContext; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; @SpringBootTest @DisplayName("语义测试") @@ -22,7 +22,7 @@ public class SemanticTest { @Test @DisplayName("PATH") public void test0000() { - String text = "com.sum.spirit.example.Animal"; + String text = "com.gitee.spirit.example.Animal"; Token token = parser.getToken(new SemanticContext(), text); assertTrue(token.isAccessPath()); } diff --git a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java b/spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/SyntaxTest.java similarity index 97% rename from spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java rename to spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/SyntaxTest.java index ab1da941..32a75766 100644 --- a/spirit-core/spirit-core-element/src/test/java/com/sum/spirit/core/lexer/test/SyntaxTest.java +++ b/spirit-core/spirit-core-element/src/test/java/com/gitee/spirit/core/lexer/test/SyntaxTest.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.test; +package com.gitee.spirit.core.lexer.test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -8,10 +8,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.core.api.ElementBuilder; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Token; @SpringBootTest @DisplayName("语法测试") @@ -28,13 +28,13 @@ public class SyntaxTest { @Test @DisplayName("IMPORT") public void test0000() { - String text = "import com.sum.spirit.example.Animal"; + String text = "import com.gitee.spirit.example.Animal"; Element element = builder.build(text); assertTrue(element.isImport()); assertTrue(element.size() == 2); int count = 0; assertTypeAndValue(element.get(count++), TokenTypeEnum.KEYWORD, "import"); - assertTypeAndValue(element.get(count++), TokenTypeEnum.ACCESS_PATH, "com.sum.spirit.example.Animal"); + assertTypeAndValue(element.get(count++), TokenTypeEnum.ACCESS_PATH, "com.gitee.spirit.example.Animal"); } @Test diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharAction.java similarity index 43% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharAction.java index c37f8b7c..4bf23399 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharAction.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CommonResult; public interface CharAction { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharsHandler.java similarity index 41% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharsHandler.java index 49458a55..61d5e3f2 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharsHandler.java @@ -1,7 +1,7 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; -import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CharsContext; +import com.gitee.spirit.core.lexer.entity.CommonResult; public interface CharsHandler { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/Lexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/Lexer.java similarity index 81% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/Lexer.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/Lexer.java index edb2e618..f2a5213e 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/Lexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/Lexer.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.util.List; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/LexerAction.java similarity index 60% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/LexerAction.java index 250ad027..9842154c 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/LexerAction.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; public interface LexerAction extends CharAction { } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCharsHandler.java similarity index 68% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCharsHandler.java index 4983c9be..7b80d6a4 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCharsHandler.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.lexer; +package com.gitee.spirit.core.lexer; -import com.sum.spirit.core.api.CharAction; -import com.sum.spirit.core.api.CharsHandler; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CommonState; -import com.sum.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.api.CharAction; +import com.gitee.spirit.core.api.CharsHandler; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CharsContext; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CommonState; public abstract class AbstractCharsHandler implements CharsHandler, CharAction { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCursorLexer.java similarity index 71% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCursorLexer.java index ed50ebbc..84deb6f4 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCursorLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCursorLexer.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.lexer; +package com.gitee.spirit.core.lexer; -import com.sum.spirit.common.utils.LineUtils; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CommonResult; -import com.sum.spirit.core.lexer.entity.LexerContext; +import com.gitee.spirit.common.utils.LineUtils; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.LexerContext; public abstract class AbstractCursorLexer extends AbstractLexer { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractLexer.java similarity index 80% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractLexer.java index 5b1c7cc6..0c7f1f7f 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractLexer.java @@ -1,22 +1,22 @@ -package com.sum.spirit.core.lexer; +package com.gitee.spirit.core.lexer; import java.util.Arrays; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; -import com.sum.spirit.common.pattern.AccessPattern; -import com.sum.spirit.common.pattern.LiteralPattern; -import com.sum.spirit.core.api.Lexer; -import com.sum.spirit.core.api.LexerAction; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CommonState; -import com.sum.spirit.core.lexer.entity.CommonResult; -import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.Region; -import com.sum.spirit.core.lexer.utils.RegionUtils; -import com.sum.spirit.core.lexer.utils.RegionUtils.completedRegion; +import com.gitee.spirit.common.pattern.AccessPattern; +import com.gitee.spirit.common.pattern.LiteralPattern; +import com.gitee.spirit.core.api.Lexer; +import com.gitee.spirit.core.api.LexerAction; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CharsContext; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CommonState; +import com.gitee.spirit.core.lexer.entity.LexerContext; +import com.gitee.spirit.core.lexer.entity.Region; +import com.gitee.spirit.core.lexer.utils.RegionUtils; +import com.gitee.spirit.core.lexer.utils.RegionUtils.completedRegion; public abstract class AbstractLexer extends AbstractCharsHandler implements Lexer { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AliasCharsHandler.java similarity index 87% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AliasCharsHandler.java index 17752807..705c55cb 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AliasCharsHandler.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AliasCharsHandler.java @@ -1,11 +1,11 @@ -package com.sum.spirit.core.lexer; +package com.gitee.spirit.core.lexer; import org.springframework.stereotype.Component; -import com.sum.spirit.common.utils.LineUtils; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.common.utils.LineUtils; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CharsContext; +import com.gitee.spirit.core.lexer.entity.CommonResult; @Component public class AliasCharsHandler extends AbstractCharsHandler { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/CoreLexer.java similarity index 80% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/CoreLexer.java index b1c84288..856e79e7 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/CoreLexer.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/CoreLexer.java @@ -1,12 +1,12 @@ -package com.sum.spirit.core.lexer; +package com.gitee.spirit.core.lexer; import java.util.List; import org.springframework.stereotype.Component; -import com.sum.spirit.core.lexer.action.BorderAction; -import com.sum.spirit.core.lexer.entity.CommonResult; -import com.sum.spirit.core.lexer.entity.LexerContext; +import com.gitee.spirit.core.lexer.action.BorderAction; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.LexerContext; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/BorderAction.java similarity index 82% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/BorderAction.java index a2e42393..fc428be5 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/BorderAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/BorderAction.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.action; +package com.gitee.spirit.core.lexer.action; import java.util.ArrayList; import java.util.List; @@ -6,11 +6,11 @@ import java.util.List; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CommonState; -import com.sum.spirit.core.lexer.entity.CommonResult; -import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.Region; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CommonState; +import com.gitee.spirit.core.lexer.entity.LexerContext; +import com.gitee.spirit.core.lexer.entity.Region; @Component @Order(-100) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/RegionAction.java similarity index 86% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/RegionAction.java index 5994daf6..b7d15fd5 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/RegionAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/RegionAction.java @@ -1,19 +1,19 @@ -package com.sum.spirit.core.lexer.action; +package com.gitee.spirit.core.lexer.action; import java.util.List; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.pattern.TypePattern; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.api.LexerAction; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CommonState; -import com.sum.spirit.core.lexer.entity.CommonResult; -import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.Region; -import com.sum.spirit.core.lexer.utils.RegionUtils; +import com.gitee.spirit.common.pattern.TypePattern; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.api.LexerAction; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CommonState; +import com.gitee.spirit.core.lexer.entity.LexerContext; +import com.gitee.spirit.core.lexer.entity.Region; +import com.gitee.spirit.core.lexer.utils.RegionUtils; @Component @Order(-80) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/SpaceAction.java similarity index 56% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/SpaceAction.java index 76b6711e..4ec74c14 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SpaceAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/SpaceAction.java @@ -1,14 +1,14 @@ -package com.sum.spirit.core.lexer.action; +package com.gitee.spirit.core.lexer.action; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.core.api.LexerAction; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CommonState; -import com.sum.spirit.core.lexer.entity.CommonResult; -import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.Region; +import com.gitee.spirit.core.api.LexerAction; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CommonState; +import com.gitee.spirit.core.lexer.entity.LexerContext; +import com.gitee.spirit.core.lexer.entity.Region; @Component @Order(-40) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/SymbolAction.java similarity index 71% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/SymbolAction.java index 23038a03..943352f1 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/action/SymbolAction.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/action/SymbolAction.java @@ -1,15 +1,15 @@ -package com.sum.spirit.core.lexer.action; +package com.gitee.spirit.core.lexer.action; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.enums.SymbolEnum; -import com.sum.spirit.core.api.LexerAction; -import com.sum.spirit.core.lexer.entity.CharEvent; -import com.sum.spirit.core.lexer.entity.CommonState; -import com.sum.spirit.core.lexer.entity.CommonResult; -import com.sum.spirit.core.lexer.entity.LexerContext; -import com.sum.spirit.core.lexer.entity.Region; +import com.gitee.spirit.common.enums.SymbolEnum; +import com.gitee.spirit.core.api.LexerAction; +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CommonResult; +import com.gitee.spirit.core.lexer.entity.CommonState; +import com.gitee.spirit.core.lexer.entity.LexerContext; +import com.gitee.spirit.core.lexer.entity.Region; @Component @Order(-60) diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharEvent.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CharEvent.java similarity index 82% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharEvent.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CharEvent.java index 48a1ce14..15697f4c 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharEvent.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CharEvent.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.entity; +package com.gitee.spirit.core.lexer.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsContext.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CharsContext.java similarity index 83% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsContext.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CharsContext.java index 179e696e..c5fce605 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsContext.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CharsContext.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.entity; +package com.gitee.spirit.core.lexer.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonResult.java similarity index 89% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonResult.java index a59d5c7e..6e5f7572 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonResult.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonResult.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.entity; +package com.gitee.spirit.core.lexer.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonState.java similarity index 57% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonState.java index 36285a47..60d2103d 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CommonState.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonState.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.entity; +package com.gitee.spirit.core.lexer.entity; public enum CommonState { CONTINUE, SKIP, RESET, BREAK diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerContext.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/LexerContext.java similarity index 93% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerContext.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/LexerContext.java index 1a926deb..93fef8c0 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerContext.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/LexerContext.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.entity; +package com.gitee.spirit.core.lexer.entity; import java.util.ArrayList; import java.util.Arrays; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/Region.java similarity index 92% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/Region.java index 45f5806b..f553a5c9 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/Region.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/Region.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.entity; +package com.gitee.spirit.core.lexer.entity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/utils/RegionUtils.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/utils/RegionUtils.java similarity index 91% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/utils/RegionUtils.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/utils/RegionUtils.java index a60e42b8..a66e023c 100644 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/utils/RegionUtils.java +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/utils/RegionUtils.java @@ -1,13 +1,13 @@ -package com.sum.spirit.core.lexer.utils; +package com.gitee.spirit.core.lexer.utils; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import com.sum.spirit.common.utils.LineUtils; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.lexer.entity.Region; +import com.gitee.spirit.common.utils.LineUtils; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.lexer.entity.Region; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-lexer/src/test/java/com/sum/spirit/core/lexer/test/LexerStarter.java b/spirit-core/spirit-core-lexer/src/test/java/com/gitee/spirit/core/lexer/test/LexerStarter.java similarity index 70% rename from spirit-core/spirit-core-lexer/src/test/java/com/sum/spirit/core/lexer/test/LexerStarter.java rename to spirit-core/spirit-core-lexer/src/test/java/com/gitee/spirit/core/lexer/test/LexerStarter.java index 462ffdf4..c59a504c 100644 --- a/spirit-core/spirit-core-lexer/src/test/java/com/sum/spirit/core/lexer/test/LexerStarter.java +++ b/spirit-core/spirit-core-lexer/src/test/java/com/gitee/spirit/core/lexer/test/LexerStarter.java @@ -1,9 +1,9 @@ -package com.sum.spirit.core.lexer.test; +package com.gitee.spirit.core.lexer.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication(scanBasePackages = "com.sum.spirit") +@SpringBootApplication(scanBasePackages = "com.gitee.spirit") public class LexerStarter { public static void main(String[] args) { SpringApplication.run(LexerStarter.class, args); diff --git a/spirit-core/spirit-core-lexer/src/test/java/com/sum/spirit/core/lexer/test/LexerTest.java b/spirit-core/spirit-core-lexer/src/test/java/com/gitee/spirit/core/lexer/test/LexerTest.java similarity index 99% rename from spirit-core/spirit-core-lexer/src/test/java/com/sum/spirit/core/lexer/test/LexerTest.java rename to spirit-core/spirit-core-lexer/src/test/java/com/gitee/spirit/core/lexer/test/LexerTest.java index 206b46d1..0e5469a4 100644 --- a/spirit-core/spirit-core-lexer/src/test/java/com/sum/spirit/core/lexer/test/LexerTest.java +++ b/spirit-core/spirit-core-lexer/src/test/java/com/gitee/spirit/core/lexer/test/LexerTest.java @@ -1,4 +1,4 @@ -package com.sum.spirit.core.lexer.test; +package com.gitee.spirit.core.lexer.test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import com.sum.spirit.core.api.Lexer; +import com.gitee.spirit.core.api.Lexer; import lombok.extern.slf4j.Slf4j; diff --git a/spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/ClassGenericTest.java b/spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/ClassGenericTest.java similarity index 86% rename from spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/ClassGenericTest.java rename to spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/ClassGenericTest.java index 24f1744c..dbb67d61 100644 --- a/spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/ClassGenericTest.java +++ b/spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/ClassGenericTest.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example; +package com.gitee.spirit.example; @MyTest public class ClassGenericTest { diff --git a/spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/GenericType.java b/spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/GenericType.java similarity index 91% rename from spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/GenericType.java rename to spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/GenericType.java index c44c34e9..d0384afc 100644 --- a/spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/GenericType.java +++ b/spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/GenericType.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example; +package com.gitee.spirit.example; import java.util.HashMap; import java.util.Map; diff --git a/spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/MyTest.java b/spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/MyTest.java similarity index 90% rename from spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/MyTest.java rename to spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/MyTest.java index d42a7fb4..f6ae44c2 100644 --- a/spirit-example/spirit-example-common/src/main/java/com/sum/spirit/example/MyTest.java +++ b/spirit-example/spirit-example-common/src/main/java/com/gitee/spirit/example/MyTest.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example; +package com.gitee.spirit.example; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Alias.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Alias.java similarity index 66% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Alias.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Alias.java index d0216485..2a352c75 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Alias.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Alias.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.auto; +package com.gitee.spirit.example.auto; public class Alias { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Friend.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Friend.java similarity index 86% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Friend.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Friend.java index 1cfc5ddd..87884fd4 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Friend.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Friend.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.auto; +package com.gitee.spirit.example.auto; public class Friend { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Import.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Import.java similarity index 78% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Import.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Import.java index 37fd186e..75ef2bfc 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/auto/Import.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/auto/Import.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.auto; +package com.gitee.spirit.example.auto; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -7,7 +7,7 @@ public class Import { public static final Logger logger = LoggerFactory.getLogger(Import.class); public Friend f = new Friend(); - public com.sum.spirit.example.auto.Alias a = new com.sum.spirit.example.auto.Alias(); + public com.gitee.spirit.example.auto.Alias a = new com.gitee.spirit.example.auto.Alias(); public String xxxxG_Alias = "Clock moved backwards.G_Alias to generate id for %d milliseconds"; public String testFriend(String text, Integer number) { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/block/Block.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/block/Block.java similarity index 92% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/block/Block.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/block/Block.java index a5c9839f..ddc2e8a2 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/block/Block.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/block/Block.java @@ -1,14 +1,14 @@ -package com.sum.spirit.example.block; +package com.gitee.spirit.example.block; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sum.spirit.stdlib.Maps; +import com.gitee.spirit.stdlib.Maps; import java.util.Map; import java.util.Map.Entry; -import com.sum.spirit.stdlib.Lists; +import com.gitee.spirit.stdlib.Lists; import java.util.List; -import static com.sum.spirit.stdlib.Emptys.empty; +import static com.gitee.spirit.stdlib.Emptys.empty; public class Block { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/AbsService.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/AbsService.java similarity index 73% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/AbsService.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/AbsService.java index 7a0be296..af4ca1ce 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/AbsService.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/AbsService.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.clazz; +package com.gitee.spirit.example.clazz; public abstract class AbsService implements Service { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/Service.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/Service.java similarity index 90% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/Service.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/Service.java index b1a671eb..a13eb22c 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/Service.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/Service.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.clazz; +package com.gitee.spirit.example.clazz; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/ServiceImpl.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/ServiceImpl.java similarity index 93% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/ServiceImpl.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/ServiceImpl.java index 2984d71b..ecf2046f 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/clazz/ServiceImpl.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/clazz/ServiceImpl.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.clazz; +package com.gitee.spirit.example.clazz; public class ServiceImpl extends AbsService { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/deduce/Child.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Child.java similarity index 88% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/deduce/Child.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Child.java index 3b8f6aa3..5d14e6bc 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/deduce/Child.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Child.java @@ -1,6 +1,6 @@ -package com.sum.spirit.example.deduce; +package com.gitee.spirit.example.deduce; -import com.sum.spirit.example.ClassGenericTest; +import com.gitee.spirit.example.ClassGenericTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/deduce/Father.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Father.java similarity index 82% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/deduce/Father.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Father.java index a4bd919f..0e8685ff 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/deduce/Father.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/deduce/Father.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.deduce; +package com.gitee.spirit.example.deduce; public class Father { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/inner/Inner.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Inner.java similarity index 79% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/inner/Inner.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Inner.java index c0b8be93..9c9b4797 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/inner/Inner.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Inner.java @@ -1,6 +1,6 @@ -package com.sum.spirit.example.inner; +package com.gitee.spirit.example.inner; -import com.sum.spirit.example.deduce.Father; +import com.gitee.spirit.example.deduce.Father; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/inner/Outside.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Outside.java similarity index 86% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/inner/Outside.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Outside.java index b8d9607e..36eab30b 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/inner/Outside.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/inner/Outside.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.inner; +package com.gitee.spirit.example.inner; public class Outside { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/process/Main.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/process/Main.java similarity index 92% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/process/Main.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/process/Main.java index 05f42170..7425c469 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/process/Main.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/process/Main.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.process; +package com.gitee.spirit.example.process; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/snow/IdWorker.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/snow/IdWorker.java similarity index 98% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/snow/IdWorker.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/snow/IdWorker.java index 1eaf9f6d..957f23f2 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/snow/IdWorker.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/snow/IdWorker.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.snow; +package com.gitee.spirit.example.snow; public class IdWorker { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/subexpress/Express.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/subexpress/Express.java similarity index 92% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/subexpress/Express.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/subexpress/Express.java index 37748236..49a552ef 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/subexpress/Express.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/subexpress/Express.java @@ -1,11 +1,11 @@ -package com.sum.spirit.example.subexpress; +package com.gitee.spirit.example.subexpress; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sum.spirit.stdlib.Lists; +import com.gitee.spirit.stdlib.Lists; import java.util.List; -import static com.sum.spirit.stdlib.Emptys.empty; +import static com.gitee.spirit.stdlib.Emptys.empty; public class Express { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/syntax/Syntax.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/syntax/Syntax.java similarity index 87% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/syntax/Syntax.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/syntax/Syntax.java index a11d71b5..91c00a3f 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/syntax/Syntax.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/syntax/Syntax.java @@ -1,10 +1,10 @@ -package com.sum.spirit.example.syntax; +package com.gitee.spirit.example.syntax; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sum.spirit.stdlib.Lists; +import com.gitee.spirit.stdlib.Lists; import java.util.List; -import com.sum.spirit.stdlib.Maps; +import com.gitee.spirit.stdlib.Maps; import java.util.Map; public class Syntax { diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/GenericType.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/GenericType.java similarity index 94% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/GenericType.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/GenericType.java index 608abef2..4f8c51f4 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/GenericType.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/GenericType.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.type; +package com.gitee.spirit.example.type; import java.util.HashMap; import org.slf4j.Logger; diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/People.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/People.java similarity index 90% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/People.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/People.java index 515cb618..bef79bd6 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/People.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/People.java @@ -1,4 +1,4 @@ -package com.sum.spirit.example.type; +package com.gitee.spirit.example.type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/Type.java b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/Type.java similarity index 91% rename from spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/Type.java rename to spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/Type.java index e841ce90..cfb508de 100644 --- a/spirit-example/spirit-example-plugin/src/main/java/com/sum/spirit/example/type/Type.java +++ b/spirit-example/spirit-example-plugin/src/main/java/com/gitee/spirit/example/type/Type.java @@ -1,16 +1,16 @@ -package com.sum.spirit.example.type; +package com.gitee.spirit.example.type; import java.util.HashMap; -import com.sum.spirit.example.ClassGenericTest; -import com.sum.spirit.example.MyTest; -import com.sum.spirit.example.GenericType; -import com.sum.spirit.example.clazz.ServiceImpl; -import com.sum.spirit.example.process.Main; +import com.gitee.spirit.example.ClassGenericTest; +import com.gitee.spirit.example.MyTest; +import com.gitee.spirit.example.GenericType; +import com.gitee.spirit.example.clazz.ServiceImpl; +import com.gitee.spirit.example.process.Main; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.sum.spirit.stdlib.Lists; +import com.gitee.spirit.stdlib.Lists; import java.util.List; -import com.sum.spirit.stdlib.Maps; +import com.gitee.spirit.stdlib.Maps; import java.util.Map; @Deprecated diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/auto/Alias.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Alias.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/auto/Alias.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Alias.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/auto/Friend.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Friend.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/auto/Friend.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Friend.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/auto/Import.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Import.sp similarity index 85% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/auto/Import.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Import.sp index 5e7f37f8..2ec8112a 100644 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/auto/Import.sp +++ b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/auto/Import.sp @@ -1,6 +1,6 @@ //别名 -import com.sum.spirit.example.auto.Alias G_Alias +import com.gitee.spirit.example.auto.Alias G_Alias class Import { diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/block/Block.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/block/Block.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/block/Block.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/block/Block.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/clazz/AbsService.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/clazz/AbsService.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/clazz/AbsService.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/clazz/AbsService.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/clazz/Service.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/clazz/Service.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/clazz/Service.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/clazz/Service.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/clazz/ServiceImpl.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/clazz/ServiceImpl.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/clazz/ServiceImpl.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/clazz/ServiceImpl.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/deduce/Child.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Child.sp similarity index 89% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/deduce/Child.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Child.sp index adaa6cae..51a5b271 100644 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/deduce/Child.sp +++ b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Child.sp @@ -1,5 +1,5 @@ -import com.sum.spirit.example.ClassGenericTest +import com.gitee.spirit.example.ClassGenericTest class Child extends Father{ diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/deduce/Father.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Father.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/deduce/Father.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/deduce/Father.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/inner/Outside.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Outside.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/inner/Outside.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/inner/Outside.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/process/Main.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/process/Main.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/process/Main.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/process/Main.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/snow/IdWorker.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/snow/IdWorker.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/snow/IdWorker.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/snow/IdWorker.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/subexpress/Express.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/subexpress/Express.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/subexpress/Express.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/subexpress/Express.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/syntax/Syntax.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/syntax/Syntax.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/syntax/Syntax.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/syntax/Syntax.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/type/GenericType.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/GenericType.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/type/GenericType.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/GenericType.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/type/People.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/People.sp similarity index 100% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/type/People.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/People.sp diff --git a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/type/Type.sp b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/Type.sp similarity index 95% rename from spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/type/Type.sp rename to spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/Type.sp index 813e7d85..c6e11fed 100644 --- a/spirit-example/spirit-example-plugin/src/main/resources/sources/com.sum.spirit.example/type/Type.sp +++ b/spirit-example/spirit-example-plugin/src/main/resources/sources/com.gitee.spirit.example/type/Type.sp @@ -1,8 +1,8 @@ import java.util.HashMap -import com.sum.spirit.example.ClassGenericTest -import com.sum.spirit.example.MyTest -import com.sum.spirit.example.GenericType +import com.gitee.spirit.example.ClassGenericTest +import com.gitee.spirit.example.MyTest +import com.gitee.spirit.example.GenericType const NUMBER = 100.0 const NAME = "chentao" diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java similarity index 86% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java index 0f3557a4..d97b14fd 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java; +package com.gitee.spirit.output.java; import java.net.URL; import java.util.List; @@ -9,11 +9,11 @@ import org.springframework.context.annotation.DependsOn; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; +import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.core.clazz.AbstractClassLoader; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.output.java.utils.ReflectUtils; import com.google.common.base.Splitter; -import com.sum.spirit.common.utils.ConfigUtils; -import com.sum.spirit.core.clazz.AbstractClassLoader; -import com.sum.spirit.core.clazz.utils.TypeUtils; -import com.sum.spirit.output.java.utils.ReflectUtils; @Component @Order(-80) diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/JavaBuilder.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java similarity index 86% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/JavaBuilder.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java index e79c5f71..0a80e2c1 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/JavaBuilder.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java; +package com.gitee.spirit.output.java; import java.util.List; @@ -7,18 +7,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.Native; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.utils.SpringUtils; -import com.sum.spirit.core.api.CodeBuilder; -import com.sum.spirit.core.api.ElementAction; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IField; -import com.sum.spirit.core.clazz.entity.IMethod; -import com.sum.spirit.core.clazz.entity.Import; -import com.sum.spirit.core.compile.AutoImporter; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.common.annotation.Native; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.utils.SpringUtils; +import com.gitee.spirit.core.api.CodeBuilder; +import com.gitee.spirit.core.api.ElementAction; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IField; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.Import; +import com.gitee.spirit.core.compile.AutoImporter; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.element.entity.Element; @Component @DependsOn("springUtils") diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/AbstractTreeElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java similarity index 81% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/AbstractTreeElementAction.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java index 562dd0d1..73156417 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/AbstractTreeElementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java @@ -1,19 +1,19 @@ -package com.sum.spirit.output.java.action; +package com.gitee.spirit.output.java.action; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.compile.action.AbstractElementAction; -import com.sum.spirit.core.compile.deduce.FragmentDeducer; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.core.element.utils.StmtVisiter; -import com.sum.spirit.output.java.utils.TreeUtils; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.action.AbstractElementAction; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.StmtVisiter; +import com.gitee.spirit.output.java.utils.TreeUtils; public abstract class AbstractTreeElementAction extends AbstractElementAction { diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/CommonAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java similarity index 72% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/CommonAction.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java index 5af34b30..9d2de82f 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/CommonAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java @@ -1,18 +1,18 @@ -package com.sum.spirit.output.java.action; +package com.gitee.spirit.output.java.action; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.Native; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.compile.action.AbstractElementAction; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.core.element.utils.StmtVisiter; -import com.sum.spirit.stdlib.Lists; -import com.sum.spirit.stdlib.Maps; +import com.gitee.spirit.common.annotation.Native; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.compile.action.AbstractElementAction; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.StmtVisiter; +import com.gitee.spirit.stdlib.Lists; +import com.gitee.spirit.stdlib.Maps; @Native @Component diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/EmptyAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java similarity index 53% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/EmptyAction.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java index 891fe9d3..11be0be5 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/EmptyAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java @@ -1,17 +1,17 @@ -package com.sum.spirit.output.java.action; +package com.gitee.spirit.output.java.action; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.Native; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.compile.action.AbstractElementAction; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.utils.StmtVisiter; -import com.sum.spirit.stdlib.Emptys; +import com.gitee.spirit.common.annotation.Native; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.compile.action.AbstractElementAction; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.utils.StmtVisiter; +import com.gitee.spirit.stdlib.Emptys; @Native @Component diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/SeparatorAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java similarity index 77% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/SeparatorAction.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java index d4295e0a..5694b983 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/SeparatorAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java @@ -1,16 +1,16 @@ -package com.sum.spirit.output.java.action; +package com.gitee.spirit.output.java.action; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.Native; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.compile.action.AbstractElementAction; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; +import com.gitee.spirit.common.annotation.Native; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.compile.action.AbstractElementAction; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; @Native @Component diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StatementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java similarity index 76% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StatementAction.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java index 731f7f26..f423c093 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StatementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.action; +package com.gitee.spirit.output.java.action; import java.util.ArrayList; @@ -8,23 +8,23 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.Native; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.KeywordEnum; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IField; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.compile.AutoImporter; -import com.sum.spirit.core.compile.action.AbstractElementAction; -import com.sum.spirit.core.compile.deduce.FragmentDeducer; -import com.sum.spirit.core.compile.entity.ElementEvent; -import com.sum.spirit.core.element.DefaultElementBuilder; -import com.sum.spirit.core.element.entity.Element; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.output.java.JavaBuilder; -import com.sum.spirit.output.java.utils.TypeUtils; +import com.gitee.spirit.common.annotation.Native; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IField; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.AutoImporter; +import com.gitee.spirit.core.compile.action.AbstractElementAction; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.element.DefaultElementBuilder; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.output.java.JavaBuilder; +import com.gitee.spirit.output.java.utils.TypeUtils; @Native @Component diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StringEqualsAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java similarity index 74% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StringEqualsAction.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java index 8d6500e2..e726cbc1 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/action/StringEqualsAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.action; +package com.gitee.spirit.output.java.action; import java.util.HashMap; import java.util.Map; @@ -7,15 +7,15 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.annotation.Native; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.common.enums.TokenTypeEnum; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeTable; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.output.java.utils.TypeUtils; +import com.gitee.spirit.common.annotation.Native; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.output.java.utils.TypeUtils; @Native @Component diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeDerivator.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java similarity index 89% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeDerivator.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java index 2049c508..4836f170 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeDerivator.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.deduce; +package com.gitee.spirit.output.java.deduce; import java.util.HashMap; import java.util.Map; @@ -6,11 +6,11 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeBuilder; -import com.sum.spirit.core.clazz.utils.TypeVisiter; -import com.sum.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeBuilder; +import com.gitee.spirit.core.clazz.utils.TypeVisiter; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; @Component public class NativeTypeDerivator extends TypeDerivator { diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeFactory.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeFactory.java similarity index 86% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeFactory.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeFactory.java index 99e2d8ec..99fd9ed6 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/deduce/NativeTypeFactory.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeFactory.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.deduce; +package com.gitee.spirit.output.java.deduce; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -10,9 +10,9 @@ import java.util.List; import org.springframework.stereotype.Component; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.utils.TypeTable; -import com.sum.spirit.core.compile.AppTypeFactory; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.compile.AppTypeFactory; @Component public class NativeTypeFactory extends AppTypeFactory { diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/linker/NativeClassLinker.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java similarity index 88% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/linker/NativeClassLinker.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java index 100e4868..10e87e6e 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/linker/NativeClassLinker.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.linker; +package com.gitee.spirit.output.java.linker; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -15,13 +15,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.sum.spirit.common.utils.ListUtils; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.output.java.ExtClassLoader; -import com.sum.spirit.output.java.deduce.NativeTypeDerivator; -import com.sum.spirit.output.java.deduce.NativeTypeFactory; -import com.sum.spirit.output.java.utils.ReflectUtils; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.output.java.ExtClassLoader; +import com.gitee.spirit.output.java.deduce.NativeTypeDerivator; +import com.gitee.spirit.output.java.deduce.NativeTypeFactory; +import com.gitee.spirit.output.java.utils.ReflectUtils; import cn.hutool.core.lang.Assert; diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/linker/NativeMethodMatcher.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeMethodMatcher.java similarity index 87% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/linker/NativeMethodMatcher.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeMethodMatcher.java index 57f4ea98..c87102a8 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/linker/NativeMethodMatcher.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeMethodMatcher.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.linker; +package com.gitee.spirit.output.java.linker; import java.lang.reflect.Method; import java.lang.reflect.Parameter; @@ -7,10 +7,10 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.output.java.deduce.NativeTypeDerivator; -import com.sum.spirit.output.java.deduce.NativeTypeFactory; -import com.sum.spirit.output.java.utils.ReflectUtils; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.output.java.deduce.NativeTypeDerivator; +import com.gitee.spirit.output.java.deduce.NativeTypeFactory; +import com.gitee.spirit.output.java.utils.ReflectUtils; @Component public class NativeMethodMatcher { diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/ReflectUtils.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/ReflectUtils.java similarity index 94% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/ReflectUtils.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/ReflectUtils.java index 81bf03a5..834bb3fd 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/ReflectUtils.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/ReflectUtils.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.utils; +package com.gitee.spirit.output.java.utils; import java.io.File; import java.lang.reflect.Field; diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/TreeUtils.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/TreeUtils.java similarity index 80% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/TreeUtils.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/TreeUtils.java index cb9a3433..f744e36e 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/TreeUtils.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/TreeUtils.java @@ -1,7 +1,7 @@ -package com.sum.spirit.output.java.utils; +package com.gitee.spirit.output.java.utils; -import com.sum.spirit.common.constants.Attribute; -import com.sum.spirit.core.element.entity.Statement; +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.element.entity.Statement; public class TreeUtils { diff --git a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/TypeUtils.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/TypeUtils.java similarity index 83% rename from spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/TypeUtils.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/TypeUtils.java index b9222949..a7b49a4e 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/utils/TypeUtils.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/utils/TypeUtils.java @@ -1,9 +1,9 @@ -package com.sum.spirit.output.java.utils; +package com.gitee.spirit.output.java.utils; import java.util.List; import java.util.Map; -import com.sum.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IType; public class TypeUtils { diff --git a/spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/JavaRunner.java b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaRunner.java similarity index 79% rename from spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/JavaRunner.java rename to spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaRunner.java index 953a40c3..19494c22 100644 --- a/spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/JavaRunner.java +++ b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaRunner.java @@ -1,4 +1,4 @@ -package com.sum.spirit.starter.java; +package com.gitee.spirit.starter.java; import java.util.List; @@ -9,13 +9,13 @@ import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; -import com.sum.spirit.common.utils.ConfigUtils; -import com.sum.spirit.common.utils.URLFileUtils; -import com.sum.spirit.core.api.CodeBuilder; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.Import; -import com.sum.spirit.core.compile.AppClassLoader; -import com.sum.spirit.core.lexer.AliasCharsHandler; +import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.common.utils.URLFileUtils; +import com.gitee.spirit.core.api.CodeBuilder; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.Import; +import com.gitee.spirit.core.compile.AppClassLoader; +import com.gitee.spirit.core.lexer.AliasCharsHandler; @Component @Profile("compile") diff --git a/spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/JavaStarter.java b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaStarter.java similarity index 70% rename from spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/JavaStarter.java rename to spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaStarter.java index 211ea87d..10545497 100644 --- a/spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/JavaStarter.java +++ b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/JavaStarter.java @@ -1,9 +1,9 @@ -package com.sum.spirit.starter.java; +package com.gitee.spirit.starter.java; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication(scanBasePackages = "com.sum.spirit") +@SpringBootApplication(scanBasePackages = "com.gitee.spirit") public class JavaStarter { public static void main(String[] args) { SpringApplication.run(JavaStarter.class, args); diff --git a/spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/RunningMonitor.java b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/RunningMonitor.java similarity index 92% rename from spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/RunningMonitor.java rename to spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/RunningMonitor.java index 9196be5e..91eb70ef 100644 --- a/spirit-starter/spirit-starter-java/src/main/java/com/sum/spirit/starter/java/RunningMonitor.java +++ b/spirit-starter/spirit-starter-java/src/main/java/com/gitee/spirit/starter/java/RunningMonitor.java @@ -1,4 +1,4 @@ -package com.sum.spirit.starter.java; +package com.gitee.spirit.starter.java; import org.springframework.boot.ApplicationArguments; import org.springframework.stereotype.Component; diff --git a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Emptys.java similarity index 92% rename from spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java rename to spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Emptys.java index ec384c78..0216ba43 100644 --- a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java +++ b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Emptys.java @@ -1,4 +1,4 @@ -package com.sum.spirit.stdlib; +package com.gitee.spirit.stdlib; import java.util.Collection; import java.util.Map; diff --git a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Lists.java b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Lists.java similarity index 97% rename from spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Lists.java rename to spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Lists.java index cb73d7a5..3b3b3670 100644 --- a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Lists.java +++ b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Lists.java @@ -1,4 +1,4 @@ -package com.sum.spirit.stdlib; +package com.gitee.spirit.stdlib; import java.util.ArrayList; import java.util.List; diff --git a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Maps.java b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Maps.java similarity index 94% rename from spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Maps.java rename to spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Maps.java index ac0284c4..0e2535e7 100644 --- a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Maps.java +++ b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Maps.java @@ -1,4 +1,4 @@ -package com.sum.spirit.stdlib; +package com.gitee.spirit.stdlib; import java.util.HashMap; import java.util.Map; diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/CodeToolsStarter.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/CodeToolsStarter.java similarity index 72% rename from spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/CodeToolsStarter.java rename to spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/CodeToolsStarter.java index b724d518..99b16a21 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/CodeToolsStarter.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/CodeToolsStarter.java @@ -1,9 +1,9 @@ -package com.sum.spirit.code.tools; +package com.gitee.spirit.code.tools; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication(scanBasePackages = "com.sum.spirit") +@SpringBootApplication(scanBasePackages = "com.gitee.spirit") public class CodeToolsStarter { public static void main(String[] args) { SpringApplication.run(CodeToolsStarter.class, args); diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/controller/CodeToolsController.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/controller/CodeToolsController.java similarity index 81% rename from spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/controller/CodeToolsController.java rename to spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/controller/CodeToolsController.java index 3ec23712..09e2c697 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/controller/CodeToolsController.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/controller/CodeToolsController.java @@ -1,4 +1,4 @@ -package com.sum.spirit.code.tools.controller; +package com.gitee.spirit.code.tools.controller; import java.util.List; import java.util.Map; @@ -9,9 +9,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.sum.spirit.code.tools.pojo.MethodInfo; -import com.sum.spirit.code.tools.pojo.Result; -import com.sum.spirit.code.tools.service.MethodService; +import com.gitee.spirit.code.tools.pojo.MethodInfo; +import com.gitee.spirit.code.tools.pojo.Result; +import com.gitee.spirit.code.tools.service.MethodService; @RestController @RequestMapping("/spirit/kit") diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/core/CustomClassLoader.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java similarity index 88% rename from spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/core/CustomClassLoader.java rename to spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java index 447a98c9..da7c0a5f 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/core/CustomClassLoader.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java @@ -1,4 +1,4 @@ -package com.sum.spirit.code.tools.core; +package com.gitee.spirit.code.tools.core; import java.io.File; import java.io.InputStream; @@ -10,9 +10,9 @@ import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import com.sum.spirit.common.utils.URLFileUtils; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.compile.AppClassLoader; +import com.gitee.spirit.common.utils.URLFileUtils; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.compile.AppClassLoader; @Primary @Component diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/core/ElementSelector.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java similarity index 73% rename from spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/core/ElementSelector.java rename to spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java index 6beffc1b..e8e2eec4 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/core/ElementSelector.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java @@ -1,4 +1,4 @@ -package com.sum.spirit.code.tools.core; +package com.gitee.spirit.code.tools.core; import java.util.Arrays; import java.util.List; @@ -6,12 +6,12 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.clazz.entity.IVariable; -import com.sum.spirit.core.compile.CoreCompiler; -import com.sum.spirit.core.compile.DefaultElementVisiter; -import com.sum.spirit.core.element.entity.Element; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.CoreCompiler; +import com.gitee.spirit.core.compile.DefaultElementVisiter; +import com.gitee.spirit.core.element.entity.Element; @Component public class ElementSelector extends CoreCompiler { diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/pojo/MethodInfo.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/pojo/MethodInfo.java similarity index 85% rename from spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/pojo/MethodInfo.java rename to spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/pojo/MethodInfo.java index c772d504..29df1d24 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/pojo/MethodInfo.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/pojo/MethodInfo.java @@ -1,4 +1,4 @@ -package com.sum.spirit.code.tools.pojo; +package com.gitee.spirit.code.tools.pojo; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/pojo/Result.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/pojo/Result.java similarity index 93% rename from spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/pojo/Result.java rename to spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/pojo/Result.java index 54330a4b..53787a36 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/pojo/Result.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/pojo/Result.java @@ -1,4 +1,4 @@ -package com.sum.spirit.code.tools.pojo; +package com.gitee.spirit.code.tools.pojo; import java.io.Serializable; diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/service/MethodService.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/service/MethodService.java similarity index 86% rename from spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/service/MethodService.java rename to spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/service/MethodService.java index 40ea3f85..e336d806 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/sum/spirit/code/tools/service/MethodService.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/service/MethodService.java @@ -1,4 +1,4 @@ -package com.sum.spirit.code.tools.service; +package com.gitee.spirit.code.tools.service; import java.io.StringReader; import java.lang.reflect.Method; @@ -10,16 +10,16 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.sum.spirit.code.tools.core.CustomClassLoader; -import com.sum.spirit.code.tools.core.ElementSelector; -import com.sum.spirit.code.tools.pojo.MethodInfo; -import com.sum.spirit.common.constants.AppConfig.DefaultValue; -import com.sum.spirit.common.utils.LineUtils; -import com.sum.spirit.core.api.ClassLinker; -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.spirit.core.clazz.entity.IMethod; -import com.sum.spirit.core.clazz.entity.IType; -import com.sum.spirit.core.element.entity.Line; +import com.gitee.spirit.code.tools.core.CustomClassLoader; +import com.gitee.spirit.code.tools.core.ElementSelector; +import com.gitee.spirit.code.tools.pojo.MethodInfo; +import com.gitee.spirit.common.constants.AppConfig.DefaultValue; +import com.gitee.spirit.common.utils.LineUtils; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.element.entity.Line; import cn.hutool.core.io.IoUtil; diff --git a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java b/spirit-tools/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritCompileMojo.java similarity index 97% rename from spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java rename to spirit-tools/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritCompileMojo.java index 84d88beb..8103597a 100644 --- a/spirit-tools/spirit-maven-plugin/src/main/java/com/sum/spirit/maven/plugin/SpiritCompileMojo.java +++ b/spirit-tools/spirit-maven-plugin/src/main/java/com/gitee/spirit/maven/plugin/SpiritCompileMojo.java @@ -1,4 +1,4 @@ -package com.sum.spirit.maven.plugin; +package com.gitee.spirit.maven.plugin; import java.util.List; @@ -11,8 +11,8 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; +import com.gitee.spirit.starter.java.JavaStarter; import com.google.common.base.Joiner; -import com.sum.spirit.starter.java.JavaStarter; @Mojo(name = "compile", defaultPhase = LifecyclePhase.NONE, requiresDependencyResolution = ResolutionScope.COMPILE) public class SpiritCompileMojo extends AbstractMojo { diff --git a/spirit/lib/spirit-code-tools-2.1.30.jar b/spirit/lib/spirit-code-tools-2.1.30.jar index 65e288cc05029e29259f523117e23d0680d82cd8..6e56f6e6b67a0b1437f9dbdd2ea1b2c30cef6c9e 100644 GIT binary patch literal 15143 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 literal 14993 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 W(Zs+$1H3t|N!qcFM1m6G|NaL6hAgZA literal 38806 zcmb5W19W9e+bx`qZQHhO+qP{x>Daby+vwP~?WE&Qck-vtdEf7zGrn=oe{aTK**h6k zt17deHD^7j$V&kMLjr($U zC=OI&KoJygqzT1) zKm{RB2bx_DWHtVa!m+&h3@ z68lBJr#d}-y7ac$cEIaT&kq3m@Iml5gdYg7;N4a|Y3 z%gH$yxEdE--`Ce7>^-%Z>J?mZEAEEQzmQsVY8 zc7Ck9H$gTK$mkXosd5#qd=Vg>Rbgf9gbn(*$)dze{;lTg3%3t{JuNFm~K&Dwyq|ijg=2B5r?Mce$NXD)I?ihh4gjq075FRqf zb4Jo=SVB!Uv?0{}KA#dH7grz(yydc&mfm~S29jR9wYL;SO*v67LF2e#sI;Cj$J``K z&eX_liprx!ar@=bJe%{-vH-WZF*E}h$<4;3hSjkpY3nDbNtj?ev4(7gLZ`Ya(s;6| zfY8m8E$9TOO5oM^=kF!iQcGuL^vvI;6vNydy)Gc?F{VZ(v^q)>h;;oyy)b7b#u}W2 z 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 DkoIwf diff --git a/spirit/lib/spirit-core-class-2.1.30.jar b/spirit/lib/spirit-core-class-2.1.30.jar index ac85a896232f28adf345aa45ef980c73f24f7c4c..6241165c172d745146a4d801629c69dd05551ca7 100644 GIT binary patch literal 41312 zcma&N19W8T)-If+V{~lWwr$(CZFTIVW81cE+crB+$NIDP{?2#zzT-dV+#0n;)u@`U zo;la_l9T)f3<&@Z4i13s*rBj4LLaID003b4bs>FS(!xso)Z#KCw9@=C;v&L|N;J|U zchVE%Qj*j(voMm>6jKw^^$K(gj5~)86q6I=v(9A=3S{CF%aT)KlZ*$44m1+dRN~Tr zP@E`4K*Gpgh~o-(NRjswza#O}6r4I0>iC1zPS6L^0j2j2fdJ$r!NC8%1Gzu<1^^E5 z=ia`y^S>{MuW$dmw|`Ft{6%JHYfby_DIouc!qnW!*!Vxt!T*EK(azk#-044%qx}Do z8`?VjrzJ4{?HGMK^Z&3G*1sKRXr=Gr@gGJK{+E%)HcsYF?*Cx|g8wpsiG#lNe>(Di z8}IC7ZsqtN)`$IC|9{26THnRk=06bsaoYcj_)9iu{^UH3q1o4A^=!|8Eog zB^=a$aGUyz1CIYXz`yRXdP;T*NP zr-K`&b*x(7*vOdbf*N};(D8CG#PgRG)~}@P8pMzkNs4B=?|4k!gX1_p&-wahAPjdmB&V@L?llMk(Pr{C(zJBD&(>i`oS8ApjmsmENz@n6pL9}5p3tp_f@g7AMQVpZrkM#o*fH%Q5G8o1^eEv1m^!Ss;cOG1F9+no%^C=7MubPm zf*)*^(jK)H%o`w5l8jLOW{ zz2Aii0KoEZdGOc$BV=r%?`-AtCo>d`9c`^#{>6?;H3&DQMdXjGaU-3hNl5`Y0We5m z3w%mKig0l$7(ifg|DWJdn%<)wMAH)!5qDcZ_$@Ux2b)x&)`%N4EVbLp)Wjl77uJ@7 zF4u(HS2`Qlyc;Rz952&TjTjK6daeRIr#n2Se5bkBxmm$Wiup!aCEq=!sjU#ow-u_I?M*I?+*(BbMH&^}((1E`JkUS- z-~>M(i^0L_C7|ONP0$y0Rpdg$nzQ|=1{Qk`VNTdD2aIzQ8eC?|h{TMzcFyXS4-|Fx zAqyS8X3Ktn;F;t;2I>?iHnW=y3M`F!}U2`T~|IiO)9YkhBlMU^|n)bmx}?tl@aj3^th_dO^FnE ze`UpAK$0;z(!)DHT9*uoQhykVNPqBaPFu7tte6DGS0TfEO+G$;p<=sX7Z0JBqd(`+ z56_~Gi&=wc;|bZ`6`S)0qq5flA(eI4#EU8bOHj$8gvew|6e0>zw zgy@uf1e+G&tYsTcNZOpJ-s*28nL(_5Xtd3Dk!tZCAmP{re&9YvE_U+S$+7hBp4N59 zN|GKKOa4OxcHak}DQRG(;b#m}XTjkuCY)ZaipJ_QrE^mq+%zA)!_2#A@i;m@WwKA6 zOeQ6V#NC!hOZad##_)$VTCtFCyD8mP&aENjv}_id;RQ%AjvKfXhvSyJX$&$dIV!&e zN_6#9EpsbIZw3@@KJ@6RRBCC_w;CuPCDp{Wv~o+Ht&J*(?v9PVVkt8Lx8M~y?8k+p zs}aVKlVWoY(w>nu~7ptKF6G*@_=_c0NqTd!-!mj*Jj!wM$Ivrl$KfLKsam^wHn z!wm#NDdpUT-mbb{SRqVxp^e_uQ{E0(8BPtO>ojS!XG%GxTT)jQ=6a#-GYlPf5$m?^ zwwUxaXwUI%SRs03AZiSoG(b&cmZ)`XM^-Rq@JQJC?GLG@AwU@Zyf50z+b@1XM@GTs z9j@o_@zaf4HFXF(eL~J6R+Memt1s#<@-NzFeX5M!uKit?N?a1Xy$@@YWq!J<|CnyS z^_v~r_kfXSx*w|JqGHs&U{99gBeMJCiIQgNhPCJ;+E?n%jUn4fE6nxU<#XYNcI$Mz zV;-sONRk};Q@{38X1$ET!EG4TxdZBI=?14mb@=ldK^u!hXNZ#HJN;g{S6V+%8(aek zk~R`}HVx!yLEm(hTFCt=c$!|k6w8ZoNUa!Z85x2cigs@J4;m);g3h3-2!n=SCkE}> z;ZYnf=5WM$O2fo-PV^DojXBDqm@JSPO!GSQW5G=)xiDjsJY=|o&X#Hoyv3s%G0 zcMbxTnX}pwk1k8v63%4p9CGOBpEX%=%Q*skn^}qYI-WU4zrgb45{im_0Wn!l15vwjRn9mb_DA1@MdOSW1je2|Mu4GLhl}jdeLIE+5*8{<&2g+|0N99qBNuNukD0++{q2&L3GJV z>7jOU!||I?ydWT9M}M45C%CAI<--<;07nzW%dX*y5Sdv##3@fW<6+aIStYuk1@Edy z5H(!*$+Q(pnlD*+xNyV}wdQ#U%~+$p!A&75?r%Ca5&1auK`-iHAFdi5@Sj zT=_?|8f4q}nM}6q7O|CP7{G*|BNv8p9HMeFETFiPLC#%F@?>Xk<{Hw7!p!~G%OC=N z@+ClmdvJ+P4_}0KLWZ}qGotj*umc)W;XcSn2AJ2kujFQ{d)7u(=)eJ3bSeA*>CqFPEaBVfqv67zC3?t|~#0 zAvYphcKjHVdZ$6;39Owc60>M1(tParQ4HCIsKs(yT!GGpY_*IBl8!GV1PC+WTMEb3 zkk93U7A0nAlA%~ba~e350w3~9C~#yr#x-U5SZH7+4*(-Ajn2Jt*ML;z^Og_zSaTuv zbH5rchL%Cet00k8i?uS-h_q@0DNS1TkT!Dr@jnge${+Nf(PT)b6iu=@B9SYYr0Zq# z_0fuB3<~|*_?D*pmKAt4Z`NMP9K0Fot^|mqB*|eY_Mhb+DjX; z`q=kmtl(nug}H)MZlKo&?p6wr4D0LAE+jxW66R}^*}olAMz!#T?Fbl?(kQs>8yvEr zG2GekLENbB0cnLA2y}i!-8BG)ctz>RB+Icxz@y^F7{ONb%G zC=VwgZp~^>I7@C#PpB5ZM3AtsI*vI3R$HdN*~E0|T*}*<)H}aeOd>YjoW>~iEbYCd zx@t2f`0S@G?^H$ATFg)_@*LW zsn6+it?*|g%*#X$Zm;_8P89u9~rN4mtKN+tfSHdxar1+o0frShqkViv^= zZ~Sbk9w-Z=_xr;IU9CZ^x{nuy`(@H!R}B6(Kb4z;=a-YyyH4{WJW$kA5DN1&rSnY3 z<~S0~+U9V!T3F+cl#LYSR*>cOl==z-WfUxIi-}q?<}AQ$3a{N0{Es1S4^T$02)i_m zAfH!A(AROLR=dDsMpmu~1g5=q*>)vZA`^1SRdP#pteo>e;vY~jc%r7SCrqC=j}@M{x_b5^-ku=4f7*5<4JW(5K}J;9J*D|q zlg18}Lw3au_;ie6dc_Ymt9hjlqD1_n>gwNXr|KHsV+Prd*#{Hn3dAL`PZ9Sa%9*0o zU7wLvjk-;#M*=xLsHkAqiEwh?jybkPolLnA=kCD?x&K5B*M4x#mPV6MxSC|FF~ua56T({|6#yZY^B*w0>_w9XwfRA6nqD*F28WjoR_Cw z*~BGZyA&A_Y!lCIkR|oIWYs2ZO_j0y4CC<4f49X*DNip!YO-=IFzdE6OM^@!(QDMs znfuBLt!eitBB}CtbaryG!=^3RlbY6$fn8c@wYZE)dG>gcGT5*p>0YtOywxbxc&u|= z#dxtTL$^-K#UCK#4WP&Z&>8Lfbmp>^VE!Y}ZZ08G>_|nU2&^Y6w4!dAii)#m>qDDk zFNMWn=HZsnfHrF=<#HD*kSDZh6+DLrO^e3OZC=x^{U!P7Wt~ZUg>j|liJ07&;Y);a zrBr%xNSY3BtA{vkTl~3r*+Pe8gPFY0h@|Dcf+f5=9FW~6m1abmrWWZkO;RI*Gelys zKdz&)dSj>ga4++Fo(gq)Kqd1`tD(6gveZ>t$MgneIj6S0f5}?VcNW%#0xDJ4rdeUE z0|CY90=AR;rqi6_)}tx?-v;>~rAj5=9#~Y|0p&82q%|1!i7!Xo*EVjfFB_~bpID2- zin^kpE9t~DOggue#VVO;8JXKyd+&5!8N}nkVsqU|R)0NdpJ3b;|6IOrK;c~$uT(RA z8^5A#mEu0RT5wF0wrOwMoU5uO?`PUDNB0yk2h8=hWTbp!?Orzr;g!Eu^i%!l=G=7c zh|{Po;hfr8SwZ7QswmT5n8wJ6DA00Acvhy`H%HDNA%98@$9!rH-**FJFW5tM(-{Pr zAb%((kC=a^3}rnXoCkt)N-X=ARL+k3vWlO;BwRIY^JPPer1}HcxKqkhkb{FSlyTsW_j+j))Wo zv(CvgSJ{*)1s=NNZ(9aGc+$VmCu>9EPqCTf%d}yMcGxdqmI5EJ9Yqay*l%ExcEnN$ zL@ywN?`JCT`o%L1;n9ijBfamzY5$acXOg^^atO{EGDmvjc?1i*#Pd?z!+o6Tfs=_< zvb40rsAq!gD38{?y+-d7{RpPPxg?;t#z+`}5hBuW39~B*quYni%GE{6eUD*WR-d@2 zyFf8;&9Qp5!h~vwYHJHdrLeA;**Lq_h3}3wdpf$-h0`@^f`8c*Fle)dGVL2CWcoT$ zLeHofi3e&~4~mHTIw9ZB_*!VfxYLnwczaZA{Efb?U!ftzwsg?e%-pT83={sWbngvjJL?3*ARG82fjTX<3>}~$W%1>l;gRK=>@t9^@ zLa7n!a-K5oVE$ zzFHTkxbw4~<7hT2X;-`2s%l>lYz4F~kkgAdTKZ-r0*gKa?$bmb10NVit|26Z~PoL3L*6tMp`F8I_-FBnkoG^oFzj~xq~SHqUabK z*TktxUYVzx;v15nc#<%EzNIdEzh%aC7dPek;0zpK_nB0J-eH*~o38AWgWegfAEMv5 zE&00(T--)_aBvSQXJM1lQ3;B%Zw%yBx%Cv2d>g9Dr7D{2h)m3Z% zRk3*+A=1+)V|p_IG53@PA?V~r-GskR0XQ3=q1!3OE9^#1`qaMRc-hhc8b;%a3446W z=QhODzOuP6X7P?yv%7?a7|_71djoPbQsCmAJQ^jpe<)IF>5vM(=tYBF7(Q8OsASvP zAg~xGIZVFX>g3OmC`n2_)hb1SM`Lb2W@6p$p#`b4TtDQE8HeGjqh_(e314b|FIqTs zj~S1lnnS=`mD{q=0*Roo&qY!=R4dCo*o9}99aoF{qeb+wnu3?H?A{mu6G^LgYWK0% z!z3b#FdaiFXzm%)dZW}dk@LFj7X>8BLKsE(Ie~E!esG_;m9tC-C zDQighu*${GZ9ox@7Sg^l%w+f!;<{6wkM7hgn22Qts>b1~D*9P%JaRHvghkWt^XHPj zHH9igl1?Uc$-6?o`byn+(PQ~cm-sl2>S+vrLw6~z6|HSoU=_*+MGY_9_Mc{My!LRW zPkC}o+x0#eWke1*j|q5BIWs_sj&P^?X}7;uXRpQU96L;~nnv=yf6I5dnvj7@#?B&T zr3kh0BnaJ`#iT?+PT0h360QtRX2vGbRi`IwqE)iounpayJtg15-3v0n#n5wz6<_VC&{w~ERv%%9fx2~ueJHhWaV5HMu{_Q?~vP1?BUc&-q z7f{5viYh_*8i%jF%|W2zc@(IYm?km4M0P$_LI^%2XM>>&EJ~n2BO8wX%0C;q*=^y5 z8z$$_?8d7i*wB&Hkg4`D|FUEaeI2~qllk(wpHXA54%z)F0*!E%UO$BeIXpjRHkReJ z9!a3vrSe@dEp+9bOhy<`mozlUMG(Q+ zczha*hp3`yC1+jL`K8ScXsQDyC;C(O`Xh8Ld;N0gp@*YDvo&F%r;&n5W>%S~Y%>0# z&}?ckmE<#aILM2Go@8h}ld?E>Ch-`Xu!wz?J&22VG7<`6iDfrt|2}9!EmC!fUTUyZ z059RaIjB|#px3wZu@q!Mq7g!IpzgrWqUUIezjZ! z;7FW{|AZUq3jzVTkJx*c_4fAl0%{p%>!<4v{Rv{;u@0&4%&41Qsc%{q7lGD5ao2i} zNy8j&r)W7dvIM4YUl&W^U=d}@b=P#^)yTn&WKJ z{5sgl#XisUY&gbB;e}bjRW1og`ucu${nKu_7GnO6PmwY^1F0F&|S=^5A`i2WUxeR;;ufUJr#>Uo3-^tw8 z=6~)?Icdpn^l;va&FyU}nx5B}lhZ>1%@X`V{AwL)9CrajEzb-9=jfGwq2*)uXsM5A7gj{p?8moq74Ox4~Z=3@a=?m%6gdn#Qj)-w~$64 zwNO(mdSIlWI*9w5ohOK9F^*HLd!#2IHV|5<>1b>4%3XmkA*moc2(PPpJb{{e;`n6r z)O*DDaBev+f5~B-(U#;v(pZ#8KTes8MJ6XJPa#5b+HtQ5L+aXy{Cpr`e4DjiJCMn`sqF1Bs+|=@ zG#@b)up&8?K%q0$ns+eNXwxeC%^{pbX2%%j6m@f80CJ0U7ZM3L9EdnU+6!+7;t2?F zjDvzi<)&vKM2)dFI)^v#)xS>@srHwsi)u_fyFSTR~Lgn)WX?!5V^bRh=i_5%JR z*0qAG=jLkc1m(z5^)lqwx_fJRnW*-vUsj>@|f*{iUvTUkXh5G`fO$B1o z$kv%Id(Wzw*e3{N5P}0##;_gi0 z^?2%XCby5p)SI|px8WrUvAvav2KW->vK<2!C+;di7lG@LwkA;~efNR^{?#5`)_w>tF& zy0p;Ajk+M;%98;cEI!QE#&}t<@iU`#mtCL-1FToNAS9F;UIKeo8YP?`VnM?0AOr>x zw@7wiH%~Y}4ykwe!=uHLJ&25A;#(-?-T4BGWarzT z6DK+%s?XR(>xcezcabo)@22tB*GuUHxO`$bG|8RY2?&_ z=;L~Cxt5(ms+LS*C;a8`{$d4BV9we>lVED1J>dtpUf)$_pvk<()|W@P1QX5R&D`pi zZ2kH>W;zg|b>3tZA&_YqnX(Yke^mtIRIMsXuOs%{H;c~wZ3UNh3kw09y8-bx1mMe$ zWx(KW41!zKzKCt^NS{B$pTDEu(aX#*?e;Y|!v*eyDlW_S{}9`|W9K!kRuwvRTOcG}+~T`3-xDuEQb_2OVh1)zbT*-gAS+UzBu@S90He7!2P=5G8eQRI7;Th%C!4hiHQ3X`J zd>xFp70Nog&pJNY3~UeXYUXAM*XWkMaO=|QAquiZZoWmVi!|9T*aG+E7d!@E^K|I) z@W2HI_bc>*5g&&LJkjwW^kqJk1jm5Xsz7#N<0h9xo3%(X;3fuUm*g5N@@Mpj!(_*C zK91CTTH;-&!tq2*gWR}#@mF0gU-QA~4g~O5^ao(z%v}@v>Gg%4GY(DglakBLH!r8q z^~n?Rpd1Aw<65GEM{1Zj5fRH>WEEjkVqDfMe4nNOtE_F=Er>7b8FU{`e<*XWv{!A=?eAKegU7>UNaq@{_S)HhmqarJS=U_(`6v^k|i$5 z>yhPsszo?HErKDJ)1p9O4q1gtpA`ExDAH}i1$ww{-)o*r4amB17o{W<;*yWx+x73h zqHA(p*Gv>&(;C*9jhnVaN(HOTEy6?rQdK4FdIR8| z^tni6?htDFk0o4hspqFrF)6PgNlX(**5}4!!^o;;6OrlSlzU^~MGgx|l8_ul8xF(} z4vW)}dsMsF7iE^4Ln1}H`lv^G9KAq9Y;C48-BZvV1x2wDBbiY-8-zJ&k-QG+S~FvE zu?BbMhiMArh@FN>{snWhrl-F_h)+I)A^bm1!*G@NA$VXspV@cOK5_G#Qw^ z#>UARdM+Skx3-Y;IM z-Zy<}jn>^sJ_q3NA%=Nj_Q~IGc9R;uB3k`-=fxm!PC#Zv5DikI@9Iuw#rr6}MVxib9<(CbO1 z*x7%xOf|(Usjo_vW!lS|Fi1@e?Tc9SY+Q}73%*Ze=-1T&9o?G?YVa6Jjkd(StNd!U zC^6kp2$qRh>DVo-X!WR$t?6r@NWjjdi{GTNf6cg8{*fYlHYumcj=47ajp59ZIPG8> zzc9}+f}mhBw!oat={gFA*vmE{?uuAi?XdHm^Yvu=tfS9R&TD8yOl~2R@yVPDWjwWI zV4Xovh`_{u(gtFG*_JKVK3+ZlafscKqW+*}N%1_ez#~MHu`Z}At@N>A?q{QL9o!h1 z=o+?tupXOg^O&y86o@x>^=)74B;{}djMZQyg}rNG?wfgXRwXhx>hWqu@5ogOxygC( zC;fC((LVh1J9k1xM6BYN6`pUI#+e52KKfAW@&{%T26D~m8T2#QAC9gLI+bI;j#ckAj& zGiOur@<&F$RO}~fM9)v9feV-JHs7;)DV%P4EJOr?Jq}(#+yUA&84%4gDcdTvqNSUd z>MfCYZ}_gAcz4G##dE=uH_OjarHx3riXKrHf=pn*-krH zrmD?ht6hGOnbfMP*?|<0_Y)9VdXl2#!(}U*i+xN!cQ(Qx=m$kwQM)_~#CB%5NFI2}J2Ir- z<)}S8__MNH%69g2cNyO2W$V-U-Sag0$h7RYm`}h2O3Ptk-FYIQkQxEV+wE`GE3Qb$ zuK5mj2)$kX;CF0JVE%8ju=9k7wWG&3^U0~IG$L%w?XU@|5#u&6t*H3IS`zZXR z568!gQoDvF6K zii{^NqbAm=D~f1TZ7x(vVH8JbO)aYpb zAXiCtUuy?&TCrUgtmuH#_r;R2%fia_+Kl_Pf%DX2l;&YIBcSXP(qO=rNujW`qW!OW+d>l7t;sR%}vju00D_QAJ9oS)4(Gxi&VSDDlTAre7>SoOM(i|}QQu!XC# z`#`6zNUx!1&hN&_-u%g}sPYYICYJ52ql4Qjf;q6{Fto10$^&l4?t664&C86&c;gT2 zNV@9}!z+~hb5v-1pzz7UlYIc?QIQdtxda!4R2C$!6|!FK^7FbOWJ?n$`+eBW@_OGn( z|H&==J@=cbVy%d&jO1ejzFJ2`Bo{u|+?BEh{4)rp5o16=f*ONQn!mIVp zLl}tBp>;8Ye*>pz-c_k1!r#ADzvkNbs}|c)y+?zhM3q;vljTnw>|?VYJ?%YT%N;Cb zo_yulxtpG(!@%9$Go#8<&hm&^rKe`anMH{%BVC==1=ps^sy)99GmPA(e={88tp8f% zn?p;>btjiX+Ov>hp8mnrFHp6)j&9e7zzoC*ss*VF^$ZhiG+PQ+>onRhXp!GUybLePkPK8Uq!s2yCpAboM&}VX$^V`*%eQ(w zv;|oWcEvA$N%{1n*HU)M@qojJ1FWpiR)B6JLQQR>>dbhX`N9GpHyQjMF4KLB;!qjo z2#Mf6lhR_U%gmYECGE$!Oh5C0 zx8l;1f+wxC_$`LW^^aYH`Z1`gaag0$!`V75o`s*iaD}F`_FmJj?%u*roHB!w#nB`A}oZM&EL z&{a?RTY)awOzqm*<|$h8vAlc9OHmI#C~p6p`3(BAA&CPB{CMJJjk>mpN0yhsy&j zkN##hGEe-SY(~mIoqMA@!+8@3eS?|6Yrk8}r+zC9q9Y2Fm7jadm?hZaw;X`A$%R-a zD^P}wN9!6eQBv1SIMNPZz+xZzA!xQAg7#Dkm4>2+_j8C`9Ko6aWlfBgiDC)U?*oaa z@R&{fu!HjM&|TzS4K2?f;^lz6K12W$+4h z+ofWiu6;o(4^ihv`07^(-J1gE@e@_|Rv0W!;hmf^ zRpJ_=^wb)3N6uEh2@Ibued-7&RrcZ^L{;_*3wf>!ucq@=9$Zf8uG+(#*jBosKC&%; ziVnXjd%|h%s@?;m@EN%kh2}MR5(npn*)@d(B0T-D0kIyfP!2tkTBpl9B(FDGo2^i0 z$Xo63IagaCTPyNrTH|$c8at7L3oo7@%~A`mL-elY&wDzNi}4SZ()F+t^XujnMiVPi z#2h`BE;3wzb}0_o7e8Z`HMxp{`936qEaVos3L2wi%@lr9R!JAdu^u&?bwOfM(!}JN zWubU@wT>xkTkNwKCM=0O-=-i%VYHH|Z~`ZL;sQ6{ioG!!7(G%dM3@q7dnSGzViFAc zI+#ovS1T3Fn#bGUUPsKrH}2RzS+#VbWeuv(KT0&&T*c2v1M zbG75`MC6j4Po7)UPekX;iZZU2qOfAt(qZat^}c!soe67@9;P1+V)q!s#}5ksO`*T~ z+7gC6(rjgjZnP$|*9gscWx6I{7ocAzn5&;A7^vSSn4ljAG=lUQMwSJ!&zAY^d-w5; zsoM!Uj&m?r#%`^NTM9akesDa*LmOZJxnW~W;*^9b^N>ZPa*}e=B3nSObig8TImFCt z%k5rel}M{4Q?Y$*Lu9l=#iv+LsSMhQKdojmFw1=b=S6vZ~|=#&bqCUHH>0MSx!3&3|Q;p z&z<_5+<_>*IV#0w220*V-GIrt=6D;v5$r&jkh8MPc4j3utTb-cvT`9>7m&-hPSqO(A?*%v2%i$30 z_CtXO^g-_i1*WY7()LA!^}9jnoRLtDm#_}Ya9m6GZ?i=8Km=kjWw^lo#=vJ#s)i>a z++)TVo#`0jVmR`Q0x@E8j|wtk@{AHTqI$rPl%XshM7<*|tO>P4J(BlERgg}W=dRAh z5GnOxm7iph>uf6((JbZZSBj@E8wOs?k$Uw_d3bYKyW%v9xypa%=9jUyl-V4x78lD>td(9zjE2}WMH1@waeQ_bj4G~IE$X2SRXo&=f8;noHR52gx{%kCBocZbcT z7)k;*9%$xrO@)ub>DC0N%Gn|kYKg5yI&lBp25yi2yGEc{WjG7ic#vCFfD66~m;cF$ zI@cAJO~%mJQ95{0t;Jo1XZ^6WL~~TWZYZ$_r5$)la-;GiD{Y`&n!y6(1BD>8zzEcd^;-+%|LKDK<^z z3IMVi*F41W{=fvcEpYWDPCLzQhb*_lwh`e}nfGnh<6g>vwLD$@m4iDV;{m-q+rKOv zv*F=!!@83gy34lr`@nf0$-@q(^9hxOVtlsvoWI+Fm4!UUu>Mw-$lH2lZ#^pEifyiI zm~Q74tm#FQ{$x8S@{ieH9BY(Hb|FqY8LDBjSU-o+H>q*f6cYCe;$77}cQlH-b{TFk7tmxL&mw)5l(u!ci__rj zF=AtO0-JgI_5Pecb&Bh1Zcj4)i7=e?oOSi;e&xND`@YO+yZP-JZ7azhU|O<;N^p=0 z76j+WZN{kMM_#BqIzrYl|M4#5wsxZ42w87}e(pqn1lI}y7P@^40tG@zBsl475wMU*1-o?5QihEMV&YtdiELRtXy$;U3O{p^lIF3u z9h&{IvuIC#tH1IXlC$bOgN%B!Gpk~a6}2MW0wya1vMOuF#DRdiXRxXu&_Ui&mLinu zB7r`Z*ilu<@8+Mv`{qjNpm!sAZt4-|jL42Z@9^?AM=Y1dmPO+lU&fL6b%2qQU| z7rFPNnjcGbF(Q2-EaxXxl?81<&wSXkKdo|Xi)#B+igVJK1ryt_cexgJ;LXR|iRi16 zxG#k>kZz<22FWqoe#OtNXNX7hlN58()L)$x*5y9i=8;Gj)W7q$PDQ~NKY_?!b;`Ot z@i(eRtLo6Em1)+Vj_#+^RYF9Ta1L8*YQxRUf(MR7reslCCn(34N#|dsoiABym?tV` z>J8^TV?Zetb^*MeK#?_Is>?P9j7FqODfrcs+bW;?yGWSUH7y|c{uo3yy2eMq%sC-{ zLg}j9;e4X0wjqDQK@r|ix%PhJ>v?#cl~r;wl&MF4gX2}WHhdH6m9@`;bZz0K+=Bt( z?VlEY6X>O_E!a_gYV_aUX-<&&#pEf(uxvGi&0r|PXLiI6(rt*Ruhx5|-uP4b8f+s^ zn08b5Ot~hK71=8?NPv-@16Sc%^i3Q9=?&c%US7GzpC7RO4S*Lx3`I zGYDs_&N+K(N@o_bDpVQ7cTf|kZMk|%RZ5lCJbxKVV|9@_o<_D*=t!%t5h3!jitsEKly ztOhd^{yR8Bi`I%%$Aui$MZ*AK!g%6k4Z^)$Bf(;$5dR&H`8LVM`f0=Uy6~a2!&LRf zS+0PgR#6KUXN*NHJ(~JS>8VcM@1pW#lReCft-&IYnxm(4?vtfx zG&kM6t);9wx>*e^E5HR?{l{Q0HmY@(Rs#&s5^!by_#f^`WEp^`3cU>4%Bl&+aP;2)6W*bhdt3w9CCMfDq-pF#7;eZuC;-$IWaba2aSj%K%L?zN!;RvDxF#CoPhb4HsW-XS>W$Y1gR6|ow61Y}<{B3M7P ziF>B(-HBiWa{s<@26$VB^z(%^;}U9zo?K9Xm#*YihOZ*1^THi!;(!K;*@uAL7l#HxBheQ!+Y&^(_@*obVaSCo zQ(Z~=f?G-8QXJd{qL0A|UXI9FvneS14373N<9?4+d4ihQWmVq*8EXVBJ5M2{TRd#X zHS=z}Hf-iY@-8cO>e&n*wILq!xIG>mBf>$@zTKnvjvd=CE7G1<4u?9M+y-^p2dU9E zLYIo2RBl!&&?*gmt!@tMkGe3OpsJG-RGV zOqhiU5w|UA&%qxovRd(jMki{A2%THP(xFh;4J3dFhNZK^hsw7St9i= zhix>{Z3tlwen7-zXgVK=gE)4J zb*PGda;u~(wlwpA8+qrSLnKqqn}DVf2zRBzA6u}4pxQ>AALTfC2mD=fH75)|-8Ie~ zGKYe{cD>;bbydjHDc(5kqt}Q^k64mP+&Cd6`)D0{N_-Ce^}xf36+p2#VPW!_MN!Dv zPMm5Dca}%Do^W7+`4Z_4JMDMe&p!k3znkrU8uY2=_{qz!z&q!w{QvLE+kce*|J9f$ zXlvtS?B?{BIrom4{_4+z9_lu?Tvn;{y~d{sb-YnI<*&s<0$xT%TdpaXxTLCIHPD?5 zfZY)cTjf?CJc|42wM{#Ey!;CG!xD>>O@fY|ZBqP_8(C@0y8k0FulI1!DK)6?h)Srb zimh&iN~o^NpuI8+T?*-@qttAd0m9ypZu9gLU->RI4L6)ZNPJXry|S_NN1`U@I=E;1 zfrb*h1UqdeQ!Mn6FEA@7i_M*>V^Gxm%s?c{d7{gQkn^==xN9zwM|?R-rR|&Sn=u{R zY1K{D#Kr!M8ew1-(fFWreDfZ0}m%{at^GtZnktYPK%wzF%@KN72d2kf6v_B}x# zOntS}UV;24DF4~ECt_}FW%L)6nM#&__R<oQLgF}2rPWu@rmbd*bKg7AIV8{>DwA$`^xy63G(dznmTy47zD7CMS z#NC3-&nl8HMo=iFkxFko#4Kf&5=j6}7)kEjjh*|1eYmM?!T|~M$h5J1{R5wgk_!JA zt#0%!>A9DQi=0A4r-dP&c1<~-is(346EXUy$gE3CFJ;FVwfPM3L3He0a_Rzypj|JG zeQ;Gr%~P4`=E0PtW4%D^|Hs)o1_`ze`k232g9IpYL5ZN`84 zL6F_WtCcpP+937OHI_)9YoujbK!9tQBxz(Wm_GDOZC0h}-e}-07e^1-6#B}Ws`BnK z=qNZss=z7kXzs5oNTqPW0Qt80j+cwM> zeAkf4#;V;KkvXf<06ey6?M0~-S9vi{GFu^jm3xl)7C$l4OiZ&mpwpiV7CfmHrA_jK z$dl!ZLgYaKlJYPIPx!61tW3=|g6g)sTG8V0XmqBrj%R0cU(}OGT4UW$BFQDP*A-?# zy#oB)9ZqHnVawa{5e)DRSj)@C2mg|~4e)ndloAkvFa#IUA?&N=>BtaRWH2BMQsTV@ z7UetCs~0nqf5oBh_ttbAdn96g_$~3TsLZC{c+*RWFOhOP(0;$FI}LDg^*{%AKKVbh#mA@y%KU1Z*pt9)wyXr)KSDn9HUjFh7`nMy{f1G~)GIOE-cdGoG zgZNL?`8xrT^eu565J1VaT@W#DYWnKUz~3eEQ0_$G1qDsoX1{2#TQiw3({B7K|BuAA zyRgmUmH>KS^3t36w!5334=~d>F+W1^m*FqppCTPhv(^Y4V~x~@iy%arQ&H@KRwt6> zZE?>koE;?m+c5eNgDJ%B$m^H!Lm%{Prmv0;Bl?+`A_aIKm}vXdzd`%So~E?sm?EpEgA72Utb z@So9r7&GHQ|BkEz@P9MB`Ag3#X84z!%kw{SrT8hS0Re;&b88u!Ppa+!1^VkD?LzcC z0ubIpk2@CKU zKtiSvw2-NC@uYnDi>c;JO~DT|e9|g)@tE2~nn^aRQmPp7QpO7s>u^q-s>}?V^6$3ZXv;rd07P~lH`L) z!{y;W;^K>wkp03=hJcT{@LNM7zI=-nwJM|XG2ahjd>wj?A8Auun zk;!>7Em{8p+$He4%LfGplJnT>H{eW1JQfz|Rp1|`V(SK)I_ zv2`3Nm0_ced>(2ved-9LLuj3DH(p$BZ9>Cgf$>xYPbYlkB=b;)Q{4?))Z`ABoTN_7 zpM`x}{|5+SA)HfW$#iueeiZ&?^N%@$H&={o@E07qewO(8*Du*Y~1+tS96CFFf z`@-g&B&Zg(Dl}qFNx9EnE~CUnV~H`=67yNAlgv>dBCgx@L8(Y1(P*tFqMJ7Dq3F4yg@OnKcSi0?TEmvr(`G)jrU%sLo)gzqtrc#7QXtQMR}{B0nP+ zNpWRb@S?TSA2MdLzN%0-5wZTfu)J*vi9u+OI4oH|NRiG#Ty+tlxb9g=Yf9mP{qh7% zDJdmL-B3!(X|>>XA9P<#R>YGvTaF^kG!-fN45`k!)D@Xmp@dH^ntjtwqJ7oQ;i47M z-@6Di^Vmdqy@X)L<_=A)P#(&I+8)}2+#V^7fI^!k7sZCfM~PY91??~?R=0Rv+ckaQ zM0|tdKzwL-kbJ1OX`wTBpu!jH+OV#PMiC_(=!K#E89Jj(G^f5z3nsW2)BSUIakGQH zv%M6;?^ZN4BH;VE7-=|-No*+v{E{2g=vKOb4) zYpfiUJG5I(^N9!azQ!AR8f{_ar>PjXE2vcm&X?Qf6UWLD^W$dy(BUUaM{Bq*600im@~v)ajn3a(gvLZO5@AKT@)m+5UmflOTnv_IQJV^5uQlT_ zKBS|-OV#h>x}cWn=;;n7cnaIHqVDihYB0Dyu}>>Zog$w>tjej|T@1pEs0xNW4r1TR zL`~zD@ye5HN-k`q$k_cEJ%pa|@ch9mC4A z$c3a0FPwB}6D!bb(l=Xu^Z!0 zVc}*4e)^NTYACjfpfh>$OVpoQa5?M%{d$+o#|{(2`{I(41kbeX`Z+(pqsXS`ge&B- z>5H3ffp)ZKfVMqR3iCEdL-i%Jq^hK%9gZdL2%a%~(<@%f{@!d-m*n04bDieAzO*OI z_6MC!;m>A(#e6*1RZ(MqmiIc`kh+0&l`7bwH5FdQC&9PjSGy>VDdJb`xL zUomih`u1O>x72Mmi%8X%BU-{@FUdN+C9LvDu8ZzpQ+9E6dc6to?UDB$WAn`kcS=TC zYb0j{XVXQ24R38v26%f6!Sfu=>k{PM=LBM_wM-8@#%UJZsGD`ybCEOlPK83HQGOkq zJGP=6(*?AIF|`Jfp+kwnRl{^7{=mIOXgIe>h|s=q?Dq~;>_Yo;s%&8OHDJ}-_Q0_a z9}C|It3t7ProD9B``y%e*lqzk{Cx zK<9wcJCq#*_QdPLg9G7_s3g{giXkEyHzsZyc4$)`)yzZ*GnP)^Y1t7wfZB;-p?9XU zVg2*r+H78rW_KIqnPfKFMXu$+M#!v^j8dLUF|L$FO)RAqul-4KhT}9QlSFl*$cKTd zz;(1X{7@UreQ1+}Wj^V(W}&aaOOcQVCwNszS-{SM-r=dos55mwef#vu=s9p_=jaPT z2S?i-ui5h%GiuiXQ1A;k|Hm8HNm5*Z|1+9(A5BVJ3@+WS$B9rEz+xbys%3E=;wvDGY{zg;k$NWN!VXII<*F}X{UtNVUZqhzKG zc5Gs@X7Lj^p|wY8lompQfb8J*=B2W9n{C4|+iyQT z7z6L39iWU*%0Y&ygl7n}(qyOH%R&*`lIo#JtL^Ps=@Xea>uO?ZjRZdA)4+FxkKFs| z=it;IKeW4so39T>9Nc&9sb9GoxG$tBXChv!bRnrOYP^VX;|7-FLYp3X(XQu4q4zkU zFRZ`04Mj72Xo|}(*Jogz@xE*Pen#$p?9oC3$_ufx5I8kPcvUpvC5iL3rwrCl-6JuI zrb{qRG~xd1@BMqc{u#;mv9_Ac??3m)_dNCA{$4>NXBVgM>GfZ7`@h>ZCaFj(FDRh= zvD02hQWC%e#iz&>u#5{OqNeygOjIdNnSj5!i_yhX|484_m(2u_x zcALtq5OfbO{PJ$4r-+W-N_0> z-AZ8vzIo~t3j7Orb=qdRCFu;J8ZG~q{Hg0v?<_A>xMt^d$AyHs1Xr*%J8stYGx!bd zz=B(IM0_QQ720z;To=xT*taB7u$8_|HK|#wgS3m3K$mL!UbXbPdyA!_<{Wn84&%5z z(FI(xJ-7|spil~LWykhjY*o%xUSsJhIqvKMdx335owalv!n@6`KOloX=d9lY@Vyk0BD<_yL7N*YICMY(c$xPQ0x`f4U<8HQg}FDDb@9Ub~xr_ zxyP?CknD1g;3bfIDyUSG*=mjsm;iHMr4u^SL_%lH1QvpJTTdO0Ys&sz^*nq3yY4aB z=gHV$+mwf-j#0G*64AGgswa}ZE1A`LIW$FVDst0=yH@u9isP`=sw2K5Pz#iz}3 z+y!0a@3@!PxcR5>2?C(Njpc$sV2)8wdCGBy>zHB;QnyIa%D#zDDs1kNqh@R^4w0uT zXq7^izvFk`eNV>-I0KVQScV}OB7H#SsW#?xw(vu zS5KtCF=?wg?A~>3gFPl@ah1>reiT!cG16xJ_7Rl-P0?}-?D%!aJmgc%(ga+{DOryC zy+(d67Mgd(v}Gh`JZ_#$Ubd&7a;7lQ7=xqeWh@iTqnn!PH4gbPGl!hXl=}R9ssC5{ z{5?tjnLgkT-uzSF>BI7!KL6iv-aj#@f35ZW`}voYu%WbIfH3lf&s!+F@TBipC zvvtY;`g-vW5AdLoke3@P0wsz`nrK>IY_d7j=%Bi{ja-6>*^r97+!^?egvT(L5*fT# z$uNmRrPWZq3?sgx+F_~@Two1~sG$HEYWsTg|28 z{r;=v~oL2c6U?6Bg7DT*RSaQuTz(hyQVz=;V1n&upbCa>rs=?Nh z&vKLxHJ$#7?6|d=xmn^GP1)_FM{p4O#xCwWlap`Ix z`Hz$aOv0zhWr(cBRPaC)*pf&YGbQfIPE(t~$0JqeCig7so0Xem03Sc-ehL6`{H$ke zCo0S=erU?Leji@~t3M&vgq@05%J*rL5=eVJZY;v~&!Mfm~ zvVTMeI}@GMUAzwpa{ar%Cb|T1GFPadaAgZ0cDX#rrxF=0W=*K z%x{tY9*_-oI0Hx-w#8>ZJKlNy7Xqs zr2*}M@|Pd&wVC;vj6}Tv0YR)mtO>gzAR;LsNf_WSNreCfg$+5j1cv%GS$Fd}g^DGu z4XP^NHMNcP6x!yZs%9vV@*?=WrYFmto9B+F&w2{plj%#79kV+8!|88xgg+;lU)j#r zZSOA)BY2>-S~}+=q#gyo*kAYhGuqm$!P@W8?6$QaQSG5;JH4sz=sGuIo_D)8y>ouO z10l4s3p~KTIr8(B?g|68Ix+yj!@b=i;`5d78vF71gMYqo@bygz`|(5$_zCgti^E3W zuaflODLZV&h_+6I$lpI8;^Q5ilz4nXWMukj!x=>-w*U^}Mm z8QIQn+=2h#_+;}hHWu|mN`P^A_yCgmd+*D=s#zYoM1~manmOJqq&HH~n58(aERe32 z@8qGqTf&Ei$11fQPc9l8asWnrACea*%gZ{Dqk!X_B`@NQyxVW$lE?5 zZM(2E#)loe*Ca2PWn+G!C^4k1ObhIJ9MV{+6fIgrgYF#$AVsqn(8PqYW-gs}P1s$d zovyj4cS%9=&}VL$=+l$+0g{T{r!SNr?X3Xa^U>A$!%Edh)nm+g@qx(C<7A(jE)M%z z9sMdY%q&G=X|7*Z7A6cEKR=1ZY*xLD(~?I^(Xe6R(;TMn}w0=P}7E+4UGsn%6fehM7874Z8dDyPzImr>)x_v7dqNkeisLR+Bneqp`ga|Z5 zh;26|-sMwRQ`l1vO&3_mBan$WswFj8+sL!SxyEU!b9E416TDmol~$OMmc&5KOl2;^ zM+(}}E^;GfnL;xnuTr;kVm~+)ZEY+xtjASKEvtHG8&#2`E6|?}?Jw{lG(Lj`PTlXiG>Lkii z;U#N%DWQrYHBfn~X#AiJiArbcU>Ik<+z`l9g;8~CNvN0VBsz5F$69Wvvr3%;O@0?* zgzB7siAtn^bAMMK7dMv5Txf;$AX5IxCf3{_3ca#ugT@C~CO|rCQm(kD3>JMNhidK9JqAf2xL_o+?@Gc^kUS62X~h)e#C2P}Zxc z^;(jQFPWG-&p2mD1<{{lyW?f)xIAlPAn1B2EbGMAV(}1t9SXW}PPQwZrTUC&I3rs1 zRsQjok|YMb^2)o~7AJuqGbt@kf(<&gNb+Np537ks{iY%>u+vsWLZOhA3vP#}l`te>(%}&#p*8(F+ZD*_}eM z@gqUsNT#8rBrlA6W|{D&@c2O`*-<}0>M(a15!)Y@15Im|jzT7d>rQZWcvSDH=~QMEQEbcPSxSkdd*OtLjapyURBqJy{(bc-d&=+G;gDs2rU! zA1otWF(GothKqsH(IRx1I-f3*Ck>7)e&)_gaJePC@MX-VAn+1NqiSI0|a}sa?dp0S=`(Am|OVmDxeR!f|C4_nD*q=tR)DZ&F>#;6z zO$4I!Z3QXaxDcRbpk^KTeVGNN8<u z8V(3}eLHeOx*9i};m-5GCAI$K^fWJb9B7KQG;l09V#c9=fTT+~Bb{m2WVtVRZKAZb z8iH{}o2|!I-JnVy58bfqK(ZQN9 zYh4b~i~~JT#-k~7G{$9Ak!`HRKjID^n%&3i?VEEmIwLy{WZKn5I;D25J-tJ18Ze)Y zxJoF^$hH>5d&B2F4J3BdW)&9J#*7-eq4&PSm}w4X59{nFQS~pB=F6e})Jri#4&lg} zYoL~ZYpCyeG(jT-#(|v_*G`XCZMIIzH|}9< zJqChYm=WZi;mZb!ySZ%K8jF*RhtBx1j%9iP!23v>(CIoX`JoHMKh%I*dovzr6+6N`U^A$rR0OfSqPXr7zt93Gy zX)^P8aLNO1Gs}dN?v?3ejFpYn!p+U*~b!k8t10bv*l(JOh?I8k+_{~J_f_|MB;uJ12m z*LPvLFih3^>5>r7g%=_ml^#?OfrsUHw{CE)X$NEncAsB5IDc;p61x{=F?z_)v}X_I z8(+V!9{{bxEJKFj#zI6%`(y}q5hqPPN&OPqVJS=Ls;Q4@4}7AdXzle(jnR-LqMFl2 zH>haON4hybR>`N(T`y4ht&nr%CR&11)-QUm>yb-12scZ;h|5RoZlm0|AXK^0#z(Kz z8U?ZG-L9vPn;x%%w^U&|8|1SqP1)J!y`SdJ?a}&&dVG+84E?JuL@DNdIoy-%%V0>8**JB9x~`bP!hqL?D-b`ADBzjO)&_|PO6lCxd`amVMd1622s;i z$^R^RC+M$TCyp1GSEx5TE-HB|z~;8AVwQ`MyUxsJK#xw24y?MT#Tn4&;62ZuHWO5{ zsm7uc#Qku;^v!!tD)E?=e!FIn3Le6Xd=tX8eH5CdTP!ZAn>qu__{zx+@u6(e$ES0( z4z))e&=7RAb`QE~3df=4fL%eFP}-6C%@OIGUilMJCw!L}I7X4d0hj%e30-imcZ5Rp zHtZ+)3(GH9;0y_@7nmIE7a)BmhWWQ~0P(avxi}6Injgy~G$U#{>v~33c2;zCddQo| zVPK!Csw5niDnS_#QYod-s;F(XzV+*+ozN!2>&74A;Ouiue*S`QfO9Hb4=}*8Fn?TN4Ex0;K(uHuY6vAs^1(lcCCbLp5jaA!hR@n|6&y zASFP!ixBBJaBIJE!)m#0$3JA*CIABdEm%3h!O&bN{U;fJVB_B=c7Ly3|Ey}`ke1F{+lTrU7=_4M!F@IT5!Vd)lHXwh8%7ofYjBjkzV42w z{c+UxF$SA3kXrG?p)6TVSSBq}qlkaCQ5-MX437Q~)?{CbjVeHIL1C*PEZJidHc{jd zqGO~f3D-UrUnrGUWDU`SHn;8Uq%9?|SB$ArEm={O~nR}BeuB+)eo z!a57|3x4=oyHK@Nr$CA+vT$A&P<5dUgY*o#LgEGd5AX&a6qHvS5kXva$C)+ z#N?oLiP|&IN=he>=7wWo8}CvknhVYT&uCH}m1Sbwg;b@EWX$7sE(Msih1(mHNse+a z!qpju4cW7@hy15NPLW+qgRmiPaP!>{5aObMErjR5jLrx6_F;ds=6>Hr(AM4( z$Rz`Gy?|3@8gskUk={EpD<3$_v;&`+uN0UwyZzZEkV_N^@~3VmG@q6zm>Tf>T>h_? z|MwL5XL9(fFvx&@Cx_E_+y8G)n*RoQWle33Or8D?@@6S(|E0_Q6P!#(YfVYv(UV)c z)od7f*H;)=7@v+1L2v8PTVlwa$mmVj(U5wd;WLLI>vIeKQV?k#ykDgDy#$oaYkr)0 z!<~{wug~ubb_)`Pgrh^B?~g6IIY>)vm*N0k0e8*SI-;=pZBv{9Q)PA1#DT`MK(&jT zbZ#~hBh06uC6$d=CSrL#5_ZTGn-|GaB7a6`pOYqQpF-G!`b;_?BrbYyigrCwNd5$@ zrFlNs4dEu5AIYmVc_Ey{#PbFmgCClJ>=zrVaF1)*yPjM(#z3D>u`E=ue( z(|lC5i#J$_eHuxhPrZ0_D2KbtZr+(OBtJrwhEv1Y5g%TMM`Y>eNq#Vwt4I4CBhMfA z-WaTzfKEt3Lkw{hBedd=Ae`>71iuUzu7xeVik7Y+g`CCgF-4Y)HDg4Rr`q*85F)JG zYB?2_+^J!fsN&*s7xL>0VA6M(iKQLHuC5O%U1{*+G(cwE;vZp^>Z5be98F#a#H-v& z&Z*>@MBu$ewa_GjE355ss?7{=XbOZB1#_LF@A;4B1zpmGwA$^c^K=JLlEN>GWB`fQ zC8?e)q{QYP8=Wmu-eKE@Q&A7#WU#VHl16_xA?04_#b>Cv?0|Bd^Bdfh0qTkNZ3nuM;J;7*}l*&NSFeQ20=XlHQIQyOa zzS{Vq*YiQ`U-d#6+H?xN&-i=A02q$aL#IywK@SJ6KZM-M0Yu#N!34qjHW7yxcaWKb zOf|czkITZzNI_6bifO)7-s+5%Bf8Q?P6AYTJQyVt#wbX~9@J?GqdFKfFbHvtM;%ss z`~eCFv;b-t1V}eI4Ig*;Y6{4z#q!)uU2fvU^_+)Z!Pi->cgHX_I05B0P#X-SQ&&w4 zT_cl8rpw*ML!kxUGJsR+TuDu90@k9Lutr*_#<_nKnncOcnj?-CM_2w(9A?7-$#P;D z`7G1zSjK3P(dl(CZ-MyDKdvNti*6S?LHMWho_6|qu`x#p^45H7SG{Pueemiw(-$d- zRXvv`rllt(LfPP=c`D{-qW>ux1Xp_2Qr5n1`9eZt3q1>jnPa-SNjC{=VU%UHB$4SM zt`*C)4C14d2<9n!eerSRI?Vok7JX7U zPIYM|RLjKc2IBGYxDWj5o1-1D9p#P2Z9LGMkS%p(!H;XIW%uf0pliJK3Rq@(8icD;AoY7Ld}y)o;r?Z>%@5 zRXd~ERWgS%sE}4G_h~z;c5zW}_IXin4uIQ^L!7D;wx`_mhd6x-_l;V22%1%=iwQOtDPwdN(9nlx5D|cfC;#@3U^%X}0o+&?dx%PH?!WB=?Sn z+9?s@Wp}7fZFNZ%jcu^CxteLN;Y3Ve;WbYV<|eNoztd)aow+BOLfKGyFKBCxvkxGM zZ~iXE?)b^He7<-ISkv zMWjbtoZwn2$cr`CyNY$T?bLW@Y{xFN8j^HcaLI5zz*y-7ye4J7QR>W(m+Q;ieA|*l z$N<12fw`$j-ORY#v>J4^+9$9ZVu!PK!lfA2DsVGFkEXn@q-ywh-~?#3fQ@Um|{&(91Uva$12+go|xV z!c9_(@li?+bP;;Aoys7s*RwLd089}C6aFGP_eeX61`-grX6jrbivWBL6jLmgdVDSscb;5zF4OwkFIh!a`zc_H@#6;^yq#>oT zh9FM)b0XNgo&3yP+T@mJ$G^*KJp8M?Is zlQluZg@sxy5gRD)O6?!41#OX)iLZd`Q^jIz9~F{&R*NU_)Na<*Q}~a6d5QnM0sXTz zA@IS^!F~fC+TZr2|IO{`fAmzUN;3aTQkA6vu7kaT`Nc1JDu6>^f*qh<8&x+LA9lrZ zCuI|fY}8wQS9--VMu_XM*QzW>KGI68dzO9X(*7*9Q5aQMXU(2vIp26@*S@gjQsYu= z+4FoIE4SYpi_hQX{e12HW#4`Cjt9@<_ypt+Yhw(u;gAuCE{4!+i@F+)F6rS2Vmdt` z{c<}Gp%{lO3hTPp+kBUoO=@nFWUf+O8^GW)?BA zB>QadcVd@k@zmD1Kd=$iuq84+`WHP@rbU{;FfV#M%@W1Apw+Yzv>U;YgWE)~*=EC0 z7rBsTs7en0iMWwVGafUXQd=@%E6_~Ol1WQWCkaF*k1sd0e)6ak6Dzs4& ztG!}PYP3SUNM$mqSk{}EEKRN|TLWAo3$PX=Grv*2M4Wa`cN59QYf&YxNCOjIi!FAp zSoEx%H$87puRr4^m$OFeN?qo79VVQgJfvF}#h(DBzE}IRkvPR^6xV)`Mwyi1t7%I) zd>kC*f-hf&`G=8uPaEdG*6K#N!E9Q}G0ymI@VA9FtL+^5@HphRL0qIjx_SO{y3D0y zT5y#G*p((qj$Ay4Q1@Y;G#d7NWaBOJK$2hKLnysdtcICI)=G6bptfX`k_U8#@_erU zp;6dq8d7!mWUcN>N3q;+5?^!bj$$ll3?;gw`HQ7K61l3U^CR>F>r7`EM-ZVNn>Rry?O{?kBI{b&oqrfZ&aj#GgE8=6-c^)>;E1 z!$i;$}U$RbC2CB*KVW0VW*KRSgBl}yh(}^m8#YWnfWH#&=s&cFf82VY#Kg&cMeRdk zeiej|r%nRVP}Idvj%#R`AyJobDP#&3U!ICt%ciP|v{A&=QiZ8bR0fNhuC_Ld88sSU}}U+qSbMw(UOJKc@<(3G=Mb+@{yW0C({wqEE;PG43EpYpyRVy-0vESulp5!KzpJ_3zR z8zMg{_H~Lf&@#!cwdKrE>tmELAo35i0?{tOJa*HE$wTBlF{c1>mgU7^S-{(u8)WDP@c$b`SOe`lI zThBLe#8=0&a$4NcY^4Bco1=Vlg=XkSSublIRtyr$TX?rltZ5~t{sL-Hf?i`SQU|t} z;anc4#6Ht_y>r&#@1jXL=X_ke0bdf|9}sS$#oKKj8m-bvJ}0b6m~pTsOQDE8Je zYL6e*lWFmE0AN@njsqS>Bmx0_%Ys8z6y0jYts)+F&h>NP*5yq%23rT1~&nt>QebuAZA* zCb~M@IW$l0%^G{VN}MM^&|oe$+HHdCnaZcT>d^dp^5%D7_j^%z)|Cz~A}t9gPIPZv z>gTl(*-Dfbyd49tTf%=jHcslfd!a=(B!sdC{({Z37y)6EHFzjSaMu$q)ur$brQSwx zV&PYjD3lg)icBzobjc60lEsExm)m!P_{q+Ze<U_Pf6%g`Q_Clqwx zofK%E;Ix?7I_}zLSGgxypLG90(hR~d1z*9tTt3EJ)8|aduIzr8U4OFoy8jA97GZ;I zfT&}Tv#hGdFH@xc{+GwoRW0qPA{1z)z7w;xdF}YE){Z`$Te2N&V4**UWBi-uqO zq7amqmlz0_@GebLNutzRV3hW#i%JwGH)-8E;w37qDJ&XL)wlPvJUE7>6^jS9I~Xgb z%IYQc(HGXb62J6CWT*rR$!zVm)3U&bQbKl%SuM(Etv2PMp_}^hh!Ip$UZvcWS|{(- zS`|_|g?7U!h|;@1!%%9-I7JK5$cud9^~0Up)EIGQIN6sNB4wW(P8Cb32p{+Xr$K@))WREX|8=+ z2aUE=XVfp9V#lvx6`x_u>%bdHL2^uS)IiOW_Ek>Sd*Mw@bea zn)#yinSsc)h#A+&T~S(oF7SbSA-JvW;yH%yjN>1iC zj#zTv6bhtUUJj3_TcNc)o1;WusL!ex_e6Fo70I%%^Z1(TIky<2Z3#M@@ac4TEM3+u zx2JHcu;ypd1j0LLTh7)@wa zj#gBxQCh#W;ZfW_g%4V1)Yg@TMs)Is(})j+Tkd*<@?WzQFGqFnA69T^S=WL@ZN zb~VbaaYxozmC8zlHz!}x5JoWELt2CG!VtbsGcdVQ4N@H}5H4fnKsx?%HQ{t4E_(S=)Z{{6?Gk+)!vfKnkRAiW$-LE&l{aDgAUY|Y}%mIi! z3JXwqEi?O6al2ZJ^J0Z^m?E&=mN;_T1!0A;WNmw2e({?p3ptLAF`am7g*O2RrUTarPOY{V_M* zK@xUa*FJ)oBK?0#yB4ULvM_v`q)3ROl1HV`?dee@jh?rphbVgJAvIlkT{kIBIOrnN zQy3P5x~m6uNsF1LF!WG^+*M2@5tTesGA7kD``pv%?sM+Bhc*7S?yA;mf8RO(zxO`p z?)~rYZ|&(5dbj?YeaS=5P0;qxE55cT>3HJ_r#^>Kb|2)Yl!Zq`96O(QtJSn>r5$VR zrA0D&$fPLNUo`J1T#+(Q_exxfb-;U@Cmkg=eI=~u zeJZKQ_-0cfFIH)rQgg*z+o3T%nm4)ZXjyjYe3Lo4XU^}2_vnw8 zm`}&oPK*^MhA9t>nxPiA-zmhUpfXo|^w8`4f*4ojYu>H$ty|?h<*FLiD(%tQ?bP^@ zulmDE1>=JG1{UtTmK$A16MCl0sVFU~hS8*t8}^_{+Mf7;t?n)A-^bB65O zZ4=z||Lpv$bee^Ap_S{hnCeu{{g}a&b8lxyIM+sQm-Tt+64<*+In$HnC12;UGc~lt zQ7GS8wd}%%A=Ydwp#fs~(M83X=~!=@&O<&d+?H+;%moq%Q1Xq)J=Y_Ewwr!er?7@nzH?{#StkC!g4uaxjz4j;eT-AsAK7Xh8PkLF$ z8u)n6d~(#0i#68mjVz5UGo8>P_Ur5;cG)>e<&XC@@pOuozuNWLocspu!2El<3*7?O&r&I7)!Iy3$@6yKu~-lm^6^|L zQ&FHR*em}Ba>lZuFt_cT`pMhdIf2dln$&}mSbn~zH|DYemS&j6rTi-Mq^_oIuT{x} zZr+kliA=-myY#I&GLe;jT3NSWoR(4dnxl|1_`K4$a44hq&3(Pfw3@uzja?0SHxBg_ z*UX#|7+>VQY_y{BLZi7>q6(R?$HlQw=aze@PO8ui1u@tRKDOTyi|8#;(IH!6*dbh{ zTi3_#F&W1YCY%{^e;@w9;7x~hY*Wz8jH;EgO<4;k5A?_HD1XQPsgC>k1pBNbGtYd6 zp9fFAO>O*TJ)dfscj-~42D#ThA7|B1pTY_KZ3SnIU+{8npLSn+QSyOL{OV;94}8Xn z-h<(bcXyWgPDNIQp`f6^KyU1kgXw-Ba6`f1qXIs-@e%a5kuK+A?ds%Uzj}?4ivxxL z%55nyLG!F+iK9V?-o_Lz2k_S z_9O-Xv6BXm1{d%31YuM%IIM+81ix)B4V)NVNGg;J4od-wCwz1^{^UpxjzyP3T#-xx ztKShPe9slqC{X7}9H1Zr!$L-=cph$iq{>+uFwrqCkdz)79hU4NdSsZ>Jry2| zFAfbjubKEbvx%gqz=J_b^e5i~oY6`QNC1bP01Jp@vNV|iPD~=+LN%A3K_Vd3j~sX# zhWKC$+D=b^hk+{FiF_OILL<7RgBu^YmqgEkM?%U5519yFup#Q8m9g ze^s-* zNEpTI%b3C~a>V`kT?7H9f>WnL9Y2`bF-AX@I{J;nwF4l4oFq8JpYNCZ*UkVS0RFYJ z&&~Yz2lDgRfA8!+lYxAa8QNOY{b!2Lwf{xo==@Jq@PAM_+L=3;JN?6wzft@B(%(z| z7qOwOgYiFbp#KLBeLM4i;KKY5T!vQq9v=U|NAQn)#x_poPVWD}j{lGBCJy@6|8&%U z=5}^6w{rZ4cmI~de~aB(-^JMGABc(mC-J9PXid$XjE!jx%{~vRZ>w+i4-2sT?-uw= z#x%cWO!JAol(n66iJF=zVCb92EP&vO->Lux7-%< z8Txo{ZNJQ(q626F+zKoOKLP=RWV6gFY>jdk(PK;p$9m{7vk5BjA07|*N{1Y3K)RIC zEi7F_t!6Knz0_k6464oSZKP@GcAu@om^eLcmK&ExDwC)$pg-ZHl02?k1D{&g>^Z`C zw3b6rn5DzU-8Atk-Ai6)*a_X(jJ4wG_u!R{u?yp>z*!ggbk9FM;KHjZ(tMw-Dm`&0 z*nA95V4rAsbk4i5q$0J=DAUY5#^53VEx4!TIO-CRRG_Bje1U*J4dmIu>JMy2gh$wz z6L^-`622bD3$Q6l|1<_48%@PscGa@)7$Dz4YIk~3ulw6>{E6~k*Ztr4uN<8lp@RYd z+`<9?aQp}S|GG2(rTgMa?smq+|N0hiHn;k3d1R`-Dt=K#en%B>`GQ&?Upt^`RT@GZ z1JFfj5Uyga@s$!8+S?`xrJA_i-c@j*YwN@BSD~*kmtwA>=~;B<$=3YIUB(79h*m0d zYU`2LqkWg>WancBvG2$0&=-K>YeOWAaWXroX0?tn1OEZS@JF?dsa;@Hyt=3F14EQB zum{9WDeJlh`XsTv)+l2Ymn8_|*xel=?G>ubO3X?u%b3`>CFU)~Jqz3BS1j}HR?2;3 z6_=K3hQGcJ6jSml#?VuR97$s-OY&RXRMlD_Q-*YErQB=l(?wH=dE{x7tL;Ed=$4Bw zw_2?vQAw?Q*^Hnn>qRS{S42fA=}ouOHk9Vqa+|xC2rdb7l~hWS>eD8q#AN9`2ra88 zwt*hIA8shf5mlI)G12*9`nuUbeTXhm1 zU!+Lm=4`>T1NB3Xvr0MV36Gmxt%>ffQ6Thrh!#=)Ew3inSDfF|L{EqREUaEA;gvMl zT6(G6cr24?G;wByc(hrTpIC>Z3G(s3JlmV!@NDyy zkD|6J=BySdSIT?8%>IB}bMcY@9(s7@P4w0Ld zH)0q!2pS*{pJUJ8UVb3O-isiz3OhXYo-4DbhjNIlCZg$ZTCh{CC~P=i4rEm?7<114 zhEb2Ed(8grmUHq3Rd<&Plq{VKi1l5gCwD{MmgH=Petpn$+$wR*9%pM?(?jF=&LtST zSRzH%7FGPz`DhN-nGxHJJP~lj)v1OXGeJ@#ZW}Ip!mYbYn_2K-qD`EKCwr4J6L8@X z3eM(yS&k}j1h1qG?zkmX9WEQGaE1n9x^3RvG1n&}QBuNjjAgU0pc)8hN;tNQ>ezjrN?S)3EvK_+c5A z?3jyB@CTt&gMA31#U3%Vlg=rBDa9I)c7li6DPpN;VbMPHo%%{~hJS!6kQd-a0Y$F4 zQHGpNblOL1j#Owd5Xy#)gQ-#361j&8uXAyKRe5 z8q+Sj`;r#3yyu({hj>CXX&8%iLb6ccj1Z3W7g&ir0xj>b<13>6bW+SXHpK{1g>+I% ziM$;%!b)ShGa;l%kuM~lB#A=B_B3H7_2z^!=%j5?YzWZbK~@8my<2}w z-=n_>lvx6A_}&;UCr9!K$adp+g1K&?y5iY8+$1*Ld>5rf@QAnLO0Y>yw$+bw0+OIB zrLdSg!{A~;A>M!;A4c~TP^}pedSH8rmB>3XE%~w6Ix-|iBi9_M!PSV~2xnn$LCF%S z5ug#LVQK^X`WU7sATrG#yt^I+(HlDf!A$;_SrmEjhl#1{vhfvAKoz8pd~#Bo*GsoP5DkGbjrUvBR}Yy>n!9xm})d}J<5}_k4|^@7veO8 zC*jazI4y_wK0NeqaSfI&b~MJ+&Yz* zzK_B|Cjoy-<~&85%6d!7Vo^*BeIF+2=%nM=G|qa3d}Nb$IGGVa<*CKvn5T&M@TSZk z)Pu`pd2;bx@X@!ey_5l5^(aOt`2)WA!_zMPaMy8~A<919lcL=^YYy`Gwmw5~@Xa}T zx|6H*%iUx@t@rnz+w1p^Gixmz8>6J2T0;$WPG3jb;igiy8RljkLHWugP8Oz?@0k)5 zCcH{Z*=g){a90OO3?T29iDU+s4M)E?&JYaF$8M1WM7E)k|fi-!eVd;1|!;+{1ir4f$CrPM2YfAA8E_1 z)!m#>#O(F$64by^Et=x}{1T6u(W})qbLkLinGui6A5^hEZiI{AIH&Alb&@)t(qT7g zc)3q%7r0(#m*ecwFKYz7@6OSimu{Y&bF zb0|IPVX>$t&s+q7HJ!h060K_5^TS9puK~xnXF5j~O{3z|<|Ls;+0eaLvVB-Bd6Ftk zXhKK{Jd9XB2{tFSqMqAwO-ao6aqbM0EY*RA{TgS+vAU+r35M3QT!J-;hoA05txJcM znLf!YN!^EWftxc5U7%nqyP$4$wP@_B)pr;g7puV!PEf+IKD`x($#HLr`1`S=jHAWG zmOZO@oj~@fk&OLnVBGo;_DLH2fRI*3I0;9@jb_wkJNekt`9B=}BxlOW*U-YFdQ?NU za?aYpK5~!AfmCx`UKE_K84{r1zPokU!0^i!ibGP>mP3rZa8m9$>l?$M@ZM$KhlV%5 zM+{aAU4ys5#Cgp`@>$M|@a3$rZ*YQ?#BUao2 ztq7Q=m)rv27I^cp-Zlpl&;wW%!swJEuAyIHp7pzM_kT?%uQb*^w#2=(%(W8jN$%z= zQH({p#>&ty2EW#aSF%K$C!IvfS&u|iIztkql^n{iWuU$ihcOqYRKZ_3uvD^05QJs|5|Mbc;EX@$Q69%6G;MfW-zz1aBGg!85*MvY~KHbh)os` zqCo5xql32#1TV)b#tAnf=0c%S@Dxn5@~nROuuQ>7dP7^|$P?CU$&wdYTYZ2j7S<(> zY`k@G-G%xfEvH36agmbq1VM45tx?cYC3c-4#b$5LJ%{RyG`@Q~O)^MTavGO0C^r#J zBuqMwIgYpz9UyWdmNb}e;D;sw;Bd^%i|hcd#L`&I^p z$(Et+xO-DPRdsqxb)IfN$4EucgiXGhP}+);(^hW-mev+f8|~xKvvR0qeOo1VST&y) zVgIIbFy!mizY>E#{my?6!DpyQT+$c^xuh@g0Z8mmCL_<64$-$5-%7S z*cUJx7cdzYFj^6?hrIdSw~RU^kq`jb?27(6pDM9`q;~m87`M_z(bx3X;M*Wq^HmW?UVlAP(i(r~JMAQO9h=N&(g+c>S z!<5dUM;I!mPXpN#?anhxf-{8F7Gf|mIas$9NVXMu&Ve>dKemOh#Wh{eX3QNVKV-bm z{wV%2-}!iwYn+lnbd=#R?d`hRap~#mZTo(|#rFZ)P4r|41?fdBzMD_s1%qdLUdYVr zFMAU%TX<#OQL)2B;f0#LmpXOZPFHX(+|j!$`SxV&L$K*X;$MC9#Dc18dJPM^B}EXZ z%Hl;8{L3wo?TIz~vgV04oCbAC-79+FQT@$tz!K9Zr8`=|4T4W*hd%yI$e*{_$-0kQ zyH=vSXe_$Px{ZmX?^a5dzixOnPo5Q}VM>>=3jH}wzxn{W%W}ms9!eogd6PVK0R=L< zq|Cx&f*7})Je&G5!!nU(t4%<5v<_(EMy9pOUYdXX29>H1NnU-E$w+v{PBk>lB=Ype zXhpq|R-;Jrf!xt3ufU|;+(LJuBFr}N<~HdlUVbE?(FDt9faLDF`)BEMp5mk@%8RvH z)xlACl;z>b#Kc60`D>Cd4ILpPhqTa!tg=~|)#QpQ^^^uhYO&SY^$6_{DpzvGO_(Fc zkK^StAV4@!K&b@~i+b)XF58wQ{!0`g@NeX}rxEoM@SaCBYg!cvs#30{FKynN6qtpX z2M!ANOEkNfRtspLp47HYpD_sSlgRZ=KrI2rV@2wF+)iADNrj^wIrWD9?Le4(UL{i? zY<0F)s}bri@du*L#TLnmV>#|&QPTqjM?i51z!sCF4A4Hhs(3>*$w5qKh{U3hYzJYE zg--J!f92aed5UM?iD%ob+J;)7A{XgR)y>AlOdq#|?;5~x%&fBo^Ut0)o{A z9NUd9=J~}dgHif-0-YD7VkI|^i>l&B&ei7eMHRyZu$jdZo!y5zbB8*1j%jAcs?K() z;z-O?o+?C*s}18ym#f56V@<|!VDR%j9Hc8hLA8(3VTz)coLQ22mc$z6WI>X*L=95i z@RxIsV3IQ)q?=2n_Y{+?pXUf~f*1vWULQ=7o^5TK$1r`0c8;KQosEEOAV) zu|U6RGWqT1?m>>9xcQIR?lwE&A3xy~Iltkqaq0}=IYk626lBcX2OMP&R74q%E66W& zqLPeN{j}px&2+;$uP}t*!0DqFQN!lf8A1=wryf+7s&NCkRIsbbg1(4zj51dA&TQ3S zW^3s{hGE0i_fA?;WnCXTw8%bR&SxcfQK96Ot)Dc(a#{hIlHq(lm6=5RvBPCE*OnPy zU)c&$0*>uUV{3&z;C!=AkzBe9Y9JtxRaBVO5`%{GA?4mzoOEeZF_!AwM>DOgw<@fN z{aR*ftsoE6>1^fhNjC*2`Ov3ts=S;TUt=-p%!2ciOXk+U)5b0QQ29o>abViZcflr| zJTu2jYBIP(n9rLSr|7bUnJ~k4mN3JCA!^uODM|^z06Tt9o+E0^ULZ;d-k`weEAl1k ziy^y=AvP4Lc}AWtkOX+YBHn}oO+2@_>>e}a8}B2T&;`DS;x=BgnI1y1*y#cbdn5)X zN=I>sZo(7w&Vp}F;J5bg6mGC-9>8Vz5v&MN%m^kVI~Xqm2rD1#j+p~zv}-m5KH#e^ z-A%P}YbE*RZoRtl8dud$M#y8l5;Cl;e9pU|B?_`dtT(?%Q#$rmbFkYh z@LEBmZK#}U&1S2%V`;bp@TypTchPVK_;3U*V-D`yMF@A<_k!7mC^)Oty8`l-@AQ1v zq>N}b`IedmrCEb;>J3K}dQ)q2H@c!&co9&|D$X8<8d*bCk36M-*X>PHYlQg>EWBZiO@s zFcP^*X)kt9e1Lf>Z?I#{HKC7AtP@S8ZYsXrVp}C1mF(B{y2CY&GSRxz2H)O&{vdFt z%|{-b+oFW`4WyUFXtGKs)W+>7b9~BPz9q$Nn|_a4Lw}-D^&hP`)vR$@RO1>ziv$Aa z${b*djvZW*LY7Fks)e0V5hvF!c~}U)n?qi4fbxx(JcJvlvQlX-A1K6c&tkb)`##-rn zeP2S&SELpRG8-069)nK@O+xAR>R7Aw#nWn*jB?lv^mQcDmGGJGcPZh|K;!Qr$N_CZ z=+kHD5%L+ZG5uo*@>d%|(ALJu*v(1!UoDNlB9TP7TA4n27GE zNl--)q@0T=hHc7Ps-e;x-+`e1ZtyGl@5#*2NYHg&ZCpQG$)10{?tST|AfDE5wSnpyDa8squX8GeBRIYhMpi*8|h1}^TaMj z>$~cu_+YIO0t4cpJ>LVQ!HFvJ0&gU?XMu7AoSY$F5QJ=qz$kn6Jyfb03q89#I1j_w zK32mHhFC^8uCBfc^)2h-2cLh%c7MY6cVNGT^Q3is0?POa?0<^wen-OM)^@fIPKw4> z#)eL||5cu`j^csp{fZF0h0gLGfUnb&J!pMK4Jwa7GrLkbQbv_-wJgn@5e$AMw<`jT z$V7j;J>kW4>$Z6TU~>Fo_IixaCYmY)Jy5xEqlOT&HxaDMp~%fqi_gT!F+ui$noDpV zMi%QZo)fY1h4Z1p5v6iZDLsOo5`zj{(|=N$JgIJZ^W(~2j&Qso6*cIUX`Z3Jbxa8} zwN?(R$BlC3k~#OWvxZA6L!AtPlDxMZiCYP+0yjjfZulew+UpE{SRVy%d!jO=3ru~J8kKt8amsVilvLk`_& z!6N1_MuYiPTGHCP(~7pHW+k#6%j6i(A>%r5lAPUn@TAzs?oE2p(KVSgh}k4l%4O=a zVQ|EKbda_3*kfTBwc!zt`T}k${OnzqW7mZxov9)=^g3LK{r{f z3Lz?tqP-ZSRECj*9G?l3(sgTX^XShWPVzx(P&@|qbMw&5y%uxqRaBoZe)<#!diI{0 z)lXICwrGymVscBj5%?b5i3Ux6ufoR%eRuR~w*VP@ZzM5(vEzw7D!I-8uYCCEB;6qbKtL*O?!kR}Y zSR`Q&J$fZCsRsYpQ|gRG<`vJEs$O7TWUk21+pY@n%(;;s2o1o$uzUi7XXfrthU%KV zV(F5XT>8|BFY$&=nS0m=hz{u zlAV>piUyXIw_|cciLnx930R+%X|=W|%>b<6yf>(F8eaK2n@iAGPUUiwo#c%JM75)) zYl~%Lnjtu#8~@~mIK>xz1w);a5kE7lR2S!sBGS&SQ`Z5sstf@fS|!z?);Wy$XTm2X zw_prP9+*!(A%|=8cSusWH1bT9Qb-=JdMFYXCVW$H^ocZe#356A#T}sOvb7sitSQvT zYR4>!`ROFs7FthC z3ZU2A;oF+Bq+6<7{jz>VS2z9e?guA~woCIwCNGWsSXoL}&SeTFi@WSKeaEIYoqMQ; zQxI<~`Y*HfSw$au5=oYwBFIi&Bmg75W<(Inm8IwmP#syaB(|K9NmG*pAx4XF6H$6W z){?W6?;)W_$|hK7ON1C8_Zu^M0b{&NxJx!CT;Kv#RFINt6FU%=mn z=udO=cSAHnoqT%nX@F8b4K&SvFhsu%^uMbV|K<7q@_F9T(h|V@2*J8!42F4wcn;vc zs1JkM0;pkt1o-SaIXL0Df>U?Xia6s7byonmlxj>=`TZezVP%h9W$&vtynyRF%st`( zvAymxZ^tD$ahLhdm&nLARaI!IbWS)Vlvvb1$H8Zd>O54rC1DaiL2%&#Me={RZ++xc&~Looh?H%O{8_pUrss{{ZCQs~9T!4(9p>R-YpSzx(r% z^5T+xUy(#U4{@@F_m}4UC=0-MyP|x`?@uy@t1<8CzCjLCqtIsowIp4XwxUnjz<&Ub#1(9GAH!?Gx+=MB zQXF?BT}O0@m88KsZ^WuzC~zjbYD_jZj>l?(8fdY)n2WC{?9WoWR=;GiEzo z^5}0yZE|Z_%r{b!_P%yKmvvSuRJf#F?C})jA1{~1N?3|DR^tXyL7ih%mruL%A}F`W zryu$BXK&umoVhi7cg1PnXgov%Hxp+}^MsV6D4_&inRAJHIXGcWk5JCkKbp;(om|tF zSxrhbFt-FSP`;`%e^V(0WUO?I^bflYSO<@=@Y(Okqt8>(2~Ro!L6pwZ5Rwc&XCV2a zGwrILW+QK^{sQ(}rhiKA?=nR}>LW4vl%?h8Bl!9JUlSt#uc43sIkRE+IT~W;U~6aW z;AC#>2s_pT6-W;QFzuQ9A$Mi9Onr99@3N|o7ds#YyqduLPJs=Y~zguRlM;aA6J!smm^u+YbXK_2U6 z4H)0w$NF>ge?L})?qTN8=W($AKX+d7cf?`%yKUwu_(xR6Zvn)QAnc2=CsZ#^?E2kC zA^nWB1rh`(EPMo%Qkp42$|S8xWIEqC7Iicm~q_Hx6=O}yd-j&@ONqL>kdiO}OKo06%dpC5G z4~|B;un-`4oCLjlQC>!L$(H)?OV3Jd;C>_YCk}r{C_#Mj1@#jhcHn=WtoeRckgIq|w)ScyP)QbkketO3Z1zlZ;V^Sbj>*_*v$o{EP9as?}=v>}PhWtrMZjcVF9H`sqd`ggF`Q!=0tKEZzYeEv7dm#~$w_2)p% zpMh|qJdf<>K$EwOw4i`luGg8B_0v_aN`JsAg+cD<1sG98T#Lh(f(Km&`~tW)03YPt zxFTRAq%s-Twj;*3JY- zhKXi_0Sai)3>tj|g0CV+Z7s$KzpPQg8GwHU0hB5_x zT$6>TuEuEo;vb(nUf}ozl#f4F7%EuIBa*cN7@|oNe*Vg`ZkxxDOZ9 zuFZs~n^(>?(V}pr^s((<+3ugP{vB|m(cFraPd8=z**yPe!1)avog6;(Tk!v$AWKwI zSDceWez(zFMN;^h6aYO+D5;50>ztp65rQFV3dPxQwY_GIxowa(PwXs`^@jBhj(Z1+ zgZBpbPCn!qKMiCp>Ncz`Gx?k}7ythJ`jgF%TZdANuo&OpxV2)~SlK@W913?=9w_?D zFxeHce=*E;UQJN*B!c$n8ACtod0G#>5>is_MujSDac?=Pu!uy{G*b=kwca~3i<-NJa3x}g2QTXzvc0Swt0q0*6}1*7w8HJd|PT9T!|b#Z1LGLoC^FGB@GD zE@}GaTwEpMDyZS8FIaFqIA$Uvgb)MlbREk{r6XM>J!HSODRrEe%WVj@n=fw8V>RtD zP`gl^z{NSiI`VakCGu4HF7HOxq@H%wSa8u0)pugev9ifAm5f4ore0F)RpeQk9)0K@ zJ|4HIssF6dy@YYjgxW;V7^1!#hvC#@mFlfOfT1-0L027QwP2LIqmjs{1oKsy;oB?a zVQtPXMiG)*)h_5F5_t)^L7M)7hT<5#*9t-3Itulyo$dr~WU!4UE?SbOKlKyMaXA|= zYwL*)=0wekLm6WyEDMi*TiTn6>p|$COp9^a4_9W-x9;x~(_7L=h~sTEzJ2ujhF03m7H1gfK*W=?L0W!YkxSoX8}sOPrv| zCVZ&`EtkXWB!1$@^WYSN%RQioganF+-xXgkIAhhOENB;&1!<;m0awfoM-nD>(3%~T zpR&Es?O0k|guiok8Onq4^M6=X;i7$fl4!2QZh3 zvk0D#jA>&qFl(1;PMJ%&PCXE}V83L7NpOH457M zJ){ox9?dtqoyzrf7FZrPEH>NfkT6#ev(3&0H~7t;L$6mp7v5icya6HBv2vcjy|v)s zsa$;pu)&7v4ix0|n*SC}@zjC`ze~XP+3<3>t-*`dTbCUceJkmc$4%c}GK7kHtp#v> zzM}BqJ?%4mdtzU*2ljIw7iI^evIprEO2$1>=9^09 zHSn$a=BOG}F4(rNYD?kj9H673JmB(n7#{g;I$Gwf1e0%YZ~YbW(PwmG3jN|}{VgC} zm+~nwKo^=^#ELnVSrN$Dd&&H@!ETi~Z-05?jg@z-mg$2#+PtzC7{g@&jY3xy(6q?oNpifbey+qg5(n#RolY6n_; zzUV!=_=wo5S*J_m1;W)GaftZVDlbtLe1V~$heJCna$)ROUBWzJS2OXzt#kh9)**cF zq{Lbi;?e=9wUkH&Tnwekfj!733dG`ru*&GKuS)YMX2T2SR?PWJFKAyM!9+>IZ}}C& z&(4=bND9`kUXkBKw*9>(i|dk2%a@dz=YD9i;WR@wG@yE%tOoRyKAX^pFC(xtBoGxv ziGVrcEb|XEN`1b!}9kj^7OnQ7i>?pn4buBKJ>?pKTj@X-F`i zxGyHx$Zxw>7;>y@EFhp71^aSh)Sso?SMNbOKtoaHfrxU}U!$c*ne;48BfhU*hfLH+ zkUBpI(oZX)lAt-_WWAhgufm}10{N5|HPD1gRl=6Qn%C!{kW*N~yIK-^oo-`EYD*(N zR%oUIhbLqs5T9dVAxntktfZ+S)QB`%ba(u{u)>tM>>M>EmZg>}_WP+uM>r$X2);>O zlYxn({I02RJvBR_Hrre)qF+#Fz4y1|sobXja ztL0%s5(5%QKcKDF^IjLd{JXnXAjk&=43qk;j?8r^YN{0U2YLf1QnNv`@U|z8;%||? zYIblenad2SQjYe=atJ5o2fS+iTtujqgb`%R(ftpD+@?7x z0?N#K7n}_cXB=%Z%}fH4%kqR94r}z(zd8yy=SAY4b5{o*A!gr$uE?P1&*XeRC{rVt zR2+D&xWiTPCAsehU9SLQnBh%Klhk{@mCmkUVw4m}M8g6?Lrcn2tWd_RNAy6FpJdd! zzhZNRZq^9{*A9mqAEVHykUvbt)%LN^Z6UvOYp7TJN!teVeL<`Flwy`61(+!=O45I4 zEbgTSaYm|>YA-a{Kr9uJ$f8cN%7y}7K|`6bU_0L0jc~-dD^-t_A`-2BDRtytq~9ag z+lGRzUToAvg0qzXy&5(2I3Kyz5~5C*iO6&RWD_g;r?|V z-db_3=y#{qDzlw73KbR*TOQV8Tq{u2=+vRnbnQHJSQ0Xsf399=xT7%=iYq&$u%99_ zP9N$0BH~dGkR~4pYP$NmXn{?=2lmCmkMe5{UKQlM@%#yC>b?$ znd0_no?xMW(CA#(x&XUf{0*0egbFZK&1K{&H2nqEq|_lZJbUb3iLfntw>xcBc^8C+ zF|m%DB3@HR(Z!mAraT8(S7AlUpHlsJ4z^`iQe|Y#xy8*|i8QeNr1z^UV=?EbQdnt6 zy5foV9({+Jp7cPWBO;7&MKR7s!S!Qpy`(BDgzm%{2o=+e9;m6ddIwUHErMD3x`TU) zGqjfcinZk^DV|%diiyMdO1yySRE#pp`E;InrxfO`(7tp@-Dg_BCN?7kv--rHq&)KAk0V2$((Ia}RGBX%Z?yds5m zp2+)?)n|@?)zIRjs+O8qnmpIjniAkC(VgX!)V-}P_Ez&~Fmsy89Ta}AR5DXCf?rTO zIC4*$4wM9F!GEd}IX8K33ijyaxU4Vvfs(B7BU&UY;G2)%gPi9O;&-_xjeF(BILQkscR?8eRc@NjdD5eSCz@8JD0C4Y~n$EV_|-XtGi;E zg5Od?eJ_ObO4)RiLFw_lcdPK?t4TM;7~cjWoG>;f~#U$&6-Rhw6@9HfD@ zaC4>K1BQU`9-S6aT^Fh@AEdxWFbX;N4#_A7c|Qy(rrlbsElDFLFL`}Natp2r)C9z& z4R4?#-)wos1-bsUG_^h|ZBRxw{|I?i;CwG-O?^Sl8EGL>c`wBk0=H*NMj&(Rm?O-Q z5xAH>nrw>h<(eH;u7(;0WN2ny#MfVVK4MQx(&cti1YUD5X|cjUH1^zru_?aSoThcd zgSr=NHPi<4JlAhS3e_gp@0jHEg&gfs^5;^lcICeCl0Ka^kNWYI-E>fqQ^GCg z{Rm{Gx3MvvC$WHwU|SeSmx(>`Il2UR`Q09;^A5K#LPUJ2i^&A$b8T5cR3LVeAtM98 z=c2XyHcIYrOe~T#7N=M|duFZRVc(YR@!*`3&MSCw*fT)zsjEh3rtqul(F)HBKz)OA zs82L{wW#X~Pg$4JnU#FAA~UfewMm(yNs@<)Z(jD%4aTx2{ndg?aoP&$+PuFhSn`Yh zfYyqP!u*WLA!Wn;iZ>hswYHcc-L3HDlG&m}Q7~u8bh%$&#`NwCF1D}Y*p@FkHMkpm%4k~8bjk694_6WSiKf=yEf)t(%=)m zjG*xr!do@H=53`*KdahmmaOwG!){>jL%V9#`K)?n=Q z2g8;a>?B+?hPTr%$Jod0Bs`J?kH={Z>vY%fG38rn#^%GZXuV^F+!wGT(wVY=ZbUlz zni4-{4Qm6^J%U89_yGJl`96Cp6E-io6>GSJ3yUq{>5b1xT@n&-8n*@9!<#WQ>V+81 zy}~U@_$w`zR@zOBG8VBja)GeR0<1Ge1QTx* zd8HI5b4SBh056G)U;`uu;5+fa$NSeU)i)j@)ti66h9&syDndN<80*!Okuvlby-Gx z!^{4{`<&J84@M0HD`}g&ncrP!*cmEWe66BEf#N(26_G%cwrs4 zHz10ug)7Jt^Wx_d!hpU;O^Lp^DE5*_O$0d9E)gs|O9HyVnwEzEV?kKb8hs~e=UP*P z_nbo^{d1Fbl29O5mo*Orvnj?P9;^8#0?Jx_xpS;5_R>+;IVW!4LLLnl}tWQlf&{Xx{;up$tE=jY59sIy1lR=Dk|*(!Cs~nt zq4civR#SW-t+b1G{v5Nbzv%ge==^C*g3^BJRs{Md#8sMdCPM96X6rZX zJ6c-C+BP>S)3r*Qhk|NKPdafpaTu5Q*RvPrT5TID!ANbxE@&-Yh5C!SRp<|NQ}Qlc zrTS0BGF*XnF?Y)w>v6y)`LiIrM>4L&Gz5gjHE0bTHSLj*ImWl{2exfziLsvCTM~|l z=aU*SuGbj}KC!r32RL-#G##84)p)`F1Y?zBvV$tdsB(h-UJ?!#Y)D7!iBk6!EQSZu z3OIdP0e1nz=6WA0}xd4(dbbkDbUH4IL)6QVw!9JPCJ2cw@qun1jU7<7Y*um6uJi#84oB*s#QOQ zxOMdXi)a|VVSf^7Cq&U>r@~g0xt zBq{x%j_>i{*0x_>lZdZO^hO{W{P^x3B*G7{!YXE`jK93ligbNL{RKE9*8Ba^>HHqW=_W7jm$eAnS9zz(dl!|r40 z#@kEKDy_e2F@GAizni=hCFcg9&nl+Yr`h}8)MBKKtqqJF{;b6$Dr(Ap;YWTCNus5( zq#$?uu^rjO90AXpl8_TLAEf4H-UrMJyOtZZvO&;ZpK_D#HG?4Sbp`&EA7L7@TS#Kz zT5md)%5n5MX?(c$NT&$^n!zzbcj0Q&?-c}lhjV) z=O0u$^uu5x#VPgFUYI6&X57o@M8p<9;%*U~J#S5uCSZGMU6lAxNhKjgDC z@@J!9;m{oxR(Sc6v+=7O9RpjpFZsmt4on7K` z8MvR5U#m|i1yu$G^2COev``D*60tkx#H)qDGPh-1>)SgAHXrs?D)S)e_@5|?z9 zDhWWoB+GD**s8eCr~lG<+t2~ptZAQNYIZ71)aTri2foQy% z^D>T}QA*Fs3i@oH&O=ov{JFPo(}Ie)SXpE7!s=@KLzC;d_sZO=&sMtriZ&R~`_p+k z+okvAN9N^g*N#8gcCnj_Mo&-x6J(IRE6n4zqLjBS z5Mt7HJ#`POSJV=3^)@s^ft@19#oiH`dkbF(B{xDJ=DKba-St@D!4o6jkKVq|r4xmJ zr3F+|J%t3=LJ2uUrJ{Uy)h)(ZQs7vkSKJU;+#r;jF@@1cOLuhgAB;P%+-xswFAaQc zZ?+=4v5>@?f#)=dX63X{3j|^TH8qPBTSTjV!Y?v`Eqc-V24|fLS6(1ZlfEF{f8m%d zvqn^E73Gs3V%SpJaDGg|>3d@&(X7>nBkAnSmMgiXlhw2F}#%u3zK z#x`5c1>WEjuY$DUqQL}j9@TUCZqSdzC{_SlZ?`^^?TkZn9!D5w-dt(y^bMV?0Z`TT zf#ad%q9r8jd`_FONk8&%-8+q|AG_FG1mp!$wYe_D8ZrSEom8`+s+%yg$^6tj`5~3v zkp0ep%Wxkpdbmc>^BCDWNm6CM^lh`C6QfparFKR}P&Qs`3>L zptGFo<4<+2qXPAPp*mxag3630bOhZ4ka)|D?zz37>GR3K|3o zq1aKdPDSy^{AykIWHW+2@TjwW$YGQjkie9ka@>^3PiQy;j?LH&+r*S{y2L`2jyY{4 zAnq)`$jm&)F3!wl{!M$0jL0lH!A9I}S95H&l*Jw$P)s*icLrN*= zO0gm$16#5AcA5EeN^ig)O4oF6nghO9ZrIVWA|H`^kSHJdrxZby0)!Rczf+D1DWQas z7q2O0u#i?Be>0a>QtDTa5fw@#EK`;z+NIRe(#ik6%5EbkBrpIFN`?A8IG&cO=3z2J zKW+%LUqd;A>{O}t`#Q;KETSJJX1~FzM5#e2yDp040HZQBT4b4;{}9OHL~{<5)A&zT zxtT2A2-%PdB}U!tfDC3v1I^hQb;|ffKL)p$BOQ#hG|Fq}cz+H?871tY_F{`)4oNCl z3$uc4@Y$IWE_iLd#Ap}SoBU+yhw4#~;?I9^@6e@}P%6z|?u=55LndPSn3e{cx zsp4-hy`Y}q_Nhk_BZctm=rquYQG>7i&d*5iOChBv!@4o*W`{4*EWAtV^PRfbtqVgO zs;twqVif9el=yKJh%JoZ**PRMX-4wrtevTcQGrHQ)@3x%*o(&-&H44z%{l34VXU?m z6vcnk=xBWqOLWPZ&ggeYIMotxBr% zbaIx-jvVJJtRKNj35SgqR>m2vQ#^%kn1_5@v|oD++%G}d!TG_!yrDm z;K0k7wpwOyu5A%?nOH}>IRmm8D16ML83o;3xo#Nf2Eb5)|KlVK59Ia z(PsH$`vyGP(o>R|#P3W$usm}2IKOC+=DkXwW0GLvWUhMZL`7qZan8ez?h<%*NGvpq ziEWXeJrNmQ36<$3wDbRP_D<1}u4}t+l1@6d-LY+UY}>Z&q{E7B+qP{x>Dad2`7_sA z-}vS{_}AWJAJjpOQR6*$>b;*^7rr^A#%a@NC&1QmOj#&|wi&6aZjaU^jgsd{qh2hC zZ;M>6XZe{@8e~!~IkGu}81iTKTEVH_xsp@1NW~E~WpqQPKUOQYvS{ChckF!0 z<%JoKpj!$bcc8fcWGrBW-2yrEdPB_)3mQA*wqw$`(lssx*7(9yZWtUbsAo5*&~36L zr#5y#)6bz|K%qhaI;{q=d{k}H2*AP~mVn~kPL@RH02*vh@)&=7aGc-$LHtJ{kHa@0 zuoF=nhcFC+fVyYiE--=fwERLIm#D0qII3s<#FeG$1~w*-jWr78{jq~2-@)F{?_tbK zo;zAw(ozG@DEz8g!vz&MQ8q_s8wE=On2s8#f(GQgnB~>!_S?3B2IOpgT<~@NO#YB=Pgv5coKvbV`<_=GstgLGcGK_5R9BGvC3{oM&xC@yBCFa>tKV zaVt*quJAsyXrskrzkPL@2X*0E2toRgQRfB?xEuB)a*QHeCb~Wu-E0fp>;nRXWrZ^> z`5Xo3ui27LVQfdQ=gBBp8n+=E6co#=KaU{4aJ@1?hR8gq3RCi-0__`=*NoEsx9}ya zi0>m6Qez!OC>PrtMqPMO(XOr0s>$#%O-v{)#1`Y7C6t3a8orvz!=AAG!&U_W$KAbH6=TZ$KlB*qD=xEj{xL^*4=oScrQb zbAGj{*dbmKarXhy6ihh`Rt8%t8)d5Qb);ZZwB6sTJKA}ueo<+QzQ0 zPEPJiOXt4}IsAL8u4HRz{0|&_qLTGjBZuJAgi_UsXNy|03$28>Mwmg^1)K*)FpI*B zCVm~xQALG!f0@?KL-Y>OeMd*%8z+|M^C*gGdId#@Frek)>f&OOW$I#bbyQuw1r)JU z8b%94Y!A1r46_UH*8*{;Ktq8UeJIKRphl3-C>PMj^w6|!%Eb97Nx1GaR|pKI__sq{ zGB88CW`2Pt<4#uF@MlWYvq+rgA6ll$*AJs+%+(A8brYJ9VQAu$3_~dZJL@YOw~{b7 zU*k&5Rmr4&bP&%V&+s9MMCOw?ORPnb{`&o{+=%d}B-tNi1}Vyhj*7pIFj=F4Oa$o- ziYpvy`78icT3rn$Ui9~6I~AwKJL*%Em<>rm`c>1|jo)PiT4pf=G+e$-?>i6dYGf0cMykIjAn;t-j1%7`IxPE-)8q&^jno`C*-G3ddgH>{e6XE6U+4PwL*1U#J(U9LkjVU0>Yx>70r}g4u=y}_z}kE;?}iw2il_5zvtl`bA-&CjuQUa|ZVJXCMT)_w3YJ@T{|lh~_YnAJ za7?;lD~v+{0qJ}-q0Ijkaw24GqVH_=Z>-k;z_tI4N~~0a^ukg8YC%U$$hf$~(*zWo z8yl6(99>$WNFallt)8Ba=5l5-1=h z=5KBT|6#a~3|8CHU^gfMVLz#k@aJ1{|QzJ3=+ZMGmEE`Hu)#p9jq zzo5K?*p^uz>^F6Lrl$KPGkC;OF^JAgJ%H|hV1sulZ(j`{IZ5Q z{e~QGZ=QE*m;>R*(ANHrCbw65@YVJ829W(HUjF*XdDnD5GG&(1%{SDaN;gEnjbz4y zc_s=uWh@56{W4)b0V;D2{fJ!VfJlC-4qB6;$-s8f$Q5#g)i{Y3mGyNC4i(u6D;Z*| zWjh+K9f%5x#(3`mLUWQ=k9d*wb#pTCKAxgjyS`45fyQ`2eIii=8=2Ne87gy;(8{zG zbaoRB?KZ&o$p>@hJP3A^iG6q^?&1d!!(c?2Ru$^6htt}+YIsBTOOr_Z0Vvj_=fi$u z;5WqEm;xO4EDZK->yVP#HF8SIJj#8m2cwY2Z&j%Dn~HaNOzOsea6wF1Hxh|hmB%(b zbJZU^zR}EGsmc1qrqo)hx>c@N78uw_PS|D86d4Y?h;fyVGE>*IQdas*h}{QqX|vko zll^46D5w9Rb|vpviYj<+ul1O_S&QH|(4iKFR_YGZ!KB45G!V+?Q1PNSX^Pi;sR5%z z1XvQkNwG!dnlvDmq=(jhHM+C`B1S#OOre#0;>?Z^ey{48sVE^eyG8w7X&yd{aXv+z zISd@W-|YJ(M!v;wdD1YUk?=*P+jLLL8Fz(K;4smgUAXi*az-0xQ;wqEAEQR3ZzfIwJNJr|&^QdW^BGcDf)y;Nh`2uor%QZ~pE{uC;1L6Izd4ilPR(!!F%w%3}t-G-}eD+PH`TYK;eS(AMIw4OauH9e-z z@3GU5IPlZ;BOHp3B7@mZ@0h=4Z&a<8Z`c5TqJB*r>oK}IY5BX>)%-erMjwA+8^2MS zr}B1s4-WmqC8#;3rf*Jn?1sKsxyR#H9rd{*+=k@T5t!_ZW8_nP%>f5_EHINL=Oj<; z)ka>#1oe|k?;ER$p-CKzL+Vj7Za2LDiK@NvI|b2cums)(DA{CVMKK=h5jXV&G_IXA^sgDH z`g*hz^3g`LlJ#vlP-1v!P-H^U_d@OmD;2nkiEhRN(7sJDmo%F=ORHGKNT`W&N}~yX=kZiAHi4qNkr8a3hm!1AyVOtxryhr; zw0%dPfP|xMli}RrP;O;3Y9~Ez8F*r**f6dg=|cq6zGKeU9E=UG$F!wLnykupHrVDj zt_Za-r)yUi7FUK^8CLW9e6+?Et%vmTDVh$|&Z}7Swa0lVkIWU$GG^1zzFiXvXsX- z&E0VW&!obfrLk^^&s|?a@5KAic1~)@*m){&a_FYX%0%0bx}5i)-+8>a!6qof1mpKg z2czt<`)L?Nzw@L?6OF=;Td`zzEv6~BtuV*>C@`9n+Mz5N;G$FvW0L!CYlaRn0Y95> z3e|6W7U)G*q2{eh)%e%nK1!Gs`GgG7zCz7Yo6%Nb2K^?Qou2yf4Z1c_geTJ1+AZB^ zBhnEfJj9y|fe$lwofWRo6Gix9?|N2ieR~{aFt0Z|Xpve@feqxB;13jx07`mlI7Xr5 zV?hXJGXiVSRr zQl0Gm2Q<}#g+@4%r1l(?B0i8|EaqWGS{`6~<*t1y%x2CW3328`?ar}@oAw%0 z6P5xcESajNq~f$oja0|ZC790P@StAsgVgKMha>mg`ndHkLy6QzCFYr*h_OWMZZT9S z%pmr~;X0CDU&5BRBxBFwW4+1B%(Z09^P`Vq|#V$uiVS+(;9ZIGIYFk2ljWh??5qY_N71E&lSR%V_EAU#PrvAu8JDPEz zZlt3}|hbgGtdh=$yhu0LUj!e$bAyMA7B zn0Sx_Pi9@fc^zLX)CVZ4VXOlfb==`F;{np8RxV)$`+8U0puzi=Q=i0L$dMbd1Gm+x zv?AOgIUVsBvAhl62|-0*QJ*~jRe3@fE~U#@cX(Y7!Zl-*Vy)%Ld*T7rxNhHSK!ot| zCG_um!h~e8Cnxpxlqq4la3>mn!Bv!5tzHIIt}w+_i{TkQS#lTeSSRmPA^K6FPI9uw zl>x~)A@u;n0YHvTL_(L+k{quS$>a$SSF`ES>6vkZh-_p8A=|9h1aqVF+l-oKH@tKs z!4_|ZhGso{`O|(wX@c4}=AoQehNBqFBgExOOd=)`m2wG85CMU6IbnhGEJ8?FF*X@9 z4GP?tjrN$wxilRa?qi;Ws*k*EnLYK1C#7`_GNNgf z4Z)m``*R%tD=4UTB&Z0BmV_A!iHpnxP;_~Xi#{3@-e|dNZkeog${X)M*Lo=e{54|J zw{Mth$=mvv*e4+~j#N0{IGfNpcwc%&2;C8hD1CR9W4Z$lVd{OIAXii^_NC_=Tn9s) z>vuz)NUH7#)u|F*g=9BxrGXS+12l@E)sH`9z$d{^TpI(cMp=-SK|cSrvH5#R{Lf;! zVM`Xmuh!S*{FLONh{AIUNVbzYP5sQJk*$emnzQ@{fG0H0&2)iDL%M2>Pn9 zk=07qMGp<5kq;53%ja@Oap-7J>xFJ*GpQ06X+oLocVpI*C#PdqV=;Aprz47S1)pdG zKN&bHF#Dt;N{Zrkp;XCOc`dVbU+sCKpaW2gwX5Ol7GUFw0V+zhLW22iIx+7oVDu}X zt==+5lR>$`0Hbs8Fp99mLpqdhB5$p!b-f+a{1?>HGqqkLN#0Eb+$S>4^YONxYr6_p z3LTLk%Aqy9S$j2sz#V%j?~5odPd)a_{Aq{yG+CCR3V^YyoGM4&?%tD26Voa+#sN}Brl&yzjGm%06K1)Qm zU~qF_=VMg~O^IPD8mLkN3;EGaCyJ0zJ0C2Q^IP{0P*&@5=j4?>2sl6 zntWJ1N$i4fgTEa7T!(uU*v_zr*e(9+8pdOnQeaG-`55aCRHb!Qrw#)#Qo`T40lPBN z#N_T@x}JYO$$y@4`{Snj;}aezQH ztm7#-ZTbejr!Qr&oZ{l*Cte=+gw=bD?EI^@%S^VXt}nKQ?9$z*`za=n>MlNTMPKp9 zajz+eTIBS1yPt5iFB|}H3_K(DiED)ZBh0RzYx;gffG9>3Blp-fM*kj+uF*46fAR-A zpc?dA*(-8!8MCYRS{h)>;FZ3^1+!)B=D*|le)*)1YwGNuIDSf8u2|vIbIM#!hB;N^ zp0xP&ZRAvxmm9Z->A4o*$jgo0ZE3_(HOTIy^%4_8VADZB~MKK>X)Rb8}}+|)NDI0b{~&WZ0{zm zU)lh`O}4rx;}S#PnHf)0cFK9yEoEYL%1xJ8BL8%8O>ieG>pF+e*H8)*r_^d;)XjKY zR=yZue_pE3D7XTZbekX@smg{DYFlW3Ffcb~v>KNnUU;9ZAaSu5_(ky5Hs_;AT>ws$ zz-qi18LEQQG0ST%PFKaFb}u4TxlNu-i!x)6-DY$qYcWah*Bl9X5YA7q&EZ;ILA=bh zF12oEYN`i(XKucC?5!tC>gg!StTh! z#7=|M`0YUEa>MFyA*1opNP?!7^Tg;5gvpf2(dD3l%Z$9aNboz@9@3~$M;8Le@k-vE zq|i6zG3g_C>ulc1l`21#k=c_3D!|N?n&lJlW?RAJ6-pUQhMSmT{Iu?kXA6+!3HxN})^Jq9iclTNyOpm#5C zH>p>|ETd7ZmLi5vnN8AD`E_A-iEJ{BzO{%HxyDA6S!C{6Jk%Cp`_j>kPe5pCs57bm zX-Ya#Mrol>g^Wbav|?3G^Yy}_MXBfz++kEFQ;{k>PD;^-F0$Qw#C$X_D)6ASJ(%cl z*2!j0!p`4aD*HLjzxAzw_w+RNRlf~d^2E{y^+UB0Cj4cJpfQCGbMzw&9K}|dyTmPh z_ae-de6!Rod6!_Y9W^~H7?lh)n!E|+N}jvSO{%uiP3uNykYdn$5OYv{kYn%-

oW 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 A@&Et; diff --git a/spirit/lib/spirit-core-compile-2.1.30.jar b/spirit/lib/spirit-core-compile-2.1.30.jar index 394140cdf6e4c9c95ebdd6e5d3fed0c1ca28ad21..3a92ec79886fd1319f28d2d05b640839f4543c53 100644 GIT binary patch literal 44837 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 literal 52230 zcmbrmb9AL^wl5spb}Fves;FYy=8A1qY}=^VcEzsPwv&qORV76ciLtZF7Ud9Cy5|8W0eW-p4@u7}CN@{IudSBJ|SyGU6h_ zib{0SBG=NRBT|yIbW`w>v{d7x6Lkssdd-ik^(lp}I zz_6Scq#(lRo~R=V*Ju&9qc;&mI0}yK3bp(YYKPc;xawF}_Lug+Kys3hP=7vO?jJV; zf&%)-%|0&kUmxg?U;lNpe?JZEW169j75%@T@v-+mW;i(g-7LgE&2q3cvo~}6n=OA+ z?f0R-xBTa1LmPX*->ks;H!JjQ&HiQ;-oIG|umo5EtpDzYB>!QhzM-R;jrHFg{hv1Y zINr?B?Qb?9{tq`Ww%51%JBt0M^-hjvmJWY&{%?l?d} z=nPFi9#-E*-}G-zWBKtn_2E(~m*(G5$9(`z<7XeIUpDPp4OEWenY?o6Salf8QCAl6}(^m3p z08(BlbyU$xl9wI0!ET_gQAQ1hvfv6&?%Nw*%GyFBjFxLQj0qeE~u22+YE}Xj@V)? zjArican>3J_%&OlEG)`Y&WvXpZdUIT>_o3k#!ImoX waM{Q(&hX1wR$j~CP*S3g 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 g9{)c>`^!RJP7?G5;Ti}C_vJ6 diff --git a/spirit/lib/spirit-starter-java-2.1.30.jar b/spirit/lib/spirit-starter-java-2.1.30.jar index dfc3c2ba8301a4b1d8aea5752bbc4a418ea1f129..d429a110e797e52c7819d13f35f8516b54772fa1 100644 GIT binary patch delta 4635 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 PGXohbA+~%VobCSsNFuqz delta 4611 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 Q%}7Q{K?DF0(&DZE17V%ILI3~& diff --git a/spirit/lib/spirit-stdlib-2.1.30.jar b/spirit/lib/spirit-stdlib-2.1.30.jar index c0e8bc7716a081389b730a38916ccb1143da06b9..98fe2291b2c65ecc12e241e165085b9f25020ce7 100644 GIT binary patch delta 4327 zcmaJ^2UJr@7Y;~KdPkZdCiE&rkS3jg6zND2fzUgli-E8Lg0zGhy7b;bq>4ZQMFgZb z38F|{3r*Tja93gXKRf50JM(6~d*{x)`|ds8EMG7`y^h8OJR-owix&ZOUM;%QD#8(W z0RVt?JiW9b7x?wK#v8Q(kq=9r0_vK4U`-riDLNpoGVKHESGwP5o@~AT{^Tl37uu>@ zBOhkG%+QsFqlsC<1?XrHUi@Y0#M;k202cw+J>m<27qHzMRv322ljUEH=wxK=<|1h4 z0EIvV&uN{*QJ%wjxjT3|K>q`N`TxPapf*Tb95SpcNM9VD(>@PJ_OxHZxy^$0Ezqpv zhyfP>aKr-ufM<;$Z{ukMUhK*Jk?&Z|=$5d>+I9Y*SeXvcHphUrbJ$;CgHNn}=H?ugjNHZ5y>A z`B$_2l2Qm0nx;iq^SWeNvvgb=vjq7G;$S~kKI1uZZv;6Gd`PsrM&e|mJt)15%2n&j zos%cqUxq~vvkkeB9{O8K#Wt;($Id&d78qqOz{7m-S!RaZ8{vTyLzY6$2mAR9NpIA9 zpJ7zZ0pUDC2m9K?n=1Ey`s zYF`_Cy}Y~E%)r z36Q6}1 z)z|CgV7b#SGJ2eB;v&<2Ge61h_}qP8g5n*FDO7)-H)3?>0rwO&nd5PqvF`Oc&xDYpcL8Pe)3yth?^|4NeSwAIxOL^|(v{U7#`b zD(vc58bKszU8EEqYsr2zLb#pUbj86|iJrLk?YJ`QHS*(v_=qt&eE#FqdfAPe$0^Mb z50mi>*mu{h_o84!o?R3m`O+Z;*!R9KqcGGps~RTw+>`V&?Prz8pWG=I=V)Jx$4+d*sZRgP*5 z9tNgNuFpc3Tz;)zbZ#zGH| zQ8gaT%b~Xs^PJr5iy1mhUx{9wyIO{Ki1%D?*`NY_Kvq^+WODI%$E(D-24s7;C*tSIs1Y+?CExye?WEWE%w9 zmZaR(9~I>hb1;*NaY8RV?Ar%zCb!6i9=7d_*X_It*|}H6bHm^79t@mE9kLH)w~K7y zCMvjye6qNs0L3RV`XckDW1jD;jmPWHqET()g?(PA2XQI}mAR2lq=~#aUXL;mQXpUT zjf9!hp?QS5pE73)Bk+K>)YC-wQh6PO>MlplsYujH;dy;Cq`l%t?p@LFvhfA~D<<@D z-jrxiM&pV$rUeFiV~T0XXR9o+{Vq5PN2$Ah{*V)9L)yoP5Cb}?jrCe?F}!vpFv$wJ z+*2|$PIE!Zg^8fyzU8S9IeAOv$rCPjvwoG*h|381P!!z5|GFIB!&8FdsM#2Vu#0i% zT4M!qL=jJTe`j;q`vc)Ebdzjz)vH0@qRV9^-A&hqD7!b;y4rDPVH3%3+Wiz; z!Koz`IW=3N%7a7S70mmdBfLSY>SKvzye399t_06z(N8~0(7QWZ891cDB6HJxNL9z( zp{F7>_Z74G$K?VRy+=y5eijr#06|vxvdo8Bzz|2oL%gSHYyqrFay_Gjs1?pO&VnhM z63t&?Ah@LD-SPa3$!1h#>0TH$P&-aq{wrSJ@4@wy_sGofId}yfj1ZeMPcoy>uhe)x zX}*kB_&`Je08r2a0PN?I=K3W`m>`%b85gW)q_3dWlPA!`?GZ_ViO%Y{P}%YgKt+WQ zob!`Epaed=V3i@VxC9=da>T_T)a;VbpVnHp8~N_Mz6l8~_YJnAaJp9E#l*M^K zfy&e+&n&a}QjaFOWU#8$;y|LUQ)hf8rX&5@(5q65m+{W^O~ZacUjA*cYFX2)dz~3F zqoa?044VbDI#>|i$SvO=AXU}(zVF>sH{mSCm>*sLF`(99%HCgNU~hQf$5cn0rq65-Pm3F!_374J;bR=K1lWo1^}?v_;YCAkjB+4I%) ze9Uxr!+=M7>o-wJgt2BIir>CR;r!eBOFQBC=nYDZ4i-C+gn_)ncMBc9p4J%yA_w%hYbdm)L$Nm??0V_66cJ01r^)5iRfbV~Jc|F@bO0(uo@$xJcK2d$ijs-Cgr@6`gL zSfriGT`(JacK%1iuz7@{AB}dz-e+pGF?uT82xP`$7D(7m_emon;+e7aw(adXeUDdSm5V3STC3&U zCghY&xN;C_!wTLU$a%3iuU4kIL6Z7XX4}1|ZC3COvv#ie6bx0X`T@Uh+Q&o^@aULb z=c{r`M6ZUa5BJ9K420l2DN9Wl8DUskXR(C{5lOVlx1omo2he3DQ}3B|d9fElt;>i< z;nD$l>&Len2w1L=Ff)4N@mP)C;Tmyi_hzZDkm97(cFfe5F7~gnoJ;{*G$5IYIri|S zFwf`)fYlG4AYok+U_RD?od$2alAy8B&Jtk*90Bs2?fX)b3HOjlT1k_5ByDKllK^}k zM+3?d`gYZ|I$qd} zJq{4-XXRQ=T0{1>;7lr7HCUb;%+wdo%Ocj#B6| z`)VZVcIvJ`b=I;c<*P$&3A@QqEHqN~K3v(M+8cj>e6O?lk|(~lE3)d%|H_Tfh&SU= z5};*I#zoth`f~B4K`#YqhhT&Xq)8*~vim*nsPOfPwR3_E)oK(Fw1~1en@2!ipvfgQ zMgzDy%-EZV=W&L0l579)I@DmTWYVCz)YhoG0%cCy?C67?s1L4?{c>O90D9|yTK@(~ zN!YVAU+@gbZ&lVN}J4)p0~rJ=_Kzb3dl9%sFa z&|Gnjd#Al@e`GdxTQ~JV7#NbG&yn!^A!y21I; z)7M<_9OpP{+Khi3czebgbA@^*|mw%}x%V z1sxe9#=?7Z3|h8qJW~DCTJzr%_!8T43?TXix6Trcb{uS7IGg-`mxa)Tnpz$THJnq@ z_&CA)vOyb!??3jFJ$kS#Qvyx0x?NrHakQ76>sH=cx+;}m~31hDo0@0J%b zb?GdA{SpK3&&&Mj+ewhQkn PIyxez6DPE(u-N|rZn!!P literal 5725 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 F{{h29C{zFd -- Gitee From 9d4fabf05941a9e9a0dae689918e1bb181a9a8f6 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 4 Jun 2021 14:04:07 +0800 Subject: [PATCH 44/66] =?UTF-8?q?=E5=B0=86import=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8=E6=8A=BD=E7=A6=BB=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/spirit/core/api/ImportSelector.java | 6 ++-- .../core/clazz/AbstractClassLoader.java | 20 +----------- .../core/clazz/AbstractImportSelector.java | 19 ++++++++++++ .../core/clazz/AbstractURLClassLoader.java | 6 ---- .../core/compile/AppImportSelector.java | 25 +++++++++++++++ .../spirit/output/java/ExtClassLoader.java | 11 ------- .../spirit/output/java/ExtImportSelector.java | 31 +++++++++++++++++++ 7 files changed, 79 insertions(+), 39 deletions(-) create mode 100644 spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractImportSelector.java create mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java create mode 100644 spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java index b5d09ec8..0af71c22 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java @@ -2,10 +2,10 @@ package com.gitee.spirit.core.api; public interface ImportSelector { - String findClassName(String simpleName); - boolean isHandle(String className); - boolean shouldImport(String selfName, String className); + String findClassName(String simpleName); + + boolean shouldImport(String selfClassName, String className); } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java index 356b419c..b45cb5cd 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java @@ -3,10 +3,8 @@ package com.gitee.spirit.core.clazz; import java.net.URL; import com.gitee.spirit.core.api.ClassLoader; -import com.gitee.spirit.core.api.ImportSelector; -import com.gitee.spirit.core.clazz.utils.TypeUtils; -public abstract class AbstractClassLoader implements ClassLoader, ImportSelector { +public abstract class AbstractClassLoader implements ClassLoader { @Override public T loadClass(String name) { @@ -14,22 +12,6 @@ public abstract class AbstractClassLoader implements ClassLoader, ImportSe return defineClass(name, resource); } - @Override - public boolean isHandle(String className) { - return contains(className); - } - - @Override - public boolean shouldImport(String selfName, String className) { - if (selfName.equals(className)) { - return false; - } - if (TypeUtils.isSamePackage(selfName, className)) { - return false; - } - return true; - } - public abstract URL findResource(String name); public abstract T defineClass(String name, URL resource); diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractImportSelector.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractImportSelector.java new file mode 100644 index 00000000..f565437c --- /dev/null +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractImportSelector.java @@ -0,0 +1,19 @@ +package com.gitee.spirit.core.clazz; + +import com.gitee.spirit.core.api.ImportSelector; +import com.gitee.spirit.core.clazz.utils.TypeUtils; + +public abstract class AbstractImportSelector implements ImportSelector { + + @Override + public boolean shouldImport(String selfClassName, String className) { + if (selfClassName.equals(className)) { + return false; + } + if (TypeUtils.isSamePackage(selfClassName, className)) { + return false; + } + return true; + } + +} diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java index 3d124058..58477684 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java @@ -15,7 +15,6 @@ import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.InitializingBean; import com.gitee.spirit.common.utils.ConfigUtils; -import com.gitee.spirit.common.utils.ListUtils; import com.gitee.spirit.common.utils.URLFileUtils; import com.gitee.spirit.core.clazz.entity.IClass; @@ -85,11 +84,6 @@ public abstract class AbstractURLClassLoader extends AbstractClassLoader return nameUrlMapping.get(name); } - @Override - public String findClassName(String simpleName) { - return ListUtils.findOne(classes.keySet(), className -> className.endsWith("." + simpleName)); - } - public void clear() { classes.clear(); nameUrlMapping.keySet().forEach(name -> classes.put(name, null)); diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java new file mode 100644 index 00000000..2e2f1305 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java @@ -0,0 +1,25 @@ +package com.gitee.spirit.core.compile; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.clazz.AbstractImportSelector; + +@Component +public class AppImportSelector extends AbstractImportSelector { + + @Autowired + public AppClassLoader loader; + + @Override + public boolean isHandle(String className) { + return loader.contains(className); + } + + @Override + public String findClassName(String simpleName) { + return ListUtils.findOne(loader.getNames(), className -> className.endsWith("." + simpleName)); + } + +} diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java index d97b14fd..b9122ce9 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java @@ -11,7 +11,6 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.common.utils.ConfigUtils; import com.gitee.spirit.core.clazz.AbstractClassLoader; -import com.gitee.spirit.core.clazz.utils.TypeUtils; import com.gitee.spirit.output.java.utils.ReflectUtils; import com.google.common.base.Splitter; @@ -78,14 +77,4 @@ public class ExtClassLoader extends AbstractClassLoader> implements Ini throw new RuntimeException("This method is not supported!"); } - @Override - public String findClassName(String simpleName) { - return ReflectUtils.getClassName(TypeUtils.getTargetName(simpleName), TypeUtils.isArray(simpleName)); - } - - @Override - public boolean shouldImport(String selfName, String className) { - return false; - } - } diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java new file mode 100644 index 00000000..1631aee3 --- /dev/null +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java @@ -0,0 +1,31 @@ +package com.gitee.spirit.output.java; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.core.clazz.AbstractImportSelector; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.output.java.utils.ReflectUtils; + +@Component +public class ExtImportSelector extends AbstractImportSelector { + + @Autowired + public ExtClassLoader loader; + + @Override + public boolean isHandle(String className) { + return loader.contains(className); + } + + @Override + public String findClassName(String simpleName) { + return ReflectUtils.getClassName(TypeUtils.getTargetName(simpleName), TypeUtils.isArray(simpleName)); + } + + @Override + public boolean shouldImport(String selfClassName, String className) { + return false; + } + +} -- Gitee From b8ac77880859f7c8debd808fa9d10125b436ed15 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Fri, 4 Jun 2021 17:07:10 +0800 Subject: [PATCH 45/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/spirit/core/api/ClassLoader.java | 6 +-- .../core/clazz/AbstractClassLoader.java | 4 +- .../core/clazz/AbstractURLClassLoader.java | 42 +++++++++--------- .../spirit/core/clazz/frame/ImportEntity.java | 4 +- .../spirit/core/compile/AppClassLoader.java | 2 +- .../core/compile/linker/AppClassLinker.java | 2 +- .../spirit/output/java/ExtClassLoader.java | 43 ++++++++++++------- .../spirit/output/java/ExtImportSelector.java | 3 ++ .../output/java/linker/NativeClassLinker.java | 2 +- .../code/tools/core/CustomClassLoader.java | 8 ++-- 10 files changed, 63 insertions(+), 53 deletions(-) diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassLoader.java index 8d21bb7f..2dee29a1 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ClassLoader.java @@ -5,7 +5,7 @@ import java.util.List; public interface ClassLoader { - List getResources(); + List getResources(String name); List getNames(); @@ -13,10 +13,6 @@ public interface ClassLoader { T loadClass(String name); - T findClass(String name); - - T findLoadedClass(String name); - List getAllClasses(); } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java index b45cb5cd..942999bc 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java @@ -8,11 +8,11 @@ public abstract class AbstractClassLoader implements ClassLoader { @Override public T loadClass(String name) { - URL resource = findResource(name); + URL resource = getResource(name); return defineClass(name, resource); } - public abstract URL findResource(String name); + public abstract URL getResource(String name); public abstract T defineClass(String name, URL resource); diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java index 58477684..833186b1 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractURLClassLoader.java @@ -4,6 +4,7 @@ import java.io.File; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; @@ -22,8 +23,7 @@ import cn.hutool.core.lang.Assert; public abstract class AbstractURLClassLoader extends AbstractClassLoader implements InitializingBean { - public List urls = new ArrayList<>(); - public Map nameUrlMapping = new LinkedHashMap<>(); + public Map urls = new LinkedHashMap<>(); public Map classes = new LinkedHashMap<>(); @Override @@ -31,28 +31,29 @@ public abstract class AbstractURLClassLoader extends AbstractClassLoader String inputPath = ConfigUtils.getInputPath(); String extension = ConfigUtils.getFileExtension(); Collection files = FileUtils.listFiles(new File(inputPath), new String[] { extension }, true); - files.forEach(file -> this.urls.add(URLFileUtils.toURL(file))); + List urlList = new ArrayList<>(); + files.forEach(file -> urlList.add(URLFileUtils.toURL(file))); File directory = new File(inputPath); Assert.isTrue(directory.isDirectory(), "The input path must be a directory!"); URL inputUrl = URLFileUtils.toURL(directory); - urls.forEach(url -> { + urlList.forEach(url -> { String name = url.toString().replace(inputUrl.toString(), "").replaceAll("/", "."); if (name.endsWith("." + extension)) { name = name.substring(0, name.lastIndexOf('.')); } - nameUrlMapping.put(name, url); + urls.put(name, url); classes.put(name, null); }); } @Override - public List getResources() { - return urls; + public List getResources(String name) { + return Arrays.asList(urls.get(name)); } @Override public List getNames() { - return new ArrayList(classes.keySet()); + return new ArrayList<>(classes.keySet()); } @Override @@ -61,17 +62,16 @@ public abstract class AbstractURLClassLoader extends AbstractClassLoader } @Override - public IClass findClass(String name) { - IClass clazz = findLoadedClass(name); - if (clazz == null && contains(name)) { - clazz = loadClass(name); + public IClass loadClass(String name) { + if (contains(name)) { + IClass clazz = classes.get(name); + if (clazz == null) { + clazz = classes.put(name, super.loadClass(name)); + } + return clazz; + } else { + throw new RuntimeException("The class was not found!name:" + name); } - return clazz; - } - - @Override - public IClass findLoadedClass(String name) { - return classes.get(name); } @Override @@ -80,13 +80,13 @@ public abstract class AbstractURLClassLoader extends AbstractClassLoader } @Override - public URL findResource(String name) { - return nameUrlMapping.get(name); + public URL getResource(String name) { + return urls.get(name); } public void clear() { classes.clear(); - nameUrlMapping.keySet().forEach(name -> classes.put(name, null)); + urls.keySet().forEach(name -> classes.put(name, null)); } } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java index 249b6496..dee28233 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java @@ -126,9 +126,9 @@ public abstract class ImportEntity extends AnnotationEntity { return ListUtils.collectOne(context.getImportSelectors(), importSelector -> importSelector.findClassName(simpleName)); } - public boolean shouldImport(String selfName, String className) { + public boolean shouldImport(String selfClassName, String className) { Boolean flag = ListUtils.collectOne(context.getImportSelectors(), importSelector -> importSelector.isHandle(className), - importSelector -> importSelector.shouldImport(selfName, className)); + importSelector -> importSelector.shouldImport(selfClassName, className)); return flag == null ? true : flag; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java index b9277a2e..c44d4e0e 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java @@ -31,7 +31,7 @@ public class AppClassLoader extends AbstractURLClassLoader { public List getAllClasses() { if (super.getAllClasses().size() == 0) { List names = getNames(); - names.forEach(name -> findClass(name)); + names.forEach(name -> loadClass(name)); List classes = super.getAllClasses(); visitClasses(classes); return classes; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java index fefa6173..d5e321b6 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java @@ -36,7 +36,7 @@ public class AppClassLinker implements ClassLinker { @SuppressWarnings("unchecked") public T toClass(IType type) { Assert.isTrue(!type.isArray(), "Array has no class!");// 这里认为数组没有class,也不应该有 - return (T) classLoader.findClass(type.getClassName()); + return (T) classLoader.loadClass(type.getClassName()); } @Override diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java index b9122ce9..ceecadcf 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java @@ -1,6 +1,9 @@ package com.gitee.spirit.output.java; +import java.io.IOException; import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; import java.util.List; import org.apache.commons.lang3.StringUtils; @@ -19,22 +22,32 @@ import com.google.common.base.Splitter; @DependsOn("configUtils") public class ExtClassLoader extends AbstractClassLoader> implements InitializingBean { - public ClassLoader classLoader; + public ClassLoader loader; @Override public void afterPropertiesSet() throws Exception { String classpathsStr = ConfigUtils.getClasspaths(); if (StringUtils.isNotBlank(classpathsStr)) { List classpaths = Splitter.on(",").trimResults().splitToList(classpathsStr); - classLoader = ReflectUtils.getClassLoader(classpaths); + loader = ReflectUtils.getClassLoader(classpaths); } else { - classLoader = this.getClass().getClassLoader(); + loader = this.getClass().getClassLoader(); } } @Override - public List getResources() { - throw new RuntimeException("This method is not supported!"); + public List getResources(String name) { + try { + List urls = new ArrayList<>(); + Enumeration enumeration = loader.getResources(name); + while (enumeration.hasMoreElements()) { + URL url = (URL) enumeration.nextElement(); + urls.add(url); + } + return urls; + } catch (IOException e) { + throw new RuntimeException(e); + } } @Override @@ -44,32 +57,30 @@ public class ExtClassLoader extends AbstractClassLoader> implements Ini @Override public boolean contains(String name) { - return name.startsWith("java.lang."); + try { + return loadClass(name) != null; + } catch (Exception e) { + return false; + } } @Override - public Class findClass(String name) { + public Class loadClass(String name) { try { - return classLoader.loadClass(name); - + return loader.loadClass(name); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } - @Override - public Class findLoadedClass(String name) { - return findClass(name); - } - @Override public List> getAllClasses() { throw new RuntimeException("This method is not supported!"); } @Override - public URL findResource(String name) { - throw new RuntimeException("This method is not supported!"); + public URL getResource(String name) { + return loader.getResource(name); } @Override diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java index 1631aee3..0be6a70c 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java @@ -25,6 +25,9 @@ public class ExtImportSelector extends AbstractImportSelector { @Override public boolean shouldImport(String selfClassName, String className) { + if (super.shouldImport(selfClassName, className)) { + return !className.startsWith("java.lang."); + } return false; } diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java index 10e87e6e..5dcafa81 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java @@ -41,7 +41,7 @@ public class NativeClassLinker implements ClassLinker { @Override @SuppressWarnings("unchecked") public T toClass(IType type) { - return (T) classLoader.findClass(type.getClassName());// 可能是数组 + return (T) classLoader.loadClass(type.getClassName());// 可能是数组 } @Override diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java index da7c0a5f..46f03c98 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/CustomClassLoader.java @@ -26,16 +26,16 @@ public class CustomClassLoader extends AppClassLoader { this.classes.putAll(classes); resolveClasses(classes); visitClasses(getAllClasses()); - return findClass(name); + return loadClass(name); } public void resolveClasses(Map classes) { classes.values().forEach(clazz -> { Set classNames = importer.dependencies(clazz); classNames.forEach(className -> { - if (contains(className) && findLoadedClass(className) == null) { + if (contains(className) && loadClass(className) == null) { // 注意:这里间接要求,部分编译时,依赖项目不能是内部类 - Map classes0 = compiler.compile(className, URLFileUtils.asStream(findResource(className))); + Map classes0 = compiler.compile(className, URLFileUtils.asStream(getResource(className))); this.classes.putAll(classes0); resolveClasses(classes0); } @@ -45,7 +45,7 @@ public class CustomClassLoader extends AppClassLoader { public String getName(String filePath) { URL fileUrl = URLFileUtils.toURL(new File(filePath)); - for (Map.Entry entry : nameUrlMapping.entrySet()) { + for (Map.Entry entry : urls.entrySet()) { if (fileUrl.sameFile(entry.getValue())) { return entry.getKey(); } -- Gitee From 7445e9836da7f0e9dbd7b7668e005e379dad5cbe Mon Sep 17 00:00:00 2001 From: chenT Date: Sat, 5 Jun 2021 22:21:20 +0800 Subject: [PATCH 46/66] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spirit/lib/spirit-code-tools-2.1.30.jar | Bin 15143 -> 16744 bytes spirit/lib/spirit-common-2.1.30.jar | Bin 41922 -> 42000 bytes spirit/lib/spirit-core-class-2.1.30.jar | Bin 41312 -> 41680 bytes spirit/lib/spirit-core-compile-2.1.30.jar | Bin 44837 -> 46046 bytes spirit/lib/spirit-core-element-2.1.30.jar | Bin 51145 -> 51217 bytes spirit/lib/spirit-core-lexer-2.1.30.jar | Bin 27471 -> 27550 bytes spirit/lib/spirit-output-java-2.1.30.jar | Bin 33665 -> 34820 bytes spirit/lib/spirit-starter-java-2.1.30.jar | Bin 6480 -> 6559 bytes spirit/lib/spirit-stdlib-2.1.30.jar | Bin 5760 -> 5837 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/spirit/lib/spirit-code-tools-2.1.30.jar b/spirit/lib/spirit-code-tools-2.1.30.jar index 6e56f6e6b67a0b1437f9dbdd2ea1b2c30cef6c9e..370886d2196f366afa4e95a528d3339b4262f634 100644 GIT binary patch delta 4579 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 delta 8861 zcmZWv1z1!~+g_HG?pjhoy1PX{S^?<}X{4LQ1*A*hP|__TNOy{Khonn45~84pp#QS? zz5na?ab3G}cIJMb`+lA|Gv~|<2?OBnelUfGDk>T_2n!1fMB&k<_3;5;q#+0dvPz_o z)MZs3nNuB88Wq^wa_3f2=Tufl!I2ofyZ&A4hN_E#ys(#_0V6Ml&<;?M z7qW`7H%(S?&geM*%0(?Eq0voCn9>dw5^GJwg^s*%(G)>JeV$xXdrZdw#zQb@wM%ZN zKS6|Q3*?eNfZ+}E;Xmiay*DYPbwn7|tgFf-9A5Sq6W=04S&~q(kKydw=;aE%w2EC_ z*crt#-sAkLRdpfxbOwJPAcxb7ZVmlp&qTL*(I*q2Nmz)?+_j`ft>~);hci`5Bcn`mJlN`c8^d!a%N$JZz%Kews

@JJcAR1YUzG^;W$dxB=RV-glO#4y=CvhgcaEH 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 delta 13047 zcmZX41ymf(()O~rI|O%kf@^Sh2_D=Xg2P6D;I_ECyE_DTcMA@|C0Ky)6LSCezPaC? zv!{D{s_J>FtItezPfhd!*SmlO%5soU2mm-ZH~^kYtLm~OTaXR_05Ey}V}a3QaHHAD zG-+i<=HN zKqzeP00GK!uyFsj_y-FB2l$N@T|f!>yBQ;SY0jvAH{e$gj4!Pe1lvpN4Z-=+)5d;i>z10$c_uwVrnQ_rV% zN+?t^YB`Bz%zrfwfY#^mHPy8Nd0b@}u*XeISZ2j!Q!B<9i5iW%Y9@@lt3*wzZtxyt z-&@Y4%S$)l7N{S+SLmXxHfckwYam#3|8VV-fwzg|uF6;a`Swa=qSsAGSF+(M+LXVbR>g7@mb@x%clkph4q=iL_}@7MJcsmO%cW*r zoelB#wATn@_`|()b_wPoUM7CH>yi%!_`Hmuz~=0 z$IIC4PiI*P2o3i;W?A2NOu)nV{1D+_SOQK3^V4tdxB(25WPN1DqRuhz&+{AW_zmE@ z1RfjDl*X_sp&R;9yiGl~C%0j-W!caQ|sMF3-4kb-cf!WYufbNul2 z9)Df|)1Y1B$aQdRI-!N#wXwHNBjm+Y{Yu|;D6Yp$LvII)Zqkvw@77t-h=wS^u1A3$jv0k-BU;h`Q7BXhL1x3yi-+#!+Hu| zJJq`mCXz_$bdA*m_F_=Z#(R{@D#f}yKJQv)^1AYLviJSzZRS0bXGBEbdT(6yf=gU| zNan3P)caA-#6ITTp*2rwy7tJ+t_x39X?NYS`E{L4JqORBTz?HbuN!PdEbb z`B5SN>lL1W4 zw3zJy5E~UZJI!!#3Ygf;h!m>3 z+79cb&a05}>#nOog7^`m5Y>6HHnpssS|br)RwB6ome;5&hBQ)Mw_OIa{H!xIHZ~US z?$y(o64l{)YCec*ht4M_hlGTtCMQSugiEuFqoVLybT^WG zuQ5;~3y78@n#p66$JB@9`It3SH?3_Oy|_a34DFeUigLO@Rr)|aqxPV|#@sH9UTo)` zwFfcD7^Mc?3~u*^bY4Wq>a4X7(b9=dZUuAMx2>x2Z{_LH>jct1=Hk`R$n*04;2Nus zoYP*EFHUn(F=v+_>)VpF?p!$?;1zouNj0jj2JT*2iRlQL$PYHgJZc^`Sr=NYs|G5D zF0^jsl{R^SDxxd9T1H}t(pbT(%ue^IR~jD@B@RZFb$JPv1|iuGT&R+_$I0@tT|&uo zN27DCcwEoIk*RzfVq;FJ6ts5Q9{KP0za6x8nJD}84M;1`1iiksV#FCvYV28NHxwr~ z|1@e3zcuf`6YT`n&bjI1b)m1>uAEal^3V19qWiiU6i}R8bdx(3RVPu6Hbg76MC24` z$n&;g=$+yiw69>rMOV`(Lw_u?ZEqO8lY3s)gH=L$88#g5-eT(4fzw1f^P|8gw(;=% zE%du9thFQ#sZzMhazU4(amk!tVQBA7!i`VjOSy)HLz81

tix3;)Pa!!DAC90%@9HE2Wr>?)SRADPvZ1-YJeO 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 diff --git a/spirit/lib/spirit-core-element-2.1.30.jar b/spirit/lib/spirit-core-element-2.1.30.jar index 4af251b723e26a5be9629bf44cfa099a9a8bc3c6..b232ce3591cfe44ca8da2458c0e4c6452b84f1af 100644 GIT binary patch delta 10410 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 delta 10611 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 C=rgzg diff --git a/spirit/lib/spirit-core-lexer-2.1.30.jar b/spirit/lib/spirit-core-lexer-2.1.30.jar index 3e808101f3e6d97ef8600c1a47594b31ce49f265..a436ce24fb225add17fb605c8c0c61b2d5ac5609 100644 GIT binary patch delta 4044 zcmaJ^2{=^iAD%g5oiVs$#x{&C+n^y!C?ZQ_O$gZ~JK6W<+S)F{k-fkfq%8KQrS|?tPyB%rnn-&inm-@Aumd@9B91&l!N@Elm(iNEjO%8%(95 z#cFX?`mr4h26KgeSn!h*-<5r0)<)e%FHn;+A$yOS$s3!&Q5w8^00Uec&vUC4Z0c&) z=TtF4tFU^j3SAbv_X5p$2f^hKY6u)=X~N3(Gaut57#oas(v{*ph(~!XS9(S0%d#YG z0R`dm^wk)yL|^0Ks`T|Sd_R3v1Qft}Usm)FDw>xfpiSQm2DIqw9{`cQj&0*22ulQX zWMv2f1E*hT*G);d za;&jsaY9d!`ed58&>gG&ehCtfzg;f)b}p7U`J7w9E)KL#_Gd@szK z*poDuh!G&?-*1oVP{yJaVs3wvevR+gh^gfkKJ8aa`pk{!;~=E@ zgMIa8>yiQeYNLHcKBM*K^MVwM*sq}$Ti3V7a#ZHl4JE`RCdI2}gx&?LpIsVT8jBq7 zA0Mk(;e&mvzAJVKCAfF$>ZRv`K$Lc859`dVo}e~4l}}vJy35;0{Iz~YG#b^eqT5)9 zG---(ynjBeCB`v9;*bWe?A+}rXY*OfW*hXw>Y_=_>ne2@F29;~llR+@(Jq>rMn>#e zTyQt677uqQFdMPTla@D8_Yjb{!IQk1oY;OdU}o8VQie@LS)pIpmizsJ<~>pM)AyKk zTg^;N$?qza|I+a2I;GyP5-6S4rO~7`GnmU!8+zJYH!eH2wZBMC|6rB3W)a?EIQ@cG zbNFQQN?B${3#v6cNBA9@U!<=S3$D!HGcejEvcH~ z*zdIblD)JWtAcA*W47VG9lqfI*U^jf$ZJer+Q}E}BmKMcvi7xlwwd;PnZ7`=YWVw! z&w$ZhQ~uv_)>BE6p(~_ho1=b9Ow_HV7ukg^?rTEhzlM~u_?`2_-h1)LvpV{`-3mVb z0lHL;EPnJzss3Vbyt_+dG;`!J6Gyp<*ObW(%)w4@K1SpI6iC!AoXAiJIw6Pt?xg>y zFF0?g=3%JS$#3svY|DKeS)77LGiFLUl`icu@m#vdI%=i+K5Mbyy~`11d)&#R=7HaG z-B+JY`SVmpdZsRzcD|P(i3y*_riN*|Dw)`o8Ifa|Y*RjZteK8POUve{c?NsSC~xKI zzofDeY^XlMxs6`9uz(?C@y6Bkp8OMSVxLPk>e5LQzabrZx-LdMD|#%AeqJ%UCh&4^ z#cv<`Bp$hrt`%oSUkS5`Gj6*<#qCWSesU{R*dzFGb!Y^!N+PvfZNksLVeD6BP3P7s z>$*GS>5&c2*@g$Mvzl|#LTz?eyH-@@qj2NXSKd(L|IumVqDowE83vx_JHL-YA9_RO zsViI23bAgn2(L@XE#9a}$8V&lEZ!iVEu0?MNJ|{cTC-C8-Ezm!kf@Q zF>*r?Bgb$^FiGW0g`(#P0dU%t7Tj8h%*QJ^_ZU^S7|M1>3o4lmoeOzOT zby(U^ITUcux`1~`wvBG+Y`j(X~s-4(TOS$Tn-QC@50MV%aTsd^9+-qn7ps6$AW z>~x$$Hrb-=9dk+F?;%H~bUtGvCoU(>tZNCi3=#eHM&&HWPTk`a{^wkM$Kqg5xij~l z9#Po=*xT=yGhC+pF9gI!n)rY|O$;y3pW6%Yos3{kB9)3pA#`V?JOM(PVO-u7 z88bozSyyCKeL`R$o$xtk^YOH3+JluCa{L1G{mPTh^K4UR;Bx^B#|^E8CXpna@gkmU z*BnM_x!xYW@O^T`GAQs&>Ci}Bji}vl9G>NqbJ-Cp(^#7-`})2r6h&)z6wCgPz)KtN z*{4f+1iO^26HKidgSJAZMr|`swBBBCDBm2_=XWKoI#AB%4_;R5NnQigS(KV1xX50Y zqoo#(Akr&OoS(E}DtHC@A35k{-rIF771w2*BiYdTW#;MN*Kzw6qJ-xg}6$_NZBX*6uoRP?lm(OU^6O((Y zxm>Y?w6FE*mE)g1k{h%PmYS|Dt|Vgan7WxSS34qyD%yldK(%^@v+#Q8Clx9{2u`zMyPpRwnTcOWCko1H_8 z=_$5<#3~A*%H4Y&crVPQrMR0m4+^fa1W%7v#SC-|&%#CWgTEEb%JiT8GxUq>y9s3# z$E*8HiJW~C!KRdT{%~YLZypB6o{Jp1)r>`7Ry59;cGSRK#Na{}5ssksg3g4CwO2#Mi4P875!nAqSa8fqRg)$^AfdJM zVc)sphArx5L3d^b*18JD=7uCo6B-c`MpLLXS!w2s=WB!vJc0uLvqyHu!>7Sp&H|z| zIk&?JUHr0hLpuNk2NMuH^8cdV<-ohkL6hdd56Zc4&?T&<3myohK|=qRLueOA5ga^r zhyd1aa|pZQfr)L%mlfo6Wl+;#F#xiZ1YNeFKnQZDK?E=dU_ ziJebDLKG8pvJ@!e$3xuR(GPyQBE1M0Odo0tX~zKuD@Z`I)8o$*<^a3A82r91&!|r! zBP<*Sliy{miG~6Z1v62c;O`y`W3kng!C}a#1TvP~Wo*GoD>^8GX9g3!G4x~vJn=vr z7yUpEehe7k$;dGdf^TBBt$*3c(@iAFPaF!`4jO;8UDP2w^a@X$mZH=8df|Z$UOJQm zuz+WjIlw9}G5XdBv~`nz+nV-LAtXXCp=8|jM~Jc;iu&L#>I#tRDFXG5Mk5Gb@Mc5^ z_rU{5;cXf=uu}yETKI6#C--OZuD6S-N*biPAESpM;tLIs4Ba1k`2r~>n4K(te)N@h z`3sSLN(lubeKGX*|LZTpj!Qv;-u~?q7_Wl9?s%YG8=9sAn5Y1M#sjqTkb}7%c;Jc7 zPDqs;KMHSu`b*+>sPG@4Y1utsZF)NnB|JZJkhr1oSPm-XUg#ChU?(8jc*z>k9k@@c z((AwuwWG~=8~O#jAI64*<);%M2#h~mE{wOXhB60BPrWI zi7cU1NZ}?ChEa+Z?*E%_+`4Lhzxkc>z3+40_j#XlzBBI>4j_7;BS^MZC^QbhVzGc& zXoLN*xmJ=30017)R~X#kDw?S+9QO}Y;WQSi zP!`e*%i#G<84ZJy1;pWHU4-;yIC@T847L7%tKC988IrD981? z%?xMKOmgD5L?z2`Fj(I~5RGLEP0fCG5meXMO^+aviK}fc=9_E?L%s!ywGOxSZ!ib# zMB0Uof+g#HFTXBn9dfwf@$QdJf1V3Azr0!9{baQU7cTpTEzVsbL2$Su_I_`{s@gaH zD>czH-7KOdzcWxY9y#1NTEA4k^lEAGcEsE_uKxjZK0d9Hc+nuc2l9A?@#w=|%*3Rr z#CCd`sH~=Ax1WXVv)yO7@Tm`LcHWD_S>1Oopv9dk*+NN_+hIVgNMs&y-8U)UO2jkk z%Knzf+1ikluKTw;Wq@TDz4t*o@vzm4p^~&9v*~P${MwS8Hv4me+H}m-6|hS@T$#bc zofC`}JHhRKE~Q47r2AflI`0a4xsNAq@7bKQ^iFT@gwPjf9|e_qw(OJ0VbSd6qoh`dZsZLa9OScS`GLFK^g?Ud=~2DF9n`A-JcC!J{Hyp=3*V zBS)8e`*I;N-mg~>dQs%===-Whj_5RHcTaey1{RDCo-(9NT|-`M zbZ;N^pdL6hl@{b8oXFR&HM&zgWBEj0=*gKk&y{4&RAPm7Cn)!WQz^PBA6c~{`37B9 z4`vOVV?%2A{ml;vdw17()t4td?|c+dsXG@hLn19D~eh*@rHgA zn)asSuf~mz3zozpdsb)Z?eg5jf7E4N-s$(vzIt$;43b$8ns=iQzYh#Cuw9UiyJj2f9W>lEs%9U{=20Ped->JR8T6^^9)YP5pSkmnmU3`FI%oT-8;s>9n}j+aE!KWpX{p~m;T}u z?bQLJp%xlSco389_WuRamJT7wgK3EcBABd>v){ z#IPw{YHC^Lcx&~3s+-Dm!s!8)hvbfXGlrvbdmO(xwv(3gQi^8kVyPDW$FIF68y-J3 zsyJ2YufY{BkQ0W3gby>mFtdS&te@!bFufqb8oD0vx$nK*Ytp4IOl$I!XAM`rWpt#{ zqs%Eiyedi!qG;N(ZG^1M=(cka)}LLBw&|Zuh%%Y9URcd4yVcn-S4=GGt*<@5@JB{@ z`{#!tQ`8efVY|Ju;@*Xf8+%8t;K_2X=dO0wMG4s2Iozi$7-ccrgjA33&kvoMtRZ@Q`2QSYC^mtD=zicyQ{-V zg?>vV<+LXzjBL9buO>cLob`RLr9*pD+E5-RFq+!1O_j#7jll2k6uTzOOIB;UM(V+; zFngkGyKkuvTehE)mow0aRtPEVbl=gpUF%$4e)TJ@3RPvFVa?bH?#G>!%%uVkFBLjd zt>kT}lTD*xS@_lq#s-g^^2`X8VtEZ`3qSB%-gxP-fRUuP21t4bx!j9A8h_oxeA?vh z>BBDMSu>#`R)wH5)uSgP&e+R(=woJzQ=(@}t>_0U+=#Nm07g-G4op1LnM5J)s!p6F zDRp|!#;b|cHZ%v?e4MV!?C8!gu)j+$b(=5!=6;}|c_XbYeAVp?U1$|O!PPY%rJurZ z8caM&zR=LI4|R7L9|itdl}l}uj%jD<51WTwZYLj4X2{f@Zwz2cmivhD&0+N#5_9UY z6rW)szNVXTV|etL{A`{hbrK7)UYBZ)45GM>EgmfLrYL;rn`aIrujp3Xn~|iuY3w|I z{=Lf{!IL-(nn${J*=tSm5yTfg$t%TAUp%Rw7uo$yU^MY4qovB3_ThP)o9_oTvDTrQjPJz-ai}>O#gJ%yT$dl;Iu~Wv}{@FlEOnq(*~ghUZ>p~+)Cf8 zE;#j2n^SLyI^PV?)~u%C?YKnZ6I39I>A)9c^|UB`r2cW@pniJ7o9j zoci=v=qKr85}y3>`i2kq3~gR$WG-)(JDz8EEK@5dt)N)y@*-2|s8s1JLPJreQ~2%X z^Z_fG`Z=xkR6u>-&4K@|Y&5oRh-s(Dv<{fOO|iELnaj8>5{*$)F0^wjh$h8%7t=39 zruWj~zM7;ief4EU6pfzfop&VG(=nYx%u@-@RiTO-c`FYNl>5xhq$eEQ+d3!_jtL%r zb^FUe$BS`>PRZ zMOT?wtB&B)9S%>VF4R!^k!Wm*pLER`86PgR#F6Kq;hrn^qHza}BBtHKHhB$;2exjz znMA8@Odx*a(ZY@n8BCXI3G~lU$*NLwHUXn@lAkf}kgHu!$-Nb9@Y0uELg^0^A^<8y{>v>_$SohOM@4;{RHZa!An5 zUmmPj12wvlkcW_9u;(UllP5R03YpnGE#94kCH^EO(B;;cxsEU#Y)7&|Le0LI( zfPzd0_#Y~>HCcrmo+v1w7#N7hf<-7kRZfwdjbOKJKl)>M_r8}|9D5WEkuw0xeR0xI zqijze-qm&j0RYNq05JXz1AyY#Tr8A&8|de=L3({74FIO=fC)Glh*RVT$GrHY+3Ecr zG%wUcAYmx7>N@ZN-ZkDLAkL2?VvG+78Nvta!`dnKODVG(^<2qF04RYN>aL3wF94OY z1&kpJ3j9<*800}h8WZ4D-2@)6!h-_!0sc+Hnny+h6~IbMu`Xp9pZrHat&^&Kr*RA(aqL@?~x#| z6nMx&ksTR6U3U(WkW@)H;XWR|U#g}bA|cacpj8UstqnqKf#IroM&4Z_La#E47XWnD zr69<|DHeTYIr0S0%4U0omtQ2L^8CeOh!I0`)^tq08a>r#Mzo6#|;V zWX1hR$lV(7x(FKq@Tw<=O^kf>_#CvN2THX5#A)iRB_V*TB!2b+IF5`L37Mn|xwe3N zC3!*G+8Ikesm)}d0Dup=DYU;cV4vKrJ0OLWz#s?SU-t38_uYCaEKJvu3xS2+1UT_L zl$d4(o1wp~pqBS0xcG>>J{q#notZ26bMfVN-@zZfH%YPIgqUUX)7sFy^?3 YZT%IX!^;IWqxrxje?jgC2iRr&AHQxc^Z)<= diff --git a/spirit/lib/spirit-output-java-2.1.30.jar b/spirit/lib/spirit-output-java-2.1.30.jar index 3c5afc88653e342c6f6b41e7f3fe4dcba0e61973..27fbaf16f2504919bff9db2aed7b843e20c64ec7 100644 GIT binary patch delta 14825 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 delta 13626 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 Hzn}gOr#;|^ diff --git a/spirit/lib/spirit-starter-java-2.1.30.jar b/spirit/lib/spirit-starter-java-2.1.30.jar index d429a110e797e52c7819d13f35f8516b54772fa1..79efde16956ce537b558f3de6b4147505c25d6ea 100644 GIT binary patch delta 1023 zcmca$G~ZY}z?+$ci-CiKgTZXm(V(|q)wf14Ffb%c6t@ZSIOlPe`{C0fJuhD!PhUoE zOEDEDSJ4{b(?Op_dcL0d(xWI9RI)c{lOtQi3&|tWQBt3ZJ{B=D1bDM^z|8@g1+jsF zg8^j2#FZ+{TNWIhctIXaeNqKclcgASz_cf$37BqRv;@<87`4FkOGY~|t;G}srt6vF z!Sq9>9n3&OH_u_#;Q%vEa|d^_>!^;=)3wlC{@apIO;)yME(M=IBAczv3GUf<%;>359QtM0W$Jyd)*>r`QS z)Owd=b2T-L=3P$V`Xy{N_s{mH6PNt2j-GKxXOqcJW>ByqJOc|>P{aYfxp}`}8>2WQ zlL)g2W?W7-7cm6|%H(_z>H1l~u<&&aan$wnbJGv-25I4907VWcuz+%KzyfCpFuZj< z2;?Q_=i=1?GzSVmIvzuHq-U0-ro#2HL#>)DAS%tsJy}Oo0UVM3qS8!OjFbBrrFHPR zNe*TK1IUI#kOn19++N^EQNDKaKT$cbZSrE$Ot%;(#|x|SquDmO04OER1eCJWhDbre z6BIawDI7OI4gg^>xXBC*OBxF%e-wixWJz&p*-K0e3`vQ3d8tKuB^4#erhwugP+Xd+ zml^1Ag~@&5GT>-g3l!SJ4HkMOE(;dol8|OP&kGjf o_sLx1JYXMY0rlSz0t(qmR^;Xcc(byBR0{&33@Zaet_X++08q>{{{R30 delta 903 zcmbPle8EUOz?+$ci-CiKgF&izPta{Q!;UBh28QH`;x=I#o@cImpYu3t{N!noo|mtV zr!OP7wU`Q%t7whz>7dUdJzvj!=~0{&RI)c{lVe-N3&|t18GRo;Wnu{MX6JyL1T+m| z2LlHK$c~B2RhU84Ie9SkK@~(zmSEHY)9#EWV7iXc5=`%6)B@Ab8STKd22&82u4Re` z)AyNnfauM$m~}Y7jFa2~Okl-2`ivZTB3_6SlWTL{@a%f3w57$#X^zV}Aav?;n@VHtN~_;ZJL}tCfY# z1>#cR_F86zkxVmCPJ)qv0pT@}nk!5U z3`vQ3d8tKuB^4#mpoWF?=H?Tbyh?%xl$0jxNJ=wp5(GNhR=*-Q2hG$V;JRTfi7#I>Jira*Eobx!#{qSj#o|mtVr!OP7 zrI-qnt7whz>7dUdJzvj!=~0vlD%l&f$&oGMh2#o z!2q&h;z||fEenoLydV#zKB7);kQYJurBjCNr9Eu#;!>ZYTcZJ08c zz>MWAwya>rbIx!!A)paKFD`tTunB0}7a+E0m|Q4gJo%g;Uwv%fMy^8+0xrKD{v{r~ z^|mv2DZG7|kPrH41-`mt0cKA$ko8;P)!7dBA&iUVX+-#GxC%`tP z&o;*5&?z&$k|}D7g;=-kWw&kjd0sW|yot`K#|fJ}XKj&ODe%)RtSra=Z&GGavY*WR zV>(jrRvRr)P2Tlj(d6|3eby_b%Kt@LBzPZ{U#I*%F<5k3bf~pr&^NER2_I*vNgR#6 zaO%MSEdH*$zrB~KWv#mWgcTHi$i6|u5YV5S9R(a1#Tl7Im_;xnZE}W?DKjvTCod3^ zW}G#7kC22ZC}@Bo0tYN`mH@+B$Ads#a(=FUfH%lQE(TB}f#QQxSX%ZmR4zTUBsCR7 zg`==EBlqN3VFhsfGzd#GSusw&AR?84W)zC${3wk1-gfUfe#3! Lfv%q;1mXbz`#>dd delta 853 zcmX@B+n_5R;LXg!#lXSA!5~(=C+N1DVMi1L14Hseahos=&okG(&v~3Re)6RkTLD%l&f$+0csh2)XhjJ}VaGBE^rvva^r0-6S~ zgMotqWXHtiD$F42oIIHNpbDZUOEBtyX?I3rFkQ>21*TUq+JWiUj6NWGvlUYY6PU4- z#g-M!c*+^h#@sw*)8;rq2SzDm&m>9D+MW!wJ{^ed872#eIo9)@-pJKrz{7B1?}d5| z3u!;@Jig<;=05~C_DWsYwj}Vw`_j5S&(vGIE}q@~TZ~6~C#SyGxx)1{;L>N!rDr5@w+*={(`Z+*H`nrZV>U#RQ=|l8zF+hVX2q*^!EO3?p!&}G0Kwffw zE?yl#bD#jE<0(`}dS*##DqJ5s)T+sS!qSYqlUE5VfL(T0SenU(aq2$XsNk}`%$K|%-^K$AqJne>@Jc1|`I zl~4c$S=eUb;P*g}PX}7047ZDcVM*gG7O=u|EZk5B!i@T52&I9J^A`f~ E0E>m!$N&HU -- Gitee From c180713544f15071dc68154253bd2c12d65ad23f Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 21:19:15 +0800 Subject: [PATCH 47/66] =?UTF-8?q?=E9=87=8D=E6=9E=84Element=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/spirit/common/annotation/App.java | 13 - .../spirit/common/annotation/Native.java | 13 - .../gitee/spirit/core/api/ElementAction.java | 21 +- .../gitee/spirit/core/api/ElementVisiter.java | 25 +- .../core/compile/DefaultClassVisiter.java | 363 +++++++++--------- .../core/compile/DefaultElementVisiter.java | 150 ++++---- .../compile/action/AbstractElementAction.java | 40 +- .../action/AbstractScopeElementAction.java | 25 -- .../core/compile/action/AppElementAction.java | 4 + .../compile/action/ElementInvokeVisiter.java | 24 -- .../action/ElementVariableTracker.java | 24 -- ...eclarer.java => ExpressDeclareAction.java} | 190 +++++---- .../InvokeVisitAction.java} | 188 ++++----- ...peDeclarer.java => TypeDeclareAction.java} | 84 ++-- .../compile/action/VariableTrackAction.java | 43 +++ .../core/compile/deduce/VariableTracker.java | 175 ++++----- .../core/compile/entity/ElementEvent.java | 31 -- .../{MethodContext.java => VisitContext.java} | 103 ++--- .../spirit/core/element/entity/Element.java | 135 +++---- .../gitee/spirit/output/java/JavaBuilder.java | 37 +- .../action/AbstractTreeElementAction.java | 159 ++++---- .../output/java/action/CommonAction.java | 15 +- .../output/java/action/EmptyAction.java | 68 ++-- .../output/java/action/ExtElementAction.java | 6 + .../output/java/action/SeparatorAction.java | 14 +- .../output/java/action/StatementAction.java | 22 +- .../java/action/StringEqualsAction.java | 2 - .../code/tools/core/ElementSelector.java | 93 +++-- 28 files changed, 978 insertions(+), 1089 deletions(-) delete mode 100644 spirit-common/src/main/java/com/gitee/spirit/common/annotation/App.java delete mode 100644 spirit-common/src/main/java/com/gitee/spirit/common/annotation/Native.java delete mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractScopeElementAction.java create mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AppElementAction.java delete mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementInvokeVisiter.java delete mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementVariableTracker.java rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/{ElementExpressDeclarer.java => ExpressDeclareAction.java} (69%) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{deduce/InvocationVisiter.java => action/InvokeVisitAction.java} (79%) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/{ElementTypeDeclarer.java => TypeDeclareAction.java} (62%) create mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java delete mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/ElementEvent.java rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/{MethodContext.java => VisitContext.java} (61%) create mode 100644 spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/ExtElementAction.java diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/annotation/App.java b/spirit-common/src/main/java/com/gitee/spirit/common/annotation/App.java deleted file mode 100644 index 3709fa6d..00000000 --- a/spirit-common/src/main/java/com/gitee/spirit/common/annotation/App.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gitee.spirit.common.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface App { -} diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/annotation/Native.java b/spirit-common/src/main/java/com/gitee/spirit/common/annotation/Native.java deleted file mode 100644 index d245b9e9..00000000 --- a/spirit-common/src/main/java/com/gitee/spirit/common/annotation/Native.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gitee.spirit.common.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface Native { -} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java index 6717d313..38693d14 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java @@ -1,11 +1,10 @@ -package com.gitee.spirit.core.api; - -import com.gitee.spirit.core.compile.entity.ElementEvent; - -public interface ElementAction { - - boolean isTrigger(ElementEvent event); - - void handle(ElementEvent event); - -} +package com.gitee.spirit.core.api; + +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; + +public interface ElementAction { + + void visitElement(VisitContext context, Element element); + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java index ddb21566..0a837a60 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java @@ -1,14 +1,11 @@ -package com.gitee.spirit.core.api; - -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.entity.MethodContext; -import com.gitee.spirit.core.element.entity.Element; - -public interface ElementVisiter { - - IVariable visitElement(IClass clazz, Element element); - - IVariable visitElement(IClass clazz, MethodContext context, Element element); - -} +package com.gitee.spirit.core.api; + +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; + +public interface ElementVisiter { + + IVariable visitElement(VisitContext context, Element element); + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index 5197d298..45ecc9c0 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -1,181 +1,182 @@ -package com.gitee.spirit.core.compile; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.enums.TokenTypeEnum; -import com.gitee.spirit.common.utils.ListUtils; -import com.gitee.spirit.common.utils.ObjectUtils; -import com.gitee.spirit.core.api.ClassVisiter; -import com.gitee.spirit.core.api.ElementBuilder; -import com.gitee.spirit.core.api.ElementVisiter; -import com.gitee.spirit.core.api.TypeFactory; -import com.gitee.spirit.core.clazz.entity.IAnnotation; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IField; -import com.gitee.spirit.core.clazz.entity.IMethod; -import com.gitee.spirit.core.clazz.entity.IParameter; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.clazz.frame.MemberEntity; -import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; -import com.gitee.spirit.core.compile.entity.MethodContext; -import com.gitee.spirit.core.element.entity.Element; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; - -import cn.hutool.core.lang.Assert; - -@Component -public class DefaultClassVisiter implements ClassVisiter { - - @Autowired - public TypeFactory factory; - @Autowired - public ElementBuilder builder; - @Autowired - public ElementVisiter visiter; - @Autowired - public TypeDerivator derivator; - - @Override - public void prepareForVisit(IClass clazz) { - // 访问类型 - clazz.setType(factory.create(clazz, clazz.getTypeToken())); - // 访问方法入参 - clazz.methods.forEach(method -> visitParameters(clazz, method)); - } - - @Override - public void visitClass(IClass clazz) { - Assert.notNull(clazz.getType(), "Please invoke the method [prepareForVisit] first!"); - // 访问注解 - visitAnnotations(clazz, clazz.annotations); - clazz.fields.forEach(field -> visitAnnotations(clazz, field.annotations)); - clazz.methods.forEach(method -> visitAnnotations(clazz, method.annotations)); - // 访问成员 - clazz.fields.forEach(field -> visitMember(clazz, field)); - clazz.methods.forEach(method -> visitMember(clazz, method)); - } - - public void visitAnnotations(IClass clazz, List annotations) { - annotations.forEach(annotation -> annotation.setType(factory.create(clazz, annotation.token))); - } - - public void visitParameters(IClass clazz, IMethod method) { - // User() // invoke() - Token methodToken = method.element.findOneTokenOf(TokenTypeEnum.TYPE_INIT, TokenTypeEnum.LOCAL_METHOD); - Statement statement = methodToken.getValue(); - List statements = statement.subStmt("(", ")").splitStmt(","); - for (Statement parameterStmt : statements) { - List annotations = ListUtils.filterStoppable(parameterStmt, token -> token.isAnnotation(), token -> new IAnnotation(token)); - IParameter parameter = new IParameter(annotations, builder.rebuild(parameterStmt)); - parameter.setType(factory.create(clazz, parameterStmt.get(0))); - method.parameters.add(parameter); - } - } - - @Override - public IType visitMember(IClass clazz, MemberEntity member) { - ObjectUtils.lock(member); // 防止循环依赖 - IType type = member.getType(); - if (type == null) { - if (member instanceof IField) { - type = visitField(clazz, (IField) member); - - } else if (member instanceof IMethod) { - type = visitMethod(clazz, (IMethod) member); - } - Assert.notNull(type, "Failed to derive member type!"); - member.setType(type); - } - ObjectUtils.unlock(member); - return type; - } - - public IType visitField(IClass clazz, IField field) { - IVariable variable = visiter.visitElement(clazz, field.element); - return variable.getType(); - } - - public IType visitMethod(IClass clazz, IMethod method) { - // 方法上下文 - MethodContext context = new MethodContext(method); - // 访问方法体内容 - visitChildElements(clazz, context, method.element); - // 判断方法的语法 - if (method.element.isFunc()) { - return context.returnType != null ? context.returnType : TypeTable.VOID; - - } else if (method.element.isDeclareFunc()) { - // 获取声明的类型 - IType declaredType = factory.create(clazz, method.element.get(0)); - // 如果这个方法有方法体 - if (method.element.hasChild()) { - IType returnType = context.returnType != null ? context.returnType : TypeTable.VOID; - // 进行类型校验 - if (!derivator.isMoreAbstract(declaredType, returnType)) { - throw new RuntimeException("The derived type does not match the declared type!"); - } - } - // 最终返回声明的类型 - return declaredType; - } - throw new RuntimeException("Unsupported syntax!"); - } - - public void visitChildElements(IClass clazz, MethodContext context, Element father) { - - // 遍历所有子元素 - List elements = father.children; - if (elements == null || elements.size() == 0) { - return; - } - - for (int index = 0; index < elements.size(); index++) { - Element element = elements.get(index); - // 提前将深度加一,以获得正确的blockId - if (element.children.size() > 0) { - context.increaseDepth(); - } - // 对该元素进行分析 - IVariable variable = visiter.visitElement(clazz, context, element); - // 如果该元素不是return语句,并且变量不为空,则将变量添加到上下文中 - if (!element.isReturn() && variable != null) { - variable.blockId = context.getBlockId(); - context.variables.add(variable); - - } else if (element.isReturn() && variable != null) { - // 如果上下文中还没有返回类型,则将变量的类型,作为返回类型 - if (context.returnType == null) { - context.returnType = variable.getType(); - } else { - // 如果有多个返回类型,则使用最抽象的那个 - if (!variable.getType().isNull()) { - // 注意:任何类型都是null的抽象,null不能是任何类型的抽象 - if (derivator.isMoreAbstract(variable.getType(), context.returnType)) { - context.returnType = variable.getType(); - } else { - context.returnType = TypeTable.OBJECT; - } - } - } - } - - // 如果return语句后面还有语句,则抛出异常 - if (element.isReturn() && index != elements.size() - 1) { - throw new RuntimeException("The method body does not end with a return statement!"); - } - - // 遍历子节点 - if (element.children.size() > 0) { - visitChildElements(clazz, context, element); - context.increaseCount(); - context.decreaseDepth(); - } - } - } -} +package com.gitee.spirit.core.compile; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.common.utils.ObjectUtils; +import com.gitee.spirit.core.api.ClassVisiter; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IAnnotation; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IField; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IParameter; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.clazz.frame.MemberEntity; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; + +import cn.hutool.core.lang.Assert; + +@Component +public class DefaultClassVisiter implements ClassVisiter { + + @Autowired + public TypeFactory factory; + @Autowired + public ElementBuilder builder; + @Autowired + public ElementVisiter visiter; + @Autowired + public TypeDerivator derivator; + + @Override + public void prepareForVisit(IClass clazz) { + // 访问类型 + clazz.setType(factory.create(clazz, clazz.getTypeToken())); + // 访问方法入参 + clazz.methods.forEach(method -> visitParameters(clazz, method)); + } + + @Override + public void visitClass(IClass clazz) { + Assert.notNull(clazz.getType(), "Please invoke the method [prepareForVisit] first!"); + // 访问注解 + visitAnnotations(clazz, clazz.annotations); + clazz.fields.forEach(field -> visitAnnotations(clazz, field.annotations)); + clazz.methods.forEach(method -> visitAnnotations(clazz, method.annotations)); + // 访问成员 + clazz.fields.forEach(field -> visitMember(clazz, field)); + clazz.methods.forEach(method -> visitMember(clazz, method)); + } + + public void visitAnnotations(IClass clazz, List annotations) { + annotations.forEach(annotation -> annotation.setType(factory.create(clazz, annotation.token))); + } + + public void visitParameters(IClass clazz, IMethod method) { + // User() // invoke() + Token methodToken = method.element.findOneTokenOf(TokenTypeEnum.TYPE_INIT, TokenTypeEnum.LOCAL_METHOD); + Statement statement = methodToken.getValue(); + List statements = statement.subStmt("(", ")").splitStmt(","); + for (Statement parameterStmt : statements) { + List annotations = ListUtils.filterStoppable(parameterStmt, token -> token.isAnnotation(), + token -> new IAnnotation(token)); + IParameter parameter = new IParameter(annotations, builder.rebuild(parameterStmt)); + parameter.setType(factory.create(clazz, parameterStmt.get(0))); + method.parameters.add(parameter); + } + } + + @Override + public IType visitMember(IClass clazz, MemberEntity member) { + ObjectUtils.lock(member); // 防止循环依赖 + IType type = member.getType(); + if (type == null) { + if (member instanceof IField) { + type = visitField(clazz, (IField) member); + + } else if (member instanceof IMethod) { + type = visitMethod(clazz, (IMethod) member); + } + Assert.notNull(type, "Failed to derive member type!"); + member.setType(type); + } + ObjectUtils.unlock(member); + return type; + } + + public IType visitField(IClass clazz, IField field) { + IVariable variable = visiter.visitElement(new VisitContext(clazz, field), field.element); + return variable.getType(); + } + + public IType visitMethod(IClass clazz, IMethod method) { + // 方法上下文 + VisitContext context = new VisitContext(clazz, method); + // 访问方法体内容 + visitChildElements(context, method.element); + // 判断方法的语法 + if (method.element.isFunc()) { + return context.returnType != null ? context.returnType : TypeTable.VOID; + + } else if (method.element.isDeclareFunc()) { + // 获取声明的类型 + IType declaredType = factory.create(clazz, method.element.get(0)); + // 如果这个方法有方法体 + if (method.element.hasChild()) { + IType returnType = context.returnType != null ? context.returnType : TypeTable.VOID; + // 进行类型校验 + if (!derivator.isMoreAbstract(declaredType, returnType)) { + throw new RuntimeException("The derived type does not match the declared type!"); + } + } + // 最终返回声明的类型 + return declaredType; + } + throw new RuntimeException("Unsupported syntax!"); + } + + public void visitChildElements(VisitContext context, Element father) { + + // 遍历所有子元素 + List elements = father.children; + if (elements == null || elements.size() == 0) { + return; + } + + for (int index = 0; index < elements.size(); index++) { + Element element = elements.get(index); + // 提前将深度加一,以获得正确的blockId + if (element.children.size() > 0) { + context.increaseDepth(); + } + // 对该元素进行分析 + IVariable variable = visiter.visitElement(context, element); + // 如果该元素不是return语句,并且变量不为空,则将变量添加到上下文中 + if (!element.isReturn() && variable != null) { + variable.blockId = context.getBlockId(); + context.variables.add(variable); + + } else if (element.isReturn() && variable != null) { + // 如果上下文中还没有返回类型,则将变量的类型,作为返回类型 + if (context.returnType == null) { + context.returnType = variable.getType(); + } else { + // 如果有多个返回类型,则使用最抽象的那个 + if (!variable.getType().isNull()) { + // 注意:任何类型都是null的抽象,null不能是任何类型的抽象 + if (derivator.isMoreAbstract(variable.getType(), context.returnType)) { + context.returnType = variable.getType(); + } else { + context.returnType = TypeTable.OBJECT; + } + } + } + } + + // 如果return语句后面还有语句,则抛出异常 + if (element.isReturn() && index != elements.size() - 1) { + throw new RuntimeException("The method body does not end with a return statement!"); + } + + // 遍历子节点 + if (element.children.size() > 0) { + visitChildElements(context, element); + context.increaseCount(); + context.decreaseDepth(); + } + } + } +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java index 94d732f7..9419a7dd 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java @@ -1,84 +1,66 @@ -package com.gitee.spirit.core.compile; - -import java.util.List; - -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.annotation.App; -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.common.utils.SpringUtils; -import com.gitee.spirit.core.api.ElementAction; -import com.gitee.spirit.core.api.ElementVisiter; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; -import com.gitee.spirit.core.compile.entity.ElementEvent; -import com.gitee.spirit.core.compile.entity.MethodContext; -import com.gitee.spirit.core.element.entity.Element; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; - -@Component -@DependsOn("springUtils") -public class DefaultElementVisiter implements ElementVisiter, InitializingBean { - - @Autowired - public FragmentDeducer deducer; - public List actions; - - @Override - public void afterPropertiesSet() throws Exception { - actions = SpringUtils.getBeansByAnnotation(ElementAction.class, App.class); - } - - @Override - public IVariable visitElement(IClass clazz, Element element) { - return visitElement(clazz, null, element); - } - - @Override - public IVariable visitElement(IClass clazz, MethodContext context, Element element) { - try { - for (ElementAction action : actions) { - ElementEvent event = new ElementEvent(clazz, context, element); - if (action.isTrigger(event)) { - action.handle(event); - } - } - return getVariableIfPossible(clazz, element); - - } catch (Exception e) { - element.debug(); - throw new RuntimeException("Failed to derive element!", e); - } - } - - public IVariable getVariableIfPossible(IClass clazz, Element element) { - if (element.isAssign()) { - return createVariable(element.get(0)); - - } else if (element.isDeclare() || element.isDeclareAssign() || element.isForIn()) { - return createVariable(element.get(1)); - - } else if (element.isCatch()) { - return createVariable(element.get(3)); - - } else if (element.isReturn()) { - Statement statement = element.subStmt(1, element.size()); - IVariable variable = new IVariable(null); - variable.setType(deducer.derive(clazz, statement)); - return variable; - } - return null; - } - - public IVariable createVariable(Token varToken) { - IVariable variable = new IVariable(varToken); - variable.setType(varToken.attr(Attribute.TYPE)); - return variable; - } - -} +package com.gitee.spirit.core.compile; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.ElementAction; +import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.action.AppElementAction; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; + +@Component +public class DefaultElementVisiter implements ElementVisiter { + + @Autowired + public List actions; + @Autowired + public FragmentDeducer deducer; + + @Override + public IVariable visitElement(VisitContext context, Element element) { + try { + for (ElementAction action : actions) { + action.visitElement(context, element); + } + return getVariableIfPossible(context, element); + + } catch (Exception e) { + element.debug(); + throw new RuntimeException("Failed to derive element!", e); + } + } + + public IVariable getVariableIfPossible(VisitContext context, Element element) { + if (element.isAssign()) { + return createVariable(element.get(0)); + + } else if (element.isDeclare() || element.isDeclareAssign() || element.isForIn()) { + return createVariable(element.get(1)); + + } else if (element.isCatch()) { + return createVariable(element.get(3)); + + } else if (element.isReturn()) { + Statement statement = element.subStmt(1, element.size()); + IVariable variable = new IVariable(null); + variable.setType(deducer.derive(context.clazz, statement)); + return variable; + } + return null; + } + + public IVariable createVariable(Token varToken) { + IVariable variable = new IVariable(varToken); + variable.setType(varToken.attr(Attribute.TYPE)); + return variable; + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java index a7ad3567..7805b680 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java @@ -1,13 +1,27 @@ -package com.gitee.spirit.core.compile.action; - -import com.gitee.spirit.core.api.ElementAction; -import com.gitee.spirit.core.compile.entity.ElementEvent; - -public abstract class AbstractElementAction implements ElementAction { - - @Override - public boolean isTrigger(ElementEvent event) { - return event.element != null; - } - -} +package com.gitee.spirit.core.compile.action; + +import com.gitee.spirit.core.api.ElementAction; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; + +public abstract class AbstractElementAction implements ElementAction { + + @Override + public void visitElement(VisitContext context, Element element) { + if (context.isFieldScope()) { + visitFieldScope(context, element); + + } else if (context.isMethodScope()) { + visitMethodScope(context, element); + } + } + + public void visitFieldScope(VisitContext context, Element element) { + // ignore + } + + public void visitMethodScope(VisitContext context, Element element) { + // ignore + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractScopeElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractScopeElementAction.java deleted file mode 100644 index 2f533d59..00000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractScopeElementAction.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gitee.spirit.core.compile.action; - -import com.gitee.spirit.core.compile.entity.ElementEvent; - -public abstract class AbstractScopeElementAction extends AbstractElementAction { - - @Override - public void handle(ElementEvent event) { - if (event.isFieldScope()) { - visitFieldScope(event); - - } else if (event.isMethodScope()) { - visitMethodScope(event); - } - } - - public void visitFieldScope(ElementEvent event) { - // ignore - } - - public void visitMethodScope(ElementEvent event) { - // ignore - } - -} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AppElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AppElementAction.java new file mode 100644 index 00000000..32b54c84 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AppElementAction.java @@ -0,0 +1,4 @@ +package com.gitee.spirit.core.compile.action; + +public abstract class AppElementAction extends AbstractElementAction { +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementInvokeVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementInvokeVisiter.java deleted file mode 100644 index 5874b449..00000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementInvokeVisiter.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gitee.spirit.core.compile.action; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.annotation.App; -import com.gitee.spirit.core.compile.deduce.InvocationVisiter; -import com.gitee.spirit.core.compile.entity.ElementEvent; - -@App -@Component -@Order(-40) -public class ElementInvokeVisiter extends AbstractElementAction { - - @Autowired - public InvocationVisiter visiter; - - @Override - public void handle(ElementEvent event) { - visiter.visit(event.clazz, event.element); - } - -} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementVariableTracker.java deleted file mode 100644 index f47715a8..00000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementVariableTracker.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gitee.spirit.core.compile.action; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.annotation.App; -import com.gitee.spirit.core.compile.deduce.VariableTracker; -import com.gitee.spirit.core.compile.entity.ElementEvent; - -@App -@Component -@Order(-60) -public class ElementVariableTracker extends AbstractElementAction { - - @Autowired - public VariableTracker tracker; - - @Override - public void handle(ElementEvent event) { - tracker.visit(event.clazz, event.context, event.element); - } - -} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementExpressDeclarer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java similarity index 69% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementExpressDeclarer.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index 431253b0..08e320de 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementExpressDeclarer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -1,97 +1,93 @@ -package com.gitee.spirit.core.compile.action; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.annotation.App; -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.core.api.ElementBuilder; -import com.gitee.spirit.core.api.ElementVisiter; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; -import com.gitee.spirit.core.compile.deduce.InvocationVisiter; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; -import com.gitee.spirit.core.compile.deduce.VariableTracker; -import com.gitee.spirit.core.compile.entity.ElementEvent; -import com.gitee.spirit.core.compile.entity.MethodContext; -import com.gitee.spirit.core.element.entity.Element; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; - -@App -@Component -@Order(-80) -public class ElementExpressDeclarer extends AbstractScopeElementAction { - - @Autowired - public VariableTracker tracker; - @Autowired - public InvocationVisiter visiter; - @Autowired - public FragmentDeducer deducer; - @Autowired - public TypeDerivator derivator; - @Autowired - public ElementBuilder builder; - @Autowired - public ElementVisiter elementVisiter; - - @Override - public void handle(ElementEvent event) { - IClass clazz = event.clazz; - MethodContext context = event.context; - Element element = event.element; - if (element.isAssign()) {// text = "abc" - Token varToken = element.get(0); - // 如果是字段声明,则不用进行上下文推导 - IType type = event.isMethodScope() ? tracker.findVariableType(clazz, context, varToken.toString()) : null; - // 如果找不到,则必须通过推导获取类型 - if (type == null) { - Statement statement = element.subStmt(2, element.size()); - tracker.visit(clazz, context, statement); - visiter.visit(clazz, statement); - type = deducer.derive(clazz, statement); - // 标记类型是否经过推导而来 - varToken.setAttr(Attribute.DERIVED, true); - } - varToken.setAttr(Attribute.TYPE, type); - } - super.handle(event); - } - - @Override - public void visitMethodScope(ElementEvent event) { - IClass clazz = event.clazz; - MethodContext context = event.context; - Element element = event.element; - if (element.isForIn()) {// for item in list { - Statement statement = element.subStmt(3, element.size() - 1); - tracker.visit(clazz, context, statement); - visiter.visit(clazz, statement); - IType type = deducer.derive(clazz, statement); - // 获取数组内部类型和泛型类型 - type = type.isArray() ? derivator.toTarget(type) : type.getGenericTypes().get(0); - Token varToken = element.get(1); - varToken.setAttr(Attribute.TYPE, type); - - } else if (element.isFor()) {// for (i=0; i<100; i++) { - Token secondToken = element.get(1); - if (secondToken.isSubexpress()) { - Statement statement = secondToken.getValue(); - Statement subStatement = statement.subStmt(1, statement.indexOf(";")); - if (subStatement.size() > 0) { - Element subElement = builder.rebuild(subStatement); - IVariable variable = elementVisiter.visitElement(clazz, context, subElement); - if (variable != null) { - variable.blockId = context.getBlockId(); - context.variables.add(variable); - } - } - } - } - } - -} +package com.gitee.spirit.core.compile.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.compile.deduce.VariableTracker; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; + +@Component +@Order(-80) +public class ExpressDeclareAction extends AppElementAction { + + @Autowired + public VariableTracker tracker; + @Autowired + public VariableTrackAction variableAction; + @Autowired + public InvokeVisitAction invokeAction; + @Autowired + public FragmentDeducer deducer; + @Autowired + public TypeDerivator derivator; + @Autowired + public ElementBuilder builder; + @Autowired + public ElementVisiter visiter; + + @Override + public void visitElement(VisitContext context, Element element) { + IClass clazz = context.clazz; + if (element.isAssign()) {// text = "abc" + Token varToken = element.get(0); + // 如果是字段声明,则不用进行上下文推导 + IType type = context.isMethodScope() ? tracker.findVariableType(clazz, context, varToken.toString()) : null; + // 如果找不到,则必须通过推导获取类型 + if (type == null) { + Statement statement = element.subStmt(2, element.size()); + Element subElement = new Element(statement); + variableAction.visitElement(context, subElement); + invokeAction.visitElement(context, subElement); + type = deducer.derive(clazz, statement); + // 标记类型是否经过推导而来 + varToken.setAttr(Attribute.DERIVED, true); + } + varToken.setAttr(Attribute.TYPE, type); + } + super.visitElement(context, element); + } + + @Override + public void visitMethodScope(VisitContext context, Element element) { + IClass clazz = context.clazz; + if (element.isForIn()) {// for item in list { + Statement statement = element.subStmt(3, element.size() - 1); + Element subElement = new Element(statement); + variableAction.visitElement(context, subElement); + invokeAction.visitElement(context, subElement); + IType type = deducer.derive(clazz, statement); + // 获取数组内部类型和泛型类型 + type = type.isArray() ? derivator.toTarget(type) : type.getGenericTypes().get(0); + Token varToken = element.get(1); + varToken.setAttr(Attribute.TYPE, type); + + } else if (element.isFor()) {// for (i=0; i<100; i++) { + Token secondToken = element.get(1); + if (secondToken.isSubexpress()) { + Statement statement = secondToken.getValue(); + Statement subStatement = statement.subStmt(1, statement.indexOf(";")); + if (subStatement.size() > 0) { + Element subElement = builder.rebuild(subStatement); + IVariable variable = visiter.visitElement(context, subElement); + if (variable != null) { + variable.blockId = context.getBlockId(); + context.variables.add(variable); + } + } + } + } + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/InvocationVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java similarity index 79% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/InvocationVisiter.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java index f039659f..02384d9c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/InvocationVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java @@ -1,89 +1,99 @@ -package com.gitee.spirit.core.compile.deduce; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.core.api.ClassLinker; -import com.gitee.spirit.core.api.TypeFactory; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; -import com.gitee.spirit.core.element.utils.StmtVisiter; - -@Component -public class InvocationVisiter { - - @Autowired - public TypeFactory factory; - @Autowired - public FragmentDeducer deducer; - @Autowired - public ClassLinker linker; - @Autowired - public TypeDerivator derivator; - - public void visit(IClass clazz, Statement statement) { - StmtVisiter.visit(statement, stmt -> { - for (int index = 0; index < stmt.size(); index++) { - try { - Token token = stmt.get(index); - if (token.attr(Attribute.TYPE) != null) { - continue; - } - List parameterTypes = token.isInvoke() ? getParameterTypes(clazz, token) : null; - if (token.isType() || token.isArrayInit() || token.isTypeInit() || token.isCast() || token.isLiteral()) { - token.setAttr(Attribute.TYPE, factory.create(clazz, token)); - - } else if (token.isSubexpress()) { - Statement subStatement = token.getValue(); - token.setAttr(Attribute.TYPE, deducer.derive(clazz, subStatement.subStmt("(", ")"))); - - } else if (token.isLocalMethod()) { - String memberName = token.attr(Attribute.MEMBER_NAME); - IType returnType = linker.visitMethod(derivator.withThisModifiers(clazz.getType()), memberName, parameterTypes); - token.setAttr(Attribute.TYPE, returnType); - - } else if (token.isVisitField()) { - IType type = stmt.get(index - 1).attr(Attribute.TYPE); - String memberName = token.attr(Attribute.MEMBER_NAME); - IType returnType = linker.visitField(type, memberName); - token.setAttr(Attribute.TYPE, returnType); - - } else if (token.isVisitMethod()) { - IType type = stmt.get(index - 1).attr(Attribute.TYPE); - String memberName = token.attr(Attribute.MEMBER_NAME); - IType returnType = linker.visitMethod(type, memberName, parameterTypes); - token.setAttr(Attribute.TYPE, returnType); - - } else if (token.isVisitIndex()) {// what like "[0]" - IType type = stmt.get(index - 1).attr(Attribute.TYPE); - type = derivator.toTarget(type);// 转换数组类型为目标类型 - token.setAttr(Attribute.TYPE, type); - } - - } catch (NoSuchFieldException | NoSuchMethodException e) { - throw new RuntimeException("Link failed for class member!", e); - } - } - }); - } - - public List getParameterTypes(IClass clazz, Token token) { - List parameterTypes = new ArrayList<>(); - Statement statement = token.getValue(); - if (statement.size() > 3) { - List subStatements = statement.subStmt(2, statement.size() - 1).splitStmt(","); - for (Statement subStatement : subStatements) { - IType parameterType = deducer.derive(clazz, subStatement); - parameterTypes.add(parameterType); - } - } - return parameterTypes; - } - -} +package com.gitee.spirit.core.compile.action; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.StmtVisiter; + +@Component +@Order(-40) +public class InvokeVisitAction extends AppElementAction { + + @Autowired + public TypeFactory factory; + @Autowired + public FragmentDeducer deducer; + @Autowired + public ClassLinker linker; + @Autowired + public TypeDerivator derivator; + + @Override + public void visitElement(VisitContext context, Element element) { + IClass clazz = context.clazz; + StmtVisiter.visit(element, stmt -> { + for (int index = 0; index < stmt.size(); index++) { + try { + Token token = stmt.get(index); + if (token.attr(Attribute.TYPE) != null) { + continue; + } + List parameterTypes = token.isInvoke() ? getParameterTypes(clazz, token) : null; + if (token.isType() || token.isArrayInit() || token.isTypeInit() || token.isCast() + || token.isLiteral()) { + token.setAttr(Attribute.TYPE, factory.create(clazz, token)); + + } else if (token.isSubexpress()) { + Statement subStatement = token.getValue(); + token.setAttr(Attribute.TYPE, deducer.derive(clazz, subStatement.subStmt("(", ")"))); + + } else if (token.isLocalMethod()) { + String memberName = token.attr(Attribute.MEMBER_NAME); + IType returnType = linker.visitMethod(derivator.withThisModifiers(clazz.getType()), memberName, + parameterTypes); + token.setAttr(Attribute.TYPE, returnType); + + } else if (token.isVisitField()) { + IType type = stmt.get(index - 1).attr(Attribute.TYPE); + String memberName = token.attr(Attribute.MEMBER_NAME); + IType returnType = linker.visitField(type, memberName); + token.setAttr(Attribute.TYPE, returnType); + + } else if (token.isVisitMethod()) { + IType type = stmt.get(index - 1).attr(Attribute.TYPE); + String memberName = token.attr(Attribute.MEMBER_NAME); + IType returnType = linker.visitMethod(type, memberName, parameterTypes); + token.setAttr(Attribute.TYPE, returnType); + + } else if (token.isVisitIndex()) {// what like "[0]" + IType type = stmt.get(index - 1).attr(Attribute.TYPE); + type = derivator.toTarget(type);// 转换数组类型为目标类型 + token.setAttr(Attribute.TYPE, type); + } + + } catch (NoSuchFieldException | NoSuchMethodException e) { + throw new RuntimeException("Link failed for class member!", e); + } + } + }); + } + + public List getParameterTypes(IClass clazz, Token token) { + List parameterTypes = new ArrayList<>(); + Statement statement = token.getValue(); + if (statement.size() > 3) { + List subStatements = statement.subStmt(2, statement.size() - 1).splitStmt(","); + for (Statement subStatement : subStatements) { + IType parameterType = deducer.derive(clazz, subStatement); + parameterTypes.add(parameterType); + } + } + return parameterTypes; + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementTypeDeclarer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/TypeDeclareAction.java similarity index 62% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementTypeDeclarer.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/TypeDeclareAction.java index 7a84767f..6a528d80 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ElementTypeDeclarer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/TypeDeclareAction.java @@ -1,44 +1,40 @@ -package com.gitee.spirit.core.compile.action; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.annotation.App; -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.core.api.TypeFactory; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.compile.entity.ElementEvent; -import com.gitee.spirit.core.element.entity.Element; -import com.gitee.spirit.core.element.entity.Token; - -@App -@Component -@Order(-100) -public class ElementTypeDeclarer extends AbstractScopeElementAction { - - @Autowired - public TypeFactory factory; - - @Override - public void handle(ElementEvent event) { - Element element = event.element; - if (element.isDeclare() || element.isDeclareAssign()) {// String text - setTypeByTypeToken(event.clazz, element.get(0), element.get(1)); - } - super.handle(event); - } - - @Override - public void visitMethodScope(ElementEvent event) { - Element element = event.element; - if (element.isCatch()) {// } catch Exception e { - setTypeByTypeToken(event.clazz, element.get(2), element.get(3)); - } - } - - public void setTypeByTypeToken(IClass clazz, Token typeToken, Token varToken) { - varToken.setAttr(Attribute.TYPE, factory.create(clazz, typeToken)); - } - -} +package com.gitee.spirit.core.compile.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Token; + +@Component +@Order(-100) +public class TypeDeclareAction extends AppElementAction { + + @Autowired + public TypeFactory factory; + + @Override + public void visitElement(VisitContext context, Element element) { + if (element.isDeclare() || element.isDeclareAssign()) {// String text + setTypeByTypeToken(context.clazz, element.get(0), element.get(1)); + } + super.visitElement(context, element); + } + + @Override + public void visitMethodScope(VisitContext context, Element element) { + if (element.isCatch()) {// } catch Exception e { + setTypeByTypeToken(context.clazz, element.get(2), element.get(3)); + } + } + + public void setTypeByTypeToken(IClass clazz, Token typeToken, Token varToken) { + varToken.setAttr(Attribute.TYPE, factory.create(clazz, typeToken)); + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java new file mode 100644 index 00000000..5e2c0209 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java @@ -0,0 +1,43 @@ +package com.gitee.spirit.core.compile.action; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.deduce.VariableTracker; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.utils.StmtVisiter; + +@Component +@Order(-60) +public class VariableTrackAction extends AppElementAction { + + @Autowired + public VariableTracker tracker; + + @Override + public void visitElement(VisitContext context, Element element) { + StmtVisiter.visit(element, stmt -> { + stmt.forEach(token -> { + if (token.attr(Attribute.TYPE) != null) { + return; + } + if (token.isVariable()) {// variable + String variableName = token.toString(); + IType type = tracker.getVariableType(context.clazz, context, variableName); + token.setAttr(Attribute.TYPE, type); + + } else if (token.isKeyword() && KeywordEnum.isKeywordVariable(token.getValue())) { + String variableName = token.toString(); + IType type = tracker.findTypeByKeyword(context.clazz, variableName); + token.setAttr(Attribute.TYPE, type); + } + }); + }); + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java index 553712ce..78138626 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java @@ -1,97 +1,78 @@ -package com.gitee.spirit.core.compile.deduce; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.core.api.ClassLinker; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IParameter; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.entity.MethodContext; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.utils.StmtVisiter; - -import cn.hutool.core.lang.Assert; - -@Component -public class VariableTracker { - - @Autowired - public TypeDerivator derivator; - @Autowired - public ClassLinker linker; - - public void visit(IClass clazz, MethodContext context, Statement statement) { - StmtVisiter.visit(statement, stmt -> { - stmt.forEach(token -> { - if (token.attr(Attribute.TYPE) != null) { - return; - } - if (token.isVariable()) {// variable - String variableName = token.toString(); - IType type = getVariableType(clazz, context, variableName); - token.setAttr(Attribute.TYPE, type); - - } else if (token.isKeyword() && KeywordEnum.isKeywordVariable(token.getValue())) { - String variableName = token.toString(); - IType type = findTypeByKeyword(clazz, variableName); - token.setAttr(Attribute.TYPE, type); - } - }); - }); - } - - public IType findTypeByKeyword(IClass clazz, String variableName) { - if (KeywordEnum.isSuper(variableName)) {// super - return derivator.withSuperModifiers(clazz.getSuperType()); - - } else if (KeywordEnum.isThis(variableName)) {// this - return derivator.withThisModifiers(clazz.getType()); - } - throw new RuntimeException("Variable must be declared!variableName:" + variableName); - } - - public IType findTypeByContext(MethodContext context, String variableName) { - if (context != null) { - for (IVariable variable : context.variables) {// 变量 - if (variable.getName().equals(variableName) && context.getBlockId().startsWith(variable.blockId)) { - return variable.getType(); - } - } - for (IParameter parameter : context.method.parameters) {// 方法入参 - if (parameter.getName().equals(variableName)) { - return parameter.getType(); - } - } - } - return null; - } - - public IType findTypeByInherit(IClass clazz, String variableName) { - try { - // 从本身和父类里面寻找,父类可能是native的 - return linker.visitField(derivator.withThisModifiers(clazz.getType()), variableName); - - } catch (NoSuchFieldException e) { - return null; - } - } - - public IType findVariableType(IClass clazz, MethodContext context, String variableName) { - IType type = findTypeByContext(context, variableName); - if (type == null) { - type = findTypeByInherit(clazz, variableName); - } - return type; - } - - public IType getVariableType(IClass clazz, MethodContext context, String variableName) { - IType type = findVariableType(clazz, context, variableName); - Assert.notNull(type, "Variable must be declared!variableName:" + variableName); - return type; - } - -} +package com.gitee.spirit.core.compile.deduce; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IParameter; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.compile.entity.VisitContext; + +import cn.hutool.core.lang.Assert; + +@Component +public class VariableTracker { + + @Autowired + public TypeDerivator derivator; + @Autowired + public ClassLinker linker; + + public IType findTypeByKeyword(IClass clazz, String variableName) { + if (KeywordEnum.isSuper(variableName)) {// super + return derivator.withSuperModifiers(clazz.getSuperType()); + + } else if (KeywordEnum.isThis(variableName)) {// this + return derivator.withThisModifiers(clazz.getType()); + } + throw new RuntimeException("Variable must be declared!variableName:" + variableName); + } + + public IType findTypeByContext(VisitContext context, String variableName) { + if (context != null && context.isMethodScope()) { + // 变量 + for (IVariable variable : context.variables) { + if (variable.getName().equals(variableName) && context.getBlockId().startsWith(variable.blockId)) { + return variable.getType(); + } + } + // 方法入参 + IMethod method = (IMethod) context.member; + for (IParameter parameter : method.parameters) { + if (parameter.getName().equals(variableName)) { + return parameter.getType(); + } + } + } + return null; + } + + public IType findTypeByInherit(IClass clazz, String variableName) { + try { + // 从本身和父类里面寻找,父类可能是native的 + return linker.visitField(derivator.withThisModifiers(clazz.getType()), variableName); + + } catch (NoSuchFieldException e) { + return null; + } + } + + public IType findVariableType(IClass clazz, VisitContext context, String variableName) { + IType type = findTypeByContext(context, variableName); + if (type == null) { + type = findTypeByInherit(clazz, variableName); + } + return type; + } + + public IType getVariableType(IClass clazz, VisitContext context, String variableName) { + IType type = findVariableType(clazz, context, variableName); + Assert.notNull(type, "Variable must be declared!variableName:" + variableName); + return type; + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/ElementEvent.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/ElementEvent.java deleted file mode 100644 index c0f752ee..00000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/ElementEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gitee.spirit.core.compile.entity; - -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.element.entity.Element; - -public class ElementEvent { - - public IClass clazz; - public MethodContext context; - public Element element; - - public ElementEvent(IClass clazz, Element element) { - this.clazz = clazz; - this.element = element; - } - - public ElementEvent(IClass clazz, MethodContext context, Element element) { - this.clazz = clazz; - this.element = element; - this.context = context; - } - - public boolean isFieldScope() { - return context == null; - } - - public boolean isMethodScope() { - return context != null; - } - -} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/MethodContext.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/VisitContext.java similarity index 61% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/MethodContext.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/VisitContext.java index 1f3b2c81..026183c6 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/MethodContext.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/entity/VisitContext.java @@ -1,45 +1,58 @@ -package com.gitee.spirit.core.compile.entity; - -import java.util.ArrayList; -import java.util.List; - -import com.gitee.spirit.core.clazz.entity.IMethod; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.entity.IVariable; -import com.google.common.base.Joiner; - -public class MethodContext { - - public IMethod method; - public List variables = new ArrayList<>(); - public int depth = 0; - public List counts = new ArrayList<>(16); - public IType returnType; - - public MethodContext(IMethod method) { - this.method = method; - } - - public void increaseDepth() { - depth = depth + 1; - } - - public void decreaseDepth() { - depth = depth - 1; - } - - public void increaseCount() { - while (depth >= counts.size()) { - counts.add(0); - } - counts.set(depth, counts.get(depth) + 1); - } - - public String getBlockId() { - while (depth >= counts.size()) { - counts.add(0); - } - return Joiner.on("-").join(counts.subList(0, depth + 1)); - } - -} +package com.gitee.spirit.core.compile.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IField; +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.entity.IVariable; +import com.gitee.spirit.core.clazz.frame.MemberEntity; +import com.google.common.base.Joiner; + +public class VisitContext { + + public IClass clazz; + public MemberEntity member; + public List variables = new ArrayList<>(); + public int depth = 0; + public List counts = new ArrayList<>(16); + public IType returnType; + + public VisitContext(IClass clazz, MemberEntity member) { + this.clazz = clazz; + this.member = member; + } + + public boolean isFieldScope() { + return member instanceof IField; + } + + public boolean isMethodScope() { + return member instanceof IMethod; + } + + public void increaseDepth() { + depth = depth + 1; + } + + public void decreaseDepth() { + depth = depth - 1; + } + + public void increaseCount() { + while (depth >= counts.size()) { + counts.add(0); + } + counts.set(depth, counts.get(depth) + 1); + } + + public String getBlockId() { + while (depth >= counts.size()) { + counts.add(0); + } + return Joiner.on("-").join(counts.subList(0, depth + 1)); + } + +} diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Element.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Element.java index a3cc5b95..bd4a80e0 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Element.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/Element.java @@ -1,65 +1,70 @@ -package com.gitee.spirit.core.element.entity; - -import java.util.ArrayList; -import java.util.List; - -import com.gitee.spirit.common.enums.SyntaxEnum; -import com.gitee.spirit.common.utils.LineUtils; -import com.gitee.spirit.core.element.frame.Syntactic; - -public class Element extends Syntactic { - - public Line line; - public Modifiers modifiers; - public SyntaxTree syntaxTree; - public List children = new ArrayList<>(); - - public Element(Line line, Modifiers modifiers, Statement statement, SyntaxEnum syntax, SyntaxTree syntaxTree) { - super(syntax, statement); - this.line = line; - this.modifiers = modifiers; - this.syntaxTree = syntaxTree; - } - - public String getIndent() { - return line.getIndent(); - } - - public boolean hasChild() { - return line.hasChild() || children.size() > 0; - } - - public boolean isModified(String keyword) { - return modifiers.containsKeyword(keyword); - } - - public Element addModifiers(String... keywords) { - for (int i = keywords.length - 1; i >= 0; i--) { - modifiers.addKeywordAtFirst(keywords[i]); - } - return this; - } - - public Element replaceModifier(String keyword, String newKeyword) { - modifiers.replaceKeyword(keyword, newKeyword); - return this; - } - - public Element insertModifier(String keyword, String newKeyword) { - modifiers.insertKeywordAfter(keyword, newKeyword); - return this; - } - - @Override - public String toString() { - return modifiers == null || modifiers.size() == 0 ? super.toString() : modifiers + " " + super.toString(); - } - - public void debug() { - System.out.println(line.text + LineUtils.getSpaces(100 - line.text.length()) + ">>> " + syntax + " " + super.debugTokens()); - for (Element element : children) { - element.debug(); - } - } - -} +package com.gitee.spirit.core.element.entity; + +import java.util.ArrayList; +import java.util.List; + +import com.gitee.spirit.common.enums.SyntaxEnum; +import com.gitee.spirit.common.utils.LineUtils; +import com.gitee.spirit.core.element.frame.Syntactic; + +public class Element extends Syntactic { + + public Line line; + public Modifiers modifiers; + public SyntaxTree syntaxTree; + public List children = new ArrayList<>(); + + public Element(Line line, Modifiers modifiers, Statement statement, SyntaxEnum syntax, SyntaxTree syntaxTree) { + super(syntax, statement); + this.line = line; + this.modifiers = modifiers; + this.syntaxTree = syntaxTree; + } + + public Element(Statement statement) { + super(null, statement); + } + + public String getIndent() { + return line.getIndent(); + } + + public boolean hasChild() { + return line.hasChild() || children.size() > 0; + } + + public boolean isModified(String keyword) { + return modifiers.containsKeyword(keyword); + } + + public Element addModifiers(String... keywords) { + for (int i = keywords.length - 1; i >= 0; i--) { + modifiers.addKeywordAtFirst(keywords[i]); + } + return this; + } + + public Element replaceModifier(String keyword, String newKeyword) { + modifiers.replaceKeyword(keyword, newKeyword); + return this; + } + + public Element insertModifier(String keyword, String newKeyword) { + modifiers.insertKeywordAfter(keyword, newKeyword); + return this; + } + + @Override + public String toString() { + return modifiers == null || modifiers.size() == 0 ? super.toString() : modifiers + " " + super.toString(); + } + + public void debug() { + System.out.println(line.text + LineUtils.getSpaces(100 - line.text.length()) + ">>> " + syntax + " " + + super.debugTokens()); + for (Element element : children) { + element.debug(); + } + } + +} diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java index 0a80e2c1..41dbcb4b 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java @@ -2,27 +2,24 @@ package com.gitee.spirit.output.java; import java.util.List; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; -import com.gitee.spirit.common.annotation.Native; import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.common.utils.SpringUtils; import com.gitee.spirit.core.api.CodeBuilder; import com.gitee.spirit.core.api.ElementAction; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.Import; +import com.gitee.spirit.core.clazz.frame.MemberEntity; import com.gitee.spirit.core.compile.AutoImporter; -import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.output.java.action.ExtElementAction; @Component -@DependsOn("springUtils") -public class JavaBuilder implements CodeBuilder, InitializingBean { +public class JavaBuilder implements CodeBuilder { public static final String IMPLEMENTS_KEYWORD = "implements"; public static final String SYNCHRONIZED_KEYWORD = "synchronized"; @@ -30,12 +27,8 @@ public class JavaBuilder implements CodeBuilder, InitializingBean { @Autowired public AutoImporter importer; - public List actions; - - @Override - public void afterPropertiesSet() throws Exception { - actions = SpringUtils.getBeansByAnnotation(ElementAction.class, Native.class); - } + @Autowired + public List actions; @Override public String build(IClass clazz) { @@ -83,7 +76,7 @@ public class JavaBuilder implements CodeBuilder, InitializingBean { // annotation field.annotations.forEach((annotation) -> fieldsStr.append("\t" + annotation + "\n")); field.element.replaceModifier(KeywordEnum.CONST.value, JavaBuilder.FINAL_KEYWORD); - fieldsStr.append("\t" + convert(clazz, field.element) + "\n"); + fieldsStr.append("\t" + convert(clazz, field, field.element) + "\n"); } if (fieldsStr.length() > 0) { fieldsStr.append("\n"); @@ -130,28 +123,26 @@ public class JavaBuilder implements CodeBuilder, InitializingBean { } // 方法体可能没有内容,但是这并不意味着这个方法没有被实现 if (element.hasChild()) { - convertMethodElement(methodsStr, "\t\t", clazz, method.element); + convertMethodElement(methodsStr, "\t\t", clazz, method, method.element); methodsStr.append("\t}\n\n"); } } return methodsStr.toString(); } - public void convertMethodElement(StringBuilder builder, String indent, IClass clazz, Element father) { + public void convertMethodElement(StringBuilder builder, String indent, IClass clazz, IMethod method, + Element father) { for (Element element : father.children) { - builder.append(indent + convert(clazz, element) + "\n"); + builder.append(indent + convert(clazz, method, element) + "\n"); if (element.hasChild()) { - convertMethodElement(builder, indent + "\t", clazz, element); + convertMethodElement(builder, indent + "\t", clazz, method, element); } } } - public Element convert(IClass clazz, Element element) { + public Element convert(IClass clazz, MemberEntity member, Element element) { for (ElementAction action : actions) { - ElementEvent event = new ElementEvent(clazz, element); - if (action.isTrigger(event)) { - action.handle(event); - } + action.visitElement(new VisitContext(clazz, member), element); } return element; } diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java index 73156417..bafb34b4 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java @@ -1,80 +1,79 @@ -package com.gitee.spirit.output.java.action; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; - -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.action.AbstractElementAction; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; -import com.gitee.spirit.core.compile.entity.ElementEvent; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; -import com.gitee.spirit.core.element.utils.StmtVisiter; -import com.gitee.spirit.output.java.utils.TreeUtils; - -public abstract class AbstractTreeElementAction extends AbstractElementAction { - - public static final String START = "START"; - public static final String PREV_STATEMENT = "PREV_STATEMENT"; - public static final String PREV_TYPE = "PREV_TYPE"; - public static final String END = "END"; - public static final String NEXT_STATEMENT = "NEXT_STATEMENT"; - public static final String NEXT_TYPE = "NEXT_TYPE"; - - @Autowired - public FragmentDeducer deducer; - - @Override - public void handle(ElementEvent event) { - IClass clazz = event.clazz; - Statement statement = event.element; - StmtVisiter.visit(statement, stmt -> { - for (int index = 0; index < stmt.size(); index++) { - Token token = stmt.get(index); - if (isTrigger(token)) { - visit(clazz, stmt, index, token); - } - } - }); - } - - public void visit(IClass clazz, Statement statement, int index, Token token) { - Map context = new HashMap<>(); - visitPrev(clazz, statement, index, token, context); - visitNext(clazz, statement, index, token, context); - } - - public void visitPrev(IClass clazz, Statement statement, int index, Token token, Map context) { - int start = TreeUtils.findStart(statement, index); - Statement prevStatement = statement.subStmt(start, index); - IType prevType = deducer.derive(clazz, prevStatement); - context.put(START, start); - context.put(PREV_STATEMENT, prevStatement); - context.put(PREV_TYPE, prevType); - doVisitPrev(clazz, statement, index, token, context); - } - - public void visitNext(IClass clazz, Statement statement, int index, Token token, Map context) { - int end = TreeUtils.findEnd(statement, index); - Statement nextStatement = statement.subStmt(index + 1, end); - IType nextType = deducer.derive(clazz, nextStatement); - context.put(END, end); - context.put(NEXT_STATEMENT, nextStatement); - context.put(NEXT_TYPE, nextType); - doVisitNext(clazz, statement, index, token, context); - } - - public void doVisitPrev(IClass clazz, Statement statement, int index, Token token, Map context) { - // ignore - } - - public void doVisitNext(IClass clazz, Statement statement, int index, Token token, Map context) { - // ignore - } - - public abstract boolean isTrigger(Token currentToken); - -} +package com.gitee.spirit.output.java.action; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.StmtVisiter; +import com.gitee.spirit.output.java.utils.TreeUtils; + +public abstract class AbstractTreeElementAction extends ExtElementAction { + + public static final String START = "START"; + public static final String PREV_STATEMENT = "PREV_STATEMENT"; + public static final String PREV_TYPE = "PREV_TYPE"; + public static final String END = "END"; + public static final String NEXT_STATEMENT = "NEXT_STATEMENT"; + public static final String NEXT_TYPE = "NEXT_TYPE"; + + @Autowired + public FragmentDeducer deducer; + + @Override + public void visitElement(VisitContext context, Element element) { + IClass clazz = context.clazz; + StmtVisiter.visit(element, stmt -> { + for (int index = 0; index < stmt.size(); index++) { + Token token = stmt.get(index); + if (isTrigger(token)) { + visit(clazz, stmt, index, token); + } + } + }); + } + + public void visit(IClass clazz, Statement statement, int index, Token token) { + Map context = new HashMap<>(); + visitPrev(clazz, statement, index, token, context); + visitNext(clazz, statement, index, token, context); + } + + public void visitPrev(IClass clazz, Statement statement, int index, Token token, Map context) { + int start = TreeUtils.findStart(statement, index); + Statement prevStatement = statement.subStmt(start, index); + IType prevType = deducer.derive(clazz, prevStatement); + context.put(START, start); + context.put(PREV_STATEMENT, prevStatement); + context.put(PREV_TYPE, prevType); + doVisitPrev(clazz, statement, index, token, context); + } + + public void visitNext(IClass clazz, Statement statement, int index, Token token, Map context) { + int end = TreeUtils.findEnd(statement, index); + Statement nextStatement = statement.subStmt(index + 1, end); + IType nextType = deducer.derive(clazz, nextStatement); + context.put(END, end); + context.put(NEXT_STATEMENT, nextStatement); + context.put(NEXT_TYPE, nextType); + doVisitNext(clazz, statement, index, token, context); + } + + public void doVisitPrev(IClass clazz, Statement statement, int index, Token token, Map context) { + // ignore + } + + public void doVisitNext(IClass clazz, Statement statement, int index, Token token, Map context) { + // ignore + } + + public abstract boolean isTrigger(Token currentToken); + +} diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java index 9d2de82f..42985298 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java @@ -3,27 +3,24 @@ package com.gitee.spirit.output.java.action; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.gitee.spirit.common.annotation.Native; import com.gitee.spirit.common.enums.TokenTypeEnum; import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.compile.action.AbstractElementAction; -import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; import com.gitee.spirit.core.element.utils.StmtVisiter; import com.gitee.spirit.stdlib.Lists; import com.gitee.spirit.stdlib.Maps; -@Native @Component @Order(-80) -public class CommonAction extends AbstractElementAction { +public class CommonAction extends ExtElementAction { @Override - public void handle(ElementEvent event) { - IClass clazz = event.clazz; - Statement statement = event.element; - StmtVisiter.visit(statement, stmt -> { + public void visitElement(VisitContext context, Element element) { + IClass clazz = context.clazz; + StmtVisiter.visit(element, stmt -> { stmt.forEach(token -> { if (token.isArrayInit()) {// String[10] => new String[10] Statement subStatement = token.getValue(); diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java index 11be0be5..a4595c2c 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java @@ -1,36 +1,32 @@ -package com.gitee.spirit.output.java.action; - -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.annotation.Native; -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.compile.action.AbstractElementAction; -import com.gitee.spirit.core.compile.entity.ElementEvent; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.utils.StmtVisiter; -import com.gitee.spirit.stdlib.Emptys; - -@Native -@Component -@Order(-100) -public class EmptyAction extends AbstractElementAction { - - @Override - public void handle(ElementEvent event) { - IClass clazz = event.clazz; - Statement statement = event.element; - StmtVisiter.visit(statement, stmt -> { - stmt.forEach(token -> { - if (token.isLocalMethod()) {// empty(str) - if (KeywordEnum.EMPTY.value.equals(token.attr(Attribute.MEMBER_NAME))) { - clazz.addStaticImport(Emptys.class.getName() + ".empty"); - } - } - }); - }); - } - -} +package com.gitee.spirit.output.java.action; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.compile.entity.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.utils.StmtVisiter; +import com.gitee.spirit.stdlib.Emptys; + +@Component +@Order(-100) +public class EmptyAction extends ExtElementAction { + + @Override + public void visitElement(VisitContext context, Element element) { + IClass clazz = context.clazz; + StmtVisiter.visit(element, stmt -> { + stmt.forEach(token -> { + if (token.isLocalMethod()) {// empty(str) + if (KeywordEnum.EMPTY.value.equals(token.attr(Attribute.MEMBER_NAME))) { + clazz.addStaticImport(Emptys.class.getName() + ".empty"); + } + } + }); + }); + } + +} diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/ExtElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/ExtElementAction.java new file mode 100644 index 00000000..143ced94 --- /dev/null +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/ExtElementAction.java @@ -0,0 +1,6 @@ +package com.gitee.spirit.output.java.action; + +import com.gitee.spirit.core.compile.action.AbstractElementAction; + +public abstract class ExtElementAction extends AbstractElementAction { +} diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java index 5694b983..22bf9c0d 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java @@ -3,29 +3,23 @@ package com.gitee.spirit.output.java.action; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.gitee.spirit.common.annotation.Native; import com.gitee.spirit.common.enums.TokenTypeEnum; import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.compile.action.AbstractElementAction; -import com.gitee.spirit.core.compile.entity.ElementEvent; +import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; -@Native @Component @Order(-20) -public class SeparatorAction extends AbstractElementAction { +public class SeparatorAction extends ExtElementAction { @Override - public void handle(ElementEvent event) { - IClass clazz = event.clazz; - Element element = event.element; - + public void visitElement(VisitContext context, Element element) { + IClass clazz = context.clazz; if (element.isIf() || element.isElseIf() || element.isWhile() || element.isCatch() || element.isSync()) { insertBrackets(clazz, element); } - if (element.isDeclare() || element.isDeclareAssign() || element.isAssign() || // element.isFieldAssign() || element.isInvoke() || element.isReturn() || // element.isSuper() || element.isThis() || element.isThrow() || // diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java index f423c093..f7e5f1d5 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java @@ -8,40 +8,36 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.gitee.spirit.common.annotation.Native; import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.common.enums.KeywordEnum; import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.core.api.ElementBuilder; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.AutoImporter; -import com.gitee.spirit.core.compile.action.AbstractElementAction; import com.gitee.spirit.core.compile.deduce.FragmentDeducer; -import com.gitee.spirit.core.compile.entity.ElementEvent; -import com.gitee.spirit.core.element.DefaultElementBuilder; +import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; import com.gitee.spirit.output.java.JavaBuilder; import com.gitee.spirit.output.java.utils.TypeUtils; -@Native @Component @Order(-40) -public class StatementAction extends AbstractElementAction { +public class StatementAction extends ExtElementAction { @Autowired - public DefaultElementBuilder builder; + public ElementBuilder builder; @Autowired public FragmentDeducer deducer; @Autowired public AutoImporter importer; @Override - public void handle(ElementEvent event) { - IClass clazz = event.clazz; - Element element = event.element; + public void visitElement(VisitContext context, Element element) { + IClass clazz = context.clazz; if (element.isDeclare() || element.isDeclareAssign() || element.isAssign()) { element.replaceModifier(KeywordEnum.CONST.value, JavaBuilder.FINAL_KEYWORD); @@ -99,8 +95,10 @@ public class StatementAction extends AbstractElementAction { if (clazz.getField("logger") == null) { clazz.addImport(Logger.class.getName()); clazz.addImport(LoggerFactory.class.getName()); - Element loggerElement = builder.build("Logger logger = LoggerFactory.getLogger(" + clazz.getSimpleName() + ".class)"); - loggerElement.addModifiers(KeywordEnum.PUBLIC.value, KeywordEnum.STATIC.value, JavaBuilder.FINAL_KEYWORD); + Element loggerElement = builder + .build("Logger logger = LoggerFactory.getLogger(" + clazz.getSimpleName() + ".class)"); + loggerElement.addModifiers(KeywordEnum.PUBLIC.value, KeywordEnum.STATIC.value, + JavaBuilder.FINAL_KEYWORD); IField field = new IField(new ArrayList<>(), loggerElement); clazz.fields.add(0, field); } diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java index e726cbc1..dfe1d32b 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java @@ -7,7 +7,6 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import com.gitee.spirit.common.annotation.Native; import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.common.enums.TokenTypeEnum; import com.gitee.spirit.core.clazz.entity.IClass; @@ -17,7 +16,6 @@ import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; import com.gitee.spirit.output.java.utils.TypeUtils; -@Native @Component @Order(-60) public class StringEqualsAction extends AbstractTreeElementAction { diff --git a/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java index e8e2eec4..e22c6909 100644 --- a/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java +++ b/spirit-tools/spirit-code-tools/src/main/java/com/gitee/spirit/code/tools/core/ElementSelector.java @@ -1,47 +1,46 @@ -package com.gitee.spirit.code.tools.core; - -import java.util.Arrays; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.CoreCompiler; -import com.gitee.spirit.core.compile.DefaultElementVisiter; -import com.gitee.spirit.core.element.entity.Element; - -@Component -public class ElementSelector extends CoreCompiler { - - @Autowired - public DefaultElementVisiter visiter; - - public IType findElementAndGetType(IClass clazz, Integer lineNumber) { - Element element = findElement(Arrays.asList(clazz.element), lineNumber); - if (element != null) { - IVariable variable = visiter.getVariableIfPossible(clazz, element); - return variable.getType(); - } - return null; - } - - public Element findElement(List elements, Integer lineNumber) { - for (int index = 0; index < elements.size(); index++) { - Element element = elements.get(index); - if (element.line.number == lineNumber) { - return element; - } - if (element.hasChild()) { - Element subElement = findElement(element.children, lineNumber); - if (subElement != null) { - return subElement; - } - } - } - return null; - } - -} +package com.gitee.spirit.code.tools.core; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.CoreCompiler; +import com.gitee.spirit.core.compile.DefaultElementVisiter; +import com.gitee.spirit.core.element.entity.Element; + +@Component +public class ElementSelector extends CoreCompiler { + + @Autowired + public DefaultElementVisiter visiter; + + public IType findElementAndGetType(IClass clazz, Integer lineNumber) { + // TODO +// Element element = findElement(Arrays.asList(clazz.element), lineNumber); +// if (element != null) { +// IVariable variable = visiter.getVariableIfPossible(clazz, element); +// return variable.getType(); +// } + return null; + } + + public Element findElement(List elements, Integer lineNumber) { + for (int index = 0; index < elements.size(); index++) { + Element element = elements.get(index); + if (element.line.number == lineNumber) { + return element; + } + if (element.hasChild()) { + Element subElement = findElement(element.children, lineNumber); + if (subElement != null) { + return subElement; + } + } + } + return null; + } + +} -- Gitee From 74017ea8e4f04ae0e53b0466585a0b60f2ff81ed Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 21:26:18 +0800 Subject: [PATCH 48/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/spirit/core/compile/DefaultElementVisiter.java | 4 ++-- .../{AppElementAction.java => AbstractAppElementAction.java} | 2 +- .../spirit/core/compile/action/ExpressDeclareAction.java | 2 +- .../gitee/spirit/core/compile/action/InvokeVisitAction.java | 2 +- .../gitee/spirit/core/compile/action/TypeDeclareAction.java | 2 +- .../gitee/spirit/core/compile/action/VariableTrackAction.java | 2 +- .../main/java/com/gitee/spirit/output/java/JavaBuilder.java | 4 ++-- .../{ExtElementAction.java => AbstractExtElementAction.java} | 2 +- .../spirit/output/java/action/AbstractTreeElementAction.java | 2 +- .../com/gitee/spirit/output/java/action/CommonAction.java | 2 +- .../java/com/gitee/spirit/output/java/action/EmptyAction.java | 2 +- .../com/gitee/spirit/output/java/action/SeparatorAction.java | 2 +- .../com/gitee/spirit/output/java/action/StatementAction.java | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/{AppElementAction.java => AbstractAppElementAction.java} (37%) rename spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/{ExtElementAction.java => AbstractExtElementAction.java} (57%) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java index 9419a7dd..d04d0b24 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java @@ -9,7 +9,7 @@ import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.core.api.ElementAction; import com.gitee.spirit.core.api.ElementVisiter; import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.action.AppElementAction; +import com.gitee.spirit.core.compile.action.AbstractAppElementAction; import com.gitee.spirit.core.compile.deduce.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; @@ -20,7 +20,7 @@ import com.gitee.spirit.core.element.entity.Token; public class DefaultElementVisiter implements ElementVisiter { @Autowired - public List actions; + public List actions; @Autowired public FragmentDeducer deducer; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AppElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractAppElementAction.java similarity index 37% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AppElementAction.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractAppElementAction.java index 32b54c84..75b9d58d 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AppElementAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractAppElementAction.java @@ -1,4 +1,4 @@ package com.gitee.spirit.core.compile.action; -public abstract class AppElementAction extends AbstractElementAction { +public abstract class AbstractAppElementAction extends AbstractElementAction { } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index 08e320de..ebfbdd6e 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -20,7 +20,7 @@ import com.gitee.spirit.core.element.entity.Token; @Component @Order(-80) -public class ExpressDeclareAction extends AppElementAction { +public class ExpressDeclareAction extends AbstractAppElementAction { @Autowired public VariableTracker tracker; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java index 02384d9c..39df21b3 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java @@ -22,7 +22,7 @@ import com.gitee.spirit.core.element.utils.StmtVisiter; @Component @Order(-40) -public class InvokeVisitAction extends AppElementAction { +public class InvokeVisitAction extends AbstractAppElementAction { @Autowired public TypeFactory factory; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/TypeDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/TypeDeclareAction.java index 6a528d80..17a6623c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/TypeDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/TypeDeclareAction.java @@ -13,7 +13,7 @@ import com.gitee.spirit.core.element.entity.Token; @Component @Order(-100) -public class TypeDeclareAction extends AppElementAction { +public class TypeDeclareAction extends AbstractAppElementAction { @Autowired public TypeFactory factory; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java index 5e2c0209..016e55cd 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java @@ -14,7 +14,7 @@ import com.gitee.spirit.core.element.utils.StmtVisiter; @Component @Order(-60) -public class VariableTrackAction extends AppElementAction { +public class VariableTrackAction extends AbstractAppElementAction { @Autowired public VariableTracker tracker; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java index 41dbcb4b..35dd4180 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java @@ -16,7 +16,7 @@ import com.gitee.spirit.core.clazz.frame.MemberEntity; import com.gitee.spirit.core.compile.AutoImporter; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; -import com.gitee.spirit.output.java.action.ExtElementAction; +import com.gitee.spirit.output.java.action.AbstractExtElementAction; @Component public class JavaBuilder implements CodeBuilder { @@ -28,7 +28,7 @@ public class JavaBuilder implements CodeBuilder { @Autowired public AutoImporter importer; @Autowired - public List actions; + public List actions; @Override public String build(IClass clazz) { diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/ExtElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractExtElementAction.java similarity index 57% rename from spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/ExtElementAction.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractExtElementAction.java index 143ced94..8408b3e4 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/ExtElementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractExtElementAction.java @@ -2,5 +2,5 @@ package com.gitee.spirit.output.java.action; import com.gitee.spirit.core.compile.action.AbstractElementAction; -public abstract class ExtElementAction extends AbstractElementAction { +public abstract class AbstractExtElementAction extends AbstractElementAction { } diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java index bafb34b4..b501687c 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java @@ -15,7 +15,7 @@ import com.gitee.spirit.core.element.entity.Token; import com.gitee.spirit.core.element.utils.StmtVisiter; import com.gitee.spirit.output.java.utils.TreeUtils; -public abstract class AbstractTreeElementAction extends ExtElementAction { +public abstract class AbstractTreeElementAction extends AbstractExtElementAction { public static final String START = "START"; public static final String PREV_STATEMENT = "PREV_STATEMENT"; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java index 42985298..941a030d 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/CommonAction.java @@ -15,7 +15,7 @@ import com.gitee.spirit.stdlib.Maps; @Component @Order(-80) -public class CommonAction extends ExtElementAction { +public class CommonAction extends AbstractExtElementAction { @Override public void visitElement(VisitContext context, Element element) { diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java index a4595c2c..079468f1 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/EmptyAction.java @@ -13,7 +13,7 @@ import com.gitee.spirit.stdlib.Emptys; @Component @Order(-100) -public class EmptyAction extends ExtElementAction { +public class EmptyAction extends AbstractExtElementAction { @Override public void visitElement(VisitContext context, Element element) { diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java index 22bf9c0d..decd382d 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/SeparatorAction.java @@ -12,7 +12,7 @@ import com.gitee.spirit.core.element.entity.Token; @Component @Order(-20) -public class SeparatorAction extends ExtElementAction { +public class SeparatorAction extends AbstractExtElementAction { @Override public void visitElement(VisitContext context, Element element) { diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java index f7e5f1d5..846aafda 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java @@ -26,7 +26,7 @@ import com.gitee.spirit.output.java.utils.TypeUtils; @Component @Order(-40) -public class StatementAction extends ExtElementAction { +public class StatementAction extends AbstractExtElementAction { @Autowired public ElementBuilder builder; -- Gitee From bcdc2a2740ab6fa3a623d10740259e98b4cff9ee Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 21:52:28 +0800 Subject: [PATCH 49/66] =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E5=87=BA=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E6=8E=A8=E5=AF=BC=E5=99=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/core/api/VariableTracker.java | 10 + .../spirit/core/compile/AppTypeFactory.java | 322 +++++++++--------- .../core/compile/DefaultClassVisiter.java | 1 - .../core/compile/DefaultElementVisiter.java | 1 - ...acker.java => DefaultVariableTracker.java} | 31 +- .../compile/{deduce => }/FragmentDeducer.java | 118 +++---- .../compile/{deduce => }/TypeDerivator.java | 174 +++++----- .../compile/action/ExpressDeclareAction.java | 8 +- .../compile/action/InvokeVisitAction.java | 4 +- .../compile/action/VariableTrackAction.java | 11 +- .../compile/linker/AdaptiveClassLinker.java | 322 +++++++++--------- .../core/compile/linker/AppClassLinker.java | 2 +- .../core/compile/linker/MethodMatcher.java | 76 ++--- .../action/AbstractTreeElementAction.java | 2 +- .../output/java/action/StatementAction.java | 2 +- .../java/deduce/NativeTypeDerivator.java | 170 ++++----- 16 files changed, 628 insertions(+), 626 deletions(-) create mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/VariableTracker.java rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{deduce/VariableTracker.java => DefaultVariableTracker.java} (77%) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{deduce => }/FragmentDeducer.java (94%) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{deduce => }/TypeDerivator.java (95%) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/VariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/VariableTracker.java new file mode 100644 index 00000000..912f9956 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/VariableTracker.java @@ -0,0 +1,10 @@ +package com.gitee.spirit.core.api; + +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.entity.VisitContext; + +public interface VariableTracker { + + IType findVariableType(VisitContext context, String variableName); + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java index aa99c775..fa1e83b3 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java @@ -1,162 +1,160 @@ -package com.gitee.spirit.core.compile; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.common.enums.ModifierEnum; -import com.gitee.spirit.common.enums.PrimitiveEnum; -import com.gitee.spirit.core.clazz.AbstractTypeFactory; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.clazz.utils.TypeUtils; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; - -import cn.hutool.core.lang.Assert; - -@Primary -@Component -public class AppTypeFactory extends AbstractTypeFactory { - - @Autowired - public AppClassLoader classLoader; - @Autowired - public FragmentDeducer deducer; - @Autowired - public TypeDerivator derivator; - - @Override - public IType create(String className) {// 一般来说,className可以直接反应出大部分属性 - IType type = new IType(); - type.setClassName(className); - type.setSimpleName(TypeUtils.getSimpleName(className)); - type.setTypeName(TypeUtils.getTypeName(className)); - type.setPrimitive(PrimitiveEnum.isPrimitive(className)); - type.setArray(TypeUtils.isArray(className)); - type.setNull(false); - type.setWildcard(false); - type.setNative(!classLoader.contains(TypeUtils.getTargetName(className))); - type.setModifiers(ModifierEnum.PUBLIC.value); - return type; - } - - @Override - public IType create(IClass clazz, Token token) { - if (token.isType()) { - return doCreate(clazz, token); - - } else if (token.isAnnotation() || token.isArrayInit() || token.isTypeInit() || token.isCast()) { - return create(clazz, (String) token.attr(Attribute.SIMPLE_NAME)); - - } else if (token.isLiteral()) {// 1, 1.1, "xxxx" - return getValueType(clazz, token); - } - return null; - } - - public IType doCreate(IClass clazz, Token token) { - if (token.value instanceof String) {// String // String[] //? //T,K - String simpleName = token.getValue(); - if ("?".equals(simpleName)) { - return TypeTable.WILDCARD;// ? - } - if (clazz.getTypeVariableIndex(simpleName) >= 0) { - return createTypeVariable(simpleName);// T or K - } - return create(clazz.findClassName(simpleName)); - - } else if (token.value instanceof Statement) { - Statement statement = token.getValue(); // List // Class - String simpleName = statement.getStr(0); - IType type = create(clazz.findClassName(simpleName)); - type.setGenericTypes(getGenericTypes(clazz, statement)); - return type; - } - throw new RuntimeException("Unknown token value type!"); - } - - public List getGenericTypes(IClass clazz, Statement statement) { - List genericTypes = new ArrayList<>(); - for (int i = 1; i < statement.size(); i++) { - Token token = statement.get(i); - if (token.isType()) { - genericTypes.add(create(clazz, token)); - } - } - return genericTypes; - } - - public IType getValueType(IClass clazz, Token token) { - if (token.isBoolean()) { - return TypeTable.BOOLEAN; - } else if (token.isChar()) { - return TypeTable.CHAR; - } else if (token.isInt()) { - return TypeTable.INT; - } else if (token.isLong()) { - return TypeTable.LONG; - } else if (token.isDouble()) { - return TypeTable.DOUBLE; - } else if (token.isNull()) { - return TypeTable.NULL; - } else if (token.isString()) { - return TypeTable.STRING; - } else if (token.isList()) { - return getListType(clazz, token); - } else if (token.isMap()) { - return getMapType(clazz, token); - } - return null; - } - - public IType getListType(IClass clazz, Token token) { - Statement statement = token.getValue(); - List statements = statement.subStmt(1, statement.size() - 1).splitStmt(","); - return create(TypeTable.LIST.getClassName(), getGenericType(clazz, statements)); - } - - public IType getMapType(IClass clazz, Token token) { - 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 create(TypeTable.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); - } - - public IType getGenericType(IClass clazz, List statements) { - // 如果没有元素,则返回Object类型 - if (statements.size() == 0) { - return TypeTable.OBJECT; - } - IType genericType = null; - for (Statement statement : statements) { - IType boxType = derivator.toBox(deducer.derive(clazz, statement)); - if (genericType == null) { - genericType = boxType; - continue; - } - if (derivator.isMoreAbstract(boxType, genericType)) {// 更抽象则替换 - genericType = boxType; - - } else if (!derivator.isMoreAbstract(genericType, boxType)) {// 不同则使用Object - genericType = TypeTable.OBJECT; - break; - } - } - Assert.notNull(genericType, "Generic type cannot be null!"); - return genericType; - } - -} +package com.gitee.spirit.core.compile; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.core.clazz.AbstractTypeFactory; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; + +import cn.hutool.core.lang.Assert; + +@Primary +@Component +public class AppTypeFactory extends AbstractTypeFactory { + + @Autowired + public AppClassLoader classLoader; + @Autowired + public FragmentDeducer deducer; + @Autowired + public TypeDerivator derivator; + + @Override + public IType create(String className) {// 一般来说,className可以直接反应出大部分属性 + IType type = new IType(); + type.setClassName(className); + type.setSimpleName(TypeUtils.getSimpleName(className)); + type.setTypeName(TypeUtils.getTypeName(className)); + type.setPrimitive(PrimitiveEnum.isPrimitive(className)); + type.setArray(TypeUtils.isArray(className)); + type.setNull(false); + type.setWildcard(false); + type.setNative(!classLoader.contains(TypeUtils.getTargetName(className))); + type.setModifiers(ModifierEnum.PUBLIC.value); + return type; + } + + @Override + public IType create(IClass clazz, Token token) { + if (token.isType()) { + return doCreate(clazz, token); + + } else if (token.isAnnotation() || token.isArrayInit() || token.isTypeInit() || token.isCast()) { + return create(clazz, (String) token.attr(Attribute.SIMPLE_NAME)); + + } else if (token.isLiteral()) {// 1, 1.1, "xxxx" + return getValueType(clazz, token); + } + return null; + } + + public IType doCreate(IClass clazz, Token token) { + if (token.value instanceof String) {// String // String[] //? //T,K + String simpleName = token.getValue(); + if ("?".equals(simpleName)) { + return TypeTable.WILDCARD;// ? + } + if (clazz.getTypeVariableIndex(simpleName) >= 0) { + return createTypeVariable(simpleName);// T or K + } + return create(clazz.findClassName(simpleName)); + + } else if (token.value instanceof Statement) { + Statement statement = token.getValue(); // List // Class + String simpleName = statement.getStr(0); + IType type = create(clazz.findClassName(simpleName)); + type.setGenericTypes(getGenericTypes(clazz, statement)); + return type; + } + throw new RuntimeException("Unknown token value type!"); + } + + public List getGenericTypes(IClass clazz, Statement statement) { + List genericTypes = new ArrayList<>(); + for (int i = 1; i < statement.size(); i++) { + Token token = statement.get(i); + if (token.isType()) { + genericTypes.add(create(clazz, token)); + } + } + return genericTypes; + } + + public IType getValueType(IClass clazz, Token token) { + if (token.isBoolean()) { + return TypeTable.BOOLEAN; + } else if (token.isChar()) { + return TypeTable.CHAR; + } else if (token.isInt()) { + return TypeTable.INT; + } else if (token.isLong()) { + return TypeTable.LONG; + } else if (token.isDouble()) { + return TypeTable.DOUBLE; + } else if (token.isNull()) { + return TypeTable.NULL; + } else if (token.isString()) { + return TypeTable.STRING; + } else if (token.isList()) { + return getListType(clazz, token); + } else if (token.isMap()) { + return getMapType(clazz, token); + } + return null; + } + + public IType getListType(IClass clazz, Token token) { + Statement statement = token.getValue(); + List statements = statement.subStmt(1, statement.size() - 1).splitStmt(","); + return create(TypeTable.LIST.getClassName(), getGenericType(clazz, statements)); + } + + public IType getMapType(IClass clazz, Token token) { + 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 create(TypeTable.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); + } + + public IType getGenericType(IClass clazz, List statements) { + // 如果没有元素,则返回Object类型 + if (statements.size() == 0) { + return TypeTable.OBJECT; + } + IType genericType = null; + for (Statement statement : statements) { + IType boxType = derivator.toBox(deducer.derive(clazz, statement)); + if (genericType == null) { + genericType = boxType; + continue; + } + if (derivator.isMoreAbstract(boxType, genericType)) {// 更抽象则替换 + genericType = boxType; + + } else if (!derivator.isMoreAbstract(genericType, boxType)) {// 不同则使用Object + genericType = TypeTable.OBJECT; + break; + } + } + Assert.notNull(genericType, "Generic type cannot be null!"); + return genericType; + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index 45ecc9c0..0b43de2b 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -21,7 +21,6 @@ import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.clazz.frame.MemberEntity; import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java index d04d0b24..bd22fc64 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java @@ -10,7 +10,6 @@ import com.gitee.spirit.core.api.ElementAction; import com.gitee.spirit.core.api.ElementVisiter; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.compile.action.AbstractAppElementAction; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java similarity index 77% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java index 78138626..a3ff779b 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/VariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java @@ -1,10 +1,11 @@ -package com.gitee.spirit.core.compile.deduce; +package com.gitee.spirit.core.compile; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gitee.spirit.common.enums.KeywordEnum; import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.VariableTracker; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IParameter; @@ -12,16 +13,23 @@ import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.compile.entity.VisitContext; -import cn.hutool.core.lang.Assert; - @Component -public class VariableTracker { +public class DefaultVariableTracker implements VariableTracker { @Autowired public TypeDerivator derivator; @Autowired public ClassLinker linker; + @Override + public IType findVariableType(VisitContext context, String variableName) { + IType type = findTypeByContext(context, variableName); + if (type == null) { + type = findTypeByInherit(context.clazz, variableName); + } + return type; + } + public IType findTypeByKeyword(IClass clazz, String variableName) { if (KeywordEnum.isSuper(variableName)) {// super return derivator.withSuperModifiers(clazz.getSuperType()); @@ -55,24 +63,9 @@ public class VariableTracker { try { // 从本身和父类里面寻找,父类可能是native的 return linker.visitField(derivator.withThisModifiers(clazz.getType()), variableName); - } catch (NoSuchFieldException e) { return null; } } - public IType findVariableType(IClass clazz, VisitContext context, String variableName) { - IType type = findTypeByContext(context, variableName); - if (type == null) { - type = findTypeByInherit(clazz, variableName); - } - return type; - } - - public IType getVariableType(IClass clazz, VisitContext context, String variableName) { - IType type = findVariableType(clazz, context, variableName); - Assert.notNull(type, "Variable must be declared!variableName:" + variableName); - return type; - } - } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/FragmentDeducer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/FragmentDeducer.java similarity index 94% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/FragmentDeducer.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/FragmentDeducer.java index 59f8b3ec..673d0ca6 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/FragmentDeducer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/FragmentDeducer.java @@ -1,59 +1,59 @@ -package com.gitee.spirit.core.compile.deduce; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.core.api.TreeBuilder; -import com.gitee.spirit.core.clazz.entity.IClass; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.element.entity.Node; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; - -@Component -public class FragmentDeducer { - - @Autowired - public TreeBuilder builder; - - public IType derive(IClass clazz, Statement statement) { - List nodes = builder.buildNodes(statement); - for (Node node : nodes) { - IType type = getTypeByNode(clazz, node); - if (type != null) { - return type; - } - } - throw new RuntimeException("Unhandled branch!"); - } - - public static IType getTypeByNode(IClass clazz, Node node) { - Token token = node.token; - - // 如果有类型直接返回 - if (token.attr(Attribute.TYPE) != null) { - return token.attr(Attribute.TYPE); - } - - // 如果是逻辑判断,或者类型判断关键字 - if (token.isLogical() || token.isRelation() || token.isInstanceof()) { - return TypeTable.BOOLEAN; - - } else if (token.isArithmetic() || token.isBitwise()) { - // 先取左边的,再取右边的 - if (node.prev != null) { - return getTypeByNode(clazz, node.prev); - - } else if (node.next != null) { - return getTypeByNode(clazz, node.next); - } - } - - return null; - } - -} +package com.gitee.spirit.core.compile; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.core.api.TreeBuilder; +import com.gitee.spirit.core.clazz.entity.IClass; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.element.entity.Node; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; + +@Component +public class FragmentDeducer { + + @Autowired + public TreeBuilder builder; + + public IType derive(IClass clazz, Statement statement) { + List nodes = builder.buildNodes(statement); + for (Node node : nodes) { + IType type = getTypeByNode(clazz, node); + if (type != null) { + return type; + } + } + throw new RuntimeException("Unhandled branch!"); + } + + public static IType getTypeByNode(IClass clazz, Node node) { + Token token = node.token; + + // 如果有类型直接返回 + if (token.attr(Attribute.TYPE) != null) { + return token.attr(Attribute.TYPE); + } + + // 如果是逻辑判断,或者类型判断关键字 + if (token.isLogical() || token.isRelation() || token.isInstanceof()) { + return TypeTable.BOOLEAN; + + } else if (token.isArithmetic() || token.isBitwise()) { + // 先取左边的,再取右边的 + if (node.prev != null) { + return getTypeByNode(clazz, node.prev); + + } else if (node.next != null) { + return getTypeByNode(clazz, node.next); + } + } + + return null; + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/TypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/TypeDerivator.java similarity index 95% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/TypeDerivator.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/TypeDerivator.java index a2e7594f..ed032628 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/deduce/TypeDerivator.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/TypeDerivator.java @@ -1,87 +1,87 @@ -package com.gitee.spirit.core.compile.deduce; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.enums.ModifierEnum; -import com.gitee.spirit.core.api.ClassLinker; -import com.gitee.spirit.core.api.TypeFactory; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeBuilder; -import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.clazz.utils.TypeVisiter; - -import cn.hutool.core.lang.Assert; - -@Primary -@Component -public class TypeDerivator { - - @Autowired - public TypeFactory factory; - @Autowired - public ClassLinker linker; - - public IType toBox(IType type) { - IType boxType = TypeTable.getBoxType(type.getClassName()); - return boxType != null ? boxType : type; - } - - public IType toTarget(IType type) { - return factory.create(type.getTargetName()); - } - - public IType withSuperModifiers(IType type) { - type.setModifiers(ModifierEnum.SUPER.value); - return type; - } - - public IType withThisModifiers(IType type) { - type.setModifiers(ModifierEnum.THIS.value); - return type; - } - - public IType populate(IType instanceType, IType targetType) {// 根据全局类型,进行填充 - return TypeVisiter.visit(targetType, eachType -> { - if (eachType.isTypeVariable()) { - int index = linker.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 eachType; - }); - } - - public Integer getAbstractScore(IType abstractType, IType type) { - if (abstractType == null || type == null) { - return null; - } - if (abstractType.isNull()) {// null类型不能比任何类型抽象 - return null; - } - if (type.isNull()) {// 任何类型都能比null抽象 - return 0; - } - if (type.equals(abstractType)) {// 这个方法还要判断泛型 - return 0; - } - Integer score = getAbstractScore(abstractType, linker.getSuperType(toBox(type)));// 这个方法中,还要考虑到自动拆组包 - if (score != null) { - return score - 1; - } - for (IType interfaceType : linker.getInterfaceTypes(type)) {// 接口 - Integer score1 = getAbstractScore(abstractType, interfaceType); - if (score1 != null) { - return score1 - 1; - } - } - return null; - } - - public boolean isMoreAbstract(IType abstractType, IType type) { - return getAbstractScore(abstractType, type) != null; - } - -} +package com.gitee.spirit.core.compile; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeBuilder; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeVisiter; + +import cn.hutool.core.lang.Assert; + +@Primary +@Component +public class TypeDerivator { + + @Autowired + public TypeFactory factory; + @Autowired + public ClassLinker linker; + + public IType toBox(IType type) { + IType boxType = TypeTable.getBoxType(type.getClassName()); + return boxType != null ? boxType : type; + } + + public IType toTarget(IType type) { + return factory.create(type.getTargetName()); + } + + public IType withSuperModifiers(IType type) { + type.setModifiers(ModifierEnum.SUPER.value); + return type; + } + + public IType withThisModifiers(IType type) { + type.setModifiers(ModifierEnum.THIS.value); + return type; + } + + public IType populate(IType instanceType, IType targetType) {// 根据全局类型,进行填充 + return TypeVisiter.visit(targetType, eachType -> { + if (eachType.isTypeVariable()) { + int index = linker.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 eachType; + }); + } + + public Integer getAbstractScore(IType abstractType, IType type) { + if (abstractType == null || type == null) { + return null; + } + if (abstractType.isNull()) {// null类型不能比任何类型抽象 + return null; + } + if (type.isNull()) {// 任何类型都能比null抽象 + return 0; + } + if (type.equals(abstractType)) {// 这个方法还要判断泛型 + return 0; + } + Integer score = getAbstractScore(abstractType, linker.getSuperType(toBox(type)));// 这个方法中,还要考虑到自动拆组包 + if (score != null) { + return score - 1; + } + for (IType interfaceType : linker.getInterfaceTypes(type)) {// 接口 + Integer score1 = getAbstractScore(abstractType, interfaceType); + if (score1 != null) { + return score1 - 1; + } + } + return null; + } + + public boolean isMoreAbstract(IType abstractType, IType type) { + return getAbstractScore(abstractType, type) != null; + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index ebfbdd6e..209b6e4e 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -7,12 +7,12 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.core.api.ElementBuilder; import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.api.VariableTracker; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; -import com.gitee.spirit.core.compile.deduce.VariableTracker; +import com.gitee.spirit.core.compile.FragmentDeducer; +import com.gitee.spirit.core.compile.TypeDerivator; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; @@ -43,7 +43,7 @@ public class ExpressDeclareAction extends AbstractAppElementAction { if (element.isAssign()) {// text = "abc" Token varToken = element.get(0); // 如果是字段声明,则不用进行上下文推导 - IType type = context.isMethodScope() ? tracker.findVariableType(clazz, context, varToken.toString()) : null; + IType type = context.isMethodScope() ? tracker.findVariableType(context, varToken.toString()) : null; // 如果找不到,则必须通过推导获取类型 if (type == null) { Statement statement = element.subStmt(2, element.size()); diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java index 39df21b3..56679703 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java @@ -12,8 +12,8 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.compile.FragmentDeducer; +import com.gitee.spirit.core.compile.TypeDerivator; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java index 016e55cd..474c8ec6 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java @@ -7,17 +7,19 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.common.enums.KeywordEnum; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.deduce.VariableTracker; +import com.gitee.spirit.core.compile.DefaultVariableTracker; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.utils.StmtVisiter; +import cn.hutool.core.lang.Assert; + @Component @Order(-60) public class VariableTrackAction extends AbstractAppElementAction { @Autowired - public VariableTracker tracker; + public DefaultVariableTracker tracker; @Override public void visitElement(VisitContext context, Element element) { @@ -26,9 +28,10 @@ public class VariableTrackAction extends AbstractAppElementAction { if (token.attr(Attribute.TYPE) != null) { return; } - if (token.isVariable()) {// variable + if (token.isVariable()) { String variableName = token.toString(); - IType type = tracker.getVariableType(context.clazz, context, variableName); + IType type = tracker.findVariableType(context, variableName); + Assert.notNull(type, "Variable must be declared!variableName:" + variableName); token.setAttr(Attribute.TYPE, type); } else if (token.isKeyword() && KeywordEnum.isKeywordVariable(token.getValue())) { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index ed3bb60a..d86f6726 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -1,161 +1,161 @@ -package com.gitee.spirit.core.compile.linker; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.common.enums.ModifierEnum; -import com.gitee.spirit.core.api.ClassLinker; -import com.gitee.spirit.core.api.TypeFactory; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; - -import cn.hutool.core.lang.Assert; - -@Primary -@Component -public class AdaptiveClassLinker implements ClassLinker { - - public static final String ARRAY_LENGTH = "length"; - - @Autowired - public TypeFactory factory; - @Autowired - public TypeDerivator derivator; - @Autowired - public Map linkers; - - public ClassLinker getLinker(IType type) { - if (!type.isNative()) { - return linkers.get("appClassLinker"); - } else { - return linkers.get("nativeClassLinker"); - } - } - - @Override - public T toClass(IType type) { - return getLinker(type).toClass(type); - } - - @Override - public int getTypeVariableIndex(IType type, String genericName) { - return getLinker(type).getTypeVariableIndex(type, genericName); - } - - @Override - public IType getSuperType(IType type) { - if (type.isPrimitive()) { - return null; - } - - if (type.isArray()) { - return TypeTable.OBJECT; - } - - if (TypeTable.OBJECT.equals(type)) { - return null; - } - - IType superType = getLinker(type).getSuperType(type);// 如果不存在父类,则返回Object - if (superType == null) { - return TypeTable.OBJECT; - } - - int modifiers = type.getModifiers(); - if (modifiers == ModifierEnum.THIS.value || modifiers == ModifierEnum.SUPER.value) { - superType.setModifiers(ModifierEnum.SUPER.value); - - } else if (modifiers == ModifierEnum.PUBLIC.value) { - superType.setModifiers(ModifierEnum.PUBLIC.value); - } - - return superType; - } - - @Override - public List getInterfaceTypes(IType type) { - if (type.isPrimitive()) { - return new ArrayList<>(); - } - if (type.isArray()) { - return new ArrayList<>(); - } - return getLinker(type).getInterfaceTypes(type); - } - - @Override - public IType visitField(IType type, String fieldName) throws NoSuchFieldException { - Assert.notNull(type, "Type cannot be null!"); - Assert.notEmpty(fieldName, "Field name cannot be empty!"); - - if (KeywordEnum.CLASS.value.equals(fieldName)) {// xxx.class class是关键字 - return factory.create(TypeTable.CLASS.getClassName(), derivator.toBox(type)); - } - - if (type.isPrimitive()) {// 原始类型没有属性和方法 - throw new RuntimeException("The primitive type has no field!"); - } - - if (type.isArray() && ARRAY_LENGTH.equals(fieldName)) {// 访问数组length直接返回int类型 - return TypeTable.INT; - } - - IType returnType = getLinker(type).visitField(type, fieldName);// 向上遍历推导 - if (returnType == null) { - IType superType = getSuperType(type); - if (superType != null) { - return visitField(superType, fieldName); - } - } - - if (returnType == null) { - throw new NoSuchFieldException(String.format("No such field!className:%s, fieldName:%s", type.getClassName(), fieldName)); - } - - return returnType; - } - - @Override - public IType visitMethod(IType type, String methodName, List parameterTypes) throws NoSuchMethodException { - Assert.notNull(type, "Type cannot be null!"); - Assert.notEmpty(methodName, "Method name cannot be empty!"); - - if (KeywordEnum.SUPER.value.equals(methodName) || KeywordEnum.THIS.value.equals(methodName)) {// super()和this()指代父类或者本身的构造函数,返回这个类本身 - return type; - } - - if (type.isPrimitive()) {// 原始类型没有属性和方法 - throw new RuntimeException("The primitive type has no method!"); - } - - if (type.isArray()) {// 原始类型没有属性和方法 - throw new RuntimeException("Array has no method!"); - } - - if (TypeTable.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 - return TypeTable.BOOLEAN; - } - - IType returnType = getLinker(type).visitMethod(type, methodName, parameterTypes);// 向上遍历推导 - if (returnType == null) { - IType superType = getSuperType(type); - if (superType != null) { - return visitMethod(superType, methodName, parameterTypes); - } - } - - if (returnType == null) { - throw new NoSuchMethodException(String.format("No such method!className:%s, methodName:%s", type.getClassName(), methodName)); - } - - return returnType; - } - -} +package com.gitee.spirit.core.compile.linker; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.compile.TypeDerivator; + +import cn.hutool.core.lang.Assert; + +@Primary +@Component +public class AdaptiveClassLinker implements ClassLinker { + + public static final String ARRAY_LENGTH = "length"; + + @Autowired + public TypeFactory factory; + @Autowired + public TypeDerivator derivator; + @Autowired + public Map linkers; + + public ClassLinker getLinker(IType type) { + if (!type.isNative()) { + return linkers.get("appClassLinker"); + } else { + return linkers.get("nativeClassLinker"); + } + } + + @Override + public T toClass(IType type) { + return getLinker(type).toClass(type); + } + + @Override + public int getTypeVariableIndex(IType type, String genericName) { + return getLinker(type).getTypeVariableIndex(type, genericName); + } + + @Override + public IType getSuperType(IType type) { + if (type.isPrimitive()) { + return null; + } + + if (type.isArray()) { + return TypeTable.OBJECT; + } + + if (TypeTable.OBJECT.equals(type)) { + return null; + } + + IType superType = getLinker(type).getSuperType(type);// 如果不存在父类,则返回Object + if (superType == null) { + return TypeTable.OBJECT; + } + + int modifiers = type.getModifiers(); + if (modifiers == ModifierEnum.THIS.value || modifiers == ModifierEnum.SUPER.value) { + superType.setModifiers(ModifierEnum.SUPER.value); + + } else if (modifiers == ModifierEnum.PUBLIC.value) { + superType.setModifiers(ModifierEnum.PUBLIC.value); + } + + return superType; + } + + @Override + public List getInterfaceTypes(IType type) { + if (type.isPrimitive()) { + return new ArrayList<>(); + } + if (type.isArray()) { + return new ArrayList<>(); + } + return getLinker(type).getInterfaceTypes(type); + } + + @Override + public IType visitField(IType type, String fieldName) throws NoSuchFieldException { + Assert.notNull(type, "Type cannot be null!"); + Assert.notEmpty(fieldName, "Field name cannot be empty!"); + + if (KeywordEnum.CLASS.value.equals(fieldName)) {// xxx.class class是关键字 + return factory.create(TypeTable.CLASS.getClassName(), derivator.toBox(type)); + } + + if (type.isPrimitive()) {// 原始类型没有属性和方法 + throw new RuntimeException("The primitive type has no field!"); + } + + if (type.isArray() && ARRAY_LENGTH.equals(fieldName)) {// 访问数组length直接返回int类型 + return TypeTable.INT; + } + + IType returnType = getLinker(type).visitField(type, fieldName);// 向上遍历推导 + if (returnType == null) { + IType superType = getSuperType(type); + if (superType != null) { + return visitField(superType, fieldName); + } + } + + if (returnType == null) { + throw new NoSuchFieldException(String.format("No such field!className:%s, fieldName:%s", type.getClassName(), fieldName)); + } + + return returnType; + } + + @Override + public IType visitMethod(IType type, String methodName, List parameterTypes) throws NoSuchMethodException { + Assert.notNull(type, "Type cannot be null!"); + Assert.notEmpty(methodName, "Method name cannot be empty!"); + + if (KeywordEnum.SUPER.value.equals(methodName) || KeywordEnum.THIS.value.equals(methodName)) {// super()和this()指代父类或者本身的构造函数,返回这个类本身 + return type; + } + + if (type.isPrimitive()) {// 原始类型没有属性和方法 + throw new RuntimeException("The primitive type has no method!"); + } + + if (type.isArray()) {// 原始类型没有属性和方法 + throw new RuntimeException("Array has no method!"); + } + + if (TypeTable.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 + return TypeTable.BOOLEAN; + } + + IType returnType = getLinker(type).visitMethod(type, methodName, parameterTypes);// 向上遍历推导 + if (returnType == null) { + IType superType = getSuperType(type); + if (superType != null) { + return visitMethod(superType, methodName, parameterTypes); + } + } + + if (returnType == null) { + throw new NoSuchMethodException(String.format("No such method!className:%s, methodName:%s", type.getClassName(), methodName)); + } + + return returnType; + } + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java index d5e321b6..b2670e61 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java @@ -15,7 +15,7 @@ import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.AppClassLoader; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; +import com.gitee.spirit.core.compile.TypeDerivator; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java index 12397a89..ee82567a 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java @@ -1,38 +1,38 @@ -package com.gitee.spirit.core.compile.linker; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.core.clazz.entity.IMethod; -import com.gitee.spirit.core.clazz.entity.IParameter; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; - -@Component -public class MethodMatcher { - - @Autowired - public TypeDerivator derivator; - - public Integer getMethodScore(IType type, IMethod method, List parameterTypes) { - if (method.parameters.size() != parameterTypes.size()) { - return null; - } - Integer finalScore = 0; - int index = 0; - for (IType parameterType : parameterTypes) { - IParameter parameter = method.parameters.get(index++); - IType methodParameterType = derivator.populate(type, parameter.getType()); - Integer scope = derivator.getAbstractScore(methodParameterType, parameterType); - if (scope != null) { - finalScore += scope; - } else { - finalScore = null; - break; - } - } - return finalScore; - } -} +package com.gitee.spirit.core.compile.linker; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.core.clazz.entity.IMethod; +import com.gitee.spirit.core.clazz.entity.IParameter; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.compile.TypeDerivator; + +@Component +public class MethodMatcher { + + @Autowired + public TypeDerivator derivator; + + public Integer getMethodScore(IType type, IMethod method, List parameterTypes) { + if (method.parameters.size() != parameterTypes.size()) { + return null; + } + Integer finalScore = 0; + int index = 0; + for (IType parameterType : parameterTypes) { + IParameter parameter = method.parameters.get(index++); + IType methodParameterType = derivator.populate(type, parameter.getType()); + Integer scope = derivator.getAbstractScore(methodParameterType, parameterType); + if (scope != null) { + finalScore += scope; + } else { + finalScore = null; + break; + } + } + return finalScore; + } +} diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java index b501687c..826375d3 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java @@ -7,7 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java index 846aafda..9db09deb 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java @@ -16,7 +16,7 @@ import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.AutoImporter; -import com.gitee.spirit.core.compile.deduce.FragmentDeducer; +import com.gitee.spirit.core.compile.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java index 4836f170..233e2e27 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java @@ -1,85 +1,85 @@ -package com.gitee.spirit.output.java.deduce; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.core.api.ClassLinker; -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeBuilder; -import com.gitee.spirit.core.clazz.utils.TypeVisiter; -import com.gitee.spirit.core.compile.deduce.TypeDerivator; - -@Component -public class NativeTypeDerivator extends TypeDerivator { - - @Autowired - public ClassLinker linker; - - @Override - public IType populate(IType type, IType targetType) {// 根据全局类型,进行填充 - return TypeVisiter.visit(targetType, eachType -> { - if (eachType.isTypeVariable()) { - int index = linker.getTypeVariableIndex(type, eachType.getGenericName()); - if (index >= 0) { - return TypeBuilder.copy(type.getGenericTypes().get(index)); - } - } - return eachType; - }); - } - - public IType populateParameter(IType type, IType parameterType, IType targetType) { - return populateQualifying(type, parameterType, targetType, new HashMap<>()); - } - - public IType populateQualifying(IType type, IType parameterType, IType targetType, Map qualifyingTypes) { - // 先使用类型填充 - targetType = populate(type, targetType); - // 然后使用参数类型填充 - targetType = populateQualifying(parameterType, targetType, qualifyingTypes); - // 返回类型 - return targetType; - } - - public IType populateQualifying(IType parameterType, IType targetType, Map qualifyingTypes) { - return TypeVisiter.visit(parameterType, targetType, (referType, eachType) -> { - if (eachType.isTypeVariable()) { - String genericName = eachType.getGenericName(); - if (qualifyingTypes.containsKey(genericName)) {// 如果已经存在了,则必须统一 - IType existType = qualifyingTypes.get(genericName); - if (!existType.equals(referType)) { - throw new RuntimeException("Parameter qualification types are not uniform!"); - } - return TypeBuilder.copy(referType); - - } else { - referType = TypeBuilder.copy(referType); - qualifyingTypes.put(genericName, referType); - return referType; - } - } - return eachType; - }); - } - - public IType populateReturnType(IType type, Map qualifyingTypes, IType targetType) { - // 先使用类型填充 - targetType = populate(type, targetType); - // 再用限定类型填充 - targetType = populateReturnType(qualifyingTypes, targetType); - // 返回类型 - return targetType; - } - - public IType populateReturnType(Map qualifyingTypes, IType targetType) { - return TypeVisiter.visit(targetType, eachType -> { - if (eachType.isTypeVariable()) { - return qualifyingTypes.get(targetType.getGenericName()); - } - return eachType; - }); - } -} +package com.gitee.spirit.output.java.deduce; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeBuilder; +import com.gitee.spirit.core.clazz.utils.TypeVisiter; +import com.gitee.spirit.core.compile.TypeDerivator; + +@Component +public class NativeTypeDerivator extends TypeDerivator { + + @Autowired + public ClassLinker linker; + + @Override + public IType populate(IType type, IType targetType) {// 根据全局类型,进行填充 + return TypeVisiter.visit(targetType, eachType -> { + if (eachType.isTypeVariable()) { + int index = linker.getTypeVariableIndex(type, eachType.getGenericName()); + if (index >= 0) { + return TypeBuilder.copy(type.getGenericTypes().get(index)); + } + } + return eachType; + }); + } + + public IType populateParameter(IType type, IType parameterType, IType targetType) { + return populateQualifying(type, parameterType, targetType, new HashMap<>()); + } + + public IType populateQualifying(IType type, IType parameterType, IType targetType, Map qualifyingTypes) { + // 先使用类型填充 + targetType = populate(type, targetType); + // 然后使用参数类型填充 + targetType = populateQualifying(parameterType, targetType, qualifyingTypes); + // 返回类型 + return targetType; + } + + public IType populateQualifying(IType parameterType, IType targetType, Map qualifyingTypes) { + return TypeVisiter.visit(parameterType, targetType, (referType, eachType) -> { + if (eachType.isTypeVariable()) { + String genericName = eachType.getGenericName(); + if (qualifyingTypes.containsKey(genericName)) {// 如果已经存在了,则必须统一 + IType existType = qualifyingTypes.get(genericName); + if (!existType.equals(referType)) { + throw new RuntimeException("Parameter qualification types are not uniform!"); + } + return TypeBuilder.copy(referType); + + } else { + referType = TypeBuilder.copy(referType); + qualifyingTypes.put(genericName, referType); + return referType; + } + } + return eachType; + }); + } + + public IType populateReturnType(IType type, Map qualifyingTypes, IType targetType) { + // 先使用类型填充 + targetType = populate(type, targetType); + // 再用限定类型填充 + targetType = populateReturnType(qualifyingTypes, targetType); + // 返回类型 + return targetType; + } + + public IType populateReturnType(Map qualifyingTypes, IType targetType) { + return TypeVisiter.visit(targetType, eachType -> { + if (eachType.isTypeVariable()) { + return qualifyingTypes.get(targetType.getGenericName()); + } + return eachType; + }); + } +} -- Gitee From a578cb0b9e7f43facf33dfdf9574e0a5a932b724 Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 22:03:37 +0800 Subject: [PATCH 50/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/compile/DefaultVariableTracker.java | 37 +++++++++---------- .../compile/action/VariableTrackAction.java | 11 ++---- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java index a3ff779b..33ec8375 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java @@ -23,46 +23,45 @@ public class DefaultVariableTracker implements VariableTracker { @Override public IType findVariableType(VisitContext context, String variableName) { - IType type = findTypeByContext(context, variableName); + IType type = findTypeByKeyword(context, variableName); if (type == null) { - type = findTypeByInherit(context.clazz, variableName); + type = context.isMethodScope() ? findTypeByContext(context, variableName) : null; + } + if (type == null) { + type = findTypeByInherit(context, variableName); } return type; } - public IType findTypeByKeyword(IClass clazz, String variableName) { + public IType findTypeByKeyword(VisitContext context, String variableName) { + IClass clazz = context.clazz; if (KeywordEnum.isSuper(variableName)) {// super return derivator.withSuperModifiers(clazz.getSuperType()); } else if (KeywordEnum.isThis(variableName)) {// this return derivator.withThisModifiers(clazz.getType()); } - throw new RuntimeException("Variable must be declared!variableName:" + variableName); + return null; } public IType findTypeByContext(VisitContext context, String variableName) { - if (context != null && context.isMethodScope()) { - // 变量 - for (IVariable variable : context.variables) { - if (variable.getName().equals(variableName) && context.getBlockId().startsWith(variable.blockId)) { - return variable.getType(); - } + for (IVariable variable : context.variables) { + if (variable.getName().equals(variableName) && context.getBlockId().startsWith(variable.blockId)) { + return variable.getType(); } - // 方法入参 - IMethod method = (IMethod) context.member; - for (IParameter parameter : method.parameters) { - if (parameter.getName().equals(variableName)) { - return parameter.getType(); - } + } + IMethod method = (IMethod) context.member; + for (IParameter parameter : method.parameters) { + if (parameter.getName().equals(variableName)) { + return parameter.getType(); } } return null; } - public IType findTypeByInherit(IClass clazz, String variableName) { + public IType findTypeByInherit(VisitContext context, String variableName) { try { - // 从本身和父类里面寻找,父类可能是native的 - return linker.visitField(derivator.withThisModifiers(clazz.getType()), variableName); + return linker.visitField(derivator.withThisModifiers(context.clazz.getType()), variableName);// 从本身和父类里面寻找,父类可能是native的 } catch (NoSuchFieldException e) { return null; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java index 474c8ec6..dc4f126b 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java @@ -6,8 +6,8 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.core.api.VariableTracker; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.DefaultVariableTracker; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.utils.StmtVisiter; @@ -19,7 +19,7 @@ import cn.hutool.core.lang.Assert; public class VariableTrackAction extends AbstractAppElementAction { @Autowired - public DefaultVariableTracker tracker; + public VariableTracker tracker; @Override public void visitElement(VisitContext context, Element element) { @@ -28,16 +28,11 @@ public class VariableTrackAction extends AbstractAppElementAction { if (token.attr(Attribute.TYPE) != null) { return; } - if (token.isVariable()) { + if (token.isVariable() || (token.isKeyword() && KeywordEnum.isKeywordVariable(token.getValue()))) { String variableName = token.toString(); IType type = tracker.findVariableType(context, variableName); Assert.notNull(type, "Variable must be declared!variableName:" + variableName); token.setAttr(Attribute.TYPE, type); - - } else if (token.isKeyword() && KeywordEnum.isKeywordVariable(token.getValue())) { - String variableName = token.toString(); - IType type = tracker.findTypeByKeyword(context.clazz, variableName); - token.setAttr(Attribute.TYPE, type); } }); }); -- Gitee From 3a0dc0dea6d0853358042cb9b35a5d865dcdeaab Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 22:10:50 +0800 Subject: [PATCH 51/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/gitee/spirit/core/api/ImportSelector.java | 2 +- .../java/com/gitee/spirit/core/clazz/frame/ImportEntity.java | 2 +- .../java/com/gitee/spirit/core/compile/AppImportSelector.java | 2 +- .../java/com/gitee/spirit/output/java/ExtImportSelector.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java index 0af71c22..becba27b 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ImportSelector.java @@ -2,7 +2,7 @@ package com.gitee.spirit.core.api; public interface ImportSelector { - boolean isHandle(String className); + boolean canHandle(String className); String findClassName(String simpleName); diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java index dee28233..99d1508a 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java @@ -127,7 +127,7 @@ public abstract class ImportEntity extends AnnotationEntity { } public boolean shouldImport(String selfClassName, String className) { - Boolean flag = ListUtils.collectOne(context.getImportSelectors(), importSelector -> importSelector.isHandle(className), + Boolean flag = ListUtils.collectOne(context.getImportSelectors(), importSelector -> importSelector.canHandle(className), importSelector -> importSelector.shouldImport(selfClassName, className)); return flag == null ? true : flag; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java index 2e2f1305..2580daca 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java @@ -13,7 +13,7 @@ public class AppImportSelector extends AbstractImportSelector { public AppClassLoader loader; @Override - public boolean isHandle(String className) { + public boolean canHandle(String className) { return loader.contains(className); } diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java index 0be6a70c..dcfb56ab 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java @@ -14,7 +14,7 @@ public class ExtImportSelector extends AbstractImportSelector { public ExtClassLoader loader; @Override - public boolean isHandle(String className) { + public boolean canHandle(String className) { return loader.contains(className); } -- Gitee From b757ec1bd2bb0c4ceeb9ceac15e0bc6d574953c4 Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 23:01:58 +0800 Subject: [PATCH 52/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compile/linker/AdaptiveClassLinker.java | 8 +- .../core/compile/linker/AppClassLinker.java | 2 +- ...thodMatcher.java => AppMethodMatcher.java} | 2 +- ...peDerivator.java => ExtTypeDerivator.java} | 4 +- ...veTypeFactory.java => ExtTypeFactory.java} | 4 +- ...veClassLinker.java => ExtClassLinker.java} | 12 +- ...thodMatcher.java => ExtMethodMatcher.java} | 118 +++++++++--------- 7 files changed, 76 insertions(+), 74 deletions(-) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/{MethodMatcher.java => AppMethodMatcher.java} (93%) rename spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/{deduce/NativeTypeDerivator.java => ExtTypeDerivator.java} (93%) rename spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/{deduce/NativeTypeFactory.java => ExtTypeFactory.java} (91%) rename spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/{NativeClassLinker.java => ExtClassLinker.java} (90%) rename spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/{NativeMethodMatcher.java => ExtMethodMatcher.java} (88%) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index d86f6726..12f2291c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -35,7 +35,7 @@ public class AdaptiveClassLinker implements ClassLinker { if (!type.isNative()) { return linkers.get("appClassLinker"); } else { - return linkers.get("nativeClassLinker"); + return linkers.get("extClassLinker"); } } @@ -116,7 +116,8 @@ public class AdaptiveClassLinker implements ClassLinker { } if (returnType == null) { - throw new NoSuchFieldException(String.format("No such field!className:%s, fieldName:%s", type.getClassName(), fieldName)); + throw new NoSuchFieldException( + String.format("No such field!className:%s, fieldName:%s", type.getClassName(), fieldName)); } return returnType; @@ -152,7 +153,8 @@ public class AdaptiveClassLinker implements ClassLinker { } if (returnType == null) { - throw new NoSuchMethodException(String.format("No such method!className:%s, methodName:%s", type.getClassName(), methodName)); + throw new NoSuchMethodException( + String.format("No such method!className:%s, methodName:%s", type.getClassName(), methodName)); } return returnType; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java index b2670e61..87984972 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java @@ -30,7 +30,7 @@ public class AppClassLinker implements ClassLinker { @Autowired public TypeDerivator derivator; @Autowired - public MethodMatcher matcher; + public AppMethodMatcher matcher; @Override @SuppressWarnings("unchecked") diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java similarity index 93% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java index ee82567a..86b2513a 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/MethodMatcher.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java @@ -11,7 +11,7 @@ import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.TypeDerivator; @Component -public class MethodMatcher { +public class AppMethodMatcher { @Autowired public TypeDerivator derivator; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java similarity index 93% rename from spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java index 233e2e27..d1f14edd 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeDerivator.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.output.java.deduce; +package com.gitee.spirit.output.java; import java.util.HashMap; import java.util.Map; @@ -13,7 +13,7 @@ import com.gitee.spirit.core.clazz.utils.TypeVisiter; import com.gitee.spirit.core.compile.TypeDerivator; @Component -public class NativeTypeDerivator extends TypeDerivator { +public class ExtTypeDerivator extends TypeDerivator { @Autowired public ClassLinker linker; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeFactory.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeFactory.java similarity index 91% rename from spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeFactory.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeFactory.java index 99fd9ed6..e48830f5 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/deduce/NativeTypeFactory.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeFactory.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.output.java.deduce; +package com.gitee.spirit.output.java; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -15,7 +15,7 @@ import com.gitee.spirit.core.clazz.utils.TypeTable; import com.gitee.spirit.core.compile.AppTypeFactory; @Component -public class NativeTypeFactory extends AppTypeFactory { +public class ExtTypeFactory extends AppTypeFactory { public IType create(Class clazz) { IType type = create(clazz.getName()); diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtClassLinker.java similarity index 90% rename from spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtClassLinker.java index 5dcafa81..8cd030b0 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeClassLinker.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtClassLinker.java @@ -19,24 +19,24 @@ import com.gitee.spirit.common.utils.ListUtils; import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.output.java.ExtClassLoader; -import com.gitee.spirit.output.java.deduce.NativeTypeDerivator; -import com.gitee.spirit.output.java.deduce.NativeTypeFactory; +import com.gitee.spirit.output.java.ExtTypeDerivator; +import com.gitee.spirit.output.java.ExtTypeFactory; import com.gitee.spirit.output.java.utils.ReflectUtils; import cn.hutool.core.lang.Assert; @Component @Order(-80) -public class NativeClassLinker implements ClassLinker { +public class ExtClassLinker implements ClassLinker { @Autowired public ExtClassLoader classLoader; @Autowired - public NativeTypeFactory factory; + public ExtTypeFactory factory; @Autowired - public NativeTypeDerivator derivator; + public ExtTypeDerivator derivator; @Autowired - public NativeMethodMatcher matcher; + public ExtMethodMatcher matcher; @Override @SuppressWarnings("unchecked") diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeMethodMatcher.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtMethodMatcher.java similarity index 88% rename from spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeMethodMatcher.java rename to spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtMethodMatcher.java index c87102a8..c2b53c71 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/NativeMethodMatcher.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtMethodMatcher.java @@ -1,59 +1,59 @@ -package com.gitee.spirit.output.java.linker; - -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.output.java.deduce.NativeTypeDerivator; -import com.gitee.spirit.output.java.deduce.NativeTypeFactory; -import com.gitee.spirit.output.java.utils.ReflectUtils; - -@Component -public class NativeMethodMatcher { - - @Autowired - public NativeTypeFactory factory; - @Autowired - public NativeTypeDerivator derivator; - - public boolean checkParameterCount(Method method, List parameterTypes) { - if (!ReflectUtils.isIndefinite(method) && parameterTypes.size() == method.getParameterCount()) {// 不是不定项,那么参数个数相等 - return true; - - } else if (ReflectUtils.isIndefinite(method) && parameterTypes.size() >= method.getParameterCount() - 1) {// 不定项,则参数大于等于不定项-1 - return true; - } - return false; - } - - public Integer getMethodScore(IType type, Method method, List parameterTypes) { - if (!checkParameterCount(method, parameterTypes)) { - return null; - } - Integer finalScore = 0; - int index = 0; - for (IType parameterType : parameterTypes) { - int idx = index < method.getParameterCount() - 1 ? index : method.getParameterCount() - 1;// 保证索引不会溢出 - Parameter parameter = method.getParameters()[idx];// 分为两种情况,一种是最后一个参数之前的,一种是最后一个参数 - IType nativeParameterType = factory.create(parameter.getParameterizedType());// 获取本地参数类型 - if (idx == method.getParameterCount() - 1 && ReflectUtils.isIndefinite(parameter)) {// 如果最后一个参数,而且是不定项参数,则取数组里的类型 - nativeParameterType = derivator.toTarget(nativeParameterType); - } - nativeParameterType = derivator.populateParameter(type, parameterType, nativeParameterType);// 填充类型里的泛型参数 - Integer scope = derivator.getAbstractScore(nativeParameterType, parameterType); - if (scope != null) { - finalScore += scope; - } else { - finalScore = null; - break; - } - index++; - } - return finalScore; - } - -} +package com.gitee.spirit.output.java.linker; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.output.java.ExtTypeDerivator; +import com.gitee.spirit.output.java.ExtTypeFactory; +import com.gitee.spirit.output.java.utils.ReflectUtils; + +@Component +public class ExtMethodMatcher { + + @Autowired + public ExtTypeFactory factory; + @Autowired + public ExtTypeDerivator derivator; + + public boolean checkParameterCount(Method method, List parameterTypes) { + if (!ReflectUtils.isIndefinite(method) && parameterTypes.size() == method.getParameterCount()) {// 不是不定项,那么参数个数相等 + return true; + + } else if (ReflectUtils.isIndefinite(method) && parameterTypes.size() >= method.getParameterCount() - 1) {// 不定项,则参数大于等于不定项-1 + return true; + } + return false; + } + + public Integer getMethodScore(IType type, Method method, List parameterTypes) { + if (!checkParameterCount(method, parameterTypes)) { + return null; + } + Integer finalScore = 0; + int index = 0; + for (IType parameterType : parameterTypes) { + int idx = index < method.getParameterCount() - 1 ? index : method.getParameterCount() - 1;// 保证索引不会溢出 + Parameter parameter = method.getParameters()[idx];// 分为两种情况,一种是最后一个参数之前的,一种是最后一个参数 + IType nativeParameterType = factory.create(parameter.getParameterizedType());// 获取本地参数类型 + if (idx == method.getParameterCount() - 1 && ReflectUtils.isIndefinite(parameter)) {// 如果最后一个参数,而且是不定项参数,则取数组里的类型 + nativeParameterType = derivator.toTarget(nativeParameterType); + } + nativeParameterType = derivator.populateParameter(type, parameterType, nativeParameterType);// 填充类型里的泛型参数 + Integer scope = derivator.getAbstractScore(nativeParameterType, parameterType); + if (scope != null) { + finalScore += scope; + } else { + finalScore = null; + break; + } + index++; + } + return finalScore; + } + +} -- Gitee From cdba90619ca9c5db94abd5aba9b26e998149d449 Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 23:03:32 +0800 Subject: [PATCH 53/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compile/{TypeDerivator.java => AppTypeDerivator.java} | 2 +- .../java/com/gitee/spirit/core/compile/AppTypeFactory.java | 2 +- .../com/gitee/spirit/core/compile/DefaultClassVisiter.java | 2 +- .../com/gitee/spirit/core/compile/DefaultVariableTracker.java | 2 +- .../spirit/core/compile/action/ExpressDeclareAction.java | 4 ++-- .../gitee/spirit/core/compile/action/InvokeVisitAction.java | 4 ++-- .../gitee/spirit/core/compile/linker/AdaptiveClassLinker.java | 4 ++-- .../com/gitee/spirit/core/compile/linker/AppClassLinker.java | 4 ++-- .../gitee/spirit/core/compile/linker/AppMethodMatcher.java | 4 ++-- .../java/com/gitee/spirit/output/java/ExtTypeDerivator.java | 4 ++-- 10 files changed, 16 insertions(+), 16 deletions(-) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{TypeDerivator.java => AppTypeDerivator.java} (95%) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/TypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeDerivator.java similarity index 95% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/TypeDerivator.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeDerivator.java index ed032628..7e6da923 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/TypeDerivator.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeDerivator.java @@ -16,7 +16,7 @@ import cn.hutool.core.lang.Assert; @Primary @Component -public class TypeDerivator { +public class AppTypeDerivator { @Autowired public TypeFactory factory; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java index fa1e83b3..7d946c21 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java @@ -29,7 +29,7 @@ public class AppTypeFactory extends AbstractTypeFactory { @Autowired public FragmentDeducer deducer; @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; @Override public IType create(String className) {// 一般来说,className可以直接反应出大部分属性 diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index 0b43de2b..e9ad69f6 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -38,7 +38,7 @@ public class DefaultClassVisiter implements ClassVisiter { @Autowired public ElementVisiter visiter; @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; @Override public void prepareForVisit(IClass clazz) { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java index 33ec8375..bea94d89 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java @@ -17,7 +17,7 @@ import com.gitee.spirit.core.compile.entity.VisitContext; public class DefaultVariableTracker implements VariableTracker { @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; @Autowired public ClassLinker linker; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index 209b6e4e..30a35b10 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -12,7 +12,7 @@ import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.compile.FragmentDeducer; -import com.gitee.spirit.core.compile.TypeDerivator; +import com.gitee.spirit.core.compile.AppTypeDerivator; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; @@ -31,7 +31,7 @@ public class ExpressDeclareAction extends AbstractAppElementAction { @Autowired public FragmentDeducer deducer; @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; @Autowired public ElementBuilder builder; @Autowired diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java index 56679703..13a33a80 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java @@ -13,7 +13,7 @@ import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.FragmentDeducer; -import com.gitee.spirit.core.compile.TypeDerivator; +import com.gitee.spirit.core.compile.AppTypeDerivator; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; @@ -31,7 +31,7 @@ public class InvokeVisitAction extends AbstractAppElementAction { @Autowired public ClassLinker linker; @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; @Override public void visitElement(VisitContext context, Element element) { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index 12f2291c..bf5f936c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -14,7 +14,7 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.compile.TypeDerivator; +import com.gitee.spirit.core.compile.AppTypeDerivator; import cn.hutool.core.lang.Assert; @@ -27,7 +27,7 @@ public class AdaptiveClassLinker implements ClassLinker { @Autowired public TypeFactory factory; @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; @Autowired public Map linkers; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java index 87984972..70322299 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java @@ -15,7 +15,7 @@ import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.AppClassLoader; -import com.gitee.spirit.core.compile.TypeDerivator; +import com.gitee.spirit.core.compile.AppTypeDerivator; import cn.hutool.core.lang.Assert; @@ -28,7 +28,7 @@ public class AppClassLinker implements ClassLinker { @Autowired public ClassVisiter visiter; @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; @Autowired public AppMethodMatcher matcher; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java index 86b2513a..d3820a3a 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java @@ -8,13 +8,13 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IParameter; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.TypeDerivator; +import com.gitee.spirit.core.compile.AppTypeDerivator; @Component public class AppMethodMatcher { @Autowired - public TypeDerivator derivator; + public AppTypeDerivator derivator; public Integer getMethodScore(IType type, IMethod method, List parameterTypes) { if (method.parameters.size() != parameterTypes.size()) { diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java index d1f14edd..3cb3c4ac 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java @@ -10,10 +10,10 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeBuilder; import com.gitee.spirit.core.clazz.utils.TypeVisiter; -import com.gitee.spirit.core.compile.TypeDerivator; +import com.gitee.spirit.core.compile.AppTypeDerivator; @Component -public class ExtTypeDerivator extends TypeDerivator { +public class ExtTypeDerivator extends AppTypeDerivator { @Autowired public ClassLinker linker; -- Gitee From 2a62aeec6edcc81c728b803e912ffee374eacc83 Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 23:39:40 +0800 Subject: [PATCH 54/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../element/action/DefaultSemanticParser.java | 308 +++++++++--------- .../core/element/entity/SemanticContext.java | 48 +-- 2 files changed, 178 insertions(+), 178 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java index 0add378b..fe36827b 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java @@ -1,154 +1,154 @@ -package com.gitee.spirit.core.element.action; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.gitee.spirit.common.constants.Attribute; -import com.gitee.spirit.common.enums.TokenTypeEnum; -import com.gitee.spirit.common.pattern.AccessPattern; -import com.gitee.spirit.common.pattern.CommonPattern; -import com.gitee.spirit.common.pattern.LiteralPattern; -import com.gitee.spirit.common.pattern.TypePattern; -import com.gitee.spirit.core.api.Lexer; -import com.gitee.spirit.core.element.entity.SemanticContext; -import com.gitee.spirit.core.element.entity.Statement; -import com.gitee.spirit.core.element.entity.Token; - -import cn.hutool.core.lang.Assert; - -@Component -public class DefaultSemanticParser extends AbstractSemanticParser { - - @Autowired - public Lexer lexer; - - @Override - public List getTokens(SemanticContext context, List words) { - context.words = words; - List tokens = new ArrayList<>(); - for (context.index = 0; context.index < words.size(); context.index++) { - Token token = getToken(context, words.get(context.index)); - tokens.add(token); - } - return tokens; - } - - @Override - public Token getToken(SemanticContext context, String word) { - Token token = new Token(); - - token.tokenType = getTokenType(context, word); - Assert.notNull(token.tokenType, "Token type cannot be null!word:[" + word + "]"); - - token.value = getTokenValue(token, word); - Assert.notNull(token.value, "Token value cannot be null!word:[" + word + "]"); - - setTokenAttributes(token, word); - return token; - } - - public TokenTypeEnum getTokenType(SemanticContext context, String word) { - if (!context.substatement) { - return getCommonTokenType(context, word); - } else { - if (context.insideType) { - if ("<".equals(word) || ">".equals(word)) { - return TokenTypeEnum.SEPARATOR; - - } else if ("?".equals(word)) { - return TokenTypeEnum.TYPE; - } - } - if (context.index == 0 && CommonPattern.isPrefix(word)) { - return TokenTypeEnum.PREFIX; - } - return getCommonTokenType(context, word); - } - } - - public TokenTypeEnum getCommonTokenType(SemanticContext context, String word) { - if (isAccessPath(word)) { - return TokenTypeEnum.ACCESS_PATH; - - } else if (isAnnotation(word)) { - return TokenTypeEnum.ANNOTATION; - - } else if (isKeyword(word)) { - return TokenTypeEnum.KEYWORD; - - } else if (isOperator(word)) { - return TokenTypeEnum.OPERATOR; - - } else if (isSeparator(word)) { - return TokenTypeEnum.SEPARATOR; - - } else if (isType(word)) { - return TokenTypeEnum.TYPE; - } - - TokenTypeEnum tokenType = TypePattern.getTokenType(word); - if (tokenType != null) { - return tokenType; - } - - tokenType = LiteralPattern.getTokenType(word); - if (tokenType != null) { - return tokenType; - } - - tokenType = CommonPattern.getSubexpressTokenType(word); - if (tokenType != null) { - return tokenType; - } - - if (isVariable(word)) { - return TokenTypeEnum.VARIABLE; - } - - tokenType = AccessPattern.getTokenType(word); - if (tokenType != null) { - return tokenType; - } - - return null; - } - - public Object getTokenValue(Token token, String word) { - if (token.isType()) { - return word.contains("<") || word.contains(">") ? getStatement(true, word) : word; - - } else if (token.isArrayInit() || token.isList() || token.isMap() || token.isSubexpress() || token.isInvoke()) { - return getStatement(false, word);// 拆分数组是为了更好的添加new这个关键字 - } - return word; - } - - public Statement getStatement(boolean insideType, String word) { - List words = insideType ? lexer.getSubWords(word, '<', '>') : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); - List tokens = getTokens(new SemanticContext(true, insideType), words); - Assert.notNull(tokens, "Tokens cannot be null!"); - return new Statement(tokens); - } - - public void setTokenAttributes(Token token, String word) { - if (token.isAnnotation()) { - token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getAnnotationName(word)); - - } else if (token.isArrayInit()) { - token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getPrefix(word) + "[]"); - - } else if (token.isTypeInit()) { - token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getPrefix(word)); - - } else if (token.isCast()) { - token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getSubexpressValue(word)); - - } else if (token.isAccess()) { - token.setAttr(Attribute.MEMBER_NAME, CommonPattern.getPrefix(word)); - } - } - -} +package com.gitee.spirit.core.element.action; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gitee.spirit.common.constants.Attribute; +import com.gitee.spirit.common.enums.TokenTypeEnum; +import com.gitee.spirit.common.pattern.AccessPattern; +import com.gitee.spirit.common.pattern.CommonPattern; +import com.gitee.spirit.common.pattern.LiteralPattern; +import com.gitee.spirit.common.pattern.TypePattern; +import com.gitee.spirit.core.api.Lexer; +import com.gitee.spirit.core.element.entity.SemanticContext; +import com.gitee.spirit.core.element.entity.Statement; +import com.gitee.spirit.core.element.entity.Token; + +import cn.hutool.core.lang.Assert; + +@Component +public class DefaultSemanticParser extends AbstractSemanticParser { + + @Autowired + public Lexer lexer; + + @Override + public List getTokens(SemanticContext context, List words) { + context.words = words; + List tokens = new ArrayList<>(); + for (context.index = 0; context.index < words.size(); context.index++) { + Token token = getToken(context, words.get(context.index)); + tokens.add(token); + } + return tokens; + } + + @Override + public Token getToken(SemanticContext context, String word) { + Token token = new Token(); + + token.tokenType = getTokenType(context, word); + Assert.notNull(token.tokenType, "Token type cannot be null!word:[" + word + "]"); + + token.value = getTokenValue(token, word); + Assert.notNull(token.value, "Token value cannot be null!word:[" + word + "]"); + + setTokenAttributes(token, word); + return token; + } + + public TokenTypeEnum getTokenType(SemanticContext context, String word) { + if (!context.subStatement) { + return getCommonTokenType(context, word); + } else { + if (context.insideType) { + if ("<".equals(word) || ">".equals(word)) { + return TokenTypeEnum.SEPARATOR; + + } else if ("?".equals(word)) { + return TokenTypeEnum.TYPE; + } + } + if (context.index == 0 && CommonPattern.isPrefix(word)) { + return TokenTypeEnum.PREFIX; + } + return getCommonTokenType(context, word); + } + } + + public TokenTypeEnum getCommonTokenType(SemanticContext context, String word) { + if (isAccessPath(word)) { + return TokenTypeEnum.ACCESS_PATH; + + } else if (isAnnotation(word)) { + return TokenTypeEnum.ANNOTATION; + + } else if (isKeyword(word)) { + return TokenTypeEnum.KEYWORD; + + } else if (isOperator(word)) { + return TokenTypeEnum.OPERATOR; + + } else if (isSeparator(word)) { + return TokenTypeEnum.SEPARATOR; + + } else if (isType(word)) { + return TokenTypeEnum.TYPE; + } + + TokenTypeEnum tokenType = TypePattern.getTokenType(word); + if (tokenType != null) { + return tokenType; + } + + tokenType = LiteralPattern.getTokenType(word); + if (tokenType != null) { + return tokenType; + } + + tokenType = CommonPattern.getSubexpressTokenType(word); + if (tokenType != null) { + return tokenType; + } + + if (isVariable(word)) { + return TokenTypeEnum.VARIABLE; + } + + tokenType = AccessPattern.getTokenType(word); + if (tokenType != null) { + return tokenType; + } + + return null; + } + + public Object getTokenValue(Token token, String word) { + if (token.isType()) { + return word.contains("<") || word.contains(">") ? getStatement(true, word) : word; + + } else if (token.isArrayInit() || token.isList() || token.isMap() || token.isSubexpress() || token.isInvoke()) { + return getStatement(false, word);// 拆分数组是为了更好的添加new这个关键字 + } + return word; + } + + public Statement getStatement(boolean insideType, String word) { + List words = insideType ? lexer.getSubWords(word, '<', '>') : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); + List tokens = getTokens(new SemanticContext(true, insideType), words); + Assert.notNull(tokens, "Tokens cannot be null!"); + return new Statement(tokens); + } + + public void setTokenAttributes(Token token, String word) { + if (token.isAnnotation()) { + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getAnnotationName(word)); + + } else if (token.isArrayInit()) { + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getPrefix(word) + "[]"); + + } else if (token.isTypeInit()) { + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getPrefix(word)); + + } else if (token.isCast()) { + token.setAttr(Attribute.SIMPLE_NAME, CommonPattern.getSubexpressValue(word)); + + } else if (token.isAccess()) { + token.setAttr(Attribute.MEMBER_NAME, CommonPattern.getPrefix(word)); + } + } + +} diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java index 43fc33d4..584099fb 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java @@ -1,24 +1,24 @@ -package com.gitee.spirit.core.element.entity; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SemanticContext { - - public List words; - public int index = -1; - public boolean substatement = false; - public boolean insideType = false; - - public SemanticContext(boolean substatement, boolean insideType) { - this.substatement = substatement; - this.insideType = insideType; - } - -} +package com.gitee.spirit.core.element.entity; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SemanticContext { + + public List words; + public int index = -1; + public boolean subStatement = false; + public boolean insideType = false; + + public SemanticContext(boolean substatement, boolean insideType) { + this.subStatement = substatement; + this.insideType = insideType; + } + +} -- Gitee From 06fccf2f68a9c83f58f5821bf8d94ff5e9b1d136 Mon Sep 17 00:00:00 2001 From: chenT Date: Sun, 6 Jun 2021 23:42:46 +0800 Subject: [PATCH 55/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/core/element/action/DefaultSemanticParser.java | 3 ++- .../com/gitee/spirit/core/element/entity/SemanticContext.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java index fe36827b..df9d47f2 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java @@ -127,7 +127,8 @@ public class DefaultSemanticParser extends AbstractSemanticParser { } public Statement getStatement(boolean insideType, String word) { - List words = insideType ? lexer.getSubWords(word, '<', '>') : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); + List words = insideType ? lexer.getSubWords(word, '<', '>') + : lexer.getSubWords(word, '(', ')', '[', ']', '{', '}'); List tokens = getTokens(new SemanticContext(true, insideType), words); Assert.notNull(tokens, "Tokens cannot be null!"); return new Statement(tokens); diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java index 584099fb..11fd30d4 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/entity/SemanticContext.java @@ -16,8 +16,8 @@ public class SemanticContext { public boolean subStatement = false; public boolean insideType = false; - public SemanticContext(boolean substatement, boolean insideType) { - this.subStatement = substatement; + public SemanticContext(boolean subStatement, boolean insideType) { + this.subStatement = subStatement; this.insideType = insideType; } -- Gitee From 896e63bf92606dc03857ce3274ab53addf5587e6 Mon Sep 17 00:00:00 2001 From: chenT Date: Mon, 7 Jun 2021 00:03:34 +0800 Subject: [PATCH 56/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spirit/common/utils/SpringUtils.java | 23 ------------------- 1 file changed, 23 deletions(-) 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 a2b7fe7e..52a77e0e 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 @@ -1,16 +1,10 @@ package com.gitee.spirit.common.utils; -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.stereotype.Component; @Component @@ -35,21 +29,4 @@ public class SpringUtils implements ApplicationContextAware { return context.getBeansOfType(type); } - public static List getBeansAndSort(Class type) { - Map beanMap = getBeansOfType(type); - List beans = new ArrayList<>(beanMap.values()); - beans.sort(new AnnotationAwareOrderComparator()); - return beans; - } - - public static List getBeansByExcludedTypes(Class type, Class... excludedTypes) { - List beans = getBeansAndSort(type); - List> list = Arrays.asList(excludedTypes); - return beans.stream().filter((t) -> !list.contains(t.getClass())).collect(Collectors.toList()); - } - - public static List getBeansByAnnotation(Class type, Class annotationClass) { - List beans = getBeansAndSort(type); - return beans.stream().filter(bean -> bean.getClass().isAnnotationPresent(annotationClass)).collect(Collectors.toList()); - } } \ No newline at end of file -- Gitee From 45fd9a359217664a136badd4a2e3d1520dddf801 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 10:12:13 +0800 Subject: [PATCH 57/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/compile/DefaultVariableTracker.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java index bea94d89..b87efe93 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java @@ -6,7 +6,6 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.common.enums.KeywordEnum; import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.VariableTracker; -import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IParameter; import com.gitee.spirit.core.clazz.entity.IType; @@ -24,27 +23,24 @@ public class DefaultVariableTracker implements VariableTracker { @Override public IType findVariableType(VisitContext context, String variableName) { IType type = findTypeByKeyword(context, variableName); - if (type == null) { - type = context.isMethodScope() ? findTypeByContext(context, variableName) : null; - } - if (type == null) { - type = findTypeByInherit(context, variableName); - } + type = type == null ? findTypeByContext(context, variableName) : type; + type = type == null ? findTypeByInherit(context, variableName) : type; return type; } public IType findTypeByKeyword(VisitContext context, String variableName) { - IClass clazz = context.clazz; - if (KeywordEnum.isSuper(variableName)) {// super - return derivator.withSuperModifiers(clazz.getSuperType()); - - } else if (KeywordEnum.isThis(variableName)) {// this - return derivator.withThisModifiers(clazz.getType()); + if (KeywordEnum.isSuper(variableName)) { + return derivator.withSuperModifiers(context.clazz.getSuperType()); + } else if (KeywordEnum.isThis(variableName)) { + return derivator.withThisModifiers(context.clazz.getType()); } return null; } public IType findTypeByContext(VisitContext context, String variableName) { + if (!context.isMethodScope()) { + return null; + } for (IVariable variable : context.variables) { if (variable.getName().equals(variableName) && context.getBlockId().startsWith(variable.blockId)) { return variable.getType(); -- Gitee From 52486589a9f2ca1828cf5fc0a4495ceedcb7e310 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 10:28:47 +0800 Subject: [PATCH 58/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/spirit/core/compile/DefaultClassVisiter.java | 2 +- .../spirit/core/compile/action/ExpressDeclareAction.java | 2 +- .../java/com/gitee/spirit/core/api/ElementBuilder.java | 2 +- .../gitee/spirit/core/element/DefaultElementBuilder.java | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index e9ad69f6..e6989806 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -72,7 +72,7 @@ public class DefaultClassVisiter implements ClassVisiter { for (Statement parameterStmt : statements) { List annotations = ListUtils.filterStoppable(parameterStmt, token -> token.isAnnotation(), token -> new IAnnotation(token)); - IParameter parameter = new IParameter(annotations, builder.rebuild(parameterStmt)); + IParameter parameter = new IParameter(annotations, builder.build(parameterStmt)); parameter.setType(factory.create(clazz, parameterStmt.get(0))); method.parameters.add(parameter); } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index 30a35b10..095e9363 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -79,7 +79,7 @@ public class ExpressDeclareAction extends AbstractAppElementAction { Statement statement = secondToken.getValue(); Statement subStatement = statement.subStmt(1, statement.indexOf(";")); if (subStatement.size() > 0) { - Element subElement = builder.rebuild(subStatement); + Element subElement = builder.build(subStatement); IVariable variable = visiter.visitElement(context, subElement); if (variable != null) { variable.blockId = context.getBlockId(); diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java index 282e6ff2..e70eb079 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java @@ -10,6 +10,6 @@ public interface ElementBuilder { Element build(Line line); - Element rebuild(Statement statement); + Element build(Statement statement); } diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java index 292b5f7a..deb2028a 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java @@ -55,10 +55,10 @@ public class DefaultElementBuilder implements ElementBuilder { } @Override - public Element rebuild(Statement statement) { - Assert.notEmpty(statement, "statement cannot be empty!"); - Element element = build(statement.toString()); - element.list = statement;// 注意:新建一个element是为了得到分析的语法,赋值是为了复用token + public Element build(Statement statement) { + Assert.notEmpty(statement, "Statement cannot be empty!"); + SyntaxResult result = syntaxParser.parseSyntax(statement.list, statement); + Element element = new Element(null, null, statement, result.syntax, result.syntaxTree); return element; } -- Gitee From c345ef840ed36886ae423a5a509a42db86ae056c Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 10:29:25 +0800 Subject: [PATCH 59/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/spirit/core/element/DefaultElementBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java index deb2028a..787b5a6c 100644 --- a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/DefaultElementBuilder.java @@ -27,7 +27,7 @@ public class DefaultElementBuilder implements ElementBuilder { @Autowired public Lexer lexer; @Autowired - public SemanticParser parser; + public SemanticParser semanticParser; @Autowired public SyntaxParser syntaxParser; @@ -41,7 +41,7 @@ public class DefaultElementBuilder implements ElementBuilder { try { checker.check(line); List words = lexer.getWords(line.text); - List tokens = parser.getTokens(words); + List tokens = semanticParser.getTokens(words); Modifiers modifiers = new Modifiers(tokens); Statement statement = new Statement(tokens); SyntaxResult result = syntaxParser.parseSyntax(tokens, statement); -- Gitee From 71933c3dc6eb53fc71b04e1773269b231d18bcd5 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 10:42:38 +0800 Subject: [PATCH 60/66] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gitee/spirit/core/compile/AppTypeFactory.java | 2 ++ .../com/gitee/spirit/core/compile/DefaultClassVisiter.java | 1 + .../com/gitee/spirit/core/compile/DefaultElementVisiter.java | 1 + .../spirit/core/compile/action/ExpressDeclareAction.java | 4 ++-- .../gitee/spirit/core/compile/action/InvokeVisitAction.java | 4 ++-- .../spirit/core/compile/{ => derivator}/AppTypeDerivator.java | 2 +- .../core/compile/{ => derivator}/DefaultVariableTracker.java | 2 +- .../spirit/core/compile/{ => derivator}/FragmentDeducer.java | 2 +- .../gitee/spirit/core/compile/linker/AdaptiveClassLinker.java | 2 +- .../com/gitee/spirit/core/compile/linker/AppClassLinker.java | 2 +- .../gitee/spirit/core/compile/linker/AppMethodMatcher.java | 2 +- .../java/com/gitee/spirit/output/java/ExtTypeDerivator.java | 2 +- .../spirit/output/java/action/AbstractTreeElementAction.java | 2 +- .../com/gitee/spirit/output/java/action/StatementAction.java | 2 +- 14 files changed, 17 insertions(+), 13 deletions(-) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{ => derivator}/AppTypeDerivator.java (95%) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{ => derivator}/DefaultVariableTracker.java (94%) rename spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/{ => derivator}/FragmentDeducer.java (93%) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java index 7d946c21..b617dc20 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java @@ -15,6 +15,8 @@ import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeTable; import com.gitee.spirit.core.clazz.utils.TypeUtils; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index e6989806..a581a64d 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -21,6 +21,7 @@ import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.clazz.frame.MemberEntity; import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java index bd22fc64..959a73a3 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java @@ -10,6 +10,7 @@ import com.gitee.spirit.core.api.ElementAction; import com.gitee.spirit.core.api.ElementVisiter; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.compile.action.AbstractAppElementAction; +import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index 095e9363..6d1beab0 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -11,8 +11,8 @@ import com.gitee.spirit.core.api.VariableTracker; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.FragmentDeducer; -import com.gitee.spirit.core.compile.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java index 13a33a80..2b4f5ab9 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java @@ -12,8 +12,8 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.FragmentDeducer; -import com.gitee.spirit.core.compile.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java similarity index 95% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeDerivator.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java index 7e6da923..9c4a3eb7 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeDerivator.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.core.compile; +package com.gitee.spirit.core.compile.derivator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java similarity index 94% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java index b87efe93..d147a485 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultVariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.core.compile; +package com.gitee.spirit.core.compile.derivator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/FragmentDeducer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java similarity index 93% rename from spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/FragmentDeducer.java rename to spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java index 673d0ca6..3775d4c4 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/FragmentDeducer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java @@ -1,4 +1,4 @@ -package com.gitee.spirit.core.compile; +package com.gitee.spirit.core.compile.derivator; import java.util.List; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index bf5f936c..aaa53391 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -14,7 +14,7 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.compile.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java index 70322299..962b7389 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java @@ -15,7 +15,7 @@ import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.AppClassLoader; -import com.gitee.spirit.core.compile.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import cn.hutool.core.lang.Assert; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java index d3820a3a..7b3b7be1 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IParameter; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; @Component public class AppMethodMatcher { diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java index 3cb3c4ac..0e266bf2 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeDerivator.java @@ -10,7 +10,7 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeBuilder; import com.gitee.spirit.core.clazz.utils.TypeVisiter; -import com.gitee.spirit.core.compile.AppTypeDerivator; +import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; @Component public class ExtTypeDerivator extends AppTypeDerivator { diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java index 826375d3..6c329e00 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractTreeElementAction.java @@ -7,7 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.FragmentDeducer; +import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java index 9db09deb..84658ef2 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StatementAction.java @@ -16,7 +16,7 @@ import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.AutoImporter; -import com.gitee.spirit.core.compile.FragmentDeducer; +import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; -- Gitee From e9b0d85c9a9b1cae6ebb73d60d9e058bab7f3c29 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 11:26:03 +0800 Subject: [PATCH 61/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{SpringUtils.java => GlobalContext.java} | 69 ++++++++++--------- .../spirit/core/api/ResolverContext.java | 13 ---- .../core/clazz/DefaultClassResolver.java | 27 ++------ .../spirit/core/clazz/entity/IClass.java | 7 +- .../core/clazz/frame/ContextEntity.java | 4 +- .../spirit/core/clazz/frame/ImportEntity.java | 12 ++-- .../core/compile/AppImportSelector.java | 2 + .../spirit/output/java/ExtImportSelector.java | 2 + 8 files changed, 59 insertions(+), 77 deletions(-) rename spirit-common/src/main/java/com/gitee/spirit/common/utils/{SpringUtils.java => GlobalContext.java} (32%) delete mode 100644 spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ResolverContext.java 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/GlobalContext.java similarity index 32% rename from spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/GlobalContext.java index 52a77e0e..6551dd20 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/GlobalContext.java @@ -1,32 +1,37 @@ -package com.gitee.spirit.common.utils; - -import java.util.Map; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -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); - } - -} \ No newline at end of file +package com.gitee.spirit.common.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import org.springframework.stereotype.Component; + +@Component +public class GlobalContext { + + @Autowired + public ApplicationContext context; + + public T getBean(Class requiredType) { + return context.getBean(requiredType); + } + + public T getBean(String name, Class requiredType) { + return context.getBean(name, requiredType); + } + + public Map getBeansOfType(Class type) { + return context.getBeansOfType(type); + } + + public List getBeans(Class requiredType) { + Map beanMap = getBeansOfType(requiredType); + List beans = new ArrayList<>(beanMap.values()); + beans.sort(new AnnotationAwareOrderComparator()); + return beans; + } + +} diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ResolverContext.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ResolverContext.java deleted file mode 100644 index ef9d6c5c..00000000 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/api/ResolverContext.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gitee.spirit.core.api; - -import java.util.List; - -public interface ResolverContext { - - ElementBuilder getElementBuilder(); - - TypeFactory getTypeFactory(); - - List getImportSelectors(); - -} diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java index 27430843..19e9bb23 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java @@ -9,11 +9,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gitee.spirit.common.enums.KeywordEnum; +import com.gitee.spirit.common.utils.GlobalContext; import com.gitee.spirit.core.api.ClassResolver; import com.gitee.spirit.core.api.ElementBuilder; -import com.gitee.spirit.core.api.ImportSelector; -import com.gitee.spirit.core.api.ResolverContext; -import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IAnnotation; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IField; @@ -24,14 +22,12 @@ import com.gitee.spirit.core.element.entity.Document; import com.gitee.spirit.core.element.entity.Element; @Component -public class DefaultClassResolver implements ClassResolver, ResolverContext { +public class DefaultClassResolver implements ClassResolver { @Autowired public ElementBuilder builder; @Autowired - public TypeFactory factory; - @Autowired - public List selectors; + public GlobalContext context; @Override public Map resolve(String packageStr, Document document) { @@ -107,7 +103,7 @@ public class DefaultClassResolver implements ClassResolver, ResolverContext { clazz.packageStr = packageStr; clazz.fields = fields; clazz.methods = methods; - clazz.context = this; + clazz.context = context; } public void readRootElement(IClass clazz) { @@ -125,19 +121,4 @@ public class DefaultClassResolver implements ClassResolver, ResolverContext { } } - @Override - public ElementBuilder getElementBuilder() { - return builder; - } - - @Override - public TypeFactory getTypeFactory() { - return factory; - } - - @Override - public List getImportSelectors() { - return selectors; - } - } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java index 4881e49c..6fa8d487 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; import com.gitee.spirit.common.enums.KeywordEnum; import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.frame.ImportEntity; import com.gitee.spirit.core.clazz.utils.TypeUtils; import com.gitee.spirit.core.element.entity.Element; @@ -72,15 +73,17 @@ public class IClass extends ImportEntity { public IType getSuperType() {// 注意:这里返回的是Super Token token = element.getKeywordParam(KeywordEnum.EXTENDS.value);// 这里返回的,可以是泛型格式,而不是className if (token != null) { - return context.getTypeFactory().create(this, token); + TypeFactory factory = context.getBean(TypeFactory.class); + return factory.create(this, token); } return null; } public List getInterfaceTypes() { List interfaces = new ArrayList<>(); + TypeFactory factory = context.getBean(TypeFactory.class); for (Token token : element.getKeywordParams(KeywordEnum.IMPLS.value)) { - interfaces.add(context.getTypeFactory().create(this, token)); + interfaces.add(factory.create(this, token)); } return interfaces; } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java index 172025db..5c3e41e0 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java @@ -1,9 +1,9 @@ package com.gitee.spirit.core.clazz.frame; -import com.gitee.spirit.core.api.ResolverContext; +import com.gitee.spirit.common.utils.GlobalContext; public abstract class ContextEntity { - public ResolverContext context; + public GlobalContext context; } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java index 99d1508a..92153a83 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java @@ -7,6 +7,7 @@ import java.util.stream.Collectors; import com.gitee.spirit.common.enums.PrimitiveEnum; import com.gitee.spirit.common.utils.ListUtils; import com.gitee.spirit.core.api.ElementBuilder; +import com.gitee.spirit.core.api.ImportSelector; import com.gitee.spirit.core.clazz.entity.IAnnotation; import com.gitee.spirit.core.clazz.entity.Import; import com.gitee.spirit.core.clazz.utils.TypeUtils; @@ -105,7 +106,7 @@ public abstract class ImportEntity extends AnnotationEntity { } // 构建一个行元素 - ElementBuilder builder = context.getElementBuilder(); + ElementBuilder builder = context.getBean(ElementBuilder.class); imports.add(new Import(builder.build("import " + targetName))); return true; } @@ -117,18 +118,19 @@ public abstract class ImportEntity extends AnnotationEntity { return true; } // 构建一个行元素 - ElementBuilder builder = context.getElementBuilder(); + ElementBuilder builder = context.getBean(ElementBuilder.class); staticImports.add(new Import(builder.build("import static " + staticSourceName))); return true; } public String findClassNameByLoader(String simpleName) { - return ListUtils.collectOne(context.getImportSelectors(), importSelector -> importSelector.findClassName(simpleName)); + List selectors = context.getBeans(ImportSelector.class); + return ListUtils.collectOne(selectors, selector -> selector.findClassName(simpleName)); } public boolean shouldImport(String selfClassName, String className) { - Boolean flag = ListUtils.collectOne(context.getImportSelectors(), importSelector -> importSelector.canHandle(className), - importSelector -> importSelector.shouldImport(selfClassName, className)); + List selectors = context.getBeans(ImportSelector.class); + Boolean flag = ListUtils.collectOne(selectors, selector -> selector.canHandle(className), selector -> selector.shouldImport(selfClassName, className)); return flag == null ? true : flag; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java index 2580daca..5a4861d3 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java @@ -1,12 +1,14 @@ package com.gitee.spirit.core.compile; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.gitee.spirit.common.utils.ListUtils; import com.gitee.spirit.core.clazz.AbstractImportSelector; @Component +@Order(-100) public class AppImportSelector extends AbstractImportSelector { @Autowired diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java index dcfb56ab..a02ec925 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java @@ -1,6 +1,7 @@ package com.gitee.spirit.output.java; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.gitee.spirit.core.clazz.AbstractImportSelector; @@ -8,6 +9,7 @@ import com.gitee.spirit.core.clazz.utils.TypeUtils; import com.gitee.spirit.output.java.utils.ReflectUtils; @Component +@Order(-80) public class ExtImportSelector extends AbstractImportSelector { @Autowired -- Gitee From 15c5ff3fd73a8de0d8a4bf2d8af661a20ef7c8b3 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 12:23:46 +0800 Subject: [PATCH 62/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{GlobalContext.java => SpringUtils.java} | 23 +++++++++------- .../core/clazz/DefaultClassResolver.java | 4 --- .../spirit/core/clazz/entity/IClass.java | 5 ++-- .../gitee/spirit/core/clazz/entity/IType.java | 24 +++++++++++++++++ .../core/clazz/frame/ContextEntity.java | 9 ------- .../spirit/core/clazz/frame/ImportEntity.java | 9 ++++--- .../spirit/core/clazz/frame/TypeEntity.java | 2 +- .../spirit/core/compile/AppTypeFactory.java | 2 +- .../compile/action/ExpressDeclareAction.java | 2 +- .../compile/action/InvokeVisitAction.java | 8 +++--- .../compile/derivator/AppTypeDerivator.java | 26 +------------------ .../derivator/DefaultVariableTracker.java | 6 ++--- .../compile/linker/AdaptiveClassLinker.java | 8 +++--- .../output/java/linker/ExtMethodMatcher.java | 2 +- 14 files changed, 60 insertions(+), 70 deletions(-) rename spirit-common/src/main/java/com/gitee/spirit/common/utils/{GlobalContext.java => SpringUtils.java} (50%) delete mode 100644 spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/utils/GlobalContext.java b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java similarity index 50% rename from spirit-common/src/main/java/com/gitee/spirit/common/utils/GlobalContext.java rename to spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java index 6551dd20..f895f26b 100644 --- a/spirit-common/src/main/java/com/gitee/spirit/common/utils/GlobalContext.java +++ b/spirit-common/src/main/java/com/gitee/spirit/common/utils/SpringUtils.java @@ -4,34 +4,39 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.stereotype.Component; @Component -public class GlobalContext { +public class SpringUtils implements ApplicationContextAware { - @Autowired - public ApplicationContext context; + public static ApplicationContext context; - public T getBean(Class requiredType) { + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + public static T getBean(Class requiredType) { return context.getBean(requiredType); } - public T getBean(String name, Class requiredType) { + public static T getBean(String name, Class requiredType) { return context.getBean(name, requiredType); } - public Map getBeansOfType(Class type) { + public static Map getBeansOfType(Class type) { return context.getBeansOfType(type); } - public List getBeans(Class requiredType) { + 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-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java index 19e9bb23..2a97973a 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java @@ -9,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gitee.spirit.common.enums.KeywordEnum; -import com.gitee.spirit.common.utils.GlobalContext; import com.gitee.spirit.core.api.ClassResolver; import com.gitee.spirit.core.api.ElementBuilder; import com.gitee.spirit.core.clazz.entity.IAnnotation; @@ -26,8 +25,6 @@ public class DefaultClassResolver implements ClassResolver { @Autowired public ElementBuilder builder; - @Autowired - public GlobalContext context; @Override public Map resolve(String packageStr, Document document) { @@ -103,7 +100,6 @@ public class DefaultClassResolver implements ClassResolver { clazz.packageStr = packageStr; clazz.fields = fields; clazz.methods = methods; - clazz.context = context; } public void readRootElement(IClass clazz) { diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java index 6fa8d487..86691861 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IClass.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; import com.gitee.spirit.common.enums.KeywordEnum; import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.common.utils.SpringUtils; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.frame.ImportEntity; import com.gitee.spirit.core.clazz.utils.TypeUtils; @@ -73,7 +74,7 @@ public class IClass extends ImportEntity { public IType getSuperType() {// 注意:这里返回的是Super Token token = element.getKeywordParam(KeywordEnum.EXTENDS.value);// 这里返回的,可以是泛型格式,而不是className if (token != null) { - TypeFactory factory = context.getBean(TypeFactory.class); + TypeFactory factory = SpringUtils.getBean(TypeFactory.class); return factory.create(this, token); } return null; @@ -81,7 +82,7 @@ public class IClass extends ImportEntity { public List getInterfaceTypes() { List interfaces = new ArrayList<>(); - TypeFactory factory = context.getBean(TypeFactory.class); + TypeFactory factory = SpringUtils.getBean(TypeFactory.class); for (Token token : element.getKeywordParams(KeywordEnum.IMPLS.value)) { interfaces.add(factory.create(this, token)); } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java index 06f4fb00..dfab780c 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java @@ -5,6 +5,10 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; +import com.gitee.spirit.common.enums.ModifierEnum; +import com.gitee.spirit.common.utils.SpringUtils; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.utils.TypeTable; import com.gitee.spirit.core.clazz.utils.TypeUtils; import lombok.Getter; @@ -44,10 +48,30 @@ public class IType { return genericTypes != null && genericTypes.size() > 0; } + public IType toBox() { + IType boxType = TypeTable.getBoxType(getClassName()); + return boxType != null ? boxType : this; + } + public String getTargetName() {// 返回真正的className,包括数组中的 return TypeUtils.getTargetName(getClassName()); } + public IType toTarget() { + TypeFactory factory = SpringUtils.getBean(TypeFactory.class); + return factory.create(getTargetName()); + } + + public IType withSuperModifiers() { + this.setModifiers(ModifierEnum.SUPER.value); + return this; + } + + public IType withThisModifiers() { + this.setModifiers(ModifierEnum.THIS.value); + return this; + } + @Override public boolean equals(Object obj) { if (!(obj instanceof IType)) { diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java deleted file mode 100644 index 5c3e41e0..00000000 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ContextEntity.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gitee.spirit.core.clazz.frame; - -import com.gitee.spirit.common.utils.GlobalContext; - -public abstract class ContextEntity { - - public GlobalContext context; - -} diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java index 92153a83..99b00f53 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/ImportEntity.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; import com.gitee.spirit.common.enums.PrimitiveEnum; import com.gitee.spirit.common.utils.ListUtils; +import com.gitee.spirit.common.utils.SpringUtils; import com.gitee.spirit.core.api.ElementBuilder; import com.gitee.spirit.core.api.ImportSelector; import com.gitee.spirit.core.clazz.entity.IAnnotation; @@ -106,7 +107,7 @@ public abstract class ImportEntity extends AnnotationEntity { } // 构建一个行元素 - ElementBuilder builder = context.getBean(ElementBuilder.class); + ElementBuilder builder = SpringUtils.getBean(ElementBuilder.class); imports.add(new Import(builder.build("import " + targetName))); return true; } @@ -118,18 +119,18 @@ public abstract class ImportEntity extends AnnotationEntity { return true; } // 构建一个行元素 - ElementBuilder builder = context.getBean(ElementBuilder.class); + ElementBuilder builder = SpringUtils.getBean(ElementBuilder.class); staticImports.add(new Import(builder.build("import static " + staticSourceName))); return true; } public String findClassNameByLoader(String simpleName) { - List selectors = context.getBeans(ImportSelector.class); + List selectors = SpringUtils.getBeans(ImportSelector.class); return ListUtils.collectOne(selectors, selector -> selector.findClassName(simpleName)); } public boolean shouldImport(String selfClassName, String className) { - List selectors = context.getBeans(ImportSelector.class); + List selectors = SpringUtils.getBeans(ImportSelector.class); Boolean flag = ListUtils.collectOne(selectors, selector -> selector.canHandle(className), selector -> selector.shouldImport(selfClassName, className)); return flag == null ? true : flag; } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TypeEntity.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TypeEntity.java index ad402389..210978eb 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TypeEntity.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/frame/TypeEntity.java @@ -8,7 +8,7 @@ import lombok.Setter; @Getter @Setter -public abstract class TypeEntity extends ContextEntity { +public abstract class TypeEntity { @NonNull private IType type; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java index b617dc20..36d552d6 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java @@ -142,7 +142,7 @@ public class AppTypeFactory extends AbstractTypeFactory { } IType genericType = null; for (Statement statement : statements) { - IType boxType = derivator.toBox(deducer.derive(clazz, statement)); + IType boxType = deducer.derive(clazz, statement).toBox(); if (genericType == null) { genericType = boxType; continue; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index 6d1beab0..69cce108 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -69,7 +69,7 @@ public class ExpressDeclareAction extends AbstractAppElementAction { invokeAction.visitElement(context, subElement); IType type = deducer.derive(clazz, statement); // 获取数组内部类型和泛型类型 - type = type.isArray() ? derivator.toTarget(type) : type.getGenericTypes().get(0); + type = type.isArray() ? type.toTarget() : type.getGenericTypes().get(0); Token varToken = element.get(1); varToken.setAttr(Attribute.TYPE, type); diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java index 2b4f5ab9..0d51b07c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java @@ -44,8 +44,7 @@ public class InvokeVisitAction extends AbstractAppElementAction { continue; } List parameterTypes = token.isInvoke() ? getParameterTypes(clazz, token) : null; - if (token.isType() || token.isArrayInit() || token.isTypeInit() || token.isCast() - || token.isLiteral()) { + if (token.isType() || token.isArrayInit() || token.isTypeInit() || token.isCast() || token.isLiteral()) { token.setAttr(Attribute.TYPE, factory.create(clazz, token)); } else if (token.isSubexpress()) { @@ -54,8 +53,7 @@ public class InvokeVisitAction extends AbstractAppElementAction { } else if (token.isLocalMethod()) { String memberName = token.attr(Attribute.MEMBER_NAME); - IType returnType = linker.visitMethod(derivator.withThisModifiers(clazz.getType()), memberName, - parameterTypes); + IType returnType = linker.visitMethod(clazz.getType().withThisModifiers(), memberName, parameterTypes); token.setAttr(Attribute.TYPE, returnType); } else if (token.isVisitField()) { @@ -72,7 +70,7 @@ public class InvokeVisitAction extends AbstractAppElementAction { } else if (token.isVisitIndex()) {// what like "[0]" IType type = stmt.get(index - 1).attr(Attribute.TYPE); - type = derivator.toTarget(type);// 转换数组类型为目标类型 + type = type.toTarget();// 转换数组类型为目标类型 token.setAttr(Attribute.TYPE, type); } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java index 9c4a3eb7..da1008ea 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java @@ -4,12 +4,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import com.gitee.spirit.common.enums.ModifierEnum; import com.gitee.spirit.core.api.ClassLinker; -import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeBuilder; -import com.gitee.spirit.core.clazz.utils.TypeTable; import com.gitee.spirit.core.clazz.utils.TypeVisiter; import cn.hutool.core.lang.Assert; @@ -18,30 +15,9 @@ import cn.hutool.core.lang.Assert; @Component public class AppTypeDerivator { - @Autowired - public TypeFactory factory; @Autowired public ClassLinker linker; - public IType toBox(IType type) { - IType boxType = TypeTable.getBoxType(type.getClassName()); - return boxType != null ? boxType : type; - } - - public IType toTarget(IType type) { - return factory.create(type.getTargetName()); - } - - public IType withSuperModifiers(IType type) { - type.setModifiers(ModifierEnum.SUPER.value); - return type; - } - - public IType withThisModifiers(IType type) { - type.setModifiers(ModifierEnum.THIS.value); - return type; - } - public IType populate(IType instanceType, IType targetType) {// 根据全局类型,进行填充 return TypeVisiter.visit(targetType, eachType -> { if (eachType.isTypeVariable()) { @@ -67,7 +43,7 @@ public class AppTypeDerivator { if (type.equals(abstractType)) {// 这个方法还要判断泛型 return 0; } - Integer score = getAbstractScore(abstractType, linker.getSuperType(toBox(type)));// 这个方法中,还要考虑到自动拆组包 + Integer score = getAbstractScore(abstractType, linker.getSuperType(type.toBox()));// 这个方法中,还要考虑到自动拆组包 if (score != null) { return score - 1; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java index d147a485..bb328d0a 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java @@ -30,9 +30,9 @@ public class DefaultVariableTracker implements VariableTracker { public IType findTypeByKeyword(VisitContext context, String variableName) { if (KeywordEnum.isSuper(variableName)) { - return derivator.withSuperModifiers(context.clazz.getSuperType()); + return context.clazz.getSuperType().withSuperModifiers(); } else if (KeywordEnum.isThis(variableName)) { - return derivator.withThisModifiers(context.clazz.getType()); + return context.clazz.getType().withThisModifiers(); } return null; } @@ -57,7 +57,7 @@ public class DefaultVariableTracker implements VariableTracker { public IType findTypeByInherit(VisitContext context, String variableName) { try { - return linker.visitField(derivator.withThisModifiers(context.clazz.getType()), variableName);// 从本身和父类里面寻找,父类可能是native的 + return linker.visitField(context.clazz.getType().withThisModifiers(), variableName);// 从本身和父类里面寻找,父类可能是native的 } catch (NoSuchFieldException e) { return null; } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index aaa53391..34a9bfa0 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -96,7 +96,7 @@ public class AdaptiveClassLinker implements ClassLinker { Assert.notEmpty(fieldName, "Field name cannot be empty!"); if (KeywordEnum.CLASS.value.equals(fieldName)) {// xxx.class class是关键字 - return factory.create(TypeTable.CLASS.getClassName(), derivator.toBox(type)); + return factory.create(TypeTable.CLASS.getClassName(), type.toBox()); } if (type.isPrimitive()) {// 原始类型没有属性和方法 @@ -116,8 +116,7 @@ public class AdaptiveClassLinker implements ClassLinker { } if (returnType == null) { - throw new NoSuchFieldException( - String.format("No such field!className:%s, fieldName:%s", type.getClassName(), fieldName)); + throw new NoSuchFieldException(String.format("No such field!className:%s, fieldName:%s", type.getClassName(), fieldName)); } return returnType; @@ -153,8 +152,7 @@ public class AdaptiveClassLinker implements ClassLinker { } if (returnType == null) { - throw new NoSuchMethodException( - String.format("No such method!className:%s, methodName:%s", type.getClassName(), methodName)); + throw new NoSuchMethodException(String.format("No such method!className:%s, methodName:%s", type.getClassName(), methodName)); } return returnType; diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtMethodMatcher.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtMethodMatcher.java index c2b53c71..d60f5784 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtMethodMatcher.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/linker/ExtMethodMatcher.java @@ -41,7 +41,7 @@ public class ExtMethodMatcher { Parameter parameter = method.getParameters()[idx];// 分为两种情况,一种是最后一个参数之前的,一种是最后一个参数 IType nativeParameterType = factory.create(parameter.getParameterizedType());// 获取本地参数类型 if (idx == method.getParameterCount() - 1 && ReflectUtils.isIndefinite(parameter)) {// 如果最后一个参数,而且是不定项参数,则取数组里的类型 - nativeParameterType = derivator.toTarget(nativeParameterType); + nativeParameterType = nativeParameterType.toTarget(); } nativeParameterType = derivator.populateParameter(type, parameterType, nativeParameterType);// 填充类型里的泛型参数 Integer scope = derivator.getAbstractScore(nativeParameterType, parameterType); -- Gitee From 848dd70e8fa69d6c9c47a62e7a78fc31c6596286 Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 12:29:29 +0800 Subject: [PATCH 63/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gitee/spirit/core/compile/DefaultClassVisiter.java | 3 +-- .../gitee/spirit/core/compile/action/ExpressDeclareAction.java | 3 --- .../gitee/spirit/core/compile/action/InvokeVisitAction.java | 3 --- .../spirit/core/compile/derivator/DefaultVariableTracker.java | 2 -- .../gitee/spirit/core/compile/linker/AdaptiveClassLinker.java | 3 --- 5 files changed, 1 insertion(+), 13 deletions(-) diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index a581a64d..6d7b8871 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -71,8 +71,7 @@ public class DefaultClassVisiter implements ClassVisiter { Statement statement = methodToken.getValue(); List statements = statement.subStmt("(", ")").splitStmt(","); for (Statement parameterStmt : statements) { - List annotations = ListUtils.filterStoppable(parameterStmt, token -> token.isAnnotation(), - token -> new IAnnotation(token)); + List annotations = ListUtils.filterStoppable(parameterStmt, token -> token.isAnnotation(), token -> new IAnnotation(token)); IParameter parameter = new IParameter(annotations, builder.build(parameterStmt)); parameter.setType(factory.create(clazz, parameterStmt.get(0))); method.parameters.add(parameter); diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java index 69cce108..96ebb0c2 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/ExpressDeclareAction.java @@ -11,7 +11,6 @@ import com.gitee.spirit.core.api.VariableTracker; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; -import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; @@ -31,8 +30,6 @@ public class ExpressDeclareAction extends AbstractAppElementAction { @Autowired public FragmentDeducer deducer; @Autowired - public AppTypeDerivator derivator; - @Autowired public ElementBuilder builder; @Autowired public ElementVisiter visiter; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java index 0d51b07c..57c59d8c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/InvokeVisitAction.java @@ -12,7 +12,6 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; @@ -30,8 +29,6 @@ public class InvokeVisitAction extends AbstractAppElementAction { public FragmentDeducer deducer; @Autowired public ClassLinker linker; - @Autowired - public AppTypeDerivator derivator; @Override public void visitElement(VisitContext context, Element element) { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java index bb328d0a..b8e81a7c 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java @@ -15,8 +15,6 @@ import com.gitee.spirit.core.compile.entity.VisitContext; @Component public class DefaultVariableTracker implements VariableTracker { - @Autowired - public AppTypeDerivator derivator; @Autowired public ClassLinker linker; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index 34a9bfa0..e8440433 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -14,7 +14,6 @@ import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import cn.hutool.core.lang.Assert; @@ -27,8 +26,6 @@ public class AdaptiveClassLinker implements ClassLinker { @Autowired public TypeFactory factory; @Autowired - public AppTypeDerivator derivator; - @Autowired public Map linkers; public ClassLinker getLinker(IType type) { -- Gitee From 9a13a3141d306e9c17503372336643cdad478e5d Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 12:40:20 +0800 Subject: [PATCH 64/66] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/spirit/core/api/TypeDerivator.java | 13 +++++++++++ .../spirit/core/compile/AppTypeFactory.java | 4 ++-- .../core/compile/DefaultClassVisiter.java | 4 ++-- .../compile/derivator/AppTypeDerivator.java | 22 +++++++++++-------- .../core/compile/linker/AppClassLinker.java | 4 ++-- .../core/compile/linker/AppMethodMatcher.java | 4 ++-- 6 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/TypeDerivator.java diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/TypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/TypeDerivator.java new file mode 100644 index 00000000..f3d8028c --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/TypeDerivator.java @@ -0,0 +1,13 @@ +package com.gitee.spirit.core.api; + +import com.gitee.spirit.core.clazz.entity.IType; + +public interface TypeDerivator { + + IType populate(IType instanceType, IType targetType); + + Integer getAbstractScore(IType abstractType, IType targetType); + + boolean isMoreAbstract(IType abstractType, IType targetType); + +} diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java index 36d552d6..2d32b2e3 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java @@ -10,12 +10,12 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.common.enums.ModifierEnum; import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.core.api.TypeDerivator; import com.gitee.spirit.core.clazz.AbstractTypeFactory; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeTable; import com.gitee.spirit.core.clazz.utils.TypeUtils; -import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; @@ -31,7 +31,7 @@ public class AppTypeFactory extends AbstractTypeFactory { @Autowired public FragmentDeducer deducer; @Autowired - public AppTypeDerivator derivator; + public TypeDerivator derivator; @Override public IType create(String className) {// 一般来说,className可以直接反应出大部分属性 diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index 6d7b8871..8eca9722 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -11,6 +11,7 @@ import com.gitee.spirit.common.utils.ObjectUtils; import com.gitee.spirit.core.api.ClassVisiter; import com.gitee.spirit.core.api.ElementBuilder; import com.gitee.spirit.core.api.ElementVisiter; +import com.gitee.spirit.core.api.TypeDerivator; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IAnnotation; import com.gitee.spirit.core.clazz.entity.IClass; @@ -21,7 +22,6 @@ import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.clazz.frame.MemberEntity; import com.gitee.spirit.core.clazz.utils.TypeTable; -import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; @@ -39,7 +39,7 @@ public class DefaultClassVisiter implements ClassVisiter { @Autowired public ElementVisiter visiter; @Autowired - public AppTypeDerivator derivator; + public TypeDerivator derivator; @Override public void prepareForVisit(IClass clazz) { diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java index da1008ea..7f0a8eae 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/AppTypeDerivator.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import com.gitee.spirit.core.api.ClassLinker; +import com.gitee.spirit.core.api.TypeDerivator; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.utils.TypeBuilder; import com.gitee.spirit.core.clazz.utils.TypeVisiter; @@ -13,11 +14,12 @@ import cn.hutool.core.lang.Assert; @Primary @Component -public class AppTypeDerivator { +public class AppTypeDerivator implements TypeDerivator { @Autowired public ClassLinker linker; + @Override public IType populate(IType instanceType, IType targetType) {// 根据全局类型,进行填充 return TypeVisiter.visit(targetType, eachType -> { if (eachType.isTypeVariable()) { @@ -30,24 +32,25 @@ public class AppTypeDerivator { }); } - public Integer getAbstractScore(IType abstractType, IType type) { - if (abstractType == null || type == null) { + @Override + public Integer getAbstractScore(IType abstractType, IType targetType) { + if (abstractType == null || targetType == null) { return null; } if (abstractType.isNull()) {// null类型不能比任何类型抽象 return null; } - if (type.isNull()) {// 任何类型都能比null抽象 + if (targetType.isNull()) {// 任何类型都能比null抽象 return 0; } - if (type.equals(abstractType)) {// 这个方法还要判断泛型 + if (targetType.equals(abstractType)) {// 这个方法还要判断泛型 return 0; } - Integer score = getAbstractScore(abstractType, linker.getSuperType(type.toBox()));// 这个方法中,还要考虑到自动拆组包 + Integer score = getAbstractScore(abstractType, linker.getSuperType(targetType.toBox()));// 这个方法中,还要考虑到自动拆组包 if (score != null) { return score - 1; } - for (IType interfaceType : linker.getInterfaceTypes(type)) {// 接口 + for (IType interfaceType : linker.getInterfaceTypes(targetType)) {// 接口 Integer score1 = getAbstractScore(abstractType, interfaceType); if (score1 != null) { return score1 - 1; @@ -56,8 +59,9 @@ public class AppTypeDerivator { return null; } - public boolean isMoreAbstract(IType abstractType, IType type) { - return getAbstractScore(abstractType, type) != null; + @Override + public boolean isMoreAbstract(IType abstractType, IType targetType) { + return getAbstractScore(abstractType, targetType) != null; } } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java index 962b7389..b60a6f42 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppClassLinker.java @@ -10,12 +10,12 @@ import org.springframework.stereotype.Component; import com.gitee.spirit.common.utils.ListUtils; import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.ClassVisiter; +import com.gitee.spirit.core.api.TypeDerivator; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IField; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.compile.AppClassLoader; -import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; import cn.hutool.core.lang.Assert; @@ -28,7 +28,7 @@ public class AppClassLinker implements ClassLinker { @Autowired public ClassVisiter visiter; @Autowired - public AppTypeDerivator derivator; + public TypeDerivator derivator; @Autowired public AppMethodMatcher matcher; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java index 7b3b7be1..2acc259f 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AppMethodMatcher.java @@ -5,16 +5,16 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.gitee.spirit.core.api.TypeDerivator; import com.gitee.spirit.core.clazz.entity.IMethod; import com.gitee.spirit.core.clazz.entity.IParameter; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.compile.derivator.AppTypeDerivator; @Component public class AppMethodMatcher { @Autowired - public AppTypeDerivator derivator; + public TypeDerivator derivator; public Integer getMethodScore(IType type, IMethod method, List parameterTypes) { if (method.parameters.size() != parameterTypes.size()) { -- Gitee From 76360d035b9678b44e73c4dd3adf202ac236252b Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 13:21:52 +0800 Subject: [PATCH 65/66] =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/clazz/AbstractTypeFactory.java | 4 +-- .../gitee/spirit/core/clazz/entity/IType.java | 4 +-- .../{TypeTable.java => TypeRegistry.java} | 2 +- .../spirit/core/compile/AppTypeFactory.java | 26 +++++++++---------- .../core/compile/DefaultClassVisiter.java | 8 +++--- .../compile/derivator/FragmentDeducer.java | 4 +-- .../compile/linker/AdaptiveClassLinker.java | 16 ++++++------ .../spirit/output/java/ExtTypeFactory.java | 4 +-- .../java/action/StringEqualsAction.java | 4 +-- 9 files changed, 36 insertions(+), 36 deletions(-) rename spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/{TypeTable.java => TypeRegistry.java} (99%) diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java index f7a2597b..bd2e8ca7 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java @@ -10,7 +10,7 @@ import com.gitee.spirit.core.api.SemanticParser; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import cn.hutool.core.lang.Assert; @@ -33,7 +33,7 @@ public abstract class AbstractTypeFactory implements TypeFactory { @Override public IType createTypeVariable(String genericName) {// T or K - IType type = create(TypeTable.OBJECT.getClassName()); + IType type = create(TypeRegistry.OBJECT.getClassName()); type.setGenericName(genericName); return type; } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java index dfab780c..d626d1d5 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/entity/IType.java @@ -8,7 +8,7 @@ import org.apache.commons.lang3.StringUtils; import com.gitee.spirit.common.enums.ModifierEnum; import com.gitee.spirit.common.utils.SpringUtils; import com.gitee.spirit.core.api.TypeFactory; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import com.gitee.spirit.core.clazz.utils.TypeUtils; import lombok.Getter; @@ -49,7 +49,7 @@ public class IType { } public IType toBox() { - IType boxType = TypeTable.getBoxType(getClassName()); + IType boxType = TypeRegistry.getBoxType(getClassName()); return boxType != null ? boxType : this; } diff --git a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeTable.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeRegistry.java similarity index 99% rename from spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeTable.java rename to spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeRegistry.java index 5d5951b5..83c6285a 100644 --- a/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeTable.java +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeRegistry.java @@ -4,7 +4,7 @@ import com.gitee.spirit.common.enums.PrimitiveEnum; import com.gitee.spirit.common.utils.ConfigUtils; import com.gitee.spirit.core.clazz.entity.IType; -public class TypeTable { +public class TypeRegistry { public static final IType VOID; public static final IType BOOLEAN; diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java index 2d32b2e3..abfd7d31 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppTypeFactory.java @@ -14,7 +14,7 @@ import com.gitee.spirit.core.api.TypeDerivator; import com.gitee.spirit.core.clazz.AbstractTypeFactory; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import com.gitee.spirit.core.clazz.utils.TypeUtils; import com.gitee.spirit.core.compile.derivator.FragmentDeducer; import com.gitee.spirit.core.element.entity.Statement; @@ -66,7 +66,7 @@ public class AppTypeFactory extends AbstractTypeFactory { if (token.value instanceof String) {// String // String[] //? //T,K String simpleName = token.getValue(); if ("?".equals(simpleName)) { - return TypeTable.WILDCARD;// ? + return TypeRegistry.WILDCARD;// ? } if (clazz.getTypeVariableIndex(simpleName) >= 0) { return createTypeVariable(simpleName);// T or K @@ -96,19 +96,19 @@ public class AppTypeFactory extends AbstractTypeFactory { public IType getValueType(IClass clazz, Token token) { if (token.isBoolean()) { - return TypeTable.BOOLEAN; + return TypeRegistry.BOOLEAN; } else if (token.isChar()) { - return TypeTable.CHAR; + return TypeRegistry.CHAR; } else if (token.isInt()) { - return TypeTable.INT; + return TypeRegistry.INT; } else if (token.isLong()) { - return TypeTable.LONG; + return TypeRegistry.LONG; } else if (token.isDouble()) { - return TypeTable.DOUBLE; + return TypeRegistry.DOUBLE; } else if (token.isNull()) { - return TypeTable.NULL; + return TypeRegistry.NULL; } else if (token.isString()) { - return TypeTable.STRING; + return TypeRegistry.STRING; } else if (token.isList()) { return getListType(clazz, token); } else if (token.isMap()) { @@ -120,7 +120,7 @@ public class AppTypeFactory extends AbstractTypeFactory { public IType getListType(IClass clazz, Token token) { Statement statement = token.getValue(); List statements = statement.subStmt(1, statement.size() - 1).splitStmt(","); - return create(TypeTable.LIST.getClassName(), getGenericType(clazz, statements)); + return create(TypeRegistry.LIST.getClassName(), getGenericType(clazz, statements)); } public IType getMapType(IClass clazz, Token token) { @@ -132,13 +132,13 @@ public class AppTypeFactory extends AbstractTypeFactory { keyStatements.add(subStatements.get(0)); valueStatements.add(subStatements.get(1)); } - return create(TypeTable.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); + return create(TypeRegistry.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); } public IType getGenericType(IClass clazz, List statements) { // 如果没有元素,则返回Object类型 if (statements.size() == 0) { - return TypeTable.OBJECT; + return TypeRegistry.OBJECT; } IType genericType = null; for (Statement statement : statements) { @@ -151,7 +151,7 @@ public class AppTypeFactory extends AbstractTypeFactory { genericType = boxType; } else if (!derivator.isMoreAbstract(genericType, boxType)) {// 不同则使用Object - genericType = TypeTable.OBJECT; + genericType = TypeRegistry.OBJECT; break; } } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java index 8eca9722..0ce28f12 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultClassVisiter.java @@ -21,7 +21,7 @@ import com.gitee.spirit.core.clazz.entity.IParameter; import com.gitee.spirit.core.clazz.entity.IType; import com.gitee.spirit.core.clazz.entity.IVariable; import com.gitee.spirit.core.clazz.frame.MemberEntity; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import com.gitee.spirit.core.compile.entity.VisitContext; import com.gitee.spirit.core.element.entity.Element; import com.gitee.spirit.core.element.entity.Statement; @@ -108,14 +108,14 @@ public class DefaultClassVisiter implements ClassVisiter { visitChildElements(context, method.element); // 判断方法的语法 if (method.element.isFunc()) { - return context.returnType != null ? context.returnType : TypeTable.VOID; + return context.returnType != null ? context.returnType : TypeRegistry.VOID; } else if (method.element.isDeclareFunc()) { // 获取声明的类型 IType declaredType = factory.create(clazz, method.element.get(0)); // 如果这个方法有方法体 if (method.element.hasChild()) { - IType returnType = context.returnType != null ? context.returnType : TypeTable.VOID; + IType returnType = context.returnType != null ? context.returnType : TypeRegistry.VOID; // 进行类型校验 if (!derivator.isMoreAbstract(declaredType, returnType)) { throw new RuntimeException("The derived type does not match the declared type!"); @@ -159,7 +159,7 @@ public class DefaultClassVisiter implements ClassVisiter { if (derivator.isMoreAbstract(variable.getType(), context.returnType)) { context.returnType = variable.getType(); } else { - context.returnType = TypeTable.OBJECT; + context.returnType = TypeRegistry.OBJECT; } } } diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java index 3775d4c4..31be8e53 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java @@ -9,7 +9,7 @@ import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.core.api.TreeBuilder; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import com.gitee.spirit.core.element.entity.Node; import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; @@ -41,7 +41,7 @@ public class FragmentDeducer { // 如果是逻辑判断,或者类型判断关键字 if (token.isLogical() || token.isRelation() || token.isInstanceof()) { - return TypeTable.BOOLEAN; + return TypeRegistry.BOOLEAN; } else if (token.isArithmetic() || token.isBitwise()) { // 先取左边的,再取右边的 diff --git a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java index e8440433..29e85c32 100644 --- a/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/linker/AdaptiveClassLinker.java @@ -13,7 +13,7 @@ import com.gitee.spirit.common.enums.ModifierEnum; import com.gitee.spirit.core.api.ClassLinker; import com.gitee.spirit.core.api.TypeFactory; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import cn.hutool.core.lang.Assert; @@ -53,16 +53,16 @@ public class AdaptiveClassLinker implements ClassLinker { } if (type.isArray()) { - return TypeTable.OBJECT; + return TypeRegistry.OBJECT; } - if (TypeTable.OBJECT.equals(type)) { + if (TypeRegistry.OBJECT.equals(type)) { return null; } IType superType = getLinker(type).getSuperType(type);// 如果不存在父类,则返回Object if (superType == null) { - return TypeTable.OBJECT; + return TypeRegistry.OBJECT; } int modifiers = type.getModifiers(); @@ -93,7 +93,7 @@ public class AdaptiveClassLinker implements ClassLinker { Assert.notEmpty(fieldName, "Field name cannot be empty!"); if (KeywordEnum.CLASS.value.equals(fieldName)) {// xxx.class class是关键字 - return factory.create(TypeTable.CLASS.getClassName(), type.toBox()); + return factory.create(TypeRegistry.CLASS.getClassName(), type.toBox()); } if (type.isPrimitive()) {// 原始类型没有属性和方法 @@ -101,7 +101,7 @@ public class AdaptiveClassLinker implements ClassLinker { } if (type.isArray() && ARRAY_LENGTH.equals(fieldName)) {// 访问数组length直接返回int类型 - return TypeTable.INT; + return TypeRegistry.INT; } IType returnType = getLinker(type).visitField(type, fieldName);// 向上遍历推导 @@ -136,8 +136,8 @@ public class AdaptiveClassLinker implements ClassLinker { throw new RuntimeException("Array has no method!"); } - if (TypeTable.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 - return TypeTable.BOOLEAN; + if (TypeRegistry.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 + return TypeRegistry.BOOLEAN; } IType returnType = getLinker(type).visitMethod(type, methodName, parameterTypes);// 向上遍历推导 diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeFactory.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeFactory.java index e48830f5..7ee2b860 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeFactory.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtTypeFactory.java @@ -11,7 +11,7 @@ import java.util.List; import org.springframework.stereotype.Component; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import com.gitee.spirit.core.compile.AppTypeFactory; @Component @@ -36,7 +36,7 @@ public class ExtTypeFactory extends AppTypeFactory { return create((Class) nativeType); } else if (nativeType instanceof WildcardType) {// ? - return TypeTable.WILDCARD; + return TypeRegistry.WILDCARD; } else if (nativeType instanceof TypeVariable) {// T or K return createTypeVariable(nativeType.toString()); diff --git a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java index dfe1d32b..357363c2 100644 --- a/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/StringEqualsAction.java @@ -11,7 +11,7 @@ import com.gitee.spirit.common.constants.Attribute; import com.gitee.spirit.common.enums.TokenTypeEnum; import com.gitee.spirit.core.clazz.entity.IClass; import com.gitee.spirit.core.clazz.entity.IType; -import com.gitee.spirit.core.clazz.utils.TypeTable; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; import com.gitee.spirit.core.element.entity.Statement; import com.gitee.spirit.core.element.entity.Token; import com.gitee.spirit.output.java.utils.TypeUtils; @@ -45,7 +45,7 @@ public class StringEqualsAction extends AbstractTreeElementAction { String format = currentToken.isEquals() ? FORMAT : "!" + FORMAT; String text = String.format(format, prevStatement, nextStatement); Token expressToken = new Token(TokenTypeEnum.CUSTOM_EXPRESS, text); - expressToken.setAttr(Attribute.TYPE, TypeTable.BOOLEAN); + expressToken.setAttr(Attribute.TYPE, TypeRegistry.BOOLEAN); expressToken.setAttr(Attribute.TREE_ID, currentToken.attr(Attribute.TREE_ID)); statement.replaceTokens(start, end, expressToken); clazz.addImport(StringUtils.class.getName()); -- Gitee From a51c4f842f0b08bb70601d8f20d4382d042e01ba Mon Sep 17 00:00:00 2001 From: "tao.chen1" Date: Mon, 7 Jun 2021 13:29:53 +0800 Subject: [PATCH 66/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BC=A9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 45b0412b..293fcc3a 100644 --- a/README.md +++ b/README.md @@ -40,21 +40,21 @@ public class Main { ```xml - com.gitee.chentaoah - spirit-stdlib - 最新版(>= 2.1.30) + com.gitee.chentaoah + spirit-stdlib + 最新版(>= 2.1.30) - org.slf4j - slf4j-api - 1.7.25 + org.slf4j + slf4j-api + 1.7.25 - org.apache.commons - commons-lang3 - 3.9 + org.apache.commons + commons-lang3 + 3.9 ``` -- Gitee