示例#1
0
// Define defines the member under the type or module in the type graph.
func (mb *MemberBuilder) Define() TGMember {
	var name = mb.name
	if mb.isOperator {
		// Normalize the name by lowercasing it.
		name = strings.ToLower(mb.name)
	}

	// Create the member node.
	var memberNode compilergraph.ModifiableGraphNode
	if mb.isOperator {
		memberNode = mb.modifier.CreateNode(NodeTypeOperator)
		memberNode.Decorate(NodePredicateOperatorName, name)
		memberNode.Decorate(NodePredicateMemberName, operatorMemberNamePrefix+name)
	} else {
		memberNode = mb.modifier.CreateNode(NodeTypeMember)
		memberNode.Decorate(NodePredicateMemberName, name)
	}

	if mb.hasSourceNode {
		memberNode.Connect(NodePredicateSource, mb.sourceNode)
	}

	memberNode.Decorate(NodePredicateModulePath, mb.parent.ParentModule().Get(NodePredicateModulePath))

	// Decorate the member with its generics.
	for index, genericInfo := range mb.memberGenerics {
		genericBuilder := genericBuilder{
			modifier:        mb.modifier,
			tdg:             mb.tdg,
			parentNode:      memberNode,
			genericKind:     typeMemberGeneric,
			index:           index,
			parentPredicate: NodePredicateMemberGeneric,
		}

		genericBuilder.Name(genericInfo.name)
		if genericInfo.hasSourceNode {
			genericBuilder.SourceNode(genericInfo.sourceNode)
		}
		genericBuilder.defineGeneric()
	}

	// Add the member to the parent node.
	parentNode := mb.modifier.Modify(mb.parent.Node())

	if mb.isOperator {
		parentNode.Connect(NodePredicateTypeOperator, memberNode)
	} else {
		parentNode.Connect(NodePredicateMember, memberNode)
	}

	return TGMember{memberNode.AsNode(), mb.tdg}
}
示例#2
0
// decorateWithError decorates the given node with an associated error node.
func (t *TypeGraph) decorateWithError(node compilergraph.ModifiableGraphNode, message string, args ...interface{}) {
	errorNode := node.Modifier().CreateNode(NodeTypeError)
	errorNode.Decorate(NodePredicateErrorMessage, fmt.Sprintf(message, args...))
	node.Connect(NodePredicateError, errorNode)
}