Skip to content

Commit a75ea76

Browse files
committed
Fix to remove dfdl prefix for dfdl attributes if the element containing the
attributes is a dfdl element Changed _XmlItem class name to XmlItem Changed changed XmlItem variable name to xmlItem Added dfdl intellisense checklist Added intellisense test dfdl schema files to src/tests/data Closes #1080 Closes #1081 Closes #1170 Closes #1196
1 parent fc11fbd commit a75ea76

13 files changed

+472
-97
lines changed

src/language/providers/attributeCompletion.ts

+23-11
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@
1818
import * as vscode from 'vscode'
1919

2020
import {
21+
XmlItem,
22+
getSchemaNsPrefix,
2123
nearestOpen,
2224
checkBraceOpen,
2325
isInXPath,
2426
lineCount,
2527
createCompletionItem,
2628
getCommonItems,
27-
getXsdNsPrefix,
2829
getItemsOnLineCount,
2930
cursorWithinQuotes,
3031
cursorWithinBraces,
@@ -79,10 +80,15 @@ export function getAttributeCompletionProvider() {
7980
.text.substring(0, position.character)
8081
const charBeforeTrigger = triggerText.charAt(position.character - 1)
8182
const charAfterTrigger = triggerText.charAt(position.character)
82-
let nearestOpenItem = nearestOpen(document, position)
83+
let xmlItem = new XmlItem()
84+
xmlItem = nearestOpen(document, position)
85+
let nearestOpenItem = xmlItem.itemName
8386
let itemsOnLine = getItemsOnLineCount(triggerText)
84-
const nsPrefix = getXsdNsPrefix(document, position)
85-
let additionalItems = getDefinedTypes(document, nsPrefix)
87+
const nsPrefix = xmlItem.itemNS
88+
let additionalItems = getDefinedTypes(
89+
document,
90+
getSchemaNsPrefix(document)
91+
)
8692

8793
if (isInXPath(document, position)) return undefined
8894

@@ -131,9 +137,11 @@ export function getTDMLAttributeCompletionProvider() {
131137
.text.substring(0, position.character)
132138
const charBeforeTrigger = triggerText.charAt(position.character - 1)
133139
const charAfterTrigger = triggerText.charAt(position.character)
134-
let nearestOpenItem = nearestOpen(document, position)
140+
let xmlItem = new XmlItem()
141+
xmlItem = nearestOpen(document, position)
142+
let nearestOpenItem = xmlItem.itemName
135143
let itemsOnLine = getItemsOnLineCount(triggerText)
136-
const nsPrefix = getXsdNsPrefix(document, position)
144+
const nsPrefix = xmlItem.itemNS
137145
let additionalItems = getDefinedTypes(document, nsPrefix)
138146

139147
if (isInXPath(document, position)) return undefined
@@ -221,6 +229,10 @@ function checkNearestOpenItem(
221229
charAfterTrigger !== '\t'
222230
? ' '
223231
: ''
232+
let dfdlPrefix = dfdlDefaultPrefix
233+
if (nsPrefix === 'dfdl:') {
234+
dfdlPrefix = ''
235+
}
224236
switch (nearestOpenItem) {
225237
case 'element':
226238
return getCompletionItems(
@@ -256,7 +268,7 @@ function checkNearestOpenItem(
256268
preVal,
257269
additionalItems,
258270
nsPrefix,
259-
dfdlDefaultPrefix,
271+
dfdlPrefix,
260272
spacingChar,
261273
afterChar
262274
)
@@ -272,7 +284,7 @@ function checkNearestOpenItem(
272284
preVal,
273285
'',
274286
nsPrefix,
275-
dfdlDefaultPrefix,
287+
dfdlPrefix,
276288
spacingChar,
277289
afterChar
278290
)
@@ -288,7 +300,7 @@ function checkNearestOpenItem(
288300
'',
289301
'',
290302
nsPrefix,
291-
dfdlDefaultPrefix,
303+
dfdlPrefix,
292304
spacingChar,
293305
afterChar
294306
)
@@ -304,7 +316,7 @@ function checkNearestOpenItem(
304316
'',
305317
'',
306318
nsPrefix,
307-
dfdlDefaultPrefix,
319+
dfdlPrefix,
308320
spacingChar,
309321
afterChar
310322
)
@@ -322,7 +334,7 @@ function checkNearestOpenItem(
322334
'',
323335
'',
324336
nsPrefix,
325-
dfdlDefaultPrefix,
337+
dfdlPrefix,
326338
spacingChar,
327339
afterChar
328340
)

src/language/providers/attributeHover.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,20 @@ export function getAttributeHoverProvider() {
3030
const word = document.getText(range)
3131

3232
let itemNames: string[] = []
33-
attributeCompletion('', '', 'dfdl:', '', '').items.forEach((r) =>
33+
attributeCompletion('', '', 'dfdl', '', '').items.forEach((r) =>
3434
itemNames.push(r.item)
3535
)
36+
let testWord = ''
3637
if (word.length > 0) {
37-
if (itemNames.includes(word)) {
38+
if (!word.includes('dfdl:')) {
39+
testWord = 'dfdl:' + word
40+
} else {
41+
testWord = word
42+
}
43+
if (itemNames.includes(testWord)) {
3844
return new vscode.Hover({
3945
language: 'dfdl',
40-
value: attributeHoverValues(word),
46+
value: attributeHoverValues(testWord),
4147
})
4248
}
4349
}

src/language/providers/attributeValueCompletion.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import * as vscode from 'vscode'
1919

20-
import { checkBraceOpen, cursorWithinBraces, getXsdNsPrefix } from './utils'
20+
import { checkBraceOpen, cursorWithinBraces, getNsPrefix } from './utils'
2121
import { getDefinedTypes } from './attributeCompletion'
2222
import {
2323
attributeValues,
@@ -38,7 +38,8 @@ export function getAttributeValueCompletionProvider() {
3838
) {
3939
return undefined
4040
}
41-
const nsPrefix = getXsdNsPrefix(document, position)
41+
const schemaPosition = new vscode.Position(0, 0)
42+
const nsPrefix = getNsPrefix(document, schemaPosition)
4243
let additionalItems = getDefinedTypes(document, nsPrefix)
4344
let [attributeName, startPos, endPos] = getAttributeDetails(
4445
document,
@@ -93,7 +94,7 @@ export function getTDMLAttributeValueCompletionProvider() {
9394
) {
9495
return undefined
9596
}
96-
const nsPrefix = getXsdNsPrefix(document, position)
97+
const nsPrefix = getNsPrefix(document, position)
9798
let additionalItems = getDefinedTypes(document, nsPrefix)
9899
let [attributeName, startPos, endPos] = getAttributeDetails(
99100
document,

src/language/providers/closeElement.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424
cursorWithinQuotes,
2525
} from './utils'
2626
import {
27-
getXsdNsPrefix,
27+
getNsPrefix,
2828
insertSnippet,
2929
isInXPath,
3030
isNotTriggerChar,
@@ -63,7 +63,7 @@ export function getCloseElementProvider() {
6363
backpos3 = position.with(position.line, position.character - 3)
6464
}
6565

66-
let nsPrefix = getXsdNsPrefix(document, position)
66+
let nsPrefix = getNsPrefix(document, position)
6767
const origPrefix = nsPrefix
6868

6969
const nearestTagNotClosed = checkMissingCloseTag(
@@ -143,7 +143,7 @@ export function getTDMLCloseElementProvider() {
143143
backpos3 = position.with(position.line, position.character - 3)
144144
}
145145

146-
let nsPrefix = getXsdNsPrefix(document, position)
146+
let nsPrefix = getNsPrefix(document, position)
147147
const origPrefix = nsPrefix
148148

149149
const nearestTagNotClosed = checkMissingCloseTag(

src/language/providers/closeElementSlash.ts

+4-13
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
checkBraceOpen,
2323
isInXPath,
2424
isNotTriggerChar,
25-
getXsdNsPrefix,
25+
getNsPrefix,
2626
getItemPrefix,
2727
getItemsOnLineCount,
2828
cursorWithinBraces,
@@ -38,8 +38,8 @@ export function getCloseElementSlashProvider() {
3838
document: vscode.TextDocument,
3939
position: vscode.Position
4040
) {
41-
let backpos = position.with(position.line, position.character - 1)
42-
const nsPrefix = getXsdNsPrefix(document, position)
41+
let backpos = new vscode.Position(position.line, position.character - 1)
42+
const nsPrefix = getNsPrefix(document, position)
4343
const triggerText = document
4444
.lineAt(position)
4545
.text.substring(0, position.character)
@@ -98,7 +98,7 @@ export function getTDMLCloseElementSlashProvider() {
9898
position: vscode.Position
9999
) {
100100
let backpos = position.with(position.line, position.character - 1)
101-
const nsPrefix = getXsdNsPrefix(document, position)
101+
const nsPrefix = getNsPrefix(document, position)
102102
const triggerText = document
103103
.lineAt(position)
104104
.text.substring(0, position.character)
@@ -154,11 +154,6 @@ function checkItemsOnLine(
154154
!(nearestTagNotClosed == 'none') &&
155155
(itemsOnLine == 1 || itemsOnLine == 0)
156156
) {
157-
// let range = new vscode.Range(backpos, position)
158-
159-
// await vscode.window.activeTextEditor?.edit((editBuilder) => {
160-
// editBuilder.replace(range, '')
161-
// })
162157
if (
163158
nearestTagNotClosed.includes('defineVariable') ||
164159
nearestTagNotClosed.includes('setVariable')
@@ -176,10 +171,6 @@ function checkItemsOnLine(
176171
) {
177172
let tagPos = triggerText.lastIndexOf('<' + nsPrefix + nearestTagNotClosed)
178173
let tagEndPos = triggerText.indexOf('>', tagPos)
179-
// let range = new vscode.Range(backpos, position)
180-
// await vscode.window.activeTextEditor?.edit((editBuilder) => {
181-
// editBuilder.replace(range, '')
182-
// })
183174

184175
if (
185176
tagPos != -1 &&

src/language/providers/closeUtils.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export function checkMissingCloseTag(
4545
i
4646
)
4747

48-
if (gt1res != undefined) {
48+
if (gt1res != 'none') {
4949
return gt1res
5050
}
5151
}
@@ -248,7 +248,7 @@ export function getItemsForLineGT1(
248248
) {
249249
let openTagArray: number[] = []
250250
let closeTagArray: number[] = []
251-
let [nextCloseCharPos, nextOpenTagPos] = [0, 0, 0]
251+
let [nextCloseCharPos, nextOpenTagPos] = [0, 0]
252252

253253
while (
254254
(nextOpenTagPos = triggerText.indexOf(
@@ -336,7 +336,8 @@ export function getItemsForLineLT2(
336336
testLine = lineBefore
337337
while (!testText.includes('>')) {
338338
testText = document.lineAt(++testLine).text
339-
if (testText.indexOf('<') > -1) [openTagArray.push(testLine)]
339+
if (testText.indexOf('<' + nsPrefix + items[i]) > -1)
340+
openTagArray.push(testLine)
340341
}
341342
}
342343

src/language/providers/elementCompletion.ts

+16-6
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
import * as vscode from 'vscode'
1919
import { checkMissingCloseTag, getCloseTag } from './closeUtils'
2020
import {
21+
XmlItem,
2122
checkBraceOpen,
22-
getXsdNsPrefix,
23+
getNsPrefix,
2324
isInXPath,
2425
isTagEndTrigger,
2526
nearestOpen,
@@ -43,19 +44,23 @@ export function getElementCompletionProvider(dfdlFormatString: string) {
4344
token: vscode.CancellationToken,
4445
context: vscode.CompletionContext
4546
) {
47+
const triggerChar = context.triggerCharacter
4648
if (
4749
!checkBraceOpen(document, position) &&
4850
!cursorWithinBraces(document, position) &&
4951
!cursorWithinQuotes(document, position) &&
5052
!cursorAfterEquals(document, position) &&
5153
!isInXPath(document, position) &&
52-
!isTagEndTrigger(document, position)
54+
!isTagEndTrigger(triggerChar)
5355
) {
54-
let nsPrefix = getXsdNsPrefix(document, position)
56+
let nsPrefix = getNsPrefix(document, position)
5557
let [triggerLine, triggerPos] = [position.line, position.character]
5658
let triggerText = document.lineAt(triggerLine).text
5759
let itemsOnLine = getItemsOnLineCount(triggerText)
5860
let nearestOpenItem = nearestOpen(document, position)
61+
if (nearestOpenItem.itemNS != 'none') {
62+
nsPrefix = nearestOpenItem.itemNS
63+
}
5964
let lastCloseSymbol = triggerText.lastIndexOf('>')
6065
let firstOpenSymbol = triggerText.indexOf('<')
6166

@@ -65,7 +70,10 @@ export function getElementCompletionProvider(dfdlFormatString: string) {
6570
nsPrefix
6671
)
6772

68-
if (!nearestOpenItem.includes('none') && missingCloseTag == 'none') {
73+
if (
74+
!nearestOpenItem.itemName.includes('none') &&
75+
missingCloseTag == 'none'
76+
) {
6977
return undefined
7078
}
7179
if (
@@ -122,11 +130,13 @@ export function getTDMLElementCompletionProvider(tdmlFormatString: string) {
122130
return undefined
123131
}
124132

125-
let nsPrefix = getXsdNsPrefix(document, position)
133+
let nsPrefix = getNsPrefix(document, position)
126134
let [triggerLine, triggerPos] = [position.line, position.character]
127135
let triggerText = document.lineAt(triggerLine).text
128136
let itemsOnLine = getItemsOnLineCount(triggerText)
129-
let nearestOpenItem = nearestOpen(document, position)
137+
let xmlItem = new XmlItem()
138+
xmlItem = nearestOpen(document, position)
139+
let nearestOpenItem = xmlItem.itemName
130140
let lastCloseSymbol = triggerText.lastIndexOf('>')
131141
let firstOpenSymbol = triggerText.indexOf('<')
132142

0 commit comments

Comments
 (0)