else{ctx.addDiag(lineIdx,0,rawLine.length,"Jede Datei muss mit 'tpl 1.x module <name>;' beginnen.",vscode.DiagnosticSeverity.Error);ctx.hasModuleDef=true;}
ctx.addDiag(lineIdx,0,line.length,"Ein 'metadata' Block auf Modul-Ebene ist Pflicht, bevor andere Blöcke definiert werden.",vscode.DiagnosticSeverity.Error);
if(ctx.inBlock!=='none'){ctx.addDiag(lineIdx,0,line.length,"Ein Definitions-Block muss auf oberster Ebene deklariert werden.",vscode.DiagnosticSeverity.Error);}
if(ctx.inBlock!=='none'){ctx.addDiag(lineIdx,0,line.length,"Eine Enumeration muss auf oberster Ebene deklariert werden.",vscode.DiagnosticSeverity.Error);}
ctx.inBlock='enumeration';
}
elseif(line.startsWith('configuration ')){
if(ctx.inBlock!=='none'){ctx.addDiag(lineIdx,0,line.length,"Eine Konfiguration muss auf oberster Ebene deklariert werden.",vscode.DiagnosticSeverity.Error);}
if(ctx.inBlock!=='none'){ctx.addDiag(lineIdx,0,7,"Ein Pattern/Syncmapping kann nicht innerhalb eines anderen Blocks deklariert werden.",vscode.DiagnosticSeverity.Error);}
if(ctx.inBlock!=='none'){ctx.addDiag(lineIdx,0,5,"Eine Tabelle kann nicht innerhalb eines anderen Blocks deklariert werden.",vscode.DiagnosticSeverity.Error);}
if(ctx.activePhaseName!==""){ctx.addDiag(ctx.activePhaseLine,0,ctx.activePhaseName.length,`Block '${ctx.activePhaseName}' wurde nicht mit 'end ${ctx.activePhaseName};' geschlossen.`,vscode.DiagnosticSeverity.Error);}
if(ctx.currentPatternPhase>=phaseEnum){ctx.addDiag(lineIdx,0,phaseName.length,`'${phaseName}' Block ist hier nicht erlaubt.`,vscode.DiagnosticSeverity.Error);}
ctx.currentPatternPhase=phaseEnum;
ctx.activePhaseName=phaseName;
ctx.activePhaseLine=lineIdx;
}
};
checkPhase('metadata',PatternPhase.Metadata);
checkPhase('overview',PatternPhase.Overview);
checkPhase('constants',PatternPhase.Constants);
checkPhase('triggers',PatternPhase.Triggers);
checkPhase('mapping',PatternPhase.Mapping);
checkPhase('removal',PatternPhase.Removal);
if(line.startsWith('body')){
if(ctx.activePhaseName!==""){ctx.addDiag(ctx.activePhaseLine,0,ctx.activePhaseName.length,`Block '${ctx.activePhaseName}' wurde nicht mit 'end ${ctx.activePhaseName};' geschlossen.`,vscode.DiagnosticSeverity.Error);}
constdiag=ctx.addDiag(lineIdx,0,rawLine.length,`Im Body fehlt das Log-Statement mit dem Pattern-Namen. Bsp: ${expectedLog}`,vscode.DiagnosticSeverity.Error);
if(ctx.activePhaseName!==""){ctx.addDiag(ctx.activePhaseLine,0,ctx.activePhaseName.length,`Block '${ctx.activePhaseName}' wurde nicht mit 'end ${ctx.activePhaseName};' geschlossen.`,vscode.DiagnosticSeverity.Error);}
if(ctx.inBlock!=='pattern'){ctx.addDiag(lineIdx,0,11,"'end pattern' gefunden, ohne offenen Pattern-Block.",vscode.DiagnosticSeverity.Error);}