@@ -26,7 +26,7 @@ type API struct {
26
26
scriptInfosMu sync.RWMutex
27
27
scriptInfos map [tspath.Path ]* project.ScriptInfo
28
28
29
- projects map [tspath. Path ]* project.Project
29
+ projects [ ]* project.Project
30
30
symbolsMu sync.Mutex
31
31
symbols map [Handle [ast.Symbol ]]* ast.Symbol
32
32
}
@@ -42,7 +42,6 @@ func NewAPI(host APIHost, options APIOptions) *API {
42
42
CurrentDirectory : host .GetCurrentDirectory (),
43
43
}),
44
44
scriptInfos : make (map [tspath.Path ]* project.ScriptInfo ),
45
- projects : make (map [tspath.Path ]* project.Project ),
46
45
symbols : make (map [Handle [ast.Symbol ]]* ast.Symbol ),
47
46
}
48
47
}
@@ -105,7 +104,7 @@ func (api *API) HandleRequest(id int, method string, payload json.RawMessage) ([
105
104
switch Method (method ) {
106
105
case MethodGetSourceFile :
107
106
params := params .(* GetSourceFileParams )
108
- sourceFile , err := api .GetSourceFile (api . toPath ( params .Project ) , params .FileName )
107
+ sourceFile , err := api .GetSourceFile (params .Project , params .FileName )
109
108
if err != nil {
110
109
return nil , err
111
110
}
@@ -116,11 +115,11 @@ func (api *API) HandleRequest(id int, method string, payload json.RawMessage) ([
116
115
return encodeJSON (api .LoadProject (params .(* LoadProjectParams ).ConfigFileName ))
117
116
case MethodGetSymbolAtPosition :
118
117
return encodeJSON (handleBatchableRequest (params , func (params * GetSymbolAtPositionParams ) (any , error ) {
119
- return api .GetSymbolAtPosition (api . toPath ( params .Project ) , params .FileName , int (params .Position ))
118
+ return api .GetSymbolAtPosition (params .Project , params .FileName , int (params .Position ))
120
119
}))
121
120
case MethodGetTypeOfSymbol :
122
121
return encodeJSON (handleBatchableRequest (params , func (params * GetTypeOfSymbolParams ) (any , error ) {
123
- return api .GetTypeOfSymbol (api . toPath ( params .Project ) , params .Symbol )
122
+ return api .GetTypeOfSymbol (params .Project , params .Symbol )
124
123
}))
125
124
default :
126
125
return nil , fmt .Errorf ("unhandled API method %q" , method )
@@ -159,15 +158,16 @@ func (api *API) LoadProject(configFileName string) (*ProjectData, error) {
159
158
return nil , err
160
159
}
161
160
project .GetProgram ()
162
- api .projects [configFilePath ] = project
163
- return NewProjectData (project ), nil
161
+ id := len (api .projects )
162
+ api .projects = append (api .projects , project )
163
+ return NewProjectData (project , id ), nil
164
164
}
165
165
166
- func (api * API ) GetSymbolAtPosition (projectPath tspath.Path , fileName string , position int ) (* SymbolData , error ) {
167
- project , ok := api .projects [projectPath ]
168
- if ! ok {
169
- return nil , fmt .Errorf ("project %q not found" , projectPath )
166
+ func (api * API ) GetSymbolAtPosition (projectId int , fileName string , position int ) (* SymbolData , error ) {
167
+ if projectId >= len (api .projects ) {
168
+ return nil , fmt .Errorf ("project not found" )
170
169
}
170
+ project := api .projects [projectId ]
171
171
symbol , err := project .LanguageService ().GetSymbolAtPosition (fileName , position )
172
172
if err != nil || symbol == nil {
173
173
return nil , err
@@ -179,11 +179,11 @@ func (api *API) GetSymbolAtPosition(projectPath tspath.Path, fileName string, po
179
179
return data , nil
180
180
}
181
181
182
- func (api * API ) GetTypeOfSymbol (projectPath tspath.Path , symbolHandle Handle [ast.Symbol ]) (* TypeData , error ) {
183
- project , ok := api .projects [projectPath ]
184
- if ! ok {
185
- return nil , fmt .Errorf ("project %q not found" , projectPath )
182
+ func (api * API ) GetTypeOfSymbol (projectId int , symbolHandle Handle [ast.Symbol ]) (* TypeData , error ) {
183
+ if projectId >= len (api .projects ) {
184
+ return nil , fmt .Errorf ("project not found" )
186
185
}
186
+ project := api .projects [projectId ]
187
187
symbol , ok := api .symbols [symbolHandle ]
188
188
if ! ok {
189
189
return nil , fmt .Errorf ("symbol %q not found" , symbolHandle )
@@ -195,14 +195,14 @@ func (api *API) GetTypeOfSymbol(projectPath tspath.Path, symbolHandle Handle[ast
195
195
return NewTypeData (t ), nil
196
196
}
197
197
198
- func (api * API ) GetSourceFile (projectPath tspath.Path , fileName string ) (* ast.SourceFile , error ) {
199
- project , ok := api .projects [projectPath ]
200
- if ! ok {
201
- return nil , fmt .Errorf ("project %q not found" , projectPath )
198
+ func (api * API ) GetSourceFile (projectId int , fileName string ) (* ast.SourceFile , error ) {
199
+ if projectId >= len (api .projects ) {
200
+ return nil , fmt .Errorf ("project not found" )
202
201
}
202
+ project := api .projects [projectId ]
203
203
sourceFile := project .GetProgram ().GetSourceFile (fileName )
204
204
if sourceFile == nil {
205
- return nil , nil
205
+ return nil , fmt . Errorf ( "source file %q not found" , fileName )
206
206
}
207
207
return sourceFile , nil
208
208
}
0 commit comments