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); }
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); }
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); }
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); }
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)); }
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)); }
/// <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); }