'use strict' ; import { SymbolInformation , DocumentSymbol } from 'vscode-languageserver-types' ; import { YAMLSchemaService } from './yamlSchemaService' ; import { JSONDocumentSymbols } from 'vscode-json-languageservice/lib/umd/services/jsonDocumentSymbols' ; import { DocumentSymbolsContext } from 'vscode-json-languageservice/lib/umd/jsonLanguageTypes' ; import { TextDocument } from 'vscode-languageserver-textdocument' ; import { yamlDocumentsCache } from '../parser/yaml-documents' ; import { Telemetry } from '../../languageserver/telemetry' ; import { isMap , isSeq , Node } from 'yaml' ; import { convertErrorToTelemetryMsg } from '../utils/objects' ; export class YAMLDocumentSymbols { private jsonDocumentSymbols ; constructor ( schemaService , private readonly telemetry ) { this . jsonDocumentSymbols = new JSONDocumentSymbols ( schemaService ) ; this . jsonDocumentSymbols . getKeyLabel = ( property ) => { const keyNode = property . keyNode . internalNode ; let name = '' ; if ( isMap ( keyNode ) ) { name = '{}' ; } else if ( isSeq ( keyNode ) ) { name = '[]' ; } else { name = keyNode . source ; } return name ; } ; } public findDocumentSymbols ( document , context = { resultLimit : Number . MAX_VALUE } ) { let results = [ ] ; try { const doc = yamlDocumentsCache . getYamlDocument ( document ) ; if ( ! doc || doc [ 'documents' ] . length === 0 ) { return null ; } for ( const yamlDoc of doc [ 'documents' ] ) { if ( yamlDoc . root ) { results = results . concat ( this . jsonDocumentSymbols . findDocumentSymbols ( document , yamlDoc , context ) ) ; } } } catch ( err ) { this . telemetry . sendError ( 'yaml.documentSymbols.error' , { error : convertErrorToTelemetryMsg ( err ) } ) ; } return results ; } public findHierarchicalDocumentSymbols ( document , context = { resultLimit : Number . MAX_VALUE } ) { let results = [ ] ; try { const doc = yamlDocumentsCache . getYamlDocument ( document ) ; if ( ! doc || doc [ 'documents' ] . length === 0 ) { return null ; } for ( const yamlDoc of doc [ 'documents' ] ) { if ( yamlDoc . root ) { results = results . concat ( this . jsonDocumentSymbols . findDocumentSymbols2 ( document , yamlDoc , context ) ) ; } } } catch ( err ) { this . telemetry . sendError ( 'yaml.hierarchicalDocumentSymbols.error' , { error : convertErrorToTelemetryMsg ( err ) } ) ; } return results ; } }