Start · Sprachen · JavaScript · Referenz · GPUCompilationMessage.lineNum

GPUCompilationMessage.lineNum

Eigenschaft

Schreibgeschützte Zahl mit der (ab 1 gezählten) Zeilennummer im WGSL-Shader-Code, auf die sich eine Compiler-Meldung bezieht; <code>0</code>, wenn keine Zeile zugeordnet ist.

seit JavaScript WebGPU – Chrome/Edge 113+, Safari 26+, Firefox 141 Kategorie: webapi

Signatur

GPUCompilationMessage.lineNum

Beschreibung

Die schreibgeschützte Eigenschaft lineNum eines GPUCompilationMessage-Objekts gibt an, in welcher Zeile des an GPUDevice.createShaderModule() übergebenen WGSL-Quelltexts ein Fehler, eine Warnung oder ein Hinweis aufgetreten ist. Die Zählung beginnt bei 1 – die erste Zeile des Shaders hat also lineNum === 1.

Man erhält die Meldungen über GPUShaderModule.getCompilationInfo(), das ein Promise mit einem GPUCompilationInfo-Objekt liefert. Dessen Array messages enthält pro Diagnose ein GPUCompilationMessage. Zusammen mit linePos (Spalte), offset und length lässt sich die Fehlerstelle präzise im Quelltext markieren – etwa für eigene Fehlerausgaben, Shader-Editoren oder Live-Coding-Tools.

Bezieht sich eine Meldung auf keine konkrete Stelle im Quelltext, sind lineNum und linePos beide 0. Diesen Fall sollte man immer gesondert behandeln, bevor man per Index auf Quelltextzeilen zugreift.

Rückgabewert

Typ
number
Beschreibung
Nicht-negative Ganzzahl: ab 1 gezählte Zeilennummer im Shader-Quelltext bzw. 0, wenn die Meldung keiner Stelle zugeordnet ist.

Beispiele

Compiler-Fehler mit Zeilennummer ausgeben

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `@vertex
fn main() -> @builtin(position) vec4f {
  return vec4f(0.0, 0.0, 0.0) // fehlerhaft: nur 3 Komponenten
}`;

const module = device.createShaderModule({ code });
const info = await module.getCompilationInfo();

for (const msg of info.messages) {
  console.log(`${msg.type} in Zeile ${msg.lineNum}, Spalte ${msg.linePos}: ${msg.message}`);
}
error in Zeile 3, Spalte 10: no matching constructor for 'vec4f(abstract-float, abstract-float, abstract-float)' ... (genauer Wortlaut abhängig vom Browser)

Fehlerzeile mit Markierung anzeigen

const formatMessage = (source, msg) => {
  if (msg.lineNum === 0) {
    return `[${msg.type}] ${msg.message}`; // keine Position bekannt
  }
  const lines = source.split(/\r\n|\r|\n/);
  const line = lines[msg.lineNum - 1] ?? '';   // lineNum ist 1-basiert
  const caret = ' '.repeat(Math.max(0, msg.linePos - 1)) + '^'.repeat(Math.max(1, msg.length));
  return `[${msg.type}] Zeile ${msg.lineNum}: ${msg.message}\n${line}\n${caret}`;
};

const module = device.createShaderModule({ code: shaderSource });
const { messages } = await module.getCompilationInfo();
messages.forEach((m) => console.warn(formatMessage(shaderSource, m)));
[error] Zeile 3: unresolved identifier 'colr' return colr; ^^^^

Meldungen in Editor-Markierungen umwandeln

const toEditorMarkers = (messages) =>
  messages
    .filter((m) => m.lineNum > 0)
    .map((m) => ({
      severity: m.type,            // 'error' | 'warning' | 'info'
      startLine: m.lineNum,
      startColumn: m.linePos,
      endColumn: m.linePos + m.length,
      text: m.message,
    }));

const { messages } = await device
  .createShaderModule({ code: shaderSource })
  .getCompilationInfo();

console.table(toEditorMarkers(messages));
Tabelle mit severity, startLine, startColumn, endColumn, text je Meldung

// Wichtig · Fallstricke

  • 1-basiert: Für den Array-Zugriff auf gesplittete Zeilen immer lineNum - 1 verwenden.
  • Wert 0: Bedeutet „keine Position“ – nicht „erste Zeile“. Vor dem Zugriff prüfen.
  • Zeilenumbrüche: WGSL erkennt neben \n auch \r\n, \r und weitere Unicode-Umbrüche (z. B. U+2028). Ein naives split('\n') kann daher zu verschobenen Zeilen führen.
  • linePos, offset und length werden in UTF-16-Codeeinheiten gezählt – passend zu JavaScript-Strings.
  • Meldungstexte und die genaue Position sind implementierungsabhängig; nicht für Logik auf den Text der Meldung parsen.
  • WebGPU ist nur in sicheren Kontexten (HTTPS) verfügbar und noch nicht in allen Browsern/Plattformen aktiviert – vorher navigator.gpu prüfen.