@theia/plugin-ext 1.25.0-next.39 → 1.25.0-next.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/lib/common/plugin-api-rpc-model.d.ts +1 -15
  2. package/lib/common/plugin-api-rpc-model.d.ts.map +1 -1
  3. package/lib/common/plugin-api-rpc-model.js.map +1 -1
  4. package/lib/common/plugin-api-rpc.d.ts +5 -4
  5. package/lib/common/plugin-api-rpc.d.ts.map +1 -1
  6. package/lib/common/plugin-api-rpc.js.map +1 -1
  7. package/lib/common/uri-components.d.ts +2 -9
  8. package/lib/common/uri-components.d.ts.map +1 -1
  9. package/lib/common/uri-components.js +1 -7
  10. package/lib/common/uri-components.js.map +1 -1
  11. package/lib/main/browser/callhierarchy/callhierarchy-type-converters.d.ts +9 -9
  12. package/lib/main/browser/callhierarchy/callhierarchy-type-converters.d.ts.map +1 -1
  13. package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js +70 -89
  14. package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js.map +1 -1
  15. package/lib/main/browser/languages-main.d.ts.map +1 -1
  16. package/lib/main/browser/languages-main.js +7 -1
  17. package/lib/main/browser/languages-main.js.map +1 -1
  18. package/lib/plugin/languages/call-hierarchy.d.ts +8 -7
  19. package/lib/plugin/languages/call-hierarchy.d.ts.map +1 -1
  20. package/lib/plugin/languages/call-hierarchy.js +39 -31
  21. package/lib/plugin/languages/call-hierarchy.js.map +1 -1
  22. package/lib/plugin/languages.d.ts +5 -4
  23. package/lib/plugin/languages.d.ts.map +1 -1
  24. package/lib/plugin/languages.js +3 -0
  25. package/lib/plugin/languages.js.map +1 -1
  26. package/lib/plugin/type-converters.d.ts +1 -1
  27. package/lib/plugin/type-converters.d.ts.map +1 -1
  28. package/lib/plugin/type-converters.js +4 -2
  29. package/lib/plugin/type-converters.js.map +1 -1
  30. package/lib/plugin/types-impl.d.ts +1 -2
  31. package/lib/plugin/types-impl.d.ts.map +1 -1
  32. package/lib/plugin/types-impl.js.map +1 -1
  33. package/package.json +23 -23
  34. package/src/common/plugin-api-rpc-model.ts +1 -17
  35. package/src/common/plugin-api-rpc.ts +7 -5
  36. package/src/common/uri-components.ts +4 -17
  37. package/src/main/browser/callhierarchy/callhierarchy-type-converters.ts +85 -97
  38. package/src/main/browser/languages-main.ts +8 -4
  39. package/src/plugin/languages/call-hierarchy.ts +44 -50
  40. package/src/plugin/languages.ts +11 -6
  41. package/src/plugin/type-converters.ts +6 -3
  42. package/src/plugin/types-impl.ts +1 -2
@@ -14,7 +14,7 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { Definition as CallHierarchyDefinition, Caller as CallHierarchyCaller, Callee as CallHierarchyCallee } from '@theia/callhierarchy/lib/browser';
17
+ import { CallHierarchyItem, CallHierarchyIncomingCall, CallHierarchyOutgoingCall } from '@theia/callhierarchy/lib/browser';
18
18
  import * as model from '../../../common/plugin-api-rpc-model';
19
19
  import * as rpc from '../../../common/plugin-api-rpc';
20
20
  import * as callhierarchy from '@theia/core/shared/vscode-languageserver-protocol';
@@ -70,136 +70,124 @@ export function toRange(range: model.Range): callhierarchy.Range {
70
70
  }
71
71
 
72
72
  export namespace SymbolKindConverter {
73
- // tslint:disable-next-line:no-null-keyword
74
- const fromMapping: { [kind: number]: model.SymbolKind } = Object.create(null);
75
- fromMapping[callhierarchy.SymbolKind.File] = model.SymbolKind.File;
76
- fromMapping[callhierarchy.SymbolKind.Module] = model.SymbolKind.Module;
77
- fromMapping[callhierarchy.SymbolKind.Namespace] = model.SymbolKind.Namespace;
78
- fromMapping[callhierarchy.SymbolKind.Package] = model.SymbolKind.Package;
79
- fromMapping[callhierarchy.SymbolKind.Class] = model.SymbolKind.Class;
80
- fromMapping[callhierarchy.SymbolKind.Method] = model.SymbolKind.Method;
81
- fromMapping[callhierarchy.SymbolKind.Property] = model.SymbolKind.Property;
82
- fromMapping[callhierarchy.SymbolKind.Field] = model.SymbolKind.Field;
83
- fromMapping[callhierarchy.SymbolKind.Constructor] = model.SymbolKind.Constructor;
84
- fromMapping[callhierarchy.SymbolKind.Enum] = model.SymbolKind.Enum;
85
- fromMapping[callhierarchy.SymbolKind.Interface] = model.SymbolKind.Interface;
86
- fromMapping[callhierarchy.SymbolKind.Function] = model.SymbolKind.Function;
87
- fromMapping[callhierarchy.SymbolKind.Variable] = model.SymbolKind.Variable;
88
- fromMapping[callhierarchy.SymbolKind.Constant] = model.SymbolKind.Constant;
89
- fromMapping[callhierarchy.SymbolKind.String] = model.SymbolKind.String;
90
- fromMapping[callhierarchy.SymbolKind.Number] = model.SymbolKind.Number;
91
- fromMapping[callhierarchy.SymbolKind.Boolean] = model.SymbolKind.Boolean;
92
- fromMapping[callhierarchy.SymbolKind.Array] = model.SymbolKind.Array;
93
- fromMapping[callhierarchy.SymbolKind.Object] = model.SymbolKind.Object;
94
- fromMapping[callhierarchy.SymbolKind.Key] = model.SymbolKind.Key;
95
- fromMapping[callhierarchy.SymbolKind.Null] = model.SymbolKind.Null;
96
- fromMapping[callhierarchy.SymbolKind.EnumMember] = model.SymbolKind.EnumMember;
97
- fromMapping[callhierarchy.SymbolKind.Struct] = model.SymbolKind.Struct;
98
- fromMapping[callhierarchy.SymbolKind.Event] = model.SymbolKind.Event;
99
- fromMapping[callhierarchy.SymbolKind.Operator] = model.SymbolKind.Operator;
100
- fromMapping[callhierarchy.SymbolKind.TypeParameter] = model.SymbolKind.TypeParameter;
101
-
102
73
  export function fromSymbolKind(kind: callhierarchy.SymbolKind): model.SymbolKind {
103
- return fromMapping[kind] || model.SymbolKind.Property;
74
+ switch (kind) {
75
+ case callhierarchy.SymbolKind.File: return model.SymbolKind.File;
76
+ case callhierarchy.SymbolKind.Module: return model.SymbolKind.Module;
77
+ case callhierarchy.SymbolKind.Namespace: return model.SymbolKind.Namespace;
78
+ case callhierarchy.SymbolKind.Package: return model.SymbolKind.Package;
79
+ case callhierarchy.SymbolKind.Class: return model.SymbolKind.Class;
80
+ case callhierarchy.SymbolKind.Method: return model.SymbolKind.Method;
81
+ case callhierarchy.SymbolKind.Property: return model.SymbolKind.Property;
82
+ case callhierarchy.SymbolKind.Field: return model.SymbolKind.Field;
83
+ case callhierarchy.SymbolKind.Constructor: return model.SymbolKind.Constructor;
84
+ case callhierarchy.SymbolKind.Enum: return model.SymbolKind.Enum;
85
+ case callhierarchy.SymbolKind.Interface: return model.SymbolKind.Interface;
86
+ case callhierarchy.SymbolKind.Function: return model.SymbolKind.Function;
87
+ case callhierarchy.SymbolKind.Variable: return model.SymbolKind.Variable;
88
+ case callhierarchy.SymbolKind.Constant: return model.SymbolKind.Constant;
89
+ case callhierarchy.SymbolKind.String: return model.SymbolKind.String;
90
+ case callhierarchy.SymbolKind.Number: return model.SymbolKind.Number;
91
+ case callhierarchy.SymbolKind.Boolean: return model.SymbolKind.Boolean;
92
+ case callhierarchy.SymbolKind.Array: return model.SymbolKind.Array;
93
+ case callhierarchy.SymbolKind.Object: return model.SymbolKind.Object;
94
+ case callhierarchy.SymbolKind.Key: return model.SymbolKind.Key;
95
+ case callhierarchy.SymbolKind.Null: return model.SymbolKind.Null;
96
+ case callhierarchy.SymbolKind.EnumMember: return model.SymbolKind.EnumMember;
97
+ case callhierarchy.SymbolKind.Struct: return model.SymbolKind.Struct;
98
+ case callhierarchy.SymbolKind.Event: return model.SymbolKind.Event;
99
+ case callhierarchy.SymbolKind.Operator: return model.SymbolKind.Operator;
100
+ case callhierarchy.SymbolKind.TypeParameter: return model.SymbolKind.TypeParameter;
101
+ default: return model.SymbolKind.Property;
102
+ }
104
103
  }
105
-
106
- // tslint:disable-next-line:no-null-keyword
107
- const toMapping: { [kind: number]: callhierarchy.SymbolKind } = Object.create(null);
108
- toMapping[model.SymbolKind.File] = callhierarchy.SymbolKind.File;
109
- toMapping[model.SymbolKind.Module] = callhierarchy.SymbolKind.Module;
110
- toMapping[model.SymbolKind.Namespace] = callhierarchy.SymbolKind.Namespace;
111
- toMapping[model.SymbolKind.Package] = callhierarchy.SymbolKind.Package;
112
- toMapping[model.SymbolKind.Class] = callhierarchy.SymbolKind.Class;
113
- toMapping[model.SymbolKind.Method] = callhierarchy.SymbolKind.Method;
114
- toMapping[model.SymbolKind.Property] = callhierarchy.SymbolKind.Property;
115
- toMapping[model.SymbolKind.Field] = callhierarchy.SymbolKind.Field;
116
- toMapping[model.SymbolKind.Constructor] = callhierarchy.SymbolKind.Constructor;
117
- toMapping[model.SymbolKind.Enum] = callhierarchy.SymbolKind.Enum;
118
- toMapping[model.SymbolKind.Interface] = callhierarchy.SymbolKind.Interface;
119
- toMapping[model.SymbolKind.Function] = callhierarchy.SymbolKind.Function;
120
- toMapping[model.SymbolKind.Variable] = callhierarchy.SymbolKind.Variable;
121
- toMapping[model.SymbolKind.Constant] = callhierarchy.SymbolKind.Constant;
122
- toMapping[model.SymbolKind.String] = callhierarchy.SymbolKind.String;
123
- toMapping[model.SymbolKind.Number] = callhierarchy.SymbolKind.Number;
124
- toMapping[model.SymbolKind.Boolean] = callhierarchy.SymbolKind.Boolean;
125
- toMapping[model.SymbolKind.Array] = callhierarchy.SymbolKind.Array;
126
- toMapping[model.SymbolKind.Object] = callhierarchy.SymbolKind.Object;
127
- toMapping[model.SymbolKind.Key] = callhierarchy.SymbolKind.Key;
128
- toMapping[model.SymbolKind.Null] = callhierarchy.SymbolKind.Null;
129
- toMapping[model.SymbolKind.EnumMember] = callhierarchy.SymbolKind.EnumMember;
130
- toMapping[model.SymbolKind.Struct] = callhierarchy.SymbolKind.Struct;
131
- toMapping[model.SymbolKind.Event] = callhierarchy.SymbolKind.Event;
132
- toMapping[model.SymbolKind.Operator] = callhierarchy.SymbolKind.Operator;
133
- toMapping[model.SymbolKind.TypeParameter] = callhierarchy.SymbolKind.TypeParameter;
134
-
135
104
  export function toSymbolKind(kind: model.SymbolKind): callhierarchy.SymbolKind {
136
- return toMapping[kind] || model.SymbolKind.Property;
105
+ switch (kind) {
106
+ case model.SymbolKind.File: return callhierarchy.SymbolKind.File;
107
+ case model.SymbolKind.Module: return callhierarchy.SymbolKind.Module;
108
+ case model.SymbolKind.Namespace: return callhierarchy.SymbolKind.Namespace;
109
+ case model.SymbolKind.Package: return callhierarchy.SymbolKind.Package;
110
+ case model.SymbolKind.Class: return callhierarchy.SymbolKind.Class;
111
+ case model.SymbolKind.Method: return callhierarchy.SymbolKind.Method;
112
+ case model.SymbolKind.Property: return callhierarchy.SymbolKind.Property;
113
+ case model.SymbolKind.Field: return callhierarchy.SymbolKind.Field;
114
+ case model.SymbolKind.Constructor: return callhierarchy.SymbolKind.Constructor;
115
+ case model.SymbolKind.Enum: return callhierarchy.SymbolKind.Enum;
116
+ case model.SymbolKind.Interface: return callhierarchy.SymbolKind.Interface;
117
+ case model.SymbolKind.Function: return callhierarchy.SymbolKind.Function;
118
+ case model.SymbolKind.Variable: return callhierarchy.SymbolKind.Variable;
119
+ case model.SymbolKind.Constant: return callhierarchy.SymbolKind.Constant;
120
+ case model.SymbolKind.String: return callhierarchy.SymbolKind.String;
121
+ case model.SymbolKind.Number: return callhierarchy.SymbolKind.Number;
122
+ case model.SymbolKind.Boolean: return callhierarchy.SymbolKind.Boolean;
123
+ case model.SymbolKind.Array: return callhierarchy.SymbolKind.Array;
124
+ case model.SymbolKind.Object: return callhierarchy.SymbolKind.Object;
125
+ case model.SymbolKind.Key: return callhierarchy.SymbolKind.Key;
126
+ case model.SymbolKind.Null: return callhierarchy.SymbolKind.Null;
127
+ case model.SymbolKind.EnumMember: return callhierarchy.SymbolKind.EnumMember;
128
+ case model.SymbolKind.Struct: return callhierarchy.SymbolKind.Struct;
129
+ case model.SymbolKind.Event: return callhierarchy.SymbolKind.Event;
130
+ case model.SymbolKind.Operator: return callhierarchy.SymbolKind.Operator;
131
+ case model.SymbolKind.TypeParameter: return callhierarchy.SymbolKind.TypeParameter;
132
+ default: return callhierarchy.SymbolKind.Property;
133
+ }
137
134
  }
138
135
  }
139
136
 
140
- export function toDefinition(definition: model.CallHierarchyDefinition): CallHierarchyDefinition;
141
- export function toDefinition(definition: model.CallHierarchyDefinition | undefined): CallHierarchyDefinition | undefined;
142
- export function toDefinition(definition: model.CallHierarchyDefinition | undefined): CallHierarchyDefinition | undefined {
137
+ export function toDefinition(definition: model.CallHierarchyItem): CallHierarchyItem;
138
+ export function toDefinition(definition: model.CallHierarchyItem | undefined): CallHierarchyItem | undefined;
139
+ export function toDefinition(definition: model.CallHierarchyItem | undefined): CallHierarchyItem | undefined {
143
140
  if (!definition) {
144
141
  return undefined;
145
142
  }
146
143
  return {
147
- location: {
148
- uri: fromUriComponents(definition.uri),
149
- range: toRange(definition.range)
150
- },
144
+ ...definition,
145
+ kind: SymbolKindConverter.toSymbolKind(definition.kind),
146
+ range: toRange(definition.range),
151
147
  selectionRange: toRange(definition.selectionRange),
152
- symbolName: definition.name,
153
- symbolKind: SymbolKindConverter.toSymbolKind(definition.kind),
154
- containerName: undefined,
155
- tags: definition.tags,
156
- data: definition.data,
157
148
  };
158
149
  }
159
150
 
160
- export function fromDefinition(definition: CallHierarchyDefinition): model.CallHierarchyDefinition {
151
+ export function fromDefinition(definition: CallHierarchyItem): model.CallHierarchyItem {
161
152
  return {
162
- uri: toUriComponents(definition.location.uri),
163
- range: fromRange(definition.location.range),
164
- selectionRange: fromRange(definition.selectionRange),
165
- name: definition.symbolName,
166
- kind: SymbolKindConverter.fromSymbolKind(definition.symbolKind),
167
- tags: definition.tags,
168
- data: definition.data,
153
+ ...definition,
154
+ kind: SymbolKindConverter.fromSymbolKind(definition.kind),
155
+ range: fromRange(definition.range),
156
+ selectionRange: fromRange(definition.range),
169
157
  };
170
158
  }
171
159
 
172
- export function toCaller(caller: model.CallHierarchyReference): CallHierarchyCaller {
160
+ export function toCaller(caller: model.CallHierarchyIncomingCall): CallHierarchyIncomingCall {
173
161
  return {
174
- callerDefinition: toDefinition(caller.callerDefinition),
175
- references: caller.references.map(toRange)
162
+ from: toDefinition(caller.from),
163
+ fromRanges: caller.fromRanges.map(toRange)
176
164
  };
177
165
  }
178
166
 
179
- export function fromCaller(caller: CallHierarchyCaller): model.CallHierarchyReference {
167
+ export function fromCaller(caller: CallHierarchyIncomingCall): model.CallHierarchyIncomingCall {
180
168
  return {
181
- callerDefinition: fromDefinition(caller.callerDefinition),
182
- references: caller.references.map(fromRange)
169
+ from: fromDefinition(caller.from),
170
+ fromRanges: caller.fromRanges.map(fromRange)
183
171
  };
184
172
  }
185
173
 
186
- export function toCallee(callee: model.CallHierarchyReference): CallHierarchyCallee {
174
+ export function toCallee(callee: model.CallHierarchyOutgoingCall): CallHierarchyOutgoingCall {
187
175
  return {
188
- calleeDefinition: toDefinition(callee.callerDefinition),
189
- references: callee.references.map(toRange),
176
+ to: toDefinition(callee.to),
177
+ fromRanges: callee.fromRanges.map(toRange),
190
178
  };
191
179
  }
192
180
 
193
- export function fromCallHierarchyCallerToModelCallHierarchyIncomingCall(caller: CallHierarchyCaller): model.CallHierarchyIncomingCall {
181
+ export function fromCallHierarchyCallerToModelCallHierarchyIncomingCall(caller: CallHierarchyIncomingCall): model.CallHierarchyIncomingCall {
194
182
  return {
195
- from: fromDefinition(caller.callerDefinition),
196
- fromRanges: caller.references.map(fromRange),
183
+ from: fromDefinition(caller.from),
184
+ fromRanges: caller.fromRanges.map(fromRange),
197
185
  };
198
186
  }
199
187
 
200
- export function fromCallHierarchyCalleeToModelCallHierarchyOutgoingCall(callee: CallHierarchyCallee): model.CallHierarchyOutgoingCall {
188
+ export function fromCallHierarchyCalleeToModelCallHierarchyOutgoingCall(callee: CallHierarchyOutgoingCall): model.CallHierarchyOutgoingCall {
201
189
  return {
202
- to: fromDefinition(callee.calleeDefinition),
203
- fromRanges: callee.references.map(fromRange),
190
+ to: fromDefinition(callee.to),
191
+ fromRanges: callee.fromRanges.map(fromRange),
204
192
  };
205
193
  }
@@ -50,7 +50,7 @@ import * as theia from '@theia/plugin';
50
50
  import { UriComponents } from '../../common/uri-components';
51
51
  import { CancellationToken } from '@theia/core/lib/common';
52
52
  import { LanguageSelector, RelativePattern } from '@theia/callhierarchy/lib/common/language-selector';
53
- import { CallHierarchyService, CallHierarchyServiceProvider, Definition } from '@theia/callhierarchy/lib/browser';
53
+ import { CallHierarchyService, CallHierarchyServiceProvider, CallHierarchyItem } from '@theia/callhierarchy/lib/browser';
54
54
  import { toDefinition, toUriComponents, fromDefinition, fromPosition, toCaller, toCallee } from './callhierarchy/callhierarchy-type-converters';
55
55
  import { Position, DocumentUri, DiagnosticTag } from '@theia/core/shared/vscode-languageserver-protocol';
56
56
  import { ObjectIdentifier } from '../../common/object-identifier';
@@ -804,8 +804,12 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable {
804
804
  selector: language,
805
805
  getRootDefinition: (uri: DocumentUri, position: Position, cancellationToken: CancellationToken) =>
806
806
  this.proxy.$provideRootDefinition(handle, toUriComponents(uri), fromPosition(position), cancellationToken)
807
- .then(def => Array.isArray(def) ? def.map(item => toDefinition(item)) : toDefinition(def)),
808
- getCallers: (definition: Definition, cancellationToken: CancellationToken) => this.proxy.$provideCallers(handle, fromDefinition(definition), cancellationToken)
807
+ .then(def => {
808
+ if (!def) { return undefined; }
809
+ const defs = Array.isArray(def) ? def : [def];
810
+ return { dispose: () => this.proxy.$releaseCallHierarchy(handle, defs[0]?._sessionId), items: defs.map(item => toDefinition(item)) };
811
+ }),
812
+ getCallers: (definition: CallHierarchyItem, cancellationToken: CancellationToken) => this.proxy.$provideCallers(handle, fromDefinition(definition), cancellationToken)
809
813
  .then(result => {
810
814
  if (!result) {
811
815
  return undefined!;
@@ -818,7 +822,7 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable {
818
822
  return undefined!;
819
823
  }),
820
824
 
821
- getCallees: (definition: Definition, cancellationToken: CancellationToken) => this.proxy.$provideCallees(handle, fromDefinition(definition), cancellationToken)
825
+ getCallees: (definition: CallHierarchyItem, cancellationToken: CancellationToken) => this.proxy.$provideCallees(handle, fromDefinition(definition), cancellationToken)
822
826
  .then(result => {
823
827
  if (!result) {
824
828
  return undefined;
@@ -16,11 +16,11 @@
16
16
 
17
17
  import { URI } from '@theia/core/shared/vscode-uri';
18
18
  import * as theia from '@theia/plugin';
19
- import * as Converter from '../type-converters';
20
19
  import { DocumentsExtImpl } from '../documents';
21
- import * as model from '../../common/plugin-api-rpc-model';
20
+ import * as dto from '../../common/plugin-api-rpc-model';
22
21
  import * as rpc from '../../common/plugin-api-rpc';
23
22
  import * as types from '../types-impl';
23
+ import { fromRange } from '../type-converters';
24
24
 
25
25
  export class CallHierarchyAdapter {
26
26
 
@@ -29,9 +29,12 @@ export class CallHierarchyAdapter {
29
29
  private readonly documents: DocumentsExtImpl
30
30
  ) { }
31
31
 
32
+ protected sessionIds = 0;
33
+ protected readonly cache = new Map<string, Map<string, theia.CallHierarchyItem>>();
34
+
32
35
  async provideRootDefinition(
33
36
  resource: URI, position: rpc.Position, token: theia.CancellationToken
34
- ): Promise<model.CallHierarchyDefinition | model.CallHierarchyDefinition[] | undefined> {
37
+ ): Promise<dto.CallHierarchyItem[] | undefined> {
35
38
  const documentData = this.documents.getDocumentData(resource);
36
39
  if (!documentData) {
37
40
  return Promise.reject(new Error(`There is no document for ${resource}`));
@@ -48,83 +51,74 @@ export class CallHierarchyAdapter {
48
51
  if (!definition) {
49
52
  return undefined;
50
53
  }
51
-
52
- return Array.isArray(definition) ? definition.map(item => this.fromCallHierarchyItem(item)) : this.fromCallHierarchyItem(definition);
54
+ const sessionId = (this.sessionIds++).toString(36);
55
+ this.cache.set(sessionId, new Map());
56
+ return Array.isArray(definition) ? definition.map(item => this.fromCallHierarchyItem(item, sessionId)) : [this.fromCallHierarchyItem(definition, sessionId)];
53
57
  }
54
58
 
55
- async provideCallers(definition: model.CallHierarchyDefinition, token: theia.CancellationToken): Promise<model.CallHierarchyReference[] | undefined> {
59
+ async provideCallers(definition: dto.CallHierarchyItem, token: theia.CancellationToken): Promise<dto.CallHierarchyIncomingCall[] | undefined> {
56
60
  const callers = await this.provider.provideCallHierarchyIncomingCalls(this.toCallHierarchyItem(definition), token);
57
61
  if (!callers) {
58
62
  return undefined;
59
63
  }
60
64
 
61
- return callers.map(item => this.fromCallHierarchyIncomingCall(item));
65
+ return callers.map(item => this.fromCallHierarchyIncomingCall(item, definition._sessionId!));
62
66
  }
63
67
 
64
- async provideCallees(definition: model.CallHierarchyDefinition, token: theia.CancellationToken): Promise<model.CallHierarchyReference[] | undefined> {
68
+ async provideCallees(definition: dto.CallHierarchyItem, token: theia.CancellationToken): Promise<dto.CallHierarchyOutgoingCall[] | undefined> {
65
69
  const callees = await this.provider.provideCallHierarchyOutgoingCalls(this.toCallHierarchyItem(definition), token);
66
70
  if (!callees) {
67
71
  return undefined;
68
72
  }
69
73
 
70
- return callees.map(item => this.fromCallHierarchyOutgoingCall(item));
74
+ return callees.map(item => this.fromCallHierarchyOutgoingCall(item, definition._sessionId!));
71
75
  }
72
76
 
73
- private fromCallHierarchyItem(item: theia.CallHierarchyItem): model.CallHierarchyDefinition {
74
- return {
77
+ private fromCallHierarchyItem(item: theia.CallHierarchyItem, sessionId: string): dto.CallHierarchyItem {
78
+ const sessionCache = this.cache.get(sessionId)!;
79
+ const itemId = sessionCache.size.toString(36);
80
+ const definition: dto.CallHierarchyItem = {
75
81
  uri: item.uri,
76
- range: this.fromRange(item.range),
77
- selectionRange: this.fromRange(item.selectionRange),
82
+ range: fromRange(item.range),
83
+ selectionRange: fromRange(item.selectionRange),
78
84
  name: item.name,
79
85
  kind: item.kind,
80
86
  tags: item.tags,
81
- data: item.data,
82
- };
83
- }
84
-
85
- private fromRange(range: theia.Range): model.Range {
86
- return {
87
- startLineNumber: range.start.line + 1,
88
- startColumn: range.start.character + 1,
89
- endLineNumber: range.end.line + 1,
90
- endColumn: range.end.character + 1,
87
+ _itemId: itemId,
88
+ _sessionId: sessionId,
91
89
  };
90
+ sessionCache.set(itemId, item);
91
+ return definition;
92
92
  }
93
93
 
94
- private toRange(range: model.Range): types.Range {
95
- return new types.Range(
96
- range.startLineNumber - 1,
97
- range.startColumn - 1,
98
- range.endLineNumber - 1,
99
- range.endColumn - 1,
100
- );
101
- }
102
-
103
- private toCallHierarchyItem(definition: model.CallHierarchyDefinition): theia.CallHierarchyItem {
104
- const item = new types.CallHierarchyItem(
105
- Converter.SymbolKind.toSymbolKind(definition.kind),
106
- definition.name,
107
- definition.detail ? definition.detail : '',
108
- URI.revive(definition.uri),
109
- this.toRange(definition.range),
110
- this.toRange(definition.selectionRange),
111
- );
112
- item.tags = definition.tags;
113
- item.data = definition.data;
114
- return item;
94
+ private toCallHierarchyItem(definition: dto.CallHierarchyItem): theia.CallHierarchyItem {
95
+ const cached = this.cache.get(definition._sessionId!)?.get(definition._itemId!);
96
+ if (!cached) {
97
+ throw new Error(`Found no cached item corresponding to ${definition.name} in ${definition.uri.path} with ID ${definition.data}.`);
98
+ }
99
+ return cached;
115
100
  }
116
101
 
117
- private fromCallHierarchyIncomingCall(caller: theia.CallHierarchyIncomingCall): model.CallHierarchyReference {
102
+ private fromCallHierarchyIncomingCall(caller: theia.CallHierarchyIncomingCall, sessionId: string): dto.CallHierarchyIncomingCall {
118
103
  return {
119
- callerDefinition: this.fromCallHierarchyItem(caller.from),
120
- references: caller.fromRanges.map(l => this.fromRange(l))
104
+ from: this.fromCallHierarchyItem(caller.from, sessionId),
105
+ fromRanges: caller.fromRanges.map(r => fromRange(r))
121
106
  };
122
107
  }
123
108
 
124
- protected fromCallHierarchyOutgoingCall(caller: theia.CallHierarchyOutgoingCall): model.CallHierarchyReference {
109
+ protected fromCallHierarchyOutgoingCall(caller: theia.CallHierarchyOutgoingCall, sessionId: string): dto.CallHierarchyOutgoingCall {
125
110
  return {
126
- callerDefinition: this.fromCallHierarchyItem(caller.to),
127
- references: caller.fromRanges.map(this.fromRange.bind(this)),
111
+ to: this.fromCallHierarchyItem(caller.to, sessionId),
112
+ fromRanges: caller.fromRanges.map(r => fromRange(r)),
128
113
  };
129
114
  }
115
+
116
+ releaseSession(session?: string): Promise<boolean> {
117
+ if (session !== undefined) {
118
+ return Promise.resolve(this.cache.delete(session));
119
+ } else {
120
+ this.cache.clear();
121
+ return Promise.resolve(true);
122
+ }
123
+ }
130
124
  }
@@ -59,9 +59,10 @@ import {
59
59
  CodeAction,
60
60
  FoldingRange,
61
61
  SelectionRange,
62
- CallHierarchyDefinition,
63
- CallHierarchyReference,
64
- ChainedCacheId
62
+ ChainedCacheId,
63
+ CallHierarchyItem,
64
+ CallHierarchyIncomingCall,
65
+ CallHierarchyOutgoingCall,
65
66
  } from '../common/plugin-api-rpc-model';
66
67
  import { CompletionAdapter } from './languages/completion';
67
68
  import { Diagnostics } from './languages/diagnostics';
@@ -612,17 +613,21 @@ export class LanguagesExtImpl implements LanguagesExt {
612
613
 
613
614
  $provideRootDefinition(
614
615
  handle: number, resource: UriComponents, location: Position, token: theia.CancellationToken
615
- ): Promise<CallHierarchyDefinition | CallHierarchyDefinition[] | undefined> {
616
+ ): Promise<CallHierarchyItem[] | undefined> {
616
617
  return this.withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideRootDefinition(URI.revive(resource), location, token), undefined);
617
618
  }
618
619
 
619
- $provideCallers(handle: number, definition: CallHierarchyDefinition, token: theia.CancellationToken): Promise<CallHierarchyReference[] | undefined> {
620
+ $provideCallers(handle: number, definition: CallHierarchyItem, token: theia.CancellationToken): Promise<CallHierarchyIncomingCall[] | undefined> {
620
621
  return this.withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallers(definition, token), undefined);
621
622
  }
622
623
 
623
- $provideCallees(handle: number, definition: CallHierarchyDefinition, token: theia.CancellationToken): Promise<CallHierarchyReference[] | undefined> {
624
+ $provideCallees(handle: number, definition: CallHierarchyItem, token: theia.CancellationToken): Promise<CallHierarchyOutgoingCall[] | undefined> {
624
625
  return this.withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallees(definition, token), undefined);
625
626
  }
627
+
628
+ $releaseCallHierarchy(handle: number, session?: string): Promise<boolean> {
629
+ return this.withAdapter(handle, CallHierarchyAdapter, adapter => adapter.releaseSession(session), false);
630
+ }
626
631
  // ### Call Hierarchy Provider end
627
632
 
628
633
  // #region semantic coloring
@@ -675,7 +675,7 @@ export function toLocation(value: model.Location): types.Location {
675
675
  return new types.Location(URI.revive(value.uri), toRange(value.range));
676
676
  }
677
677
 
678
- export function fromCallHierarchyItem(item: theia.CallHierarchyItem): model.CallHierarchyItem {
678
+ export function fromCallHierarchyItem(item: types.CallHierarchyItem): model.CallHierarchyItem {
679
679
  return <model.CallHierarchyItem>{
680
680
  kind: SymbolKind.fromSymbolKind(item.kind),
681
681
  name: item.name,
@@ -684,7 +684,8 @@ export function fromCallHierarchyItem(item: theia.CallHierarchyItem): model.Call
684
684
  range: fromRange(item.range),
685
685
  selectionRange: fromRange(item.selectionRange),
686
686
  tags: item.tags,
687
- data: item.data,
687
+ _itemId: item._itemId,
688
+ _sessionId: item._sessionId,
688
689
  };
689
690
  }
690
691
 
@@ -698,7 +699,9 @@ export function toCallHierarchyItem(value: model.CallHierarchyItem): types.CallH
698
699
  toRange(value.selectionRange),
699
700
  );
700
701
  item.tags = value.tags;
701
- item.data = value.data;
702
+ item._itemId = value._itemId;
703
+ item._sessionId = value._sessionId;
704
+
702
705
  return item;
703
706
  }
704
707
 
@@ -2437,7 +2437,6 @@ export class CallHierarchyItem {
2437
2437
  range: Range;
2438
2438
  selectionRange: Range;
2439
2439
  tags?: readonly SymbolTag[];
2440
- data?: unknown;
2441
2440
 
2442
2441
  constructor(kind: SymbolKind, name: string, detail: string, uri: URI, range: Range, selectionRange: Range) {
2443
2442
  this.kind = kind;
@@ -2448,7 +2447,7 @@ export class CallHierarchyItem {
2448
2447
  this.selectionRange = selectionRange;
2449
2448
  }
2450
2449
 
2451
- static isCallHierarchyItem(thing: {}): thing is theia.CallHierarchyItem {
2450
+ static isCallHierarchyItem(thing: {}): thing is CallHierarchyItem {
2452
2451
  if (thing instanceof CallHierarchyItem) {
2453
2452
  return true;
2454
2453
  }