diff --git a/README.md b/README.md index f94170b83bf67d4f2e99a9cbd480fa715e01b143..293fcc3a234709bd30ed1da41bc1b0da75b6ab4b 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,15 @@ ## 代码示例 -``` +### 原始代码 + +```go func main() { print "hello world!" } ``` -生成代码如下: +### 目标代码 ```java package com.sum.test.main; @@ -31,66 +33,73 @@ 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依赖 - -请确保项目中有如下依赖: +在pom.xml中引入以下jar包: ```xml - com.gitee.chentaoah - spirit-stdlib - ${project.version} + com.gitee.chentaoah + spirit-stdlib + 最新版(>= 2.1.30) - org.slf4j - slf4j-api - ${slf4j.version} + org.slf4j + slf4j-api + 1.7.25 - org.apache.commons - commons-lang3 - ${lang3.version} + org.apache.commons + commons-lang3 + 3.9 ``` +### 代码编辑 + +1. 下载并安装sublime编辑器。 + +2. 打开sublime,点击上方Preferences->Browse Packages按钮。 + +3. 将spirit项目中sublime-plugs目录下的所有文件,拷贝到User文件夹中。 + +4. 在项目src/main/resources目录下,创建sources子目录。在sources目录下,创建一个文件夹。例如:com.sum.spirit.example。 + +5. 在文件夹下,创建Main.sp文件,并在sublime中打开,输入如下内容: + + ```go + func main() { + print "hello world!" + } + ``` + +### 代码编译 + +1. 在pom.xml中引入插件。 + + ```xml + + + + com.gitee.chentaoah + spirit-maven-plugin + 最新版(>= 2.1.30) + + + + compile + + + + + + + ``` + +2. 执行Maven命令(mvn spirit:compile)并刷新,在src/main/java目录下,即可看到生成的Java代码。 + + + diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/constants/AppConfig.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/AppConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..1d0e84086fa6c98eef798dddc610661a656847e1 --- /dev/null +++ b/spirit-common/src/main/java/com/gitee/spirit/common/constants/AppConfig.java @@ -0,0 +1,21 @@ +package com.gitee.spirit.common.constants; + +public interface AppConfig { + + 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"; + } + + public static interface DefaultValue { + String CHARSET = "UTF-8"; + String FILE_EXTENSION = "sp"; + boolean DEBUG = true; + } + +} diff --git a/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attribute.java b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attribute.java new file mode 100644 index 0000000000000000000000000000000000000000..8afd15800ef3703cbb5da9c7051b3ae9cbf7dc9f --- /dev/null +++ b/spirit-common/src/main/java/com/gitee/spirit/common/constants/Attribute.java @@ -0,0 +1,17 @@ +package com.gitee.spirit.common.constants; + +public interface Attribute { + + String SIMPLE_NAME = "SIMPLE_NAME"; // 类名 + String MEMBER_NAME = "MEMBER_NAME"; // 字段名或者方法名 + + String OPERAND = "OPERAND"; // 操作数 + String TREE_ID = "TREE_ID"; // 树节点id + + String POSITION = "POSITION"; // 在语句中的位置 + String LENGTH = "LENGTH"; // 字符串的宽度 + + String TYPE = "TYPE"; // 类型 + String DERIVED = "DERIVED"; // 是否声明 + +} 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 23828238c268aaccd3afc9980da56c13999392c4..65d0d1915827042c139254fb253c60780168c13b 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 b4b8d93577caa9db5ed33a6b1fec90c4595c3b38..7ce3dd8c25da9432c05efb3f9fd5da0a8e8fb632 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 b30fce8e873caf142250976b9bf648af53eb3180..680024730b02ac8955edc010b0e9aa6fd6a4252f 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 ea37011f80a227156549fd5394693a33dd8710e2..4b6e943eb093e33970832b83009e21f7c10b757e 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 7524583a58ca3d56a336e11a974b40e5d9399c06..bab6881bf4e7fb9a1e4c74ce107dcfdb169afeea 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 a2d294b7b08038197152237f0b0c716ff781f294..dcfc68508d4d26e2d77b6a481a3268d1ca3a53d1 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 { - 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 56% 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 c567511f2bceb9cb90310755942f33ba69a4e6a2..dc305f5d69d0732e2e9d3ab729d1c1456c926172 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,14 +1,21 @@ -package com.sum.spirit.common.pattern; +package com.gitee.spirit.common.pattern; import java.util.regex.Pattern; +import com.gitee.spirit.common.enums.TokenTypeEnum; + 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(); } @@ -25,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/gitee/spirit/common/pattern/CommonPattern.java b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CommonPattern.java new file mode 100644 index 0000000000000000000000000000000000000000..977f437df9b6779665b7d2c6905ae7b259d20044 --- /dev/null +++ b/spirit-common/src/main/java/com/gitee/spirit/common/pattern/CommonPattern.java @@ -0,0 +1,62 @@ +package com.gitee.spirit.common.pattern; + +import java.util.regex.Pattern; + +import com.gitee.spirit.common.enums.TokenTypeEnum; + +public class CommonPattern { + + 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 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(); + } + + public static TokenTypeEnum getSubexpressTokenType(String word) { + if (isSubexpress(word)) { + return TypePattern.isAnyType(CommonPattern.getSubexpressValue(word)) ? TokenTypeEnum.CAST : TokenTypeEnum.SUBEXPRESS; + } + 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-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 70% 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 f09c8d33838e1a174468b084a3cd51531ae867ec..02ddefed283b7ce56e6aa86fbad1542e4be7dd7f 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,7 +1,9 @@ -package com.sum.spirit.common.pattern; +package com.gitee.spirit.common.pattern; import java.util.regex.Pattern; +import com.gitee.spirit.common.enums.TokenTypeEnum; + public class LiteralPattern { public static final Pattern NULL_PATTERN = Pattern.compile("^null$"); @@ -13,8 +15,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(); @@ -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/gitee/spirit/common/pattern/TypePattern.java similarity index 74% 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 7480b6785ddb4d3af539521d6efc9d110c656281..bb4b3d1f8ade0bb09ade1a358e8657281c2180d8 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,13 +1,12 @@ -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.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.common.enums.TokenTypeEnum; 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 +21,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 +54,21 @@ 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)); + } + + 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; } } 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 67% 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 54036e27bec79cefb9b7a96fa71bd43cb5f4c6d6..5d2c19ce0cdc0564106c2941057d1414c8430bf7 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,10 +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; +import com.gitee.spirit.common.constants.AppConfig.Argument; +import com.gitee.spirit.common.constants.AppConfig.DefaultValue; @Component public class ConfigUtils implements EnvironmentAware { @@ -41,23 +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(Argument.LANG_PACKAGE); + } + + public static String getUtilPackage() { + 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-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 82% 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 3c9e42846cbd2eb8873bdb0b3509e21539c05dac..f4c4df0e2f7848ea913aaec4e8a0cf0312c874e4 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 { @@ -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++) { 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 92045f41f14e71bf583e4ee31fed18f54e464981..74b1c9bf4ca75855e5807e159036d7092462b393 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 3e26459bc25d2795798d27ae3e600ce06777f8be..a7a3bca140cf2b5426cf2a8d873e390b967d31d3 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 a70f168473a1cc5810cd3742a4448781a559ab60..45c47e8aa80f2e3ba0258852c806d54fbd6dc176 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 55% 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 eadea9c119a291d076d2d5d153a5ca2804230a84..f895f26bd863ae17af64a7006c828df979d03184 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,55 +1,42 @@ -package com.sum.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 -public class SpringUtils implements ApplicationContextAware { - - public static ApplicationContext context; - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - context = applicationContext; - } - - public static T getBean(Class requiredType) { - return context.getBean(requiredType); - } - - public static T getBean(String name, Class requiredType) { - return context.getBean(name, requiredType); - } - - public static Map getBeansOfType(Class type) { - return context.getBeansOfType(type); - } - - public static List 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()); - } +package com.gitee.spirit.common.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +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 SpringUtils implements ApplicationContextAware { + + public static ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + public static T getBean(Class requiredType) { + return context.getBean(requiredType); + } + + public static T getBean(String name, Class requiredType) { + return context.getBean(name, requiredType); + } + + public static Map getBeansOfType(Class type) { + return context.getBeansOfType(type); + } + + public static List getBeans(Class requiredType) { + Map beanMap = getBeansOfType(requiredType); + List beans = new ArrayList<>(beanMap.values()); + beans.sort(new AnnotationAwareOrderComparator()); + return beans; + } + } \ No newline at end of file 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 a98963ba2bbc10d17ed70e330018af28a0059b9e..e5e455b5508edf19c604b01537f102f755d7a175 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-common/src/main/java/com/sum/spirit/common/annotation/App.java b/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java deleted file mode 100644 index 8af618382c174cc804b55582dfafa0e9fee03887..0000000000000000000000000000000000000000 --- a/spirit-common/src/main/java/com/sum/spirit/common/annotation/App.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sum.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/sum/spirit/common/annotation/Native.java b/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java deleted file mode 100644 index ac015a41de56e26dcf79d5fe3cb97c4f0112b9b1..0000000000000000000000000000000000000000 --- a/spirit-common/src/main/java/com/sum/spirit/common/annotation/Native.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sum.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-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java b/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java deleted file mode 100644 index ff25b5e5d200479f8b30ed856c4aa6e98a2dc72e..0000000000000000000000000000000000000000 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/AppConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sum.spirit.common.constants; - -public class AppConfig { - - public static final 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"; - - public static final String FILENAME_EXTENSION_KEY = "spirit.compile.file.extension"; - public static final String DEBUG_KEY = "spirit.compile.debug"; - - public static final String DEFAULT_FILENAME_EXTENSION = "sp"; - public static final 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 deleted file mode 100644 index f1fb1423a49d2ff36375284f9bbf694230a78060..0000000000000000000000000000000000000000 --- a/spirit-common/src/main/java/com/sum/spirit/common/constants/Attribute.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sum.spirit.common.constants; - -public class Attribute { - - public static final String SIMPLE_NAME = "SIMPLE_NAME"; // 类名 - public static final String MEMBER_NAME = "MEMBER_NAME"; // 字段名或者方法名 - - public static final String OPERAND = "OPERAND"; // 操作数 - public static final String TREE_ID = "TREE_ID"; // 树节点id - - public static final String POSITION = "POSITION"; // 在语句中的位置 - public static final String LENGTH = "LENGTH"; // 字符串的宽度 - - public static final String TYPE = "TYPE"; // 类型 - public static final String DERIVED = "DERIVED"; // 是否声明 - -} 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 b839a02b392411e1e95d207d684cd1aff6f7d06e..0000000000000000000000000000000000000000 --- 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-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 61% 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 8238fea9bb1a5a9e5616d8d7e2803685f5e8fd9f..2dee29a14215ffcc8d3be0f3b3027ca9f3979fdc 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,11 +1,11 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; import java.net.URL; 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/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 cde127f6e1462399445c68e0583d548e4dad4f2a..9d7c1ac0cd934af0bb1d977f9ac8901a550360e3 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 37% 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 9e993f494a1e5654f2ea672377b45d92f246abcc..becba27be520fe42b43a521d4e067ca8f6f61a25 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,11 +1,11 @@ -package com.sum.spirit.core.api; +package com.gitee.spirit.core.api; public interface ImportSelector { - String findClassName(String simpleName); + boolean canHandle(String className); - boolean isHandle(String className); + String findClassName(String simpleName); - boolean shouldImport(String selfName, String className); + boolean shouldImport(String selfClassName, String className); } 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 8575984313bfd392a40dfb043816ffc7c4986c29..d643d828564b86e165d87d4ba10564863868492b 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/gitee/spirit/core/clazz/AbstractClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..942999bccb0887b621692ec2edd8ec3990a7cdeb --- /dev/null +++ b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractClassLoader.java @@ -0,0 +1,19 @@ +package com.gitee.spirit.core.clazz; + +import java.net.URL; + +import com.gitee.spirit.core.api.ClassLoader; + +public abstract class AbstractClassLoader implements ClassLoader { + + @Override + public T loadClass(String name) { + URL resource = getResource(name); + return defineClass(name, resource); + } + + 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/AbstractImportSelector.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractImportSelector.java new file mode 100644 index 0000000000000000000000000000000000000000..f565437c5ed62d353f3e920c581a396e6c5e9dac --- /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/sum/spirit/core/clazz/AbstractTypeFactory.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/AbstractTypeFactory.java similarity index 66% 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 9006e911d7436e66f648e1ab8d74458370c326e3..bd2e8ca7961c9d24402a49d24d69b8b47b4a06c5 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,12 +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.StaticTypes; -import com.sum.spirit.core.element.entity.SemanticContext; +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.TypeRegistry; import cn.hutool.core.lang.Assert; @@ -34,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(TypeRegistry.OBJECT.getClassName()); type.setGenericName(genericName); return type; } @@ -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-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 58% 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 bc6ef8e177625824b69910628f6e2dc2b45632de..833186b1fb42beec800d24e64fe8b7d4f4460d70 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,9 +1,10 @@ -package com.sum.spirit.core.clazz; +package com.gitee.spirit.core.clazz; 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; @@ -14,17 +15,15 @@ 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.URLFileUtils; +import com.gitee.spirit.core.clazz.entity.IClass; 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 @@ -32,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 @@ -62,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 @@ -81,18 +80,13 @@ public abstract class AbstractURLClassLoader extends AbstractClassLoader } @Override - public URL findResource(String name) { - return nameUrlMapping.get(name); - } - - @Override - public String findClassName(String simpleName) { - return ListUtils.findOne(classes.keySet(), className -> className.endsWith("." + simpleName)); + 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/sum/spirit/core/clazz/DefaultClassResolver.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/DefaultClassResolver.java similarity index 77% 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 9422ca963894d6f3255c634364cc9d4cf9290807..2a97973ae774cb94eb6bf2fb7e1c643c1d217299 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,30 +8,23 @@ 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.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 { +public class DefaultClassResolver implements ClassResolver { @Autowired public ElementBuilder builder; - @Autowired - public TypeFactory factory; - @Autowired - public List selectors; @Override public Map resolve(String packageStr, Document document) { @@ -107,7 +100,6 @@ public class DefaultClassResolver implements ClassResolver, ResolverContext { clazz.packageStr = packageStr; clazz.fields = fields; clazz.methods = methods; - clazz.context = this; } public void readRootElement(IClass clazz) { @@ -125,19 +117,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/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 23663826cf3de61e29266c6cce41e6b2f00b2c00..e88e16d768ab595f4abece49dce114dce0a7cfcc 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 77% 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 120c7804eb218c53f39c0e7a17fe90eddfb4cc44..86691861965429c0ff79552071f507dad9b69846 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,17 @@ -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.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; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.core.element.entity.Token; import cn.hutool.core.lang.Assert; @@ -72,15 +74,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 = SpringUtils.getBean(TypeFactory.class); + return factory.create(this, token); } return null; } public List getInterfaceTypes() { List interfaces = new ArrayList<>(); + TypeFactory factory = SpringUtils.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/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 e627f6e3e67df28a0108452e693f8ade176b073b..e5b6bcefc253c52fee53792b5b7048e2efd81a68 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 47d2100e4f16b1a6fb2aa725018898f8b94087f5..f730dd4bcd31bd315d8d3c485700582f136a0317 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 8c25dec5ed1472aaa1ccc8a992766f0532352640..a2645cb4c9f44b73dc3ef47bfde824e6206c6fd6 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 70% 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 0d7bc067e78ebf063bf921be66b5d2b57c19b822..d626d1d5074e259eb17e1511c4a502667a97fe37 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,15 @@ -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.common.enums.ModifierEnum; +import com.gitee.spirit.common.utils.SpringUtils; +import com.gitee.spirit.core.api.TypeFactory; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; +import com.gitee.spirit.core.clazz.utils.TypeUtils; import lombok.Getter; import lombok.Setter; @@ -44,10 +48,30 @@ public class IType { return genericTypes != null && genericTypes.size() > 0; } + public IType toBox() { + IType boxType = TypeRegistry.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/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 6353aa452d972991d919edfe96415e063c1a2862..70c09e93f00bc18b4a7d82939f3934430c71af94 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 d9f776854da98d70941ec249bff35a820c432b10..1d162e52ecbce999fd5af72362a5f14dfd45cafd 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 5fbbcc93cd942eb1521c6df00953ef15af955922..29785e1ebeb7fadf2792adb58718c91f9a1dd7e6 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/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 d8198f827db7e4f84d0b0c351e4f13d80d74ff1d..3804745f57240ec70481f9c4788057eeb8c01891 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 76% 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 8e3e7e5c30047cf63ea5e3deff5d29564e8a4085..99b00f53a4cea2a3f65f79d21d425bccdb07243e 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,18 @@ -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.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; +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; @@ -105,7 +107,7 @@ public abstract class ImportEntity extends AnnotationEntity { } // 构建一个行元素 - ElementBuilder builder = context.getElementBuilder(); + ElementBuilder builder = SpringUtils.getBean(ElementBuilder.class); imports.add(new Import(builder.build("import " + targetName))); return true; } @@ -117,18 +119,19 @@ public abstract class ImportEntity extends AnnotationEntity { return true; } // 构建一个行元素 - ElementBuilder builder = context.getElementBuilder(); + ElementBuilder builder = SpringUtils.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 = SpringUtils.getBeans(ImportSelector.class); + return ListUtils.collectOne(selectors, selector -> selector.findClassName(simpleName)); } - public boolean shouldImport(String selfName, String className) { - Boolean flag = ListUtils.collectOne(context.getImportSelectors(), importSelector -> importSelector.isHandle(className), - importSelector -> importSelector.shouldImport(selfName, className)); + public boolean shouldImport(String selfClassName, String className) { + 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/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 e5afa33e133838ab1a88fc655d0ae9aa436cc07b..248fc350e3df3bce758c8670fcdfa26e456433a6 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 fd8f96093269268f70de5a175aa6df20fc4f17b3..811d53048e694b789652f3f3558ce1fc0655cd39 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 45% 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 e922d9cec2e2e9bbc3864a3e2c2eb11a779f89ae..210978eb69e958dd12f658e0b41e56c7dcb9a77b 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; @@ -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-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 52e83a733da7413e865403ee33f5332ac2ab3586..417d3b8c80d00a755ff32a0a3821b987b571fcb0 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/StaticTypes.java b/spirit-core/spirit-core-class/src/main/java/com/gitee/spirit/core/clazz/utils/TypeRegistry.java similarity index 53% 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/gitee/spirit/core/clazz/utils/TypeRegistry.java index 8bbe3d17d0920bbc29d668c5c53c8a7282c61f72..83c6285a22562af4cc4687d55e899ef4be58b7c2 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/gitee/spirit/core/clazz/utils/TypeRegistry.java @@ -1,15 +1,10 @@ -package com.sum.spirit.core.clazz.utils; +package com.gitee.spirit.core.clazz.utils; -import java.util.Map; +import com.gitee.spirit.common.enums.PrimitiveEnum; +import com.gitee.spirit.common.utils.ConfigUtils; +import com.gitee.spirit.core.clazz.entity.IType; -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.core.clazz.entity.IType; - -import cn.hutool.core.lang.Assert; - -public class StaticTypes { +public class TypeRegistry { 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-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 a58f70892d7915e4cf778b43fe13faa470371598..9b901d351e402dbf37c952c7fd126375f1471e82 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 fec5a22e3fee158edf1ae10eb728c0dd85a76868..4879d55bf6f4e2263567937a711b45696a67ff91 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-class/src/main/java/com/sum/spirit/core/api/ResolverContext.java b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ResolverContext.java deleted file mode 100644 index dbd9b02724840a3e808d98e8221e9c1fcf4e8226..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/api/ResolverContext.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sum.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/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 c6eab7cc93ccf349db651ed5aca598408b387cfb..0000000000000000000000000000000000000000 --- 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/AbstractClassLoader.java b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractClassLoader.java deleted file mode 100644 index 88605957aa2125458f367d334d45b0aaba314fd8..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/AbstractClassLoader.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sum.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; - -public abstract class AbstractClassLoader implements ClassLoader, ImportSelector { - - @Override - public T loadClass(String name) { - URL resource = findResource(name); - 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/sum/spirit/core/clazz/frame/ContextEntity.java b/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ContextEntity.java deleted file mode 100644 index 078815b1cc7fd7945a528d3ec65e44b6ced466a9..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-class/src/main/java/com/sum/spirit/core/clazz/frame/ContextEntity.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sum.spirit.core.clazz.frame; - -import com.sum.spirit.core.api.ResolverContext; - -public abstract class ContextEntity { - - public ResolverContext context; - -} 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 33075203c254cd0a4ed7f6f56b05fe23281d3eda..2b6b33c4e89b7ec3b47c2f86fad2209a7bb1c937 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 84731e0f9ea7eb1aa8a2fe973ef3c4fca4ec7e5a..33038f358f8c4832f5b5ddfeb20ed25ef19ae8cf 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 fbc83741478badd891c1ed2e663bf5e121a17ee4..8a8fcffcd3aa0468714f444ba37b7a0c8bbb0fac 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 3fc698f70120012c02309dff704295c7b014cdc5..15b92c887f25bb9751ee69709087af2164441b07 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/gitee/spirit/core/api/ElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java new file mode 100644 index 0000000000000000000000000000000000000000..38693d143a39ce00f09a8b13dd822a0168730d7b --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementAction.java @@ -0,0 +1,10 @@ +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 new file mode 100644 index 0000000000000000000000000000000000000000..0a837a603b78b1b99c0613e78861c389df0ece26 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/ElementVisiter.java @@ -0,0 +1,11 @@ +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/api/TypeDerivator.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/TypeDerivator.java new file mode 100644 index 0000000000000000000000000000000000000000..f3d8028c4ece134b5dc211c15c536bedab3e4788 --- /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/api/VariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/api/VariableTracker.java new file mode 100644 index 0000000000000000000000000000000000000000..912f9956f3cc82e1a3b2a9d0fc68aa757bd2e2fe --- /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/sum/spirit/core/compile/AppClassLoader.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppClassLoader.java similarity index 78% 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 02415f996ddaeb3d552bef5475a7239ecb96d882..c44d4e0e4ae8ddecdc57e24d4dbfb98f81a492fe 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) @@ -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/AppImportSelector.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java new file mode 100644 index 0000000000000000000000000000000000000000..5a4861d3f7c0c33ee38f78172fb91b07d27a9a79 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/AppImportSelector.java @@ -0,0 +1,27 @@ +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 + public AppClassLoader loader; + + @Override + public boolean canHandle(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-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 74% 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 1cbe9348d9fd54bdb5964dbd130797f543cb967e..abfd7d3112f0f9521b1a8ab36b1146620cc798ab 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,162 +1,162 @@ -package com.sum.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.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.StaticTypes; -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 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 StaticTypes.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 StaticTypes.BOOLEAN; - } else if (token.isChar()) { - return StaticTypes.CHAR; - } else if (token.isInt()) { - return StaticTypes.INT; - } else if (token.isLong()) { - return StaticTypes.LONG; - } else if (token.isDouble()) { - return StaticTypes.DOUBLE; - } else if (token.isNull()) { - return StaticTypes.NULL; - } else if (token.isString()) { - return StaticTypes.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(StaticTypes.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(StaticTypes.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); - } - - public IType getGenericType(IClass clazz, List statements) { - // 如果没有元素,则返回Object类型 - if (statements.size() == 0) { - return StaticTypes.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 = StaticTypes.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.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.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; +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 TypeRegistry.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 TypeRegistry.BOOLEAN; + } else if (token.isChar()) { + return TypeRegistry.CHAR; + } else if (token.isInt()) { + return TypeRegistry.INT; + } else if (token.isLong()) { + return TypeRegistry.LONG; + } else if (token.isDouble()) { + return TypeRegistry.DOUBLE; + } else if (token.isNull()) { + return TypeRegistry.NULL; + } else if (token.isString()) { + return TypeRegistry.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(TypeRegistry.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(TypeRegistry.MAP.getClassName(), getGenericType(clazz, keyStatements), getGenericType(clazz, valueStatements)); + } + + public IType getGenericType(IClass clazz, List statements) { + // 如果没有元素,则返回Object类型 + if (statements.size() == 0) { + return TypeRegistry.OBJECT; + } + IType genericType = null; + for (Statement statement : statements) { + IType boxType = deducer.derive(clazz, statement).toBox(); + if (genericType == null) { + genericType = boxType; + continue; + } + if (derivator.isMoreAbstract(boxType, genericType)) {// 更抽象则替换 + genericType = boxType; + + } else if (!derivator.isMoreAbstract(genericType, boxType)) {// 不同则使用Object + genericType = TypeRegistry.OBJECT; + break; + } + } + Assert.notNull(genericType, "Generic type cannot be null!"); + return genericType; + } + +} 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 d4ef1a99a7a09adee641004b7ffdb0667e2764cd..6261b9c4a358a7df5e473284f2e9785469ec84bd 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 5a8fb927fa04afe416addf0221e32c13d422e532..595c0459d5a7f7924f2fde702b11fd0f2e4d583f 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 71% 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 a20f9eae44bac66f615e6fb086629b4483c0de6b..0ce28f12ed742c92f3b33b06c9aad331da17f61f 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,181 +1,181 @@ -package com.sum.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.StaticTypes; -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 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 : StaticTypes.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; - // 进行类型校验 - 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 = StaticTypes.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.TypeDerivator; +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.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; +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.build(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 : 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 : TypeRegistry.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 = TypeRegistry.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/sum/spirit/core/compile/DefaultElementVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/DefaultElementVisiter.java similarity index 38% 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 0b84988bc340d50a4ec1ee599474efc334c4e27d..959a73a3956a56579657e20a17bedd42ff85e420 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,84 +1,66 @@ -package com.sum.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.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; - -@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.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; +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/AbstractAppElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractAppElementAction.java new file mode 100644 index 0000000000000000000000000000000000000000..75b9d58d2f1fe249a7ccda3cd7d7024a5768e38a --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractAppElementAction.java @@ -0,0 +1,4 @@ +package com.gitee.spirit.core.compile.action; + +public abstract class AbstractAppElementAction extends AbstractElementAction { +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..7805b680e98f6ceeab3d5cd9ec3110a4e57ad87e --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/AbstractElementAction.java @@ -0,0 +1,27 @@ +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/sum/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 45% 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/ExpressDeclareAction.java index 0e6cf76f61cf2d0cd6ffce1d17d4ef06e92619f5..96ebb0c245814367f834a6e7164321be2a9ce6d0 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/ExpressDeclareAction.java @@ -1,97 +1,90 @@ -package com.sum.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; - -@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.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.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 +@Order(-80) +public class ExpressDeclareAction extends AbstractAppElementAction { + + @Autowired + public VariableTracker tracker; + @Autowired + public VariableTrackAction variableAction; + @Autowired + public InvokeVisitAction invokeAction; + @Autowired + public FragmentDeducer deducer; + @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(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() ? type.toTarget() : 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.build(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/sum/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 67% 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/action/InvokeVisitAction.java index 246d3632914653d2886114f0840955e6039479bf..57c59d8cb6747547182162658bc880c0de78bcdc 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/action/InvokeVisitAction.java @@ -1,89 +1,94 @@ -package com.sum.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.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; - -@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.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; +import com.gitee.spirit.core.element.entity.Token; +import com.gitee.spirit.core.element.utils.StmtVisiter; + +@Component +@Order(-40) +public class InvokeVisitAction extends AbstractAppElementAction { + + @Autowired + public TypeFactory factory; + @Autowired + public FragmentDeducer deducer; + @Autowired + public ClassLinker linker; + + @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(clazz.getType().withThisModifiers(), 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 = type.toTarget();// 转换数组类型为目标类型 + 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/sum/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 41% 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/TypeDeclareAction.java index 5597729346e1b27cfbedad7ca0283281b5092117..17a6623c7b417e25e24718f6c323d995fc02ef86 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/TypeDeclareAction.java @@ -1,44 +1,40 @@ -package com.sum.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; - -@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 AbstractAppElementAction { + + @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 0000000000000000000000000000000000000000..dc4f126b58cc973ca3ad94b6d9252445cf7ab162 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/action/VariableTrackAction.java @@ -0,0 +1,41 @@ +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.api.VariableTracker; +import com.gitee.spirit.core.clazz.entity.IType; +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; + + @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() || (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); + } + }); + }); + } + +} 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/derivator/AppTypeDerivator.java similarity index 46% 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/derivator/AppTypeDerivator.java index 0f47931cfc4ea8064ddf1394c25148ff0d5be1bf..7f0a8eae362dc11c6040a435d1cb87f27695d970 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/derivator/AppTypeDerivator.java @@ -1,87 +1,67 @@ -package com.sum.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.StaticTypes; -import com.sum.spirit.core.clazz.utils.TypeBuilder; -import com.sum.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 = StaticTypes.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.derivator; + +import org.springframework.beans.factory.annotation.Autowired; +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; + +import cn.hutool.core.lang.Assert; + +@Primary +@Component +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()) { + 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; + }); + } + + @Override + public Integer getAbstractScore(IType abstractType, IType targetType) { + if (abstractType == null || targetType == null) { + return null; + } + if (abstractType.isNull()) {// null类型不能比任何类型抽象 + return null; + } + if (targetType.isNull()) {// 任何类型都能比null抽象 + return 0; + } + if (targetType.equals(abstractType)) {// 这个方法还要判断泛型 + return 0; + } + Integer score = getAbstractScore(abstractType, linker.getSuperType(targetType.toBox()));// 这个方法中,还要考虑到自动拆组包 + if (score != null) { + return score - 1; + } + for (IType interfaceType : linker.getInterfaceTypes(targetType)) {// 接口 + Integer score1 = getAbstractScore(abstractType, interfaceType); + if (score1 != null) { + return score1 - 1; + } + } + return 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/derivator/DefaultVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java new file mode 100644 index 0000000000000000000000000000000000000000..b8e81a7c04f86a3d57fb7dd00ad868cd693d8be9 --- /dev/null +++ b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/DefaultVariableTracker.java @@ -0,0 +1,64 @@ +package com.gitee.spirit.core.compile.derivator; + +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.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; + +@Component +public class DefaultVariableTracker implements VariableTracker { + + @Autowired + public ClassLinker linker; + + @Override + public IType findVariableType(VisitContext context, String variableName) { + IType type = findTypeByKeyword(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) { + if (KeywordEnum.isSuper(variableName)) { + return context.clazz.getSuperType().withSuperModifiers(); + } else if (KeywordEnum.isThis(variableName)) { + return context.clazz.getType().withThisModifiers(); + } + 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(); + } + } + IMethod method = (IMethod) context.member; + for (IParameter parameter : method.parameters) { + if (parameter.getName().equals(variableName)) { + return parameter.getType(); + } + } + return null; + } + + public IType findTypeByInherit(VisitContext context, String variableName) { + try { + 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/sum/spirit/core/compile/deduce/FragmentDeducer.java b/spirit-core/spirit-core-compile/src/main/java/com/gitee/spirit/core/compile/derivator/FragmentDeducer.java similarity index 64% 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/derivator/FragmentDeducer.java index aa7a3840c0f7b6037e9ff51ed68721164c499dc7..31be8e53ed321f71ec622f2d625849fc88b33ba9 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/derivator/FragmentDeducer.java @@ -1,60 +1,59 @@ -package com.sum.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.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; -import com.sum.spirit.core.clazz.utils.StaticTypes; -import com.sum.spirit.core.element.entity.Node; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.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 UnhandledException(); - } - - 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 StaticTypes.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.derivator; + +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.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; + +@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 TypeRegistry.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/sum/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 46% 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/VisitContext.java index 2ff374dc5511599a7f5222addb2a39fb3a6e608f..026183c6915da630172e843972a639477432cc36 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/VisitContext.java @@ -1,45 +1,58 @@ -package com.sum.spirit.core.compile.entity; - -import java.util.ArrayList; -import java.util.List; - -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 { - - 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-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 79% 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 4663d6a16f10e843903238ecad1437b447e89884..29e85c32f67d364aec4d4b17877c63d649eac542 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,161 +1,158 @@ -package com.sum.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.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.StaticTypes; -import com.sum.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 StaticTypes.OBJECT; - } - - if (StaticTypes.OBJECT.equals(type)) { - return null; - } - - IType superType = getLinker(type).getSuperType(type);// 如果不存在父类,则返回Object - if (superType == null) { - return StaticTypes.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(StaticTypes.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 StaticTypes.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 (StaticTypes.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 - return StaticTypes.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.TypeRegistry; + +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 Map linkers; + + public ClassLinker getLinker(IType type) { + if (!type.isNative()) { + return linkers.get("appClassLinker"); + } else { + return linkers.get("extClassLinker"); + } + } + + @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 TypeRegistry.OBJECT; + } + + if (TypeRegistry.OBJECT.equals(type)) { + return null; + } + + IType superType = getLinker(type).getSuperType(type);// 如果不存在父类,则返回Object + if (superType == null) { + return TypeRegistry.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(TypeRegistry.CLASS.getClassName(), type.toBox()); + } + + if (type.isPrimitive()) {// 原始类型没有属性和方法 + throw new RuntimeException("The primitive type has no field!"); + } + + if (type.isArray() && ARRAY_LENGTH.equals(fieldName)) {// 访问数组length直接返回int类型 + return TypeRegistry.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 (TypeRegistry.OBJECT.equals(type) && KeywordEnum.EMPTY.value.equals(methodName)) {// 如果已经推导到Object,并且方法名是empty的话,则直接返回布尔类型 + return TypeRegistry.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/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 77% 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 426c237315ec781ee1b8eae42b9d2b651728dfd9..b60a6f42cecf5939c914ba64b2da1a2f5ad018c2 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.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 cn.hutool.core.lang.Assert; @@ -30,13 +30,13 @@ public class AppClassLinker implements ClassLinker { @Autowired public TypeDerivator derivator; @Autowired - public MethodMatcher matcher; + public AppMethodMatcher matcher; @Override @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-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/AppMethodMatcher.java similarity index 71% 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/AppMethodMatcher.java index 740b377bdc82abd4399c21e86f4bbbf3a2df5cf6..2acc259f9b7534d11b907f4a77f9b80213c1d595 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/AppMethodMatcher.java @@ -1,38 +1,38 @@ -package com.sum.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; - -@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.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; + +@Component +public class AppMethodMatcher { + + @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-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementAction.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementAction.java deleted file mode 100644 index db7faeadbbf2b66985c75fc01052c607c574831d..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementAction.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sum.spirit.core.api; - -import com.sum.spirit.core.compile.entity.ElementEvent; - -public interface ElementAction { - - boolean isTrigger(ElementEvent event); - - void handle(ElementEvent event); - -} 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/sum/spirit/core/api/ElementVisiter.java deleted file mode 100644 index 6f762d0cea6668533e70ef801e2fa2a96c870d9f..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/api/ElementVisiter.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sum.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; - -public interface ElementVisiter { - - IVariable visitElement(IClass clazz, Element element); - - IVariable visitElement(IClass clazz, MethodContext context, Element element); - -} 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/sum/spirit/core/compile/action/AbstractElementAction.java deleted file mode 100644 index c33d575c6e06935df39e6fab39f36e2a430f3aca..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractElementAction.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sum.spirit.core.compile.action; - -import com.sum.spirit.core.api.ElementAction; -import com.sum.spirit.core.compile.entity.ElementEvent; - -public abstract class AbstractElementAction implements ElementAction { - - @Override - public boolean isTrigger(ElementEvent event) { - return event.element != null; - } - -} 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/sum/spirit/core/compile/action/AbstractScopeElementAction.java deleted file mode 100644 index e8ea3688fa3665324b2e6aac5d898ea798004e75..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/AbstractScopeElementAction.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sum.spirit.core.compile.action; - -import com.sum.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/sum/spirit/core/compile/action/ElementInvokeVisiter.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementInvokeVisiter.java deleted file mode 100644 index f13b910b2200b791979aea70bb72565156b4fac1..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementInvokeVisiter.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sum.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; - -@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/sum/spirit/core/compile/action/ElementVariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementVariableTracker.java deleted file mode 100644 index e1abadbc49e5a2341bd9a8c644e546dbb5fd5d26..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/action/ElementVariableTracker.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sum.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; - -@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/sum/spirit/core/compile/deduce/VariableTracker.java b/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/VariableTracker.java deleted file mode 100644 index 8b6b9a643991b4959a61272cc95b69a2861b1480..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/deduce/VariableTracker.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.sum.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 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; - } - -} 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/sum/spirit/core/compile/entity/ElementEvent.java deleted file mode 100644 index 079c2f6d450bc517e42a4170f3427dcd2f0cd811..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-compile/src/main/java/com/sum/spirit/core/compile/entity/ElementEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.sum.spirit.core.compile.entity; - -import com.sum.spirit.core.clazz.entity.IClass; -import com.sum.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-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 1133b2123b326dcf72cd3be733a54c0156d35653..9bb9d23c99b0ea3c4e129ec6f5d77b1e3f716dbe 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/gitee/spirit/core/api/ElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..e70eb07927d9aa2a577495467eb1415801dc70ea --- /dev/null +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/api/ElementBuilder.java @@ -0,0 +1,15 @@ +package com.gitee.spirit.core.api; + +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 { + + Element build(String text); + + Element build(Line line); + + Element build(Statement statement); + +} 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 38% 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 6b0b4593c561540c35b94947518e2cf715bd7611..8f64ce68e4bf440595088ea5199453d246fc1852 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,16 +1,24 @@ -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 { 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/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 0897d4c669e85be468d1f40b2814b9741b2efbfd..de8e4edf011fe82a8f5bff757dc08d03b8687c06 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 9641a3ccb239f24766630161dfba784f8f8da69d..581c18ac9b7d73720603a5d1e3330e0cd30d6bba 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 80% 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 731d993b4b8f5b7c62b2db166581ffdbc8f6d4d8..664ad9ecdefdd48778dd9f3604c79e351538c10a 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; -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; @@ -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-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 38% 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 d7db82c10a9c550b19a86948ab1f81624067ad40..787b5a6c1520a4071806af31f95d40cbcbb6cd8e 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,22 +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.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; +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; @@ -28,7 +27,7 @@ public class DefaultElementBuilder implements ElementBuilder { @Autowired public Lexer lexer; @Autowired - public SemanticParser parser; + public SemanticParser semanticParser; @Autowired public SyntaxParser syntaxParser; @@ -40,13 +39,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 = semanticParser.getTokens(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) { @@ -56,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; } diff --git a/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractSemanticParser.java new file mode 100644 index 0000000000000000000000000000000000000000..0828e53f4fd66c53bd8610ded5e611c0d3d81fb6 --- /dev/null +++ b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/AbstractSemanticParser.java @@ -0,0 +1,42 @@ +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 { + + public boolean isAccessPath(String word) { + return !LiteralPattern.isDouble(word) && AccessPattern.isAccessPath(word); + } + + public boolean isAnnotation(String word) { + return CommonPattern.isAnnotation(word); + } + + public boolean isKeyword(String word) { + return KeywordEnum.isKeyword(word); + } + + public boolean isOperator(String word) { + return SymbolEnum.isOperator(word); + } + + public boolean isSeparator(String word) { + return SymbolEnum.isSeparator(word); + } + + @Override + public boolean isType(String word) { + return TypePattern.isAnyType(word); + } + + public boolean isVariable(String word) { + return LiteralPattern.isConstVariable(word) || CommonPattern.isVariable(word); + } + +} 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 73% 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 83f2434e25a9e9adf1376063356c39b7422f7c67..7de8c45aa978c467fb47d00aa3015bd79aa2d4b2 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 { @@ -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); } @@ -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/DefaultSemanticParser.java b/spirit-core/spirit-core-element/src/main/java/com/gitee/spirit/core/element/action/DefaultSemanticParser.java similarity index 40% 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 bd3e88198192ade8cc47dbe66d4ee8ac171a956c..df9d47f2c60887d4014ef2dc1df2ec65f3d1e652 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,158 +1,155 @@ -package com.sum.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.TokenTypeEnum; -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 cn.hutool.core.lang.Assert; - -@Component -public class DefaultSemanticParser extends AbstractSemanticParser { - - @Autowired - public Lexer lexer; - - @Override - public Token getToken(SemanticContext context, String word) { - Token token = new Token(); - - token.tokenType = getTokenType(word, context.insideType); - 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) { - if (isPath(word)) { - return TokenTypeEnum.PATH; - - } else if (isAnnotation(word)) { - return TokenTypeEnum.ANNOTATION; - - } else if (isKeyword(word)) { - return TokenTypeEnum.KEYWORD; - - } else if (isOperator(word) && !insideType) {// 类型声明中,一般不包含操作符 - return TokenTypeEnum.OPERATOR; - - } else if (isSeparator(word)) { - return TokenTypeEnum.SEPARATOR; - - } else if (isType(word) || (insideType && "?".equals(word))) { - return TokenTypeEnum.TYPE; - } - - TokenTypeEnum tokenType = getInitTokenType(word); - if (tokenType != null) { - return tokenType; - } - - tokenType = getLiteralTokenType(word); - if (tokenType != null) { - return tokenType; - } - - tokenType = getSubexpressTokenType(word); - if (tokenType != null) { - return tokenType; - } - - if (isVariable(word)) { - return TokenTypeEnum.VARIABLE; - } - - tokenType = getAccessTokenType(word); - if (tokenType != null) { - return tokenType; - } - - return null; - } - - public Object getTokenValue(Token token, String word) { - if (token.isType()) { - return getStatement(word, true); - - } else if (token.isArrayInit() || token.isList() || token.isMap() || token.isSubexpress() || token.isInvoke()) { - return getStatement(word, false);// 拆分数组是为了更好的添加new这个关键字 - } - return word; - } - - public Object getStatement(String word, boolean insideType) { - 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 (PREFIX_PATTERN.matcher(first).matches()) { - 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); - } - - 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, getAnnotationName(word)); - - } else if (token.isArrayInit()) { - token.setAttr(Attribute.SIMPLE_NAME, getPrefix(word) + "[]"); - - } else if (token.isTypeInit()) { - token.setAttr(Attribute.SIMPLE_NAME, getPrefix(word)); - - } else if (token.isCast()) { - token.setAttr(Attribute.SIMPLE_NAME, getCastType(word)); - - } else if (token.isAccess()) { - token.setAttr(Attribute.MEMBER_NAME, 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); - } - -} +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/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 65% 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 9ae50a30d6df01686d42e83629d88e76120ff302..97370d1cda52dc4f4906b02dc4544d6d214aa328 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,21 +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.SymbolEnum; -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; @@ -29,20 +28,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); } @@ -70,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; } } @@ -98,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; } } @@ -146,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" 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 87% 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 b6423225edb02b7ae52d27cdf8ce9b120851fd3a..41afc7378138da8622cfdf8a47e3f99f99148926 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 { @@ -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/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 270202e58c82470db840f65c1baccc70a4f4529c..09383092a2777d6f9af2e09c55509eb54f3b97e4 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 d442bbff5ed41e899da964f89ca6832371e81212..7f74795a0542027289cd5c34b2cc13e607ef4092 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 78% 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 7f8856ec8c072f81b7bb4f7ddf866f616828bbb9..bd4a80e07289af39e9d1e59984c84eb5a0dd2c30 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,65 +1,70 @@ -package com.sum.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; - -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-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 55e59ec5ff68e78670292c8c358e1d8b1d9bdcf7..5e62e1833ad768c95a5c95441bd699ba34423c38 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 be2fd3e9ba74959e5efb2bfcce97f1f53458c56d..6b17d57dc374853eef910239d3ba3b099f200db0 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 84% 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 85bd2a446dd20cad5d71bde29f68cbda7e7c07a5..177b5fd1c664f12c29bff738e606920cf199dba5 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 { @@ -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; } 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 31% 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 44076cf3b6d53d1e51a67d3c09e74e6392874595..11fd30d4261d51e690ede6c242b444d8c4143c48 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,12 +1,24 @@ -package com.sum.spirit.core.element.entity; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class SemanticContext { - public boolean 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; + } + +} 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 3c80a931ae14038dc0a8846e83eb64f672755efb..72f5e5094a7af996904d7d62c164183b9b7ab7f4 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 13ff6fa152717a61e025945eb89ff5412e3d02d7..ce93b00e4049b67c2354cbfda37eafeca06a156f 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 c6a78eac0dd97aa307c47cb5b6279d10b5ff48bc..114f1f54a579bd129cb0e8bb04d2f2164cf57780 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 b5df7203f08aa7e04555fd77e3cb17d04ea28792..c0a10b4482c7fbb881428a242bfa1558bc8faae6 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 121cd8a62bd521c25a6b572dbb9439ed2b76f692..cd5e17cefb5e5fa53e407fe2981438ea7f2ef9de 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 28dba2ac7be195122703dcc48fe42266cf42bcbc..a1697af68516a8e3d63ba066b4b888b2be9f77a6 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 93% 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 f0d3fef21681e3e29d3cb13ff8c7f604f21427ed..283b48e845618e25ec83cc836762c6bc34bddf38 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 { @@ -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() { @@ -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/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 891de7db2a64c9a2790a1105e8bfd068069220a3..5ea06bc093c56e24322c5324368f4712b29f4a4d 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 12dd10902c39fdea3f65f79e6332b6f16572f51b..847d1b5add1b24f53081a2db4dd6ad78a8afe064 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 d941dc93429c5fbbcb1907f60d2fdfcd2dbca967..9f4b7b32b8d65fd0927e0265094e0c4c7be0cf1a 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 268757c6609c5a1fcc53e4c543d3292398b06d25..b6996329c2fa8309952e91adebd33e6961710614 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 2d5f1f484d288c9cabae9ed067f0096fff00774c..581a846e5061f2cb2bfe0ba19e8069a6cd6af43c 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 61% 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 7ea7edbc6649adb97c6b05dd8c9d131ecdfd135e..aa0808a5e2fc22bbe5409f0b2bc83bc185f8310b 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,13 +1,13 @@ -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 { public static void visit(Statement statement, Consumer consumer) { for (Token token : statement) { - if (token.canSplit()) { + if (token.hasSubStmt()) { visit(token.getValue(), consumer); } } 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 07323f1cc55291207582b3e2fd5fbee80de41a89..b405e493c5d6ac0285c0ee48d2d7b43f58688459 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/main/java/com/sum/spirit/core/api/ElementBuilder.java b/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/ElementBuilder.java deleted file mode 100644 index 0c241acfbbaa34a618fe509d2674e250ed68bd18..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/api/ElementBuilder.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sum.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; - -public interface ElementBuilder { - - Element build(String text); - - Element build(Line line); - - Element rebuild(Statement 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 deleted file mode 100644 index 255f3e78f256d4b86a6a3222998ac327920dc119..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-element/src/main/java/com/sum/spirit/core/element/action/AbstractSemanticParser.java +++ /dev/null @@ -1,134 +0,0 @@ -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; -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.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 { - - 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(); - } - - public boolean isAnnotation(String word) { - return ANNOTATION_PATTERN.matcher(word).matches(); - } - - public boolean isKeyword(String word) { - return KeywordEnum.isKeyword(word); - } - - public boolean isOperator(String word) { - return SymbolEnum.getOperator(word) != null; - } - - public boolean isSeparator(String word) { - return SymbolEnum.getSeparator(word) != null; - } - - @Override - public boolean isType(String word) { - return TypePattern.isAnyType(word); - } - - public boolean isVariable(String word) { - return LiteralPattern.isConstVariable(word) || VAR_PATTERN.matcher(word).matches(); - } - - 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 (SUBEXPRESS_PATTERN.matcher(word).matches()) { - 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/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 21e965045688fc971135bcf8d2ab213b992e785c..ed9aa1447551531a18861abaa438904c7aadf6ac 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 93% 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 8514071acaa50f493fcbecbac0a910dafe891f12..42a94fc043630d93e3e67990fe6055e17b0f863d 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,9 +22,9 @@ 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.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/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 9226a1bfc3ed9046279397430b5791151c048339..32a757661a347d3c260e500faebb832698935e5f 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.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/gitee/spirit/core/api/CharAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharAction.java new file mode 100644 index 0000000000000000000000000000000000000000..4bf2339949d50730d914f9d0427d915517f06ace --- /dev/null +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharAction.java @@ -0,0 +1,12 @@ +package com.gitee.spirit.core.api; + +import com.gitee.spirit.core.lexer.entity.CharEvent; +import com.gitee.spirit.core.lexer.entity.CommonResult; + +public interface CharAction { + + boolean isTrigger(CharEvent event); + + CommonResult handle(CharEvent event); + +} diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharsHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..61d5e3f27f50e7714764cdc762a48f888731b1ef --- /dev/null +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/CharsHandler.java @@ -0,0 +1,10 @@ +package com.gitee.spirit.core.api; + +import com.gitee.spirit.core.lexer.entity.CharsContext; +import com.gitee.spirit.core.lexer.entity.CommonResult; + +public interface CharsHandler { + + CommonResult handle(CharsContext context, StringBuilder builder); + +} 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 edb2e6189ed13f8666ff524e670d306d2da87c79..f2a5213e34b373d7abbfa3b8298e75ed6675ef2c 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/gitee/spirit/core/api/LexerAction.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/LexerAction.java new file mode 100644 index 0000000000000000000000000000000000000000..9842154cc52c0cd1715822f5ca8c82334aacc04a --- /dev/null +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/api/LexerAction.java @@ -0,0 +1,4 @@ +package com.gitee.spirit.core.api; + +public interface LexerAction extends CharAction { +} diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCharsHandler.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCharsHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..7b80d6a4ae82a343c9486e5ec0364f20c26034a9 --- /dev/null +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractCharsHandler.java @@ -0,0 +1,34 @@ +package com.gitee.spirit.core.lexer; + +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 { + + @Override + public CommonResult handle(CharsContext context, StringBuilder builder) { + for (context.index = 0; context.index < builder.length(); context.index++) { + CharEvent event = new CharEvent(context, builder.charAt(context.index)); + if (this.isTrigger(event)) { + CommonResult result = this.handle(event); + if (result != null) { + if (result.state == CommonState.RESET) { + context.index = 0; + } else if (result.state == CommonState.BREAK) { + break; + } + } + } + } + return buildResult(context, builder); + } + + public CommonResult buildResult(CharsContext context, StringBuilder builder) { + return new CommonResult(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/gitee/spirit/core/lexer/AbstractCursorLexer.java similarity index 58% 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 b7bb00f44c63273eaa4a696528d77571d4d57175..84deb6f455b9be1f14faa80822dbe2d385634264 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,22 +1,24 @@ -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.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 { @Override - public void handle(CharEvent event) { + public CommonResult handle(CharEvent event) { LexerContext context = (LexerContext) event.context; char ch = event.ch; 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 result; } public boolean isContinuous(char ch) { diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractLexer.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractLexer.java new file mode 100644 index 0000000000000000000000000000000000000000..0c7f1f7f2582c827b4071ae970f39dbb702a9c38 --- /dev/null +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/AbstractLexer.java @@ -0,0 +1,108 @@ +package com.gitee.spirit.core.lexer; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +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 { + + @Autowired + public List actions; + + @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; + } + + @Override + public CommonResult handle(CharEvent event) { + LexerContext context = (LexerContext) event.context; + for (LexerAction action : actions) { + if (action.isTrigger(event)) { + CommonResult result = action.handle(event); + if (result != null) { + if (result.value != null) { + if (result.value instanceof Region) { + appendRegion(context, 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.RESET || result.state == CommonState.BREAK) { + return result; + } + } + } + } + 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.isOverlap(existRegion)) { + throw new RuntimeException("There are overlapping regions!"); + } + if (region.isAfter(existRegion)) { + regions.add(index + 1, region); + break; + } + } + } + } + + @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) && !AccessPattern.isAccessPath(text)) { + List subWords = Arrays.asList(text.replaceAll("\\.", " .").split(" ")); + words.addAll(subWords); + return; + } + } + words.add(text); + } + +} 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 79% 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 1d02911c8e569d93f0a2e50d8a45e9cdb90b90e5..705c55cb5b4c5dc958c2b9990d132db64fe8ce43 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.CharsResult; +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 { @@ -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; @@ -50,6 +50,7 @@ public class AliasCharsHandler extends AbstractCharsHandler { } } } + return null; } public static class AliasCharsContext extends CharsContext { 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 47% 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 3870b8716310c7f0a905977b66c229a2f179e773..856e79e7786fa616aa6adacc80e3074a776a7945 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,13 +1,12 @@ -package com.sum.spirit.core.lexer; +package com.gitee.spirit.core.lexer; -import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; -import com.sum.spirit.core.lexer.action.BorderAction; -import com.sum.spirit.core.lexer.entity.CharsResult; -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; @@ -15,32 +14,21 @@ 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; + CommonResult result = handle(context, builder); + 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) { - if (word.length() == 1) { - words.add(word); - } else { - words.addAll(getWords(word)); - } - } - return words; + 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/gitee/spirit/core/lexer/action/BorderAction.java similarity index 42% 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 05031f0ab4e13adb47b3f5daba4b7afbc2e2d5a0..fc428be5492c7387a940a2850cd58dbbce403863 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,44 +6,49 @@ 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.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; +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) public class BorderAction extends RegionAction { - public static final String PROFILE = "BORDER_ACTION"; + public static final String BORDER_PROFILE = "BORDER_PROFILE"; @Override public boolean isTrigger(CharEvent event) { LexerContext context = (LexerContext) event.context; - return PROFILE.equals(context.profile) && super.isTrigger(event); + return BORDER_PROFILE.equals(context.profile) && super.isTrigger(event); } @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; - 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)); } } - context.regions = RegionUtils.completeRegions(builder, newRegions, (startIndex, endIndex) -> new Region(startIndex, endIndex)); - context.index = builder.length(); - return new LexerResult(State.BREAK, null); + context.profile = null; + 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-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 77% 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 813cf9415ad947e34bc7a7cbd6464f74d6f6fc58..b7d15fd54d8ba8d804865b9d22fe0b223f62886c 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,20 +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.exception.UnhandledException; -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.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; +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) @@ -45,7 +44,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; @@ -91,14 +90,12 @@ 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) { - LexerContext context = (LexerContext) event.context; + public CommonResult pushStack(CharEvent event, List regions) { Region mergedRegion = RegionUtils.mergeRegions(regions); - context.index = mergedRegion.endIndex - 1; - return new LexerResult(State.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/gitee/spirit/core/lexer/action/SpaceAction.java similarity index 40% 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 4a68a104bcdff510c00ec462d44940411a8db576..4ec74c1448f26287c507988e21a584090426f846 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.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; +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) @@ -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(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/gitee/spirit/core/lexer/action/SymbolAction.java similarity index 53% 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 9818575a62e8ddb145c5d31fb0cbc2634e2e566d..943352f1a10446a04e2b8bfa56f09e60a16c856c 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,16 +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.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; -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; +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) @@ -22,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,18 +29,17 @@ 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 LexerResult(State.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 LexerResult(State.BREAK, region); + return new CommonResult(CommonState.SKIP, region); } - throw new UnhandledException(); + throw new RuntimeException("Unhandled branch!"); } } \ No newline at end of file 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 48a1ce142abe06d6d9870de34bbfcfe9eaa4e439..15697f4c1c887b1d4e79349841c01d9671ad9a78 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 74% 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 079956be8dc4e4b0f1897883b471c0b37091aebd..c5fce605dbd1f57a563debd943dd48d274b13ca2 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; @@ -9,5 +9,5 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class CharsContext { public StringBuilder builder; - public int index; + public int index = -1; } 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/gitee/spirit/core/lexer/entity/CommonResult.java similarity index 35% rename from spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/LexerResult.java rename to spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonResult.java index 76ad3d79aa671be8aaff58700a2bfca52d92f554..6e5f757200399ef601d8e9012d850c573583a115 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/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; @@ -7,13 +7,18 @@ import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor -public class LexerResult { +public class CommonResult { - public enum State { - CONTINUE, BREAK + public CommonState state; + public Object value; + + public CommonResult(Object value) { + this.value = value; } - public State state; - public Region region; + @SuppressWarnings("unchecked") + public T get() { + return (T) value; + } } diff --git a/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonState.java b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonState.java new file mode 100644 index 0000000000000000000000000000000000000000..60d2103d6127a4579328639a93e717d11a1d1e99 --- /dev/null +++ b/spirit-core/spirit-core-lexer/src/main/java/com/gitee/spirit/core/lexer/entity/CommonState.java @@ -0,0 +1,5 @@ +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 d81588eb12e728b4de8e3e380d6dac0bcca6df30..93fef8c0a029ef5409bb4283bbdac4ec4c2676b8 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; @@ -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/gitee/spirit/core/lexer/entity/Region.java similarity index 58% 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 8b95018fe8e7467bfff6a31f638b1892e92a6ba1..f553a5c94b0d46c4aca78f8ccd83d373888cfa70 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; @@ -20,4 +20,12 @@ public class Region { return startIndex <= index && index < endIndex; } + public boolean isAfter(Region region) { + return startIndex >= region.endIndex; + } + + public boolean isOverlap(Region region) { + return contains(region.startIndex) || contains(region.endIndex - 1); + } + } 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 75% 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 fecd72ba1fc55787d9905334f9f584945f206fe4..a66e023cfc51d467139eddc3fbd5f17afada12c8 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; @@ -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); } 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 deleted file mode 100644 index 83047a91eb1906145ed5e46eee8e1273100bb288..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharAction.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sum.spirit.core.api; - -import com.sum.spirit.core.lexer.entity.CharEvent; - -public interface CharAction { - - boolean isTrigger(CharEvent event); - - void 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 deleted file mode 100644 index 92ce39d9cdb29d977437dca9d44a17fef2d3b809..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/CharsHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sum.spirit.core.api; - -import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CharsResult; - -public interface CharsHandler { - - CharsResult 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 deleted file mode 100644 index 59c84cb6fdf2b6576fb67bd593ee428e6d896806..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/api/LexerAction.java +++ /dev/null @@ -1,12 +0,0 @@ -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); - -} 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 deleted file mode 100644 index 890b1aedbc4d8cc0dd29ed6d47b7fe3b859ff33d..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractCharsHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sum.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.CharsResult; - -public abstract class AbstractCharsHandler implements CharsHandler, CharAction { - - @Override - public CharsResult handle(CharsContext context, StringBuilder builder) { - for (; context.index < builder.length(); context.index++) { - char ch = builder.charAt(context.index); - CharEvent event = new CharEvent(context, ch); - if (this.isTrigger(event)) { - this.handle(event); - } - } - return buildResult(context, builder); - - } - - public CharsResult buildResult(CharsContext context, StringBuilder builder) { - return new CharsResult(builder); - } - -} 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 deleted file mode 100644 index 73200dac8055a2ef02a30c21d2300eb07e00fdc8..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/AbstractLexer.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.sum.spirit.core.lexer; - -import java.util.Arrays; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; - -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; -import com.sum.spirit.core.lexer.entity.CharsContext; -import com.sum.spirit.core.lexer.entity.CharsResult; -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 { - - @Autowired - public List actions; - - @Override - public CharsResult 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); - } - - 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; - } - - @Override - public void handle(CharEvent event) { - 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); - } - if (result.state == State.CONTINUE) { - continue; - } else if (result.state == State.BREAK) { - break; - } - } - } - } - -} 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 deleted file mode 100644 index 99405d86af8efcfe2347f957567187b81de14f29..0000000000000000000000000000000000000000 --- a/spirit-core/spirit-core-lexer/src/main/java/com/sum/spirit/core/lexer/entity/CharsResult.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sum.spirit.core.lexer.entity; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class CharsResult { - public Object payload; -} 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 462ffdf4f2edab5af8f30eb0972b7639bf9b83bf..c59a504cfcc5d6979de9ffca0469f896f56b8ff8 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 206b46d1de151622f8a4cf6969ae7c7e3cd416ea..0e5469a418af137f4c3986b62751046a1c55496a 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-core/target/spirit-core-2.1.30.pom b/spirit-core/target/spirit-core-2.1.30.pom deleted file mode 100644 index 8a75fef9ce14f48f7ec118faa806a0bcdb15eaa2..0000000000000000000000000000000000000000 --- 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 c05aab4c894d15af4389086874e2f928f2512e00..0000000000000000000000000000000000000000 --- 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/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 24f1744c55cd83d01f1887ca5e01b8cfae24cb3b..dbb67d612b3f336c056d3134edd2a25d037fbe15 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 c44c34e99d0517e5ab94ef34a1a81ba648f1657a..d0384afc3e8cd593cc9de410f30347f85fd5746e 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 d42a7fb43b497f8e3f7157c783e7746b3f402da1..f6ae44c2f63a597431c2784a9fbddb30afb41066 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 d02164857d89b7ac02f1049805b0ccf329a20119..2a352c7564bba70041a5809e975d5c06cc3ab065 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 1cfc5ddd2fe2f5667bbc302932a242b5ba97d589..87884fd42abc82f248274a3375869f401dac9fae 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 37fd186e35df35a8b34af8210a206647aae036f3..75ef2bfc1f25385bf1edb8ab17815e4c7d5f70cb 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 a5c9839f2f5dc27620b52b689c855aa554465855..ddc2e8a2da9f376fde11dfb8afd25375545f2899 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 7a0be296a409db346a8f32aacd7dcfc7c1e00b4a..af4ca1ced832f50fc49e0b1d0fe6245f1d667788 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 b1a671eb8f43ba6e35e89e2fa0a2547c83d917b2..a13eb22c418ec48c47dc7262e39879ff47ae7c0e 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 2984d71bd19d06c5f836b455a79f28b9027f8c0b..ecf2046f4882d3cf512921fdf99bd3754a8f5f59 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 3b8f6aa319f04ca44026ba20279c87ba4dcdfe05..5d14e6bc18ae153327c38bcf22792291134c6a64 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 a4bd919f172f23ad827bfe53aa42e84730949b9d..0e8685ffd2ad47b15be56c6c08706e52e170fd26 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 c0b8be9349ebc859f8f06fe16b9fb5d08f2b4b64..9c9b479740f1ae8bce5109710d44fefab1f15a45 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 b8d9607effc7bf025e5cdad4428dd7e1664b3fa8..36eab30bf227d3945b2c91a8197243ff5464b91f 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 05f4217052d03b242c72481ed364160a84010c5c..7425c4690573988d8dcc985eae5d123ee8eb84c4 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 1eaf9f6d55ffd65fea78b89f3baf2fe55f4a9a0e..957f23f23a0a4af182815615579b7725d0386ec6 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 377482361c58fe4b649562e2b0fab9368f5bc4e2..49a552ef76844008471bad08fc5008c065d8f692 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 a11d71b5631440ffd4ef6cc54c5b20c8e75f1ce5..91c00a3fa389711bcb66d290d24919705bba750d 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 608abef21b112d47cdb42d01faf0a36cf6fbc8ba..4f8c51f47409c1cdfa9a4d4d18d5c6eb9e36138a 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 515cb618e5fb68d5fc880f77a02fc620228f4a0b..bef79bd625cb58e6a62297c2af2ffb7d8e0f360e 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 e841ce90ecb065ca816501026ec52b7dd7a994ed..cfb508de25e5b3b37c5e1ef90ba1e5e3feaece25 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 5e7f37f80c9fae13903f5ea92f26d3f4a1728907..2ec8112ae51902cd2cee232e342e278a8359de46 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 adaa6caec1ce19566efa926a4bc8e5e0b770a03c..51a5b2710d91c9f7850e219425244516bebc9b34 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 813e7d85890a82730b9be4c89c6117fe60984167..c6e11fed3a90ee321ed3432d5da682c7ce7a356c 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-example/target/spirit-example-2.1.30.pom b/spirit-example/target/spirit-example-2.1.30.pom deleted file mode 100644 index 156d0a35edd833829a670a97aa0aaa4d7ed9c48d..0000000000000000000000000000000000000000 --- 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 89b83698825427955c892629c859fe9e1a14e5c8..0000000000000000000000000000000000000000 --- 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/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 new file mode 100644 index 0000000000000000000000000000000000000000..ceecadcf7eb98d8a83737d87235183d6e6d36149 --- /dev/null +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtClassLoader.java @@ -0,0 +1,91 @@ +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; +import org.springframework.beans.factory.InitializingBean; +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.output.java.utils.ReflectUtils; +import com.google.common.base.Splitter; + +@Component +@Order(-80) +@DependsOn("configUtils") +public class ExtClassLoader extends AbstractClassLoader> implements InitializingBean { + + public ClassLoader loader; + + @Override + public void afterPropertiesSet() throws Exception { + String classpathsStr = ConfigUtils.getClasspaths(); + if (StringUtils.isNotBlank(classpathsStr)) { + List classpaths = Splitter.on(",").trimResults().splitToList(classpathsStr); + loader = ReflectUtils.getClassLoader(classpaths); + } else { + loader = this.getClass().getClassLoader(); + } + } + + @Override + 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 + public List getNames() { + throw new RuntimeException("This method is not supported!"); + } + + @Override + public boolean contains(String name) { + try { + return loadClass(name) != null; + } catch (Exception e) { + return false; + } + } + + @Override + public Class loadClass(String name) { + try { + return loader.loadClass(name); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + @Override + public List> getAllClasses() { + throw new RuntimeException("This method is not supported!"); + } + + @Override + public URL getResource(String name) { + return loader.getResource(name); + } + + @Override + public Class defineClass(String name, URL resource) { + throw new RuntimeException("This method is not supported!"); + } + +} 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 0000000000000000000000000000000000000000..a02ec925cd494d117dc5c6e87b915677afaac03c --- /dev/null +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/ExtImportSelector.java @@ -0,0 +1,36 @@ +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; +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 + public ExtClassLoader loader; + + @Override + public boolean canHandle(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) { + if (super.shouldImport(selfClassName, className)) { + return !className.startsWith("java.lang."); + } + return false; + } + +} 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/ExtTypeDerivator.java similarity index 84% 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/ExtTypeDerivator.java index 2049c508663bc92a5811907839241b6bd92d297c..0e266bf28268d5cae6c6d6cf5ad3b6e6204c0f0c 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/ExtTypeDerivator.java @@ -1,85 +1,85 @@ -package com.sum.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.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; - -@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; + +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.derivator.AppTypeDerivator; + +@Component +public class ExtTypeDerivator extends AppTypeDerivator { + + @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; + }); + } +} 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/ExtTypeFactory.java similarity index 82% 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/ExtTypeFactory.java index 9cf8de684bdc65b0435575176f3575999e5ddeb0..7ee2b860707bd18f85fc641524fd860527414be9 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/ExtTypeFactory.java @@ -1,4 +1,4 @@ -package com.sum.spirit.output.java.deduce; +package com.gitee.spirit.output.java; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -10,12 +10,12 @@ 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.compile.AppTypeFactory; +import com.gitee.spirit.core.clazz.entity.IType; +import com.gitee.spirit.core.clazz.utils.TypeRegistry; +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()); @@ -36,7 +36,7 @@ public class NativeTypeFactory extends AppTypeFactory { return create((Class) nativeType); } else if (nativeType instanceof WildcardType) {// ? - return StaticTypes.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/sum/spirit/output/java/JavaBuilder.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/JavaBuilder.java similarity index 71% 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 e79c5f71e897802ec76562d707001e3a82664036..35dd41801db3557b48490c8335343c4829529f2e 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,28 +1,25 @@ -package com.sum.spirit.output.java; +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.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.enums.KeywordEnum; +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.VisitContext; +import com.gitee.spirit.core.element.entity.Element; +import com.gitee.spirit.output.java.action.AbstractExtElementAction; @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/AbstractExtElementAction.java b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractExtElementAction.java new file mode 100644 index 0000000000000000000000000000000000000000..8408b3e484fa675dfbf514e9547c553a3c6bc55d --- /dev/null +++ b/spirit-output/spirit-output-java/src/main/java/com/gitee/spirit/output/java/action/AbstractExtElementAction.java @@ -0,0 +1,6 @@ +package com.gitee.spirit.output.java.action; + +import com.gitee.spirit.core.compile.action.AbstractElementAction; + +public abstract class AbstractExtElementAction extends AbstractElementAction { +} 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 74% 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 562dd0d16707537b6a879aef057294ae1b7aee97..6c329e00f46fd0ffd3ca144572c520d21fdf8d1c 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,80 +1,79 @@ -package com.sum.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; - -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.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; +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 AbstractExtElementAction { + + 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/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 62% 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 5af34b302a3f4324d34a1055b989def84b1ab10a..941a030d4531693b760482c780c4c18d14529b8c 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,29 +1,26 @@ -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; - -@Native +import com.gitee.spirit.common.enums.TokenTypeEnum; +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.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; + @Component @Order(-80) -public class CommonAction extends AbstractElementAction { +public class CommonAction extends AbstractExtElementAction { @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/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 34% 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 891fe9d33a2d4e339ce41bc1e54a68024142172e..079468f18cfb41adb97a18f4b81ca03fd0724ddf 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,36 +1,32 @@ -package com.sum.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; - -@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 AbstractExtElementAction { + + @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/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 70% 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 d4295e0ad28bbeeb245b0adf75a2d9cf4e7691dd..decd382d642f78a5dc1c18efc8f4f997fe1e8228 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,31 +1,25 @@ -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.enums.TokenTypeEnum; +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.Statement; +import com.gitee.spirit.core.element.entity.Token; -@Native @Component @Order(-20) -public class SeparatorAction extends AbstractElementAction { +public class SeparatorAction extends AbstractExtElementAction { @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/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 68% 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 731f7f264a699d69943918d1a46cc63daded67ae..84658ef2864c4c78844c2cd878e30d5a9380a2d8 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,40 +8,36 @@ 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.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.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; +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 AbstractExtElementAction { @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/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 71% 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 e0b1f0c2e462cd8fe50fe302b85c026fb0cb0287..357363c20689596d7cb0b783cb8cd53e03b4b86a 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,17 +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.StaticTypes; -import com.sum.spirit.core.element.entity.Statement; -import com.sum.spirit.core.element.entity.Token; -import com.sum.spirit.output.java.utils.TypeUtils; - -@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.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; + @Component @Order(-60) public class StringEqualsAction extends AbstractTreeElementAction { @@ -47,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, StaticTypes.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()); 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/ExtClassLinker.java similarity index 83% 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/ExtClassLinker.java index 100e48686226fef7d6cdcd64b4711a4389fee947..8cd030b02807710e71d7e349d54bda1cf9309084 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/ExtClassLinker.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,33 +15,33 @@ 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.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") public T toClass(IType type) { - 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/sum/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 79% 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/ExtMethodMatcher.java index 57f4ea98ae619ff1a30ed5ed1a9ea559d6615645..d60f5784d077a3949591e0ec14e46270739544c6 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/ExtMethodMatcher.java @@ -1,59 +1,59 @@ -package com.sum.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.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; - -@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 = nativeParameterType.toTarget(); + } + nativeParameterType = derivator.populateParameter(type, parameterType, nativeParameterType);// 填充类型里的泛型参数 + Integer scope = derivator.getAbstractScore(nativeParameterType, parameterType); + if (scope != null) { + finalScore += scope; + } else { + finalScore = null; + break; + } + index++; + } + return finalScore; + } + +} 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 81bf03a5b669205e322a010e6e58cdd1ad8ffba3..834bb3fdee1883d72fd86486ccd6127519ab7aca 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 cb9a3433aaf460e674a2e6f094194b74ee256235..f744e36ec8429c62a27d25c33dbf80a0aeb49576 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 b9222949c680a7facaba3de831ae013e9c82f6e1..a7b49a4e334b9c97828f74377041ff51f8efe7f2 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-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 deleted file mode 100644 index 919b97a5c56e4fd1ecac6c3333902df38d1c2fda..0000000000000000000000000000000000000000 --- a/spirit-output/spirit-output-java/src/main/java/com/sum/spirit/output/java/ExtClassLoader.java +++ /dev/null @@ -1,121 +0,0 @@ -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; -import org.springframework.context.annotation.DependsOn; -import org.springframework.core.annotation.Order; -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 ClassLoader classLoader; - - @Override - public void afterPropertiesSet() throws Exception { - String classpathsArg = ConfigUtils.getClasspaths(); - if (StringUtils.isNotBlank(classpathsArg)) { - List classpaths = Splitter.on(",").trimResults().splitToList(classpathsArg); - classLoader = ReflectUtils.getClassLoader(classpaths); - } else { - classLoader = this.getClass().getClassLoader(); - } - } - - @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!"); - } - - @Override - public List getNames() { - throw new RuntimeException("This method is not supported!"); - } - - @Override - public boolean contains(String name) { - return name.startsWith("java.lang."); - } - - @Override - public Class findClass(String name) { - try { - return classLoader.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!"); - } - - @Override - public Class defineClass(String name, URL resource) { - 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/target/spirit-output-2.1.30.pom b/spirit-output/target/spirit-output-2.1.30.pom deleted file mode 100644 index af7cceaffcb3970ecfbc78d32da26258e8cc43cf..0000000000000000000000000000000000000000 --- 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 57f09d9819ef57c5d3c0131eb3e52b08660c119b..0000000000000000000000000000000000000000 --- 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/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 953a40c39e54dddd2534b2c2562746416b5368ad..19494c22f35c204a0fed93fc262d8a1a8b3e3979 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 211ea87d7fc531ff46a887175c5510c7274e72a3..105454970d806b065df9e4ca33b95c160dc40328 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 9196be5e0b07cb0e15e1cf3a2eb464648fa2430d..91eb70efd7b84c8b9e8359b4c4918af2eaff423c 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-starter/target/spirit-starter-2.1.30.pom b/spirit-starter/target/spirit-starter-2.1.30.pom deleted file mode 100644 index c7c747ded81dc1fdac7af160b5bb00f1c0b0cc70..0000000000000000000000000000000000000000 --- 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 a266250432a610ceb3cb6b7c4e2b836b40742d32..0000000000000000000000000000000000000000 --- 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-stdlib/src/main/java/com/gitee/spirit/stdlib/Emptys.java b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Emptys.java new file mode 100644 index 0000000000000000000000000000000000000000..0216ba437026754d824cda8ac4ad686eddbc14d1 --- /dev/null +++ b/spirit-stdlib/src/main/java/com/gitee/spirit/stdlib/Emptys.java @@ -0,0 +1,20 @@ +package com.gitee.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(); + } + +} 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 cb73d7a5ab7f2d1979089d21a213d8a752430a65..3b3b3670a9de8bb95fa28bde2a142179e0606202 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 ac0284c49d574897b7afc8355d433cea4cf9124c..0e2535e78805ea6062cc1b208a195fb86e1bca17 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-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java b/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java deleted file mode 100644 index 86c526fa5eaab4459ed0c73b9439fc46a9909fda..0000000000000000000000000000000000000000 --- a/spirit-stdlib/src/main/java/com/sum/spirit/stdlib/Emptys.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sum.spirit.stdlib; - -public class Emptys { - - public static boolean empty(String str) { - return str == null || str.length() == 0; - } - -} 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 b724d518a04d10ecfc6c7513c6b72b4cda269736..99b16a2197de77573aeb69373e107aba4e872a0f 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 3ec2371241e5d02bdb6d10d4104010d895f0b9b2..09e2c697c5b512a0f165e1e70815ddab75449cbb 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 76% 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 447a98c97b523f69c813f8dd19dcf58da5b31ed5..46f03c981f972ff98e6dea4f8c581dce8748b298 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 @@ -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(); } 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 57% 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 6beffc1b0a250eea833c67ca79b5d831cb3ddc70..e22c69091e54fdfa0d44d4df219a372740aaeddc 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,47 +1,46 @@ -package com.sum.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.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; - -@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; + } + +} 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 c772d50426e65c54e91e3c1b886304d0b731a8df..29df1d2460e61d16d5e35a81dca0b477436af144 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 54330a4b9d75b260d2b5aac387f706dbf37a17e2..53787a36fefd10ac3b01abd6354fd30bd30eb8e0 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 fc9d0f9bb3514b8b6208a5c9cd2e7be34f171e05..e336d8069e14708bad167328617f7bac854a1052 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; -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; @@ -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); 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 60% 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 069aa9fb9b24f759aa4031b664b70a9adb93b7a8..8103597a8e3b9b053e6572622d9895df3a63f7b7 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 { @@ -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(); @@ -53,11 +65,21 @@ 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\\tao.chen1\\.m2\\repository\\com\\sum\\spirit\\spirit-example-common\\2.1.30\\spirit-example-common-2.1.30.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 }); + JavaStarter.main(new String[] { // + "--input=" + inputPath, // + "--output=" + outputPath, // + "--classpaths=" + classpaths, // + "--langPackage=" + "java.lang", // + "--utilPackage=" + "java.util" // + }); } } 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 354d707bdd1c38a62ab76d129223976a52d3c960..0000000000000000000000000000000000000000 --- 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 a05ffbd4d465c7d5cfd39d174f4bab4948d5cf5e..0000000000000000000000000000000000000000 --- 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..370886d2196f366afa4e95a528d3339b4262f634 100644 Binary files a/spirit/lib/spirit-code-tools-2.1.30.jar and b/spirit/lib/spirit-code-tools-2.1.30.jar differ diff --git a/spirit/lib/spirit-common-2.1.30.jar b/spirit/lib/spirit-common-2.1.30.jar index d227df6489a53143bd19d0cef9754afc240eb8a3..ccc62a18030c1582b8d0d9f3df19a3e0d1f9b34f 100644 Binary files a/spirit/lib/spirit-common-2.1.30.jar and b/spirit/lib/spirit-common-2.1.30.jar differ diff --git a/spirit/lib/spirit-core-class-2.1.30.jar b/spirit/lib/spirit-core-class-2.1.30.jar index 8ef7c5b70290328d3706c41ac4f25d5c6594ce2f..959208985d93f71f00c434c0947602bb157d8548 100644 Binary files a/spirit/lib/spirit-core-class-2.1.30.jar and b/spirit/lib/spirit-core-class-2.1.30.jar differ diff --git a/spirit/lib/spirit-core-compile-2.1.30.jar b/spirit/lib/spirit-core-compile-2.1.30.jar index 0179841af3066feb6f160be264a1f34eee3248c2..71956bb8d988f4f13f6ba869b2278f3ac4007b4c 100644 Binary files a/spirit/lib/spirit-core-compile-2.1.30.jar and b/spirit/lib/spirit-core-compile-2.1.30.jar differ diff --git a/spirit/lib/spirit-core-element-2.1.30.jar b/spirit/lib/spirit-core-element-2.1.30.jar index e37a7ed92b09735873775a0ba7d670b2f25c1305..b232ce3591cfe44ca8da2458c0e4c6452b84f1af 100644 Binary files a/spirit/lib/spirit-core-element-2.1.30.jar and b/spirit/lib/spirit-core-element-2.1.30.jar differ diff --git a/spirit/lib/spirit-core-lexer-2.1.30.jar b/spirit/lib/spirit-core-lexer-2.1.30.jar index 376049334b9290dadaf28644fdfce31fff989360..a436ce24fb225add17fb605c8c0c61b2d5ac5609 100644 Binary files a/spirit/lib/spirit-core-lexer-2.1.30.jar and b/spirit/lib/spirit-core-lexer-2.1.30.jar differ diff --git a/spirit/lib/spirit-output-java-2.1.30.jar b/spirit/lib/spirit-output-java-2.1.30.jar index ed0dcf18deb9dc157f2dc7f290fcf32321d737aa..27fbaf16f2504919bff9db2aed7b843e20c64ec7 100644 Binary files a/spirit/lib/spirit-output-java-2.1.30.jar and b/spirit/lib/spirit-output-java-2.1.30.jar differ diff --git a/spirit/lib/spirit-starter-java-2.1.30.jar b/spirit/lib/spirit-starter-java-2.1.30.jar index cafa1707d3f9136551efa9dcd9ae0036181498f1..79efde16956ce537b558f3de6b4147505c25d6ea 100644 Binary files a/spirit/lib/spirit-starter-java-2.1.30.jar and b/spirit/lib/spirit-starter-java-2.1.30.jar differ diff --git a/spirit/lib/spirit-stdlib-2.1.30.jar b/spirit/lib/spirit-stdlib-2.1.30.jar index 4f75277f5929cdf2d7d2e7cd01a1742740329ad7..26886e24c740c9c17d8dba186e80d1212bac3d5c 100644 Binary files a/spirit/lib/spirit-stdlib-2.1.30.jar and b/spirit/lib/spirit-stdlib-2.1.30.jar differ diff --git a/target/spirit-parent-2.1.30.pom b/target/spirit-parent-2.1.30.pom deleted file mode 100644 index 9277799c661294fa72656d2a5db5f0e70f3072f5..0000000000000000000000000000000000000000 --- 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 09b4daa3bdaf902d13ace2e1fee92ae6c07b66eb..0000000000000000000000000000000000000000 --- 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-----