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