[angular] WEB-66165 "Rearrange tag attributes" does not work inside angular 17 control flow.

(cherry picked from commit faed76860dbfc008facd65afc6d44cc29efa342c)

IJ-CR-175460

GitOrigin-RevId: c9851b9bdd27505d6bc59b00070ebc5860ebb11d
This commit is contained in:
Piotr Tomiak
2025-09-11 17:48:41 +02:00
committed by intellij-monorepo-bot
parent 1f4fd0119f
commit 1ab2b433b9
3 changed files with 47 additions and 29 deletions

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xml.arrangement; package com.intellij.xml.arrangement;
import com.intellij.application.options.CodeStyle; import com.intellij.application.options.CodeStyle;
@@ -7,7 +7,6 @@ import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Document;
import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.codeStyle.arrangement.*; import com.intellij.psi.codeStyle.arrangement.*;
import com.intellij.psi.codeStyle.arrangement.match.StdArrangementEntryMatcher; import com.intellij.psi.codeStyle.arrangement.match.StdArrangementEntryMatcher;
import com.intellij.psi.codeStyle.arrangement.match.StdArrangementMatchRule; import com.intellij.psi.codeStyle.arrangement.match.StdArrangementMatchRule;
@@ -52,25 +51,36 @@ public class HtmlRearranger extends XmlRearranger {
} }
@Override @Override
public @NotNull List<XmlElementArrangementEntry> parse(@NotNull PsiElement root, protected @NotNull XmlArrangementVisitor createVisitor(
@Nullable Document document, @NotNull XmlArrangementParseInfo info,
@NotNull Collection<? extends TextRange> ranges, @Nullable Document document,
@NotNull ArrangementSettings settings) { @NotNull Collection<? extends TextRange> ranges
final XmlArrangementParseInfo parseInfo = new XmlArrangementParseInfo(); ) {
root.accept(new XmlArrangementVisitor(parseInfo, ranges) { return new HtmlArrangementVisitor(info, document, ranges);
@Override }
protected void postProcessTag(@NotNull XmlTag xmlTag, @NotNull XmlElementArrangementEntry xmlTagEntry) {
addEntriesForEmbeddedContent(xmlTag, xmlTagEntry, document, ranges); protected static class HtmlArrangementVisitor extends XmlArrangementVisitor {
} @Nullable private final Document myDocument;
});
return parseInfo.getEntries(); public HtmlArrangementVisitor(@NotNull XmlArrangementParseInfo info,
@Nullable Document document,
@NotNull Collection<? extends TextRange> ranges) {
super(info, ranges);
myDocument = document;
}
@Override
protected void postProcessTag(@NotNull XmlTag xmlTag, @NotNull XmlElementArrangementEntry xmlTagEntry) {
addEntriesForEmbeddedContent(xmlTag, xmlTagEntry, myDocument, myRanges);
}
} }
private static void addEntriesForEmbeddedContent(@NotNull XmlTag xmlTag, private static void addEntriesForEmbeddedContent(@NotNull XmlTag xmlTag,
@NotNull XmlElementArrangementEntry xmlTagEntry, @NotNull XmlElementArrangementEntry xmlTagEntry,
@Nullable Document document, @Nullable Document document,
@NotNull Collection<? extends TextRange> ranges) { @NotNull Collection<? extends TextRange> ranges) {
if (!StringUtil.equals(xmlTag.getName(), BasicHtmlUtil.SCRIPT_TAG_NAME) && !StringUtil.equals(xmlTag.getName(), BasicHtmlUtil.STYLE_TAG_NAME)) { if (!StringUtil.equals(xmlTag.getName(), BasicHtmlUtil.SCRIPT_TAG_NAME) &&
!StringUtil.equals(xmlTag.getName(), BasicHtmlUtil.STYLE_TAG_NAME)) {
return; return;
} }
for (XmlTagChild child : xmlTag.getValue().getChildren()) { for (XmlTagChild child : xmlTag.getValue().getChildren()) {

View File

@@ -26,7 +26,7 @@ public class XmlArrangementVisitor extends XmlElementVisitor {
private final Stack<XmlElementArrangementEntry> myStack = new Stack<>(); private final Stack<XmlElementArrangementEntry> myStack = new Stack<>();
private final XmlArrangementParseInfo myInfo; private final XmlArrangementParseInfo myInfo;
private final Collection<? extends TextRange> myRanges; protected final Collection<? extends TextRange> myRanges;
public XmlArrangementVisitor(@NotNull XmlArrangementParseInfo info, @NotNull Collection<? extends TextRange> ranges) { public XmlArrangementVisitor(@NotNull XmlArrangementParseInfo info, @NotNull Collection<? extends TextRange> ranges) {
myInfo = info; myInfo = info;
@@ -122,6 +122,6 @@ public class XmlArrangementVisitor extends XmlElementVisitor {
} }
return false; return false;
} }
} }

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xml.arrangement; package com.intellij.xml.arrangement;
import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Document;
@@ -42,7 +42,8 @@ public class XmlRearranger
Collections.emptyList(), DEFAULT_MATCH_RULES); Collections.emptyList(), DEFAULT_MATCH_RULES);
} }
private static final DefaultArrangementSettingsSerializer SETTINGS_SERIALIZER = new DefaultArrangementSettingsSerializer(DEFAULT_SETTINGS); private static final DefaultArrangementSettingsSerializer SETTINGS_SERIALIZER =
new DefaultArrangementSettingsSerializer(DEFAULT_SETTINGS);
public static @NotNull StdArrangementMatchRule attrArrangementRule(@NotNull String nameFilter, public static @NotNull StdArrangementMatchRule attrArrangementRule(@NotNull String nameFilter,
@NotNull String namespaceFilter, @NotNull String namespaceFilter,
@@ -66,10 +67,10 @@ public class XmlRearranger
@Override @Override
public boolean isEnabled(@NotNull ArrangementSettingsToken token, @Nullable ArrangementMatchCondition current) { public boolean isEnabled(@NotNull ArrangementSettingsToken token, @Nullable ArrangementMatchCondition current) {
return SUPPORTED_TYPES.contains(token) return SUPPORTED_TYPES.contains(token)
|| StdArrangementTokens.Regexp.NAME.equals(token) || StdArrangementTokens.Regexp.NAME.equals(token)
|| StdArrangementTokens.Regexp.XML_NAMESPACE.equals(token) || StdArrangementTokens.Regexp.XML_NAMESPACE.equals(token)
|| KEEP.equals(token) || KEEP.equals(token)
|| BY_NAME.equals(token); || BY_NAME.equals(token);
} }
@Override @Override
@@ -82,17 +83,16 @@ public class XmlRearranger
@Nullable Document document, @Nullable Document document,
@NotNull Collection<? extends TextRange> ranges, @NotNull Collection<? extends TextRange> ranges,
@NotNull PsiElement element, @NotNull PsiElement element,
@NotNull ArrangementSettings settings) @NotNull ArrangementSettings settings) {
{
final XmlArrangementParseInfo newEntryInfo = new XmlArrangementParseInfo(); final XmlArrangementParseInfo newEntryInfo = new XmlArrangementParseInfo();
element.accept(new XmlArrangementVisitor(newEntryInfo, Collections.singleton(element.getTextRange()))); element.accept(createVisitor(newEntryInfo, document, Collections.singleton(element.getTextRange())));
if (newEntryInfo.getEntries().size() != 1) { if (newEntryInfo.getEntries().size() != 1) {
return null; return null;
} }
final XmlElementArrangementEntry entry = newEntryInfo.getEntries().get(0); final XmlElementArrangementEntry entry = newEntryInfo.getEntries().get(0);
final XmlArrangementParseInfo existingEntriesInfo = new XmlArrangementParseInfo(); final XmlArrangementParseInfo existingEntriesInfo = new XmlArrangementParseInfo();
root.accept(new XmlArrangementVisitor(existingEntriesInfo, ranges)); root.accept(createVisitor(existingEntriesInfo, document, ranges));
return Pair.create(entry, existingEntriesInfo.getEntries()); return Pair.create(entry, existingEntriesInfo.getEntries());
} }
@@ -102,7 +102,7 @@ public class XmlRearranger
@NotNull Collection<? extends TextRange> ranges, @NotNull Collection<? extends TextRange> ranges,
@NotNull ArrangementSettings settings) { @NotNull ArrangementSettings settings) {
final XmlArrangementParseInfo parseInfo = new XmlArrangementParseInfo(); final XmlArrangementParseInfo parseInfo = new XmlArrangementParseInfo();
root.accept(new XmlArrangementVisitor(parseInfo, ranges)); root.accept(createVisitor(parseInfo, document, ranges));
return parseInfo.getEntries(); return parseInfo.getEntries();
} }
@@ -133,4 +133,12 @@ public class XmlRearranger
public @NotNull ArrangementEntryMatcher buildMatcher(@NotNull ArrangementMatchCondition condition) throws IllegalArgumentException { public @NotNull ArrangementEntryMatcher buildMatcher(@NotNull ArrangementMatchCondition condition) throws IllegalArgumentException {
throw new IllegalArgumentException("Can't build a matcher for condition " + condition); throw new IllegalArgumentException("Can't build a matcher for condition " + condition);
} }
protected @NotNull XmlArrangementVisitor createVisitor(
@NotNull XmlArrangementParseInfo info,
@Nullable Document document,
@NotNull Collection<? extends TextRange> ranges
) {
return new XmlArrangementVisitor(info, ranges);
}
} }