private static createSymbolFromElementTokens()

in src/language/semantics/xsltTokenDiagnostics.ts [1685:1810]


  private static createSymbolFromElementTokens(
    name: string,
    id: string,
    fullStartToken: XSLTToken,
    fullEndToken: BaseToken,
    innerToken?: BaseToken
  ) {
    // innerToken to be used if its an attribute-value for example
    let kind: vscode.SymbolKind
    if (name.trim().length === 0) {
      return null
    }
    switch (fullStartToken.tagType) {
      case TagType.XSLTvar:
        kind = vscode.SymbolKind.Enum
        break
      case TagType.XSLTstart:
        switch (name) {
          case 'xsl:package':
          case 'xsl:stylesheet':
          case 'xsl:transform':
            kind = vscode.SymbolKind.Package
            break
          case 'xsl:function':
            kind = vscode.SymbolKind.Function
            break
          case 'xsl:template':
            kind = vscode.SymbolKind.Interface
            break
          case 'xsl:if':
          case 'xsl:when':
          case 'xsl:otherwise':
            kind = vscode.SymbolKind.Namespace
            break
          case 'xsl:key':
            kind = vscode.SymbolKind.Key
            break
          case 'xsl:sequence':
            kind = vscode.SymbolKind.Module
            break
          case 'xsl:value-of':
          case 'xsl:text':
            kind = vscode.SymbolKind.String
            break
          case 'xsl:for-each':
          case 'xsl:for-each-group':
          case 'xsl:apply-templates':
          case 'xsl:iterate':
            kind = vscode.SymbolKind.EnumMember
            break
          case 'xsl:import':
          case 'xsl:include':
            kind = vscode.SymbolKind.File
            break
          case 'xsl:choose':
            kind = vscode.SymbolKind.TypeParameter
            break
          default:
            kind = vscode.SymbolKind.Object
            break
        }
        break
      case TagType.XMLstart:
        kind = vscode.SymbolKind.Object
        break
      default:
        kind = vscode.SymbolKind.Null
        break
    }
    let startCharPos =
      fullStartToken.startCharacter > 0 ? fullStartToken.startCharacter - 1 : 0
    let startPos = new vscode.Position(fullStartToken.line, startCharPos)
    let endPos = new vscode.Position(
      fullEndToken.line,
      fullEndToken.startCharacter + fullEndToken.length + 1
    )
    let innerStartPos
    let innerEndPos
    if (innerToken) {
      innerStartPos = new vscode.Position(
        innerToken.line,
        innerToken.startCharacter
      )
      innerEndPos = new vscode.Position(
        innerToken.line,
        innerToken.startCharacter + innerToken.length
      )
    } else {
      innerStartPos = new vscode.Position(
        fullStartToken.line,
        fullStartToken.startCharacter
      )
      innerEndPos = new vscode.Position(
        fullEndToken.line,
        fullStartToken.startCharacter + fullStartToken.length
      )
    }
    let fullRange = new vscode.Range(startPos, endPos)
    let innerRange = new vscode.Range(innerStartPos, innerEndPos)
    // check for error!
    if (!fullRange.contains(innerRange)) {
      innerStartPos = new vscode.Position(
        fullStartToken.line,
        fullStartToken.startCharacter
      )
      innerEndPos = new vscode.Position(
        fullStartToken.line,
        fullStartToken.startCharacter + fullStartToken.length
      )
      innerRange = new vscode.Range(innerStartPos, innerEndPos)
    }
    let detail = ''
    let fullSymbolName = id.length > 0 ? name + ' \u203A ' + id : name

    if (fullRange.contains(innerRange)) {
      return new vscode.DocumentSymbol(
        fullSymbolName,
        detail,
        kind,
        fullRange,
        innerRange
      )
    } else {
      return null
    }
  }