コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        public ScriptFile(string fileName, string content, injectionParser.FileContext syntax)
        {
            Syntax   = syntax;
            FileName = fileName;
            Content  = content;

            lines = content.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        public void Load(injectionParser.FileContext file)
        {
            var collector = new DefinitionCollector(Metadata);

            collector.Visit(file);
        }
コード例 #7
0
        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()));
        }