Skip to content

Commit 2e94930

Browse files
committed
feat: event name autocomplete
1 parent 4fa5abf commit 2e94930

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed

Diff for: CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to the "magento-toolbox" extension will be documented in thi
44

55
Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
66

7+
## [Unreleased]
8+
9+
- Added: Event name autocomplete
10+
711
## [1.5.0] - 2025-04-06
812
- Added: Class namespace autocomplete in XML files
913
- Added: Module name autocomplete in module.xml files

Diff for: src/completion/XmlCompletionProviderProcessor.ts

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ModuleCompletionProvider } from './xml/ModuleCompletionProvider';
88
import { NamespaceCompletionProvider } from './xml/NamespaceCompletionProvider';
99
import { AclCompletionProvider } from './xml/AclCompletionProvider';
1010
import { TemplateCompletionProvider } from './xml/TemplateCompletionProvider';
11+
import { EventCompletionProvider } from './xml/EventCompletionProvider';
1112

1213
export class XmlCompletionProviderProcessor
1314
extends XmlSuggestionProviderProcessor<CompletionItem>
@@ -19,6 +20,7 @@ export class XmlCompletionProviderProcessor
1920
new NamespaceCompletionProvider(),
2021
new AclCompletionProvider(),
2122
new TemplateCompletionProvider(),
23+
new EventCompletionProvider(),
2224
]);
2325
}
2426

Diff for: src/completion/xml/EventCompletionProvider.ts

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { TextDocument, CompletionItem, CompletionItemKind, Range } from 'vscode';
2+
import IndexManager from 'indexer/IndexManager';
3+
import { XmlSuggestionProvider, CombinedCondition } from 'common/xml/XmlSuggestionProvider';
4+
import { XMLElement, XMLAttribute } from '@xml-tools/ast';
5+
import { AttributeNameMatches } from 'common/xml/suggestion/condition/AttributeNameMatches';
6+
import { ElementNameMatches } from 'common/xml/suggestion/condition/ElementNameMatches';
7+
import EventsIndexer from 'indexer/events/EventsIndexer';
8+
9+
export class EventCompletionProvider extends XmlSuggestionProvider<CompletionItem> {
10+
public getFilePatterns(): string[] {
11+
return ['**/etc/events.xml'];
12+
}
13+
14+
public getAttributeValueConditions(): CombinedCondition[] {
15+
return [[new ElementNameMatches('event'), new AttributeNameMatches('name')]];
16+
}
17+
18+
public getConfigKey(): string | undefined {
19+
return 'provideXmlDefinitions';
20+
}
21+
22+
public getSuggestionItems(
23+
value: string,
24+
range: Range,
25+
document: TextDocument,
26+
element: XMLElement,
27+
attribute?: XMLAttribute
28+
): CompletionItem[] {
29+
const eventIndexData = IndexManager.getIndexData(EventsIndexer.KEY);
30+
31+
if (!eventIndexData) {
32+
return [];
33+
}
34+
35+
const events = eventIndexData.getEventsByPrefix(value);
36+
37+
if (!events) {
38+
return [];
39+
}
40+
41+
return events.map(event => {
42+
const item = new CompletionItem(event.name, CompletionItemKind.Value);
43+
item.range = range;
44+
return item;
45+
});
46+
}
47+
}

Diff for: src/indexer/events/EventsIndexData.ts

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Memoize } from 'typescript-memoize';
22
import EventsIndexer from './EventsIndexer';
33
import { Event } from './types';
44
import { AbstractIndexData } from 'indexer/AbstractIndexData';
5+
import { uniqBy } from 'lodash-es';
56

67
export class EventsIndexData extends AbstractIndexData<Event[]> {
78
@Memoize({ tags: [EventsIndexer.KEY] })
@@ -17,6 +18,11 @@ export class EventsIndexData extends AbstractIndexData<Event[]> {
1718
return this.getEvents().find(event => event.name === eventName);
1819
}
1920

21+
public getEventsByPrefix(prefix: string): Event[] {
22+
const events = this.getEvents().filter(event => event.name.startsWith(prefix));
23+
return uniqBy(events, 'name');
24+
}
25+
2026
public findEventsByObserverInstance(observerInstance: string): Event[] {
2127
return this.getEvents().filter(event =>
2228
event.observers.some(observer => observer.instance === observerInstance)

0 commit comments

Comments
 (0)