diff --git a/src/intellij_plugin/ohosgen/build.gradle.kts b/src/intellij_plugin/ohosgen/build.gradle.kts
index f24581308036f38312fc96f1309914b7e9e527ce..31f83a904be6dc1f7c6a26c56877f0ca377340ae 100644
--- a/src/intellij_plugin/ohosgen/build.gradle.kts
+++ b/src/intellij_plugin/ohosgen/build.gradle.kts
@@ -72,5 +72,6 @@ dependencies {
exclude(group = "junit", module = "junit")
}
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0") // 必须的运行时引擎
+ implementation("com.google.code.gson:gson:2.10.1")
}
diff --git a/src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java b/src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f0c208d5579df40618687d0617a0a398ede42fa
--- /dev/null
+++ b/src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2025 Shenzhen Kaihong Digital.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package antlr;
+
+/**
+ *
类名:该类用于xxx
+ * description parse base listener
+ *
+ * @author Administrator
+ * date 2025-02-28
+ * @version 1.0
+ * @since 2025-02-28
+ */
+public interface ParseBaseListener {
+
+ /**
+ * 打印 json str
+ *
+ * @return json 字符串
+ */
+ String dump2JsonStr();
+}
diff --git a/src/intellij_plugin/ohosgen/src/main/java/antlr/typescript/TypeScriptCustomListener.java b/src/intellij_plugin/ohosgen/src/main/java/antlr/typescript/TypeScriptCustomListener.java
index 75b6e2a1805090833ba25c5004dfb288b82a286d..c7a19b09213f00fa7b05efbaee702862df9b3d50 100644
--- a/src/intellij_plugin/ohosgen/src/main/java/antlr/typescript/TypeScriptCustomListener.java
+++ b/src/intellij_plugin/ohosgen/src/main/java/antlr/typescript/TypeScriptCustomListener.java
@@ -15,6 +15,9 @@
package antlr.typescript;
+import antlr.ParseBaseListener;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import grammar.*;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.ParserRuleContext;
@@ -33,7 +36,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
* @version 1.0
* @since 2025-02-28
*/
-public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
+public class TypeScriptCustomListener extends TypeScriptParserBaseListener implements ParseBaseListener {
private final int currentLanguage = Constants.PARSE_TS_LANGUAGE;
private String currentToken = "";
private GBaseObject currentObject;
@@ -45,6 +48,9 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
private List unionObjList;
private List interfaceObjList;
+ /**
+ * 构造函数
+ */
public TypeScriptCustomListener() {
enumObjList = new CopyOnWriteArrayList<>();
classObjList = new CopyOnWriteArrayList<>();
@@ -55,12 +61,243 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
interfaceObjList = new CopyOnWriteArrayList<>();
}
+ /**
+ * 获取语言
+ *
+ * @return 语言
+ */
+ public int getCurrentLanguage() {
+ return currentLanguage;
+ }
+
+ /**
+ * 设置当前关键字
+ *
+ * @param currentToken 关键字
+ */
+ public void setCurrentToken(String currentToken) {
+ this.currentToken = currentToken;
+ }
+
+ /**
+ * 获取关键字
+ *
+ * @return 关键字
+ */
+ public String getCurrentToken() {
+ return currentToken;
+ }
+
+ /**
+ * 获取当前解析对象
+ *
+ * @return 解析对象
+ */
+ public GBaseObject getCurrentObject() {
+ return currentObject;
+ }
+
+ /**
+ * 设置当前解析对象
+ *
+ * @param currentObject 当前解析对象
+ */
+ public void setCurrentObject(GBaseObject currentObject) {
+ this.currentObject = currentObject;
+ }
+
+ /**
+ * 获取类对象
+ *
+ * @return 对象
+ */
+ public List getClassObjList() {
+ return classObjList;
+ }
+
+ /**
+ * 设置类对象
+ *
+ * @param classObjList 类对象
+ */
+ public void setClassObjList(List classObjList) {
+ this.classObjList = classObjList;
+ }
+
+ /**
+ * 获取枚举对象
+ *
+ * @return 枚举对象
+ */
+ public List getEnumObjList() {
+ return enumObjList;
+ }
+
+ /**
+ * 枚举
+ *
+ * @param enumObjList 枚举
+ */
+ public void setEnumObjList(List enumObjList) {
+ this.enumObjList = enumObjList;
+ }
+
+ /**
+ * 获取方法
+ *
+ * @return 方法
+ */
+ public List getFuncObjList() {
+ return funcObjList;
+ }
+
+ /**
+ * 设置方法
+ *
+ * @param funcObjList 方法
+ */
+ public void setFuncObjList(List funcObjList) {
+ this.funcObjList = funcObjList;
+ }
+
+ /**
+ * 获取结构体
+ *
+ * @return 结构体
+ */
+ public List getStructObjList() {
+ return structObjList;
+ }
+
+ /**
+ * 设置结构体
+ *
+ * @param structObjList 结构体
+ */
+ public void setStructObjList(List structObjList) {
+ this.structObjList = structObjList;
+ }
+
+ /**
+ * 获取接口
+ *
+ * @return 接口
+ */
+ public List getInterfaceObjList() {
+ return interfaceObjList;
+ }
+
+ /**
+ * 设置接口
+ *
+ * @param interfaceObjList 接口
+ */
+ public void setInterfaceObjList(List interfaceObjList) {
+ this.interfaceObjList = interfaceObjList;
+ }
+
+ /**
+ * 获取type
+ *
+ * @return type
+ */
+ public List getTypeObjList() {
+ return typeObjList;
+ }
+
+ /**
+ * 设置 type
+ *
+ * @param typeObjList type
+ */
+ public void setTypeObjList(List typeObjList) {
+ this.typeObjList = typeObjList;
+ }
+
+ /**
+ * 获取联合
+ *
+ * @return 联合
+ */
+ public List getUnionObjList() {
+ return unionObjList;
+ }
+
+ /**
+ * 设置联合
+ *
+ * @param unionObjList 联合数组
+ */
+ public void setUnionObjList(List unionObjList) {
+ this.unionObjList = unionObjList;
+ }
+
+ @Override
+ public void enterFunctionType(TypeScriptParser.FunctionTypeContext ctx) {
+ super.enterFunctionType(ctx);
+ System.out.println("enterFunctionType: " + ctx.getText());
+ }
+
+ @Override
+ public void enterFunctionBody(TypeScriptParser.FunctionBodyContext ctx) {
+ super.enterFunctionBody(ctx);
+ System.out.println("enterFunctionBody: " + ctx.getText());
+ }
+
+ @Override
+ public void enterUnion(TypeScriptParser.UnionContext ctx) {
+ super.enterUnion(ctx);
+ System.out.println("enterUnion: " + ctx.getText());
+ }
+
+ @Override
+ public void enterTypeAnnotation(TypeScriptParser.TypeAnnotationContext ctx) {
+ super.enterTypeAnnotation(ctx);
+ System.out.println("enterTypeAnnotation: " + ctx.getText());
+ }
+
+ @Override
+ public void enterPropertyName(TypeScriptParser.PropertyNameContext ctx) {
+ super.enterPropertyName(ctx);
+ System.out.println("enterPropertyName: " + ctx.getText());
+ }
+
+ @Override
+ public void enterAnonymousFunction(TypeScriptParser.AnonymousFunctionContext ctx) {
+ super.enterAnonymousFunction(ctx);
+ System.out.println("enterAnonymousFunction: " + ctx.getText());
+ }
+
+ @Override
+ public void enterIdentifier(TypeScriptParser.IdentifierContext ctx) {
+ super.enterIdentifier(ctx);
+ System.out.println("enterIdentifier: " + ctx.getText());
+ }
+
+ @Override
+ public void enterIdentifierExpression(TypeScriptParser.IdentifierExpressionContext ctx) {
+ super.enterIdentifierExpression(ctx);
+ System.out.println("enterIdentifierExpression: " + ctx.getText());
+ }
+
+ @Override
+ public void enterIdentifierName(TypeScriptParser.IdentifierNameContext ctx) {
+ super.enterIdentifierName(ctx);
+ System.out.println("enterIdentifierName: " + ctx.getText());
+ }
+
+ @Override
+ public void enterVariableStatement(TypeScriptParser.VariableStatementContext ctx) {
+ super.enterVariableStatement(ctx);
+ System.out.println("enterVariableStatement: " + ctx.getText());
+ }
+
@Override
public void enterVariableDeclaration(TypeScriptParser.VariableDeclarationContext ctx) {
String varName = ctx.identifierOrKeyWord().getText();
System.out.println("变量名: " + varName);
System.out.println("var : " + ctx.getText());
- String typeAnno = ctx.typeAnnotation() != null ? ctx.typeAnnotation().getText() : "";
+ String typeAnno = ctx.typeAnnotation() != null ? ctx.typeAnnotation().stop.getText() : "";
System.out.println("type : " + typeAnno);
if (varName.equals(TsToken.TS_TOKEN_TYPE)) {
TypeObj to = new TypeObj();
@@ -85,6 +322,12 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
this.typeObjList.add(to);
System.out.println("type: " + to.toJsonString());
+ } else if (varName.equals(TsToken.TS_TOKEN_ABSTRACT)) {
+ int cnt = ctx.children.size();
+ for (int i = 0; i < cnt; i++) {
+ ParseTree item = ctx.children.get(i);
+ System.out.println("item: " + item.getText());
+ }
}
@@ -94,7 +337,7 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
@Override
public void enterExpressionStatement(TypeScriptParser.ExpressionStatementContext ctx) {
super.enterExpressionStatement(ctx);
-
+ System.out.println("enterExpressionStatement: " + ctx.getText());
}
@Override
@@ -111,7 +354,6 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
if (tokenStr.equals(TsToken.TS_TOKEN_ENUM)) {
EnumObj eo = new EnumObj();
eo.setName(ctx.getParent().getStart().getText());
- this.enumObjList.add(eo);
this.currentToken = TsToken.TS_TOKEN_ENUM;
this.currentObject = eo;
this.enumObjList.add(eo);
@@ -168,7 +410,7 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
String callSign = ctx.callSignature().getText();
System.out.println("Function callSign: " + callSign);
- String typeAnno = ctx.callSignature().typeAnnotation().getText();
+ String typeAnno = ctx.callSignature().typeAnnotation().stop.getText();
System.out.println("Function typeAnno: " + typeAnno);
FuncObj fo = new FuncObj();
fo.setName(funcName);
@@ -178,7 +420,7 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
for (TypeScriptParser.ParameterContext pc : plc) {
System.out.println("Function param: " + pc.getText());
TypeScriptParser. RequiredParameterContext rpc = pc.requiredParameter();
- String type = rpc.typeAnnotation().getText();
+ String type = rpc.typeAnnotation().stop.getText();
String name = rpc.identifierOrPattern().getText();
System.out.println("Function type: " + type + " name: " + name);
fo.addParam(name, type);
@@ -211,6 +453,49 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
System.out.println("Class heritage: " + heritage.getText());
}
+ @Override
+ public void enterCallSignature(TypeScriptParser.CallSignatureContext ctx) {
+ super.enterCallSignature(ctx);
+ System.out.println("enterCallSignature: " + ctx.getText());
+ }
+
+ @Override
+ public void enterClassElementName(TypeScriptParser.ClassElementNameContext ctx) {
+ super.enterClassElementName(ctx);
+ System.out.println("enterClassElementName: " + ctx.getText());
+ }
+
+ @Override
+ public void enterClassOrInterfaceTypeList(TypeScriptParser.ClassOrInterfaceTypeListContext ctx) {
+ super.enterClassOrInterfaceTypeList(ctx);
+ System.out.println("enterClassOrInterfaceTypeList: " + ctx.getText());
+ }
+
+ @Override
+ public void enterDeclaration(TypeScriptParser.DeclarationContext ctx) {
+ super.enterDeclaration(ctx);
+ System.out.println("enterDeclaration: " + ctx.getText());
+ }
+
+ @Override
+ public void enterClassExpression(TypeScriptParser.ClassExpressionContext ctx) {
+ super.enterClassExpression(ctx);
+ System.out.println("enterClassExpression: " + ctx.getText());
+
+ int childCnt = ctx.getChildCount();
+ if (childCnt > 2) {
+
+ ParseTree pt = ctx.getChild(1);
+ if (pt instanceof TypeScriptParser.IdentifierContext ic) {
+ ClassObj obj = new ClassObj();
+ obj.setName(ic.start.getText());
+ this.currentToken = TsToken.TS_TOKEN_CLASS;
+ this.currentObject = obj;
+ this.classObjList.add(obj);
+ }
+ }
+ }
+
@Override
public void enterClassElement(TypeScriptParser.ClassElementContext ctx) {
super.enterClassElement(ctx);
@@ -235,6 +520,8 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
String callSign = ctx.callSignature().getText();
System.out.println("Method callSign: " + callSign);
String typeAnno = ctx.callSignature().typeAnnotation().getText();
+ TypeScriptParser.TypeAnnotationContext tac = ctx.callSignature().typeAnnotation();
+ typeAnno = tac.stop.getText();
System.out.println("Method typeAnno: " + typeAnno);
TypeScriptParser.ParameterListContext plc = ctx.callSignature().parameterList();
@@ -267,13 +554,37 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
System.out.println("Method param cnt: " + cnt);
}
+ @Override
+ public void enterFunctionExpression(TypeScriptParser.FunctionExpressionContext ctx) {
+ super.enterFunctionExpression(ctx);
+ System.out.println("enterFunctionExpression: " + ctx.getText());
+ }
+
+ @Override
+ public void enterGeneratorsFunctionExpression(TypeScriptParser.GeneratorsFunctionExpressionContext ctx) {
+ super.enterGeneratorsFunctionExpression(ctx);
+ System.out.println("enterGeneratorsFunctionExpression: " + ctx.getText());
+ }
+
+ @Override
+ public void enterArrowFunctionDeclaration(TypeScriptParser.ArrowFunctionDeclarationContext ctx) {
+ super.enterArrowFunctionDeclaration(ctx);
+ System.out.println("enterArrowFunctionDeclaration: " + ctx.getText());
+ }
+
+ @Override
+ public void enterArgument(TypeScriptParser.ArgumentContext ctx) {
+ super.enterArgument(ctx);
+ System.out.println("enterArgument: " + ctx.getText());
+ }
+
@Override
public void enterPropertyDeclarationExpression(TypeScriptParser.PropertyDeclarationExpressionContext ctx) {
super.enterPropertyDeclarationExpression(ctx);
System.out.println("Property property: " + ctx.getText());
String propertyName = ctx.propertyName().getText();
- String typeName = ctx.typeAnnotation().getText();
+ String typeName = ctx.typeAnnotation().stop.getText();
System.out.println("Property name: " + propertyName + " type: " + typeName);
if ((this.currentObject != null) && (this.currentObject instanceof ClassObj)) {
ClassObj co = (ClassObj) this.currentObject;
@@ -360,6 +671,42 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
System.out.println("find namespace Declare: " + ctx.toString());
}
+ @Override
+ public void enterArguments(TypeScriptParser.ArgumentsContext ctx) {
+ super.enterArguments(ctx);
+ System.out.println("enterArguments: " + ctx.toString());
+ }
+
+ @Override
+ public void enterClassExtendsClause(TypeScriptParser.ClassExtendsClauseContext ctx) {
+ super.enterClassExtendsClause(ctx);
+ System.out.println("enterClassExtendsClause: " + ctx.getText());
+ }
+
+ @Override
+ public void enterClassHeritage(TypeScriptParser.ClassHeritageContext ctx) {
+ super.enterClassHeritage(ctx);
+ System.out.println("enterClassHeritage: " + ctx.getText());
+ }
+
+ @Override
+ public void enterEnumMember(TypeScriptParser.EnumMemberContext ctx) {
+ super.enterEnumMember(ctx);
+ System.out.println("enterEnumMember: " + ctx.getText());
+ }
+
+ @Override
+ public void enterMethodSignature(TypeScriptParser.MethodSignatureContext ctx) {
+ super.enterMethodSignature(ctx);
+ System.out.println("enterMethodSignature: " + ctx.getText());
+ }
+
+ @Override
+ public void enterAbstractMemberDeclaration(TypeScriptParser.AbstractMemberDeclarationContext ctx) {
+ super.enterAbstractMemberDeclaration(ctx);
+ System.out.println("find abstract member Declare: " + ctx.getText());
+ }
+
@Override
public void enterInterfaceDeclaration(TypeScriptParser.InterfaceDeclarationContext ctx) {
super.enterInterfaceDeclaration(ctx);
@@ -376,16 +723,16 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
for (TypeScriptParser.TypeMemberContext tmc : tmcList) {
String callSign = tmc.callSignature().getText();
System.out.println("interface callSign: " + callSign);
- String typeAnno = tmc.callSignature().typeAnnotation().getText();
+ String typeAnno = tmc.callSignature().typeAnnotation().stop.getText();
System.out.println("interface typeAnno: " + typeAnno);
FuncObj fo = new FuncObj();
fo.setName("");
- fo.setType(typeAnno);
+ fo.setRetValue(typeAnno);
List plc = tmc.callSignature().parameterList().parameter();
for (TypeScriptParser.ParameterContext pc : plc) {
System.out.println("interface param: " + pc.getText());
TypeScriptParser. RequiredParameterContext rpc = pc.requiredParameter();
- String ta = rpc.typeAnnotation().getText();
+ String ta = rpc.typeAnnotation().stop.getText();
String iop = rpc.identifierOrPattern().getText();
System.out.println("interface type: " + ta + " name: " + iop);
fo.addParam(iop, ta);
@@ -402,7 +749,7 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
@Override
public void enterAbstractDeclaration(TypeScriptParser.AbstractDeclarationContext ctx) {
super.enterAbstractDeclaration(ctx);
- System.out.println("find abstract Declare: " + ctx.toString());
+ System.out.println("find abstract Declare: " + ctx.getText());
}
@Override
@@ -434,4 +781,10 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener {
super.exitProgram(ctx);
System.out.println("exit Program: " + ctx.toString());
}
+
+ @Override
+ public String dump2JsonStr() {
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ return gson.toJson(this);
+ }
}
diff --git a/src/intellij_plugin/ohosgen/src/main/java/grammar/ParseObj.java b/src/intellij_plugin/ohosgen/src/main/java/grammar/ParseObj.java
index 62d6bfcf352e36ae57ff124c3413c8decb0c7248..eb70ca354431e1bcf3e5af376d492b08c9b3c960 100644
--- a/src/intellij_plugin/ohosgen/src/main/java/grammar/ParseObj.java
+++ b/src/intellij_plugin/ohosgen/src/main/java/grammar/ParseObj.java
@@ -15,6 +15,9 @@
package grammar;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
/**
* 类名:该类用于xxx
* description parse object
@@ -25,23 +28,25 @@ package grammar;
* @since 2025-02-28
*/
public class ParseObj extends GBaseObject {
- private EnumObj[] enumList;
- private UnionObj[] unionList;
- private StructObj[] structList;
- private ClassObj[] classList;
- private FuncObj[] funcList;
- private TypeObj[] typeList;
+ private List enumList;
+ private List unionList;
+ private List structList;
+ private List classList;
+ private List funcList;
+ private List typeList;
+ private List interfaceList;
/**
* 构造函数
*/
- ParseObj() {
- enumList = new EnumObj[0];
- unionList = new UnionObj[0];
- structList = new StructObj[0];
- classList = new ClassObj[0];
- funcList = new FuncObj[0];
- typeList = new TypeObj[0];
+ public ParseObj() {
+ enumList = new CopyOnWriteArrayList<>();
+ unionList = new CopyOnWriteArrayList<>();
+ structList = new CopyOnWriteArrayList<>();
+ classList = new CopyOnWriteArrayList<>();
+ funcList = new CopyOnWriteArrayList<>();
+ typeList = new CopyOnWriteArrayList<>();
+ interfaceList = new CopyOnWriteArrayList<>();
}
/**
@@ -49,7 +54,7 @@ public class ParseObj extends GBaseObject {
*
* @param res enum对象
*/
- void setEnumList(EnumObj[] res) {
+ public void setEnumList(List res) {
enumList = res;
}
@@ -58,7 +63,7 @@ public class ParseObj extends GBaseObject {
*
* @param res union对象
*/
- void getUnionList(UnionObj[] res) {
+ public void setUnionList(List res) {
unionList = res;
}
@@ -67,7 +72,7 @@ public class ParseObj extends GBaseObject {
*
* @param res struct对象
*/
- void setStructList(StructObj[] res) {
+ public void setStructList(List res) {
structList = res;
}
@@ -76,7 +81,7 @@ public class ParseObj extends GBaseObject {
*
* @param res class对象
*/
- void setClassList(ClassObj[] res) {
+ public void setClassList(List res) {
classList = res;
}
@@ -85,7 +90,7 @@ public class ParseObj extends GBaseObject {
*
* @param res func对象
*/
- void setFuncList(FuncObj[] res) {
+ public void setFuncList(List res) {
funcList = res;
}
@@ -94,7 +99,7 @@ public class ParseObj extends GBaseObject {
*
* @param res type对象
*/
- void setTypeList(TypeObj[] res) {
+ public void setTypeList(List res) {
typeList = res;
}
@@ -103,7 +108,7 @@ public class ParseObj extends GBaseObject {
*
* @return 解析后enum列表
*/
- EnumObj[] getEnumList() {
+ public List getEnumList() {
return enumList;
}
@@ -112,7 +117,7 @@ public class ParseObj extends GBaseObject {
*
* @return 解析后union列表
*/
- UnionObj[] getUnionList() {
+ public List getUnionList() {
return unionList;
}
@@ -121,7 +126,7 @@ public class ParseObj extends GBaseObject {
*
* @return 解析后struct列表
*/
- StructObj[] getStructList() {
+ public List getStructList() {
return structList;
}
@@ -130,7 +135,7 @@ public class ParseObj extends GBaseObject {
*
* @return 解析后class列表
*/
- ClassObj[] getClassList() {
+ public List getClassList() {
return classList;
}
@@ -139,7 +144,7 @@ public class ParseObj extends GBaseObject {
*
* @return 解析后func列表
*/
- FuncObj[] getFuncList() {
+ public List getFuncList() {
return funcList;
}
@@ -148,7 +153,25 @@ public class ParseObj extends GBaseObject {
*
* @return 解析后type列表
*/
- TypeObj[] getTypeList() {
+ public List getTypeList() {
return typeList;
}
+
+ /**
+ * 获取interface对象
+ *
+ * @return interface对象
+ */
+ public List getInterfaceList() {
+ return interfaceList;
+ }
+
+ /**
+ * 设置interface对象
+ *
+ * @param interfaceList interface 对象
+ */
+ public void setInterfaceList(List interfaceList) {
+ this.interfaceList = interfaceList;
+ }
}
diff --git a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseBase.java b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseBase.java
index b31e7d30bde3bc2d892821c152d5936f40da4043..4ef224b93b14b33f13f8cd0200c05f293a1b89cd 100644
--- a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseBase.java
+++ b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseBase.java
@@ -15,6 +15,7 @@
package parse;
+import antlr.ParseBaseListener;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import grammar.*;
@@ -140,9 +141,19 @@ public abstract class ParseBase {
/**
* 根据文件char stream解析文件
*
- * @param fileCStream 文件内容
+ * @param fileCStream
+ * 文件内容
+ * @return 解析结果
*/
- public abstract void parseCStream(CharStream fileCStream);
+ public abstract ParseObj parseCStream(CharStream fileCStream);
+
+ /**
+ * 生成 解析结果
+ *
+ * @param pbl 解析监听
+ * @return 解析结果
+ */
+ protected abstract ParseObj genParseResult(ParseBaseListener pbl);
/**
* 解析enum
diff --git a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseC.java b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseC.java
index f03f0b448f81d63d49433ab2bd06b235b45ee4cc..f143b8b395a278dcfbddf11a6a82e45589f00c18 100644
--- a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseC.java
+++ b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseC.java
@@ -15,6 +15,7 @@
package parse;
+import antlr.ParseBaseListener;
import antlr.cpp.CPP14CustomListener;
import antlr.cpp.CPP14ErrorListener;
import antlr.cpp.CPP14Lexer;
@@ -89,10 +90,12 @@ public class ParseC extends ParseBase {
/**
* 处理内容
*
- * @param fileCStream 文件内容
+ * @param fileCStream
+ * 文件内容
+ * @return 解析结果
*/
@Override
- public void parseCStream(CharStream fileCStream) {
+ public ParseObj parseCStream(CharStream fileCStream) {
System.out.println("c/cpp parse char stream");
this.fcStream = fileCStream;
sendEvent(Constants.START_STATUS, Constants.C_CPP_START_MSG, 50);
@@ -115,33 +118,81 @@ public class ParseC extends ParseBase {
}
sendEvent(Constants.COMPLETE_STATUS, Constants.C_CPP_COMPLETE_MSG, 50);
+ return null;
}
+ /**
+ * 生成解析结果
+ *
+ * @param pbl 解析监听
+ * @return 解析结果
+ */
+ @Override
+ protected ParseObj genParseResult(ParseBaseListener pbl) {
+ return null;
+ }
+
+ /**
+ * 解析枚举
+ *
+ * @param pi2 解析结果
+ * @return 枚举
+ */
@Override
protected EnumObj[] parseEnum(ParseTaskInfo pi2) {
return super.parseEnum(pi2);
}
+ /**
+ * 解析枚举
+ *
+ * @param pi2 解析结果
+ * @return 联合
+ */
@Override
protected UnionObj[] parseUnion(ParseTaskInfo pi2) {
return super.parseUnion(pi2);
}
+ /**
+ * 解析枚举
+ *
+ * @param pi2 解析结果
+ * @return 结构体
+ */
@Override
protected StructObj[] parseStruct(ParseTaskInfo pi2) {
return super.parseStruct(pi2);
}
+ /**
+ * 解析枚举
+ *
+ * @param pi2 解析结果
+ * @return 类
+ */
@Override
protected ClassObj[] parseClass(ParseTaskInfo pi2) {
return super.parseClass(pi2);
}
+ /**
+ * 解析枚举
+ *
+ * @param pi2 解析结果
+ * @return 方法
+ */
@Override
protected FuncObj[] parseFunc(ParseTaskInfo pi2) {
return super.parseFunc(pi2);
}
+ /**
+ * 解析枚举
+ *
+ * @param pi2 解析结果
+ * @return 类型
+ */
@Override
protected TypeObj[] parseType(ParseTaskInfo pi2) {
return super.parseType(pi2);
diff --git a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTask.java b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTask.java
index 3e8604d26a004e58ea584492b2267314da592d12..eff8b0e018feeeeb0f3c800517e08d5e9c67537f 100644
--- a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTask.java
+++ b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTask.java
@@ -17,6 +17,7 @@ package parse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+import grammar.ParseObj;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import com.intellij.openapi.progress.ProgressIndicator;
@@ -91,7 +92,7 @@ public class ParseTask extends Task.Backgroundable implements BaseListener {
InputStream is = parseFile.getInputStream();
CharStream ics = CharStreams.fromStream(is);
- parser.parseCStream(ics);
+ ParseObj po = parser.parseCStream(ics);
System.out.println("parseContent finish");
String[] lines = content.split("\n");
for (int i = 0; i < lines.length; i++) {
diff --git a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTs.java b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTs.java
index 091a3fc4d0d4d690421c08fccb81782dd97f180b..eac7c2adf31dc39282ee6fc104f58d4045b039fb 100644
--- a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTs.java
+++ b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseTs.java
@@ -15,14 +15,13 @@
package parse;
+import antlr.ParseBaseListener;
import antlr.typescript.TypeScriptCustomListener;
import antlr.typescript.TypeScriptErrorListener;
import antlr.typescript.TypeScriptLexer;
import antlr.typescript.TypeScriptParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
import event.CustomEvent;
import event.CustomEventListener;
import grammar.*;
@@ -82,10 +81,12 @@ public class ParseTs extends ParseBase implements CustomEventListener {
/**
* 处理内容
*
- * @param fileCStream 文件内容
+ * @param fileCStream
+ * 文件内容
+ * @return 解析结果
*/
@Override
- public void parseCStream(CharStream fileCStream) {
+ public ParseObj parseCStream(CharStream fileCStream) {
System.out.println("ts parse char stream start");
this.fcStream = fileCStream;
@@ -103,17 +104,20 @@ public class ParseTs extends ParseBase implements CustomEventListener {
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(tsc, tree);
- Gson gson = new GsonBuilder().setPrettyPrinting().create();
-
- String json = gson.toJson(tsc);
+ String json = tsc.dump2JsonStr();
System.out.println("ts parse result: " + json);
+ ParseObj po = genParseResult(tsc);
+
System.out.println("ts parse char stream finish");
+ return po;
} catch (RecognitionException e) {
System.out.println("parse cstream e.printStackTrace(): " + e.getMessage());
+ } finally {
+ sendEvent(Constants.COMPLETE_STATUS, Constants.TS_COMPLETE_MSG, 50);
}
- sendEvent(Constants.COMPLETE_STATUS, Constants.TS_COMPLETE_MSG, 50);
+ return null;
}
/**
@@ -131,6 +135,31 @@ public class ParseTs extends ParseBase implements CustomEventListener {
}
+ /**
+ * 生成解析结果
+ *
+ * @param pbl 解析监听
+ * @return 解析结果
+ */
+ @Override
+ protected ParseObj genParseResult(ParseBaseListener pbl) {
+ if (!(pbl instanceof TypeScriptCustomListener tcl)) {
+ return null;
+ }
+
+ ParseObj po = new ParseObj();
+
+ po.setInterfaceList(tcl.getInterfaceObjList());
+ po.setEnumList(tcl.getEnumObjList());
+ po.setClassList(tcl.getClassObjList());
+ po.setFuncList(tcl.getFuncObjList());
+ po.setStructList(tcl.getStructObjList());
+ po.setTypeList(tcl.getTypeObjList());
+ po.setUnionList(tcl.getUnionObjList());
+
+ return po;
+ }
+
/**
* 解析枚举
*
diff --git a/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java b/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..20ff1fb08a22cb3b4fa39862000a25210d924253
--- /dev/null
+++ b/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2025 Shenzhen Kaihong Digital.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package parse;
+
+import grammar.*;
+import org.antlr.v4.runtime.CharStreams;
+import org.antlr.v4.runtime.CodePointCharStream;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * 类名:该类用于xxx
+ * description
+ *
+ * @author Administrator
+ * date 2025-02-28
+ * @version 1.0
+ * @since 2025-02-28
+ */
+class ParseTsTest {
+
+ @Test
+ void parseFile() {
+ }
+
+ @Test
+ void parseContent() {
+ }
+
+ @Test
+ void parseCStreamEnum() {
+ ParseBase parser = ParseFactory.getParser("ts");
+ String testEnum = "enum Colors {\n" +
+ " Red = \"RED\",\n" +
+ " Green = \"GREEN\",\n" +
+ " Blue = \"BLUE\"\n" +
+ "}";
+ CodePointCharStream cStream = CharStreams.fromString(testEnum);
+ ParseObj po = parser.parseCStream(cStream);
+ List eol = po.getEnumList();
+ assertEquals(1, eol.size());
+ EnumObj eo = eol.get(0);
+ assertEquals("Colors", eo.getName());
+ List ml = eo.getMemberList();
+ assertEquals(3, ml.size());
+ assertEquals("Red", ml.get(0));
+ assertEquals("Green", ml.get(1));
+ assertEquals("Blue", ml.get(2));
+ List vl = eo.getValueList();
+ assertEquals(3, vl.size());
+ assertEquals("\"RED\"", vl.get(0));
+ assertEquals("\"GREEN\"", vl.get(1));
+ assertEquals("\"BLUE\"", vl.get(2));
+ }
+
+ @Test
+ void parseCStreamClass_1() {
+ String testClass = "export class Box {\n" +
+ "\tlines: number;\n" +
+ "\tsrcType: TestEnum;\n" +
+ "\tdestType1: TestSt3;\n" +
+ "\tdesType2: TestShap_t;\n" +
+ "\tdesType3: TestUnion3_t;\n" +
+ "\tcalcArea: number;\n" +
+ "\theith_: number;\n" +
+ "\ttransform2D(calcCB: Calculate): boolean;\n" +
+ "\ttransform3D(ctCB: CallbackTest): boolean;\n" +
+ "};";
+ ParseBase parser = ParseFactory.getParser("ts");
+
+ CodePointCharStream cStream = CharStreams.fromString(testClass);
+ ParseObj po = parser.parseCStream(cStream);
+ List eol = po.getClassList();
+ assertEquals(1, eol.size());
+ ClassObj co = eol.get(0);
+ assertEquals("Box", co.getName());
+ List pl = co.getParamList();
+ assertEquals(7, pl.size());
+ ParamObj poItem = pl.get(0);
+ assertEquals("lines", poItem.getName());
+ assertEquals("number", poItem.getType());
+ poItem = pl.get(1);
+ assertEquals("srcType", poItem.getName());
+ assertEquals("TestEnum", poItem.getType());
+ poItem = pl.get(2);
+ assertEquals("destType1", poItem.getName());
+ assertEquals("TestSt3", poItem.getType());
+ poItem = pl.get(3);
+ assertEquals("desType2", poItem.getName());
+ assertEquals("TestShap_t", poItem.getType());
+ poItem = pl.get(4);
+ assertEquals("desType3", poItem.getName());
+ assertEquals("TestUnion3_t", poItem.getType());
+ poItem = pl.get(5);
+ assertEquals("calcArea", poItem.getName());
+ assertEquals("number", poItem.getType());
+ poItem = pl.get(6);
+ assertEquals("heith_", poItem.getName());
+ assertEquals("number", poItem.getType());
+ }
+
+ @Test
+ void parseCStreamClass_2() {
+ String testClass = "abstract class Person {\n" +
+ " name: string;\n" +
+ "\n" +
+ " constructor(name: string) {\n" +
+ " this.name = name;\n" +
+ " }\n" +
+ "\n" +
+ " abstract find(string): Person;\n" +
+ " abstract nameAbs: string;\n" +
+ "}";
+ CodePointCharStream cStream = CharStreams.fromString(testClass);
+ ParseBase parser = ParseFactory.getParser("ts");
+ ParseObj po = parser.parseCStream(cStream);
+ List eol = po.getClassList();
+ assertEquals(1, eol.size());
+ ClassObj co = eol.get(0);
+ assertEquals("Person", co.getName());
+ List pl = co.getParamList();
+ assertEquals(2, pl.size());
+ ParamObj poItem = pl.get(0);
+ assertEquals("name", poItem.getName());
+ assertEquals("string", poItem.getType());
+ poItem = pl.get(1);
+ assertEquals("nameAbs", poItem.getName());
+ assertEquals("string", poItem.getType());
+ List fol = co.getFuncList();
+ assertEquals(3, fol.size());
+ FuncObj foItem = fol.get(0);
+ assertEquals("constructor", foItem.getName());
+ List pol = foItem.getParamList();
+ assertEquals(1, pol.size());
+ poItem = pol.get(0);
+ assertEquals("name", poItem.getName());
+ assertEquals("string", poItem.getType());
+ foItem = fol.get(1);
+ assertEquals("find", foItem.getName());
+ pol = foItem.getParamList();
+ assertEquals(1, pol.size());
+ poItem = pol.get(0);
+ assertEquals("string", poItem.getType());
+
+ }
+
+ @Test
+ void parseCStreamFunc() {
+ ParseBase parser = ParseFactory.getParser("ts");
+ String testFunc = "export function transform2D(\n" +
+ "\tdirection: number,\n" +
+ "\tangle: number,\n" +
+ "\tcalcCB: Calculate): boolean;";
+ CodePointCharStream cStream = CharStreams.fromString(testFunc);
+ ParseObj po = parser.parseCStream(cStream);
+ List fol = po.getFuncList();
+ assertEquals(1, fol.size());
+ FuncObj fo = fol.get(0);
+ assertEquals("transform2D", fo.getName());
+ assertEquals("boolean", fo.getRetValue());
+ List pol = fo.getParamList();
+ assertEquals(3, pol.size());
+ ParamObj poItem = pol.get(0);
+ assertEquals("direction", poItem.getName());
+ assertEquals("number", poItem.getType());
+ poItem = pol.get(1);
+ assertEquals("angle", poItem.getName());
+ assertEquals("number", poItem.getType());
+ poItem = pol.get(2);
+ assertEquals("calcCB", poItem.getName());
+ assertEquals("Calculate", poItem.getType());
+ }
+
+ @Test
+ void parseCStreamInterface() {
+ ParseBase parser = ParseFactory.getParser("ts");
+ String testInterface = "export interface CallbackTest {\n" +
+ "\t(msg: string): void;\n" +
+ "};";
+ CodePointCharStream cStream = CharStreams.fromString(testInterface);
+ ParseObj po = parser.parseCStream(cStream);
+ List iol = po.getInterfaceList();
+ assertEquals(1, iol.size());
+ InterfaceObject ioItem = iol.get(0);
+ List fol = ioItem.getFuncList();
+ assertEquals(1, fol.size());
+ FuncObj foItem = fol.get(0);
+ assertEquals("", foItem.getName());
+ assertEquals("void", foItem.getRetValue());
+ List pol = foItem.getParamList();
+ assertEquals(1, pol.size());
+ ParamObj poItem = pol.get(0);
+ assertEquals("msg", poItem.getName());
+ assertEquals("string", poItem.getType());
+ }
+
+ @Test
+ void parseCStreamType() {
+ ParseBase parser = ParseFactory.getParser("ts");
+ String testType = "export type TestShap_t = TestShape;";
+ CodePointCharStream cStream = CharStreams.fromString(testType);
+ ParseObj po = parser.parseCStream(cStream);
+ List tol = po.getTypeList();
+ assertEquals(1, tol.size());
+ TypeObj toItem = tol.get(0);
+ assertEquals("TestShap_t", toItem.getName());
+ List tl = toItem.getTypeList();
+ assertEquals(1, tl.size());
+ assertEquals("TestShape", tl.get(0));
+ }
+
+ @Test
+ void receive() {
+ }
+
+ @Test
+ void parseEnum() {
+ }
+
+ @Test
+ void parseUnion() {
+ }
+
+ @Test
+ void parseStruct() {
+ }
+
+ @Test
+ void parseClass() {
+ }
+
+ @Test
+ void parseFunc() {
+ }
+
+ @Test
+ void parseType() {
+ }
+
+ @Test
+ void handleEvent() {
+ }
+}
\ No newline at end of file