Skip to content

Commit e41679b

Browse files
committed
add name completion suggestion for labels after mnemonics
1 parent 938fbe2 commit e41679b

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.ca65;
2+
3+
import com.intellij.codeInsight.completion.*;
4+
import com.intellij.codeInsight.lookup.LookupElementBuilder;
5+
import com.intellij.psi.PsiNamedElement;
6+
import com.intellij.psi.util.PsiTreeUtil;
7+
import com.intellij.util.ProcessingContext;
8+
import org.ca65.psi.AsmTypes;
9+
import org.jetbrains.annotations.NotNull;
10+
11+
import static com.intellij.patterns.PlatformPatterns.psiElement;
12+
13+
public class AsmIdentifierCompletionContributor extends CompletionContributor {
14+
public AsmIdentifierCompletionContributor() {
15+
// Offer to auto-complete identifiers after a mnemonic
16+
extend(CompletionType.BASIC, psiElement().afterLeaf(psiElement(AsmTypes.MNEMONIC)), new LabelCompletionProvider());
17+
}
18+
}
19+
20+
class LabelCompletionProvider extends CompletionProvider<CompletionParameters> {
21+
public void addCompletions(@NotNull CompletionParameters parameters,
22+
@NotNull ProcessingContext context,
23+
@NotNull CompletionResultSet resultSet) {
24+
PsiNamedElement[] namedElements = PsiTreeUtil.getChildrenOfType(parameters.getOriginalFile(), PsiNamedElement.class);
25+
if (namedElements != null) {
26+
for (PsiNamedElement namedElement : namedElements) {
27+
String elementName = namedElement.getName();
28+
if (elementName != null) {
29+
if (!namedElement.getText().startsWith("@")) {
30+
resultSet.addElement(LookupElementBuilder.createWithIcon(namedElement));
31+
} else {
32+
// Present the label name, but complete with '@' prefix.
33+
resultSet.addElement(LookupElementBuilder.create(
34+
"@" + namedElement.getName())
35+
.withPsiElement(namedElement)
36+
.withPresentableText(namedElement.getName())
37+
.withIcon(namedElement.getIcon(0))
38+
);
39+
}
40+
}
41+
}
42+
}
43+
}
44+
}

src/main/java/org/ca65/psi/impl/AsmLabelDefinitionImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package org.ca65.psi.impl;
22

33
import com.intellij.extapi.psi.ASTWrapperPsiElement;
4+
import com.intellij.icons.AllIcons;
45
import com.intellij.lang.ASTNode;
56
import com.intellij.openapi.util.NlsSafe;
67
import com.intellij.psi.PsiElement;
78
import com.intellij.util.IncorrectOperationException;
9+
import org.ca65.AsmIcons;
810
import org.ca65.psi.AsmLabelDefinition;
911
import org.ca65.psi.AsmMarker;
1012
import org.jetbrains.annotations.NotNull;
1113
import org.jetbrains.annotations.Nullable;
1214

15+
import javax.swing.*;
16+
1317
public class AsmLabelDefinitionImpl extends ASTWrapperPsiElement implements AsmLabelDefinition {
1418
public AsmLabelDefinitionImpl(@NotNull ASTNode node) {
1519
super(node);
@@ -29,4 +33,9 @@ public AsmLabelDefinitionImpl(@NotNull ASTNode node) {
2933
public PsiElement setName(@NlsSafe @NotNull String name) throws IncorrectOperationException {
3034
return AsmPsiImplUtil.setName((AsmMarker) this, name);
3135
}
36+
37+
@Override
38+
public @Nullable Icon getIcon(int flags) {
39+
return this.getText().startsWith("@") || this.getText().startsWith(":") ? AllIcons.Nodes.Annotationtype : AsmIcons.LABEL;
40+
}
3241
}

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
<lang.commenter language="6502 Assembly" implementationClass="org.ca65.AsmCommenter"/>
4141
<lang.foldingBuilder language="6502 Assembly"
4242
implementationClass="org.ca65.AsmFoldingBuilder"/>
43+
<completion.contributor language="6502 Assembly" implementationClass="org.ca65.AsmIdentifierCompletionContributor" />
4344
<projectTemplate projectType="6502 Assembly" templatePath="projectTemplates/Generic 6502 Project.zip" category="true"/>
4445
</extensions>
4546

0 commit comments

Comments
 (0)