/* * Copyright 2000-2012 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.formatting; import com.intellij.openapi.editor.Document; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import org.jetbrains.annotations.NotNull; import java.util.Map; import java.util.Set; /** * Stands for block alignment strategy (e.g. we may want to use different strategies for the different * {@link Alignment.Anchor alignment acnhors}). * * @author Denis Zhdanov * @since 4/28/11 3:55 PM */ public interface BlockAlignmentProcessor { enum Result { /** * This value should be used to indicate that alignment of the target block can't be performed because it doesn't have * a counterparty (e.g. we want to align two blocks and this value is returned after processing the first of them). */ TARGET_BLOCK_PROCESSED_NOT_ALIGNED, /** Alignment is performed for the target block. */ TARGET_BLOCK_ALIGNED, /** Already processed block was realigned because of {@link AlignmentImpl#isAllowBackwardShift() backward alignment}. */ BACKWARD_BLOCK_ALIGNED, /** Detected that backward alignment dependency graph is cycled. */ RECURSION_DETECTED, /** * It was necessary to align already processed block because of {@link AlignmentImpl#isAllowBackwardShift() backward alignment} * but that can't be done (e.g. that backward block {@link AbstractBlockWrapper#getWhiteSpace() white space} is read-only). */ UNABLE_TO_ALIGN_BACKWARD_BLOCK } /** * Asks current processor to perform alignment processing for the parameters encapsulated at the given context. * * @param context target parameters holder * @return processing result */ Result applyAlignment(@NotNull Context context); class Context { @NotNull public final Document document; @NotNull public final AlignmentImpl alignment; @NotNull public final LeafBlockWrapper targetBlock; @NotNull public final Map<AbstractBlockWrapper, Set<AbstractBlockWrapper>> alignmentMappings; @NotNull public final Map<LeafBlockWrapper, Set<LeafBlockWrapper>> backwardShiftedAlignedBlocks; @NotNull public final CommonCodeStyleSettings.IndentOptions indentOptions; public Context(@NotNull Document document, @NotNull AlignmentImpl alignment, @NotNull LeafBlockWrapper targetBlock, @NotNull Map<AbstractBlockWrapper, Set<AbstractBlockWrapper>> alignmentMappings, @NotNull Map<LeafBlockWrapper, Set<LeafBlockWrapper>> backwardShiftedAlignedBlocks, @NotNull CommonCodeStyleSettings.IndentOptions indentOptions) { this.document = document; this.alignment = alignment; this.targetBlock = targetBlock; this.alignmentMappings = alignmentMappings; this.backwardShiftedAlignedBlocks = backwardShiftedAlignedBlocks; this.indentOptions = indentOptions; } } }