本文整理汇总了Golang中go/ast.BlockStmt类的典型用法代码示例。如果您正苦于以下问题:Golang BlockStmt类的具体用法?Golang BlockStmt怎么用?Golang BlockStmt使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了BlockStmt类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: funcBody
// Sets multiLine to true if the function body spans multiple lines.
func (p *printer) funcBody(b *ast.BlockStmt, headerSize int, isLit bool, multiLine *bool) {
if b == nil {
return
}
p.nesting++
defer func() {
p.nesting--
}()
if p.isOneLineFunc(b, headerSize) {
sep := vtab
if isLit {
sep = blank
}
p.print(sep, b.Pos(), token.LBRACE)
if len(b.List) > 0 {
p.print(blank)
for i, s := range b.List {
if i > 0 {
p.print(token.SEMICOLON, blank)
}
p.stmt(s, i == len(b.List)-1, ignoreMultiLine)
}
p.print(blank)
}
p.print(b.Rbrace, token.RBRACE)
return
}
p.print(blank)
p.block(b, 1)
*multiLine = true
}
开发者ID:GNA-SERVICES-INC,项目名称:MoNGate,代码行数:35,代码来源:nodes.go
示例2: rewriteFnWithRecovers
func rewriteFnWithRecovers(body *ast.BlockStmt, fnType *ast.FuncType) (wrapped *ast.FuncLit) {
// The formatting of the channel declaration is ugly, but it's presented this way here to show how it will look in the actual output.
// As far as I know, I would need to set the token.Pos values for the left and right braces of the struct and interface type literals
// in order to get them on one line, but I don't think I can do that without computing all of the other token.Pos values for everything
// else I generate.
// TODO: These identifiers will probably conflict if there is a nested function that also has unnamed outputs. Should probably make a better gensym.
outputDecls, outputs := inputsOrOutputs(fnType.Results, idents.result)
if len(outputs) > 0 {
body.List = astPrintf(`%s = func() (%s) {%s}()`, outputs, fnType.Results, body.List)
}
body.List = astPrintf(`
{{%s}}
_r := make(chan chan interface {
})
recovers, panicChan := godebug.EnterFuncWithRecovers(_r, func(ctx *godebug.Context) {
%s
})
for recoverChan := range recovers {
recoverChan <- recover()
}
if panicVal, ok := <-panicChan; ok {
panic(panicVal)
}
{{return %s}}`, outputDecls, body.List, outputs)
body.Rbrace = token.NoPos // without this I was getting extra whitespace at the end of the function
return wrapped
}
开发者ID:ricardo-rossi,项目名称:godebug,代码行数:27,代码来源:gen.go
示例3: labels
// labels checks correct label use in body.
func (check *Checker) labels(body *ast.BlockStmt) {
// set of all labels in this body
all := NewScope(nil, body.Pos(), body.End(), "label")
fwdJumps := check.blockBranches(all, nil, nil, body.List)
// If there are any forward jumps left, no label was found for
// the corresponding goto statements. Either those labels were
// never defined, or they are inside blocks and not reachable
// for the respective gotos.
for _, jmp := range fwdJumps {
var msg string
name := jmp.Label.Name
if alt := all.Lookup(name); alt != nil {
msg = "goto %s jumps into block"
alt.(*Label).used = true // avoid another error
} else {
msg = "label %s not declared"
}
check.errorf(jmp.Label.Pos(), msg, name)
}
// spec: "It is illegal to define a label that is never used."
for _, obj := range all.elems {
if lbl := obj.(*Label); !lbl.used {
check.softErrorf(lbl.pos, "label %s declared but not used", lbl.name)
}
}
}
开发者ID:Greentor,项目名称:go,代码行数:30,代码来源:labels.go
示例4: parseBlock
func (p *parser) parseBlock(n *parse.Node, scope *ast.Scope) *ast.BlockStmt {
block := ast.BlockStmt{
Lbrace: token.Pos(n.Child(0).Pos()),
Rbrace: token.Pos(n.LastChild().Pos()),
}
eachListItem(stmt, n.Child(1), func(item *parse.Node) {
block.List = append(block.List, p.parseStmt(item))
})
return &block
}
开发者ID:h12w,项目名称:gombi,代码行数:10,代码来源:parser.go
示例5: createBlockMetadata
func (c *compiler) createBlockMetadata(stmt *ast.BlockStmt) llvm.DebugDescriptor {
uniqueId++
file := c.fileset.File(stmt.Pos())
fd := llvm.FileDescriptor(file.Name())
return &llvm.BlockDescriptor{
File: &fd,
Line: uint32(file.Line(stmt.Pos())),
Context: c.currentDebugContext(),
Id: uniqueId,
}
}
开发者ID:quarnster,项目名称:llgo,代码行数:11,代码来源:debug.go
示例6: block
// block prints an *ast.BlockStmt; it always spans at least two lines.
func (p *printer) block(s *ast.BlockStmt, indent int, moveComments bool) {
if moveComments {
p.print(p.beforeComment(s.Pos()))
} else {
p.print(s.Pos())
}
p.print(token.LBRACE)
p.stmtList(s.List, indent)
p.linebreak(s.Rbrace.Line, 1, maxStmtNewlines, ignore, true)
p.print(s.Rbrace, token.RBRACE)
}
开发者ID:lougxing,项目名称:golang-china,代码行数:12,代码来源:nodes.go
示例7: lastComment
// lastComment returns the last comment inside the provided block.
func lastComment(b *ast.BlockStmt, c []*ast.CommentGroup) (i int, last *ast.CommentGroup) {
pos, end := b.Pos(), b.End()
for j, cg := range c {
if cg.Pos() < pos {
continue
}
if cg.End() > end {
break
}
i, last = j, cg
}
return
}
开发者ID:ZeusbasePython,项目名称:appscale,代码行数:14,代码来源:example.go
示例8: finalizeLoop
func (v *visitor) finalizeLoop(pos token.Pos, body *ast.BlockStmt) {
if body == nil {
return
}
line := pos2line(pos)
if len(v.newIdents) == 0 {
call := newCall(idents.godebug, "Line", ast.NewIdent(idents.ctx), ast.NewIdent(v.scopeVar), newInt(line))
body.List = append(body.List, &ast.ExprStmt{X: call})
} else {
body.List = append([]ast.Stmt{
astPrintf(`godebug.Line(ctx, scope, %s)`, strconv.Itoa(line))[0],
newDeclareCall(idents.scope, v.newIdents),
}, body.List...)
}
}
开发者ID:ricardo-rossi,项目名称:godebug,代码行数:15,代码来源:gen.go
示例9: trimBlock
func (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt {
if !lp.trim(stmt) {
return lp.emptyBlock(stmt)
}
stmt.Rbrace = stmt.Lbrace
return stmt
}
开发者ID:9cc9,项目名称:dea_ng,代码行数:7,代码来源:printer.go
示例10: New
// New returns a new control-flow graph for the specified function body,
// which must be non-nil.
//
// The CFG builder calls mayReturn to determine whether a given function
// call may return. For example, calls to panic, os.Exit, and log.Fatal
// do not return, so the builder can remove infeasible graph edges
// following such calls. The builder calls mayReturn only for a
// CallExpr beneath an ExprStmt.
func New(body *ast.BlockStmt, mayReturn func(*ast.CallExpr) bool) *CFG {
b := builder{
mayReturn: mayReturn,
cfg: new(CFG),
}
b.current = b.newBlock("entry")
b.stmt(body)
// Does control fall off the end of the function's body?
// Make implicit return explicit.
if b.current != nil && !b.current.unreachable {
b.add(&ast.ReturnStmt{
Return: body.End() - 1,
})
}
return b.cfg
}
开发者ID:Xiahl1990,项目名称:go,代码行数:26,代码来源:cfg.go
示例11: funcBody
func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body *ast.BlockStmt) {
if trace {
if name == "" {
name = "<function literal>"
}
fmt.Printf("--- %s: %s {\n", name, sig)
defer fmt.Println("--- <end>")
}
// set function scope extent
sig.scope.pos = body.Pos()
sig.scope.end = body.End()
// save/restore current context and setup function context
// (and use 0 indentation at function start)
defer func(ctxt context, indent int) {
check.context = ctxt
check.indent = indent
}(check.context, check.indent)
check.context = context{
decl: decl,
scope: sig.scope,
sig: sig,
}
check.indent = 0
check.stmtList(0, body.List)
if check.hasLabel {
check.labels(body)
}
if sig.results.Len() > 0 && !check.isTerminating(body, "") {
check.error(body.Rbrace, "missing return")
}
// spec: "Implementation restriction: A compiler may make it illegal to
// declare a variable inside a function body if the variable is never used."
// (One could check each scope after use, but that distributes this check
// over several places because CloseScope is not always called explicitly.)
check.usage(sig.scope)
}
开发者ID:duhaibo0404,项目名称:go-1,代码行数:42,代码来源:stmt.go
示例12: filterBlock
// filterBlocks keeps the statements that are need to calculate MappedCells.
func filterBlock(blk *ast.BlockStmt, filterIDs map[string]bool,
imports map[string]string) (*ast.BlockStmt, []dictKey) {
dicts := dictionaries(blk, imports)
usedDks := make(map[dictKey]bool)
filtered := make([]ast.Stmt, 0, len(blk.List))
for i := len(blk.List) - 1; i >= 0; i-- {
switch s := blk.List[i].(type) {
// TODO(soheil): Support switches.
case *ast.SwitchStmt:
// TODO(soheil): Add support for ifs.
case *ast.IfStmt:
default:
// TODO(soheil): It's actually more complicated that. What about
// functional calls, what about multiple return values, ...?
dks, yes := accessesDict(s, dicts)
if yes {
for _, dk := range dks {
filterIDs[dk.k] = true
usedDks[dk] = true
}
continue
}
dirty := false
rIDs, wIDs := ids(s)
for _, id := range wIDs {
if filterIDs[id] {
dirty = true
break
}
}
if !dirty {
continue
}
for _, id := range rIDs {
filterIDs[id] = true
}
filtered = append([]ast.Stmt{s}, filtered...)
}
}
blk.List = filtered
keys := make([]dictKey, 0, len(usedDks))
for dk, _ := range usedDks {
keys = append(keys, dk)
}
return blk, keys
}
开发者ID:jyzhe,项目名称:beehive,代码行数:55,代码来源:generator.go
示例13: bodySize
// bodySize is like nodeSize but it is specialized for *ast.BlockStmt's.
func (p *printer) bodySize(b *ast.BlockStmt, maxSize int) int {
pos1 := b.Pos()
pos2 := b.Rbrace
if pos1.IsValid() && pos2.IsValid() && p.lineFor(pos1) != p.lineFor(pos2) {
// opening and closing brace are on different lines - don't make it a one-liner
return maxSize + 1
}
if len(b.List) > 5 || p.commentBefore(p.posFor(pos2)) {
// too many statements or there is a comment inside - don't make it a one-liner
return maxSize + 1
}
// otherwise, estimate body size
bodySize := 0
for i, s := range b.List {
if i > 0 {
bodySize += 2 // space for a semicolon and blank
}
bodySize += p.nodeSize(s, maxSize)
}
return bodySize
}
开发者ID:ZeusbasePython,项目名称:appscale,代码行数:22,代码来源:nodes.go
示例14: rewriteTestFuncAsItStatement
/*
* Given a test func named TestDoesSomethingNeat, rewrites it as
* It("does something neat", func() { __test_body_here__ }) and adds it
* to the Describe's list of statements
*/
func rewriteTestFuncAsItStatement(testFunc *ast.FuncDecl, rootNode *ast.File, describe *ast.CallExpr) {
var funcIndex int = -1
for index, child := range rootNode.Decls {
if child == testFunc {
funcIndex = index
break
}
}
if funcIndex < 0 {
panic(fmt.Sprintf("Assert failed: Error finding index for test node %s\n", testFunc.Name.Name))
}
var block *ast.BlockStmt = blockStatementFromDescribe(describe)
block.List = append(block.List, createItStatementForTestFunc(testFunc))
replaceTestingTsWithGinkgoT(block, namedTestingTArg(testFunc))
// remove the old test func from the root node's declarations
rootNode.Decls = append(rootNode.Decls[:funcIndex], rootNode.Decls[funcIndex+1:]...)
return
}
开发者ID:COLDTURNIP,项目名称:kubernetes,代码行数:26,代码来源:testfile_rewriter.go
示例15: isOneLineFunc
func (p *printer) isOneLineFunc(b *ast.BlockStmt, headerSize int) bool {
pos1 := b.Pos()
pos2 := b.Rbrace
if pos1.IsValid() && pos2.IsValid() && pos1.Line != pos2.Line {
// opening and closing brace are on different lines - don't make it a one-liner
return false
}
if len(b.List) > 5 || p.commentBefore(pos2) {
// too many statements or there is a comment inside - don't make it a one-liner
return false
}
// otherwise, estimate body size
const maxSize = 100
bodySize := 0
for i, s := range b.List {
if i > 0 {
bodySize += 2 // space for a semicolon and blank
}
bodySize += p.nodeSize(s, maxSize)
}
return headerSize+bodySize <= maxSize
}
开发者ID:GNA-SERVICES-INC,项目名称:MoNGate,代码行数:22,代码来源:nodes.go
示例16: VisitBlockStmt
func (c *compiler) VisitBlockStmt(stmt *ast.BlockStmt, createNewBlock bool) {
c.pushDebugContext(c.createBlockMetadata(stmt))
defer c.popDebugContext()
c.setDebugLine(stmt.Pos())
// This is a little awkward, but it makes dealing with branching easier.
// A free-standing block statement (i.e. one not attached to a control
// statement) will splice in a new block.
var doneBlock llvm.BasicBlock
if createNewBlock {
currBlock := c.builder.GetInsertBlock()
doneBlock = llvm.InsertBasicBlock(currBlock, "")
doneBlock.MoveAfter(currBlock)
newBlock := llvm.InsertBasicBlock(doneBlock, "")
c.builder.CreateBr(newBlock)
c.builder.SetInsertPointAtEnd(newBlock)
}
// Visit each statement in the block. When we have a terminator,
// ignore everything until we get to a labeled statement.
for _, stmt := range stmt.List {
currBlock := c.builder.GetInsertBlock()
in := currBlock.LastInstruction()
if in.IsNil() || in.IsATerminatorInst().IsNil() {
c.VisitStmt(stmt)
} else if _, ok := stmt.(*ast.LabeledStmt); ok {
// FIXME we might end up with a labeled statement
// with no predecessors, due to dead code elimination.
c.VisitStmt(stmt)
}
}
if createNewBlock {
c.maybeImplicitBranch(doneBlock)
c.builder.SetInsertPointAtEnd(doneBlock)
}
}
开发者ID:qioixiy,项目名称:llgo,代码行数:37,代码来源:stmt.go
示例17: funcBody
// Sets multiLine to true if the function body spans multiple lines.
func (p *printer) funcBody(b *ast.BlockStmt, isLit bool, multiLine *bool) {
if b == nil {
return
}
if (oneLineFuncDecls || isLit) && p.isOneLiner(b) {
sep := vtab
if isLit {
sep = blank
}
if len(b.List) > 0 {
p.print(sep, b.Pos(), token.LBRACE, blank)
p.stmt(b.List[0], ignoreMultiLine)
p.print(blank, b.Rbrace, token.RBRACE)
} else {
p.print(sep, b.Pos(), token.LBRACE, b.Rbrace, token.RBRACE)
}
return
}
p.print(blank)
p.block(b, 1)
*multiLine = true
}
开发者ID:8l,项目名称:go-learn,代码行数:25,代码来源:nodes.go
示例18: rewriteStructLiteralAsIdentifierAtTopOfBlock
func rewriteStructLiteralAsIdentifierAtTopOfBlock(newFile *ast.File, literalToReplace *ast.CompositeLit, name string) {
var (
foundStmtNode ast.Stmt
blocksSeen []*ast.BlockStmt
stmtsSeen []ast.Stmt
deleteOriginalStatement bool
newAssignStmtToken = token.DEFINE
)
ast.Inspect(newFile, func(node ast.Node) bool {
switch node := node.(type) {
case *ast.BlockStmt:
if foundStmtNode == nil {
blocksSeen = append(blocksSeen, node)
}
case ast.Stmt:
stmtsSeen = append(stmtsSeen, node)
}
return true
})
var block *ast.BlockStmt
var insertionIndex int
for i := len(blocksSeen) - 1; i >= 0; i-- {
b := blocksSeen[i]
for j, stmt := range b.List {
ast.Inspect(stmt, func(parentNode ast.Node) bool {
switch parentNode := parentNode.(type) {
case *ast.CompositeLit:
if parentNode == literalToReplace {
block = b
insertionIndex = j
return false
}
}
return true
})
}
}
for i := len(stmtsSeen) - 1; i >= 0; i-- {
s := stmtsSeen[i]
ast.Inspect(s, func(node ast.Node) bool {
switch node := node.(type) {
case *ast.CompositeLit:
if node == literalToReplace {
foundStmtNode = s
return false
}
}
return true
})
}
switch foundStmtNode := foundStmtNode.(type) {
case *ast.AssignStmt:
expr := foundStmtNode.Rhs[0]
if expr == literalToReplace {
deleteOriginalStatement = true
switch ident := foundStmtNode.Lhs[0].(type) {
case *ast.Ident:
name = ident.Name
}
if foundStmtNode.Tok == token.ASSIGN {
newAssignStmtToken = token.ASSIGN
}
}
}
lhsExpr := []ast.Expr{ast.NewIdent(name)}
rhsExpr := []ast.Expr{&ast.CompositeLit{Type: literalToReplace.Type}}
block.List = insert(block.List, insertionIndex, ast.AssignStmt{
Lhs: lhsExpr,
Rhs: rhsExpr,
Tok: newAssignStmtToken,
})
insertionIndex++
for _, elt := range literalToReplace.Elts {
keyVal := elt.(*ast.KeyValueExpr)
fieldName := keyVal.Key.(*ast.Ident)
selector := &ast.SelectorExpr{
X: ast.NewIdent(name),
Sel: ast.NewIdent(fieldName.Name),
}
innerLhs := []ast.Expr{selector}
innerRhs := []ast.Expr{keyVal.Value}
block.List = insert(block.List, insertionIndex, ast.AssignStmt{
Lhs: innerLhs,
Rhs: innerRhs,
Tok: token.ASSIGN,
})
//.........这里部分代码省略.........
开发者ID:knolleary,项目名称:cli,代码行数:101,代码来源:rewriter.go
示例19: playExample
// playExample synthesizes a new *ast.File based on the provided
// file with the provided function body as the body of main.
func playExample(file *ast.File, body *ast.BlockStmt) *ast.File {
if !strings.HasSuffix(file.Name.Name, "_test") {
// We don't support examples that are part of the
// greater package (yet).
return nil
}
// Find top-level declarations in the file.
topDecls := make(map[*ast.Object]bool)
for _, decl := range file.Decls {
switch d := decl.(type) {
case *ast.FuncDecl:
topDecls[d.Name.Obj] = true
case *ast.GenDecl:
for _, spec := range d.Specs {
switch s := spec.(type) {
case *ast.TypeSpec:
topDecls[s.Name.Obj] = true
case *ast.ValueSpec:
for _, id := range s.Names {
topDecls[id.Obj] = true
}
}
}
}
}
// Find unresolved identifiers and uses of top-level declarations.
unresolved := make(map[string]bool)
usesTopDecl := false
var inspectFunc func(ast.Node) bool
inspectFunc = func(n ast.Node) bool {
// For selector expressions, only inspect the left hand side.
// (For an expression like fmt.Println, only add "fmt" to the
// set of unresolved names, not "Println".)
if e, ok := n.(*ast.SelectorExpr); ok {
ast.Inspect(e.X, inspectFunc)
return false
}
// For key value expressions, only inspect the value
// as the key should be resolved by the type of the
// composite literal.
if e, ok := n.(*ast.KeyValueExpr); ok {
ast.Inspect(e.Value, inspectFunc)
return false
}
if id, ok := n.(*ast.Ident); ok {
if id.Obj == nil {
unresolved[id.Name] = true
} else if topDecls[id.Obj] {
usesTopDecl = true
}
}
return true
}
ast.Inspect(body, inspectFunc)
if usesTopDecl {
// We don't support examples that are not self-contained (yet).
return nil
}
// Remove predeclared identifiers from unresolved list.
for n := range unresolved {
if predeclaredTypes[n] || predeclaredConstants[n] || predeclaredFuncs[n] {
delete(unresolved, n)
}
}
// Use unresolved identifiers to determine the imports used by this
// example. The heuristic assumes package names match base import
// paths for imports w/o renames (should be good enough most of the time).
namedImports := make(map[string]string) // [name]path
var blankImports []ast.Spec // _ imports
for _, s := range file.Imports {
p, err := strconv.Unquote(s.Path.Value)
if err != nil {
continue
}
n := path.Base(p)
if s.Name != nil {
n = s.Name.Name
switch n {
case "_":
blankImports = append(blankImports, s)
continue
case ".":
// We can't resolve dot imports (yet).
return nil
}
}
if unresolved[n] {
namedImports[n] = p
delete(unresolved, n)
}
}
// If there are other unresolved identifiers, give up because this
// synthesized file is not going to build.
//.........这里部分代码省略.........
开发者ID:ZeusbasePython,项目名称:appscale,代码行数:101,代码来源:example.go
示例20: buildFunction
// buildFunction takes a function Value, a list of parameters, and a body,
// and generates code for the function.
func (c *compiler) buildFunction(f *LLVMValue, context, params, results *types.Tuple, body *ast.BlockStmt) {
if currblock := c.builder.GetInsertBlock(); !currblock.IsNil() {
defer c.builder.SetInsertPointAtEnd(currblock)
}
llvm_fn := llvm.ConstExtractValue(f.LLVMValue(), []uint32{0})
entry := llvm.AddBasicBlock(llvm_fn, "entry")
c.builder.SetInsertPointAtEnd(entry)
// For closures, context is the captured context values.
var paramoffset int
if context != nil {
paramoffset++
// Store the existing values. We're going to temporarily
// replace the values with offsets into the context param.
oldvalues := make([]*LLVMValue, context.Len())
for i := range oldvalues {
v := context.At(i)
oldvalues[i] = c.objectdata[v].Value
}
defer func() {
for i := range oldvalues {
v := context.At(i)
c.objectdata[v].Value = oldvalues[i]
}
}()
// The context parameter is a pointer to a struct
// whose elements are pointers to captured values.
arg0 := llvm_fn.Param(0)
for i := range oldvalues {
v := context.At(i)
argptr := c.builder.CreateStructGEP(arg0, i, "")
argptr = c.builder.CreateLoad(argptr, "")
ptrtyp := oldvalues[i].pointer.Type()
newvalue := c.NewValue(argptr, ptrtyp)
c.objectdata[v].Value = newvalue.makePointee()
}
}
// Bind receiver, arguments and return values to their
// identifiers/objects. We'll store each parameter on the stack so
// they're addressable.
nparams := int(params.Len())
for i := 0; i < nparams; i++ {
v := params.At(i)
name := v.Name()
if !isBlank(name) {
value := llvm_fn.Param(i + paramoffset)
c.newArgStackVar(i+1, f, v, value, name)
}
}
funcstate := &function{LLVMValue: f, results: results}
c.functions.push(funcstate)
hasdefer := hasDefer(funcstate, body)
// Allocate space on the stack for named results.
for i := 0; i < results.Len(); i++ {
v := results.At(i)
name := v.Name()
allocstack := !isBlank(name)
if !allocstack && hasdefer {
c.objectdata[v] = &ObjectData{}
allocstack = true
}
if allocstack {
typ := v.Type()
llvmtyp := c.types.ToLLVM(typ)
c.newStackVar(f, v, llvm.ConstNull(llvmtyp), name)
}
}
// Create the function body.
if hasdefer {
c.makeDeferBlock(funcstate, body)
}
c.VisitBlockStmt(body, false)
c.functions.pop()
c.setDebugLine(body.End())
// If the last instruction in the function is not a terminator, then
// we either have unreachable code or a missing optional return statement
// (the latter case is allowable only for functions without results).
//
// Use GetInsertBlock rather than LastBasicBlock, since the
// last basic block might actually be a "defer" block.
last := c.builder.GetInsertBlock()
if in := last.LastInstruction(); in.IsNil() || in.IsATerminatorInst().IsNil() {
c.builder.SetInsertPointAtEnd(last)
if results.Len() == 0 {
if funcstate.deferblock.IsNil() {
c.builder.CreateRetVoid()
} else {
c.builder.CreateBr(funcstate.deferblock)
}
} else {
//.........这里部分代码省略.........
开发者ID:qioixiy,项目名称:llgo,代码行数:101,代码来源:decl.go
注:本文中的go/ast.BlockStmt类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论