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