本文整理汇总了Golang中github.com/serulian/compiler/compilergraph.GraphNode.Get方法的典型用法代码示例。如果您正苦于以下问题:Golang GraphNode.Get方法的具体用法?Golang GraphNode.Get怎么用?Golang GraphNode.Get使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/serulian/compiler/compilergraph.GraphNode
的用法示例。
在下文中一共展示了GraphNode.Get方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: scopeInCollectionExpression
// scopeInCollectionExpression scopes an 'in' collection expression in the SRG.
func (sb *scopeBuilder) scopeInCollectionExpression(node compilergraph.GraphNode, context scopeContext) proto.ScopeInfo {
// Get the scope of the left and right expressions.
leftScope := sb.getScope(node.GetNode(parser.NodeBinaryExpressionLeftExpr), context)
rightScope := sb.getScope(node.GetNode(parser.NodeBinaryExpressionRightExpr), context)
// Ensure that both scopes are valid.
if !leftScope.GetIsValid() || !rightScope.GetIsValid() {
return newScope().Invalid().GetScope()
}
// Ensure that the right side has a 'contains' operator defined.
rightType := rightScope.ResolvedTypeRef(sb.sg.tdg)
module := compilercommon.InputSource(node.Get(parser.NodePredicateSource))
operator, rerr := rightType.ResolveAccessibleMember("contains", module, typegraph.MemberResolutionOperator)
if rerr != nil {
sb.decorateWithError(node, "Operator 'contains' is not defined on type '%v'", rightType)
return newScope().Invalid().GetScope()
}
// Ensure the right side is not nullable.
if rightType.NullValueAllowed() {
sb.decorateWithError(node, "Cannot invoke operator 'in' on nullable value of type '%v'", rightType)
return newScope().Invalid().GetScope()
}
// Ensure that the left side can be used as the operator's parameter.
parameterType := operator.ParameterTypes()[0].TransformUnder(rightType)
leftType := leftScope.ResolvedTypeRef(sb.sg.tdg)
if serr := leftType.CheckSubTypeOf(parameterType); serr != nil {
sb.decorateWithError(node, "Cannot invoke operator 'in' with value of type '%v': %v", leftType, serr)
return newScope().Invalid().GetScope()
}
return newScope().Valid().CallsOperator(operator).Resolving(sb.sg.tdg.BoolTypeReference()).GetScope()
}
示例2: scopeAssignedValue
// scopeAssignedValue scopes a named assigned value exported into the context.
func (sb *scopeBuilder) scopeAssignedValue(node compilergraph.GraphNode, context scopeContext) proto.ScopeInfo {
// If the assigned value's name is _, then it is anonymous scope.
if node.Get(parser.NodeNamedValueName) == ANONYMOUS_REFERENCE {
return newScope().ForAnonymousScope(sb.sg.tdg).GetScope()
}
// If the assigned value is under a rejection, then it is always an error (but nullable, as it
// may not be present always).
if _, ok := node.TryGetIncomingNode(parser.NodeAssignedRejection); ok {
return newScope().Valid().Assignable(sb.sg.tdg.ErrorTypeReference().AsNullable()).GetScope()
}
// Otherwise, the value is the assignment of the parent statement's expression.
parentNode := node.GetIncomingNode(parser.NodeAssignedDestination)
switch parentNode.Kind() {
case parser.NodeTypeResolveStatement:
// The assigned value exported by a resolve statement has the type of its expression.
exprScope := sb.getScope(parentNode.GetNode(parser.NodeResolveStatementSource), context)
if !exprScope.GetIsValid() {
return newScope().Invalid().GetScope()
}
// If the parent node has a rejection, then the expression may be null.
exprType := exprScope.ResolvedTypeRef(sb.sg.tdg)
if _, ok := parentNode.TryGetNode(parser.NodeAssignedRejection); ok {
exprType = exprType.AsNullable()
}
return newScope().Valid().Assignable(exprType).GetScope()
default:
panic(fmt.Sprintf("Unknown node exporting an assigned value: %v", parentNode.Kind()))
return newScope().Invalid().GetScope()
}
}
示例3: scopeUnaryExpression
// scopeUnaryExpression scopes a unary expression in the SRG.
func (sb *scopeBuilder) scopeUnaryExpression(node compilergraph.GraphNode, opName string, predicate compilergraph.Predicate, context scopeContext) *scopeInfoBuilder {
// Get the scope of the sub expression.
childScope := sb.getScope(node.GetNode(predicate), context)
// Ensure that the child scope is valid.
if !childScope.GetIsValid() {
return newScope().Invalid()
}
// Ensure that the operator exists under the resolved type.
childType := childScope.ResolvedTypeRef(sb.sg.tdg)
module := compilercommon.InputSource(node.Get(parser.NodePredicateSource))
operator, rerr := childType.ResolveAccessibleMember(opName, module, typegraph.MemberResolutionOperator)
if rerr != nil {
sb.decorateWithError(node, "Operator '%v' is not defined on type '%v'", opName, childType)
return newScope().Invalid()
}
returnType, _ := operator.ReturnType()
// Check for nullable values.
if childType.NullValueAllowed() {
sb.decorateWithError(node, "Cannot invoke operator '%v' on nullable type '%v'", opName, childType)
return newScope().Invalid().CallsOperator(operator).Resolving(returnType.TransformUnder(childType))
}
return newScope().Valid().CallsOperator(operator).Resolving(returnType.TransformUnder(childType))
}
示例4: buildStringLiteral
// buildStringLiteral builds the CodeDOM for a string literal.
func (db *domBuilder) buildStringLiteral(node compilergraph.GraphNode) codedom.Expression {
stringValueStr := node.Get(parser.NodeStringLiteralExpressionValue)
if stringValueStr[0] == '`' {
unquoted := stringValueStr[1 : len(stringValueStr)-1]
stringValueStr = strconv.Quote(unquoted)
}
return codedom.NominalWrapping(codedom.LiteralValue(stringValueStr, node), db.scopegraph.TypeGraph().StringType(), node)
}
示例5: buildStreamMemberAccessExpression
// buildStreamMemberAccessExpression builds the CodeDOM for a stream member access expression (*.)
func (db *domBuilder) buildStreamMemberAccessExpression(node compilergraph.GraphNode) codedom.Expression {
childExpr := db.getExpression(node, parser.NodeMemberAccessChildExpr)
memberName := codedom.LiteralValue("'"+node.Get(parser.NodeMemberAccessIdentifier)+"'", node)
return codedom.RuntimeFunctionCall(codedom.StreamMemberAccessFunction,
[]codedom.Expression{childExpr, memberName},
node,
)
}
示例6: buildVarStatement
// buildVarStatement builds the CodeDOM for a variable statement.
func (db *domBuilder) buildVarStatement(node compilergraph.GraphNode) codedom.Statement {
name := node.Get(parser.NodeVariableStatementName)
initExpr, _ := db.tryGetExpression(node, parser.NodeVariableStatementExpression)
if initExpr == nil {
// If no init expression was specified, then the variable is initialized to null.
initExpr = codedom.LiteralValue("null", node)
}
return codedom.VarDefinitionWithInit(name, initExpr, node)
}
示例7: scopeMemberAccessExpression
// scopeMemberAccessExpression scopes a member access expression in the SRG.
func (sb *scopeBuilder) scopeMemberAccessExpression(node compilergraph.GraphNode, context scopeContext) proto.ScopeInfo {
// Get the scope of the child expression.
childScope := sb.getScope(node.GetNode(parser.NodeMemberAccessChildExpr), context)
if !childScope.GetIsValid() {
return newScope().Invalid().GetScope()
}
memberName := node.Get(parser.NodeMemberAccessIdentifier)
module := compilercommon.InputSource(node.Get(parser.NodePredicateSource))
switch childScope.GetKind() {
case proto.ScopeKind_VALUE:
childType := childScope.ResolvedTypeRef(sb.sg.tdg)
if childType.IsNullable() {
sb.decorateWithError(node, "Cannot access name '%v' under nullable type '%v'. Please use the ?. operator to ensure type safety.", memberName, childType)
return newScope().Invalid().GetScope()
}
typeMember, rerr := childType.ResolveAccessibleMember(memberName, module, typegraph.MemberResolutionInstance)
if rerr != nil {
sb.decorateWithError(node, "%v", rerr)
return newScope().Invalid().GetScope()
}
memberScope := sb.getNamedScopeForMember(typeMember)
context.staticDependencyCollector.checkNamedScopeForDependency(memberScope)
return newScope().ForNamedScopeUnderType(memberScope, childType, context).GetScope()
case proto.ScopeKind_GENERIC:
namedScope, _ := sb.getNamedScopeForScope(childScope)
sb.decorateWithError(node, "Cannot attempt member access of '%v' under %v %v, as it is generic without specification", memberName, namedScope.Title(), namedScope.Name())
return newScope().Invalid().GetScope()
case proto.ScopeKind_STATIC:
staticType := childScope.StaticTypeRef(sb.sg.tdg)
namedScope, _ := sb.getNamedScopeForScope(childScope)
memberScope, rerr := namedScope.ResolveStaticMember(memberName, module, staticType)
if rerr != nil {
sb.decorateWithError(node, "%v", rerr)
return newScope().Invalid().GetScope()
}
return newScope().ForNamedScopeUnderType(memberScope, staticType, context).GetScope()
default:
panic("Unknown scope kind")
}
return newScope().Invalid().GetScope()
}
示例8: scopeStreamMemberAccessExpression
// scopeStreamMemberAccessExpression scopes a stream member access expression in the SRG.
func (sb *scopeBuilder) scopeStreamMemberAccessExpression(node compilergraph.GraphNode, context scopeContext) proto.ScopeInfo {
// Get the scope of the child expression.
childScope := sb.getScope(node.GetNode(parser.NodeMemberAccessChildExpr), context)
if !childScope.GetIsValid() {
return newScope().Invalid().GetScope()
}
memberName := node.Get(parser.NodeMemberAccessIdentifier)
module := compilercommon.InputSource(node.Get(parser.NodePredicateSource))
switch childScope.GetKind() {
case proto.ScopeKind_VALUE:
childType := childScope.ResolvedTypeRef(sb.sg.tdg)
// Ensure the child type is a stream.
generics, serr := childType.CheckConcreteSubtypeOf(sb.sg.tdg.StreamType())
if serr != nil {
sb.decorateWithError(node, "Cannot attempt stream access of name '%v' under non-stream type '%v': %v", memberName, childType, serr)
return newScope().Invalid().GetScope()
}
valueType := generics[0]
typeMember, rerr := valueType.ResolveAccessibleMember(memberName, module, typegraph.MemberResolutionInstance)
if rerr != nil {
sb.decorateWithError(node, "%v", rerr)
return newScope().Invalid().GetScope()
}
memberScope := sb.getNamedScopeForMember(typeMember)
context.staticDependencyCollector.checkNamedScopeForDependency(memberScope)
return newScope().ForNamedScopeUnderModifiedType(memberScope, valueType, makeStream, context).GetScope()
case proto.ScopeKind_GENERIC:
namedScope, _ := sb.getNamedScopeForScope(childScope)
sb.decorateWithError(node, "Cannot attempt stream member access of '%v' under %v %v, as it is generic without specification", memberName, namedScope.Title(), namedScope.Name())
return newScope().Invalid().GetScope()
case proto.ScopeKind_STATIC:
namedScope, _ := sb.getNamedScopeForScope(childScope)
sb.decorateWithError(node, "Cannot attempt stream member access of '%v' under %v %v, as it is a static type", memberName, namedScope.Title(), namedScope.Name())
return newScope().Invalid().GetScope()
default:
panic("Unknown scope kind")
}
return newScope().Invalid().GetScope()
}
示例9: scopeNumericLiteralExpression
// scopeNumericLiteralExpression scopes a numeric literal expression in the SRG.
func (sb *scopeBuilder) scopeNumericLiteralExpression(node compilergraph.GraphNode, context scopeContext) proto.ScopeInfo {
numericValueStr := node.Get(parser.NodeNumericLiteralExpressionValue)
_, isNotInt := strconv.ParseInt(numericValueStr, 0, 64)
if isNotInt == nil {
return newScope().
Valid().
Resolving(sb.sg.tdg.NewTypeReference(sb.sg.tdg.IntType())).
GetScope()
} else {
return newScope().
Valid().
Resolving(sb.sg.tdg.NewTypeReference(sb.sg.tdg.FloatType())).
GetScope()
}
}
示例10: FindNameInScope
// FindNameInScope finds the given name accessible from the scope under which the given node exists, if any.
func (g *SRG) FindNameInScope(name string, node compilergraph.GraphNode) (SRGScopeOrImport, bool) {
// Attempt to resolve the name as pointing to a parameter, var statement, loop var or with var.
srgNode, srgNodeFound := g.findAddedNameInScope(name, node)
if srgNodeFound {
return SRGNamedScope{srgNode, g}, true
}
// If still not found, try to resolve as a type or import.
nodeSource := node.Get(parser.NodePredicateSource)
parentModule, parentModuleFound := g.FindModuleBySource(compilercommon.InputSource(nodeSource))
if !parentModuleFound {
panic(fmt.Sprintf("Missing module for source %v", nodeSource))
}
// Try to resolve as a local member.
srgTypeOrMember, typeOrMemberFound := parentModule.FindTypeOrMemberByName(name, ModuleResolveAll)
if typeOrMemberFound {
return SRGNamedScope{srgTypeOrMember.GraphNode, g}, true
}
// Try to resolve as an imported member.
localImportNode, localImportFound := parentModule.findImportWithLocalName(name)
if localImportFound {
// Retrieve the package for the imported member.
packageInfo := g.getPackageForImport(localImportNode)
resolutionName := localImportNode.Get(parser.NodeImportPredicateSubsource)
// If an SRG package, then continue with the resolution. Otherwise,
// we return a named scope that says that the name needs to be furthered
// resolved in the package by the type graph.
if packageInfo.IsSRGPackage() {
packageTypeOrMember, packagetypeOrMemberFound := packageInfo.FindTypeOrMemberByName(resolutionName)
if packagetypeOrMemberFound {
return SRGNamedScope{packageTypeOrMember.GraphNode, g}, true
}
}
return SRGExternalPackageImport{packageInfo.packageInfo, resolutionName, g}, true
}
// Try to resolve as an imported package.
importNode, importFound := parentModule.findImportByPackageName(name)
if importFound {
return SRGNamedScope{importNode, g}, true
}
return SRGNamedScope{}, false
}
示例11: scopeIdentifierExpression
// scopeIdentifierExpression scopes an identifier expression in the SRG.
func (sb *scopeBuilder) scopeIdentifierExpression(node compilergraph.GraphNode, context scopeContext) proto.ScopeInfo {
name := node.Get(parser.NodeIdentifierExpressionName)
if name == ANONYMOUS_REFERENCE {
// Make sure this node is under an assignment of some kind.
var found = false
for _, predicate := range ALLOWED_ANONYMOUS {
if _, ok := node.TryGetIncomingNode(predicate); ok {
found = true
break
}
}
if !found {
sb.decorateWithError(node, "Anonymous identifier '_' cannot be used as a value")
return newScope().Invalid().GetScope()
}
return newScope().ForAnonymousScope(sb.sg.tdg).GetScope()
}
// Lookup the name given, starting at the location of the current node.
namedScope, rerr := sb.lookupNamedScope(name, node)
if rerr != nil {
sb.decorateWithError(node, "%v", rerr)
return newScope().Invalid().GetScope()
}
// Ensure that the named scope has a valid type.
if !namedScope.IsValid(context) {
return newScope().Invalid().GetScope()
}
// Warn if we are accessing an assignable value under an async function, as it will be executing
// in a different context.
if namedScope.IsAssignable() && namedScope.UnderModule() {
srgImpl, found := context.getParentContainer(sb.sg.srg)
if found && srgImpl.ContainingMember().IsAsyncFunction() {
sb.decorateWithWarning(node, "%v '%v' is defined outside the async function and will therefore be unique for each call to this function", namedScope.Title(), name)
}
}
context.staticDependencyCollector.checkNamedScopeForDependency(namedScope)
return newScope().ForNamedScope(namedScope, context).GetScope()
}
示例12: FindReferencesInScope
// FindReferencesInScope finds all identifier expressions that refer to the given name, under the given
// scope.
func (g *SRG) FindReferencesInScope(name string, node compilergraph.GraphNode) compilergraph.NodeIterator {
// Note: This filter ensures that the name is accessible in the scope of the given node by checking that
// the node referencing the name is contained by the given node.
containingFilter := func(q compilergraph.GraphQuery) compilergraph.Query {
startRune := node.GetValue(parser.NodePredicateStartRune).Int()
endRune := node.GetValue(parser.NodePredicateEndRune).Int()
return q.
HasWhere(parser.NodePredicateStartRune, compilergraph.WhereGT, startRune).
HasWhere(parser.NodePredicateEndRune, compilergraph.WhereLT, endRune)
}
return g.layer.StartQuery(name).
In(parser.NodeIdentifierExpressionName).
IsKind(parser.NodeTypeIdentifierExpression).
Has(parser.NodePredicateSource, node.Get(parser.NodePredicateSource)).
FilterBy(containingFilter).
BuildNodeIterator()
}
示例13: scopeStructuralNewExpressionEntry
// scopeStructuralNewExpressionEntry scopes a single entry in a structural new expression.
func (sb *scopeBuilder) scopeStructuralNewExpressionEntry(node compilergraph.GraphNode, context scopeContext) proto.ScopeInfo {
parentNode := node.GetIncomingNode(parser.NodeStructuralNewExpressionChildEntry)
parentExprScope := sb.getScope(parentNode.GetNode(parser.NodeStructuralNewTypeExpression), context)
parentType := parentExprScope.StaticTypeRef(sb.sg.tdg)
if parentExprScope.GetKind() == proto.ScopeKind_VALUE {
parentType = parentExprScope.ResolvedTypeRef(sb.sg.tdg)
}
entryName := node.Get(parser.NodeStructuralNewEntryKey)
// Get the scope for the value.
valueScope := sb.getScope(node.GetNode(parser.NodeStructuralNewEntryValue), context)
if !valueScope.GetIsValid() {
return newScope().Invalid().GetScope()
}
// Lookup the member associated with the entry name.
module := compilercommon.InputSource(node.Get(parser.NodePredicateSource))
member, rerr := parentType.ResolveAccessibleMember(entryName, module, typegraph.MemberResolutionInstance)
if rerr != nil {
sb.decorateWithError(node, "%v", rerr)
return newScope().Invalid().GetScope()
}
// Ensure the member is assignable.
if member.IsReadOnly() {
sb.decorateWithError(node, "%v %v under type %v is read-only", member.Title(), member.Name(), parentType)
return newScope().Invalid().GetScope()
}
// Get the member's assignable type, transformed under the parent type, and ensure it is assignable
// from the type of the value.
assignableType := member.AssignableType().TransformUnder(parentType)
valueType := valueScope.ResolvedTypeRef(sb.sg.tdg)
if aerr := valueType.CheckSubTypeOf(assignableType); aerr != nil {
sb.decorateWithError(node, "Cannot assign value of type %v to %v %v: %v", valueType, member.Title(), member.Name(), aerr)
return newScope().Invalid().GetScope()
}
return newScope().ForNamedScope(sb.getNamedScopeForMember(member), context).Valid().GetScope()
}
示例14: scopeBinaryExpression
// scopeBinaryExpression scopes a binary expression in the SRG.
func (sb *scopeBuilder) scopeBinaryExpression(node compilergraph.GraphNode, opName string, context scopeContext) *scopeInfoBuilder {
// Get the scope of the left and right expressions.
leftScope := sb.getScope(node.GetNode(parser.NodeBinaryExpressionLeftExpr), context)
rightScope := sb.getScope(node.GetNode(parser.NodeBinaryExpressionRightExpr), context)
// Ensure that both scopes are valid.
if !leftScope.GetIsValid() || !rightScope.GetIsValid() {
return newScope().Invalid()
}
// Ensure that both scopes have the same type.
leftType := leftScope.ResolvedTypeRef(sb.sg.tdg)
rightType := rightScope.ResolvedTypeRef(sb.sg.tdg)
if leftType != rightType {
sb.decorateWithError(node, "Operator '%v' requires operands of the same type. Found: '%v' and '%v'", opName, leftType, rightType)
return newScope().Invalid()
}
// Ensure that the operator exists under the resolved type.
module := compilercommon.InputSource(node.Get(parser.NodePredicateSource))
operator, rerr := leftType.ResolveAccessibleMember(opName, module, typegraph.MemberResolutionOperator)
if rerr != nil {
sb.decorateWithError(node, "Operator '%v' is not defined on type '%v'", opName, leftType)
return newScope().Invalid()
}
returnType, _ := operator.ReturnType()
// Check for nullable values.
if leftType.NullValueAllowed() {
sb.decorateWithError(node, "Cannot invoke operator '%v' on nullable type '%v'", opName, leftType)
return newScope().Invalid().CallsOperator(operator).Resolving(returnType.TransformUnder(leftType))
}
if rightType.NullValueAllowed() {
sb.decorateWithError(node, "Cannot invoke operator '%v' on nullable type '%v'", opName, rightType)
return newScope().Invalid().CallsOperator(operator).Resolving(returnType.TransformUnder(leftType))
}
return newScope().Valid().CallsOperator(operator).Resolving(returnType.TransformUnder(leftType))
}
示例15: scopeStructuralNewTypeExpression
// scopeStructuralNewTypeExpression scopes a structural new expression for constructing a new instance
// of a structural or class type.
func (sb *scopeBuilder) scopeStructuralNewTypeExpression(node compilergraph.GraphNode, childScope *proto.ScopeInfo, context scopeContext) proto.ScopeInfo {
// Retrieve the static type.
staticTypeRef := childScope.StaticTypeRef(sb.sg.tdg)
// Ensure that the static type is a struct OR it is a class with an accessible 'new'.
staticType := staticTypeRef.ReferredType()
switch staticType.TypeKind() {
case typegraph.ClassType:
// Classes can only be constructed structurally if they are in the same module as this call.
// Otherwise, an exported constructor must be used.
module := compilercommon.InputSource(node.Get(parser.NodePredicateSource))
_, rerr := staticTypeRef.ResolveAccessibleMember("new", module, typegraph.MemberResolutionStatic)
if rerr != nil {
sb.decorateWithError(node, "Cannot structurally construct type %v, as it is imported from another module", staticTypeRef)
return newScope().Invalid().Resolving(staticTypeRef).GetScope()
}
case typegraph.StructType:
// Structs can be constructed by anyone, assuming that their members are all exported.
// That check occurs below.
break
default:
sb.decorateWithError(node, "Cannot structurally construct type %v", staticTypeRef)
return newScope().Invalid().Resolving(staticTypeRef).GetScope()
}
encountered, isValid := sb.scopeStructuralNewEntries(node, context)
if !isValid {
return newScope().Invalid().Resolving(staticTypeRef).GetScope()
}
// Ensure that all required entries are present.
for _, field := range staticType.RequiredFields() {
if _, ok := encountered[field.Name()]; !ok {
isValid = false
sb.decorateWithError(node, "Non-nullable %v '%v' is required to construct type %v", field.Title(), field.Name(), staticTypeRef)
}
}
return newScope().IsValid(isValid).Resolving(staticTypeRef).GetScope()
}