How to use Info method of refactor Package

Best Gauge code snippet using refactor.Info

iworkstepservice.go

Source:iworkstepservice.go Github

copy

Full Screen

...15 "isoft/isoft_iwork_web/models"16 "strings"17 "time"18)19func LoadResourceInfo() *iworkmodels.ParamOutputSchema {20 pos := &iworkmodels.ParamOutputSchema{21 ParamOutputSchemaItems: []iworkmodels.ParamOutputSchemaItem{},22 }23 resources := models.QueryAllResource()24 for _, resource := range resources {25 pos.ParamOutputSchemaItems = append(pos.ParamOutputSchemaItems, iworkmodels.ParamOutputSchemaItem{26 ParamName: resource.ResourceName,27 })28 }29 return pos30}31func LoadWorkInfo() *iworkmodels.ParamOutputSchema {32 pos := &iworkmodels.ParamOutputSchema{33 ParamOutputSchemaItems: []iworkmodels.ParamOutputSchemaItem{},34 }35 works := models.QueryAllWorkInfo(orm.NewOrm())36 for _, work := range works {37 pos.ParamOutputSchemaItems = append(pos.ParamOutputSchemaItems, iworkmodels.ParamOutputSchemaItem{38 ParamName: work.WorkName,39 })40 }41 return pos42}43func LoadGlobalVarInfo() *iworkmodels.ParamOutputSchema {44 pos := &iworkmodels.ParamOutputSchema{45 ParamOutputSchemaItems: []iworkmodels.ParamOutputSchemaItem{},46 }47 globalVars := models.QueryAllGlobalVar()48 for _, globalVar := range globalVars {49 pos.ParamOutputSchemaItems = append(pos.ParamOutputSchemaItems, iworkmodels.ParamOutputSchemaItem{50 ParamName: globalVar.Name,51 })52 }53 return pos54}55func LoadErrorInfo() *iworkmodels.ParamOutputSchema {56 pos := &iworkmodels.ParamOutputSchema{57 ParamOutputSchemaItems: []iworkmodels.ParamOutputSchemaItem{},58 }59 pos.ParamOutputSchemaItems = append(pos.ParamOutputSchemaItems, iworkmodels.ParamOutputSchemaItem{ParamName: "isError"})60 pos.ParamOutputSchemaItems = append(pos.ParamOutputSchemaItems, iworkmodels.ParamOutputSchemaItem{ParamName: "isNoError"})61 pos.ParamOutputSchemaItems = append(pos.ParamOutputSchemaItems, iworkmodels.ParamOutputSchemaItem{ParamName: "errorMsg"})62 pos.ParamOutputSchemaItems = append(pos.ParamOutputSchemaItems, iworkmodels.ParamOutputSchemaItem{ParamName: "insensitiveErrorMsg"})63 return pos64}65// 加载前置节点输出参数66func LoadPreNodeOutputService(serviceArgs map[string]interface{}) (result map[string]interface{}, err error) {67 result = make(map[string]interface{}, 0)68 work_id := serviceArgs["work_id"].(int64)69 work_step_id := serviceArgs["work_step_id"].(int64)70 o := serviceArgs["o"].(orm.Ormer)71 prePosTreeNodeArr := make([]*iworkmodels.TreeNode, 0)72 // 加载 resource 参数73 pos := LoadResourceInfo()74 prePosTreeNodeArr = append(prePosTreeNodeArr, pos.RenderToTreeNodes("$RESOURCE"))75 // 加载 work 参76 pos = LoadWorkInfo()77 prePosTreeNodeArr = append(prePosTreeNodeArr, pos.RenderToTreeNodes("$WORK"))78 // 加载 error 参数79 pos = LoadErrorInfo()80 prePosTreeNodeArr = append(prePosTreeNodeArr, pos.RenderToTreeNodes("$Error"))81 // 加载 globalVar 参数82 pos = LoadGlobalVarInfo()83 prePosTreeNodeArr = append(prePosTreeNodeArr, pos.RenderToTreeNodes("$Global"))84 // 加载前置步骤输出85 if steps, err := models.QueryAllPreStepInfo(work_id, work_step_id, o); err == nil {86 // 当前步骤信息87 currentWorkStep, _ := models.QueryWorkStepInfo(work_id, work_step_id, orm.NewOrm())88 // 所有步骤信息89 allSteps, _ := models.QueryAllWorkStepInfo(work_id, orm.NewOrm())90 parser := &block.BlockParser{Steps: allSteps}91 _, blockStepMapper := parser.ParseToBlockSteps()92 currentBlockStep := blockStepMapper[currentWorkStep.WorkStepId]93 for _, step := range steps {94 // 判断前置 step 在块范围内是否是可访问的,且是否非 defer 步骤95 if block.CheckBlockAccessble(currentBlockStep, step.WorkStepId) && step.IsDefer != "true" {96 pos := node.GetCacheParamOutputSchema(&step)97 prePosTreeNodeArr = append(prePosTreeNodeArr, pos.RenderToTreeNodes("$"+step.WorkStepName))98 }99 }100 }101 // 返回结果102 result["prePosTreeNodeArr"] = prePosTreeNodeArr103 return104}105func GetAllWorkStepInfoService(serviceArgs map[string]interface{}) (result map[string]interface{}, err error) {106 result = make(map[string]interface{}, 0)107 work_id := serviceArgs["work_id"].(int64)108 o := serviceArgs["o"].(orm.Ormer)109 steps, err := models.QueryAllWorkStepInfo(work_id, o)110 if err != nil {111 return nil, err112 }113 result["steps"] = steps114 return115}116func LoadWorkStepInfoService(serviceArgs map[string]interface{}) (result map[string]interface{}, err error) {117 result = make(map[string]interface{}, 0)118 work_id := serviceArgs["work_id"].(int64)119 work_step_id := serviceArgs["work_step_id"].(int64)120 o := serviceArgs["o"].(orm.Ormer)121 // 读取 work_step 信息122 step, err := models.QueryWorkStepInfo(work_id, work_step_id, o)123 if err != nil {124 return nil, err125 }126 var paramMappingsArr []iworkmodels.ParamMapping127 json.Unmarshal([]byte(step.WorkStepParamMapping), &paramMappingsArr)128 result["step"] = step129 result["paramInputSchema"] = node.GetCacheParamInputSchema(&step)130 result["paramOutputSchema"] = node.GetCacheParamOutputSchema(&step)131 result["paramOutputSchemaTreeNode"] = node.GetCacheParamOutputSchema(&step).RenderToTreeNodes("output")132 result["paramMappings"] = paramMappingsArr133 return134}135func CopyWorkStepByWorkStepIdService(serviceArgs map[string]interface{}) error {136 work_id := serviceArgs["work_id"].(int64)137 work_step_id := serviceArgs["work_step_id"].(int64)138 o := serviceArgs["o"].(orm.Ormer)139 step, err := models.QueryOneWorkStep(work_id, work_step_id, o)140 if err != nil {141 return err142 }143 step.Id = 0144 step.WorkStepId = step.WorkStepId + 1145 step.WorkStepName = step.WorkStepName + "_copy"146 return insertWorkStepAfter(work_id, work_step_id, &step, o)147}148func insertWorkStepAfter(work_id, work_step_id int64, step *models.WorkStep, o orm.Ormer) error {149 // 将 work_step_id 之后的所有节点后移一位150 if err := models.BatchChangeWorkStepIdOrder(work_id, work_step_id, "+", o); err != nil {151 return err152 }153 _, err := models.InsertOrUpdateWorkStep(step, o)154 return err155}156func DeleteWorkStepByWorkStepIdService(serviceArgs map[string]interface{}) error {157 work_id := serviceArgs["work_id"].(int64)158 work_step_id := serviceArgs["work_step_id"].(int64)159 o := serviceArgs["o"].(orm.Ormer)160 if step, err := models.QueryWorkStepInfo(work_id, work_step_id, o); err == nil {161 if step.WorkStepType == "work_start" || step.WorkStepType == "work_end" {162 return errors.New("start 节点和 end 节点不能被删除!")163 }164 }165 if err := models.DeleteWorkStepByWorkStepId(work_id, work_step_id, o); err != nil {166 return err167 }168 return nil169}170func WorkStepListService(serviceArgs map[string]interface{}) (result map[string]interface{}, err error) {171 result = make(map[string]interface{}, 0)172 condArr := make(map[string]interface{})173 condArr["work_id"] = serviceArgs["work_id"].(int64)174 o := serviceArgs["o"].(orm.Ormer)175 worksteps, err := models.QueryWorkStep(condArr, o)176 if err != nil {177 return nil, err178 }179 result["worksteps"] = worksteps180 return181}182func AddWorkStepService(serviceArgs map[string]interface{}) error {183 work_id := serviceArgs["work_id"].(int64)184 work_step_id := serviceArgs["work_step_id"].(int64)185 work_step_meta := serviceArgs["work_step_meta"].(string)186 o := serviceArgs["o"].(orm.Ormer)187 // end 节点之后不能添加节点188 if step, err := models.QueryWorkStepInfo(work_id, work_step_id, o); err == nil {189 if step.WorkStepType == "work_end" {190 return errors.New("不能再 end 节点后面添加节点!")191 }192 }193 if strings.HasPrefix(work_step_meta, "work_type__") {194 work_step_type := strings.TrimPrefix(work_step_meta, "work_type__")195 step := models.WorkStep{196 WorkId: work_id,197 WorkStepName: work_step_type + "_" + fmt.Sprintf("%v", time.Now().Unix()),198 WorkStepType: work_step_type,199 WorkStepDesc: "",200 IsDefer: "false", // 默认不延迟执行201 WorkStepIndent: 0, // 默认缩进级别为 0202 WorkStepId: work_step_id + 1,203 CreatedBy: "SYSTEM",204 CreatedTime: time.Now(),205 LastUpdatedBy: "SYSTEM",206 LastUpdatedTime: time.Now(),207 }208 return insertWorkStepAfter(work_id, work_step_id, &step, o)209 } else if strings.HasPrefix(work_step_meta, "work_name__") {210 subWorkName := strings.TrimPrefix(work_step_meta, "work_name__")211 workStepName := strings.Join([]string{iworkconst.NODE_TYPE_WORK_SUB, subWorkName,212 fmt.Sprintf("%v", time.Now().Unix())}, "_")213 step := models.WorkStep{214 WorkId: work_id,215 WorkStepName: workStepName,216 WorkStepType: iworkconst.NODE_TYPE_WORK_SUB,217 WorkStepInput: framework.PrepareEmptyInputForWorkSub(subWorkName).RenderToJson(),218 WorkStepDesc: "",219 IsDefer: "false", // 默认不延迟执行220 WorkStepIndent: 0, // 默认缩进级别为 0221 WorkStepId: work_step_id + 1,222 CreatedBy: "SYSTEM",223 CreatedTime: time.Now(),224 LastUpdatedBy: "SYSTEM",225 LastUpdatedTime: time.Now(),226 }227 if err := insertWorkStepAfter(work_id, work_step_id, &step, o); err == nil {228 // 动态构建输入输出229 BuildDynamic(work_id, step.WorkStepId, step, o)230 } else {231 return err232 }233 }234 return nil235}236// 更改邻近两个节点的顺序237func changeNearWorkStepOrder(work_id, work_step_id int64, o orm.Ormer, nearStepLength int64) error {238 // 获取当前步骤239 step, err := models.QueryOneWorkStep(work_id, work_step_id, o)240 if err != nil {241 return err242 }243 // 获取邻近步骤244 nearStep, err := models.QueryOneWorkStep(work_id, work_step_id-nearStepLength, o)245 if err != nil {246 return err247 }248 if nearStep.WorkStepType == "work_start" || nearStep.WorkStepType == "work_end" {249 return errors.New("start 节点和 end 节点不能移动位置!")250 }251 nearStep.WorkStepId = nearStep.WorkStepId + nearStepLength252 step.WorkStepId = step.WorkStepId - nearStepLength253 // 更新邻近步骤254 if _, err := models.InsertOrUpdateWorkStep(&nearStep, o); err != nil {255 return err256 }257 // 更新当前步骤258 if _, err := models.InsertOrUpdateWorkStep(&step, o); err != nil {259 return err260 }261 return nil262}263func ChangeWorkStepOrderService(serviceArgs map[string]interface{}) error {264 work_id := serviceArgs["work_id"].(int64)265 work_step_id := serviceArgs["work_step_id"].(int64)266 _type := serviceArgs["_type"].(string)267 o := serviceArgs["o"].(orm.Ormer)268 if _type == "up" {269 return changeNearWorkStepOrder(work_id, work_step_id, o, 1)270 } else {271 return changeNearWorkStepOrder(work_id, work_step_id, o, -1)272 }273 return nil274}275func EditWorkStepBaseInfoService(serviceArgs map[string]interface{}) error {276 o := serviceArgs["o"].(orm.Ormer)277 step, err := models.QueryOneWorkStep(serviceArgs["work_id"].(int64), serviceArgs["work_step_id"].(int64), o)278 if err != nil {279 return err280 }281 old_work_step_name := step.WorkStepName282 old_work_step_type := step.WorkStepType283 // 替换成新值284 step.WorkStepName = serviceArgs["work_step_name"].(string)285 step.WorkStepType = serviceArgs["work_step_type"].(string)286 step.WorkStepDesc = serviceArgs["work_step_desc"].(string)287 step.IsDefer = serviceArgs["is_defer"].(string)288 // 变更类型需要置空 input 和 output 参数289 if step.WorkStepType != old_work_step_type {290 step.WorkStepInput = ""291 step.WorkStepOutput = ""292 }293 if _, err := models.InsertOrUpdateWorkStep(&step, o); err != nil {294 return err295 }296 // 级联更改相关联的步骤名称297 if err := ChangeReferencesWorkStepName(step.WorkId, old_work_step_name, step.WorkStepName, o); err != nil {298 return err299 }300 return nil301}302func ChangeReferencesWorkStepName(work_id int64, oldWorkStepName, workStepName string, o orm.Ormer) error {303 if oldWorkStepName == workStepName {304 return nil305 }306 steps, err := models.QueryAllWorkStepInfo(work_id, o)307 if err != nil {308 return err309 }310 for _, step := range steps {311 step.WorkStepInput = strings.Replace(step.WorkStepInput, "$"+oldWorkStepName, "$"+workStepName, -1)312 _, err := models.InsertOrUpdateWorkStep(&step, o)313 if err != nil {314 return err315 }316 }317 return nil318}319func createSubWork(refactor_worksub_name string, o orm.Ormer) (int64, error) {320 // 创建子流程321 subWork := &models.Work{322 WorkName: refactor_worksub_name,323 WorkDesc: "refactor worksub",324 CreatedBy: "SYSTEM",325 CreatedTime: time.Now(),326 LastUpdatedBy: "SYSTEM",327 LastUpdatedTime: time.Now(),328 }329 if _, err := models.InsertOrUpdateWork(subWork, o); err != nil {330 return -1, err331 }332 // 为子流程添加开始和结束节点333 if err := InsertStartEndWorkStepNode(subWork.Id, o); err != nil {334 return -1, err335 }336 return subWork.Id, nil337}338func getRefactorWorkStep(work_id, work_step_id int64, o orm.Ormer) (step models.WorkStep, err error) {339 step, err = models.QueryWorkStepInfo(work_id, int64(work_step_id), o)340 if err != nil {341 return342 }343 if step.WorkStepType == "work_start" || step.WorkStepType == "work_end" {344 return step, errors.New("start 和 end 节点不能重构!")345 }346 return step, nil347}348func refactorSubWork(refactorStep models.WorkStep, subWorkId int64, o orm.Ormer) error {349 // 将子流程 start 节点后面所有的步骤 id 顺序 + 1350 err := models.BatchChangeWorkStepIdOrder(subWorkId, 1, "+", o)351 if err != nil {352 return err353 }354 newStep := models.CopyWorkStepInfo(refactorStep)355 newStep.WorkId = subWorkId356 newStep.WorkStepId = 2357 // 在 2 号步骤位置插入当前步骤358 if _, err := models.InsertOrUpdateWorkStep(newStep, o); err != nil {359 return err360 }361 return nil362}363func refactorCurrentWorkByDelete(refactorStep models.WorkStep, o orm.Ormer) error {364 _serviceArgs := map[string]interface{}{"work_id": refactorStep.WorkId, "work_step_id": refactorStep.WorkStepId, "o": o}365 return DeleteWorkStepByWorkStepIdService(_serviceArgs)366}367func refactorCurrentWorkByChangeToWorkSub(subWorkId int64, refactor_worksub_name string, refactorStep models.WorkStep, o orm.Ormer) error {368 // 修改 refactorStep 的类型369 refactorStep.WorkStepType = "work_sub"370 // 修改 refactorStep 的 subWorkId371 refactorStep.WorkSubId = subWorkId372 // 修改 refactorStep 的 WorkStepInput373 factory := node.WorkStepFactory{WorkStep: &refactorStep}374 inputSchema := factory.GetDefaultParamInputSchema()375 for index, item := range inputSchema.ParamInputSchemaItems {376 if item.ParamName == iworkconst.STRING_PREFIX+"work_sub" {377 item.ParamValue = fmt.Sprintf("$WORK.%s;", refactor_worksub_name)378 inputSchema.ParamInputSchemaItems[index] = item379 break380 }381 }382 refactorStep.WorkStepOutput = (&iworkmodels.ParamOutputSchema{}).RenderToJson() // 输出置空383 refactorStep.WorkStepInput = inputSchema.RenderToJson()384 if _, err := models.InsertOrUpdateWorkStep(&refactorStep, o); err != nil {385 return err386 }387 return nil388}389func BatchChangeIndentService(serviceArgs map[string]interface{}) error {390 work_id := serviceArgs["work_id"].(int64)391 mod := serviceArgs["mod"].(string)392 indent_work_step_ids := serviceArgs["indent_work_step_ids"].(string)393 o := serviceArgs["o"].(orm.Ormer)394 var indent_work_step_id_arr []int395 json.Unmarshal([]byte(indent_work_step_ids), &indent_work_step_id_arr)396 for _, work_step_id := range indent_work_step_id_arr {397 if step, err := models.QueryWorkStepInfo(work_id, int64(work_step_id), o); err == nil {398 if mod == "left" && step.WorkStepIndent > 0 {399 step.WorkStepIndent -= 1400 } else if mod == "right" {401 step.WorkStepIndent += 1402 }403 if _, err := models.InsertOrUpdateWorkStep(&step, o); err != nil {404 return err405 }406 }407 }408 return nil409}410func RefactorWorkStepInfoService(serviceArgs map[string]interface{}) error {411 // 获取参数412 work_id := serviceArgs["work_id"].(int64)413 refactor_worksub_name := serviceArgs["refactor_worksub_name"].(string)414 refactor_work_step_ids := serviceArgs["refactor_work_step_ids"].(string)415 o := serviceArgs["o"].(orm.Ormer)416 var refactor_work_step_id_arr []int417 json.Unmarshal([]byte(refactor_work_step_ids), &refactor_work_step_id_arr)418 // 校验 refactor_work_step_id_arr 是否连续419 if refactor_work_step_id_arr[len(refactor_work_step_id_arr)-1]-refactor_work_step_id_arr[0] != len(refactor_work_step_id_arr)-1 {420 return errors.New("refactor workStepId 必须是连续的!")421 }422 // 创建子流程423 subWorkId, err := createSubWork(refactor_worksub_name, o)424 if err != nil {425 return err426 }427 // 循环移动子步骤,移动一个删除一个,反转slice,从 id 大的开始执行428 for index, work_step_id := range datatypeutil.ReverseSlice(refactor_work_step_id_arr).([]int) {429 refactorStep, err := getRefactorWorkStep(work_id, int64(work_step_id), o)430 if err != nil {431 return err432 }433 if err := refactorSubWork(refactorStep, subWorkId, o); err != nil {434 return err435 }436 if index == len(refactor_work_step_id_arr)-1 {437 // 最后一次操作不再是删除,而是替换成子节点438 if err := refactorCurrentWorkByChangeToWorkSub(subWorkId, refactor_worksub_name, refactorStep, o); err != nil {439 return err440 }441 } else {442 // 删除节点443 if err := refactorCurrentWorkByDelete(refactorStep, o); err != nil {444 return err445 }446 }447 }448 return nil449}450func formatChecker(paramInputSchema *iworkmodels.ParamInputSchema) error {451 for _, item := range paramInputSchema.ParamInputSchemaItems {452 formatChecker := iworkvalid.ParamValueFormatChecker{453 ParamName: item.ParamName,454 PureText: item.PureText,455 ParamValue: item.ParamValue,456 }457 if ok, err := formatChecker.Check(); !ok && err != nil {458 return err459 }460 }461 return nil462}463func EditWorkStepParamInfo(serviceArgs map[string]interface{}) error {464 var (465 step models.WorkStep466 err error467 )468 work_id := serviceArgs["work_id"].(int64)469 work_step_id := serviceArgs["work_step_id"].(int64)470 paramInputSchemaStr := serviceArgs["paramInputSchemaStr"].(string)471 o := serviceArgs["o"].(orm.Ormer)472 if step, err = models.QueryOneWorkStep(work_id, work_step_id, o); err != nil {473 return err474 }475 paramInputSchema, _ := iworkmodels.ParseToParamInputSchema(paramInputSchemaStr)476 if err = formatChecker(paramInputSchema); err != nil {477 return err478 }479 // 保存完静态参数后自动构建获动态参数并保存480 BuildDynamic(work_id, work_step_id, step, o)481 // 编辑开始或结束节点时需要通知调度流程重新 BuildDynamic482 if step.WorkStepType == iworkconst.NODE_TYPE_WORK_START || step.WorkStepType == iworkconst.NODE_TYPE_WORK_END {483 BuildParentWork(work_id, step, o)484 }485 return nil486}487func BuildParentWork(work_id int64, step models.WorkStep, o orm.Ormer) {488 if workSteps, _, _, err := models.QueryParentWorks(work_id, o); err == nil {489 for _, workStep := range workSteps {490 BuildDynamic(workStep.WorkId, workStep.WorkStepId, step, o)491 }492 }493}494// 构建动态值,每次 build 之前需要重读 step 信息495func BuildDynamic(work_id int64, work_step_id int64, step models.WorkStep, o orm.Ormer) {496 step, _ = models.QueryWorkStepInfo(work_id, work_step_id, o)497 // 自动创建子流程498 iworkbuild.BuildAutoCreateSubWork(step, o, InsertStartEndWorkStepNode)499 step, _ = models.QueryWorkStepInfo(work_id, work_step_id, o)500 // 构建动态输入值501 iworkbuild.BuildDynamicInput(step, o)502 step, _ = models.QueryWorkStepInfo(work_id, work_step_id, o)503 // 构建动态输出值504 iworkbuild.BuildDynamicOutput(step, o)505}...

Full Screen

Full Screen

mvcode.go

Source:mvcode.go Github

copy

Full Screen

...24 if !ok {25 return26 }27 _, havePkgDot := stack[1].(*ast.SelectorExpr)28 obj := srcPkg.TypesInfo.Uses[id]29 if obj == nil {30 return31 }32 objPkg := obj.Pkg()33 if objPkg == nil {34 return35 }36 if obj.Parent() != objPkg.Scope() {37 // Not a package-scope variable.38 return39 }40 if mp := moves[obj]; mp != nil {41 objPkg = mp.Types42 }43 if havePkgDot {44 ed.Delete(stack[1].Pos(), id.Pos())45 }46 if objPkg == dstPkg.Types {47 // Need to remove qualifier if any, make sure name is not shadowed.48 // (For moving globals, shadowed would mean a duplicate definition,49 // which should be caught earlier but may not be.)50 if found := snap.LookupAt(id.Name, dst); found != nil && found != obj {51 snap.ErrorAt(dst, "%s is already declared\n\t%s: previous declaration", id.Name, snap.Addr(found.Pos()))52 }53 } else {54 name := snap.NeedImport(dst, "", objPkg)55 ed.Insert(id.Pos(), name+".")56 }57 })58 return ed.String()59}60// mvCode moves the code described by srcs into dst.61func mvCode(snap *refactor.Snapshot, srcs []*refactor.Item, dst *refactor.Item, dstPkg *refactor.Package) (anyExported bool) {62 // Build list of what's moving.63 // Keep a list of the objects in files separately, so that we can avoid moving them twice.64 moves := make(map[types.Object]*refactor.Package)65 inFiles := make(map[types.Object]*refactor.Package)66 for _, src := range srcs {67 if src.Obj != nil {68 for _, obj := range declObjs(snap, src.Obj) {69 moves[obj] = dstPkg70 }71 continue72 }73 switch src.Kind {74 default:75 panic(fmt.Sprintf("unexpected src %v", src))76 case refactor.ItemFile:77 srcPkg, srcFile := snap.FileByName(src.Name)78 if srcFile == nil {79 snap.ErrorAt(token.NoPos, "cannot find file %s", src.Name)80 continue81 }82 recordFileMoves(srcPkg, srcFile, dstPkg, inFiles)83 case refactor.ItemDir:84 panic("mv dir not implemented")85 }86 }87 for obj, dst := range inFiles {88 moves[obj] = dst89 }90 remap := make(map[refactor.QualName]refactor.QualName)91 for obj, dst := range moves {92 path := obj.Pkg().Path()93 var src *refactor.Package94 for _, pp := range snap.Packages() {95 if pp.PkgPath == path {96 src = pp97 }98 }99 if src == nil {100 panic("LOST SRC: " + path)101 }102 name := obj.Name()103 if f, ok := obj.(*types.Func); ok && f.Type().(*types.Signature).Recv() != nil {104 typ := f.Type().(*types.Signature).Recv().Type()105 if ptr, ok := typ.(*types.Pointer); ok {106 typ = ptr.Elem()107 }108 name = typ.(*types.Named).Obj().Name() + "." + name109 }110 remap[refactor.QualName{src, name}] = refactor.QualName{dst, name}111 }112 g := snap.DepsGraph(refactor.SymRefs).Map(remap)113 if err := snap.CheckImportCycle(g); err != nil {114 snap.ErrorAt(token.NoPos, "mv ... %s: %v", dstPkg.PkgPath, err)115 return116 }117 done := make(map[types.Object]bool)118 for _, src := range srcs {119 if inFiles[src.Obj] != nil || done[src.Obj] {120 continue121 }122 if src.Obj != nil {123 srcPkg, srcFile := snap.FileAt(src.Obj.Pos())124 pos, end := declRange(snap, src.Obj)125 moveCode(snap, srcPkg, srcFile, pos, end, dst, dstPkg, moves)126 }127 switch src.Kind {128 case refactor.ItemFile:129 srcPkg, srcFile := snap.FileByName(src.Name)130 moveCode(snap, srcPkg, srcFile, 0, 0, dst, dstPkg, moves)131 case refactor.ItemDir:132 panic("mv dir not implemented")133 }134 }135 if dstPkg != snap.Target() {136 var structs []types.Type137 for obj := range moves {138 if obj, ok := obj.(*types.TypeName); ok {139 typ := obj.Type()140 if _, ok := typ.Underlying().(*types.Struct); ok {141 structs = append(structs, typ)142 }143 }144 }145 if len(structs) > 0 {146 keyLiterals(snap, structs)147 }148 }149 rewritePkgRefs(snap, moves)150 return true // TODO: better151}152func recordFileMoves(srcPkg *refactor.Package, file *ast.File, dstPkg *refactor.Package, moves map[types.Object]*refactor.Package) {153 for _, d := range file.Decls {154 switch d := d.(type) {155 default:156 panic(fmt.Sprintf("unexpected decl %T", d))157 case *ast.GenDecl:158 for _, spec := range d.Specs {159 switch spec := spec.(type) {160 default:161 panic(fmt.Sprintf("unexpected spec %T", spec))162 case *ast.ImportSpec:163 // ignore164 case *ast.ValueSpec:165 for _, id := range spec.Names {166 obj := srcPkg.TypesInfo.Defs[id]167 if obj == nil {168 panic("no obj for var/const")169 }170 moves[obj] = dstPkg171 }172 case *ast.TypeSpec:173 obj := srcPkg.TypesInfo.Defs[spec.Name]174 if obj == nil {175 panic("no obj for type")176 }177 moves[obj] = dstPkg178 }179 }180 case *ast.FuncDecl:181 obj := srcPkg.TypesInfo.Defs[d.Name]182 if obj == nil {183 panic("no obj for func")184 }185 moves[obj] = dstPkg186 }187 }188}189func moveCode(snap *refactor.Snapshot,190 srcPkg *refactor.Package, srcFile *ast.File,191 srcPos, srcEnd token.Pos,192 dst *refactor.Item, dstPkg *refactor.Package,193 moves map[types.Object]*refactor.Package) {194 // Decide destination file.195 if dst.Kind == refactor.ItemDir {196 // Reduce to file case.197 dst0 := *dst198 dst = &dst0199 dst.Kind = refactor.ItemFile200 dst.Name = filepath.Base(snap.Position(srcFile.Package).Filename)201 }202 if dst.Kind != refactor.ItemFile {203 panic("moveFile")204 }205 srcSplit := srcFile.Name.End() // just after package declaration206 srcHdrEnd := srcFile.Name.End()207 if len(srcFile.Imports) > 0 {208 srcHdrEnd = srcFile.Decls[0].Pos()209 for i := 0; i < len(srcFile.Decls) && isImportDecl(srcFile.Decls[i]); i++ {210 srcSplit = srcFile.Decls[i].End()211 }212 }213 srcStart, srcEOF := snap.FileRange(srcFile.Package)214 if srcPos == token.NoPos {215 srcPos = srcSplit216 srcEnd = srcEOF217 }218 var dstFile *ast.File219 for _, file := range dstPkg.Files {220 if file.Syntax == nil {221 // File was deleted.222 continue223 }224 if filepath.Base(snap.Position(file.Syntax.Pos()).Filename) == dst.Name {225 dstFile = file.Syntax226 break227 }228 }229 if dstFile == nil {230 text := string(snap.Text(srcStart, srcHdrEnd))231 text = text[:srcFile.Name.Pos()-srcStart] + dstPkg.Name + text[srcFile.Name.End()-srcStart:]232 dstFile = snap.CreateFile(dstPkg, dst.Name, text)233 }234 _, dstPos := snap.FileRange(dstFile.Package)235 snap.InsertAt(dstPos, "\n\n"+236 transplant(snap, string(snap.Text(srcPos, srcEnd)), srcPos, dstPos, moves))237 if srcPos == srcSplit && srcEnd == srcEOF {238 snap.DeleteFile(srcPos)239 } else {240 snap.ForceDeleteAt(srcPos, srcEnd)241 }242}243func rewritePkgRefs(snap *refactor.Snapshot, moves map[types.Object]*refactor.Package) {244 snap.ForEachFile(func(pkg *refactor.Package, file *ast.File) {245 refactor.Walk(file, func(stack []ast.Node) {246 id, ok := stack[0].(*ast.Ident)247 if !ok {248 return249 }250 obj := pkg.TypesInfo.Uses[id]251 if f, ok := obj.(*types.Func); ok && f.Type().(*types.Signature).Recv() != nil {252 return253 }254 newPkg := moves[obj]255 if newPkg == nil || newPkg.Types == obj.Pkg() {256 return257 }258 // obj is moving to a new package.259 if sel, ok := stack[1].(*ast.SelectorExpr); ok && sel.Sel == id {260 // obj is already otherPkg.Name; update to newPkg.Name.261 if newPkg == pkg {262 // Delete the no-longer-needed package qualifier.263 if xobj := snap.LookupAt(id.Name, id.Pos()); xobj != nil && xobj != obj {264 snap.ErrorAt(id.Pos(), "%s is shadowed at new unqualified use", id.Name)265 }266 snap.DeleteAt(sel.Pos(), id.Pos())267 } else {268 name := snap.NeedImport(id.Pos(), "", newPkg.Types)269 snap.ReplaceNode(sel.X, name)270 }271 } else if newPkg == pkg {272 // obj is moving to pkg but is already referred to in pkg without a qualifier.273 // Can happen if pkg imports the old location with a dot import.274 // Can't be shadowed or the reference wouldn't be to obj.275 // Do nothing.276 } else {277 // obj is moving to a new package and needs a qualified import.278 name := snap.NeedImport(id.Pos(), "", newPkg.Types)279 snap.InsertAt(id.Pos(), name+".")280 }281 })282 })283}284func isImportDecl(decl ast.Decl) bool {285 d, ok := decl.(*ast.GenDecl)286 return ok && d.Tok == token.IMPORT287}288func declRange(snap *refactor.Snapshot, obj types.Object) (pos, end token.Pos) {289 _, srcFile := snap.FileAt(obj.Pos())290 startFile, endFile := snap.FileRange(obj.Pos())291 text := snap.Text(startFile, endFile)292 pos = srcFile.Name.End()293 if int(pos-startFile) < len(text) && text[pos-startFile] == '\n' {294 pos++295 }296 d := codeDecl(snap, obj)297 pastEOL := func(pos token.Pos) token.Pos {298 p := pos299 for int(p-startFile) < len(text) && text[p-startFile] == ' ' {300 p++301 }302 if int(p-startFile)+2 <= len(text) && text[p-startFile] == '/' && text[p-startFile+1] == '/' {303 for int(p-startFile) < len(text) && text[p-startFile] != '\n' {304 p++305 }306 }307 if int(p-startFile) == len(text) {308 return p309 }310 if int(p-startFile) < len(text) && text[p-startFile] == '\n' {311 return p + 1312 }313 return pos314 }315 for i := 0; i < len(srcFile.Decls); i++ {316 if srcFile.Decls[i] == d {317 break318 }319 pos = pastEOL(srcFile.Decls[i].End())320 if int(pos-startFile) < len(text) && text[pos-startFile] == '\n' {321 pos++322 }323 }324 end = pastEOL(d.End())325 if int(end-startFile) < len(text) && text[end-startFile] == '\n' {326 end++327 }328 return pos, end329}330func declObjs(snap *refactor.Snapshot, obj types.Object) []types.Object {331 srcPkg, _ := snap.FileAt(obj.Pos())332 defs := srcPkg.TypesInfo.Defs333 var objs []types.Object334 switch d := codeDecl(snap, obj).(type) {335 default:336 panic(fmt.Sprintf("unexpected codeDecl %T", d))337 case *ast.GenDecl:338 for _, spec := range d.Specs {339 switch spec := spec.(type) {340 case *ast.ValueSpec:341 for _, id := range spec.Names {342 objs = append(objs, defs[id])343 }344 case *ast.TypeSpec:345 objs = append(objs, defs[spec.Name])346 }...

Full Screen

Full Screen

inject.go

Source:inject.go Github

copy

Full Screen

...86 id, ok := stack[0].(*ast.Ident)87 if !ok || len(stack) < 2 {88 return89 }90 obj := pkg.TypesInfo.Uses[id]91 if converting[obj] == "" {92 return93 }94 if call, ok := stack[1].(*ast.CallExpr); ok && call.Fun == id {95 // ok96 return97 } else if sel, ok := stack[1].(*ast.SelectorExpr); ok && sel.Sel == id {98 if call, ok := stack[2].(*ast.CallExpr); ok && call.Fun == stack[1] {99 // ok100 return101 }102 }103 // snap.ErrorAt(id.Pos(), "%v not called - skipping conversion", obj)104 delete(converting, obj)105 })106 })107 snap.ForEachFile(func(pkg *refactor.Package, file *ast.File) {108 for _, decl := range file.Decls {109 if fn, ok := decl.(*ast.FuncDecl); ok {110 obj := pkg.TypesInfo.Defs[fn.Name]111 if obj == nil {112 fmt.Printf("MISSING %v\n", fn.Name)113 }114 if converting[obj] == "" {115 continue116 }117 // Determine a name for the parameter.118 uses := make(map[string]bool)119 refactor.Walk(fn.Body, func(stack []ast.Node) {120 if id, ok := stack[0].(*ast.Ident); ok {121 if sel, ok := stack[1].(*ast.SelectorExpr); ok && sel.Sel == id {122 return123 }124 if kv, ok := stack[1].(*ast.KeyValueExpr); ok && kv.Key == id {125 return126 }127 uses[id.Name] = true128 }129 })130 dst := fn.Type.Params.Opening + 1131 name := targetName132 for uses[name] {133 name += "_"134 }135 converting[obj] = name136 var b bytes.Buffer137 fmt.Fprintf(&b, "%s ", name)138 printType(&b, snap, targetObj.Pos(), dst, targetObj.Type())139 if len(fn.Type.Params.List) > 0 {140 b.WriteString(", ")141 }142 snap.InsertAt(dst, b.String())143 }144 }145 })146 snap.ForEachFile(func(pkg *refactor.Package, file *ast.File) {147 refactor.Walk(file, func(stack []ast.Node) {148 id, ok := stack[0].(*ast.Ident)149 if !ok || len(stack) < 2 {150 return151 }152 obj := pkg.TypesInfo.Uses[id]153 if converting[obj] == "" && obj != targetObj {154 return155 }156 // If inside a function body, stack[len-1] = *ast.File, stack[len-2] = *ast.FuncDecl.157 name := ""158 if fn, ok := stack[len(stack)-2].(*ast.FuncDecl); ok {159 fnobj := pkg.TypesInfo.Defs[fn.Name]160 name = converting[fnobj]161 }162 if obj == targetObj {163 if name != "" {164 pos := ast.Node(id)165 if sel, ok := stack[1].(*ast.SelectorExpr); ok && sel.Sel == id {166 pos = sel167 }168 snap.ReplaceNode(pos, name)169 }170 return171 }172 fixName := func() {173 if name == "" {...

Full Screen

Full Screen

Info

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 fmt.Println("Hello, playground")4 refactor.Info()5}6import "fmt"7func Info() {8 fmt.Println("Info")9}

Full Screen

Full Screen

Info

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 refactor.Info("This is an info message")4}5import "fmt"6func Info(message string) {7 fmt.Println(message)8}9import "fmt"10func Info(message string) {11 fmt.Println(message)12}13func main() {14 Info("This is an info message")15}

Full Screen

Full Screen

Info

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 refactor.Info()4 fmt.Println("Hello")5}6import "fmt"7func Info() {8 fmt.Println("This is refactor package")9}10import (11func main() {12 fmt.Printf("Now you have %g problems.", math.Nextafter(2, 3))13}14The import keyword is used to import packages in Go. The import keyword is used to import

Full Screen

Full Screen

Info

Using AI Code Generation

copy

Full Screen

1import (2func main() {3refactor := new(Refactor)4refactor.Info()5}6import (7func main() {8refactor := new(Refactor)9refactor.Info()10}11import (12func main() {13refactor := new(Refactor)14refactor.Info()15}16import (17type Info interface {18GetInfo() string19}20type Refactor struct {21}22func (refactor *Refactor) GetInfo() string {23}24import (25func main() {26refactor := new(Refactor)27fmt.Println(refactor.GetInfo())28}29import (30func main() {31refactor := new(Refactor)32fmt.Println(refactor.GetInfo())33}34import (35func main() {36refactor := new(Refactor)37fmt.Println(refactor.GetInfo())38}

Full Screen

Full Screen

Info

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 fmt.Println("Hello World!")4 fmt.Println(x)5}6type Info struct {7}8import (9func TestInfo(t *testing.T) {10 if x.Name != "Name" {11 t.Errorf("Name is not set")12 }13 if x.Age != 10 {14 t.Errorf("Age is not set")15 }16}17{Name 10}

Full Screen

Full Screen

Info

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 fmt.Println("I am in main")4 r := refactor.New()5 r.Info()6}7import (8func main() {9 fmt.Println("I am in main")10 r := refactor.New()11 r.Info()12}13import (14func main() {15 fmt.Println("I am in main")16 r := refactor.New()17 r.Info()18}19import (20func main() {21 fmt.Println("I am in main")22 r := refactor.New()23 r.Info()24}25import (26func main() {27 fmt.Println("I am in main")28 r := refactor.New()29 r.Info()30}31import (32func main() {33 fmt.Println("I am in main")34 r := refactor.New()35 r.Info()36}37import (38func main() {39 fmt.Println("I am in main")40 r := refactor.New()41 r.Info()42}43import (44func main() {45 fmt.Println("I am in

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run Gauge automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Most used method in

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful