devicetree-language-server 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.js +1 -1
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -271,4 +271,4 @@ ${n}`])]:[]}else if(e.keyword==="maxItems"||e.keyword==="minItems"){let o=i.getP
|
|
|
271
271
|
${JSON.stringify(e)}
|
|
272
272
|
${n}`])]:[C(26,s.node.definitions[0]instanceof ut?s.node.definitions[0]:s.node.definitions[0].name??s.node.definitions[0],void 0,void 0,void 0,[`${e.message??"NO MESSAGE"}:
|
|
273
273
|
${JSON.stringify(e)}
|
|
274
|
-
${n}`])]},AH=(r,e)=>LO(r,e.split("/").filter(t=>t)),LO=(r,e)=>{if(e.length===0)return{node:r,remainingInstancePath:""};let t=e[0].split("@"),n=t[0],s=t.at(1)?.split(",").map(o=>Number.parseInt(o,16)),i=r.getNode(n,s);return i?LO(i,e.slice(1)):{node:r,property:r.getProperty(e[0]),remainingInstancePath:e.slice(1).join("/")}};var Dv=class r{constructor(){this.schemaIdValidators=new Map;this.ajvMap=new Map}static getNodeCompatible(e){let n=e.getProperty("compatible")?.ast.values;if(!n?.values.some(s=>!(s?.value instanceof De)))return n?.values.map(s=>(s?.value).value)}parseMetaSchema(e,t){ui.sync("**/*.yaml",{cwd:e}).forEach(s=>{s=(0,Rv.resolve)(e,s);try{let i=Pv.default.parse((0,Cv.readFileSync)(s,"utf-8"));t.addMetaSchema(i),this.schemaIdValidators.set(i.$id,s)}catch{}})}parseBindings(e,t){ui.sync("**/*.yaml",{cwd:e}).forEach(s=>{s=(0,Rv.resolve)(e,s);try{let i=Pv.default.parse((0,Cv.readFileSync)(s,"utf-8"));t.addSchema(i),this.schemaIdValidators.set(i.$id,s)}catch(i){console.warn(s,i.message)}})}getNodeTypes(e,t,n){let s=`${e.join(";")}::${t.join(";")}`,i=this.ajvMap.get(s);return i||(i=new jO.default({strict:!1,strictSchema:!1,strictNumbers:!1}),i.addMetaSchema(Nv),this.ajvMap.set(s,i),e.forEach(c=>this.parseMetaSchema(c,i)),t.forEach(c=>this.parseBindings(c,i))),r.getNodeCompatible(n)?.map(c=>{try{let l=Array.from(this.schemaIdValidators.keys()).find(f=>f.endsWith(`/${c}.yaml#`));if(!l)return;let u=new ah(i,l);u.bindingsPath=this.schemaIdValidators.get(l),u.compatible=c;let d=i.getSchema(l);return u.description=(d?.schema).description,u.examples=(d?.schema).examples,u.maintainers=(d?.schema).maintainers,u}catch(l){console.warn(l.message)}}).filter(c=>c)??[]}},qO,FO=()=>(qO??=new Dv,qO);var WO=z(cy());var Jo=require("path"),HO=require("fs");var Nn=z(J()),IH=r=>{switch(r){case"string":return V(3);case"int":return V(1);case"boolean":return V(0);case"array":return V(4);case"uint8-array":return V(6);case"string-array":return V(5);case"phandle":return V(1);case"phandles":return V(4);case"phandle-array":return V(4);case"path":return V([3,1]);case"compound":return V(8)}},BO=(r,e)=>{switch(r){case"string":return typeof e=="string"?e:void 0;case"int":return typeof e=="number"?e:void 0;case"boolean":return;case"array":return Array.isArray(e)&&e.every(t=>typeof t=="number")?e:void 0;case"uint8-array":return Array.isArray(e)&&e.every(t=>typeof t=="number")?e:void 0;case"string-array":return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:void 0;case"phandle":return;case"phandles":return;case"phandle-array":return;case"path":return;case"compound":return}},ch=(r,e)=>{if(e=e.include.reduce((t,n)=>{let s=r.find(i=>(0,Jo.basename)(i.filePath)===n.name);if(s){let i=n["property-blocklist"];return t.include=t.include.filter(o=>o!==n),MH(r,s,t,i)??t}return console.warn(`Unable to find ${n}`),t},e),e["child-binding"]&&(e["child-binding"].include=KO(e["child-binding"].include),e["child-binding"]=ch(r,e["child-binding"])),!e.include.length)return e},MH=(r,e,t,n=[])=>{let s=ch(r,e),i=ch(r,t);if(!s||!i)return;let o=new Set;Object.keys(s?.properties??{}).forEach(d=>o.add(d)),Object.keys(i?.properties??{}).forEach(d=>o.add(d));let a={};Array.from(o).forEach(d=>{let f=n?.some(v=>v===d)?{}:s.properties?.[d]??{},p=i.properties?.[d]??{};a={...a,[d]:{...f,...p}}}),i.properties=a;let c=new Set;return Object.keys(s).filter(d=>d.endsWith("-cells")).forEach(d=>c.add(d)),Object.keys(s).filter(d=>d.endsWith("-cells")).forEach(d=>c.add(d)),Array.from(c).forEach(d=>{let f=s[d]??[],p=i[d]??[];i[d]=Array.from([...f,...p])}),i},KO=r=>r?typeof r=="string"?[{name:r}]:r.map(e=>typeof e!="string"?e:{name:e}):[],Ov=class r{constructor(){this.typeCache=new Map;this.readFolders=[]}static getNodeCompatible(e){let n=e.getProperty("compatible")?.ast.values;if(!n?.values.some(s=>!(s?.value instanceof De)))return n?.values.map(s=>(s?.value).value)}getNodeTypes(e,t){let n=r.getNodeCompatible(t);if(!n)return[Zs(t)];let s=n.map(o=>this.typeCache.get(o)?.(t)).filter(o=>o);if(s.length)return s;this.loadTypeAndCache(e);let i=n.map(o=>this.typeCache.get(o)?.(t)).filter(o=>o);return i.length?i:[Zs(t)]}loadTypeAndCache(e){e=Array.isArray(e)?e:[e],e.forEach(t=>{if(this.readFolders.indexOf(t)!==-1)return;this.readFolders.push(t);let s=ui.sync("**/*.yaml",{cwd:t,ignore:"test/*"}).map(o=>{o=(0,Jo.resolve)(t,o);try{let a=WO.default.parse((0,HO.readFileSync)(o,"utf-8"));return{...a,include:KO(a.include),filePath:o}}catch(a){console.warn(a)}}).filter(o=>!!o),i=s.map(o=>ch(s,o)).filter(o=>!!o&&!o.include.length);$H(i,this.typeCache)})}},UO,zO=()=>(UO??=new Ov,UO),$H=(r,e)=>r.forEach(t=>{let n=t.compatible??(t.filePath?(0,Jo.basename)(t.filePath,"yaml"):void 0);n&&e.set(n,s=>GO(t,s))}),GO=(r,e)=>{let t=Zs(e);t.compatible=r.compatible??(r.filePath?(0,Jo.basename)(r.filePath,"yaml"):void 0),t.description=r.description,t.bindingsPath=r.filePath,t.bus=typeof r.bus=="string"?[r.bus]:r.bus,t.onBus=r["on-bus"];let s=Object.keys(r).filter(i=>i.endsWith("-cells")).map(i=>({specifier:i.replace(/-cells$/,""),values:r[i]}));if(r.properties&&Object.keys(r.properties).forEach(i=>{let o=r.properties[i];xH(t,i,o),t.cellsValues=s}),r["child-binding"]){let i=r["child-binding"];t.childNodeType=o=>GO(i,o)}return t},xH=(r,e,t)=>{let n=r.properties.find(s=>typeof s.name=="string"&&s.getNameMatch(e));if(n){n.required=()=>t.required?"required":"optional",n.values=()=>t.enum??[],n.constValue=BO(t.type,t.const);let s=n.additionalTypeCheck;n.additionalTypeCheck=i=>[...VO(t,e)(i),...s?.(i)??[]]}else{let s=new H(e,IH(t.type),t.required?"required":"optional",void 0,t.enum,VO(t,e));s.description=t.description?[t.description]:void 0,s.constValue=BO(t.type,t.const),r.addProperty(s)}},VO=(r,e)=>{let t=r;return n=>{let s=n.parent.root,i=[];if(t.const){let o=n.ast.quickValues;if(o?.length==1){let a=Array.isArray(t.const)?t.const:[t.const];Array.isArray(o[0])&&a.length===o[0].length&&o[0].every((l,u)=>typeof l=="number"&&Number.isNaN(l)||a[u]===l)||i.push(C(25,n.ast.values??n.ast,Nn.DiagnosticSeverity.Error,[],[],[`Binding expects values to be "${t.type}" with value: ${t.const}`]))}}if(t.deprecated&&i.push(C(14,n.ast,Nn.DiagnosticSeverity.Warning,[],[Nn.DiagnosticTag.Deprecated],[n.name])),(t.type==="phandle"||t.type==="phandles"||t.type==="path")&&Qt(n.ast.values)?.forEach(a=>{zr(a,s)||i.push(C(23,a,Nn.DiagnosticSeverity.Error))}),t.type==="path"&&n.ast.values?.values.at(0)?.value instanceof De){let o=n.ast.values?.values.at(0)?.value,a=[];o.value.split("/").every(c=>{let l=s.getNode(c);return l?a.push(c):i.push(C(24,o,Nn.DiagnosticSeverity.Error,[],[],[c,`/${a.join("/")}`])),!l})}if(t.type==="phandle-array"){let o=Qt(n.ast.values),a=0;for(;o&&a<o.length;){let c=o.at(a),l=zr(c,s);if(!l){i.push(C(23,c??n.ast,Nn.DiagnosticSeverity.Error));break}let u="";e.endsWith("-gpios")?u="gpio":u=t["specifier-space"]??e.slice(0,-1);let d=l.getProperty(`#${u}-cells`);if(!d){i.push(C(16,n.ast,Nn.DiagnosticSeverity.Error,[...l.nodeNameOrLabelRef],[],[n.name,`#${u}-cells`,`/${l.path.slice(1).join("/")}`]));break}let f=d?Re(d,0,0)??0:0;if(1+f>o.length-a){let p=l.nodeType?.cellsValues?.find(v=>v.specifier===u)?.values;i.push(C(20,c??n.ast,Nn.DiagnosticSeverity.Error,[],[],[n.name,`<${["phandel",...p??[],...Array.from({length:f-(p?.length??0)},()=>"cell")].join(" ")}>`]));break}a+=1+f}}return i}};var lh=(r,e)=>({getNodeTypes:async t=>{switch(e){case"Zephyr":return zO().getNodeTypes(r.zephyrBindings,t);case"DevicetreeOrg":return FO().getNodeTypes(r.deviceOrgBindingsMetaSchema,r.deviceOrgTreeBindings,t)}}});var Iv=z(J());var Av=r=>!r.openScope||!r.closeScope?.prevToken?r.nodes.flatMap(Av):[{startLine:r.openScope.pos.line,startCharacter:r.openScope.pos.col,endLine:r.closeScope.prevToken.pos.line,endCharacter:r.closeScope.prevToken.pos.col,kind:Iv.FoldingRangeKind.Region},...r.nodes.flatMap(Av)],YO=r=>{let e=[];return[...r instanceof ps?r.ifBlocks.map(t=>({start:(t.expression??t.keyword).lastToken,end:t.content?.lastToken??(t.expression??t.keyword).lastToken})):[{start:(r.ifDef.identifier??r.ifDef.keyword).lastToken,end:r.ifDef.content?.lastToken}],r.elseOption?{start:r.elseOption.keyword.lastToken,end:r.elseOption.content?.lastToken}:null].forEach(t=>{!t||!t.end||e.push({startLine:t.start.pos.line,startCharacter:t.start.pos.col,endLine:t.end.pos.line,endCharacter:t.end.pos.col+t.end.pos.len,kind:Iv.FoldingRangeKind.Region})}),e},LH=r=>r instanceof Le?Av(r):r instanceof ao||r instanceof ps?YO(r):[];function JO(r,e){return e.allAstItems.filter(t=>t.uri===r).flatMap(LH)}var Ei=z(J());function qH(r){if(!r||!(r.ast instanceof qe)&&!(r.ast instanceof Mt))return[];let e=t=>t.nodeType?.bindingsPath?[Ei.Location.create(`file://${t.nodeType.bindingsPath}`,Ei.Range.create(Ei.Position.create(0,0),Ei.Position.create(0,0)))]:[];return r.item instanceof ke&&!_t(r.ast)?e(r.item):r.ast instanceof Mt&&r.ast.parentNode instanceof ve&&r.ast.parentNode.linksTo?e(r.ast.parentNode.linksTo):r.ast instanceof qe&&r.ast.linksTo?e(r.ast.linksTo):[]}async function XO(r,e,t,n){return It(r,e,s=>[...qH(s)],t,n)}var Pn=require("path");var dh=require("fs");var jH=(r,e)=>{Yr().reset(r),Yr().requestTokens(r,!0),e(r)},uh=class{constructor(e,t,n){this.file=e;this.cb=t;this.hasDocumentOpen=n;this.count=0}watch(){if(this.count++,this.count===1){console.log("create watch for",this.file);let e=this.file,t=this.cb;this.onChange=()=>{if(this.hasDocumentOpen(e)){console.log("skipping on change document is open",e);return}console.log("onChange",e),jH(e,t)},(0,dh.watchFile)(e,this.onChange)}}unwatch(){this.count--,this.count===0&&(console.log("dispose watch for",this.file),(0,dh.unwatchFile)(this.file,this.onChange),this.onChange=void 0)}};var Ve=[],rt,Mv,Qc=new WeakMap,fh=new Map,$v=r=>{Ve.some(e=>e===r)||(Ve.push(r),QO(r))},QO=async r=>{await r.stable(),r.getContextFiles().forEach(e=>{fh.has(e)||fh.set(e,new uh(e,jv,t=>!!Rn.get(`file://${t}`))),fh.get(e)?.watch()})},Lv=async r=>{let e=Ve.indexOf(r);e!==-1&&(ph(r),Qc.delete(r),console.log(`cleaning up context with ID ${r.name} and uri ${r.parser.uri}`),Ve.splice(e,1),ZO(r))},ZO=async r=>{await r.stable(),r.getContextFiles().forEach(e=>fh.get(e)?.unwatch())},FH=r=>{let e=Qc.get(r);if(!e?.abort.signal.aborted)return Promise.all([e?.promise,r.getRuntime()])},Ot=async()=>{await aA,await Promise.all(Ve.map(FH))},hh=r=>{let e=eA(r);return Ve.filter(t=>!e.some(n=>n===t))},eA=r=>Ve.filter(e=>{let t=r.contexts?.find(n=>n.dtsFile===e.parser.uri);return!!t&&t.overlays?.every(n=>e.overlays.some(s=>s===n))}),BH=async(r,e)=>{if(r===e)return!0;let t=(await r.getAllParsers()).flatMap(s=>s.cPreprocessorParser.dtsIncludes),n=(await e.getAllParsers()).flatMap(s=>s.cPreprocessorParser.dtsIncludes);return t.length?t.every(s=>n.some(i=>i.resolvedPath===s.resolvedPath&&i.firstToken.pos.col===s.firstToken.pos.col&&i.firstToken.pos.len===s.firstToken.pos.len&&i.firstToken.pos.line===s.firstToken.pos.line&&i.lastToken.pos.col===s.lastToken.pos.col&&i.lastToken.pos.len===s.lastToken.pos.len&&i.lastToken.pos.line===s.lastToken.pos.line)):e.getContextFiles().some(s=>s===r.parser.uri)},tA=r=>hh(te).indexOf(r)!==-1,rA=async r=>{if(!tA(r))return;let e=hh(te),t=await eA(te),n=await xu(e),s=[...r.overlayParsers.map(a=>a.uri),r.parser.uri,...r.parser.includes.map(a=>a.resolvedPath)];if(Ve.indexOf(r)===-1)return;let i=await Promise.all(n.flatMap(a=>[...t,...e.filter(c=>c!==a.context)].map(async c=>({context:a.context,same:await BH(a.context,c)})))),o=n.filter(a=>i.some(c=>c.context===a.context&&c.same)||a.context!==r&&a.context.parser.uri===r.parser.uri&&s.some(c=>c&&a.files.indexOf(c)!==-1)).map(a=>a.context);o.length&&o.forEach(Lv)},_e=(0,Me.createConnection)(Me.ProposedFeatures.all),Rn=new Me.TextDocuments(Iu),qv=!0,xv=!1,nA=!1;_e.onInitialize(r=>{let e=r.capabilities;qv=!!(e.workspace&&e.workspace.configuration),xv=!!(e.workspace&&e.workspace.workspaceFolders),nA=!!e.workspace?.diagnostics?.refreshSupport;let t={capabilities:{typeDefinitionProvider:!0,workspaceSymbolProvider:!0,textDocumentSync:Me.TextDocumentSyncKind.Incremental,renameProvider:{prepareProvider:!0},completionProvider:{resolveProvider:!0,triggerCharacters:["&","="," "]},codeActionProvider:{codeActionKinds:[Me.CodeActionKind.QuickFix,Me.CodeActionKind.SourceFixAll]},documentSymbolProvider:!0,semanticTokensProvider:{legend:{tokenTypes:Mu,tokenModifiers:$u},full:!0},documentLinkProvider:{resolveProvider:!1},foldingRangeProvider:!0,definitionProvider:!0,declarationProvider:!0,referencesProvider:!0,documentFormattingProvider:!0,hoverProvider:!0}};return xv&&(t.capabilities.workspace={workspaceFolders:{supported:!0}}),t});_e.onInitialized(()=>{qv&&_e.client.register(Me.DidChangeConfigurationNotification.type,{}),xv&&_e.workspace.onDidChangeWorkspaceFolders(r=>{_e.console.log("Workspace folder change event received")})});var sA={defaultBindingType:"Zephyr",defaultZephyrBindings:[],defaultIncludePaths:[],defaultDeviceOrgBindingsMetaSchema:[],defaultDeviceOrgTreeBindings:[],contexts:[],lockRenameEdits:[],allowAdhocContexts:!0,autoChangeContext:!0},te=sA,iA=new Map,oA=!1,aA=new Promise(r=>{let e=setInterval(()=>{oA&&(r(),clearInterval(e))},100)});_e.onDidChangeConfiguration(r=>{if(oA=!0,!r.settings)return;console.log("Configuration changed",r),qv&&iA.clear();let e=te;te={...sA,...r.settings?.devicetree},te.contexts?.forEach((s,i)=>{if(s.cwd||te.cwd){let o=s.cwd??te.cwd;s.includePaths??=te.defaultIncludePaths,s.zephyrBindings??=te.defaultIncludePaths,s.bindingType??=te.defaultBindingType,s.deviceOrgTreeBindings??=te.defaultDeviceOrgTreeBindings,s.deviceOrgBindingsMetaSchema??=te.defaultDeviceOrgBindingsMetaSchema,o&&s.bindingType==="Zephyr"&&(!s.zephyrBindings||s.zephyrBindings.length===0)&&(s.zephyrBindings=["./zephyr/dts/bindings"]),s.zephyrBindings=s.zephyrBindings?.map(a=>(0,Pn.resolve)(o,a)),s.deviceOrgTreeBindings=s.deviceOrgTreeBindings?.map(a=>(0,Pn.resolve)(o,a)),s.deviceOrgBindingsMetaSchema=s.deviceOrgBindingsMetaSchema?.map(a=>(0,Pn.resolve)(o,a)),s.includePaths=s.includePaths?.map(a=>(0,Pn.resolve)(o,a)),s.dtsFile=(0,Pn.resolve)(o,s.dtsFile)}});let t=hh(e);Ve.forEach(Lv),Qc=new WeakMap,te.contexts?.forEach((s,i)=>{let o=s.bindingType,a=new fo(s.dtsFile,s.includePaths??[],o?lh({zephyrBindings:s.zephyrBindings??[],deviceOrgBindingsMetaSchema:s.deviceOrgBindingsMetaSchema??[],deviceOrgTreeBindings:s.deviceOrgTreeBindings??[]},o):void 0,s.overlays,s.ctxName);$v(a),console.log(`New context with ID ${a.name} for ${s.dtsFile}`)});let n=cA();t.map(s=>{let i=te.defaultBindingType,o=new fo(s.parser.uri,n.defaultIncludePaths,i?lh({zephyrBindings:n.defaultZephyrBindings,deviceOrgBindingsMetaSchema:n.defaultDeviceOrgBindingsMetaSchema,deviceOrgTreeBindings:n.defaultDeviceOrgTreeBindings},i):void 0);return console.log(`New context with ID ${o.name} for ${s.parser.uri}`),o}).forEach($v),t=hh(te),t.forEach(rA),Mv&&Zc(Mv,!0),nA&&_e.languages.diagnostics.refresh()});var cA=()=>{let r=(te.defaultIncludePaths??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s);te.cwd&&te.defaultBindingType==="Zephyr"&&!te.defaultZephyrBindings&&(te.defaultZephyrBindings=["./zephyr/dts/bindings"]);let e=(te.defaultZephyrBindings??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s),t=(te.defaultDeviceOrgBindingsMetaSchema??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s),n=(te.defaultDeviceOrgTreeBindings??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s);return{defaultIncludePaths:r,defaultZephyrBindings:e,defaultDeviceOrgBindingsMetaSchema:t,defaultDeviceOrgTreeBindings:n}};Rn.onDidClose(r=>{let e=r.document.uri.replace("file://",""),t=rt;if(!t)return;(t?.getContextFiles()??[]).filter(i=>i!==e).some(i=>Rn.get(`file://${i}`))||(tA(t)?Lv(t):ph(t),rt=void 0),iA.delete(r.document.uri)});Rn.onDidOpen(async r=>{await Ot();let e=rt,t=r.document.uri.replace("file://","");e||_e.sendDiagnostics({uri:r.document.uri,version:Rn.get(r.document.uri)?.version,diagnostics:[{severity:Me.DiagnosticSeverity.Warning,range:Me.Range.create(Me.Position.create(0,0),Me.Position.create(0,0)),message:"File has no context",source:"devicetree"}]}),jv(t)});var UH=r=>{switch(r){case 0:return"Expected value";case 1:return"Expected ';'";case 2:return"Expected '{'";case 3:return"Expected '}'";case 4:return"Expected '['";case 5:return"Expected ']'";case 12:return"Expected '>'";case 13:return"Expected '<'";case 16:return`Expected '"'`;case 17:return`Expected "'"\\`;case 24:return"Missing ':'";case 21:return"Missing '/'";case 26:return'Expected ")"';case 28:return'Missing ","';case 6:return"Expected property name";case 7:return"Expected node name";case 8:return"Expected node address";case 9:return"Expected node path";case 10:return"Expected node reference";case 11:return"Expected root node name";case 14:return"Expected bytestring";case 15:return"Expected two digits for each byte in bytestring";case 20:return"Hex values are not allowed";case 18:return"Expected label name";case 19:return"Expected '/' at the start of a node path";case 23:return"Found ';' without a statement";case 25:return"Did you mean /delete-node/ or /delete-property/?";case 34:return"Did you mean /delete-node/?";case 35:return"Did you mean /delete-property/?";case 22:return"Unknown syntax";case 27:return"Expected expression";case 31:return"Expected macro identifier";case 30:return"Expected macro identifier or function like macro";case 29:return"White space is not allowed";case 32:return"Properties can only be defined in a node";case 33:return"Properties can only be deleted inside a node";case 36:return"Unable to resolve include";case 37:return"Expedted start address";case 38:return"Expected end address";case 39:case 40:return"Expected 8|16|32|64";case 42:return"Unkown macro name";case 43:return"Expected function like macro";case 44:return"Macro expects less arguments";case 45:return"Macro expects more arguments";case 46:return"Missing #ENDIF";case 47:return"Block Unused";case 41:return"This syntax is not officially part of the DTS V0.4 standard"}},VH=r=>r.issues.map(e=>{switch(e){case 0:return`Property "${r.templateStrings[0]}" is replaced by a later definition`;case 1:return"Cannot delete a property before it has been defined";case 2:return"Node name already defined";case 5:return"Cannot delete a node before it has been defined";case 3:return`No node with that reference "${r.templateStrings[0]}" has been defined`;case 8:return`No node with name "${r.templateStrings[0]}" could be found in "/${r.templateStrings[1]}".`;case 4:return`Label name "${r.templateStrings[0]}" already defined`;case 6:return`Property "${r.templateStrings[0]}" was deleted`;case 7:return`Node "${r.templateStrings[0]}" was deleted`;case 9:return`The following node "${r.templateStrings[1]}" shall be present in "${r.templateStrings[0]}" node.`}}).join(" or "),WH=r=>{switch(r){case 0:return"Property name already defined.";case 2:return"Defined here";case 4:return"Defined here";case 7:case 6:return"Deleted here";case 9:return"Node";default:return"TODO"}},HH=r=>r.issues.map(e=>{switch(e){case 9:return`Only these value are allowed ${r.templateStrings[0]}`;case 1:return"INTRO should be empty";case 8:return"INTRO can only be assigned one value";case 5:return"INTRO should be assigned a U32";case 6:return"INTRO should be assigned a U64";case 7:return"INTRO should be assigned a 'property encoded array'";case 2:return"INTRO should be assigned a string";case 3:return"INTRO should be assigned a string list";case 4:return`INTRO expects ${r.templateStrings[1]} values`;case 0:return"INTRO is required";case 11:return"INTRO should be omitted";case 28:return"INTRO name is not permited under this node";case 10:return"INTRO first value must match node address";case 12:return"INTRO should be 'cpu'";case 13:return"INTRO should be 'memory'";case 14:return"INTRO is deprecated and should not be used'";case 15:return`INTRO ${r.templateStrings[1]}'`;case 19:return"INTRO value must be unique in the entire Devicetree";case 20:return`INTRO should have format ${r.templateStrings[1]}`;case 16:return`INTRO requires property "${r.templateStrings[1]}" in node path "${r.templateStrings[2]}"`;case 18:return"Unable to resolve interrupt parent node";case 17:return`INTRO expects ${r.templateStrings[1]} interrupt cells`;case 21:return`INTRO should have format ${r.templateStrings[1]}`;case 22:return"Node is disabled";case 23:return"Unable to resolve handle";case 24:return`Unable to find "${r.templateStrings[0]}" in ${r.templateStrings[1]}`;case 25:return r.templateStrings[0];case 26:return r.templateStrings[0];case 27:return r.templateStrings[0];case 29:return r.templateStrings[0]}}).join(" or ").replace("INTRO",`Property "${r.templateStrings[0]}"`).replaceAll("INTRO ",""),KH=r=>{switch(r){case 16:case 0:return"Node";case 17:return"Property";case 15:return"Ignored reason";case 19:return"Conflicting properties";case 8:return"Additional value";case 22:return"Disabled by";default:return"TODO"}},jv=async r=>{await aA;let e=Ek(Ve,r);if(e.length)e.forEach(t=>{Qc.get(t.context)?.abort.abort();let n=new AbortController,s=new Promise(i=>{setTimeout(async()=>{if(n.signal.aborted){i();return}let o=performance.now(),a=lA(t.context);ZO(t.context),await t.context.reevaluate(r),QO(t.context),Fv(t.context).then(c=>{ph(t.context,a),c.items.map(l=>({uri:l.uri,version:l.version??void 0,diagnostics:l.items})).forEach(l=>{_e.sendDiagnostics(l)})}),i(),console.log("reevaluate",performance.now()-o)},50)});Qc.set(t.context,{abort:n,promise:s})});else{if(te.allowAdhocContexts===!1)return;let t=te.defaultBindingType,n=cA(),s=new fo(r,n.defaultIncludePaths,t?lh({zephyrBindings:n.defaultZephyrBindings,deviceOrgBindingsMetaSchema:n.defaultDeviceOrgBindingsMetaSchema,deviceOrgTreeBindings:n.defaultDeviceOrgTreeBindings},t):void 0);console.log(`New ad hoc context with ID ${s.name} for ${r}`),$v(s),Zc(r),await s.parser.stable,rA(s)}};Rn.onDidChangeContent(async r=>{let e=r.document.uri.replace("file://",""),t=r.document.getText(),n=Yr();n.needsRenew(e,t)&&(console.log("Content changed"),n.renewLexer(e,t),jv(e))});var lA=r=>r.getContextFiles().map(e=>({uri:`file://${e}`,version:Rn.get(`file://${e}`)?.version,diagnostics:[]})),ph=async(r,e=lA(r))=>await Promise.all(e.map(t=>_e.sendDiagnostics({uri:t.uri,version:Rn.get(t.uri)?.version,diagnostics:[]}))),Fv=async r=>{await r.stable();let e=performance.now(),t=await Promise.all(r.getContextFiles().map(async n=>{let s=await zH(r,n);return{uri:`file://${n}`,kind:Me.DocumentDiagnosticReportKind.Full,items:s,version:Rn.get(`file://${n}`)?.version??null}}));return console.log("workspace diagnostics",r.name,performance.now()-e),{items:[...t]}};_e.languages.diagnostics.onWorkspace(async()=>{await Ot();let r=rt;return r?Fv(r):{items:[]}});async function zH(r,e){try{let t=[];return r.isInContext(e)?(r.parser.issues.filter(i=>i.astElement.uri===e).forEach(i=>{let o={severity:i.severity,range:Q(i.astElement),message:i.issues?i.issues.map(UH).join(" or "):"",source:"devicetree",tags:i.tags,data:{firstToken:{pos:i.astElement.firstToken.pos,tokens:i.astElement.firstToken.tokens,value:i.astElement.firstToken.value},lastToken:{pos:i.astElement.lastToken.pos,tokens:i.astElement.lastToken.tokens,value:i.astElement.lastToken.value},issues:{type:"SyntaxIssue",items:i.issues,edit:i.edit,codeActionTitle:i.codeActionTitle}}};t.push(o)}),(await r.getContextIssues()??[]).filter(i=>i.astElement.uri===e).forEach(i=>{let o={severity:i.severity,range:Q(i.astElement),message:VH(i),source:"devicetree",tags:i.tags,relatedInformation:[...i.linkedTo.map(a=>({message:i.issues.map(WH).join(" or "),location:{uri:`file://${a.uri}`,range:Q(a)}}))]};t.push(o)}),(await r.getRuntime())?.typesIssues.filter(i=>i.astElement.uri===e).forEach(i=>{let o={severity:i.severity,range:Q(i.astElement),message:HH(i),relatedInformation:[...i.linkedTo.map(a=>({message:i.issues.map(KH).join(" or "),location:{uri:`file://${a.uri}`,range:Q(a)}}))],source:"devicetree",tags:i.tags,data:{firstToken:{pos:i.astElement.firstToken.pos,tokens:i.astElement.firstToken.tokens,value:i.astElement.firstToken.value},lastToken:{pos:i.astElement.lastToken.pos,tokens:i.astElement.lastToken.tokens,value:i.astElement.lastToken.value},issues:{type:"StandardTypeIssue",items:i.issues,edit:i.edit,codeActionTitle:i.codeActionTitle}}};t.push(o)}),t):[{severity:Me.DiagnosticSeverity.Warning,range:Me.Range.create(Me.Position.create(0,0),Me.Position.create(0,0)),message:"File not in use by the active context",source:"devicetree"}]}catch(t){throw console.error(t),t}}_e.onDidChangeWatchedFiles(r=>{_e.console.log("We received a file change event")});_e.onCompletion(async r=>(await Ot(),Ve?[...await Lw(r,Ve,rt,te.preferredContext),...await zw(r,Ve,rt,te.preferredContext)]:[]));_e.onCompletionResolve(r=>r);Rn.listen(_e);_e.listen();var Zc=async(r,e=!1)=>{if(!e&&te.autoChangeContext===!1||(Mv=r,await Ot(),rt?.getContextFiles().find(s=>s===r)))return;let t=rt;rt=Js(Ve,r,void 0,te.preferredContext)?.context;let n=rt;t!==n&&(t&&await ph(t),n&&Fv(n).then(s=>{s.items.map(i=>({uri:i.uri,version:i.version??void 0,diagnostics:i.items})).forEach(i=>{_e.sendDiagnostics(i)})}),console.log(`(ID: ${n?.name??-1}) activeContext:`,n?.parser.uri),Ve.forEach((s,i)=>{console.log(`Context with ID ${s.name} for ${s.parser.uri}`)}))};_e.onDocumentSymbol(async r=>{await Ot();let e=r.textDocument.uri.replace("file://","");await Zc(e);let n=await rt?.parser;return n?n.getDocumentSymbols(e):[]});_e.onWorkspaceSymbol(async()=>{await Ot();let r=rt;return r?(await r.getAllParsers()).flatMap(e=>e.getWorkspaceSymbols()):[]});_e.languages.semanticTokens.on(async r=>{try{await Ot();let e=r.textDocument.uri.replace("file://","");await Zc(e);let t=new Me.SemanticTokensBuilder,n=await Js(Ve,e,rt,te.preferredContext),s=n?.context.isInContext(e);return!n||!s?{data:[]}:(n.context.parser.buildSemanticTokens(t,e),t.build())}catch(e){throw console.log(e),e}});_e.onDocumentLinks(async r=>{let e=r.textDocument.uri.replace("file://","");return await Ot(),(await Js(Ve,e,rt,te.preferredContext))?.context.getDocumentLinks(e)});_e.onPrepareRename(async r=>(await Ot(),Vw(r,Ve,te.lockRenameEdits??[],rt,te.preferredContext)));_e.onRenameRequest(async r=>(await Ot(),Uw(r,Ve,rt,te.preferredContext)));_e.onReferences(async r=>(await Ot(),qw(r,Ve,rt,te.preferredContext)));_e.onDefinition(async r=>{let e=r.textDocument.uri.replace("file://","");await Ot();let n=(await(await Js(Ve,e,rt,te.preferredContext))?.context.getDocumentLinks(e,r.position))?.filter(s=>s.target).map(s=>Me.Location.create(s.target,s.range))??[];return n.length?n:Ww(r,Ve,rt,te.preferredContext)});_e.onDeclaration(async r=>(await Ot(),Hw(r,Ve,rt,te.preferredContext)));_e.onCodeAction(async r=>Kw(r));_e.onDocumentFormatting(async r=>{let e=r.textDocument.uri.replace("file://","");await Ot();let t=await Js(Ve,e,rt,te.preferredContext);return t?$k(r,t.context):[]});_e.onHover(async r=>(await Ot(),(await Yw(r,Ve,rt,te.preferredContext)).at(0)));_e.onRequest("devicetree/contexts",async()=>(await Ot(),Ve.map(r=>r.parser.uri)));_e.onFoldingRanges(async r=>{await Ot();let e=r.textDocument.uri.replace("file://","");await Zc(e);let t=rt,n=t?.isInContext(e);if(!t||!n)return[];let s=(await t.getAllParsers()).find(i=>i.includes.some(o=>o.uri===e)||i.uri===e);return s?JO(e,s):[]});_e.onTypeDefinition(async r=>(await Ot(),XO(r,Ve,rt)));
|
|
274
|
+
${n}`])]},AH=(r,e)=>LO(r,e.split("/").filter(t=>t)),LO=(r,e)=>{if(e.length===0)return{node:r,remainingInstancePath:""};let t=e[0].split("@"),n=t[0],s=t.at(1)?.split(",").map(o=>Number.parseInt(o,16)),i=r.getNode(n,s);return i?LO(i,e.slice(1)):{node:r,property:r.getProperty(e[0]),remainingInstancePath:e.slice(1).join("/")}};var Dv=class r{constructor(){this.schemaIdValidators=new Map;this.ajvMap=new Map}static getNodeCompatible(e){let n=e.getProperty("compatible")?.ast.values;if(!n?.values.some(s=>!(s?.value instanceof De)))return n?.values.map(s=>(s?.value).value)}parseMetaSchema(e,t){ui.sync("**/*.yaml",{cwd:e}).forEach(s=>{s=(0,Rv.resolve)(e,s);try{let i=Pv.default.parse((0,Cv.readFileSync)(s,"utf-8"));t.addMetaSchema(i),this.schemaIdValidators.set(i.$id,s)}catch{}})}parseBindings(e,t){ui.sync("**/*.yaml",{cwd:e}).forEach(s=>{s=(0,Rv.resolve)(e,s);try{let i=Pv.default.parse((0,Cv.readFileSync)(s,"utf-8"));t.addSchema(i),this.schemaIdValidators.set(i.$id,s)}catch(i){console.warn(s,i.message)}})}getNodeTypes(e,t,n){let s=`${e.join(";")}::${t.join(";")}`,i=this.ajvMap.get(s);return i||(i=new jO.default({strict:!1,strictSchema:!1,strictNumbers:!1}),i.addMetaSchema(Nv),this.ajvMap.set(s,i),e.forEach(c=>this.parseMetaSchema(c,i)),t.forEach(c=>this.parseBindings(c,i))),r.getNodeCompatible(n)?.map(c=>{try{let l=Array.from(this.schemaIdValidators.keys()).find(f=>f.endsWith(`/${c}.yaml#`));if(!l)return;let u=new ah(i,l);u.bindingsPath=this.schemaIdValidators.get(l),u.compatible=c;let d=i.getSchema(l);return u.description=(d?.schema).description,u.examples=(d?.schema).examples,u.maintainers=(d?.schema).maintainers,u}catch(l){console.warn(l.message)}}).filter(c=>c)??[]}},qO,FO=()=>(qO??=new Dv,qO);var WO=z(cy());var Jo=require("path"),HO=require("fs");var Nn=z(J()),IH=r=>{switch(r){case"string":return V(3);case"int":return V(1);case"boolean":return V(0);case"array":return V(4);case"uint8-array":return V(6);case"string-array":return V(5);case"phandle":return V(1);case"phandles":return V(4);case"phandle-array":return V(4);case"path":return V([3,1]);case"compound":return V(8)}},BO=(r,e)=>{switch(r){case"string":return typeof e=="string"?e:void 0;case"int":return typeof e=="number"?e:void 0;case"boolean":return;case"array":return Array.isArray(e)&&e.every(t=>typeof t=="number")?e:void 0;case"uint8-array":return Array.isArray(e)&&e.every(t=>typeof t=="number")?e:void 0;case"string-array":return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:void 0;case"phandle":return;case"phandles":return;case"phandle-array":return;case"path":return;case"compound":return}},ch=(r,e)=>{if(e=e.include.reduce((t,n)=>{let s=r.find(i=>(0,Jo.basename)(i.filePath)===n.name);if(s){let i=n["property-blocklist"];return t.include=t.include.filter(o=>o!==n),MH(r,s,t,i)??t}return console.warn(`Unable to find ${n}`),t},e),e["child-binding"]&&(e["child-binding"].include=KO(e["child-binding"].include),e["child-binding"]=ch(r,e["child-binding"])),!e.include.length)return e},MH=(r,e,t,n=[])=>{let s=ch(r,e),i=ch(r,t);if(!s||!i)return;let o=new Set;Object.keys(s?.properties??{}).forEach(d=>o.add(d)),Object.keys(i?.properties??{}).forEach(d=>o.add(d));let a={};Array.from(o).forEach(d=>{let f=n?.some(v=>v===d)?{}:s.properties?.[d]??{},p=i.properties?.[d]??{};a={...a,[d]:{...f,...p}}}),i.properties=a;let c=new Set;return Object.keys(s).filter(d=>d.endsWith("-cells")).forEach(d=>c.add(d)),Object.keys(s).filter(d=>d.endsWith("-cells")).forEach(d=>c.add(d)),Array.from(c).forEach(d=>{let f=s[d]??[],p=i[d]??[];i[d]=Array.from([...f,...p])}),i},KO=r=>r?typeof r=="string"?[{name:r}]:r.map(e=>typeof e!="string"?e:{name:e}):[],Ov=class r{constructor(){this.typeCache=new Map;this.readFolders=[]}static getNodeCompatible(e){let n=e.getProperty("compatible")?.ast.values;if(!n?.values.some(s=>!(s?.value instanceof De)))return n?.values.map(s=>(s?.value).value)}getNodeTypes(e,t){let n=r.getNodeCompatible(t);if(!n)return[Zs(t)];let s=n.map(o=>this.typeCache.get(o)?.(t)).filter(o=>o);if(s.length)return s;this.loadTypeAndCache(e);let i=n.map(o=>this.typeCache.get(o)?.(t)).filter(o=>o);return i.length?i:[Zs(t)]}loadTypeAndCache(e){e=Array.isArray(e)?e:[e],e.forEach(t=>{if(this.readFolders.indexOf(t)!==-1)return;this.readFolders.push(t);let s=ui.sync("**/*.yaml",{cwd:t,ignore:"test/*"}).map(o=>{o=(0,Jo.resolve)(t,o);try{let a=WO.default.parse((0,HO.readFileSync)(o,"utf-8"));return{...a,include:KO(a.include),filePath:o}}catch(a){console.warn(a)}}).filter(o=>!!o),i=s.map(o=>ch(s,o)).filter(o=>!!o&&!o.include.length);$H(i,this.typeCache)})}},UO,zO=()=>(UO??=new Ov,UO),$H=(r,e)=>r.forEach(t=>{let n=t.compatible??(t.filePath?(0,Jo.basename)(t.filePath,"yaml"):void 0);n&&e.set(n,s=>GO(t,s))}),GO=(r,e)=>{let t=Zs(e);t.compatible=r.compatible??(r.filePath?(0,Jo.basename)(r.filePath,"yaml"):void 0),t.description=r.description,t.bindingsPath=r.filePath,t.bus=typeof r.bus=="string"?[r.bus]:r.bus,t.onBus=r["on-bus"];let s=Object.keys(r).filter(i=>i.endsWith("-cells")).map(i=>({specifier:i.replace(/-cells$/,""),values:r[i]}));if(r.properties&&Object.keys(r.properties).forEach(i=>{let o=r.properties[i];xH(t,i,o),t.cellsValues=s}),r["child-binding"]){let i=r["child-binding"];t.childNodeType=o=>GO(i,o)}return t},xH=(r,e,t)=>{let n=r.properties.find(s=>typeof s.name=="string"&&s.getNameMatch(e));if(n){n.required=()=>t.required?"required":"optional",n.values=()=>t.enum??[],n.constValue=BO(t.type,t.const);let s=n.additionalTypeCheck;n.additionalTypeCheck=i=>[...VO(t,e)(i),...s?.(i)??[]]}else{let s=new H(e,IH(t.type),t.required?"required":"optional",void 0,t.enum,VO(t,e));s.description=t.description?[t.description]:void 0,s.constValue=BO(t.type,t.const),r.addProperty(s)}},VO=(r,e)=>{let t=r;return n=>{let s=n.parent.root,i=[];if(t.const){let o=n.ast.quickValues;if(o?.length==1){let a=Array.isArray(t.const)?t.const:[t.const];Array.isArray(o[0])&&a.length===o[0].length&&o[0].every((l,u)=>typeof l=="number"&&Number.isNaN(l)||a[u]===l)||i.push(C(25,n.ast.values??n.ast,Nn.DiagnosticSeverity.Error,[],[],[`Binding expects values to be "${t.type}" with value: ${t.const}`]))}}if(t.deprecated&&i.push(C(14,n.ast,Nn.DiagnosticSeverity.Warning,[],[Nn.DiagnosticTag.Deprecated],[n.name])),(t.type==="phandle"||t.type==="phandles"||t.type==="path")&&Qt(n.ast.values)?.forEach(a=>{zr(a,s)||i.push(C(23,a,Nn.DiagnosticSeverity.Error))}),t.type==="path"&&n.ast.values?.values.at(0)?.value instanceof De){let o=n.ast.values?.values.at(0)?.value,a=[];o.value.split("/").every(c=>{let l=s.getNode(c);return l?a.push(c):i.push(C(24,o,Nn.DiagnosticSeverity.Error,[],[],[c,`/${a.join("/")}`])),!l})}if(t.type==="phandle-array"){let o=Qt(n.ast.values),a=0;for(;o&&a<o.length;){let c=o.at(a),l=zr(c,s);if(!l){i.push(C(23,c??n.ast,Nn.DiagnosticSeverity.Error));break}let u="";e.endsWith("-gpios")?u="gpio":u=t["specifier-space"]??e.slice(0,-1);let d=l.getProperty(`#${u}-cells`);if(!d){i.push(C(16,n.ast,Nn.DiagnosticSeverity.Error,[...l.nodeNameOrLabelRef],[],[n.name,`#${u}-cells`,`/${l.path.slice(1).join("/")}`]));break}let f=d?Re(d,0,0)??0:0;if(1+f>o.length-a){let p=l.nodeType?.cellsValues?.find(v=>v.specifier===u)?.values;i.push(C(20,c??n.ast,Nn.DiagnosticSeverity.Error,[],[],[n.name,`<${["phandel",...p??[],...Array.from({length:f-(p?.length??0)},()=>"cell")].join(" ")}>`]));break}a+=1+f}}return i}};var lh=(r,e)=>({getNodeTypes:async t=>{switch(e){case"Zephyr":return zO().getNodeTypes(r.zephyrBindings,t);case"DevicetreeOrg":return FO().getNodeTypes(r.deviceOrgBindingsMetaSchema,r.deviceOrgTreeBindings,t)}}});var Iv=z(J());var Av=r=>!r.openScope||!r.closeScope?.prevToken?r.nodes.flatMap(Av):[{startLine:r.openScope.pos.line,startCharacter:r.openScope.pos.col,endLine:r.closeScope.prevToken.pos.line,endCharacter:r.closeScope.prevToken.pos.col,kind:Iv.FoldingRangeKind.Region},...r.nodes.flatMap(Av)],YO=r=>{let e=[];return[...r instanceof ps?r.ifBlocks.map(t=>({start:(t.expression??t.keyword).lastToken,end:t.content?.lastToken??(t.expression??t.keyword).lastToken})):[{start:(r.ifDef.identifier??r.ifDef.keyword).lastToken,end:r.ifDef.content?.lastToken}],r.elseOption?{start:r.elseOption.keyword.lastToken,end:r.elseOption.content?.lastToken}:null].forEach(t=>{!t||!t.end||e.push({startLine:t.start.pos.line,startCharacter:t.start.pos.col,endLine:t.end.pos.line,endCharacter:t.end.pos.col+t.end.pos.len,kind:Iv.FoldingRangeKind.Region})}),e},LH=r=>r instanceof Le?Av(r):r instanceof ao||r instanceof ps?YO(r):[];function JO(r,e){return e.allAstItems.filter(t=>t.uri===r).flatMap(LH)}var Ei=z(J());function qH(r){if(!r||!(r.ast instanceof qe)&&!(r.ast instanceof Mt))return[];let e=t=>t.nodeType?.bindingsPath?[Ei.Location.create(`file://${t.nodeType.bindingsPath}`,Ei.Range.create(Ei.Position.create(0,0),Ei.Position.create(0,0)))]:[];return r.item instanceof ke&&!_t(r.ast)?e(r.item):r.ast instanceof Mt&&r.ast.parentNode instanceof ve&&r.ast.parentNode.linksTo?e(r.ast.parentNode.linksTo):r.ast instanceof qe&&r.ast.linksTo?e(r.ast.linksTo):[]}async function XO(r,e,t,n){return It(r,e,s=>[...qH(s)],t,n)}var Pn=require("path");var dh=require("fs");var jH=(r,e)=>{Yr().reset(r),Yr().requestTokens(r,!0),e(r)},uh=class{constructor(e,t,n){this.file=e;this.cb=t;this.hasDocumentOpen=n;this.count=0}watch(){if(this.count++,this.count===1){console.log("create watch for",this.file);let e=this.file,t=this.cb;this.onChange=()=>{if(this.hasDocumentOpen(e)){console.log("skipping on change document is open",e);return}console.log("onChange",e),jH(e,t)},(0,dh.watchFile)(e,this.onChange)}}unwatch(){this.count--,this.count===0&&(console.log("dispose watch for",this.file),(0,dh.unwatchFile)(this.file,this.onChange),this.onChange=void 0)}};var Ve=[],rt,Mv,Qc=new WeakMap,fh=new Map,$v=r=>{Ve.some(e=>e===r)||(Ve.push(r),QO(r))},QO=async r=>{await r.stable(),r.getContextFiles().forEach(e=>{fh.has(e)||fh.set(e,new uh(e,jv,t=>!!Rn.get(`file://${t}`))),fh.get(e)?.watch()})},Lv=async r=>{let e=Ve.indexOf(r);e!==-1&&(ph(r),Qc.delete(r),console.log(`cleaning up context with ID ${r.name} and uri ${r.parser.uri}`),Ve.splice(e,1),ZO(r))},ZO=async r=>{await r.stable(),r.getContextFiles().forEach(e=>fh.get(e)?.unwatch())},FH=r=>{let e=Qc.get(r);if(!e?.abort.signal.aborted)return Promise.all([e?.promise,r.getRuntime()])},Ot=async()=>{await aA,await Promise.all(Ve.map(FH))},hh=r=>{let e=eA(r);return Ve.filter(t=>!e.some(n=>n===t))},eA=r=>Ve.filter(e=>{let t=r.contexts?.find(n=>n.dtsFile===e.parser.uri);return!!t&&t.overlays?.every(n=>e.overlays.some(s=>s===n))}),BH=async(r,e)=>{if(r===e)return!0;let t=(await r.getAllParsers()).flatMap(s=>s.cPreprocessorParser.dtsIncludes),n=(await e.getAllParsers()).flatMap(s=>s.cPreprocessorParser.dtsIncludes);return t.length?t.every(s=>n.some(i=>i.resolvedPath===s.resolvedPath&&i.firstToken.pos.col===s.firstToken.pos.col&&i.firstToken.pos.len===s.firstToken.pos.len&&i.firstToken.pos.line===s.firstToken.pos.line&&i.lastToken.pos.col===s.lastToken.pos.col&&i.lastToken.pos.len===s.lastToken.pos.len&&i.lastToken.pos.line===s.lastToken.pos.line)):e.getContextFiles().some(s=>s===r.parser.uri)},tA=r=>hh(te).indexOf(r)!==-1,rA=async r=>{if(!tA(r))return;let e=hh(te),t=await eA(te),n=await xu(e),s=[...r.overlayParsers.map(a=>a.uri),r.parser.uri,...r.parser.includes.map(a=>a.resolvedPath)];if(Ve.indexOf(r)===-1)return;let i=await Promise.all(n.flatMap(a=>[...t,...e.filter(c=>c!==a.context)].map(async c=>({context:a.context,same:await BH(a.context,c)})))),o=n.filter(a=>i.some(c=>c.context===a.context&&c.same)||a.context!==r&&a.context.parser.uri===r.parser.uri&&s.some(c=>c&&a.files.indexOf(c)!==-1)).map(a=>a.context);o.length&&o.forEach(Lv)},_e=(0,Me.createConnection)(Me.ProposedFeatures.all),Rn=new Me.TextDocuments(Iu),qv=!0,xv=!1,nA=!1;_e.onInitialize(r=>{let e=r.capabilities;qv=!!(e.workspace&&e.workspace.configuration),xv=!!(e.workspace&&e.workspace.workspaceFolders),nA=!!e.workspace?.diagnostics?.refreshSupport;let t={capabilities:{typeDefinitionProvider:!0,workspaceSymbolProvider:!0,textDocumentSync:Me.TextDocumentSyncKind.Incremental,renameProvider:{prepareProvider:!0},completionProvider:{resolveProvider:!0,triggerCharacters:["&","="," "]},codeActionProvider:{codeActionKinds:[Me.CodeActionKind.QuickFix,Me.CodeActionKind.SourceFixAll]},documentSymbolProvider:!0,semanticTokensProvider:{legend:{tokenTypes:Mu,tokenModifiers:$u},full:!0},documentLinkProvider:{resolveProvider:!1},foldingRangeProvider:!0,definitionProvider:!0,declarationProvider:!0,referencesProvider:!0,documentFormattingProvider:!0,hoverProvider:!0}};return xv&&(t.capabilities.workspace={workspaceFolders:{supported:!0}}),t});_e.onInitialized(()=>{qv&&_e.client.register(Me.DidChangeConfigurationNotification.type,{}),xv&&_e.workspace.onDidChangeWorkspaceFolders(r=>{_e.console.log("Workspace folder change event received")})});var sA={defaultBindingType:"Zephyr",defaultZephyrBindings:[],defaultIncludePaths:[],defaultDeviceOrgBindingsMetaSchema:[],defaultDeviceOrgTreeBindings:[],contexts:[],lockRenameEdits:[],allowAdhocContexts:!0,autoChangeContext:!0},te=sA,iA=new Map,oA=!1,aA=new Promise(r=>{let e=setInterval(()=>{oA&&(r(),clearInterval(e))},100)});_e.onDidChangeConfiguration(r=>{if(oA=!0,!r.settings)return;console.log("Configuration changed",r),qv&&iA.clear();let e=te;te={...sA,...r.settings?.devicetree},te.contexts?.forEach((s,i)=>{if(s.cwd||te.cwd){let o=s.cwd??te.cwd;s.includePaths??=te.defaultIncludePaths,s.zephyrBindings??=te.defaultIncludePaths,s.bindingType??=te.defaultBindingType,s.deviceOrgTreeBindings??=te.defaultDeviceOrgTreeBindings,s.deviceOrgBindingsMetaSchema??=te.defaultDeviceOrgBindingsMetaSchema,o&&s.bindingType==="Zephyr"&&(!s.zephyrBindings||s.zephyrBindings.length===0)&&(s.zephyrBindings=["./zephyr/dts/bindings"]),s.zephyrBindings=s.zephyrBindings?.map(a=>(0,Pn.resolve)(o,a)),s.deviceOrgTreeBindings=s.deviceOrgTreeBindings?.map(a=>(0,Pn.resolve)(o,a)),s.deviceOrgBindingsMetaSchema=s.deviceOrgBindingsMetaSchema?.map(a=>(0,Pn.resolve)(o,a)),s.includePaths=s.includePaths?.map(a=>(0,Pn.resolve)(o,a)),s.dtsFile=(0,Pn.resolve)(o,s.dtsFile)}});let t=hh(e);Ve.forEach(Lv),Qc=new WeakMap,te.contexts?.forEach((s,i)=>{let o=s.bindingType,a=new fo(s.dtsFile,s.includePaths??[],o?lh({zephyrBindings:s.zephyrBindings??[],deviceOrgBindingsMetaSchema:s.deviceOrgBindingsMetaSchema??[],deviceOrgTreeBindings:s.deviceOrgTreeBindings??[]},o):void 0,s.overlays,s.ctxName);$v(a),console.log(`New context with ID ${a.name} for ${s.dtsFile}`)});let n=cA();t.map(s=>{let i=te.defaultBindingType,o=new fo(s.parser.uri,n.defaultIncludePaths,i?lh({zephyrBindings:n.defaultZephyrBindings,deviceOrgBindingsMetaSchema:n.defaultDeviceOrgBindingsMetaSchema,deviceOrgTreeBindings:n.defaultDeviceOrgTreeBindings},i):void 0);return console.log(`New context with ID ${o.name} for ${s.parser.uri}`),o}).forEach($v),t=hh(te),t.forEach(rA),Mv&&Zc(Mv,!0),nA&&_e.languages.diagnostics.refresh()});var cA=()=>{let r=(te.defaultIncludePaths??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s);te.cwd&&te.defaultBindingType==="Zephyr"&&!te.defaultZephyrBindings&&(te.defaultZephyrBindings=["./zephyr/dts/bindings"]);let e=(te.defaultZephyrBindings??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s),t=(te.defaultDeviceOrgBindingsMetaSchema??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s),n=(te.defaultDeviceOrgTreeBindings??[]).map(s=>te.cwd?(0,Pn.resolve)(te.cwd,s):s);return{defaultIncludePaths:r,defaultZephyrBindings:e,defaultDeviceOrgBindingsMetaSchema:t,defaultDeviceOrgTreeBindings:n}};Rn.onDidClose(r=>{let e=r.document.uri.replace("file://",""),t=rt;if(!t)return;(t?.getContextFiles()??[]).filter(i=>i!==e).some(i=>Rn.get(`file://${i}`))||(tA(t)?Lv(t):ph(t),rt=void 0),iA.delete(r.document.uri)});Rn.onDidOpen(async r=>{await Ot();let e=rt,t=r.document.uri.replace("file://","");e||_e.sendDiagnostics({uri:r.document.uri,version:Rn.get(r.document.uri)?.version,diagnostics:[{severity:Me.DiagnosticSeverity.Warning,range:Me.Range.create(Me.Position.create(0,0),Me.Position.create(0,0)),message:"File has no context",source:"devicetree"}]}),jv(t)});var UH=r=>{switch(r){case 0:return"Expected value";case 1:return"Expected ';'";case 2:return"Expected '{'";case 3:return"Expected '}'";case 4:return"Expected '['";case 5:return"Expected ']'";case 12:return"Expected '>'";case 13:return"Expected '<'";case 16:return`Expected '"'`;case 17:return`Expected "'"\\`;case 24:return"Missing ':'";case 21:return"Missing '/'";case 26:return'Expected ")"';case 28:return'Missing ","';case 6:return"Expected property name";case 7:return"Expected node name";case 8:return"Expected node address";case 9:return"Expected node path";case 10:return"Expected node reference";case 11:return"Expected root node name";case 14:return"Expected bytestring";case 15:return"Expected two digits for each byte in bytestring";case 20:return"Hex values are not allowed";case 18:return"Expected label name";case 19:return"Expected '/' at the start of a node path";case 23:return"Found ';' without a statement";case 25:return"Did you mean /delete-node/ or /delete-property/?";case 34:return"Did you mean /delete-node/?";case 35:return"Did you mean /delete-property/?";case 22:return"Unknown syntax";case 27:return"Expected expression";case 31:return"Expected macro identifier";case 30:return"Expected macro identifier or function like macro";case 29:return"White space is not allowed";case 32:return"Properties can only be defined in a node";case 33:return"Properties can only be deleted inside a node";case 36:return"Unable to resolve include";case 37:return"Expedted start address";case 38:return"Expected end address";case 39:case 40:return"Expected 8|16|32|64";case 42:return"Unkown macro name";case 43:return"Expected function like macro";case 44:return"Macro expects less arguments";case 45:return"Macro expects more arguments";case 46:return"Missing #ENDIF";case 47:return"Block Unused";case 41:return"This syntax is not officially part of the DTS V0.4 standard"}},VH=r=>r.issues.map(e=>{switch(e){case 0:return`Property "${r.templateStrings[0]}" is replaced by a later definition`;case 1:return"Cannot delete a property before it has been defined";case 2:return"Node name already defined";case 5:return"Cannot delete a node before it has been defined";case 3:return`No node with that reference "${r.templateStrings[0]}" has been defined`;case 8:return`No node with name "${r.templateStrings[0]}" could be found in "/${r.templateStrings[1]}".`;case 4:return`Label name "${r.templateStrings[0]}" already defined`;case 6:return`Property "${r.templateStrings[0]}" was deleted`;case 7:return`Node "${r.templateStrings[0]}" was deleted`;case 9:return`The following node "${r.templateStrings[1]}" shall be present in "${r.templateStrings[0]}" node.`}}).join(" or "),WH=r=>{switch(r){case 0:return"Property name already defined.";case 2:return"Defined here";case 4:return"Defined here";case 7:case 6:return"Deleted here";case 9:return"Node";default:return"TODO"}},HH=r=>r.issues.map(e=>{switch(e){case 9:return`Only these value are allowed ${r.templateStrings[0]}`;case 1:return"INTRO should be empty";case 8:return"INTRO can only be assigned one value";case 5:return"INTRO should be assigned a U32";case 6:return"INTRO should be assigned a U64";case 7:return"INTRO should be assigned a 'property encoded array'";case 2:return"INTRO should be assigned a string";case 3:return"INTRO should be assigned a string list";case 4:return`INTRO expects ${r.templateStrings[1]} values`;case 0:return"INTRO is required";case 11:return"INTRO should be omitted";case 28:return"INTRO name is not permited under this node";case 10:return"INTRO first value must match node address";case 12:return"INTRO should be 'cpu'";case 13:return"INTRO should be 'memory'";case 14:return"INTRO is deprecated and should not be used'";case 15:return`INTRO ${r.templateStrings[1]}'`;case 19:return"INTRO value must be unique in the entire Devicetree";case 20:return`INTRO should have format ${r.templateStrings[1]}`;case 16:return`INTRO requires property "${r.templateStrings[1]}" in node path "${r.templateStrings[2]}"`;case 18:return"Unable to resolve interrupt parent node";case 17:return`INTRO expects ${r.templateStrings[1]} interrupt cells`;case 21:return`INTRO should have format ${r.templateStrings[1]}`;case 22:return"Node is disabled";case 23:return"Unable to resolve handle";case 24:return`Unable to find "${r.templateStrings[0]}" in ${r.templateStrings[1]}`;case 25:return r.templateStrings[0];case 26:return r.templateStrings[0];case 27:return r.templateStrings[0];case 29:return r.templateStrings[0]}}).join(" or ").replace("INTRO",`Property "${r.templateStrings[0]}"`).replaceAll("INTRO ",""),KH=r=>{switch(r){case 16:case 0:return"Node";case 17:return"Property";case 15:return"Ignored reason";case 19:return"Conflicting properties";case 8:return"Additional value";case 22:return"Disabled by";default:return"TODO"}},jv=async r=>{await aA;let e=Ek(Ve,r);if(e.length)e.forEach(t=>{Qc.get(t.context)?.abort.abort();let n=new AbortController,s=new Promise(i=>{setTimeout(async()=>{if(n.signal.aborted){i();return}let o=performance.now(),a=lA(t.context);ZO(t.context),await t.context.reevaluate(r),QO(t.context),Fv(t.context).then(c=>{ph(t.context,a),c.items.map(l=>({uri:l.uri,version:l.version??void 0,diagnostics:l.items})).forEach(l=>{_e.sendDiagnostics(l)})}),i(),console.log("reevaluate",performance.now()-o)},50)});Qc.set(t.context,{abort:n,promise:s})});else{if(te.allowAdhocContexts===!1)return;let t=te.defaultBindingType,n=cA(),s=new fo(r,n.defaultIncludePaths,t?lh({zephyrBindings:n.defaultZephyrBindings,deviceOrgBindingsMetaSchema:n.defaultDeviceOrgBindingsMetaSchema,deviceOrgTreeBindings:n.defaultDeviceOrgTreeBindings},t):void 0);console.log(`New ad hoc context with ID ${s.name} for ${r}`),$v(s),Zc(r),await s.parser.stable,rA(s)}};Rn.onDidChangeContent(async r=>{let e=r.document.uri.replace("file://",""),t=r.document.getText(),n=Yr();n.needsRenew(e,t)&&(console.log("Content changed"),n.renewLexer(e,t),jv(e))});var lA=r=>r.getContextFiles().map(e=>({uri:`file://${e}`,version:Rn.get(`file://${e}`)?.version,diagnostics:[]})),ph=async(r,e=lA(r))=>await Promise.all(e.map(t=>_e.sendDiagnostics({uri:t.uri,version:Rn.get(t.uri)?.version,diagnostics:[]}))),Fv=async r=>{await r.stable();let e=performance.now(),t=await Promise.all(r.getContextFiles().map(async n=>{let s=await zH(r,n);return{uri:`file://${n}`,kind:Me.DocumentDiagnosticReportKind.Full,items:s,version:Rn.get(`file://${n}`)?.version??null}}));return console.log("workspace diagnostics",r.name,performance.now()-e),{items:[...t]}};_e.languages.diagnostics.onWorkspace(async()=>{await Ot();let r=rt;return r?Fv(r):{items:[]}});async function zH(r,e){try{let t=[];return r.isInContext(e)?(r.parser.issues.filter(i=>i.astElement.uri===e).forEach(i=>{let o={severity:i.severity,range:Q(i.astElement),message:i.issues?i.issues.map(UH).join(" or "):"",source:"devicetree",tags:i.tags,data:{firstToken:{pos:i.astElement.firstToken.pos,tokens:i.astElement.firstToken.tokens,value:i.astElement.firstToken.value},lastToken:{pos:i.astElement.lastToken.pos,tokens:i.astElement.lastToken.tokens,value:i.astElement.lastToken.value},issues:{type:"SyntaxIssue",items:i.issues,edit:i.edit,codeActionTitle:i.codeActionTitle}}};t.push(o)}),(await r.getContextIssues()??[]).filter(i=>i.astElement.uri===e).forEach(i=>{let o={severity:i.severity,range:Q(i.astElement),message:VH(i),source:"devicetree",tags:i.tags,relatedInformation:[...i.linkedTo.map(a=>({message:i.issues.map(WH).join(" or "),location:{uri:`file://${a.uri}`,range:Q(a)}}))]};t.push(o)}),(await r.getRuntime())?.typesIssues.filter(i=>i.astElement.uri===e).forEach(i=>{let o={severity:i.severity,range:Q(i.astElement),message:HH(i),relatedInformation:[...i.linkedTo.map(a=>({message:i.issues.map(KH).join(" or "),location:{uri:`file://${a.uri}`,range:Q(a)}}))],source:"devicetree",tags:i.tags,data:{firstToken:{pos:i.astElement.firstToken.pos,tokens:i.astElement.firstToken.tokens,value:i.astElement.firstToken.value},lastToken:{pos:i.astElement.lastToken.pos,tokens:i.astElement.lastToken.tokens,value:i.astElement.lastToken.value},issues:{type:"StandardTypeIssue",items:i.issues,edit:i.edit,codeActionTitle:i.codeActionTitle}}};t.push(o)}),t):[{severity:Me.DiagnosticSeverity.Warning,range:Me.Range.create(Me.Position.create(0,0),Me.Position.create(0,0)),message:"File not in use by the active context",source:"devicetree"}]}catch(t){throw console.error(t),t}}_e.onDidChangeWatchedFiles(r=>{_e.console.log("We received a file change event")});_e.onCompletion(async r=>(await Ot(),Ve?[...await Lw(r,Ve,rt,te.preferredContext),...await zw(r,Ve,rt,te.preferredContext)]:[]));_e.onCompletionResolve(r=>r);Rn.listen(_e);_e.listen();var Zc=async(r,e=!1)=>{if(!e&&te.autoChangeContext===!1||(Mv=r,await Ot(),rt?.getContextFiles().find(s=>s===r)))return;let t=rt;rt=Js(Ve,r,void 0,te.preferredContext)?.context;let n=rt;t!==n&&(t&&await ph(t),n&&Fv(n).then(s=>{s.items.map(i=>({uri:i.uri,version:i.version??void 0,diagnostics:i.items})).forEach(i=>{_e.sendDiagnostics(i)})}),console.log(`(ID: ${n?.name??-1}) activeContext:`,n?.parser.uri),Ve.forEach((s,i)=>{console.log(`Context with ID ${s.name} for ${s.parser.uri}`)}))};_e.onDocumentSymbol(async r=>{await Ot();let e=r.textDocument.uri.replace("file://","");await Zc(e);let n=await rt?.parser;return n?n.getDocumentSymbols(e):[]});_e.onWorkspaceSymbol(async()=>{await Ot();let r=rt;return r?(await r.getAllParsers()).flatMap(e=>e.getWorkspaceSymbols()):[]});_e.languages.semanticTokens.on(async r=>{try{await Ot();let e=r.textDocument.uri.replace("file://","");await Zc(e);let t=new Me.SemanticTokensBuilder,n=await Js(Ve,e,rt,te.preferredContext),s=n?.context.isInContext(e);return!n||!s?{data:[]}:(n.context.parser.buildSemanticTokens(t,e),t.build())}catch(e){throw console.log(e),e}});_e.onDocumentLinks(async r=>{let e=r.textDocument.uri.replace("file://","");return await Ot(),(await Js(Ve,e,rt,te.preferredContext))?.context.getDocumentLinks(e)});_e.onPrepareRename(async r=>(await Ot(),Vw(r,Ve,te.lockRenameEdits??[],rt,te.preferredContext)));_e.onRenameRequest(async r=>(await Ot(),Uw(r,Ve,rt,te.preferredContext)));_e.onReferences(async r=>(await Ot(),qw(r,Ve,rt,te.preferredContext)));_e.onDefinition(async r=>{let e=r.textDocument.uri.replace("file://","");await Ot();let n=(await(await Js(Ve,e,rt,te.preferredContext))?.context.getDocumentLinks(e,r.position))?.filter(s=>s.target).map(s=>Me.Location.create(s.target,s.range))??[];return n.length?n:Ww(r,Ve,rt,te.preferredContext)});_e.onDeclaration(async r=>(await Ot(),Hw(r,Ve,rt,te.preferredContext)));_e.onCodeAction(async r=>Kw(r));_e.onDocumentFormatting(async r=>{let e=r.textDocument.uri.replace("file://","");await Ot();let t=await Js(Ve,e,rt,te.preferredContext);return t?$k(r,t.context):[]});_e.onHover(async r=>(await Ot(),(await Yw(r,Ve,rt,te.preferredContext)).at(0)));_e.onRequest("devicetree/contexts",async()=>(await Ot(),Ve.map(r=>r.parser.uri)));_e.onFoldingRanges(async r=>{await Ot();let e=r.textDocument.uri.replace("file://","");await Zc(e);let t=rt,n=t?.isInContext(e);if(!t||!n)return[];let s=(await t.getAllParsers()).find(i=>i.getFiles().some(o=>o===e));return s?JO(e,s):[]});_e.onTypeDefinition(async r=>(await Ot(),XO(r,Ve,rt)));
|