This is an automated email from the ASF dual-hosted git repository.

davin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/daffodil-vscode.git


The following commit(s) were added to refs/heads/main by this push:
     new 48d4580  Remove unused code
48d4580 is described below

commit 48d45805659d30e0c09edfb567fdb3b64a31515a
Author: Michael Hoke <[email protected]>
AuthorDate: Mon Oct 30 12:03:41 2023 -0400

    Remove unused code
    
    Augment XPath validation:
      - Prebuilt dfdl variables
      - fn:concat with 2 arguments
      - Don't flag dfdl variables with a valid namespace
---
 src/language/semantics/dfdlExt.ts              | 95 ++++++++++++--------------
 src/language/semantics/functionData.ts         |  1 +
 src/language/semantics/xsltTokenDiagnostics.ts | 18 +++--
 3 files changed, 60 insertions(+), 54 deletions(-)

diff --git a/src/language/semantics/dfdlExt.ts 
b/src/language/semantics/dfdlExt.ts
index 18c5496..e9b62c0 100644
--- a/src/language/semantics/dfdlExt.ts
+++ b/src/language/semantics/dfdlExt.ts
@@ -3,19 +3,10 @@
  *  Licensed under the MIT License. See License.txt in the project root for 
license information.
  
*--------------------------------------------------------------------------------------------*/
 
+import { EOL } from 'os'
 import * as vscode from 'vscode'
-import {
-  XPathLexer,
-  ExitCondition,
-  LexPosition,
-  Token,
-  BaseToken,
-} from './xpLexer'
-import {
-  XslLexer,
-  GlobalInstructionData,
-  GlobalInstructionType,
-} from './xslLexer'
+import { XPathLexer, ExitCondition, LexPosition, Token } from './xpLexer'
+import { XslLexer } from './xslLexer'
 import { XsltTokenDiagnostics } from './xsltTokenDiagnostics'
 import { DocumentChangeHandler } from './documentChangeHandler'
 
@@ -53,40 +44,13 @@ export class XPathSemanticTokensProvider
     this.collection = collection
   }
 
-  private static globalInstructionData: GlobalInstructionData[] = []
-
-  public static getGlobalInstructionData() {
-    return XPathSemanticTokensProvider.globalInstructionData
-  }
-
-  public static setVariableNames = (names: string[]) => {
-    const data: GlobalInstructionData[] = []
-
-    names.forEach((name) => {
-      const token: BaseToken = {
-        line: 1,
-        startCharacter: 0,
-        length: 1,
-        value: name,
-        tokenType: 0,
-      }
-      const variableInstruction: GlobalInstructionData = {
-        type: GlobalInstructionType.Variable,
-        name: name,
-        token: token,
-        idNumber: 0,
-      }
-      data.push(variableInstruction)
-    })
-    XPathSemanticTokensProvider.globalInstructionData = data
-  }
-
   async provideDocumentSemanticTokens(
     document: vscode.TextDocument,
     token: vscode.CancellationToken
   ): Promise<vscode.SemanticTokens> {
     this.xpLexer.documentTokens = []
-    let variables: string[] = this.findAllVariables(document.getText())
+    let [variables, namespaces]: [string[], string[]] =
+      this.findAllVariablesandNamespaces(document.getText())
     let tokens: Token[] = []
 
     const tokenPositions = this.findAllXPath(document.getText())
@@ -118,7 +82,10 @@ export class XPathSemanticTokensProvider
 
       // This was moved to inside the loop. If it isn't, the sections of XPath 
will be treated
       //   as a single XPath section instead of multiples
-      setTimeout(() => this.reportProblems(tmpTokens, document, variables), 0)
+      setTimeout(
+        () => this.reportProblems(tmpTokens, document, variables, namespaces),
+        0
+      )
 
       // Reset the xpLexer. If this is not done, existing tokens will not be 
flushed
       //   and will be re-added to the tokens list. This might not affect the 
operation, but it does
@@ -201,14 +168,27 @@ export class XPathSemanticTokensProvider
   }
 
   // Find the names of all variables in the file
-  private findAllVariables(document: String | undefined): string[] {
+  private findAllVariablesandNamespaces(
+    document: String | undefined
+  ): [string[], string[]] {
     if (document === undefined) {
-      return []
+      return [[], []]
     }
 
-    const lines = document.split('\n')
+    const lines = document.split(EOL)
+
     const variableRegex = /(dfdl:defineVariable.*name=\")(.*?)\"/
-    const variables: string[] = []
+    // These are built-in predefined variables. Double check if we still need 
to hardcode these
+    // once we have the ability to create a DFDL model outside of a Parse 
operation.
+    const variables: string[] = [
+      'dfdl:encoding',
+      'dfdl:byteOrder',
+      'dfdl:binaryFloatRep',
+      'dfdl:outputNewLine',
+    ]
+
+    const namespaceRegex = /xmlns:(.*?)=\"/g
+    const namespaces: string[] = []
 
     // Capture and return a list of variable names
     for (let i = 0; i < lines.length; i++) {
@@ -217,24 +197,39 @@ export class XPathSemanticTokensProvider
       if (variableMatch) {
         variables.push(variableMatch[2])
       }
+
+      // If a DFDL schema has multiple namespaces defined on the same line, we 
need to make sure we are globally
+      // matching for the namespace pattern so that we don't miss any
+      let namespaceMatch: RegExpExecArray | null = null
+
+      // Continue matching until we don't find any more namespaces on the same 
line
+      do {
+        namespaceMatch = namespaceRegex.exec(lines[i])
+
+        if (namespaceMatch) {
+          namespaces.push(namespaceMatch[1])
+        }
+      } while (namespaceMatch)
     }
 
-    return variables
+    return [variables, namespaces]
   }
 
   // This function will produce the error/warning list for vscode
   private reportProblems(
     allTokens: Token[],
     document: vscode.TextDocument,
-    variables: string[]
+    variables: string[],
+    namespaces: string[]
   ) {
     let diagnostics = XsltTokenDiagnostics.calculateDiagnostics(
       document,
       allTokens,
       DocumentChangeHandler.lastXMLDocumentGlobalData,
-      XPathSemanticTokensProvider.globalInstructionData,
       [],
-      variables
+      [],
+      variables,
+      namespaces
     )
     diagnostics.forEach((diag) => {
       this.diagnosticList.push(diag)
diff --git a/src/language/semantics/functionData.ts 
b/src/language/semantics/functionData.ts
index 211154c..3626b97 100644
--- a/src/language/semantics/functionData.ts
+++ b/src/language/semantics/functionData.ts
@@ -47,6 +47,7 @@ export class FunctionData {
     'collection#1',
     'compare#2',
     'compare#3',
+    'concat#2',
     'concat#3',
     'contains#2',
     'contains#3',
diff --git a/src/language/semantics/xsltTokenDiagnostics.ts 
b/src/language/semantics/xsltTokenDiagnostics.ts
index 954cb49..b879eee 100644
--- a/src/language/semantics/xsltTokenDiagnostics.ts
+++ b/src/language/semantics/xsltTokenDiagnostics.ts
@@ -311,7 +311,8 @@ export class XsltTokenDiagnostics {
     globalInstructionData: GlobalInstructionData[],
     importedInstructionData: GlobalInstructionData[],
     symbols: vscode.DocumentSymbol[],
-    globalVariables: string[]
+    globalVariables: string[],
+    xmlNamespaces: string[]
   ): vscode.Diagnostic[] => {
     let inScopeVariablesList: VariableData[] = []
     let xpathVariableCurrentlyBeingDefined: boolean
@@ -330,7 +331,7 @@ export class XsltTokenDiagnostics {
     let topLevelSymbols: vscode.DocumentSymbol[] = symbols
     let tagIdentifierName: string = ''
     let lastTokenIndex = allTokens.length - 1
-    let inheritedPrefixes: string[] = []
+    let inheritedPrefixes: string[] = xmlNamespaces
     let globalVariableData: VariableData[] = []
     let checkedGlobalVarNames: string[] = []
     let checkedGlobalFnNames: string[] = []
@@ -567,7 +568,8 @@ export class XsltTokenDiagnostics {
                 inScopeXPathVariablesList,
                 xpathStack,
                 inScopeVariablesList,
-                elementStack
+                elementStack,
+                xmlNamespaces
               )
             if (unResolvedToken !== null) {
               unresolvedXsltVariableReferences.push(unResolvedToken)
@@ -1624,7 +1626,8 @@ export class XsltTokenDiagnostics {
     inScopeXPathVariablesList: VariableData[],
     xpathStack: XPathData[],
     inScopeVariablesList: VariableData[],
-    elementStack: ElementData[]
+    elementStack: ElementData[],
+    xmlNamespaces: string[]
   ): BaseToken | null {
     let fullVarName = XsltTokenDiagnostics.getTextForToken(
       token.line,
@@ -1666,6 +1669,13 @@ export class XsltTokenDiagnostics {
       importedResolved =
         globalVarName !== varName && importedVariables.indexOf(varName) > -1
     }
+    // Parse the namespaces from the DFDL document that contains the XPath 
segments. If the variable is
+    // defined in an external namespace that we are importing, don't flag it. 
This is a temporary solution
+    // that we can remove once we have the ability to create a DFDL model 
outside of a Parse operation.
+    if (!resolved && !importedResolved && varName.includes(':')) {
+      let splits = varName.split(':')
+      resolved = xmlNamespaces.includes(splits[0]) ? token : undefined
+    }
     if (!resolved && !importedResolved) {
       result = token
     }

Reply via email to