UNPKG

@xmirror/java-syntax-locator

Version:

java syntax locator based on Antlr

122 lines (104 loc) 3 kB
import JavaParserVisitor from '../parser/JavaParserVisitor.mjs'; import * as JavaParser from '../parser/JavaParser.mjs'; export class LocationVisitor extends JavaParserVisitor { javaFileToJson = {}; visitCompilationUnit(ctx) { var packageName = ctx.packageDeclaration()==null?'':ctx.packageDeclaration().qualifiedName().toString(); var array = []; ctx.typeDeclaration().forEach(td => { var cd = td.classDeclaration(); if (cd == null) return; var memberVisitor = new MemberDeclVisitor(cd); cd.accept(memberVisitor); array.push(this.getClass(cd, memberVisitor.fields, memberVisitor.methods, memberVisitor.classes)); }); this.javaFileToJson.packageName = packageName; this.javaFileToJson.classes = array; } getClass(classDec, fields, methods, classes) { var classJson = {}; classJson.className = classDec.identifier().toString(); classJson.location = this.getLocation(classDec.start, classDec.stop); classJson.fields = this.getField(fields); classJson.methods = this.getMethod(methods); if (classes.length != 0) { var array = []; classes.forEach(cls => { var visitor = new MemberDeclVisitor(cls); cls.accept(visitor); array.push(this.getClass(cls, visitor.fields, visitor.methods, visitor.classes)); }); classJson.innerClasses = array; } return classJson; } getLocation(start, stop) { var locationJson = {}; locationJson.startLine = start.line; locationJson.startColumn = start.column; locationJson.stopLine = stop.line; locationJson.stopColumn = stop.column; return locationJson; } getField(fields) { var array = []; fields.forEach(field => { var json = {}; json.fieldName = this.getFieldName(field); json.location = this.getLocation(field.start, field.stop); array.push(json); }); return array; } getMethod(methods) { var array = []; methods.forEach(method => { var json = {}; json.methodName = this.getMethodName(method); json.location = this.getLocation(method.start, method.stop); array.push(json); }); return array; } getFieldName(field) { var array = []; field.variableDeclarators().variableDeclarator().forEach(variable => { array.push(variable.variableDeclaratorId().identifier().toString()); }); return array; } getMethodName(method) { if (method instanceof JavaParser.GenericMethodDeclarationContext) return method.methodDeclaration().identifier().toString(); return method.identifier().toString(); } } class MemberDeclVisitor extends JavaParserVisitor { constructor(self) { super(); this.self = self; } fields = []; methods = []; classes = []; visitEnumBodyDeclarations() { return; } visitFieldDeclaration(ctx) { this.fields.push(ctx); } visitMethodDeclaration(ctx) { this.methods.push(ctx); } visitGenericMethodDeclaration(ctx) { this.methods.push(ctx); } visitClassDeclaration(ctx) { if (ctx != this.self) { this.classes.push(ctx); return; } super.visitClassDeclaration(ctx); } }