コード例 #1
0
        public static ScriptLineView CreateOrError(int lineIndex, string lineText,
                                                   IReadOnlyList <Token> tokens, VisualElement container, bool hideParameters)
        {
            errors.Clear();
            var model = commandLineParser.Parse(lineText, tokens, errors)?.Command;

            if (model is null || errors.Count > 0)
            {
                return(Error(errors.FirstOrDefault()));
            }

            var meta = projectMeta.commands.FirstOrDefault(c => (c.id?.EqualsFastIgnoreCase(model.Identifier) ?? false) ||
                                                           (c.alias?.EqualsFastIgnoreCase(model.Identifier) ?? false));

            if (meta is null)
            {
                return(Error($"Unknown command: `{model.Identifier}`"));
            }

            var nameLabel = new Label(model.Identifier.Text.FirstToLower());

            nameLabel.name = "InputLabel";
            nameLabel.AddToClassList("Inlined");

            var commandLineView = new CommandLineView(lineIndex, container);

            commandLineView.Content.Add(nameLabel);
            commandLineView.CommandId      = model.Identifier;
            commandLineView.hideParameters = hideParameters;

            foreach (var paramMeta in meta.@params)
            {
                var data = new ParameterFieldData {
                    Id       = string.IsNullOrEmpty(paramMeta.alias) ? paramMeta.id.FirstToLower() : paramMeta.alias,
                    Value    = GetValueFor(paramMeta),
                    Nameless = paramMeta.nameless
                };
                if (commandLineView.ShouldShowParameter(data))
                {
                    commandLineView.AddParameterField(data);
                }
                else
                {
                    commandLineView.delayedAddFields.Add(data);
                }
            }

            return(commandLineView);

            ErrorLineView Error(string e) => new ErrorLineView(lineIndex, lineText, container, model?.Identifier, e);

            string GetValueFor(ProjectMetadata.ParameterMetadata m)
            {
                var param = model.Parameters.FirstOrDefault(p => p.Identifier.Text.EqualsFastIgnoreCase(m.id) ||
                                                            p.Identifier.Text.EqualsFastIgnoreCase(m.alias));

                return(param?.Value);
            }
        }
コード例 #2
0
        public static ScriptLineView CreateOrError(int lineIndex, string lineText, VisualElement container, bool hideParameters)
        {
            var commandBodyText = lineText.GetAfterFirst(CommandScriptLine.IdentifierLiteral);
            var commandId       = commandBodyText.GetBefore(" ") ?? commandBodyText.GetBefore("\t") ?? commandBodyText.Trim();
            var commandType     = Command.ResolveCommandType(commandId);

            if (commandType is null)
            {
                return(Error("Failed to resolve command type."));
            }

            var commandLineView = new CommandLineView(lineIndex, container);

            var nameLabel = new Label(commandId);

            nameLabel.name = "InputLabel";
            nameLabel.AddToClassList("Inlined");
            commandLineView.Content.Add(nameLabel);
            commandLineView.CommandId      = commandId;
            commandLineView.hideParameters = hideParameters;

            var paramFields = commandType.GetFields(BindingFlags.Public | BindingFlags.Instance)
                              .Where(f => typeof(ICommandParameter).IsAssignableFrom(f.FieldType));
            var paramValues = typeof(Command).GetMethod("ExtractParameters", BindingFlags.Static | BindingFlags.NonPublic)
                              .Invoke(null, new[] { commandBodyText, string.Empty }) as LiteralMap <string>;

            foreach (var paramField in paramFields)
            {
                var paramAlias = paramField.GetCustomAttribute <Command.ParameterAliasAttribute>()?.Alias;
                var paramId    = paramAlias ?? char.ToLowerInvariant(paramField.Name[0]) + paramField.Name.Substring(1);
                var nameless   = string.IsNullOrEmpty(paramId);

                paramValues.TryGetValue(paramId, out var valueText);
                if (valueText is null)
                {
                    paramValues.TryGetValue(paramField.Name, out valueText);
                }

                var data = new ParameterFieldData {
                    Id = paramId, Name = paramField.Name, Value = valueText, Nameless = nameless
                };
                if (!data.Nameless && hideParameters && string.IsNullOrEmpty(data.Value))
                {
                    commandLineView.delayedAddFields.Add(data); // Add un-assigned fields on hover for better init performance.
                }
                else
                {
                    commandLineView.AddParameterField(data);
                }
            }

            return(commandLineView);

            ErrorLineView Error(string error) => new ErrorLineView(lineIndex, lineText, container, commandId, error);
        }