in src/language/semantics/xsltTokenDiagnostics.ts [1675:1800]
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
}
}