Created
May 13, 2020 01:35
-
-
Save amazzalel-habib/8ef9e74416d317ca835d26e34be0c8dc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function checkSemanticRules(ast: TodoExpressionsContext): ITodoLangError[] { | |
const errors: ITodoLangError[] = []; | |
const definedTodos: string[] = []; | |
ast.children.forEach(node => { | |
if (node instanceof AddExpressionContext) { | |
// if a Add expression : ADD TODO "STRING" | |
const todo = node.STRING().text; | |
// If a TODO is defined using ADD TODO instruction, we can re-add it. | |
if (definedTodos.some(todo_ => todo_ === todo)) { | |
// node has everything to know the position of this expression is in the code | |
errors.push({ | |
code: "2", | |
endColumn: node.stop.charPositionInLine + node.stop.stopIndex - node.stop.stopIndex, | |
endLineNumber: node.stop.line, | |
message: `Todo ${todo} already defined`, | |
startColumn: node.stop.charPositionInLine, | |
startLineNumber: node.stop.line | |
}); | |
} else { | |
definedTodos.push(todo); | |
} | |
}else if(node instanceof CompleteExpressionContext) { | |
const todoToComplete = node.STRING().text; | |
if(definedTodos.every(todo_ => todo_ !== todoToComplete)){ | |
// if the the todo is not yet defined, here we are only checking the predefined todo until this expression | |
// which means the order is important | |
errors.push({ | |
code: "2", | |
endColumn: node.stop.charPositionInLine + node.stop.stopIndex - node.stop.stopIndex, | |
endLineNumber: node.stop.line, | |
message: `Todo ${todoToComplete} is not defined`, | |
startColumn: node.stop.charPositionInLine, | |
startLineNumber: node.stop.line | |
}); | |
} | |
} | |
}) | |
return errors; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment