Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions src/shared/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
{
Expand All @@ -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,
Expand Down
18 changes: 18 additions & 0 deletions src/test/suite/parser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -807,6 +807,24 @@ integer x = 1;`;
assert.strictEqual(result.includes[2].file, 'lib3.lsl');
});

test('should detect <> style include', async () => {
const source = `#include <lib1.lsl>
#include <lib2.lsl> // test
#include <lib3.lsl>
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)
Expand Down
Loading