Esempio n. 1
0
        public NamedValue Eval(Context context, ModuleLiteral env, EvaluationStackFrame args)
        {
            if (!IsValid)
            {
                return(this);
            }

            var result = ObjectLiteral.EvalExpression(context, env, Value, args);

            return(new NamedValue(NameId, result));
        }
Esempio n. 2
0
        private static bool TryCreate(
            ImmutableContextBase context,
            ModuleLiteral env,
            out QualifierValue qualifierValue,
            LineInfo lineInfo,
            ObjectLiteral objectLiteral)
        {
            Contract.Requires(context != null);
            Contract.Requires(env != null);
            Contract.Requires(objectLiteral != null);

            qualifierValue = null;

            if (objectLiteral.Count == 0)
            {
                qualifierValue = CreateEmpty(context.FrontEndContext.QualifierTable);
                return(true);
            }

            Tuple <StringId, StringId>[] qualifierKvps = new Tuple <StringId, StringId> [objectLiteral.Count];

            int i = 0;

            foreach (var kvp in objectLiteral.Members)
            {
                if (!(kvp.Value.Value is string value))
                {
                    var location = lineInfo.AsUniversalLocation(env, context);
                    var error    = new ErrorContext(name: kvp.Key, objectCtx: objectLiteral).ToErrorString(context);
                    context.Logger.ReportQualifierValueMustEvaluateToString(context.LoggingContext, location.AsLoggingLocation(), error, context.GetStackTraceAsErrorMessage(location));
                    return(false);
                }

                qualifierKvps[i] = Tuple.Create(kvp.Key, context.FrontEndContext.StringTable.AddString(value));
                ++i;
            }

            QualifierId qualifierId = context.FrontEndContext.QualifierTable.CreateQualifier(qualifierKvps);

            qualifierValue = new QualifierValue(objectLiteral, qualifierId);

            return(true);
        }
Esempio n. 3
0
        /// <summary>
        /// Creates a qualifier value given a qualifier id.
        /// </summary>
        public static QualifierValue Create(QualifierId qualifierId, QualifierTable qualifierTable, StringTable stringTable)
        {
            Contract.Requires(qualifierId.IsValid);
            Contract.Requires(qualifierTable != null);
            Contract.Requires(qualifierTable.IsValidQualifierId(qualifierId));

            if (qualifierTable.EmptyQualifierId == qualifierId)
            {
                return(CreateEmpty(qualifierTable));
            }

            Qualifier qualifier = qualifierTable.GetQualifier(qualifierId);
            var       bindings  = new List <Binding>(qualifier.Keys.Count);

            for (int i = 0; i < qualifier.Keys.Count; ++i)
            {
                bindings.Add(new Binding(qualifier.Keys[i], qualifier.Values[i].ToString(stringTable), location: default(LineInfo)));
            }

            return(new QualifierValue(ObjectLiteral.Create(bindings, default(LineInfo), default(AbsolutePath)), qualifierId));
        }
Esempio n. 4
0
 private LazyEvalObjectLiteral(ObjectLiteral literal, string returnType) : base(literal.Location, literal.Path)
 {
     m_literal  = literal;
     ReturnType = returnType;
 }
Esempio n. 5
0
 /// <nodoc/>
 public static ObjectLiteral Create(IReadOnlyList <Binding> bindings, LineInfo location, AbsolutePath path, string returnType)
 {
     return(new LazyEvalObjectLiteral(ObjectLiteral.Create(bindings, location, path), returnType));
 }
Esempio n. 6
0
 /// <nodoc />
 internal QualifierValue(ObjectLiteral qualifier, QualifierId qualifierId)
 {
     Qualifier   = qualifier;
     QualifierId = qualifierId;
 }
Esempio n. 7
0
        protected MergeFunction GetMergeFunction(Context context, EvaluationStackFrame captures, ObjectLiteral leftObject, EvaluationResult rightObject)
        {
            // If the left object has a custom merge, that trumps the other cases
            var customMergeLeft = leftObject.TryGetCustomMergeFunction(context, captures);

            if (customMergeLeft != null)
            {
                return(customMergeLeft);
            }

            // Otherwise if the right object has a custom merge, then use that one
            if (rightObject.Value is ObjectLiteral rightObjectLiteral)
            {
                var customMergeRight = rightObjectLiteral.TryGetCustomMergeFunction(context, captures);
                if (customMergeRight != null)
                {
                    return(customMergeRight);
                }
            }

            // Otherwise, use the default merge function
            return(GetDefaultMergeFunction(context, captures));
        }