public MessageCollection Analyze(injectionParser.FileContext fileContext, Metadata metadata) { var messages = new List <Message>(); var extraneousEndifVisitor = new MisplacedStatementsVisitor(messages); extraneousEndifVisitor.Visit(fileContext); var invalidSymbolVisitor = new InvalidSymbolVisitor(messages, metadata); invalidSymbolVisitor.Visit(fileContext); var subrutineDefinitionsVisitor = new SubrutineDefinitionsVisitor(messages); subrutineDefinitionsVisitor.Visit(fileContext); var nativeSubrutineIncorrectArgumentsVisitor = new NativeSubrutineIncorrectArgumentsVisitor(messages); nativeSubrutineIncorrectArgumentsVisitor.Visit(fileContext); var invalidBreakVisitor = new InvalidBreakVisitor(messages); invalidBreakVisitor.Visit(fileContext); return(new MessageCollection(messages)); }
public override bool VisitFile([NotNull] injectionParser.FileContext context) { base.VisitFile(context); foreach (var valueCollection in subrutines.Values) { if (valueCollection.Count() > 1) { var collection = valueCollection.OrderBy(v => v.Start.Line); var firstValue = collection.First(); messages.Add(new Message(firstValue.Start.Line, firstValue.Start.Column, firstValue.Stop.Line, firstValue.Stop.Column, MessageSeverity.Warning, MessageCodes.SubrutineRedefined, $"Subrutine '{firstValue.subrutineName().GetText()}' was redefined by later subrutine definitions with the same name.")); foreach (var value in collection.Skip(1)) { messages.Add(new Message(value.Start.Line, value.Start.Column, value.Stop.Line, value.Stop.Column, MessageSeverity.Warning, MessageCodes.SubrutineRedefinition, $"Subrutine '{value.subrutineName().GetText()}' redefines a subrutine with the same name.")); } } } return(true); }
public ScriptFile(string fileName, string content, injectionParser.FileContext syntax) { Syntax = syntax; FileName = fileName; Content = content; lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None); }
public void Load(injectionParser.FileContext file) { CurrentScript = new ScriptFile("<script>", file.GetText(), file); interpreter = new ThreadLocal <Interpreter>(() => new Interpreter(Metadata, CurrentScript.FileName, debuggerServer.Create(), retrieveCancellationToken)); Metadata.Reset(); var collector = new DefinitionCollector(Metadata); collector.Visit(file); }
private injectionParser.SubrutineContext GetSubrutine(injectionParser.FileContext fileSyntax, int line, int column) { for (var i = 0; i < fileSyntax.ChildCount; i++) { if (fileSyntax.GetChild(i) is injectionParser.FileSectionContext fileSection) { var subrutine = fileSection.subrutine(); if (subrutine != null && line >= subrutine.Start.Line && line <= subrutine.Stop.Line) { return(subrutine); } } } return(null); }
public void Load(injectionParser.FileContext file) { var collector = new DefinitionCollector(Metadata); collector.Visit(file); }
public CompletionList GetCompletions(injectionParser.FileContext fileSyntax, Metadata metadata, int line, int column) { var subrutineSyntax = GetSubrutine(fileSyntax, line, column); if (subrutineSyntax == null) { return(new CompletionList(new[] { new CompletionItem() { Label = "sub", InsertText = "sub", Kind = CompletionItemKind.Keyword }, new CompletionItem() { Label = "end sub", InsertText = "end sub", Kind = CompletionItemKind.Keyword }, })); } var result = GetContext(fileSyntax, line, column); if (!result.HasValue) { return(new CompletionList(true)); } var context = result.Value; var namespaceSuggestions = new HashSet <string>(StringComparer.OrdinalIgnoreCase); var completions = Enumerable.Empty <CompletionItem>(); if (context.AllowedSuggestions.HasFlag(SuggestionKind.Keywords) && !context.StartsWith("UO.")) { completions = completions.Concat(statementKeywords); } if (context.AllowedSuggestions.HasFlag(SuggestionKind.Variables) && !context.StartsWith("UO.")) { var collector = new VariableDefinitionCollector(line, context.Prefix); collector.Visit(subrutineSyntax); completions = completions.Concat(collector.VariableNames.Select(CreateVariableCompletion)); } if (context.AllowedSuggestions.HasFlag(SuggestionKind.Namespace) && !context.StartsWith("UO.")) { namespaceSuggestions.Add("UO"); } if (context.AllowedSuggestions.HasFlag(SuggestionKind.Namespace)) { var subrutineCompletions = metadata.NativeSubrutines.Where(subrutine => context.IsSameNamespace(subrutine.Name)) .GroupBy(subrutine => subrutine.Name) .Select(group => CreateSubrutineCompletion(group.First().Name)); completions = completions.Concat(subrutineCompletions); if (!context.HasNamespace) { subrutineCompletions = metadata.Subrutines.GroupBy(subrutine => subrutine.Name) .Select(group => CreateSubrutineCompletion(group.First().Name)); completions = completions.Concat(subrutineCompletions); } } completions = completions .Concat(namespaceSuggestions.Select(x => CreateNamespaceCompletion(x))); return(new CompletionList(completions.ToArray())); }