Search in sources :

Example 1 with ArrangementStandardSettingsAware

use of com.intellij.psi.codeStyle.arrangement.std.ArrangementStandardSettingsAware in project intellij-community by JetBrains.

the class MemberOrderService method getAnchor.

/**
   * Tries to find an element at the given context which should be the previous sibling for the given 'member'element according to the
   * {@link CommonCodeStyleSettings#getArrangementSettings() user-defined arrangement rules}.
   * <p/>
   * E.g. the IDE might generate given 'member' element and wants to know element after which it should be inserted
   * 
   * @param member    target member which anchor should be calculated
   * @param settings  code style settings to use
   * @param context   given member's context
   * @return          given member's anchor if the one can be computed;
   *                  given 'context' element if given member should be the first child
   *                  {@code null} otherwise
   */
@SuppressWarnings("MethodMayBeStatic")
@Nullable
public PsiElement getAnchor(@NotNull PsiElement member, @NotNull CommonCodeStyleSettings settings, @NotNull PsiElement context) {
    Language language = context.getLanguage();
    Rearranger<?> rearranger = Rearranger.EXTENSION.forLanguage(language);
    if (rearranger == null) {
        return null;
    }
    ArrangementSettings arrangementSettings = settings.getArrangementSettings();
    if (arrangementSettings == null && rearranger instanceof ArrangementStandardSettingsAware) {
        arrangementSettings = ((ArrangementStandardSettingsAware) rearranger).getDefaultSettings();
    }
    if (arrangementSettings == null) {
        return null;
    }
    Pair<? extends ArrangementEntry, ? extends List<? extends ArrangementEntry>> pair = rearranger.parseWithNew(context, null, Collections.singleton(context.getTextRange()), member, arrangementSettings);
    if (pair == null || pair.second.isEmpty()) {
        return null;
    }
    ArrangementEntry memberEntry = pair.first;
    List<? extends ArrangementEntry> entries = pair.second;
    ArrangementEntry parentEntry = entries.get(0);
    List<? extends ArrangementEntry> nonArranged = parentEntry.getChildren();
    List<ArrangementEntry> entriesWithNew = new ArrayList<>(nonArranged);
    entriesWithNew.add(memberEntry);
    //TODO: check insert new element
    final List<? extends ArrangementMatchRule> rulesByPriority = arrangementSettings.getRulesSortedByPriority();
    final List<ArrangementSectionRule> extendedSectionRules = ArrangementUtil.getExtendedSectionRules(arrangementSettings);
    List<ArrangementEntry> arranged = ArrangementEngine.arrange(entriesWithNew, extendedSectionRules, rulesByPriority, null);
    int i = arranged.indexOf(memberEntry);
    if (i <= 0) {
        return context;
    }
    ArrangementEntry anchorEntry = null;
    if (i >= arranged.size() - 1) {
        anchorEntry = nonArranged.get(nonArranged.size() - 1);
    } else {
        Set<ArrangementEntry> entriesBelow = new HashSet<>();
        entriesBelow.addAll(arranged.subList(i + 1, arranged.size()));
        for (ArrangementEntry entry : nonArranged) {
            if (entriesBelow.contains(entry)) {
                break;
            }
            anchorEntry = entry;
        }
    }
    if (anchorEntry == null) {
        return context;
    }
    int offset = anchorEntry.getEndOffset() - 1 - context.getTextRange().getStartOffset();
    PsiElement element = context.findElementAt(offset);
    for (PsiElement e = element; e != null && e.getTextRange().getStartOffset() >= anchorEntry.getStartOffset(); e = e.getParent()) {
        element = e;
    }
    return element;
}
Also used : ArrangementStandardSettingsAware(com.intellij.psi.codeStyle.arrangement.std.ArrangementStandardSettingsAware) ArrayList(java.util.ArrayList) Language(com.intellij.lang.Language) ArrangementSectionRule(com.intellij.psi.codeStyle.arrangement.match.ArrangementSectionRule) PsiElement(com.intellij.psi.PsiElement) HashSet(com.intellij.util.containers.HashSet) Nullable(org.jetbrains.annotations.Nullable)

Example 2 with ArrangementStandardSettingsAware

use of com.intellij.psi.codeStyle.arrangement.std.ArrangementStandardSettingsAware in project intellij-community by JetBrains.

the class ArrangementEngine method arrange.

/**
   * Arranges given PSI root contents that belong to the given ranges.
   *
   * @param file    target PSI root
   * @param ranges  target ranges to use within the given root
   */
public void arrange(@NotNull PsiFile file, @NotNull Collection<TextRange> ranges, @Nullable final ArrangementCallback callback) {
    myCodeChanged = false;
    final Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file);
    if (document == null) {
        return;
    }
    final Rearranger<?> rearranger = Rearranger.EXTENSION.forLanguage(file.getLanguage());
    if (rearranger == null) {
        return;
    }
    final CodeStyleSettings settings = CodeStyleSettingsManager.getInstance(file.getProject()).getCurrentSettings();
    ArrangementSettings arrangementSettings = settings.getCommonSettings(file.getLanguage()).getArrangementSettings();
    if (arrangementSettings == null && rearranger instanceof ArrangementStandardSettingsAware) {
        arrangementSettings = ((ArrangementStandardSettingsAware) rearranger).getDefaultSettings();
    }
    if (arrangementSettings == null) {
        return;
    }
    final DocumentEx documentEx;
    if (document instanceof DocumentEx && !((DocumentEx) document).isInBulkUpdate()) {
        documentEx = (DocumentEx) document;
    } else {
        documentEx = null;
    }
    final Context<? extends ArrangementEntry> context;
    DumbService.getInstance(file.getProject()).setAlternativeResolveEnabled(true);
    try {
        context = Context.from(rearranger, document, file, ranges, arrangementSettings, settings);
    } finally {
        DumbService.getInstance(file.getProject()).setAlternativeResolveEnabled(false);
    }
    ApplicationManager.getApplication().runWriteAction(() -> {
        if (documentEx != null) {
        //documentEx.setInBulkUpdate(true);
        }
        try {
            doArrange(context);
            if (callback != null) {
                callback.afterArrangement(context.moveInfos);
            }
        } finally {
            if (documentEx != null) {
            //documentEx.setInBulkUpdate(false);
            }
        }
    });
}
Also used : DocumentEx(com.intellij.openapi.editor.ex.DocumentEx) CodeStyleSettings(com.intellij.psi.codeStyle.CodeStyleSettings) ArrangementStandardSettingsAware(com.intellij.psi.codeStyle.arrangement.std.ArrangementStandardSettingsAware) Document(com.intellij.openapi.editor.Document)

Aggregations

ArrangementStandardSettingsAware (com.intellij.psi.codeStyle.arrangement.std.ArrangementStandardSettingsAware)2 Language (com.intellij.lang.Language)1 Document (com.intellij.openapi.editor.Document)1 DocumentEx (com.intellij.openapi.editor.ex.DocumentEx)1 PsiElement (com.intellij.psi.PsiElement)1 CodeStyleSettings (com.intellij.psi.codeStyle.CodeStyleSettings)1 ArrangementSectionRule (com.intellij.psi.codeStyle.arrangement.match.ArrangementSectionRule)1 HashSet (com.intellij.util.containers.HashSet)1 ArrayList (java.util.ArrayList)1 Nullable (org.jetbrains.annotations.Nullable)1