Skip to content
Snippets Groups Projects
Commit 32d35778 authored by Johannes Mey's avatar Johannes Mey
Browse files

initial version of auto formatter

parent 7be7e77a
No related branches found
No related tags found
1 merge request!2Feature/autoformat
This commit is part of merge request !2. Comments created here will be created in the context of that merge request.
package org.jastadd.tooling.aspect;
import com.intellij.formatting.*;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.TokenType;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.formatter.common.AbstractBlock;
import com.intellij.psi.formatter.common.InjectedLanguageBlockBuilder;
import com.intellij.psi.formatter.java.LeafBlock;
import org.jastadd.tooling.aspect.psi.JastAddAspectAspectBody;
import org.jastadd.tooling.aspect.psi.JastAddAspectAspectBodyDeclaration;
import org.jastadd.tooling.aspect.psi.JastAddAspectBlock;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class AspectBlock extends AbstractBlock {
private final SpacingBuilder spacingBuilder;
private final InjectedLanguageBlockBuilder myInjectedBlockBuilder;
protected AspectBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment,
SpacingBuilder spacingBuilder) {
super(node, wrap, alignment);
this.spacingBuilder = spacingBuilder;
myInjectedBlockBuilder = new JavaBlockInjectedBlockBuilder();
}
@Override
protected List<Block> buildChildren() {
List<Block> blocks = new ArrayList<>();
if (myNode.getPsi() instanceof JastAddAspectBlock) {
myInjectedBlockBuilder.addInjectedBlocks(blocks, myNode, Wrap.createWrap(WrapType.NONE, false), null, Indent.getIndent(Indent.Type.NONE, false, true));
} else {
ASTNode child = myNode.getFirstChildNode();
while (child != null) {
if (child.getElementType() != TokenType.WHITE_SPACE) {
Block block = new AspectBlock(child, Wrap.createWrap(WrapType.NORMAL, false), null, spacingBuilder);
blocks.add(block);
}
child = child.getTreeNext();
}
}
return blocks;
}
@Override
public Indent getIndent() {
if (myNode.getPsi() instanceof JastAddAspectAspectBodyDeclaration) {
return Indent.getNormalIndent();
} else if (myNode.getPsi() instanceof JastAddAspectAspectBody) {
return Indent.getAbsoluteNoneIndent();
} else {
return Indent.getNoneIndent();
}
}
@Nullable
@Override
public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) {
return spacingBuilder.getSpacing(this, child1, child2);
}
@Override
public boolean isLeaf() {
return myNode.getFirstChildNode() == null;
}
private static class AroundBlockBlock extends LeafBlock {
private final TextRange myRange;
AroundBlockBlock(ASTNode node, Wrap wrap, Alignment alignment, Indent indent, TextRange range) {
super(node, wrap, alignment, indent);
myRange = range;
}
@NotNull
@Override
public TextRange getTextRange() {
return myRange;
}
}
private static class JavaBlockInjectedBlockBuilder extends InjectedLanguageBlockBuilder {
@Override
public CodeStyleSettings getSettings() {
return CodeStyleSettings.getDefaults();
}
@Override
public boolean canProcessFragment(String text, ASTNode injectionHost) {
return true;
}
@Override
public Block createBlockBeforeInjection(ASTNode node, Wrap wrap, Alignment alignment, Indent indent, TextRange range) {
return new AroundBlockBlock(node, wrap, alignment, indent, range);
}
@Override
public Block createBlockAfterInjection(ASTNode node, Wrap wrap, Alignment alignment, Indent indent, TextRange range) {
return new AroundBlockBlock(node, wrap, alignment, Indent.getNoneIndent(), range);
}
}
}
package org.jastadd.tooling.aspect;
import com.intellij.formatting.*;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import org.jastadd.tooling.aspect.psi.AspectTypes;
import org.jetbrains.annotations.NotNull;
public class AspectFormattingModelBuilder implements FormattingModelBuilder {
private static SpacingBuilder createSpaceBuilder(CodeStyleSettings settings) {
return new SpacingBuilder(settings, Aspect.INSTANCE)
.before(AspectTypes.ASPECT).none()
.after(AspectTypes.ASPECT).spaces(1)
.after(AspectTypes.LBRACE).none();
}
@Override
public @NotNull FormattingModel createModel(@NotNull FormattingContext formattingContext) {
final CodeStyleSettings codeStyleSettings = formattingContext.getCodeStyleSettings();
return FormattingModelProvider
.createFormattingModelForPsiFile(formattingContext.getContainingFile(),
new AspectBlock(formattingContext.getNode(),
Wrap.createWrap(WrapType.NONE, false),
Alignment.createAlignment(),
createSpaceBuilder(codeStyleSettings)),
codeStyleSettings);
}
}
...@@ -79,6 +79,8 @@ ...@@ -79,6 +79,8 @@
<annotator language="JAVA" implementationClass="org.jastadd.tooling.java.JavaMethodHighlighter"/> <annotator language="JAVA" implementationClass="org.jastadd.tooling.java.JavaMethodHighlighter"/>
<colorSettingsPage implementation="org.jastadd.tooling.java.JavaColorSettingsPage"/> <colorSettingsPage implementation="org.jastadd.tooling.java.JavaColorSettingsPage"/>
<lang.formatter language="JastAddAspect" implementationClass="org.jastadd.tooling.aspect.AspectFormattingModelBuilder"/>
</extensions> </extensions>
<actions> <actions>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment