111 lines
3.9 KiB
Java
111 lines
3.9 KiB
Java
package org.lumijiez;
|
|
|
|
import org.lumijiez.models.*;
|
|
import org.lumijiez.models.Package;
|
|
import org.lumijiez.parser.WinxBaseVisitor;
|
|
import org.lumijiez.parser.WinxParser;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
public class WinxCollector extends WinxBaseVisitor<Void> {
|
|
private final List<Package> packages = new ArrayList<>();
|
|
private Package currentPackage;
|
|
private Specification currentSpecification;
|
|
private Interface currentInterface;
|
|
|
|
@Override
|
|
public Void visitPackage(WinxParser.PackageContext ctx) {
|
|
String packageName = ctx.ID().getText();
|
|
currentPackage = new Package(packageName);
|
|
visitChildren(ctx);
|
|
packages.add(currentPackage);
|
|
currentPackage = null;
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Void visitInterface(WinxParser.InterfaceContext ctx) {
|
|
String interfaceName = ctx.ID().getText();
|
|
currentInterface = new Interface(interfaceName);
|
|
visitChildren(ctx);
|
|
currentPackage.addInterface(currentInterface);
|
|
currentInterface = null;
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Void visitSpecification(WinxParser.SpecificationContext ctx) {
|
|
String specificationName = ctx.ID().getText();
|
|
currentSpecification = new Specification(specificationName);
|
|
if (ctx.impls() != null) {
|
|
currentSpecification.setImplementedInterface(ctx.impls().ID().getText());
|
|
}
|
|
visitChildren(ctx);
|
|
currentPackage.addSpecification(currentSpecification);
|
|
currentSpecification = null;
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Void visitFunction_spec(WinxParser.Function_specContext ctx) {
|
|
String functionName = ctx.ID().getText();
|
|
FunctionSpec function = new FunctionSpec(functionName);
|
|
if (ctx.input_types() != null) {
|
|
ctx.input_types().variable().forEach(v -> function.addInputType(new Variable(v.type().getText(), v.ID().getText())));
|
|
}
|
|
|
|
function.addReturnType(new Variable(ctx.function_body().return_type().variable().type().getText(), ctx.function_body().return_type().variable().ID().getText()));
|
|
|
|
if (ctx.importance() != null) {
|
|
function.setImportance(ctx.importance().getText());
|
|
}
|
|
|
|
if (ctx.impls() != null) function.setImplemented_interface(ctx.impls().ID().getText());
|
|
|
|
if (ctx.function_body().specification_entry() != null)
|
|
ctx.function_body().specification_entry().forEach(
|
|
se -> function.addSpecificationEntry(new SpecificationEntry(se.ID().getText(), se.STRING().getText())));
|
|
|
|
function.setAccess_modifier(ctx.access_modifiers().getText());
|
|
if (currentInterface != null) {
|
|
currentInterface.addFunction(function);
|
|
} else if (currentSpecification != null) {
|
|
currentSpecification.addFunction(function);
|
|
}
|
|
return visitChildren(ctx);
|
|
}
|
|
|
|
@Override
|
|
public Void visitRequirement_spec(WinxParser.Requirement_specContext ctx) {
|
|
RequirementSpec requirement = new RequirementSpec(ctx.ID().getText());
|
|
ctx.req_specification().forEach(rs -> requirement.addAnnotation(
|
|
new Spec(rs.ID(0).getText(), rs.importance().getText())
|
|
));
|
|
if (currentSpecification != null) {
|
|
currentSpecification.addRequirement(requirement);
|
|
}
|
|
return visitChildren(ctx);
|
|
}
|
|
|
|
@Override
|
|
public Void visitResult_specification(WinxParser.Result_specificationContext ctx) {
|
|
ResultSpecification result;
|
|
|
|
if (ctx.importance() != null) {
|
|
result = new ResultSpecification(ctx.ID().getText(), ctx.importance().getText());
|
|
} else {
|
|
result = new ResultSpecification(ctx.ID().getText());
|
|
}
|
|
|
|
if (currentSpecification != null) {
|
|
currentSpecification.addResult(result);
|
|
}
|
|
return visitChildren(ctx);
|
|
}
|
|
|
|
public List<Package> getPackages() {
|
|
return packages;
|
|
}
|
|
}
|