@vlocode/apex
Version:
Salesforce APEX Parser and Grammar
112 lines • 4.9 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BlockVisitor = void 0;
const types_1 = require("../types");
const typeRefVisitor_1 = require("./typeRefVisitor");
const declarationVisitor_1 = require("./declarationVisitor");
const grammar_1 = require("../grammar");
const typeListVisitor_1 = require("./typeListVisitor");
const util_1 = require("@vlocode/util");
const standardNamespace_json_1 = __importDefault(require("../standardNamespace.json"));
class BlockVisitor extends declarationVisitor_1.DeclarationVisitor {
static standardNamespaces = standardNamespace_json_1.default.map((namespace) => namespace.toLowerCase());
constructor(state) {
super(state);
}
addBlock(block) {
if (!this.state.blocks) {
this.state.blocks = [];
}
this.state.blocks.push(block);
}
visitBlock(ctx) {
this.addBlock(new BlockVisitor({
sourceRange: types_1.ApexSourceRange.fromToken(ctx)
}).visitChildren(ctx));
return this.state;
}
visitLocalVariableDeclaration(ctx) {
for (const variableDeclarator of ctx.variableDeclarators()?.variableDeclarator() ?? []) {
const variableType = ctx.typeRef().accept(new typeRefVisitor_1.TypeRefVisitor());
this.addLocalVariable(variableDeclarator.id().getText(), variableType, types_1.ApexSourceRange.fromToken(variableDeclarator));
variableDeclarator.expression()?.accept(this);
}
return this.state;
}
// public visitAssignExpression(ctx: AssignExpressionContext) {
// ctx.expression().slice(1).forEach(expr => this.visit(expr));
// return this.visit
// }
visitCatchClause(ctx) {
this.addLocalVariable(ctx.id().getText(), types_1.ApexTypeRef.fromString(ctx.qualifiedName().getText()), types_1.ApexSourceRange.fromToken(ctx.id()));
this.visitBlock(ctx.block());
return this.state;
}
visitDotExpression(ctx) {
if (ctx.anyId() &&
ctx.parent instanceof grammar_1.DotExpressionContext &&
ctx.expression().getChild(0) instanceof grammar_1.IdPrimaryContext &&
types_1.ApexTypeRef.isStandardNamespace(ctx.getText())) {
this.addRef(types_1.ApexTypeRef.fromString(ctx.getText()), 'identifier');
return this.state;
}
return this.visitChildren(ctx);
}
visitIdPrimary(ctx) {
const id = ctx.getText();
const isLocal = this.state.localVariables?.some(v => v.name === id);
if (!isLocal) {
this.addRef(types_1.ApexTypeRef.fromString(ctx.getText()), 'identifier');
}
return this.visitChildren(ctx);
}
visitIdCreatedNamePair(ctx) {
const typeList = ctx.typeList();
this.addRef({
...types_1.ApexTypeRef.fromString(ctx.anyId().getText()),
genericArguments: (typeList && new typeListVisitor_1.TypeListVisitor().visit(typeList)) ?? undefined
}, 'new');
return this.visitChildren(ctx);
}
addLocalVariable(name, type, sourceRange) {
if (!this.state.localVariables) {
this.state.localVariables = [];
}
this.state.localVariables.push({ name, type, sourceRange });
this.addRef(type, 'localVariable');
}
getLocalVariableNames(blockHierarchy) {
return blockHierarchy.flatMap(block => block.localVariables ?? []).map(v => v.name);
}
updateReferences(context) {
const classVariables = context.fields.flatMap(f => f.name).concat(context.properties.map(p => p.name));
for (const blockHierarchy of this.resolveBlockHierarchy()) {
const blockLeaf = blockHierarchy[blockHierarchy.length - 1];
if (!blockLeaf.refs) {
continue;
}
const blockLocalVariables = blockHierarchy.flatMap(block => block.localVariables ?? []).map(v => v.name).concat(classVariables);
blockLeaf.refs = blockLeaf.refs.filter(ref => {
if (ref.source !== 'identifier') {
return true;
}
const localName = ref.name.split('.').shift();
return !blockLocalVariables.some(localVar => (0, util_1.stringEquals)(localVar, localName, { caseInsensitive: true }));
});
this.addRef(blockLeaf.refs);
}
}
*resolveBlockHierarchy() {
yield [this.state];
for (const block of this.state.blocks ?? []) {
for (const blocks of new BlockVisitor(block).resolveBlockHierarchy()) {
yield [this.state, ...blocks];
}
}
}
}
exports.BlockVisitor = BlockVisitor;
//# sourceMappingURL=blockVisitor.js.map