in nasm/src/main/java/com/nasmlanguage/NASMAnnotator.java [44:255]
public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolder holder) {
if (element instanceof NASMIdentifier) {
NASMIdentifier nasmIdentifier = (NASMIdentifier) element;
PsiElement parentElement = nasmIdentifier.getParent();
if (parentElement != null) {
if (parentElement instanceof NASMIStruc || parentElement instanceof NASMStruc) {
highlightTextRange(nasmIdentifier.getTextRange(), NASMSyntaxHighlighter.NASM_STRUCTURE, holder);
NASMLabelIdentifier[] labelIdentifiers = PsiTreeUtil.getChildrenOfType(parentElement, NASMLabelIdentifier.class);
if (labelIdentifiers != null) {
String identifierText = nasmIdentifier.getText();
if (identifierText != null) {
for (NASMLabelIdentifier labelIdentifier : labelIdentifiers) {
if (labelIdentifier.getText().contains(identifierText)) {
TextRange tr = labelIdentifier.getTextRange();
int len = identifierText.length();
highlightTextRange(tr, NASMSyntaxHighlighter.NASM_STRUCTURE, holder);
highlightTextRange(tr.getStartOffset() + len, 1, NASMSyntaxHighlighter.NASM_SEPARATOR, holder);
}
}
}
}
List<NASMIdentifier> identifierRefs = NASMUtil.findIdentifierReferences(parentElement.getContainingFile(), nasmIdentifier);
for (NASMIdentifier identifierRef : identifierRefs) {
//NASMInstruction parentInstruction = PsiTreeUtil.getParentOfType(identifierRef, NASMInstruction.class);
//if (parentInstruction != null)
highlightTextRange(identifierRef.getTextRange(), NASMSyntaxHighlighter.NASM_STRUCTURE, holder);
}
} else if (parentElement instanceof NASMMacro ||
parentElement instanceof NASMMacroCall ||
parentElement instanceof NASMAssign ||
parentElement instanceof NASMStrlen) {
ASTNode identifierNode = parentElement.getNode().findChildByType(NASMTypes.IDENTIFIER);
if (identifierNode != null) {
highlightTextRange(identifierNode.getTextRange(), NASMSyntaxHighlighter.NASM_MACRO, holder);
}
} else if (parentElement instanceof NASMInstruction) {
List<NASMLabel> labels = NASMUtil.findLabels(parentElement.getContainingFile());
for (NASMLabel label : labels) {
String labelIdentifierText = label.getName();
if (labelIdentifierText != null && labelIdentifierText.equals(nasmIdentifier.getText())) {
TextRange tr = nasmIdentifier.getTextRange();
highlightTextRange(tr.getStartOffset(), tr.getLength(), NASMSyntaxHighlighter.NASM_LABEL, holder);
}
}
}
}
} else if (element instanceof NASMConstant) {
PsiElement idElement = ((NASMConstant) element).getId();
highlightTextRange(idElement.getTextRange(), NASMSyntaxHighlighter.NASM_CONSTANT, holder);
List<NASMIdentifier> identifierRefs = NASMUtil.findIdentifierReferencesById(element.getContainingFile(), idElement.getText());
for (NASMIdentifier identifierRef : identifierRefs) {
highlightTextRange(identifierRef.getTextRange(), NASMSyntaxHighlighter.NASM_CONSTANT, holder);
}
} else if (element instanceof NASMDefine) {
NASMIdentifier defineIdentifier = ((NASMDefine) element).getDefineIdentifier();
highlightTextRange(defineIdentifier.getTextRange(), NASMSyntaxHighlighter.NASM_MACRO, holder);
List<NASMIdentifier> identifierRefs = NASMUtil.findIdentifierReferences(element.getContainingFile(), defineIdentifier);
for (NASMIdentifier identifierRef : identifierRefs) {
PsiElement identifierParent = identifierRef.getParent();
if (identifierParent != null &&
!(identifierParent instanceof NASMDefine) && !(identifierParent instanceof NASMMacroCall)) {
highlightTextRange(identifierRef.getTextRange(), NASMSyntaxHighlighter.NASM_MACRO, holder);
}
}
} else if (element instanceof NASMLabel) {
NASMLabelDefMacro nasmLabelDefMacro = ((NASMLabel) element).getLabelDefMacro();
if (nasmLabelDefMacro != null) {
PsiElement labelDefId = nasmLabelDefMacro.getId();
highlightTextRange(labelDefId.getTextRange(), NASMSyntaxHighlighter.NASM_MACRO, holder);
List<NASMExpr> nasmExprList = nasmLabelDefMacro.getExprList();
if (nasmExprList.size() == 1) {
NASMExpr nasmLabelDefMacroExpr = nasmExprList.get(0);
highlightTextRange(nasmLabelDefMacroExpr.getTextRange(), NASMSyntaxHighlighter.NASM_LABEL, holder);
}
}
} else if (element instanceof NASMLabelIdentifier) {
PsiElement parentElement = element.getParent();
if (!((parentElement instanceof NASMStruc) || (parentElement instanceof NASMIStruc))) {
PsiElement labelIdElement = ((NASMLabelIdentifier) element).getId();
if (labelIdElement != null) {
highlightTextRange(labelIdElement.getTextRange(), NASMSyntaxHighlighter.NASM_LABEL, holder);
}
}
} else if (element instanceof NASMStructureField) {
PsiElement structField = ((NASMStructureField) element).getIdExtension();
String structFieldText = structField.getText();
int separatorIdx = structFieldText.indexOf('.');
if (separatorIdx != -1) {
String fieldText = structFieldText.substring(separatorIdx + 1);
TextRange tr = structField.getTextRange();
highlightTextRange(tr.getStartOffset(), separatorIdx, NASMSyntaxHighlighter.NASM_STRUCTURE_FIELD, holder);
highlightTextRange(tr.getStartOffset() + separatorIdx, 1, NASMSyntaxHighlighter.NASM_SEPARATOR, holder);
highlightTextRange(tr.getStartOffset() + separatorIdx + 1, fieldText.length(), NASMSyntaxHighlighter.NASM_LABEL, holder);
}
} else if (element instanceof NASMSegmentAddress) {
// Handle segment (left side) value
PsiElement segmentElement = ((NASMSegmentAddress) element).getSegmentAddrL();
if (segmentElement != null) { // It's a number on the left
String segAddrText = segmentElement.getText();
int separatorIdx = segAddrText.indexOf(':');
TextRange tr = segmentElement.getTextRange();
highlightTextRange(tr.getStartOffset() + separatorIdx, 1, NASMSyntaxHighlighter.NASM_SEPARATOR, holder);
}
// Label def
else {
segmentElement = ((NASMSegmentAddress) element).getLblDef();
if (segmentElement != null) { // It's an identifer on the left
String lblDefText = segmentElement.getText();
int separatorIdx = lblDefText.indexOf(':');
TextRange tr = segmentElement.getTextRange();
highlightTextRange(tr.getStartOffset() + separatorIdx, 1, NASMSyntaxHighlighter.NASM_SEPARATOR, holder);
String lblDefIdentifierText = lblDefText.substring(0, separatorIdx).trim();
boolean found = false;
// Search for a constant
List<NASMConstant> constants = NASMUtil.findConstants(element.getContainingFile());
for (NASMConstant constant : constants) {
String constantIdentifier = constant.getId().getText();
if (constantIdentifier != null && constantIdentifier.equals(lblDefIdentifierText)) {
found = true;
highlightTextRange(tr.getStartOffset(), lblDefIdentifierText.length(),
NASMSyntaxHighlighter.NASM_CONSTANT, holder);
break;
}
}
// Search for a preprocessor define
if (!found) {
List<NASMDefine> defines = NASMUtil.findPreprocessorDefines(element.getContainingFile());
for (NASMDefine define : defines) {
String defineIdentifier = define.getDefineIdentifierString();
if (defineIdentifier != null && defineIdentifier.equals(lblDefIdentifierText)) {
found = true;
highlightTextRange(tr.getStartOffset(), lblDefIdentifierText.length(), NASMSyntaxHighlighter.NASM_CONSTANT, holder);
break;
}
}
}
// Search for a label
if (!found) {
List<NASMLabel> labels = NASMUtil.findLabels(element.getContainingFile());
for (NASMLabel label : labels) {
String labelName = label.getName();
if (labelName != null && labelName.equals(lblDefIdentifierText)) {
found = true;
highlightTextRange(tr.getStartOffset(), lblDefIdentifierText.length(),
NASMSyntaxHighlighter.NASM_LABEL, holder);
break;
}
}
}
// If a match wasn't found, color it a generic identifier color
if (!found) {
highlightTextRange(tr.getStartOffset(), lblDefIdentifierText.length(),
NASMSyntaxHighlighter.NASM_IDENTIFIER, holder);
}
}
// Label def macro
else {
segmentElement = ((NASMSegmentAddress) element).getLabelDefMacro();
if (segmentElement != null) { // It's a macro on the left
TextRange tr = segmentElement.getTextRange();
highlightTextRange(tr.getStartOffset() + tr.getLength() - 1, 1,
NASMSyntaxHighlighter.NASM_SEPARATOR, holder);
}
}
}
// Handle address (right side) value
PsiElement addrIdentifier = ((NASMSegmentAddress) element).getId();
if (addrIdentifier != null) { // if it is not null that means the address value is an identifier
String addrIdentifierText = addrIdentifier.getText();
TextRange tr = addrIdentifier.getTextRange();
boolean found = false;
// Search for a constant
List<NASMConstant> constants = NASMUtil.findConstants(element.getContainingFile());
for (NASMConstant constant : constants) {
String constantIdentifier = constant.getId().getText();
if (constantIdentifier.equals(addrIdentifierText)) {
found = true;
highlightTextRange(tr, NASMSyntaxHighlighter.NASM_CONSTANT, holder);
break;
}
}
// Search for a preprocessor define
if (!found) {
List<NASMDefine> defines = NASMUtil.findPreprocessorDefines(element.getContainingFile());
for (NASMDefine define : defines) {
String defineIdentifier = define.getDefineIdentifierString();
if (defineIdentifier != null && defineIdentifier.equals(addrIdentifierText)) {
found = true;
highlightTextRange(tr, NASMSyntaxHighlighter.NASM_CONSTANT, holder);
break;
}
}
}
// Search for a label
if (!found) {
List<NASMLabel> labels = NASMUtil.findLabels(element.getContainingFile());
for (NASMLabel label : labels) {
String labelName = label.getName();
if (labelName != null && labelName.equals(addrIdentifierText)) {
found = true;
highlightTextRange(tr, NASMSyntaxHighlighter.NASM_LABEL, holder);
break;
}
}
}
// If a match wasn't found, color it a generic identifier color
if (!found) {
highlightTextRange(tr, NASMSyntaxHighlighter.NASM_IDENTIFIER, holder);
}
} // Otherwise hexadecimal values are already highlighted properly
}
}