mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] owl-vision: Autocomplete and added missing owl directives
This commit adds basic autocomplete in xml files. This includes autocompletion for elements, components, props, attributes, and javascript expressions. It also: - Adds "Go To Definition" support for props and javascript expressions in xml - Support for the following directives: t-att, t-model, t-tag, t-debug, t-log - Fixes t-else syntax highlight to be non-dynamic as the attribute value should be empty
This commit is contained in:
committed by
Géry Debongnie
parent
2eb151c92d
commit
55c48b2b12
@@ -94,6 +94,31 @@ export class Search {
|
||||
return await this.find(templateName, query, "xml");
|
||||
}
|
||||
|
||||
public async getCurrentComponent(): Promise<any | undefined> {
|
||||
if (!this.currentDocument) {
|
||||
return;
|
||||
}
|
||||
|
||||
const text = this.currentDocument.getText();
|
||||
const templateName = this.getTemplateName(text, false);
|
||||
|
||||
if (templateName) {
|
||||
const component = await this.findComponentFromTemplateName(templateName);
|
||||
|
||||
if (component) {
|
||||
const componentFile = await workspace.fs.readFile(component.uri);
|
||||
const componentText = Buffer.from(componentFile).toString('utf8');
|
||||
const componentName = this.getComponentName(componentText, templateName);
|
||||
|
||||
return {
|
||||
uri: component.uri,
|
||||
templateName,
|
||||
componentName,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private findComponentFromTemplateName(templateName: string): Promise<Location | undefined> {
|
||||
const query = this.buildQuery(`template\\s*=\\s*["']`, templateName, `["']`);
|
||||
return this.find(templateName, query, "js");
|
||||
@@ -107,6 +132,27 @@ export class Search {
|
||||
}
|
||||
}
|
||||
|
||||
private getComponentName(str: string, templateName: string): string {
|
||||
const templateNameRegex = new RegExp(`template\\s*=\\s*["'](${templateName})["']`, 'g');
|
||||
const templateIndex = [...str.matchAll(templateNameRegex)][0]?.index ?? 0;
|
||||
|
||||
const matches = [...str.matchAll(new RegExp(`class\\s+([A-Za-z_]+)\\sextends\\s+[A-Za-z_]+`, 'g'))];
|
||||
let result = "";
|
||||
let currentIndex = -1;
|
||||
for (const match of matches) {
|
||||
if (match.index > templateIndex) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (match.index > currentIndex) {
|
||||
result = match[1];
|
||||
currentIndex = match.index;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async find(
|
||||
name: string,
|
||||
searchQuery: string,
|
||||
|
||||
Reference in New Issue
Block a user