Пример #1
0
 public abstract void DoWork(SkriptFile file, int lineNumber, string rawContent, FileParseContext context);
        public override void DoWork(SkriptFile file, int lineNumber, string rawContent, FileParseContext context)
        {
            var node = file.Nodes[lineNumber];

            //Only attempt to parse already matched syntax if the user is changing the contents of the file
            if (!context.File.IsDoingNodesChange && node.MatchedSyntax != null)
            {
                return;
            }

            var workDone = false;

            foreach (var elements in WorkspaceManager.Instance.Current.AddonDocumentations.Select(addon =>
                                                                                                  node.IsSectionNode
                    ? addon.Events
                    : addon.Expressions.Cast <AbstractSyntaxElement>().Concat(addon.Effects)))
            {
                foreach (var effect in elements)
                {
                    for (var index = 0; index < effect.PatternNodes.Length; index++)
                    {
                        var effectPattern = effect.PatternNodes[index];

                        context.Matches     = new List <ParseMatch>();
                        context.CurrentLine = lineNumber;
                        var result = effectPattern.Parse(context);
                        if (result.IsSuccess)
                        {
                            result.Context     = context.Clone();
                            result.Matches     = result.Context.Matches;
                            node.MatchedSyntax = new SyntaxMatch(effect, result)
                            {
                                PatternIndex = index
                            };
                            workDone = true;
                        }

                        if (workDone)
                        {
                            break;
                        }
                    }

                    if (workDone)
                    {
                        break;
                    }
                }

                if (workDone)
                {
                    break;
                }
            }
        }
Пример #3
0
        public sealed override void DoWork(SkriptFile file, int lineNumber, string rawContent, FileParseContext context)
        {
            if (!CanInspect(file, lineNumber))
            {
                return;
            }

            StaticProblemsHolder.Value = file.ProblemsHolder;
            Inspect(file, lineNumber);
            StaticProblemsHolder.Value = null;
        }
Пример #4
0
        public override void DoWork(SkriptFile file, int lineNumber, string rawContent, FileParseContext context)
        {
            AbstractFileNode resultNode = new BaseFileNode();

            NodeContentHelper.ApplyBasicNodeInfoToNode(rawContent, lineNumber, file, ref resultNode);

            if (resultNode.NodeContent.IsEmpty() && !resultNode.RawComment.IsEmpty())
            {
                AbstractFileNode commentNode = new CommentLineNode();
                NodeContentHelper.ApplyBasicNodeInfoToOtherNode(resultNode, ref commentNode);
                resultNode = commentNode;
            }
            else if (resultNode.NodeContent.IsEmpty() && resultNode.RawComment.IsEmpty())
            {
                AbstractFileNode emptyLineNode = new EmptyLineNode();
                emptyLineNode.MatchedSyntax =
                    new SyntaxMatch(SignatureElements.EmptyLine, ParseResult.Success(context));
                NodeContentHelper.ApplyBasicNodeInfoToOtherNode(resultNode, ref emptyLineNode);
                resultNode = emptyLineNode;
            }
            else
            {
                if (file.IsNodeVisible(resultNode))
                {
                    var ctx = ParseContext.FromCode(rawContent);

                    var signatureMatches = new List <(bool isSectionMismatch, AbstractFileNode node)>();
                    //Try to match to one of our known signatures
                    foreach (var(signatureNodeType, signatureDelegate) in NodeSignaturesManager.Instance.SignatureTypes
                             )
                    {
                        ctx.Matches.Clear();
                        ctx.CurrentPosition = context.IndentationChars;

                        var isSectionTypeMismatch = resultNode.IsSectionNode !=
                                                    (signatureNodeType.GetCustomAttribute <SectionNodeAttribute>() !=
                                                     null);


                        var tryParseResult = signatureDelegate.DynamicInvoke(ctx);

                        // We matched one signature
                        if (tryParseResult != null && ctx.HasFinishedLine)
                        {
                            var instance = signatureNodeType.NewInstance(tryParseResult);

                            if (instance is AbstractFileNode fileNode)
                            {
                                NodeContentHelper.ApplyBasicNodeInfoToOtherNode(resultNode, ref fileNode);
                                signatureMatches.Add((isSectionTypeMismatch, fileNode));
                            }

                            if (!isSectionTypeMismatch)
                            {
                                break;
                            }
                        }
                    }

                    var resultingNode = signatureMatches.FirstOrDefault(x => !x.isSectionMismatch).node;
                    if (resultingNode != null)
                    {
                        resultNode = resultingNode;
                    }
                }
            }

            file.Nodes[lineNumber] = resultNode;
        }