feat: [ts] add interface support

上级 76b9628a
......@@ -38,8 +38,9 @@ class Person implements IPerson {
}
`)
g.Expect(results[0].Class).To(Equal("Person"))
g.Expect(results[0].Implements[0]).To(Equal("IPerson"))
g.Expect(results[0].Class).To(Equal("IPerson"))
g.Expect(results[1].Class).To(Equal("Person"))
g.Expect(results[1].Implements[0]).To(Equal("IPerson"))
}
func Test_TypeScriptMultipleClass(t *testing.T) {
......@@ -50,6 +51,6 @@ func Test_TypeScriptMultipleClass(t *testing.T) {
results := app.Analysis(string(code))
g.Expect(len(results)).To(Equal(2))
g.Expect(results[0].Implements[0]).To(Equal("IPerson"))
g.Expect(len(results)).To(Equal(3))
g.Expect(results[1].Implements[0]).To(Equal("IPerson"))
}
......@@ -26,24 +26,49 @@ func (s *TypeScriptIdentListener) EnterProgram(ctx *parser.ProgramContext) {
}
func (s *TypeScriptIdentListener) EnterInterfaceDeclaration(ctx *parser.InterfaceDeclarationContext) {
currentNode = domain.NewClassNode()
currentNode.Type = "Interface"
currentNode.Class = ctx.Identifier().GetText()
if ctx.InterfaceExtendsClause() != nil {
extendsContext := ctx.InterfaceExtendsClause().(*parser.InterfaceExtendsClauseContext)
buildImplements(extendsContext.ClassOrInterfaceTypeList())
}
}
func (s *TypeScriptIdentListener) ExitInterfaceDeclaration(ctx *parser.InterfaceDeclarationContext) {
exitClass()
}
func buildImplements(typeList parser.IClassOrInterfaceTypeListContext) {
typeListContext := typeList.(*parser.ClassOrInterfaceTypeListContext)
for _, typeType := range typeListContext.AllTypeReference() {
typeRefs := typeType.(*parser.TypeReferenceContext).TypeName().GetText()
currentNode.Implements = append(currentNode.Implements, typeRefs)
}
}
func (s *TypeScriptIdentListener) EnterClassDeclaration(ctx *parser.ClassDeclarationContext) {
currentNode = domain.NewClassNode()
currentNode.Type = "Class"
currentNode.Class = ctx.Identifier().GetText()
heritageContext := ctx.ClassHeritage().(*parser.ClassHeritageContext)
if heritageContext.ImplementsClause() != nil {
typeList := heritageContext.ImplementsClause().(*parser.ImplementsClauseContext).ClassOrInterfaceTypeList()
typeListContext := typeList.(*parser.ClassOrInterfaceTypeListContext)
for _, typeType := range typeListContext.AllTypeReference() {
typeRefs := typeType.(*parser.TypeReferenceContext).TypeName().GetText()
currentNode.Implements = append(currentNode.Implements, typeRefs)
}
buildImplements(typeList)
}
classNodeQueue = append(classNodeQueue, *currentNode)
}
func (s *TypeScriptIdentListener) ExitClassDeclaration(ctx *parser.ClassDeclarationContext) {
exitClass()
}
func exitClass() {
classNodes = append(classNodes, *currentNode)
if len(classNodeQueue) >= 1 {
if len(classNodeQueue) == 1 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册