pkg/application/arch/arch_app.go

Summary

Maintainability
A
0 mins
Test Coverage
package arch

import (
    "github.com/modernizing/coca/pkg/application/arch/tequila"
    "github.com/modernizing/coca/pkg/domain/core_domain"
)

type ArchApp struct {
}

func NewArchApp() ArchApp {
    return ArchApp{}
}

func (a ArchApp) Analysis(deps []core_domain.CodeDataStruct, identifiersMap map[string]core_domain.CodeDataStruct) *tequila.FullGraph {
    fullGraph := &tequila.FullGraph{
        NodeList:     make(map[string]string),
        RelationList: make(map[string]*tequila.Relation),
    }

    for _, clz := range deps {
        if clz.NodeName == "Main" {
            continue
        }

        src := clz.Package + "." + clz.NodeName
        fullGraph.NodeList[src] = src

        for _, impl := range clz.Implements {
            relation := &tequila.Relation{
                From:  src,
                To:    impl,
                Style: "\"solid\"",
            }

            fullGraph.RelationList[relation.From+"->"+relation.To] = relation
        }

        addCallInField(clz, src, *fullGraph)
        addExtend(clz, src, *fullGraph)
        addCallInMethod(clz, identifiersMap, src, *fullGraph)
    }

    return fullGraph
}

func addCallInField(clz core_domain.CodeDataStruct, src string, fullGraph tequila.FullGraph) {
    for _, field := range clz.FunctionCalls {
        dst := field.Package + "." + field.NodeName
        relation := &tequila.Relation{
            From:  src,
            To:    dst,
            Style: "\"solid\"",
        }

        fullGraph.RelationList[relation.From+"->"+relation.To] = relation
    }
}

func addCallInMethod(clz core_domain.CodeDataStruct, identifiersMap map[string]core_domain.CodeDataStruct, src string, fullGraph tequila.FullGraph) {
    for _, method := range clz.Functions {
        if method.Name == "main" {
            continue
        }

        // TODO: add implements, extends support
        for _, call := range method.FunctionCalls {
            dst := call.Package + "." + call.NodeName
            if src == dst {
                continue
            }

            if _, ok := identifiersMap[dst]; ok {
                relation := &tequila.Relation{
                    From:  src,
                    To:    dst,
                    Style: "\"solid\"",
                }

                fullGraph.RelationList[relation.From+"->"+relation.To] = relation
            }
        }
    }
}

func addExtend(clz core_domain.CodeDataStruct, src string, fullGraph tequila.FullGraph) {
    if clz.Extend != "" {
        relation := &tequila.Relation{
            From:  src,
            To:    clz.Extend,
            Style: "\"solid\"",
        }

        fullGraph.RelationList[relation.From+"->"+relation.To] = relation
    }
}