From ff02fd7681dd53998ebd90da2a229ef2fd0738e7 Mon Sep 17 00:00:00 2001 From: wangshi Date: Thu, 13 Mar 2025 16:23:30 +0800 Subject: [PATCH 1/4] add parseobj Signed-off-by: wangshi --- src/intellij_plugin/ohosgen/build.gradle.kts | 1 + .../main/java/antlr/ParseBaseListener.java | 35 +++ .../typescript/TypeScriptCustomListener.java | 203 ++++++++++++++++- .../src/main/java/grammar/ParseObj.java | 73 ++++-- .../src/main/java/parse/ParseBase.java | 15 +- .../ohosgen/src/main/java/parse/ParseC.java | 13 +- .../src/main/java/parse/ParseTask.java | 3 +- .../ohosgen/src/main/java/parse/ParseTs.java | 45 +++- .../src/test/java/parse/ParseTsTest.java | 214 ++++++++++++++++++ 9 files changed, 555 insertions(+), 47 deletions(-) create mode 100644 src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java create mode 100644 src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java diff --git a/src/intellij_plugin/ohosgen/build.gradle.kts b/src/intellij_plugin/ohosgen/build.gradle.kts index f2458130..31f83a90 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 00000000..41450724 --- /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; + +import event.CustomEvent; + +/** + *

类名:该类用于xxx

+ * description parse base listener + * + * @author Administrator + * date 2025-02-28 + * @version 1.0 + * @since 2025-02-28 + */ +public interface ParseBaseListener { + + /** + * 打印 json str + */ + 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 75b6e2a1..a1bbd1eb 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,10 @@ package antlr.typescript; +import antlr.ParseBaseListener; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import event.CustomEvent; import grammar.*; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.ParserRuleContext; @@ -33,7 +37,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 +49,9 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener { private List unionObjList; private List interfaceObjList; + /** + * 构造函数 + */ public TypeScriptCustomListener() { enumObjList = new CopyOnWriteArrayList<>(); classObjList = new CopyOnWriteArrayList<>(); @@ -55,12 +62,183 @@ 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 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(); @@ -111,7 +289,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 +345,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 +355,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); @@ -235,6 +412,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(); @@ -273,7 +452,7 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener { 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; @@ -376,16 +555,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); @@ -434,4 +613,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 62d6bfcf..eb70ca35 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 b31e7d30..be6201cb 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 f03f0b44..beb7e181 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,6 +118,12 @@ public class ParseC extends ParseBase { } sendEvent(Constants.COMPLETE_STATUS, Constants.C_CPP_COMPLETE_MSG, 50); + return null; + } + + @Override + protected ParseObj genParseResult(ParseBaseListener pbl) { + return null; } @Override 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 3e8604d2..eff8b0e0 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 091a3fc4..eac7c2ad 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 00000000..f9840dba --- /dev/null +++ b/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java @@ -0,0 +1,214 @@ +/* + * 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 antlr.typescript.TypeScriptParser; +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() { + ParseBase parser = ParseFactory.getParser("ts"); + 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" + + "};"; + 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 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 -- Gitee From a1a502b113d7703574d5553ccbeede40b04322a5 Mon Sep 17 00:00:00 2001 From: wangshi Date: Thu, 13 Mar 2025 20:50:10 +0800 Subject: [PATCH 2/4] fix code check Signed-off-by: wangshi --- .../main/java/antlr/ParseBaseListener.java | 4 +- .../typescript/TypeScriptCustomListener.java | 192 +++++++++++++++++- .../src/main/java/parse/ParseBase.java | 2 +- .../ohosgen/src/main/java/parse/ParseC.java | 44 +++- 4 files changed, 234 insertions(+), 8 deletions(-) diff --git a/src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java b/src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java index 41450724..9f0c208d 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java +++ b/src/intellij_plugin/ohosgen/src/main/java/antlr/ParseBaseListener.java @@ -15,8 +15,6 @@ package antlr; -import event.CustomEvent; - /** *

类名:该类用于xxx

* description parse base listener @@ -30,6 +28,8 @@ 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 a1bbd1eb..9fa44d79 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 @@ -18,7 +18,6 @@ package antlr.typescript; import antlr.ParseBaseListener; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import event.CustomEvent; import grammar.*; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.ParserRuleContext; @@ -227,12 +226,72 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple /** * 设置联合 * - * @param 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(); @@ -263,6 +322,28 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple 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 0) { + System.out.println("abstract item: " + childItem.getText()); + } + } + } + } + + + } } @@ -272,7 +353,7 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple @Override public void enterExpressionStatement(TypeScriptParser.ExpressionStatementContext ctx) { super.enterExpressionStatement(ctx); - + System.out.println("enterExpressionStatement: " + ctx.getText()); } @Override @@ -388,6 +469,49 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple 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); @@ -446,6 +570,30 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple 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); @@ -539,6 +687,42 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple 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); @@ -581,7 +765,7 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple @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 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 be6201cb..4ef224b9 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseBase.java +++ b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseBase.java @@ -143,7 +143,7 @@ public abstract class ParseBase { * * @param fileCStream * 文件内容 - * @return + * @return 解析结果 */ public abstract ParseObj parseCStream(CharStream fileCStream); 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 beb7e181..f143b8b3 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/parse/ParseC.java +++ b/src/intellij_plugin/ohosgen/src/main/java/parse/ParseC.java @@ -92,7 +92,7 @@ public class ParseC extends ParseBase { * * @param fileCStream * 文件内容 - * @return + * @return 解析结果 */ @Override public ParseObj parseCStream(CharStream fileCStream) { @@ -121,36 +121,78 @@ public class ParseC extends ParseBase { 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); -- Gitee From fe0a7677c8a7adf6f748470318b29af25d431e3a Mon Sep 17 00:00:00 2001 From: wangshi Date: Thu, 13 Mar 2025 21:04:29 +0800 Subject: [PATCH 3/4] fix code check Signed-off-by: wangshi --- .../typescript/TypeScriptCustomListener.java | 20 +------- .../src/test/java/parse/ParseTsTest.java | 51 +++++++++++++++++-- 2 files changed, 50 insertions(+), 21 deletions(-) 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 9fa44d79..c7a19b09 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 @@ -324,25 +324,9 @@ public class TypeScriptCustomListener extends TypeScriptParserBaseListener imple } else if (varName.equals(TsToken.TS_TOKEN_ABSTRACT)) { int cnt = ctx.children.size(); - for (int i=0; i 0) { - System.out.println("abstract item: " + childItem.getText()); - } - } - } - } - - + System.out.println("item: " + item.getText()); } } diff --git a/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java b/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java index f9840dba..b96b607b 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java +++ b/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java @@ -15,7 +15,6 @@ package parse; -import antlr.typescript.TypeScriptParser; import grammar.*; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CodePointCharStream; @@ -71,8 +70,7 @@ class ParseTsTest { } @Test - void parseCStreamClass() { - ParseBase parser = ParseFactory.getParser("ts"); + void parseCStreamClass_1() { String testClass = "export class Box {\n" + "\tlines: number;\n" + "\tsrcType: TestEnum;\n" + @@ -84,6 +82,8 @@ class ParseTsTest { "\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(); @@ -115,6 +115,51 @@ class ParseTsTest { assertEquals("number", poItem.getType()); } + @Test + void parseCStreamClass_2() { + ParseBase parser = ParseFactory.getParser("ts"); + 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); + 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"); -- Gitee From 52d5d765ccebe8e502e3b5ccc1bcf13675ff3ab8 Mon Sep 17 00:00:00 2001 From: wangshi Date: Fri, 14 Mar 2025 08:32:28 +0800 Subject: [PATCH 4/4] fix bug Signed-off-by: wangshi --- .../ohosgen/src/test/java/parse/ParseTsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java b/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java index b96b607b..20ff1fb0 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java +++ b/src/intellij_plugin/ohosgen/src/test/java/parse/ParseTsTest.java @@ -117,7 +117,6 @@ class ParseTsTest { @Test void parseCStreamClass_2() { - ParseBase parser = ParseFactory.getParser("ts"); String testClass = "abstract class Person {\n" + " name: string;\n" + "\n" + @@ -129,6 +128,7 @@ class ParseTsTest { " 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()); -- Gitee