From f6c330666720907601b1657c35937ad826a3509d Mon Sep 17 00:00:00 2001 From: WolfGangS Date: Thu, 4 Dec 2025 01:36:46 +0000 Subject: [PATCH] lsl <> style includes Signed-off-by: WolfGangS --- src/shared/parser.ts | 36 +++++++++++++++++++++++++++++++---- src/test/suite/parser.test.ts | 18 ++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/shared/parser.ts b/src/shared/parser.ts index cabcd8d..1134db3 100644 --- a/src/shared/parser.ts +++ b/src/shared/parser.ts @@ -401,7 +401,38 @@ export class Parser { } // PAR002: Check for missing filename argument - if (parser.isAtEnd() || parser.current().type === TokenType.NEWLINE || !parser.current().isString()) { + let filename:string|null = null; + + if (!parser.isAtEnd()) { + const current = parser.current(); + if (current.isString()) { + const fileToken = parser.current(); + console.error("INCLUDE",token,fileToken); + filename = parser.extractStringValue(fileToken.value); + } + else if(current.type == TokenType.OPERATOR && current.value == "<") { + parser.advance(); + let closed = false; + filename = ""; + while(!parser.isAtEnd()) { + const current = parser.current(); + if(current.type == TokenType.OPERATOR && current.value == ">") { + closed = true; + break; + } + if(current.type == TokenType.BLOCK_COMMENT_START) break; + if(current.type == TokenType.LINE_COMMENT) break; + if(current.type == TokenType.NEWLINE) break; + filename += current.value; + parser.advance(); + } + if(!closed) { + filename = null; + } + } + } + + if(filename == null) { parser.diagnostics.addError( '#include directive requires a filename argument', { @@ -415,9 +446,6 @@ export class Parser { return; } - const fileToken = parser.current(); - const filename = parser.extractStringValue(fileToken.value); - // Record the include for tracking const include : IncludeInfo = { file: filename, diff --git a/src/test/suite/parser.test.ts b/src/test/suite/parser.test.ts index c0e2d1a..be860ec 100644 --- a/src/test/suite/parser.test.ts +++ b/src/test/suite/parser.test.ts @@ -807,6 +807,24 @@ integer x = 1;`; assert.strictEqual(result.includes[2].file, 'lib3.lsl'); }); + test('should detect <> style include', async () => { + const source = `#include +#include // test +#include +integer x = 1;`; + + const lexer = new Lexer(source, 'lsl'); + const tokens = lexer.tokenize(); + + const parser = new Parser(tokens, testFile, 'lsl'); + const result = await parser.parse(); + + assert.strictEqual(result.includes.length, 3, 'Should detect 3 includes'); + assert.strictEqual(result.includes[0].file, 'lib1.lsl'); + assert.strictEqual(result.includes[1].file, 'lib2.lsl'); + assert.strictEqual(result.includes[2].file, 'lib3.lsl'); + }); + test('macro expansion in conditional block', async () => { const source = `#define DEBUG #define LOG(msg) llOwnerSay(msg)