@xmirror/java-syntax-locator
Version:
java syntax locator based on Antlr
122 lines (104 loc) • 3 kB
JavaScript
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);
}
}