internal void ProcessParameter(Parameter node)
 {
     if (_currentModuleMember is Document)
     {
         _context.AddError(CompilerErrorFactory.ParametersCantBeDeclaredInDocuments(node, _currentModule.FileName));
     }
     else
     {
         var aliasDef = (AliasDefinition)_currentModuleMember;
         if (aliasDef.SyncTime < _syncTime)
         {
             aliasDef.SyncTime = _syncTime;
             aliasDef.Parameters.Clear();
         }
         aliasDef.Parameters.Add(node);
         node.AliasDefinition = (AliasDefinition)_currentModuleMember;
         if (node.Name == "_")
         {
             if (!node.IsValueNode)
             {
                 ((AliasDefinition)_currentModuleMember).HasDefaultBlockParameter = true;
             }
             else
             {
                 ((AliasDefinition)_currentModuleMember).HasDefaultValueParameter = true;
             }
         }
     }
 }
        /// <summary>
        /// Resolves attributes in <see cref="Parameter"/>. Elements are ignored.
        /// </summary>
        /// <param name="parameter">Instance of <see cref="Parameter"/>.</param>
        protected void ResolveAttributesInParameter(Parameter parameter)
        {
            var aliasContext = GetAliasContextForParameter(parameter);

            if (aliasContext == null)
            {
                return;
            }

            var argument = aliasContext.Alias.Arguments.FirstOrDefault(a => a.Name == parameter.Name);

            ResolveAttributes(argument != null ? argument.Entities : parameter.Entities);
        }
示例#3
0
        private void ValidateParameter(Parameter parameter, Alias alias, string moduleFileName)
        {
            if (parameter.Name == "_") //Default parameter
            {
                if (!parameter.IsValueNode)
                {
                    if (alias.Entities.All(e => e is Comment) && !alias.Assignment.IsObjectAssignment())
                    {
                        ReportErrorInsideChoice(() => CompilerErrorFactory.DefaultBlockArgumentIsMissing(alias,
                                                                                                         moduleFileName));
                    }
                }
                else
                {
                    if (parameter.HasValue())
                    {
                        return;                       //if parameter has default value then skip check
                    }
                    if (!alias.HasValue())
                    {
                        ReportErrorInsideChoice(() => CompilerErrorFactory.DefaultValueArgumentIsMissing(alias,
                                                                                                         moduleFileName));
                    }
                }
                return;
            }

            //Non default parameter
            var argument = alias.Arguments.FirstOrDefault(a => a.Name == parameter.Name);

            if (argument == null)
            {
                //Report Error if argument is missing and there is no default value for the parameter
                if (parameter.Value == null && parameter.Entities.Count == 0 && !parameter.Assignment.IsObjectAssignment())
                {
                    ReportErrorInsideChoice(() => CompilerErrorFactory.ArgumentIsMissing(alias, parameter.Name,
                                                                                         moduleFileName));
                }
                return;
            }

            //Report error if type of argument (value/block) mismatch the type of parameter
            if (((Argument)argument).IsValueNode != parameter.IsValueNode)
            {
                ReportErrorInsideChoice(() => parameter.IsValueNode
                    ? CompilerErrorFactory.ValueArgumentIsExpected((Argument)argument,
                                                                   moduleFileName)
                    : CompilerErrorFactory.BlockArgumentIsExpected((Argument)argument,
                                                                   moduleFileName));
            }
        }
 private AliasContextInfo GetAliasContextForParameter(Parameter parameter)
 {
     foreach (var context in AliasContext)
     {
         if (context == null)
         {
             return(null);
         }
         if (context.Alias.AliasDefinition == parameter.AliasDefinition)
         {
             return(context);
         }
     }
     return(null);
 }
        /// <summary>
        /// Resolves value of the value parameter.
        /// </summary>
        /// <param name="parameter">Parameter.</param>
        /// <param name="valueType">Calculated <see cref="ValueType"/></param>
        /// <returns>Literal value of parameter.</returns>
        protected string ResolveValueParameter(Parameter parameter, out ValueType valueType)
        {
            var aliasContext = GetAliasContextForParameter(parameter).Alias;

            if (parameter.Name == "_")
            {
                //Resolving default value parameter
                if (aliasContext.PairValue != null)
                {
                    return(ResolvePairValue(aliasContext.PairValue, out valueType));
                }
                return(ResolveValue(aliasContext, out valueType));
            }


            var argument = aliasContext.Arguments.FirstOrDefault(a => a.Name == parameter.Name);

            if (argument != null)
            {
                if (argument.PairValue != null)
                {
                    return(ResolvePairValue(argument.PairValue, out valueType));
                }
                if (((IMappedPair)argument?.Parent).BlockType == BlockType.JsonObject && argument.Entities.Count > 0)
                {
                    var ent = argument.Entities.First(e => e != null);
                    valueType = ((IMappedPair)ent).ValueType;
                    return(ent.Value ?? ent.Name);
                }
                valueType = ((IMappedPair)argument).ValueType;
                return(argument.Value);
            }

            //if argument is not found lookup default value in the Alias Definition
            //var paramDef = aliasContext.AliasDefinition.Parameters.First(p => p.Name == parameter.Name);

            //If parameters default value is Parameter or Alias then resolve it
            if (parameter.PairValue != null)
            {
                return(ResolvePairValue(parameter.PairValue, out valueType));
            }

            valueType = parameter.ValueType;
            return(parameter.Value);
        }
示例#6
0
        private static Parameter GetParameterInterpolationItem(Match match, int line, int column,
                                                               CompilerContext context, Module module)
        {
            if (match.Value.StartsWith(@"\!%(") && !match.Value.EndsWith(@")"))
            {
                context.Errors.Add(CompilerErrorFactory.ParserError("Missing closing parenthesis.", module.FileName, line, column + match.Length));
            }
            var parameter = new Parameter
                            (
                name: match.Value.TrimStart('\\', '!', '%', '(', '\t', ' ').TrimEnd(')', '\t', ' '),
                nameInterval: new Interval(new CharLocation(line, column, -1),
                                           new CharLocation(line, column + match.Value.Length, -1)),
                assignment: AssignmentEnum.None,
                valueType: ValueType.Empty,
                isValueNode: true
                            );

            return(parameter);
        }
示例#7
0
        protected string ResolveValueParameter(Parameter parameter, out ValueType valueType)
        {
            var aliasContext = GetAliasContextForParameter(parameter);

            if (parameter.Name == "_")
            {
                //Resolving default value parameter
                if (aliasContext.Alias.PairValue != null)
                {
                    return(ResolvePairValue(aliasContext.Alias.PairValue, out valueType));
                }
                return(ResolveNodeValue(aliasContext.Alias, out valueType));
            }


            var argument = aliasContext.Alias.Arguments.FirstOrDefault(a => a.Name == parameter.Name);

            if (argument != null)
            {
                if (argument.PairValue != null)
                {
                    return(ResolvePairValue(argument.PairValue, out valueType));
                }
                valueType = ((IMappedPair)argument).ValueType;
                return(argument.Value);
            }

            //if argument is not found lookup default value in the Alias Definition
            //var paramDef = aliasContext.AliasDefinition.Parameters.First(p => p.Name == parameter.Name);

            //If parameteres default value is Parameter or Alias then resolve it
            if (parameter.PairValue != null)
            {
                return(ResolvePairValue(parameter.PairValue, out valueType));
            }

            valueType = parameter.ValueType;
            return(parameter.Value);
        }
示例#8
0
 public static CompilerError DefaultParameterMustBeOnly(Parameter node, string fileName)
 {
     return(Instantiate("MCE0021", new LexicalInfo(fileName, node.NameInterval.Begin.Line, node.NameInterval.Begin.Column, node.NameInterval.Begin.Index), false));
 }
示例#9
0
 internal static CompilerError ParametersCantBeDeclaredInDocuments(Parameter node, string fileName)
 {
     return(Instantiate("MCE0010", new LexicalInfo(fileName, node.NameInterval.Begin.Line, node.NameInterval.Begin.Column, node.NameInterval.Begin.Index), false));
 }
示例#10
0
        /// <inheritdoc />
        public Pair CreateMappedPair(ITextSource textSource, int nameQuotesType, Interval nameInterval,
                                     AssignmentEnum assignment,
                                     Interval assignmentInterval, int valueQuotesType, Interval valueInterval, int valueIndent)
        {
            IMappedPair pair;
            var         nameText = GetNameText(textSource, nameQuotesType, nameInterval);
            var         value    = GetValue(textSource, assignment, valueQuotesType, valueInterval, valueIndent, _context, _module);

            if (nameQuotesType > 0)
            {
                pair = new Element
                       (
                    VerifyElementName(nameText, nameInterval, _module),
                    nameQuotesType: nameQuotesType,
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("@"))
            {
                var tuple = Element.GetNameAndNs(nameText.Substring(1), nameQuotesType);
                var ns    = string.IsNullOrEmpty(tuple.Item1) ? null : tuple.Item1;
                pair = new Attribute
                       (
                    VerifyName(tuple.Item2, nameInterval, _module),
                    ns,
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("!$"))
            {
                pair = new AliasDefinition
                       (
                    VerifyName(nameText.Substring(2), nameInterval, _module),
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("!#"))
            {
                pair = new NamespaceDefinition
                       (
                    VerifyNsName(nameText.Substring(2), nameInterval, _module),
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("!%"))
            {
                pair = new Parameter
                       (
                    VerifyNsName(nameText.Substring(2), nameInterval, _module),
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("!"))
            {
                pair = new Document
                       (
                    VerifyName(nameText.Substring(1), nameInterval, _module),
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("$"))
            {
                pair = new Alias
                       (
                    VerifyName(nameText.Substring(1), nameInterval, _module),
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("%"))
            {
                pair = new Argument
                       (
                    VerifyName(nameText.Substring(1), nameInterval, _module),
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            else if (nameText.StartsWith("#"))
            {
                var tuple = Element.GetNameAndNs(nameText.Substring(1), nameQuotesType);
                var ns    = string.IsNullOrEmpty(tuple.Item1) ? null : tuple.Item1;

                if (ns == null)
                {
                    pair = new Scope
                           (
                        null,
                        VerifyScopeName(nameText.Substring(1), nameInterval, _module),
                        nameInterval: nameInterval,
                        assignment: assignment,
                        assignmentInterval: assignmentInterval,
                        value: value.Item1,
                        valueQuotesType: valueQuotesType,
                        valueInterval: valueInterval,
                        interpolationItems: value.Item2,
                        valueIndent: valueIndent,
                        valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                           );
                }
                else
                {
                    pair = new Scope
                           (
                        VerifyElementName(tuple.Item2, nameInterval, _module),
                        VerifyScopeName(ns, nameInterval, _module),
                        nameInterval: nameInterval,
                        assignment: assignment,
                        assignmentInterval: assignmentInterval,
                        value: value.Item1,
                        valueQuotesType: valueQuotesType,
                        valueInterval: valueInterval,
                        interpolationItems: value.Item2,
                        valueIndent: valueIndent,
                        valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                           );
                }
            }
            else
            {
                var tuple = Element.GetNameAndNs(nameText, nameQuotesType);
                var ns    = string.IsNullOrEmpty(tuple.Item1) ? null : tuple.Item1;

                pair = new Element
                       (
                    VerifyElementName(tuple.Item2, nameInterval, _module),
                    VerifyScopeName(ns, nameInterval, _module),
                    nameInterval: nameInterval,
                    assignment: assignment,
                    assignmentInterval: assignmentInterval,
                    value: value.Item1,
                    valueQuotesType: valueQuotesType,
                    valueInterval: valueInterval,
                    interpolationItems: value.Item2,
                    valueIndent: valueIndent,
                    valueType: GetValueType(assignment, value.Item1, valueQuotesType)
                       );
            }
            return((Pair)pair);
        }