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