25 switch (highlightKind) {
90 switch (highlightKind) {
150
151
152
153
154
155
160 static QSet<QString> noConstructorObjects = { u"Math"_s, u"JSON"_s, u"Atomics"_s, u"Reflect"_s,
164 if (noConstructorObjects.contains(name))
167 if (item.directParent().internalKind() == DomType::ScriptNewMemberExpression) {
170 if (DomItem containingCallExpression = item.filterUp(
171 [](DomType k,
const DomItem &) {
return k == DomType::ScriptCallExpression; },
172 FilterUpOptions::ReturnOuter)) {
175 const auto callee = containingCallExpression.field(Fields::callee);
176 if (callee.internalKind() == DomType::ScriptBinaryExpression) {
177 const auto right = callee.field(Fields::right);
178 if (right.internalKind() == DomType::ScriptIdentifierExpression
179 && right.field(Fields::identifier).value().toString() == name) {
193 using namespace QLspSpecification;
194 using namespace Utils;
197 if (highlightModifier.testFlag(QmlHighlightModifier::QmlPropertyDefinition))
198 addModifier(SemanticTokenModifiers::Definition, &modifier);
200 if (highlightModifier.testFlag(QmlHighlightModifier::QmlDefaultProperty))
201 addModifier(SemanticTokenModifiers::DefaultLibrary, &modifier);
203 if (highlightModifier.testFlag(QmlHighlightModifier::QmlFinalProperty))
204 addModifier(SemanticTokenModifiers::Static, &modifier);
206 if (highlightModifier.testFlag(QmlHighlightModifier::QmlRequiredProperty))
207 addModifier(SemanticTokenModifiers::Abstract, &modifier);
209 if (highlightModifier.testFlag(QmlHighlightModifier::QmlReadonlyProperty))
210 addModifier(SemanticTokenModifiers::Readonly, &modifier);
217 QMultiMap<QString, QString> fieldFilterAdd{};
218 QMultiMap<QString, QString> fieldFilterRemove{
219 { QString(), Fields::propertyInfos.toString() },
220 { QString(), Fields::fileLocationsTree.toString() },
221 { QString(), Fields::importScope.toString() },
222 { QString(), Fields::defaultPropertyName.toString() },
223 { QString(), Fields::get.toString() },
225 return FieldFilter{ fieldFilterAdd, fieldFilterRemove };
230 QmlHighlightModifiers modifiers)
236 const std::optional<HighlightsRange> &range)
241 [
this](
const Path &path,
const DomItem &item,
bool b) {
242 return this->visitor(path, item, b);
244 VisitOption::Default | VisitOption::NoPath, emptyChildrenVisitor, emptyChildrenVisitor,
245 highlightingFilter());
250 if (m_range.has_value()) {
251 const auto fLocs = FileLocations::treeOf(item);
254 const auto regions = fLocs->info().regions;
255 if (!Utils::rangeOverlapsWithSourceLocation(regions[MainRegion],
259 switch (item.internalKind()) {
260 case DomType::Comment: {
261 highlightComment(item);
264 case DomType::Import: {
265 highlightImport(item);
268 case DomType::Binding: {
269 highlightBinding(item);
272 case DomType::Pragma: {
273 highlightPragma(item);
276 case DomType::EnumDecl: {
277 highlightEnumDecl(item);
280 case DomType::EnumItem: {
281 highlightEnumItem(item);
284 case DomType::QmlObject: {
285 highlightQmlObject(item);
288 case DomType::QmlComponent: {
289 highlightComponent(item);
292 case DomType::PropertyDefinition: {
293 highlightPropertyDefinition(item);
296 case DomType::MethodInfo: {
297 highlightMethod(item);
300 case DomType::ScriptLiteral: {
301 highlightScriptLiteral(item);
304 case DomType::ScriptCallExpression: {
305 highlightCallExpression(item);
308 case DomType::ScriptIdentifierExpression: {
309 highlightIdentifier(item);
313 if (item.ownerAs<ScriptExpression>())
314 highlightScriptExpressions(item);
317 Q_UNREACHABLE_RETURN(
false);
322 const auto comment = item.as<Comment>();
324 const auto locs = Utils::sourceLocationsFromMultiLineToken(
325 comment->info().comment(), comment->info().sourceLocation());
326 for (
const auto &loc : locs)
327 addHighlight(loc, QmlHighlightKind::Comment);
332 const auto fLocs = FileLocations::treeOf(item);
335 const auto regions = fLocs->info().regions;
336 const auto import = item.as<Import>();
338 addHighlight(regions[ImportTokenRegion], QmlHighlightKind::QmlKeyword);
339 if (import->uri.isModule())
340 addHighlight(regions[ImportUriRegion], QmlHighlightKind::QmlImportId);
342 addHighlight(regions[ImportUriRegion], QmlHighlightKind::String);
343 if (regions.contains(VersionRegion))
344 addHighlight(regions[VersionRegion], QmlHighlightKind::Number);
345 if (regions.contains(AsTokenRegion)) {
346 addHighlight(regions[AsTokenRegion], QmlHighlightKind::QmlKeyword);
347 addHighlight(regions[IdNameRegion], QmlHighlightKind::QmlNamespace);
353 const auto binding = item.as<Binding>();
355 const auto fLocs = FileLocations::treeOf(item);
357 qCDebug(semanticTokens) <<
"Can't find the locations for" << item.internalKind();
360 const auto regions = fLocs->info().regions;
362 if (binding->name().contains(
"."_L1))
365 if (binding->bindingType() != BindingType::Normal) {
366 addHighlight(regions[OnTokenRegion], QmlHighlightKind::QmlKeyword);
367 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlProperty);
371 return addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlProperty);
376 const auto fLocs = FileLocations::treeOf(item);
379 const auto regions = fLocs->info().regions;
380 addHighlight(regions[PragmaKeywordRegion], QmlHighlightKind::QmlKeyword);
381 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlPragmaName );
382 const auto pragma = item.as<Pragma>();
383 for (
auto i = 0; i < pragma->values.size(); ++i) {
384 DomItem value = item.field(Fields::values).index(i);
385 const auto valueRegions = FileLocations::treeOf(value)->info().regions;
386 addHighlight(valueRegions[PragmaValuesRegion], QmlHighlightKind::QmlPragmaValue);
393 const auto fLocs = FileLocations::treeOf(item);
396 const auto regions = fLocs->info().regions;
397 addHighlight(regions[EnumKeywordRegion], QmlHighlightKind::QmlKeyword);
398 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlEnumName);
403 const auto fLocs = FileLocations::treeOf(item);
406 const auto regions = fLocs->info().regions;
407 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlEnumMember);
408 if (regions.contains(EnumValueRegion))
409 addHighlight(regions[EnumValueRegion], QmlHighlightKind::Number);
414 const auto qmlObject = item.as<QmlObject>();
416 const auto fLocs = FileLocations::treeOf(item);
419 const auto regions = fLocs->info().regions;
421 if (!qmlObject->idStr().isEmpty()) {
422 addHighlight(regions[IdTokenRegion], QmlHighlightKind::QmlProperty);
423 addHighlight(regions[IdNameRegion], QmlHighlightKind::QmlLocalId);
426 if (qmlObject->name().contains(
"."_L1))
429 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlType);
434 const auto fLocs = FileLocations::treeOf(item);
437 const auto regions = fLocs->info().regions;
438 const auto componentKeywordIt = regions.constFind(ComponentKeywordRegion);
439 if (componentKeywordIt == regions.constEnd())
441 addHighlight(*componentKeywordIt, QmlHighlightKind::QmlKeyword);
442 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlType);
447 const auto propertyDef = item.as<PropertyDefinition>();
448 Q_ASSERT(propertyDef);
449 const auto fLocs = FileLocations::treeOf(item);
452 const auto regions = fLocs->info().regions;
454 if (propertyDef->isDefaultMember) {
456 addHighlight(regions[DefaultKeywordRegion], QmlHighlightKind::QmlKeyword);
458 if (propertyDef->isFinal) {
460 addHighlight(regions[FinalKeywordRegion], QmlHighlightKind::QmlKeyword);
462 if (propertyDef->isRequired) {
464 addHighlight(regions[RequiredKeywordRegion], QmlHighlightKind::QmlKeyword);
466 if (propertyDef->isReadonly) {
468 addHighlight(regions[ReadonlyKeywordRegion], QmlHighlightKind::QmlKeyword);
470 addHighlight(regions[PropertyKeywordRegion], QmlHighlightKind::QmlKeyword);
471 if (propertyDef->isAlias())
472 addHighlight(regions[TypeIdentifierRegion], QmlHighlightKind::QmlKeyword);
474 addHighlight(regions[TypeIdentifierRegion], QmlHighlightKind::QmlType);
476 addHighlight(regions[TypeModifierRegion], QmlHighlightKind::QmlTypeModifier);
477 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlProperty,
483 const auto method = item.as<MethodInfo>();
485 const auto fLocs = FileLocations::treeOf(item);
488 const auto regions = fLocs->info().regions;
489 switch (method->methodType) {
490 case MethodInfo::Signal: {
491 addHighlight(regions[SignalKeywordRegion], QmlHighlightKind::QmlKeyword);
492 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlMethod);
495 case MethodInfo::Method: {
496 addHighlight(regions[FunctionKeywordRegion], QmlHighlightKind::QmlKeyword);
497 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlMethod);
498 addHighlight(regions[TypeIdentifierRegion], QmlHighlightKind::QmlType);
505 for (
auto i = 0; i < method->parameters.size(); ++i) {
506 DomItem parameter = item.field(Fields::parameters).index(i);
507 const auto paramRegions = FileLocations::treeOf(parameter)->info().regions;
508 addHighlight(paramRegions[IdentifierRegion],
509 QmlHighlightKind::QmlMethodParameter);
510 addHighlight(paramRegions[TypeIdentifierRegion], QmlHighlightKind::QmlType);
517 const auto literal = item.as<ScriptElements::Literal>();
519 const auto fLocs = FileLocations::treeOf(item);
522 const auto regions = fLocs->info().regions;
523 if (std::holds_alternative<QString>(literal->literalValue())) {
524 const auto file = item.containingFile().as<QmlFile>();
527 const auto &code = file->engine()->code();
528 const auto offset = regions[MainRegion].offset;
529 const auto length = regions[MainRegion].length;
530 const QStringView literalCode = QStringView{code}.mid(offset, length);
531 const auto &locs = Utils::sourceLocationsFromMultiLineToken(
532 literalCode, regions[MainRegion]);
533 for (
const auto &loc : locs)
534 addHighlight(loc, QmlHighlightKind::String);
535 }
else if (std::holds_alternative<
double>(literal->literalValue()))
536 addHighlight(regions[MainRegion], QmlHighlightKind::Number);
537 else if (std::holds_alternative<
bool>(literal->literalValue()))
538 addHighlight(regions[MainRegion], QmlHighlightKind::QmlKeyword);
539 else if (std::holds_alternative<std::nullptr_t>(literal->literalValue()))
540 addHighlight(regions[MainRegion], QmlHighlightKind::QmlKeyword);
542 qCWarning(semanticTokens) <<
"Invalid literal variant";
547 using namespace QLspSpecification;
548 const auto id = item.as<ScriptElements::IdentifierExpression>();
550 const auto loc = id->mainRegionLocation();
554 if (m_highlights.contains(loc.offset))
560 if (QQmlLSUtils::isFieldMemberAccess(item))
561 highlightFieldMemberAccess(item, loc);
563 highlightBySemanticAnalysis(item, loc);
568 const auto highlight = [
this](
const DomItem &item) {
569 if (item.internalKind() == DomType::ScriptIdentifierExpression) {
570 const auto id = item.as<ScriptElements::IdentifierExpression>();
572 const auto loc = id->mainRegionLocation();
573 addHighlight(loc, QmlHighlightKind::QmlMethod);
577 if (item.internalKind() == DomType::ScriptCallExpression) {
579 const auto callee = item.field(Fields::callee);
580 if (callee.internalKind() == DomType::ScriptIdentifierExpression) {
583 }
else if (callee.internalKind() == DomType::ScriptBinaryExpression) {
585 const auto right = callee.field(Fields::right);
586 if (right.internalKind() == DomType::ScriptIdentifierExpression)
594 QQmlJS::SourceLocation loc)
598 const auto name = item.field(Fields::identifier).value().toString();
599 if (!name.isEmpty() && name.at(0).category() == QChar::Letter_Uppercase) {
602 return highlightBySemanticAnalysis(item, loc);
605 const auto expression =
606 QQmlLSUtils::resolveExpressionType(item, QQmlLSUtils::ResolveOptions::ResolveOwnerType);
609 addHighlight(loc, QmlHighlightKind::Field);
613 if (expression->type == QQmlLSUtils::MethodIdentifier
614 || expression->type == QQmlLSUtils::LambdaMethodIdentifier) {
615 addHighlight(loc, QmlHighlightKind::QmlMethod);
618 return addHighlight(loc, QmlHighlightKind::Field);
622void HighlightingVisitor::highlightBySemanticAnalysis(
const DomItem &item, QQmlJS::SourceLocation loc)
624 const auto expression = QQmlLSUtils::resolveExpressionType(
625 item, QQmlLSUtils::ResolveOptions::ResolveOwnerType);
628 addHighlight(loc, QmlHighlightKind::Unknown);
631 switch (expression->type) {
632 case QQmlLSUtils::QmlComponentIdentifier:
633 addHighlight(loc, QmlHighlightKind::QmlType);
635 case QQmlLSUtils::JavaScriptIdentifier: {
638 if (
const auto scope = expression->semanticScope) {
639 if (
const auto jsIdentifier = scope->jsIdentifier(*expression->name)) {
640 if (jsIdentifier->kind == QQmlJSScope::JavaScriptIdentifier::Parameter)
642 if (jsIdentifier->isConst) {
645 addHighlight(loc, tokenType, modifier);
649 if (
const auto name = expression->name) {
650 if (
const auto highlightKind = resolveJsGlobalObjectKind(item, *name))
651 return addHighlight(loc, *highlightKind);
655 case QQmlLSUtils::PropertyIdentifier: {
656 if (
const auto scope = expression->semanticScope) {
658 if (scope == item.qmlObject().semanticScope()) {
660 }
else if (scope == item.rootQmlObject(GoTo::MostLikely).semanticScope()) {
665 const auto property = scope->property(expression->name.value());
667 if (!property.isWritable())
669 addHighlight(loc, tokenType, modifier);
673 case QQmlLSUtils::PropertyChangedSignalIdentifier:
674 addHighlight(loc, QmlHighlightKind::QmlSignal);
676 case QQmlLSUtils::PropertyChangedHandlerIdentifier:
677 addHighlight(loc, QmlHighlightKind::QmlSignalHandler);
679 case QQmlLSUtils::SignalIdentifier:
680 addHighlight(loc, QmlHighlightKind::QmlSignal);
682 case QQmlLSUtils::SignalHandlerIdentifier:
683 addHighlight(loc, QmlHighlightKind::QmlSignalHandler);
685 case QQmlLSUtils::MethodIdentifier:
686 addHighlight(loc, QmlHighlightKind::QmlMethod);
688 case QQmlLSUtils::QmlObjectIdIdentifier: {
689 const auto qmlfile = item.fileObject().as<QmlFile>();
691 addHighlight(loc, QmlHighlightKind::Unknown);
694 const auto resolver = qmlfile->typeResolver();
696 addHighlight(loc, QmlHighlightKind::Unknown);
699 const auto &objects = resolver->objectsById();
700 if (expression->name.has_value()) {
701 const auto &name = expression->name.value();
702 const auto boundName =
703 objects.id(expression->semanticScope, item.qmlObject().semanticScope());
704 if (!boundName.isEmpty() && name == boundName) {
706 addHighlight(loc, QmlHighlightKind::QmlLocalId);
709 addHighlight(loc, QmlHighlightKind::QmlExternalId);
713 addHighlight(loc, QmlHighlightKind::QmlExternalId);
717 case QQmlLSUtils::SingletonIdentifier:
718 addHighlight(loc, QmlHighlightKind::QmlType);
720 case QQmlLSUtils::EnumeratorIdentifier:
721 addHighlight(loc, QmlHighlightKind::QmlEnumName);
723 case QQmlLSUtils::EnumeratorValueIdentifier:
724 addHighlight(loc, QmlHighlightKind::QmlEnumMember);
726 case QQmlLSUtils::AttachedTypeIdentifier:
727 case QQmlLSUtils::AttachedTypeIdentifierInBindingTarget:
728 addHighlight(loc, QmlHighlightKind::QmlType);
730 case QQmlLSUtils::GroupedPropertyIdentifier:
731 addHighlight(loc, QmlHighlightKind::QmlProperty);
733 case QQmlLSUtils::QualifiedModuleIdentifier:
734 addHighlight(loc, QmlHighlightKind::QmlNamespace);
737 qCWarning(semanticTokens)
738 << QString::fromLatin1(
"Semantic token for %1 has not been implemented yet")
739 .arg(
int(expression->type));
745 const auto fLocs = FileLocations::treeOf(item);
748 const auto regions = fLocs->info().regions;
749 switch (item.internalKind()) {
750 case DomType::ScriptLiteral:
751 highlightScriptLiteral(item);
753 case DomType::ScriptForStatement:
754 addHighlight(regions[ForKeywordRegion], QmlHighlightKind::QmlKeyword);
755 addHighlight(regions[TypeIdentifierRegion],
756 QmlHighlightKind::QmlKeyword);
759 case DomType::ScriptVariableDeclaration: {
760 addHighlight(regions[TypeIdentifierRegion],
761 QmlHighlightKind::QmlKeyword);
764 case DomType::ScriptReturnStatement:
765 addHighlight(regions[ReturnKeywordRegion], QmlHighlightKind::QmlKeyword);
767 case DomType::ScriptCaseClause:
768 addHighlight(regions[CaseKeywordRegion], QmlHighlightKind::QmlKeyword);
770 case DomType::ScriptDefaultClause:
771 addHighlight(regions[DefaultKeywordRegion], QmlHighlightKind::QmlKeyword);
773 case DomType::ScriptSwitchStatement:
774 addHighlight(regions[SwitchKeywordRegion], QmlHighlightKind::QmlKeyword);
776 case DomType::ScriptWhileStatement:
777 addHighlight(regions[WhileKeywordRegion], QmlHighlightKind::QmlKeyword);
779 case DomType::ScriptDoWhileStatement:
780 addHighlight(regions[DoKeywordRegion], QmlHighlightKind::QmlKeyword);
781 addHighlight(regions[WhileKeywordRegion], QmlHighlightKind::QmlKeyword);
783 case DomType::ScriptTryCatchStatement:
784 addHighlight(regions[TryKeywordRegion], QmlHighlightKind::QmlKeyword);
785 addHighlight(regions[CatchKeywordRegion], QmlHighlightKind::QmlKeyword);
786 addHighlight(regions[FinallyKeywordRegion], QmlHighlightKind::QmlKeyword);
788 case DomType::ScriptForEachStatement:
789 addHighlight(regions[TypeIdentifierRegion], QmlHighlightKind::QmlKeyword);
790 addHighlight(regions[ForKeywordRegion], QmlHighlightKind::QmlKeyword);
791 addHighlight(regions[InOfTokenRegion], QmlHighlightKind::QmlKeyword);
793 case DomType::ScriptThrowStatement:
794 addHighlight(regions[ThrowKeywordRegion], QmlHighlightKind::QmlKeyword);
796 case DomType::ScriptBreakStatement:
797 addHighlight(regions[BreakKeywordRegion], QmlHighlightKind::QmlKeyword);
799 case DomType::ScriptContinueStatement:
800 addHighlight(regions[ContinueKeywordRegion], QmlHighlightKind::QmlKeyword);
802 case DomType::ScriptIfStatement:
803 addHighlight(regions[IfKeywordRegion], QmlHighlightKind::QmlKeyword);
804 addHighlight(regions[ElseKeywordRegion], QmlHighlightKind::QmlKeyword);
806 case DomType::ScriptLabelledStatement:
807 addHighlight(regions[IdentifierRegion], QmlHighlightKind::JsLabel);
809 case DomType::ScriptConditionalExpression:
810 addHighlight(regions[QuestionMarkTokenRegion], QmlHighlightKind::Operator);
811 addHighlight(regions[ColonTokenRegion], QmlHighlightKind::Operator);
813 case DomType::ScriptUnaryExpression:
814 case DomType::ScriptPostExpression:
815 addHighlight(regions[OperatorTokenRegion], QmlHighlightKind::Operator);
817 case DomType::ScriptType:
818 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlType);
819 addHighlight(regions[TypeIdentifierRegion], QmlHighlightKind::QmlType);
821 case DomType::ScriptFunctionExpression: {
822 addHighlight(regions[FunctionKeywordRegion], QmlHighlightKind::QmlKeyword);
823 addHighlight(regions[IdentifierRegion], QmlHighlightKind::QmlMethod);
826 case DomType::ScriptYieldExpression:
827 addHighlight(regions[YieldKeywordRegion], QmlHighlightKind::QmlKeyword);
829 case DomType::ScriptThisExpression:
830 addHighlight(regions[ThisKeywordRegion], QmlHighlightKind::QmlKeyword);
832 case DomType::ScriptSuperLiteral:
833 addHighlight(regions[SuperKeywordRegion], QmlHighlightKind::QmlKeyword);
835 case DomType::ScriptNewMemberExpression:
836 case DomType::ScriptNewExpression:
837 addHighlight(regions[NewKeywordRegion], QmlHighlightKind::QmlKeyword);
839 case DomType::ScriptTemplateExpressionPart:
840 addHighlight(regions[DollarLeftBraceTokenRegion], QmlHighlightKind::Operator);
841 visitor(Path(), item.field(Fields::expression),
false);
842 addHighlight(regions[RightBraceRegion], QmlHighlightKind::Operator);
844 case DomType::ScriptTemplateLiteral:
845 addHighlight(regions[LeftBacktickTokenRegion], QmlHighlightKind::String);
846 addHighlight(regions[RightBacktickTokenRegion], QmlHighlightKind::String);
848 case DomType::ScriptTemplateStringPart: {
850 QString code = item.field(Fields::value).value().toString();
851 const auto &locs = Utils::sourceLocationsFromMultiLineToken(
852 code, regions[MainRegion]);
853 for (
const auto &loc : locs)
854 addHighlight(loc, QmlHighlightKind::String);
858 qCDebug(semanticTokens) <<
"Script Expressions with kind" << item.internalKind()
859 <<
"not implemented";
864 QmlHighlightModifiers modifierKind)
866 return Utils::addHighlight(m_highlights, loc, highlightKind, modifierKind);
870
871
872
873
874
875
876
877
880 const QQmlJS::SourceLocation &locationInDocument)
882 auto lineBreakLength = qsizetype(std::char_traits<
char>::length(
"\n"));
883 const auto lineLengths = [&lineBreakLength](QStringView literal) {
884 std::vector<qsizetype> lineLengths;
885 qsizetype startIndex = 0;
886 qsizetype pos = literal.indexOf(u'\n');
893 if (pos - 1 > 0 && literal[pos - 1] == u'\r') {
895 lineBreakLength = qsizetype(std::char_traits<
char>::length(
"\r\n"));
899 lineLengths.push_back(pos - startIndex);
901 startIndex = pos + lineBreakLength;
902 pos = literal.indexOf(
'\n'_L1, startIndex);
905 if (startIndex < literal.length()) {
906 lineLengths.push_back(literal.length() - startIndex);
911 QList<QQmlJS::SourceLocation> result;
914 QQmlJS::SourceLocation lineLoc = locationInDocument;
915 for (
const auto lineLength : lineLengths(stringLiteral)) {
916 lineLoc.length = lineLength;
917 result.push_back(lineLoc);
920 lineLoc.offset += lineLoc.length + lineBreakLength;
922 lineLoc.startColumn = 1;
930 constexpr auto tokenEncodingLength = 5;
931 result.reserve(tokenEncodingLength * highlights.size());
935 const auto m_mapToProtocol = mode == HighlightingMode::Default
936 ? mapToProtocolDefault
937 : mapToProtocolForQtCreator;
938 std::for_each(highlights.constBegin(), highlights.constEnd(), [&](
const auto &token) {
939 int length = token.loc.length;
940 int line = token.loc.startLine - 1;
941 int col = token.loc.startColumn - 1;
942 Q_ASSERT(line >= prevLine);
943 if (line != prevLine)
945 result.emplace_back(line - prevLine);
946 result.emplace_back(col - prevColumn);
947 result.emplace_back(length);
948 result.emplace_back(m_mapToProtocol(token.kind));
949 result.emplace_back(fromQmlModifierKindToLspTokenType(token.modifiers));
958
959
960
961
962
963
964
965
966
971 *baseModifier |= (1 <<
int(modifier));
975
976
977
981 int startOffsetItem =
int(loc.offset);
982 int endOffsetItem = startOffsetItem +
int(loc.length);
987
988
989
992 int length = resultID.length();
993 for (
int i = length - 1; i >= 0; --i) {
994 if (resultID[i] ==
'9') {
997 resultID[i] = resultID[i] + 1;
1001 resultID.prepend(
'1');
1005
1006
1007
1008
1009
1013 const auto [oldStart, newStart] =
1014 std::mismatch(oldData.cbegin(), oldData.cend(), newData.cbegin(), newData.cend());
1018 const auto [r1, r2] = std::mismatch(oldData.crbegin(), std::make_reverse_iterator(oldStart),
1019 newData.crbegin(), std::make_reverse_iterator(newStart));
1020 const auto oldEnd = r1.base();
1021 const auto newEnd = r2.base();
1024 if (oldStart == oldEnd && newStart == newEnd)
1027 SemanticTokensEdit edit;
1028 edit.start =
int(std::distance(newData.cbegin(), newStart));
1029 edit.deleteCount =
int(std::distance(oldStart, oldEnd));
1031 if (newStart >= newData.cbegin() && newEnd <= newData.cend() && newStart < newEnd)
1032 edit.data.emplace(newStart, newEnd);
1034 return { std::move(edit) };
1038 const QQmlJS::SourceLocation &loc,
1040 QmlHighlightModifiers modifierKind)
1042 if (!loc.isValid() || loc.length == 0) {
1043 qCDebug(semanticTokens)
1044 <<
"Invalid locations: Cannot add highlight to token";
1047 if (!out.contains(loc.offset))
1048 out.insert(loc.offset,
HighlightToken(loc, highlightKind, modifierKind));
1052 const std::optional<HighlightsRange> &range)
1054 using namespace QQmlJS::Dom;
1056 return highlightDomElements.highlights();
1060 const std::optional<HighlightsRange> &range,
1061 HighlightingMode mode)
1063 return Utils::encodeSemanticTokens(visitTokens(item, range), mode);