Skip to content

Commit

Permalink
refactor: move convert to ts ident convert
Browse files Browse the repository at this point in the history
  • Loading branch information
phodal committed Jan 10, 2020
1 parent d7fc0ee commit 4cef4d1
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 49 deletions.
53 changes: 53 additions & 0 deletions trial/pkg/ast/typescript_ident_converter.go
@@ -0,0 +1,53 @@
package ast

import (
"github.com/antlr/antlr4/runtime/Go/antlr"
"github.com/phodal/coca/languages/ts"
"github.com/phodal/coca/pkg/domain"
)

func BuildArgExpressCall(memberDotExprCtx *parser.MemberDotExpressionContext) domain.JMethodCall {
call := domain.NewJMethodCall()
call.Class = memberDotExprCtx.GetChild(0).(*parser.IdentifierExpressionContext).GetText()
call.MethodName = memberDotExprCtx.IdentifierName().GetText()

return call
}

func BuildConstructorMethod(ctx *parser.ConstructorDeclarationContext) domain.JMethod {
method := domain.NewJMethod()
method.Name = "constructor"

method.AddPosition(ctx.GetChild(0).GetParent().(*antlr.BaseParserRuleContext))

if ctx.AccessibilityModifier() != nil {
method.Modifiers = append(method.Modifiers, ctx.AccessibilityModifier().GetText())
}

return method
}

func BuildMemberMethod(ctx *parser.PropertyMemberDeclarationContext) domain.JMethod {
method := domain.NewJMethod()
method.Name = ctx.PropertyName().GetText()

method.StartLine = ctx.GetStart().GetLine()
method.StartLinePosition = ctx.GetStart().GetColumn()
method.StopLine = ctx.GetStop().GetLine()
method.StopLinePosition = ctx.GetStop().GetColumn()

return method
}

func BuildImplements(typeList parser.IClassOrInterfaceTypeListContext) []string {
typeListContext := typeList.(*parser.ClassOrInterfaceTypeListContext)

var implements []string = nil
for _, typeType := range typeListContext.AllTypeReference() {
typeRefs := typeType.(*parser.TypeReferenceContext).TypeName().GetText()
implements = append(implements, typeRefs)
}

return implements
}

63 changes: 14 additions & 49 deletions trial/pkg/ast/typescript_ident_listener.go
Expand Up @@ -44,22 +44,15 @@ func (s *TypeScriptIdentListener) EnterInterfaceDeclaration(ctx *parser.Interfac

if ctx.InterfaceExtendsClause() != nil {
extendsContext := ctx.InterfaceExtendsClause().(*parser.InterfaceExtendsClauseContext)
buildImplements(extendsContext.ClassOrInterfaceTypeList())
implements := BuildImplements(extendsContext.ClassOrInterfaceTypeList())
currentNode.Implements = append(currentNode.Implements, implements...)
}
}

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"
Expand All @@ -68,49 +61,29 @@ func (s *TypeScriptIdentListener) EnterClassDeclaration(ctx *parser.ClassDeclara
heritageContext := ctx.ClassHeritage().(*parser.ClassHeritageContext)
if heritageContext.ImplementsClause() != nil {
typeList := heritageContext.ImplementsClause().(*parser.ImplementsClauseContext).ClassOrInterfaceTypeList()
buildImplements(typeList)
currentNode.Implements = append(currentNode.Implements, BuildImplements(typeList)...)
}

for _, classElement := range ctx.ClassTail().(*parser.ClassTailContext).AllClassElement() {
elementChild := classElement.GetChild(0)
if reflect.TypeOf(elementChild).String() == "*parser.ConstructorDeclarationContext" {
constructorDeclCtx := elementChild.(*parser.ConstructorDeclarationContext)
appendConstructorMethod(constructorDeclCtx)
currentNode.Methods = append(currentNode.Methods, BuildConstructorMethod(constructorDeclCtx))
} else if reflect.TypeOf(elementChild).String() == "*parser.PropertyMemberDeclarationContext"{
propertyMemberCtx := elementChild.(*parser.PropertyMemberDeclarationContext)
if propertyMemberCtx.GetChildCount() >= 3 {
if reflect.TypeOf(propertyMemberCtx.GetChild(2)).String() == "*parser.CallSignatureContext" {
appendNormalMethod(propertyMemberCtx)
}
}
s.handlePropertyMember(elementChild)
}
}
classNodeQueue = append(classNodeQueue, *currentNode)
}

func appendNormalMethod(ctx *parser.PropertyMemberDeclarationContext) {
method := domain.NewJMethod()
method.Name = ctx.PropertyName().GetText()

method.StartLine = ctx.GetStart().GetLine()
method.StartLinePosition = ctx.GetStart().GetColumn()
method.StopLine = ctx.GetStop().GetLine()
method.StopLinePosition = ctx.GetStop().GetColumn()

currentNode.Methods = append(currentNode.Methods, method)
}

func appendConstructorMethod(ctx *parser.ConstructorDeclarationContext) {
method := domain.NewJMethod()
method.Name = "constructor"

method.AddPosition(ctx.GetChild(0).GetParent().(*antlr.BaseParserRuleContext))

if ctx.AccessibilityModifier() != nil {
method.Modifiers = append(method.Modifiers, ctx.AccessibilityModifier().GetText())
func (s *TypeScriptIdentListener) handlePropertyMember(elementChild antlr.Tree) {
propertyMemberCtx := elementChild.(*parser.PropertyMemberDeclarationContext)
if propertyMemberCtx.GetChildCount() >= 3 {
if reflect.TypeOf(propertyMemberCtx.GetChild(2)).String() == "*parser.CallSignatureContext" {
method := BuildMemberMethod(propertyMemberCtx)
currentNode.Methods = append(currentNode.Methods, method)
}
}

currentNode.Methods = append(currentNode.Methods, method)
}

func (s *TypeScriptIdentListener) ExitClassDeclaration(ctx *parser.ClassDeclarationContext) {
Expand All @@ -133,19 +106,11 @@ func exitClass() {

func (s *TypeScriptIdentListener) EnterArgumentsExpression(ctx *parser.ArgumentsExpressionContext) {
if reflect.TypeOf(ctx.GetChild(0)).String() == "*parser.MemberDotExpressionContext" {
memberDotExprCtx := ctx.GetChild(0).(*parser.MemberDotExpressionContext)
buildMemberDotExpr(memberDotExprCtx)
call := BuildArgExpressCall(ctx.GetChild(0).(*parser.MemberDotExpressionContext))
currentNode.MethodCalls = append(currentNode.MethodCalls, call)
}
}

func buildMemberDotExpr(memberDotExprCtx *parser.MemberDotExpressionContext) {
call := domain.NewJMethodCall()
call.Class = memberDotExprCtx.GetChild(0).(*parser.IdentifierExpressionContext).GetText()
call.MethodName = memberDotExprCtx.IdentifierName().GetText()

currentNode.MethodCalls = append(currentNode.MethodCalls, call)
}

func (s *TypeScriptIdentListener) EnterMemberDotExpression(ctx *parser.MemberDotExpressionContext) {

}
Expand Down

0 comments on commit 4cef4d1

Please sign in to comment.