github.com/getgauge/gauge@v1.6.9/api/lang/runner.go (about) 1 /*---------------------------------------------------------------- 2 * Copyright (c) ThoughtWorks, Inc. 3 * Licensed under the Apache License, Version 2.0 4 * See LICENSE in the project root for license information. 5 *----------------------------------------------------------------*/ 6 7 package lang 8 9 import ( 10 "fmt" 11 "os" 12 13 gm "github.com/getgauge/gauge-proto/go/gauge_messages" 14 "github.com/getgauge/gauge/config" 15 "github.com/getgauge/gauge/logger" 16 "github.com/getgauge/gauge/manifest" 17 "github.com/getgauge/gauge/runner" 18 "github.com/getgauge/gauge/util" 19 "github.com/sourcegraph/go-langserver/pkg/lsp" 20 ) 21 22 type langRunner struct { 23 lspID string 24 runner *runner.GrpcRunner 25 } 26 27 var lRunner langRunner 28 29 var recommendedExtensions = map[string]string{ 30 "java": "vscjava.vscode-java-pack", 31 "dotnet": "ms-dotnettools.csharp", 32 "python": "ms-python.python", 33 "ruby": "rebornix.ruby", 34 } 35 36 func startRunner() error { 37 var err = connectToRunner() 38 if err != nil { 39 var installMessage = "" 40 m, e := manifest.ProjectManifest() 41 if e == nil { 42 installMessage = fmt.Sprintf(" Install '%s' extension for code insights.", recommendedExtensions[m.Language]) 43 } 44 errStr := "Gauge could not initialize.%s For more information see" + 45 "[Problems](command:workbench.actions.view.problems), check logs." + 46 "[Troubleshooting](https://docs.gauge.org/troubleshooting.html?language=javascript&ide=vscode#gauge-could-not-initialize-for-more-information-see-problems)" 47 return fmt.Errorf(errStr, installMessage) 48 } 49 return nil 50 } 51 52 func connectToRunner() error { 53 logInfo(nil, "Starting language runner") 54 outFile, err := util.OpenFile(logger.ActiveLogFile) 55 if err != nil { 56 return err 57 } 58 err = os.Setenv("GAUGE_LSP_GRPC", "true") 59 if err != nil { 60 return err 61 } 62 manifest, err := manifest.ProjectManifest() 63 if err != nil { 64 return err 65 } 66 67 lRunner.runner, err = runner.StartGrpcRunner(manifest, outFile, outFile, config.IdeRequestTimeout(), false) 68 return err 69 } 70 71 func cacheFileOnRunner(uri lsp.DocumentURI, text string, isClosed bool, status gm.CacheFileRequest_FileStatus) error { 72 r := &gm.Message{ 73 MessageType: gm.Message_CacheFileRequest, 74 CacheFileRequest: &gm.CacheFileRequest{ 75 Content: text, 76 FilePath: string(util.ConvertURItoFilePath(uri)), 77 IsClosed: false, 78 Status: status, 79 }, 80 } 81 _, err := lRunner.runner.ExecuteMessageWithTimeout(r) 82 return err 83 } 84 85 func globPatternRequest() (*gm.ImplementationFileGlobPatternResponse, error) { 86 implFileGlobPatternRequest := &gm.Message{MessageType: gm.Message_ImplementationFileGlobPatternRequest, ImplementationFileGlobPatternRequest: &gm.ImplementationFileGlobPatternRequest{}} 87 response, err := lRunner.runner.ExecuteMessageWithTimeout(implFileGlobPatternRequest) 88 if err != nil { 89 return nil, err 90 } 91 return response.GetImplementationFileGlobPatternResponse(), nil 92 } 93 94 func getStepPositionResponse(uri lsp.DocumentURI) (*gm.StepPositionsResponse, error) { 95 stepPositionsRequest := &gm.Message{MessageType: gm.Message_StepPositionsRequest, StepPositionsRequest: &gm.StepPositionsRequest{FilePath: util.ConvertURItoFilePath(uri)}} 96 response, err := lRunner.runner.ExecuteMessageWithTimeout(stepPositionsRequest) 97 if err != nil { 98 return nil, fmt.Errorf("error while connecting to runner : %s", err) 99 } 100 if response.GetStepPositionsResponse().GetError() != "" { 101 return nil, fmt.Errorf("error while connecting to runner : %s", response.GetStepPositionsResponse().GetError()) 102 } 103 return response.GetStepPositionsResponse(), nil 104 } 105 106 func getImplementationFileList() (*gm.ImplementationFileListResponse, error) { 107 implementationFileListRequest := &gm.Message{MessageType: gm.Message_ImplementationFileListRequest} 108 response, err := lRunner.runner.ExecuteMessageWithTimeout(implementationFileListRequest) 109 if err != nil { 110 return nil, fmt.Errorf("error while connecting to runner : %s", err.Error()) 111 } 112 return response.GetImplementationFileListResponse(), nil 113 } 114 115 func getStepNameResponse(stepValue string) (*gm.StepNameResponse, error) { 116 stepNameRequest := &gm.Message{MessageType: gm.Message_StepNameRequest, StepNameRequest: &gm.StepNameRequest{StepValue: stepValue}} 117 response, err := lRunner.runner.ExecuteMessageWithTimeout(stepNameRequest) 118 if err != nil { 119 return nil, fmt.Errorf("error while connecting to runner : %s", err) 120 } 121 return response.GetStepNameResponse(), nil 122 } 123 124 func putStubImplementation(filePath string, codes []string) (*gm.FileDiff, error) { 125 stubImplementationCodeRequest := &gm.Message{ 126 MessageType: gm.Message_StubImplementationCodeRequest, 127 StubImplementationCodeRequest: &gm.StubImplementationCodeRequest{ 128 ImplementationFilePath: filePath, 129 Codes: codes, 130 }, 131 } 132 response, err := lRunner.runner.ExecuteMessageWithTimeout(stubImplementationCodeRequest) 133 if err != nil { 134 return nil, fmt.Errorf("error while connecting to runner : %s", err.Error()) 135 } 136 return response.GetFileDiff(), nil 137 } 138 139 func getAllStepsResponse() (*gm.StepNamesResponse, error) { 140 getAllStepsRequest := &gm.Message{MessageType: gm.Message_StepNamesRequest, StepNamesRequest: &gm.StepNamesRequest{}} 141 response, err := lRunner.runner.ExecuteMessageWithTimeout(getAllStepsRequest) 142 if err != nil { 143 return nil, fmt.Errorf("error while connecting to runner : %s", err.Error()) 144 } 145 return response.GetStepNamesResponse(), nil 146 } 147 148 func killRunner() error { 149 if lRunner.runner != nil { 150 return lRunner.runner.Kill() 151 } 152 return nil 153 } 154 155 func getLanguageIdentifier() (string, error) { 156 m, err := manifest.ProjectManifest() 157 if err != nil { 158 return "", err 159 } 160 info, err := runner.GetRunnerInfo(m.Language) 161 if err != nil { 162 return "", err 163 } 164 return info.LspLangId, nil 165 }