diff --git a/trial/pkg/application/ts/ts_ident_app.go b/trial/pkg/application/ts/ts_ident_app.go index 0db86f2c52199916b4f3e6524e2986208a978274..fa2a18fbb8117758e287f7bbd05337ec348aed28 100644 --- a/trial/pkg/application/ts/ts_ident_app.go +++ b/trial/pkg/application/ts/ts_ident_app.go @@ -14,7 +14,7 @@ func processStream(is antlr.CharStream) *parser.TypeScriptParser { return parser } -func ProcessJsString(code string) *parser.TypeScriptParser { +func ProcessTsString(code string) *parser.TypeScriptParser { is := antlr.NewInputStream(code) return processStream(is) } @@ -23,8 +23,8 @@ type TypeScriptApiApp struct { } func (j *TypeScriptApiApp) Analysis(code string) domain.JClassNode { - jsParser := ProcessJsString(code) - context := jsParser.Program() + scriptParser := ProcessTsString(code) + context := scriptParser.Program() listener := ast.NewTypeScriptIdentListener() antlr.NewParseTreeWalker().Walk(listener, context) diff --git a/trial/pkg/application/ts/ts_ident_app_test.go b/trial/pkg/application/ts/ts_ident_app_test.go index 5e2c1de27cdfd8ff227484c6e84837d0ad6ebeb9..f3ac677a97919b8b12c2cf1f6fa13ddb72a0f24f 100644 --- a/trial/pkg/application/ts/ts_ident_app_test.go +++ b/trial/pkg/application/ts/ts_ident_app_test.go @@ -38,4 +38,5 @@ class Person implements IPerson { `) g.Expect(results.Class).To(Equal("Person")) + g.Expect(results.Implements[0]).To(Equal("IPerson")) } \ No newline at end of file diff --git a/trial/pkg/ast/typescript_ident_listener.go b/trial/pkg/ast/typescript_ident_listener.go index d5b38173ac01c93021a2dd0bb71806dd3b349598..910dd360d8fc270007166dea0c1f7a588f7eaeae 100644 --- a/trial/pkg/ast/typescript_ident_listener.go +++ b/trial/pkg/ast/typescript_ident_listener.go @@ -6,14 +6,15 @@ import ( "reflect" ) -var currentNode domain.JClassNode +var currentNode *domain.JClassNode +var classNodeQueue []domain.JClassNode type TypeScriptIdentListener struct { parser.BaseTypeScriptParserListener } func NewTypeScriptIdentListener() *TypeScriptIdentListener { - currentNode = *domain.NewClassNode() + currentNode = domain.NewClassNode() return &TypeScriptIdentListener{} } @@ -22,7 +23,33 @@ func (s *TypeScriptIdentListener) EnterProgram(ctx *parser.ProgramContext) { } func (s *TypeScriptIdentListener) EnterClassDeclaration(ctx *parser.ClassDeclarationContext) { + currentNode = domain.NewClassNode() 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) + } + } + + classNodeQueue = append(classNodeQueue, *currentNode) +} + +func (s *TypeScriptIdentListener) ExitClassDeclaration(ctx *parser.ClassDeclarationContext) { + if len(classNodeQueue) >= 1 { + if len(classNodeQueue) == 1 { + currentNode = &classNodeQueue[0] + } else { + classNodeQueue = classNodeQueue[0 : len(classNodeQueue)-1] + currentNode = &classNodeQueue[len(classNodeQueue)-1] + } + } else { + currentNode = domain.NewClassNode() + } } func (s *TypeScriptIdentListener) EnterArgumentsExpression(ctx *parser.ArgumentsExpressionContext) { @@ -45,8 +72,5 @@ func (s *TypeScriptIdentListener) EnterMemberDotExpression(ctx *parser.MemberDot } func (s *TypeScriptIdentListener) GetNodeInfo() domain.JClassNode { - return currentNode + return *currentNode } - - -