qsharp-lang 1.0.18-dev → 1.0.20-rc

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.
@@ -1,4 +1,4 @@
1
- import type { ICompletionList, IHover, IDefinition, ISignatureHelp, IWorkspaceConfiguration, IWorkspaceEdit, ITextEdit } from "../../lib/node/qsc_wasm.cjs";
1
+ import type { ICompletionList, IHover, ILocation, ISignatureHelp, IWorkspaceConfiguration, IWorkspaceEdit, ITextEdit } from "../../lib/node/qsc_wasm.cjs";
2
2
  import { VSDiagnostic } from "../vsdiagnostic.js";
3
3
  import { IServiceProxy } from "../worker-proxy.js";
4
4
  type QscWasm = typeof import("../../lib/node/qsc_wasm.cjs");
@@ -16,7 +16,8 @@ export interface ILanguageService {
16
16
  closeDocument(uri: string): Promise<void>;
17
17
  getCompletions(documentUri: string, offset: number): Promise<ICompletionList>;
18
18
  getHover(documentUri: string, offset: number): Promise<IHover | undefined>;
19
- getDefinition(documentUri: string, offset: number): Promise<IDefinition | undefined>;
19
+ getDefinition(documentUri: string, offset: number): Promise<ILocation | undefined>;
20
+ getReferences(documentUri: string, offset: number, includeDeclaration: boolean): Promise<ILocation[]>;
20
21
  getSignatureHelp(documentUri: string, offset: number): Promise<ISignatureHelp | undefined>;
21
22
  getRename(documentUri: string, offset: number, newName: string): Promise<IWorkspaceEdit | undefined>;
22
23
  prepareRename(documentUri: string, offset: number): Promise<ITextEdit | undefined>;
@@ -40,7 +41,8 @@ export declare class QSharpLanguageService implements ILanguageService {
40
41
  closeDocument(documentUri: string): Promise<void>;
41
42
  getCompletions(documentUri: string, offset: number): Promise<ICompletionList>;
42
43
  getHover(documentUri: string, offset: number): Promise<IHover | undefined>;
43
- getDefinition(documentUri: string, offset: number): Promise<IDefinition | undefined>;
44
+ getDefinition(documentUri: string, offset: number): Promise<ILocation | undefined>;
45
+ getReferences(documentUri: string, offset: number, includeDeclaration: boolean): Promise<ILocation[]>;
44
46
  getSignatureHelp(documentUri: string, offset: number): Promise<ISignatureHelp | undefined>;
45
47
  getRename(documentUri: string, offset: number, newName: string): Promise<IWorkspaceEdit | undefined>;
46
48
  prepareRename(documentUri: string, offset: number): Promise<ITextEdit | undefined>;
@@ -73,10 +73,50 @@ export class QSharpLanguageService {
73
73
  return undefined;
74
74
  }
75
75
  }
76
- result.offset = mapUtf8UnitsToUtf16Units([result.offset], code)[result.offset];
76
+ const mappedSpan = mapUtf8UnitsToUtf16Units([result.span.start, result.span.end], code);
77
+ result.span.start = mappedSpan[result.span.start];
78
+ result.span.end = mappedSpan[result.span.end];
77
79
  }
78
80
  return result;
79
81
  }
82
+ async getReferences(documentUri, offset, includeDeclaration) {
83
+ const sourceCode = this.code[documentUri];
84
+ if (sourceCode === undefined) {
85
+ log.error(`getReferences: expected ${documentUri} to be in the document map`);
86
+ return [];
87
+ }
88
+ const convertedOffset = mapUtf16UnitsToUtf8Units([offset], sourceCode)[offset];
89
+ const results = this.languageService.get_references(documentUri, convertedOffset, includeDeclaration);
90
+ if (results && results.length > 0) {
91
+ const references = [];
92
+ for (const result of results) {
93
+ let resultCode = this.code[result.source];
94
+ // Inspect the URL protocol (equivalent to the URI scheme + ":").
95
+ // If the scheme is our library scheme, we need to call the wasm to
96
+ // provide the library file's contents to do the utf8->utf16 mapping.
97
+ const url = new URL(result.source);
98
+ if (url.protocol === qsharpLibraryUriScheme + ":") {
99
+ resultCode = wasm.get_library_source_content(url.pathname);
100
+ if (resultCode === undefined) {
101
+ log.error(`getReferences: expected ${url} to be in the library`);
102
+ }
103
+ }
104
+ if (resultCode) {
105
+ const mappedSpan = mapUtf8UnitsToUtf16Units([result.span.start, result.span.end], resultCode);
106
+ result.span.start = mappedSpan[result.span.start];
107
+ result.span.end = mappedSpan[result.span.end];
108
+ references.push(result);
109
+ }
110
+ else {
111
+ log.error(`cannot do utf8->utf16 mapping for ${result.source} since contents are not available`);
112
+ }
113
+ }
114
+ return references;
115
+ }
116
+ else {
117
+ return [];
118
+ }
119
+ }
80
120
  async getSignatureHelp(documentUri, offset) {
81
121
  const code = this.code[documentUri];
82
122
  if (code === undefined) {
@@ -8,6 +8,7 @@ const requests = {
8
8
  getCompletions: "request",
9
9
  getHover: "request",
10
10
  getDefinition: "request",
11
+ getReferences: "request",
11
12
  getSignatureHelp: "request",
12
13
  getRename: "request",
13
14
  prepareRename: "request",