public void annotate()

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
        }
    }