UNPKG

@vlocode/apex

Version:
112 lines 4.9 kB
"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