diff --git a/langserver/java/statementtypes/ForStatement.js b/langserver/java/statementtypes/ForStatement.js index 2bcb67a..5a45b0b 100644 --- a/langserver/java/statementtypes/ForStatement.js +++ b/langserver/java/statementtypes/ForStatement.js @@ -1,12 +1,12 @@ /** * @typedef {import('./Statement').Statement} Statement * @typedef {import('../body-types').Local} Local - * @typedef {import('../body-types').ResolvedIdent} ResolvedIdent * @typedef {import('../body-types').ValidateInfo} ValidateInfo * @typedef {import('../tokenizer').Token} Token */ const { KeywordStatement } = require("./KeywordStatement"); const { checkNonVarDeclStatement } = require('../statement-validater'); +const { Local, ResolvedIdent } = require('../body-types'); class ForStatement extends KeywordStatement { /** @type {ResolvedIdent[] | Local[]} */ @@ -24,7 +24,26 @@ class ForStatement extends KeywordStatement { * @param {ValidateInfo} vi */ validate(vi) { - + if (this.init) { + this.init.forEach(x => { + if (x instanceof ResolvedIdent) { + x.resolveExpression(vi); + } else if (x instanceof Local) { + if (x.init) { + x.init.resolveExpression(vi); + } + } + }) + } + if (this.test) { + this.test.resolveExpression(vi); + } + if (this.update) { + this.update.forEach(e => e.resolveExpression(vi)); + } + if (this.iterable) { + this.iterable.resolveExpression(vi); + } if (this.statement) { vi.statementStack.unshift('for'); checkNonVarDeclStatement(this.statement, vi); diff --git a/langserver/java/statementtypes/IfStatement.js b/langserver/java/statementtypes/IfStatement.js index 870e425..382bf9b 100644 --- a/langserver/java/statementtypes/IfStatement.js +++ b/langserver/java/statementtypes/IfStatement.js @@ -19,9 +19,10 @@ class IfStatement extends KeywordStatement { * @param {ValidateInfo} vi */ validate(vi) { - const value = this.test.resolveExpression(vi); - checkBooleanBranchCondition(value, () => this.test.tokens, vi.problems); - + if (this.test) { + const value = this.test.resolveExpression(vi); + checkBooleanBranchCondition(value, () => this.test.tokens, vi.problems); + } if (this.statement) { vi.statementStack.unshift('if'); checkNonVarDeclStatement(this.statement, vi); @@ -29,7 +30,7 @@ class IfStatement extends KeywordStatement { } if (this.elseStatement) { vi.statementStack.unshift('else'); - checkNonVarDeclStatement(this.statement, vi); + checkNonVarDeclStatement(this.elseStatement, vi); vi.statementStack.shift(); } } diff --git a/langserver/java/statementtypes/SwitchStatement.js b/langserver/java/statementtypes/SwitchStatement.js index 7d25bd1..1c68f92 100644 --- a/langserver/java/statementtypes/SwitchStatement.js +++ b/langserver/java/statementtypes/SwitchStatement.js @@ -59,7 +59,8 @@ class SwitchStatement extends KeywordStatement { } else { vi.problems.push(ParseProblem.Error(c.tokens, `Expression expected`)); } - }) + }); + caseblock.statements.forEach(statement => statement.validate(vi)); }) vi.statementStack.shift(); diff --git a/langserver/java/statementtypes/TryStatement.js b/langserver/java/statementtypes/TryStatement.js index 2d73617..28478e0 100644 --- a/langserver/java/statementtypes/TryStatement.js +++ b/langserver/java/statementtypes/TryStatement.js @@ -5,6 +5,7 @@ */ const { KeywordStatement } = require("./KeywordStatement"); const { ResolvedIdent } = require('../body-types'); +const { Block } = require('./Block'); class TryStatement extends KeywordStatement { /** @type {(ResolvedIdent|Local[])[]} */ @@ -28,6 +29,16 @@ class TryStatement extends KeywordStatement { this.block.validate(vi); vi.statementStack.shift(); } + + this.catches.forEach(c => { + if (c instanceof Block) { + // finally + c.validate(vi); + } else if (c.block) { + // catch block + c.block.validate(vi); + } + }) } } diff --git a/langserver/java/statementtypes/WhileStatement.js b/langserver/java/statementtypes/WhileStatement.js index c36d5f8..39ce6d7 100644 --- a/langserver/java/statementtypes/WhileStatement.js +++ b/langserver/java/statementtypes/WhileStatement.js @@ -16,9 +16,10 @@ class WhileStatement extends KeywordStatement { * @param {ValidateInfo} vi */ validate(vi) { - const value = this.test.resolveExpression(vi); - checkBooleanBranchCondition(value, () => this.test.tokens, vi.problems); - + if (this.test) { + const value = this.test.resolveExpression(vi); + checkBooleanBranchCondition(value, () => this.test.tokens, vi.problems); + } if (this.statement) { vi.statementStack.unshift('while'); this.statement.validate(vi);