Skip to content

Commit

Permalink
corrections to formatter to remove unused code, allow .a8 .i8 .a16 .i…
Browse files Browse the repository at this point in the history
…16 to be indented at same level as mnemonics
  • Loading branch information
mike42 committed Jun 30, 2022
1 parent 9ea22b2 commit a765f83
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 165 deletions.
5 changes: 3 additions & 2 deletions src/main/java/org/ca65/Asm.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ implements("identifierdef")="com.intellij.psi.PsiNamedElement"

asmFile ::= item_*

private item_ ::= marker? (dotexpr|imports|define_constant_label|define_constant_numeric|macro|llabel)? COMMENT? EOL_WS
private item_ ::= marker? (dotexpr|register_dotexpr|imports|define_constant_label|define_constant_numeric|macro|llabel)? COMMENT? EOL_WS

marker ::= (LABEL | SHORTLABEL) {
mixin="org.ca65.psi.impl.AsmLabelDefinitionImpl"
Expand All @@ -31,6 +31,7 @@ identifierdef ::= identifierr {
}
imports ::= IMPORT_KEYWORD identifierdef ( COMMA identifierdef )*
dotexpr ::= DOT_KEYWORD expr
register_dotexpr ::= REGISTER_DOT_KEYWORD
macro ::= IDENTIFIER expr
llabel ::= instruction_mnemonic expr?

Expand All @@ -39,7 +40,7 @@ define_constant_label ::= identifierdef ( COLON_EQUALS ) expr

expr ::= anything*

anything ::= (instruction_mnemonic|numeric_literal|STRING_LITERAL|DOT_KEYWORD|identifierr|LABEL|EQUALS|COLON_EQUALS|COMMA|REGISTER|CHAR_LITERAL|LPAREN|RPAREN|LSQUAREBRACKET|RSQUAREBRACKET|OR|LSHIFT|RSHIFT|AND|CONSTEXPR|SHORTLABEL_REF|local_label_rref|SHORTLABEL|HIBYTE|LOBYTE|BOOLOR|BOOLAND|NOT|DIV|MUL|ADD|SUB|XOR|SCOPE_ACCESS)
anything ::= (instruction_mnemonic|numeric_literal|STRING_LITERAL|DOT_KEYWORD|REGISTER_DOT_KEYWORD|identifierr|LABEL|EQUALS|COLON_EQUALS|COMMA|REGISTER|CHAR_LITERAL|LPAREN|RPAREN|LSQUAREBRACKET|RSQUAREBRACKET|OR|LSHIFT|RSHIFT|AND|CONSTEXPR|SHORTLABEL_REF|local_label_rref|SHORTLABEL|HIBYTE|LOBYTE|BOOLOR|BOOLAND|NOT|DIV|MUL|ADD|SUB|XOR|SCOPE_ACCESS)

numeric_literal ::= INT_LITERAL
instruction_mnemonic ::= MNEMONIC
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/org/ca65/Asm.flex
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,13 @@ MNEMONIC = ( ADC | ADD | ALR | ANC | AND | ANE | ARR | ASL | ASR | ASW | AXS | B

REGISTER = (X | Y)

DOT_KEYWORD = "\." ( A16 | A8 | ADDR | ADDRSIZE | ALIGN | AND | ASCIIZ | ASIZE | ASSERT | AUTOIMPORT | BANK | BANKBYTE
DOT_KEYWORD = "\." ( ADDR | ADDRSIZE | ALIGN | AND | ASCIIZ | ASIZE | ASSERT | AUTOIMPORT | BANK | BANKBYTE
| BANKBYTES | BITAND | BITNOT | BITOR | BITXOR | BLANK | BSS | BYT | BYTE | CASE | CHARMAP | CODE
| CONCAT | CONDES | CONST | CONSTRUCTOR | CPU | DATA | DBG | DBYT | DEBUGINFO | DEF | DEFINE | DEFINED
| DEFINEDMACRO | DELMAC | DELMACRO | DESTRUCTOR | DWORD | ELSE | ELSEIF | END | ENDENUM | ENDIF
| ENDMAC | ENDMACRO | ENDPROC | ENDREP | ENDREPEAT | ENDSCOPE | ENDSTRUCT | ENDUNION | ENUM | ERROR
| EXITMAC | EXITMACRO | EXPORT | EXPORTZP | FARADDR | FATAL | FEATURE | FILEOPT | FOPT | FORCEIMPORT
| FORCEWORD | GLOBAL | GLOBALZP | HIBYTE | HIBYTES | HIWORD | I16 | I8 | IDENT | IF | IFBLANK | IFCONST
| FORCEWORD | GLOBAL | GLOBALZP | HIBYTE | HIBYTES | HIWORD | IDENT | IF | IFBLANK | IFCONST
| IFDEF | IFNBLANK | IFNCONST | IFNDEF | IFNREF | IFP02 | IFP4510 | IFP816 | IFPC02 | IFPDTV | IFPSC02
| IFREF | INCBIN | INCLUDE | INTERRUPTOR | ISIZE | ISMNEM | ISMNEMONIC | LEFT
| LINECONT | LIST | LISTBYTES | LITERAL | LOBYTE | LOBYTES | LOCAL | LOCALCHAR | LOWORD | MAC | MACPACK
Expand All @@ -77,6 +77,8 @@ DOT_KEYWORD = "\." ( A16 | A8 | ADDR | ADDRSIZE | ALIGN | AND | ASCIIZ | ASIZE |
| SETCPU | SHL | SHR | SIZEOF | SMART | SPRINTF | STRAT | STRING | STRLEN | STRUCT | TAG | TCOUNT
| TIME | UNDEF | UNDEFINE | UNION | VERSION | WARNING | WORD | XMATCH | XOR | ZEROPAGE )

REGISTER_DOT_KEYWORD = "\." ( A16 | A8 | I16 | I8 )

IMPORT_KEYWORD = "\." (IMPORT | IMPORTZP)

SHORTLABEL_REF = \: (\+ | \-)+
Expand All @@ -92,6 +94,7 @@ LOCAL_LABEL_REF = "@" [A-Za-z_]+[A-Za-z0-9_]*
{MNEMONIC} {return MNEMONIC;}
{REGISTER} {return REGISTER; }
{DOT_KEYWORD} {return DOT_KEYWORD;}
{REGISTER_DOT_KEYWORD} {return REGISTER_DOT_KEYWORD;}
{IMPORT_KEYWORD} {return IMPORT_KEYWORD;}
{IDENTIFIER} {return IDENTIFIER;}
{INT_LITERAL} {return INT_LITERAL;}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/ca65/AsmSyntaxHighlighter.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public TextAttributesKey[] getTokenHighlights(IElementType tokenType) {
return STRING_LITERAL_KEYS;
} else if(tokenType.equals(AsmTypes.MNEMONIC) || tokenType.equals(AsmTypes.REGISTER)) {
return MNEMONIC_KEYS;
} else if(tokenType.equals(AsmTypes.DOT_KEYWORD) || tokenType.equals(AsmTypes.IMPORT_KEYWORD)) {
} else if(tokenType.equals(AsmTypes.DOT_KEYWORD) || tokenType.equals(AsmTypes.IMPORT_KEYWORD) || tokenType.equals(AsmTypes.REGISTER_DOT_KEYWORD)) {
return DOT_KEYWORD_KEYS;
} else if(tokenType.equals(AsmTypes.IDENTIFIER) || tokenType.equals(AsmTypes.LABEL) || tokenType.equals(AsmTypes.LOCAL_LABEL_REF)) {
return IDENTIFIER_KEYS;
Expand Down
49 changes: 37 additions & 12 deletions src/main/java/org/ca65/formatting/AsmBlock.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,63 +2,88 @@

import com.intellij.formatting.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.TokenType;
import com.intellij.psi.formatter.common.AbstractBlock;
import com.intellij.psi.tree.IElementType;
import org.ca65.psi.AsmTypes;
import org.codehaus.groovy.ast.builder.AstSpecificationCompiler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collections;
import java.util.ArrayList;
import java.util.List;

public class AsmBlock extends AbstractBlock {
private final SpacingBuilder mySpacingBuilder;
private final Alignment myCommentAlignment;

public AsmBlock(ASTNode child, Alignment alignment, SpacingBuilder spacingBuilder) {
super(child, null, alignment);
protected AsmBlock(@NotNull ASTNode node, @Nullable Wrap wrap, @Nullable Alignment alignment,
SpacingBuilder spacingBuilder, @Nullable Alignment commentAlignment) {
super(node, wrap, alignment);
this.mySpacingBuilder = spacingBuilder;
this.myCommentAlignment = commentAlignment;
}

@Override
protected List<Block> buildChildren() {
return Collections.emptyList();
List<Block> blocks = new ArrayList<>();
ASTNode child = myNode.getFirstChildNode();
while (child != null) {
IElementType elementType = child.getElementType();
if (elementType != TokenType.WHITE_SPACE) {
if (elementType == AsmTypes.COMMENT) {
blocks.add(new AsmBlock(child, Wrap.createWrap(WrapType.NONE, false), myCommentAlignment, mySpacingBuilder, myCommentAlignment));
} else {
blocks.add(new AsmBlock(child, Wrap.createWrap(WrapType.NONE, false), Alignment.createAlignment(), mySpacingBuilder, myCommentAlignment));
}
}
child = child.getTreeNext();
}
return blocks;
}

@Override
public Indent getIndent() {
return Indent.getNoneIndent();
}


@Nullable
@Override
public Spacing getSpacing(@Nullable Block child1, @NotNull Block child2) {
Spacing commentSpacing = getCommentSpacing(child1, child2);
if(commentSpacing != null) {
if (commentSpacing != null) {
return commentSpacing;
}
// Go on with normal stuff
return mySpacingBuilder.getSpacing(this, child1, child2);
}

private Spacing getCommentSpacing(@Nullable Block child1, @NotNull Block child2) {
// First check if this is an end-of-line comment.
Block parent = this;
// Well well well.
if (!(child1 instanceof ASTBlock) || !(child2 instanceof ASTBlock)) {
return null;
}

// First check if this is an end-of-line comment?
ASTBlock blockChild1 = (ASTBlock) child1;
ASTBlock blockChild2 = (ASTBlock) child2;
if ((blockChild1.getNode().getElementType() != AsmTypes.LLABEL && blockChild1.getNode().getElementType() != AsmTypes.INSTRUCTION_MNEMONIC) || blockChild2.getNode().getElementType() != AsmTypes.COMMENT) {
IElementType block1Type = blockChild1.getNode().getElementType();
if ((block1Type == AsmTypes.EOL_WS) || blockChild2.getNode().getElementType() != AsmTypes.COMMENT) {
return null;
}
return Spacing.createSpacing(50, 50, 0, false, 0);
// Well this quite a big hack
int indentSize = (block1Type == AsmTypes.LLABEL || block1Type == AsmTypes.MACRO || block1Type == AsmTypes.INSTRUCTION_MNEMONIC || block1Type == AsmTypes.REGISTER_DOTEXPR) ? 4 : 0;
int lenSoFar = indentSize + blockChild1.getTextRange().getLength();
int targetLen = 36;
int spacesBeforeComment = targetLen - lenSoFar;
while (spacesBeforeComment < 1) {
spacesBeforeComment += 4;
}
return Spacing.createSpacing(spacesBeforeComment, spacesBeforeComment, 0, false, 0);
}

@Override
public boolean isLeaf() {
return myNode.getFirstChildNode() == null;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ private static SpacingBuilder createSpaceBuilder(CodeStyleSettings settings) {
.spaces(1)
.between(AsmTypes.EOL_WS, TokenSet.create(AsmTypes.LLABEL, AsmTypes.MACRO))
.spaces(4)
.between(AsmTypes.EOL_WS, TokenSet.create(AsmTypes.MARKER, AsmTypes.DOTEXPR, AsmTypes.IMPORTS, AsmTypes.DEFINE_CONSTANT_NUMERIC, AsmTypes.DEFINE_CONSTANT_LABEL))
.between(AsmTypes.EOL_WS, TokenSet.create(AsmTypes.MARKER, AsmTypes.IMPORTS, AsmTypes.DOTEXPR, AsmTypes.DEFINE_CONSTANT_NUMERIC, AsmTypes.DEFINE_CONSTANT_LABEL))
.spaces(0)
.between(AsmTypes.EOL_WS, AsmTypes.REGISTER_DOTEXPR)
.spaces(4)
.between(AsmTypes.EOL_WS, AsmTypes.COMMENT)
.spacing(0, 4, 0, false, 0)
.between(AsmTypes.INSTRUCTION_MNEMONIC, AsmTypes.EXPR)
Expand All @@ -28,7 +30,7 @@ private static SpacingBuilder createSpaceBuilder(CodeStyleSettings settings) {
final Alignment commentAlignment = Alignment.createAlignment(true, Alignment.Anchor.LEFT);
return FormattingModelProvider
.createFormattingModelForPsiFile(formattingContext.getContainingFile(),
new AsmStatementMaybe(formattingContext.getNode(),
new AsmBlock(formattingContext.getNode(),
Wrap.createWrap(WrapType.NONE, false),
Alignment.createAlignment(),
createSpaceBuilder(codeStyleSettings),
Expand Down
57 changes: 0 additions & 57 deletions src/main/java/org/ca65/formatting/AsmRootBlock.java

This file was deleted.

89 changes: 0 additions & 89 deletions src/main/java/org/ca65/formatting/AsmStatementMaybe.java

This file was deleted.

0 comments on commit a765f83

Please sign in to comment.