public override object VisitCallExp(bhlParser.CallExpContext ctx) { var name = ctx.NAME(); var chainExp = ctx.chainExp(); if (chainExp != null) { foreach (var chainExpItem in chainExp) { if (chainExpItem.callArgs() is bhlParser.CallArgsContext callArgs) { if (name != null) { AddSemanticToken(name, SemanticTokenTypes.function); name = null; } Visit(callArgs); } else if (chainExpItem.memberAccess() is bhlParser.MemberAccessContext memberAccess) { if (name != null) { AddSemanticToken(name, SemanticTokenTypes.variable); } name = memberAccess.NAME(); Visit(memberAccess); } else if (chainExpItem.arrAccess() is bhlParser.ArrAccessContext arrAccess) { if (name != null) { AddSemanticToken(name, SemanticTokenTypes.variable); } name = null; Visit(arrAccess); } } if (name != null) { AddSemanticToken(name, SemanticTokenTypes.variable); } } return(null); }