aboutsummaryrefslogtreecommitdiffstats
path: root/language-web/src/main/js/xtext/UpdateService.ts
diff options
context:
space:
mode:
Diffstat (limited to 'language-web/src/main/js/xtext/UpdateService.ts')
-rw-r--r--language-web/src/main/js/xtext/UpdateService.ts46
1 files changed, 22 insertions, 24 deletions
diff --git a/language-web/src/main/js/xtext/UpdateService.ts b/language-web/src/main/js/xtext/UpdateService.ts
index 9b672e79..fa48c5ab 100644
--- a/language-web/src/main/js/xtext/UpdateService.ts
+++ b/language-web/src/main/js/xtext/UpdateService.ts
@@ -11,10 +11,10 @@ import { ConditionVariable } from '../utils/ConditionVariable';
11import { getLogger } from '../utils/logger'; 11import { getLogger } from '../utils/logger';
12import { Timer } from '../utils/Timer'; 12import { Timer } from '../utils/Timer';
13import { 13import {
14 IContentAssistEntry, 14 ContentAssistEntry,
15 isContentAssistResult, 15 contentAssistResult,
16 isDocumentStateResult, 16 documentStateResult,
17 isInvalidStateIdConflictResult, 17 isConflictResult,
18} from './xtextServiceResults'; 18} from './xtextServiceResults';
19 19
20const UPDATE_TIMEOUT_MS = 500; 20const UPDATE_TIMEOUT_MS = 500;
@@ -116,11 +116,8 @@ export class UpdateService {
116 serviceType: 'update', 116 serviceType: 'update',
117 fullText: this.store.state.doc.sliceString(0), 117 fullText: this.store.state.doc.sliceString(0),
118 }); 118 });
119 if (isDocumentStateResult(result)) { 119 const { stateId } = documentStateResult.parse(result);
120 return [result.stateId, undefined]; 120 return [stateId, undefined];
121 }
122 log.error('Unexpected full text update result:', result);
123 throw new Error('Full text update failed');
124 } 121 }
125 122
126 /** 123 /**
@@ -146,14 +143,14 @@ export class UpdateService {
146 requiredStateId: this.xtextStateId, 143 requiredStateId: this.xtextStateId,
147 ...delta, 144 ...delta,
148 }); 145 });
149 if (isDocumentStateResult(result)) { 146 const parsedDocumentStateResult = documentStateResult.safeParse(result);
150 return [result.stateId, undefined]; 147 if (parsedDocumentStateResult.success) {
148 return [parsedDocumentStateResult.data.stateId, undefined];
151 } 149 }
152 if (isInvalidStateIdConflictResult(result)) { 150 if (isConflictResult(result, 'invalidStateId')) {
153 return this.doFallbackToUpdateFullText(); 151 return this.doFallbackToUpdateFullText();
154 } 152 }
155 log.error('Unexpected delta text update result:', result); 153 throw parsedDocumentStateResult.error;
156 throw new Error('Delta text update failed');
157 }); 154 });
158 } 155 }
159 156
@@ -171,7 +168,7 @@ export class UpdateService {
171 async fetchContentAssist( 168 async fetchContentAssist(
172 params: Record<string, unknown>, 169 params: Record<string, unknown>,
173 signal: IAbortSignal, 170 signal: IAbortSignal,
174 ): Promise<IContentAssistEntry[]> { 171 ): Promise<ContentAssistEntry[]> {
175 await this.prepareForDeltaUpdate(); 172 await this.prepareForDeltaUpdate();
176 if (signal.aborted) { 173 if (signal.aborted) {
177 return []; 174 return [];
@@ -185,18 +182,19 @@ export class UpdateService {
185 requiredStateId: this.xtextStateId, 182 requiredStateId: this.xtextStateId,
186 ...delta, 183 ...delta,
187 }); 184 });
188 if (isContentAssistResult(result)) { 185 const parsedContentAssistResult = contentAssistResult.safeParse(result);
189 return [result.stateId, result.entries]; 186 if (parsedContentAssistResult.success) {
187 const { stateId, entries: resultEntries } = parsedContentAssistResult.data;
188 return [stateId, resultEntries];
190 } 189 }
191 if (isInvalidStateIdConflictResult(result)) { 190 if (isConflictResult(result, 'invalidStateId')) {
192 const [newStateId] = await this.doFallbackToUpdateFullText(); 191 const [newStateId] = await this.doFallbackToUpdateFullText();
193 // We must finish this state update transaction to prepare for any push events 192 // We must finish this state update transaction to prepare for any push events
194 // before querying for content assist, so we just return `null` and will query 193 // before querying for content assist, so we just return `null` and will query
195 // the content assist service later. 194 // the content assist service later.
196 return [newStateId, null]; 195 return [newStateId, null];
197 } 196 }
198 log.error('Unextpected content assist result with delta update', result); 197 throw parsedContentAssistResult.error;
199 throw new Error('Unexpexted content assist result with delta update');
200 }); 198 });
201 if (entries !== null) { 199 if (entries !== null) {
202 return entries; 200 return entries;
@@ -214,11 +212,11 @@ export class UpdateService {
214 ...params, 212 ...params,
215 requiredStateId: expectedStateId, 213 requiredStateId: expectedStateId,
216 }); 214 });
217 if (isContentAssistResult(result) && result.stateId === expectedStateId) { 215 const { stateId, entries } = contentAssistResult.parse(result);
218 return result.entries; 216 if (stateId !== expectedStateId) {
217 throw new Error(`Unexpected state id, expected: ${expectedStateId} got: ${stateId}`);
219 } 218 }
220 log.error('Unexpected content assist result', result); 219 return entries;
221 throw new Error('Unexpected content assist result');
222 } 220 }
223 221
224 private computeDelta() { 222 private computeDelta() {