support token extraction in expressions

This commit is contained in:
Dave Holoway
2020-06-17 15:37:30 +01:00
parent 3c505b05be
commit 13cdd1e0bc
21 changed files with 325 additions and 48 deletions

View File

@@ -13,6 +13,10 @@ class ArrayIndexExpression extends Expression {
this.instance = instance;
this.index = index;
}
tokens() {
return [...this.instance.tokens, ...this.index.tokens];
}
}
exports.ArrayIndexExpression = ArrayIndexExpression;

View File

@@ -1,15 +1,22 @@
/**
* @typedef {import('../body-types').ResolvedIdent} ResolvedIdent
* @typedef {import('../tokenizer').Token} Token
*/
const { Expression } = require("./Expression");
class ArrayValueExpression extends Expression {
/**
* @param {ResolvedIdent[]} elements
* @param {Token} open
*/
constructor(elements) {
constructor(elements, open) {
super();
this.elements = elements;
this.open = open;
}
tokens() {
return this.open;
}
}

View File

@@ -16,6 +16,10 @@ class BinaryOpExpression extends Expression {
this.op = op;
this.rhs = rhs;
}
tokens() {
return [...this.lhs.tokens, this.op, ...this.rhs.tokens];
}
}
exports.BinaryOpExpression = BinaryOpExpression;

View File

@@ -11,6 +11,10 @@ class BracketedExpression extends Expression {
super();
this.expression = expression;
}
tokens() {
return this.expression.tokens;
}
}
exports.BracketedExpression = BracketedExpression;

View File

@@ -13,6 +13,10 @@ class CastExpression extends Expression {
this.castType = castType;
this.expression = expression;
}
tokens() {
return [...this.castType.tokens, ...this.expression.tokens];
}
}
exports.CastExpression = CastExpression;

View File

@@ -14,5 +14,9 @@ class ClassMemberExpression extends Expression {
this.instance = instance;
this.classToken = class_token;
}
tokens() {
return this.classToken;
}
}
exports.ClassMemberExpression = ClassMemberExpression;

View File

@@ -1,5 +1,12 @@
/**
* @typedef {import('../tokenizer').Token} Token
*/
class Expression {
/** @returns {Token|Token[]} */
tokens() {
throw new Error('Expression.tokens');
}
}
exports.Expression = Expression;

View File

@@ -16,6 +16,10 @@ class IncDecExpression extends Expression {
this.operator = operator;
this.which = which;
}
tokens() {
return this.operator;
}
}
exports.IncDecExpression = IncDecExpression;

View File

@@ -1,19 +1,26 @@
/**
* @typedef {import('../body-types').ResolvedIdent} ResolvedIdent
* @typedef {import('../statementtypes/Block').Block} Block
*/
const { Expression } = require("./Expression");
const { Block } = require('../statementtypes/Block');
class LambdaExpression extends Expression {
/**
*
* @param {*[]} params
* @param {Expression|Block} body
* @param {ResolvedIdent|Block} body
*/
constructor(params, body) {
super();
this.params = params;
this.body = body;
}
tokens() {
if (this.body instanceof Block) {
return this.body.open;
}
return this.body.tokens;
}
}
exports.LambdaExpression = LambdaExpression;

View File

@@ -15,6 +15,10 @@ class MemberExpression extends Expression {
// member will be null for incomplete expressions
this.member = member;
}
tokens() {
return this.member;
}
}
exports.MemberExpression = MemberExpression;

View File

@@ -13,6 +13,10 @@ class MethodCallExpression extends Expression {
this.instance = instance;
this.args = args;
}
tokens() {
return this.instance.tokens;
}
}
exports.MethodCallExpression = MethodCallExpression;

View File

@@ -1,34 +1,47 @@
/**
* @typedef {import('../tokenizer').Token} Token
* @typedef {import('../body-types').ResolvedIdent} ResolvedIdent
* @typedef {import('../source-types').SourceTypeIdent} SourceTypeIdent
* @typedef {import('java-mti').JavaType} JavaType
*/
const { Expression } = require("./Expression");
class NewArray extends Expression {
/**
* @param {JavaType} element_type
* @param {Token} new_token
* @param {SourceTypeIdent} element_type
* @param {ResolvedIdent} dimensions
*/
constructor(element_type, dimensions) {
constructor(new_token, element_type, dimensions) {
super();
this.new_token = new_token;
this.element_type = element_type;
this.dimensions = dimensions;
}
tokens() {
return [this.new_token, ...this.element_type.tokens, ...this.dimensions.tokens];
}
}
class NewObject extends Expression {
/**
* @param {JavaType} object_type
* @param {Token} new_token
* @param {SourceTypeIdent} object_type
* @param {ResolvedIdent[]} ctr_args
* @param {Token[]} type_body
*/
constructor(object_type, ctr_args, type_body) {
constructor(new_token, object_type, ctr_args, type_body) {
super();
this.element_type = object_type;
this.new_token = new_token;
this.object_type = object_type;
this.ctr_args = ctr_args;
this.type_body = type_body;
}
tokens() {
return [this.new_token, ...this.object_type.tokens];
}
}
exports.NewArray = NewArray;

View File

@@ -15,6 +15,10 @@ class TernaryOpExpression extends Expression {
this.truthExpression = truthExpression;
this.falseExpression = falseExpression;
}
tokens() {
return [...this.test.tokens, ...this.truthExpression.tokens, ...this.falseExpression.tokens];
}
}
exports.TernaryOpExpression = TernaryOpExpression;

View File

@@ -14,6 +14,10 @@ class ThisMemberExpression extends Expression {
this.instance = instance;
this.thisToken = this_token;
}
tokens() {
return this.thisToken;
}
}
exports.ThisMemberExpression = ThisMemberExpression;

View File

@@ -0,0 +1,28 @@
/**
* @typedef {import('../body-types').ResolvedIdent} ResolvedIdent
* @typedef {import('../body-types').Local} Local
* @typedef {import('../tokenizer').Token} Token
* @typedef {import('java-mti').Field} Field
* @typedef {import('java-mti').Parameter} Parameter
* @typedef {import('../source-types').SourceEnumValue} SourceEnumValue
*/
const { Expression } = require("./Expression");
class Variable extends Expression {
/**
* @param {Token} name_token
* @param {Local|Parameter|Field|SourceEnumValue} variable
*/
constructor(name_token, variable) {
super();
this.name_token = name_token;
this.variable = variable;
this.type = this.variable.type;
}
tokens() {
return this.name_token;
}
}
exports.Variable = Variable;

View File

@@ -11,6 +11,10 @@ class LiteralValue extends Expression {
super();
this.token = token;
}
tokens() {
return this.token;
}
}
exports.LiteralValue = LiteralValue;