Esempio n. 1
0
        public DiagnosticResult <ScriptNode> Bind(ScriptFile file, PapyrusProgram program, IReadOnlyScriptText text, ITokenStream tokenStream, CommonTree objectNode)
        {
            return(DiagnosticResult <ScriptNode> .TryWithDiagnostics((diagnostics) =>
            {
                _text = text;
                _tokenStream = tokenStream;
                _diagnostics = diagnostics;

                _scriptNode = new ScriptNode
                {
                    File = file,
                    Program = program
                };
                _scriptNode.Script = _scriptNode;
                _scriptNode.CompilerNode = objectNode;
                _scriptNode.Range = objectNode.GetRange(tokenStream, text);
                _scriptNode.Text = text.Text;

                var children = new Scanner <CommonTree>(objectNode.GetChildren());
                children.Next();

                _scriptNode.Header = BindScriptHeader(_scriptNode, children);

                foreach (var child in children.AllRemaining())
                {
                    var blockChildren = new Scanner <CommonTree>(new CommonTree[] { child });
                    blockChildren.Next();

                    var definition = BindDefinition(_scriptNode, blockChildren);
                    if (definition != null)
                    {
                        lock (_definitionsLock)
                        {
                            _scriptNode.Definitions.Add(definition);
                        }
                    }
                }

                return _scriptNode;
            }));
        }
Esempio n. 2
0
        private static void ToDocumentSymbol(Uri fileUri, IReadOnlyScriptText text, PapyrusSymbol symbol, List <DocumentSymbolInformation> symbolInformationContainer, string containerName = null)
        {
            var symbolInformation = new DocumentSymbolInformation()
            {
                Name     = symbol.Name,
                Kind     = GetSymbolKind(symbol),
                Location = new Location()
                {
                    Uri   = fileUri,
                    Range = symbol.Definition.Range.ToRange()
                },
                ContainerName = containerName
            };

            foreach (var childSymbol in symbol.Children)
            {
                ToDocumentSymbol(fileUri, text, childSymbol, symbolInformationContainer, symbolInformation.Name);
            }

            symbolInformationContainer.Add(symbolInformation);
        }
Esempio n. 3
0
        public static Range GetRange(this CommonTree node, ITokenStream tokenStream, IReadOnlyScriptText scriptText)
        {
            if (node is CommonErrorNode errorNode)
            {
                return(new Range()
                {
                    Start = scriptText.PositionAt(((CommonToken)tokenStream.Get(errorNode.start.TokenIndex)).StartIndex),
                    End = scriptText.PositionAt(((CommonToken)tokenStream.Get(errorNode.stop.TokenIndex)).StopIndex + 1)
                });
            }

            if (node.TokenStartIndex == -1 || node.TokenStopIndex == -1)
            {
                return(Range.Empty);
            }

            return(new Range()
            {
                Start = scriptText.PositionAt(((CommonToken)tokenStream.Get(node.TokenStartIndex)).StartIndex),
                End = scriptText.PositionAt(((CommonToken)tokenStream.Get(node.TokenStopIndex)).StopIndex + 1)
            });
        }