use of com.redhat.qute.parser.template.sections.IncludeSection in project quarkus-ls by redhat-developer.
the class QuteDiagnostics method validateDataModel.
private void validateDataModel(Node parent, Template template, QuteValidationSettings validationSettings, ResolvingJavaTypeContext resolvingJavaTypeContext, ResolutionContext currentContext, List<Diagnostic> diagnostics) {
ResolutionContext previousContext = currentContext;
List<Node> children = parent.getChildren();
for (Node node : children) {
switch(node.getKind()) {
case ParameterDeclaration:
{
ParameterDeclaration parameter = (ParameterDeclaration) node;
String javaTypeToResolve = parameter.getJavaType();
if (!StringUtils.isEmpty(javaTypeToResolve)) {
String projectUri = template.getProjectUri();
if (projectUri != null) {
List<JavaTypeRangeOffset> classNameRanges = parameter.getJavaTypeNameRanges();
for (RangeOffset classNameRange : classNameRanges) {
String className = template.getText(classNameRange);
ResolvedJavaTypeInfo resolvedJavaType = resolveJavaType(className, projectUri, resolvingJavaTypeContext);
if (resolvedJavaType == null) {
// Java type doesn't exist
Range range = QutePositionUtility.createRange(classNameRange, template);
Diagnostic diagnostic = createDiagnostic(range, DiagnosticSeverity.Error, QuteErrorCode.UnknownType, className);
diagnostics.add(diagnostic);
} else if (!isResolvingJavaType(resolvedJavaType)) {
currentContext.put(javaTypeToResolve, resolvedJavaType);
}
}
}
}
break;
}
case Section:
{
Section section = (Section) node;
if (canChangeContext(section)) {
currentContext = new ResolutionContext(currentContext);
}
List<Parameter> parameters = section.getParameters();
// validate expression parameters
for (Parameter parameter : parameters) {
Expression expression = parameter.getJavaTypeExpression();
if (expression != null) {
ResolvedJavaTypeInfo result = validateExpression(expression, section, template, validationSettings, previousContext, resolvingJavaTypeContext, diagnostics);
switch(section.getSectionKind()) {
case FOR:
case EACH:
String alias = ((LoopSection) section).getAlias();
currentContext.put(alias, result);
break;
case WITH:
currentContext.setWithObject(result);
break;
case LET:
case SET:
currentContext.put(parameter.getName(), result);
break;
default:
}
}
}
switch(section.getSectionKind()) {
case INCLUDE:
validateIncludeSection((IncludeSection) section, diagnostics);
break;
default:
validateSectionTag(section, template, resolvingJavaTypeContext, diagnostics);
}
break;
}
case Expression:
{
validateExpression((Expression) node, null, template, validationSettings, previousContext, resolvingJavaTypeContext, diagnostics);
break;
}
default:
}
validateDataModel(node, template, validationSettings, resolvingJavaTypeContext, currentContext, diagnostics);
}
}
use of com.redhat.qute.parser.template.sections.IncludeSection in project quarkus-ls by redhat-developer.
the class QuteDocumentLink method findDocumentLinks.
private void findDocumentLinks(Node node, Template template, List<DocumentLink> links) {
List<Node> children = node.getChildren();
for (Node child : children) {
if (child.getKind() == NodeKind.Section) {
Section section = (Section) child;
if (section.getSectionKind() == SectionKind.INCLUDE) {
// #include section case:
IncludeSection includeSection = (IncludeSection) section;
// {#include base.qute.html}
// In this case 'base.qute.html' is a document link
Parameter includedTemplateId = includeSection.getParameterAtIndex(0);
if (includedTemplateId != null) {
Range range = QutePositionUtility.createRange(includedTemplateId.getStart(), includedTemplateId.getEnd(), template);
if (range != null) {
Path templateFile = includeSection.getReferencedTemplateFile();
if (templateFile != null) {
String target = templateFile.toUri().toString();
links.add(new DocumentLink(range, target != null ? target : ""));
}
}
}
}
}
findDocumentLinks(child, template, links);
}
}
use of com.redhat.qute.parser.template.sections.IncludeSection in project quarkus-ls by redhat-developer.
the class QuteDefinition method findDefinitionFromStartEndTagSection.
private static boolean findDefinitionFromStartEndTagSection(int offset, Section section, Template template, List<LocationLink> locations) {
if (section.isInStartTagName(offset)) {
int locationsLength = locations.size();
if (section.getSectionKind() == SectionKind.CUSTOM) {
QuteProject project = template.getProject();
if (project != null) {
String tagName = section.getTag();
UserTag userTag = project.findUserTag(tagName);
if (userTag != null) {
// 1. Jump to custom user tag file inside src/main/resources/templates/tags
String userTagUri = userTag.getUri();
Range targetRange = new Range(new Position(0, 0), new Position(0, 0));
Range originRange = QutePositionUtility.selectStartTagName(section);
locations.add(new LocationLink(userTagUri, targetRange, targetRange, originRange));
} else {
// 2. Jump to custom tag declared in the the {#insert custom-tag of the included
// Qute template (by using {#include base).
Range originRange = null;
Node parent = section.getParent();
while (parent != null) {
if (parent.getKind() == NodeKind.Section) {
Section parentSection = (Section) parent;
if (parentSection.getSectionKind() == SectionKind.INCLUDE) {
IncludeSection includeSection = (IncludeSection) parentSection;
List<QuteIndex> indexes = project.findInsertTagParameter(includeSection.getReferencedTemplateId(), tagName);
if (indexes != null) {
for (QuteIndex index : indexes) {
String linkedTemplateUri = index.getTemplatePath().toUri().toString();
Range linkedTargetRange = index.getRange();
if (originRange == null) {
originRange = QutePositionUtility.selectStartTagName(section);
}
locations.add(new LocationLink(linkedTemplateUri, linkedTargetRange, linkedTargetRange, originRange));
}
}
}
}
parent = parent.getParent();
}
}
}
}
if (section.hasEndTag() && locationsLength == locations.size()) {
// 3. Jump to end tag section
Range originRange = QutePositionUtility.selectStartTagName(section);
Range targetRange = QutePositionUtility.selectEndTagName(section);
locations.add(new LocationLink(template.getUri(), targetRange, targetRange, originRange));
}
return true;
} else if (section.isInEndTagName(offset)) {
if (section.hasStartTag()) {
// Jump to start tag section
Range originRange = QutePositionUtility.selectEndTagName(section);
Range targetRange = QutePositionUtility.selectStartTagName(section);
locations.add(new LocationLink(template.getUri(), targetRange, targetRange, originRange));
}
return true;
}
return false;
}
use of com.redhat.qute.parser.template.sections.IncludeSection in project quarkus-ls by redhat-developer.
the class QuteDiagnostics method validateSectionTag.
private static void validateSectionTag(Section section, Template template, ResolvingJavaTypeContext resolvingJavaTypeContext, List<Diagnostic> diagnostics) {
String tagName = section.getTag();
if (StringUtils.isEmpty(tagName)) {
return;
}
SectionKind sectionKind = section.getSectionKind();
if (sectionKind == SectionKind.CUSTOM) {
if (!resolvingJavaTypeContext.isBinaryUserTagResolved()) {
// Don't validate custom tag, if the binary user tags are not loaded.
return;
}
QuteProject project = template.getProject();
if (project != null) {
// Check if section tag is an user tag
UserTag userTag = project.findUserTag(tagName);
if (userTag != null) {
return;
}
// Check if section tag is a parameter from an include section
Node parent = section.getParent();
while (parent != null) {
if (parent.getKind() == NodeKind.Section) {
Section parentSection = (Section) parent;
if (parentSection.getSectionKind() == SectionKind.INCLUDE) {
IncludeSection includeSection = (IncludeSection) parentSection;
List<QuteIndex> indexes = project.findInsertTagParameter(includeSection.getReferencedTemplateId(), tagName);
if (indexes != null) {
return;
}
}
}
parent = parent.getParent();
}
Range range = QutePositionUtility.selectStartTagName(section);
Diagnostic diagnostic = createDiagnostic(range, DiagnosticSeverity.Error, QuteErrorCode.UndefinedSectionTag, tagName);
// Create data information helpful for code action
diagnostic.setData(DiagnosticDataFactory.createUndefinedSectionTagData(tagName));
diagnostics.add(diagnostic);
}
}
}
Aggregations