public override bool VisitOperand([NotNull] injectionParser.OperandContext context)
        {
            var varName = context.SYMBOL()?.GetText();

            if (!string.IsNullOrEmpty(varName))
            {
                if (!varNames.Contains(varName) && !metadata.TryGetIntrinsicVariable(varName, out _) &&
                    !metadata.ShortcutVariableExists(varName) && !metadata.GlobalVariableExists(varName))
                {
                    messages.Add(new Message(context.Start.Line, context.Start.Column, context.Stop.Line, context.Stop.Column,
                                             MessageSeverity.Warning, MessageCodes.UndefinedVariable,
                                             $"Variable not found '{varName}'."));
                }
            }
            else
            {
                var dimName = context.indexedSymbol()?.SYMBOL()?.GetText();
                if (!string.IsNullOrEmpty(dimName) && !varNames.Contains(dimName))
                {
                    messages.Add(new Message(context.Start.Line, context.Start.Column, context.Stop.Line, context.Stop.Column,
                                             MessageSeverity.Warning, MessageCodes.UndefinedVariable,
                                             $"Variable not found '{dimName}'."));
                }
            }

            return(base.VisitOperand(context));
        }
예제 #2
0
        public override InjectionValue VisitOperand([NotNull] injectionParser.OperandContext context)
        {
            var name = context.SYMBOL()?.GetText();

            if (!string.IsNullOrEmpty(name))
            {
                if (metadata.TryGetIntrinsicVariable(name, out var intrinsicVariable))
                {
                    return(intrinsicVariable.Call(Array.Empty <InjectionValue>()));
                }
                if (semanticScope.TryGetVar(name, out var variable))
                {
                    return(variable);
                }

                throw new ScriptFailedException($"Variable undefined - {name}", context.Start.Line);
            }

            return(base.VisitOperand(context));
        }