Ejemplo n.º 1
0
        public void ProcessStatementVarDeclaration(DMASTProcStatementVarDeclaration varDeclaration)
        {
            if (varDeclaration.IsGlobal)
            {
                return;
            }                                        //Currently handled by DMObjectBuilder

            DMExpression value;

            if (varDeclaration.Value != null)
            {
                try {
                    value = DMExpression.Create(_dmObject, _proc, varDeclaration.Value, varDeclaration.Type);
                } catch (CompileErrorException e) {
                    DMCompiler.Error(e.Error);
                    value = new Expressions.Null(varDeclaration.Location);
                }
            }
            else
            {
                value = new Expressions.Null(varDeclaration.Location);
            }

            bool successful;

            if (varDeclaration.IsConst)
            {
                if (!value.TryAsConstant(out var constValue))
                {
                    DMCompiler.Error(new CompilerError(varDeclaration.Location, "Const var must be set to a constant"));
                    return;
                }

                successful = _proc.TryAddLocalConstVariable(varDeclaration.Name, varDeclaration.Type, constValue);
            }
            else
            {
                successful = _proc.TryAddLocalVariable(varDeclaration.Name, varDeclaration.Type);
            }

            if (!successful)
            {
                DMCompiler.Error(new CompilerError(varDeclaration.Location, $"Duplicate var {varDeclaration.Name}"));
                return;
            }

            value.EmitPushValue(_dmObject, _proc);
            _proc.Assign(_proc.GetLocalVariableReference(varDeclaration.Name));
            _proc.Pop();
        }
Ejemplo n.º 2
0
        public void VisitStringFormat(DMASTStringFormat stringFormat)
        {
            var expressions = new DMExpression[stringFormat.InterpolatedValues.Length];

            for (int i = 0; i < stringFormat.InterpolatedValues.Length; i++)
            {
                if (stringFormat.InterpolatedValues[i] is null)
                {
                    expressions[i] = new Expressions.Null(stringFormat.Location);
                }
                else
                {
                    expressions[i] = DMExpression.Create(_dmObject, _proc, stringFormat.InterpolatedValues[i], _inferredPath);
                }
            }

            Result = new Expressions.StringFormat(stringFormat.Location, stringFormat.Value, expressions);
        }