Skip to content

Commit cb5286b

Browse files
committed
#37 Get rid of name attribute in Transition artificial ast node
1 parent 37efe8b commit cb5286b

File tree

5 files changed

+30
-27
lines changed

5 files changed

+30
-27
lines changed

src/language-server/task-list/identity/model.ts

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ export namespace TransitionDerivativeName {
1111
return [sourceTaskId, targetTaskId]
1212
}
1313

14+
export function ofNew(newTransition: semantic.NewTransition): TransitionDerivativeName {
15+
return [newTransition.sourceTask.id, newTransition.targetTask.id]
16+
}
17+
1418
export function of(sourceTaskId: string, targetTaskId: string): TransitionDerivativeName {
1519
return [sourceTaskId, targetTaskId]
1620
}

src/language-server/task-list/lms/task-list-facade.ts

+14-12
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ export class TaskListLangiumModelServerFacade extends AbstractLangiumModelServer
8888
}
8989

9090
const newTransition = semantic.Transition.createNew(sourceTask, targetTask)
91-
if (!this.identityManager.getIdentityIndex(lmsDocument).transitions.isNameFit(newTransition.name)) {
92-
return ModificationResult.failedValidation(`Unable to fit supplied transition name ${newTransition.name}: invalid value`)
91+
const newTransitionName = identity.TransitionDerivativeName.ofNew(newTransition)
92+
if (!this.identityManager.getIdentityIndex(lmsDocument).transitions.isNameFit(newTransitionName)) {
93+
return ModificationResult.failedValidation(`Unable to fit supplied transition name ${newTransitionName}: invalid value`)
9394
}
9495

9596
let anchorModel: semantic.IdentifiedTransition | undefined
@@ -101,7 +102,7 @@ export class TaskListLangiumModelServerFacade extends AbstractLangiumModelServer
101102
}
102103
const textEdit = this.computeTransitionCreation(newTransition, anchorModel)
103104

104-
return this.applyTextEdit(lmsDocument, textEdit, 'Created new transition: ' + newTransition.name)
105+
return this.applyTextEdit(lmsDocument, textEdit, 'Created new transition: ' + newTransitionName)
105106
}
106107

107108
public updateTask(rootModelId: string, modelId: string, taskModification: Modification<Task>): MaybePromise<ModificationResult> | undefined {
@@ -170,18 +171,19 @@ export class TaskListLangiumModelServerFacade extends AbstractLangiumModelServer
170171
}
171172

172173
const newTransition = semantic.Transition.createNew(newSourceTask ?? transition.sourceTask, newTargetTask ?? transition.targetTask)
173-
if (!transition.identity.isNewNameFit(newTransition.name)) {
174-
return ModificationResult.failedValidation(`Unable to fit supplied transition name ${newTransition.name}: invalid value`)
174+
const newTransitionName = identity.TransitionDerivativeName.ofNew(newTransition)
175+
if (!transition.identity.isNewNameFit(newTransitionName)) {
176+
return ModificationResult.failedValidation(`Unable to fit supplied transition name ${newTransitionName}: invalid value`)
175177
}
176178

177179
const sourceEdit = this.computeTransitionUpdate(lmsDocument, transition, newTransition)
178180

179181
if (sourceEdit.size > 0) {
180-
const rollback = transition.identity.updateName(newTransition.name)
182+
const rollback = transition.identity.updateName(newTransitionName)
181183
if (!rollback) {
182-
return ModificationResult.failedValidation(`Unable to rename transition to '${newTransition.name}'`)
184+
return ModificationResult.failedValidation(`Unable to rename transition to '${newTransitionName}'`)
183185
}
184-
return this.applySourceEdit(sourceEdit, 'Updated transition: ' + transition.name + 'to ' + newTransition.name, rollback)
186+
return this.applySourceEdit(sourceEdit, 'Updated transition: ' + transition.identity.name + 'to ' + newTransitionName, rollback)
185187
} else {
186188
return ModificationResult.unmodified()
187189
}
@@ -331,7 +333,7 @@ export class TaskListLangiumModelServerFacade extends AbstractLangiumModelServer
331333

332334
private computeTransitionUpdate(lmsDocument: LmsDocument, transition: semantic.IdentifiedTransition, newTransition: semantic.NewTransition): SourceEdit {
333335
if (!transition.$cstNode) {
334-
throw new Error('Cannot locate model ' + transition.name + '(' + transition.id + ') in text')
336+
throw new Error('Cannot locate model ' + transition.identity.name + '(' + transition.id + ') in text')
335337
}
336338
const sourceEdit = new SourceEdit()
337339
if (newTransition.sourceTask !== transition.sourceTask) {
@@ -392,10 +394,10 @@ export class TaskListLangiumModelServerFacade extends AbstractLangiumModelServer
392394
// TODO: Extract to separate component (that will be responsible for TextEdit computation)
393395
private computeTransitionDeletion(lmsDocument: LmsDocument, transition: semantic.IdentifiedTransition): [SourceEdit, string] {
394396

395-
console.debug('Computing Deletion edit for Transition with name', transition.name)
397+
console.debug('Computing Deletion edit for Transition with name', transition.identity.name)
396398
const task = transition.sourceTask
397399
if (!transition.$cstNode || !task.$cstNode) {
398-
throw new Error('Cannot locate model ' + transition.name + '(' + transition.id + ') in text')
400+
throw new Error('Cannot locate model ' + transition.identity.name + '(' + transition.id + ') in text')
399401
}
400402

401403
let start: Position
@@ -417,7 +419,7 @@ export class TaskListLangiumModelServerFacade extends AbstractLangiumModelServer
417419
}
418420
const sourceEdit = SourceEdit.ofSingleEdit(lmsDocument.uri, TextEdit.del({ start, end }))
419421

420-
return [sourceEdit, 'Deleted transition ' + transition.name]
422+
return [sourceEdit, 'Deleted transition ' + transition.identity.name]
421423
}
422424

423425
private applyTextEdit(lmsDocument: LmsDocument, textEdit: TextEdit, label: string, rollback?: id.StateRollback): Promise<ModificationResult> {

src/language-server/task-list/lms/task-list-model-update-calculation.ts

+7-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { AbstractModelUpdateCalculators, compareModelWithExistingBefore, deleteI
55
import type { Initialized } from '../../../langium-model-server/workspace/documents'
66
import type { TaskListIdentityIndex } from '../identity'
77
import type { TaskListIdentityManager } from '../identity/manager'
8-
import * as identity from '../identity/model'
8+
import type * as identity from '../identity/model'
99
import type * as semantic from '../semantic/model'
1010
import type { QueriableTaskListSemanticDomain } from '../semantic/task-list-semantic-domain'
1111
import type { TaskListServices } from '../task-list-module'
@@ -108,14 +108,13 @@ function applyTransitionChanges(update: ElementUpdate<Transition>,
108108
previous: semantic.IdentifiedTransition | identity.TransitionIdentity,
109109
current: semantic.IdentifiedTransition
110110
): void {
111-
const currentProperties = identity.TransitionDerivativeName.toProperties(current.name)
112111
if (previous !== current.identity) {
113-
const previousProperties = identity.TransitionDerivativeName.toProperties(previous.name)
114-
Update.assignIfUpdated(update, 'sourceTaskId', previousProperties.sourceTaskId, currentProperties.sourceTaskId)
115-
Update.assignIfUpdated(update, 'targetTaskId', previousProperties.targetTaskId, currentProperties.targetTaskId)
112+
const previousModel = previous as semantic.IdentifiedTransition
113+
Update.assignIfUpdated(update, 'sourceTaskId', previousModel.sourceTask.id, current.sourceTask.id)
114+
Update.assignIfUpdated(update, 'targetTaskId', previousModel.targetTask.id, current.targetTask.id)
116115
} else {
117-
console.info(`Can't compare attributes of Transition '${current.id}' with name=${current.name}: previous semantic Transition is missing`)
118-
Update.assign(update, 'sourceTaskId', currentProperties.sourceTaskId)
119-
Update.assign(update, 'targetTaskId', currentProperties.targetTaskId)
116+
console.info(`Can't compare attributes of Transition '${current.id}' with name=${current.identity.name}: previous semantic Transition is missing`)
117+
Update.assign(update, 'sourceTaskId', current.sourceTask.id)
118+
Update.assign(update, 'targetTaskId', current.targetTask.id)
120119
}
121120
}

src/language-server/task-list/semantic/model/transition.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ import { findNodeForProperty } from 'langium'
22
import * as sem from '../../../../langium-model-server/semantic/model'
33
import { isDefined } from '../../../../langium-model-server/utils/predicates'
44
import type * as ast from '../../../generated/ast'
5-
import * as identity from '../../identity/model'
5+
import type * as identity from '../../identity/model'
66
import type { IdentifiedTask } from './task'
77

88
export type NewTransition = {
9-
name: identity.TransitionDerivativeName
109
sourceTask: IdentifiedTask,
1110
targetTask: IdentifiedTask
1211
}
@@ -27,7 +26,6 @@ export namespace Transition {
2726
return {
2827
sourceTask,
2928
targetTask,
30-
name: identity.TransitionDerivativeName.of(sourceTask.id, targetTask.id)
3129
}
3230
}
3331

@@ -39,9 +37,7 @@ export namespace Transition {
3937
if (sem.ResolvedReference.is(reference)
4038
&& isTaskReferenceValidated(sourceTask, referenceIndex)
4139
&& sem.Identified.is(reference.ref)) {
42-
const name = identity.TransitionDerivativeName.of(sourceTask.id, reference.ref.id)
4340
return {
44-
name,
4541
sourceTask,
4642
targetTask: reference.ref,
4743
$type: 'Transition',

src/language-server/task-list/semantic/task-list-identity-reconciler.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { IdentityReconciler } from '../../../langium-model-server/semantic/
33
import type { Initialized } from '../../../langium-model-server/workspace/documents'
44
import type * as ast from '../../generated/ast'
55
import type { TaskListIdentityManager } from '../identity/manager'
6+
import { TransitionDerivativeName } from '../identity/model'
67
import type * as source from '../lms/model'
78
import type { TaskListModelUpdateCalculators } from '../lms/task-list-model-update-calculation'
89
import type { TaskListServices } from '../task-list-module'
@@ -74,11 +75,12 @@ export class TaskListIdentityReconciler implements IdentityReconciler<source.Mod
7475
const existingUnmappedIdentities = new Set(transitionIdentities.values())
7576
semanticDomain.getValidatedTransitions()
7677
.forEach(transition => {
77-
let transitionIdentity = transitionIdentities.byName(transition.name)
78+
const name = TransitionDerivativeName.ofNew(transition)
79+
let transitionIdentity = transitionIdentities.byName(name)
7880
if (transitionIdentity) {
7981
existingUnmappedIdentities.delete(transitionIdentity)
8082
} else {
81-
transitionIdentity = transitionIdentities.addNew(transition.name)
83+
transitionIdentity = transitionIdentities.addNew(name)
8284
}
8385
semanticDomain.identifyTransition(transition, transitionIdentity)
8486
})

0 commit comments

Comments
 (0)